bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 974.1.27
by aaron.bentley at utoronto Initial greedy fetch work | 1 | # Copyright (C) 2005 by Canonical Ltd
 | 
| 2 | ||
| 3 | # This program is free software; you can redistribute it and/or modify
 | |
| 4 | # it under the terms of the GNU General Public License as published by
 | |
| 5 | # the Free Software Foundation; either version 2 of the License, or
 | |
| 6 | # (at your option) any later version.
 | |
| 7 | ||
| 8 | # This program is distributed in the hope that it will be useful,
 | |
| 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| 11 | # GNU General Public License for more details.
 | |
| 12 | ||
| 13 | # You should have received a copy of the GNU General Public License
 | |
| 14 | # along with this program; if not, write to the Free Software
 | |
| 15 | # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | |
| 1218
by Martin Pool - fix up import | 16 | |
| 1231
by Martin Pool - more progress on fetch on top of weaves | 17 | |
| 18 | """Copying of history from one branch to another.
 | |
| 19 | ||
| 20 | The basic plan is that every branch knows the history of everything
 | |
| 21 | that has merged into it.  As the first step of a merge, pull, or
 | |
| 22 | branch operation we copy history from the source into the destination
 | |
| 23 | branch.
 | |
| 24 | ||
| 25 | The copying is done in a slightly complicated order.  We don't want to
 | |
| 26 | add a revision to the store until everything it refers to is also
 | |
| 27 | stored, so that if a revision is present we can totally recreate it.
 | |
| 28 | However, we can't know what files are included in a revision until we
 | |
| 1563.2.34
by Robert Collins Remove the commit and rollback transaction methods as misleading, and implement a WriteTransaction | 29 | read its inventory.  So we query the inventory store of the source for
 | 
| 30 | the ids we need, and then pull those ids and finally actually join
 | |
| 31 | the inventories.
 | |
| 1231
by Martin Pool - more progress on fetch on top of weaves | 32 | """
 | 
| 33 | ||
| 1534.1.31
by Robert Collins Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo. | 34 | import bzrlib | 
| 35 | import bzrlib.errors as errors | |
| 1563.2.10
by Robert Collins Change weave store to be a versioned store, using WeaveFiles which maintain integrity without needing explicit 'put' operations. | 36 | from bzrlib.errors import (InstallFailed, NoSuchRevision, | 
| 1534.1.31
by Robert Collins Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo. | 37 | MissingText) | 
| 38 | from bzrlib.trace import mutter | |
| 39 | from bzrlib.progress import ProgressBar | |
| 1570.1.14
by Robert Collins Enforce repository consistency during 'fetch' operations. | 40 | from bzrlib.reconcile import RepoReconciler | 
| 1534.1.31
by Robert Collins Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo. | 41 | from bzrlib.revision import NULL_REVISION | 
| 42 | from bzrlib.symbol_versioning import * | |
| 43 | ||
| 44 | ||
| 1231
by Martin Pool - more progress on fetch on top of weaves | 45 | # TODO: Avoid repeatedly opening weaves so many times.
 | 
| 974.1.27
by aaron.bentley at utoronto Initial greedy fetch work | 46 | |
| 1238
by Martin Pool - remove a lot of dead code from fetch | 47 | # XXX: This doesn't handle ghost (not present in branch) revisions at
 | 
| 1240
by Martin Pool - clean up fetch code and add progress bar | 48 | # all yet.  I'm not sure they really should be supported.
 | 
| 49 | ||
| 1262
by Martin Pool - fetch should also copy ancestry records | 50 | # NOTE: This doesn't copy revisions which may be present but not
 | 
| 51 | # merged into the last revision.  I'm not sure we want to do that.
 | |
| 1238
by Martin Pool - remove a lot of dead code from fetch | 52 | |
| 53 | # - get a list of revisions that need to be pulled in
 | |
| 54 | # - for each one, pull in that revision file
 | |
| 55 | #   and get the inventory, and store the inventory with right
 | |
| 56 | #   parents.
 | |
| 57 | # - and get the ancestry, and store that with right parents too
 | |
| 58 | # - and keep a note of all file ids and version seen
 | |
| 59 | # - then go through all files; for each one get the weave,
 | |
| 60 | #   and add in all file versions
 | |
| 61 | ||
| 62 | ||
| 1534.1.31
by Robert Collins Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo. | 63 | @deprecated_function(zero_eight) | 
| 1260
by Martin Pool - some updates for fetch/update function | 64 | def greedy_fetch(to_branch, from_branch, revision=None, pb=None): | 
| 1534.1.32
by Robert Collins Deprecate direct use of fetch.Fetcher. | 65 | """Legacy API, please see branch.fetch(from_branch, last_revision, pb).""" | 
| 1219
by Martin Pool - BROKEN: start refactoring fetch code to work well with weaves | 66 | f = Fetcher(to_branch, from_branch, revision, pb) | 
| 67 | return f.count_copied, f.failed_revisions | |
| 68 | ||
| 1534.1.32
by Robert Collins Deprecate direct use of fetch.Fetcher. | 69 | fetch = greedy_fetch | 
| 70 | ||
| 1219
by Martin Pool - BROKEN: start refactoring fetch code to work well with weaves | 71 | |
| 1534.4.41
by Robert Collins Branch now uses BzrDir reasonably sanely. | 72 | class RepoFetcher(object): | 
| 73 | """Pull revisions and texts from one repository to another. | |
| 74 | ||
| 75 |     last_revision
 | |
| 76 |         if set, try to limit to the data this revision references.
 | |
| 77 | ||
| 78 |     after running:
 | |
| 1260
by Martin Pool - some updates for fetch/update function | 79 |     count_copied -- number of revisions copied
 | 
| 1534.1.33
by Robert Collins Move copy_content_into into InterRepository and InterWeaveRepo, and disable the default codepath test as we have optimised paths for all current combinations. | 80 | |
| 81 |     This should not be used directory, its essential a object to encapsulate
 | |
| 82 |     the logic in InterRepository.fetch().
 | |
| 1260
by Martin Pool - some updates for fetch/update function | 83 |     """
 | 
| 1534.4.50
by Robert Collins Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running. | 84 | def __init__(self, to_repository, from_repository, last_revision=None, pb=None): | 
| 1534.1.31
by Robert Collins Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo. | 85 |         # result variables.
 | 
| 86 | self.failed_revisions = [] | |
| 87 | self.count_copied = 0 | |
| 1556.1.4
by Robert Collins Add a new format for what will become knit, and the surrounding logic to upgrade repositories within metadirs, and tests for the same. | 88 | if to_repository.control_files._transport.base == from_repository.control_files._transport.base: | 
| 1534.6.13
by Robert Collins Allow push/pull and branch between branches in the same shared repository. | 89 |             # check that last_revision is in 'from' and then return a no-operation.
 | 
| 90 | if last_revision not in (None, NULL_REVISION): | |
| 91 | from_repository.get_revision(last_revision) | |
| 92 |             return
 | |
| 1534.4.41
by Robert Collins Branch now uses BzrDir reasonably sanely. | 93 | self.to_repository = to_repository | 
| 94 | self.from_repository = from_repository | |
| 95 |         # must not mutate self._last_revision as its potentially a shared instance
 | |
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 96 | self._last_revision = last_revision | 
| 97 | if pb is None: | |
| 1594.1.3
by Robert Collins Fixup pb usage to use nested_progress_bar. | 98 | self.pb = bzrlib.ui.ui_factory.nested_progress_bar() | 
| 99 | self.nested_pb = self.pb | |
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 100 | else: | 
| 101 | self.pb = pb | |
| 1594.1.3
by Robert Collins Fixup pb usage to use nested_progress_bar. | 102 | self.nested_pb = None | 
| 1534.4.41
by Robert Collins Branch now uses BzrDir reasonably sanely. | 103 | self.from_repository.lock_read() | 
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 104 | try: | 
| 1534.4.41
by Robert Collins Branch now uses BzrDir reasonably sanely. | 105 | self.to_repository.lock_write() | 
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 106 | try: | 
| 107 | self.__fetch() | |
| 108 | finally: | |
| 1594.1.3
by Robert Collins Fixup pb usage to use nested_progress_bar. | 109 | if self.nested_pb is not None: | 
| 110 | self.nested_pb.finished() | |
| 1534.4.41
by Robert Collins Branch now uses BzrDir reasonably sanely. | 111 | self.to_repository.unlock() | 
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 112 | finally: | 
| 1534.4.41
by Robert Collins Branch now uses BzrDir reasonably sanely. | 113 | self.from_repository.unlock() | 
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 114 | |
| 115 | def __fetch(self): | |
| 116 | """Primary worker function. | |
| 117 | ||
| 118 |         This initialises all the needed variables, and then fetches the 
 | |
| 119 |         requested revisions, finally clearing the progress bar.
 | |
| 120 |         """
 | |
| 1185.67.2
by Aaron Bentley Renamed Branch.storage to Branch.repository | 121 | self.to_weaves = self.to_repository.weave_store | 
| 122 | self.to_control = self.to_repository.control_weaves | |
| 123 | self.from_weaves = self.from_repository.weave_store | |
| 124 | self.from_control = self.from_repository.control_weaves | |
| 1240
by Martin Pool - clean up fetch code and add progress bar | 125 | self.count_total = 0 | 
| 1185.33.55
by Martin Pool [patch] weave fetch optimizations (Goffredo Baroncelli) | 126 | self.file_ids_names = {} | 
| 1392
by Robert Collins reinstate testfetch test case | 127 | try: | 
| 1185.65.30
by Robert Collins Merge integration. | 128 | revs = self._revids_to_fetch() | 
| 1185.64.3
by Goffredo Baroncelli This patch changes the fetch code. Before, the original code expanded every inventory and | 129 |             # nothing to do
 | 
| 130 | if revs: | |
| 1534.1.11
by Robert Collins Format tweaks for latest merges. | 131 | self._fetch_weave_texts(revs) | 
| 132 | self._fetch_inventory_weave(revs) | |
| 133 | self._fetch_revision_texts(revs) | |
| 1185.64.3
by Goffredo Baroncelli This patch changes the fetch code. Before, the original code expanded every inventory and | 134 | self.count_copied += len(revs) | 
| 1185.12.15
by Aaron Bentley Cleared progress bar properly after fetch | 135 | finally: | 
| 136 | self.pb.clear() | |
| 1231
by Martin Pool - more progress on fetch on top of weaves | 137 | |
| 1185.65.30
by Robert Collins Merge integration. | 138 | def _revids_to_fetch(self): | 
| 1534.1.31
by Robert Collins Deprecated fetch.fetch and fetch.greedy_fetch for branch.fetch, and move the Repository.fetch internals to InterRepo and InterWeaveRepo. | 139 | self.pb.update('get destination history') | 
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 140 | mutter('fetch up to rev {%s}', self._last_revision) | 
| 1534.4.50
by Robert Collins Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running. | 141 | if self._last_revision is NULL_REVISION: | 
| 142 |             # explicit limit of no revisions needed
 | |
| 1534.4.41
by Robert Collins Branch now uses BzrDir reasonably sanely. | 143 | return None | 
| 1534.4.50
by Robert Collins Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running. | 144 | if (self._last_revision != None and | 
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 145 | self.to_repository.has_revision(self._last_revision)): | 
| 1534.4.41
by Robert Collins Branch now uses BzrDir reasonably sanely. | 146 | return None | 
| 147 | ||
| 1417.1.13
by Robert Collins do not download remote ancestry.weave if the target revision we are stopping at is in our local store | 148 | try: | 
| 1534.4.50
by Robert Collins Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running. | 149 | return self.to_repository.missing_revision_ids(self.from_repository, | 
| 150 | self._last_revision) | |
| 1534.4.41
by Robert Collins Branch now uses BzrDir reasonably sanely. | 151 | except errors.NoSuchRevision: | 
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 152 | raise InstallFailed([self._last_revision]) | 
| 1185.64.3
by Goffredo Baroncelli This patch changes the fetch code. Before, the original code expanded every inventory and | 153 | |
| 1534.1.11
by Robert Collins Format tweaks for latest merges. | 154 | def _fetch_weave_texts(self, revs): | 
| 1534.4.41
by Robert Collins Branch now uses BzrDir reasonably sanely. | 155 | file_ids = self.from_repository.fileid_involved_by_set(revs) | 
| 1185.64.3
by Goffredo Baroncelli This patch changes the fetch code. Before, the original code expanded every inventory and | 156 | count = 0 | 
| 157 | num_file_ids = len(file_ids) | |
| 158 | for file_id in file_ids: | |
| 1185.77.1
by John Arbash Meinel Simplifying what bzr displays when merging | 159 | self.pb.update("merge weaves", count, num_file_ids) | 
| 1185.64.3
by Goffredo Baroncelli This patch changes the fetch code. Before, the original code expanded every inventory and | 160 | count +=1 | 
| 161 | to_weave = self.to_weaves.get_weave_or_empty(file_id, | |
| 1534.4.41
by Robert Collins Branch now uses BzrDir reasonably sanely. | 162 | self.to_repository.get_transaction()) | 
| 1185.64.3
by Goffredo Baroncelli This patch changes the fetch code. Before, the original code expanded every inventory and | 163 | |
| 1563.2.18
by Robert Collins get knit repositories really using knits for text storage. | 164 | if to_weave.num_versions() > 0: | 
| 1185.64.3
by Goffredo Baroncelli This patch changes the fetch code. Before, the original code expanded every inventory and | 165 |                 # destination has contents, must merge
 | 
| 1563.2.10
by Robert Collins Change weave store to be a versioned store, using WeaveFiles which maintain integrity without needing explicit 'put' operations. | 166 | from_weave = self.from_weaves.get_weave(file_id, | 
| 167 | self.from_repository.get_transaction()) | |
| 1563.2.41
by Robert Collins Only fetch referenced inventories in fetch. | 168 |                 # we fetch all the texts, because texts do
 | 
| 169 |                 # not reference anything, and its cheap enough
 | |
| 1563.2.11
by Robert Collins Consolidate reweave and join as we have no separate usage, make reweave tests apply to all versionedfile implementations and deprecate the old reweave apis. | 170 | to_weave.join(from_weave) | 
| 1185.64.3
by Goffredo Baroncelli This patch changes the fetch code. Before, the original code expanded every inventory and | 171 | else: | 
| 1594.2.10
by Robert Collins Teach knit fetching and branching to only duplicate relevant data avoiding unnecessary reconciles. | 172 |                 # destination is empty, just copy it.
 | 
| 173 |                 # this copies all the texts, which is useful and 
 | |
| 174 |                 # on per-file basis quite cheap.
 | |
| 1563.2.14
by Robert Collins Prepare weave store to delegate copy details to the versioned file. | 175 | self.to_weaves.copy_multi(self.from_weaves, [file_id], self.pb, | 
| 1563.2.34
by Robert Collins Remove the commit and rollback transaction methods as misleading, and implement a WriteTransaction | 176 | self.from_repository.get_transaction(), | 
| 177 | self.to_repository.get_transaction()) | |
| 1534.1.11
by Robert Collins Format tweaks for latest merges. | 178 | self.pb.clear() | 
| 1185.64.3
by Goffredo Baroncelli This patch changes the fetch code. Before, the original code expanded every inventory and | 179 | |
| 1534.1.11
by Robert Collins Format tweaks for latest merges. | 180 | def _fetch_inventory_weave(self, revs): | 
| 1551.3.11
by Aaron Bentley Merge from Robert | 181 | self.pb.update("inventory fetch", 0, 2) | 
| 182 | to_weave = self.to_control.get_weave('inventory', | |
| 1534.4.43
by Robert Collins Merge from integration | 183 | self.to_repository.get_transaction()) | 
| 1185.64.4
by Goffredo Baroncelli Apply some style changes on the basis of Robert suggest | 184 | |
| 1594.2.10
by Robert Collins Teach knit fetching and branching to only duplicate relevant data avoiding unnecessary reconciles. | 185 |         # just merge, this is optimisable and its means we dont
 | 
| 186 |         # copy unreferenced data such as not-needed inventories.
 | |
| 187 | self.pb.update("inventory fetch", 1, 2) | |
| 188 | from_weave = self.from_repository.get_inventory_weave() | |
| 189 | self.pb.update("inventory fetch", 2, 2) | |
| 190 |         # we fetch only the referenced inventories because we do not
 | |
| 191 |         # know for unselected inventories whether all their required
 | |
| 192 |         # texts are present in the other repository - it could be
 | |
| 193 |         # corrupt.
 | |
| 194 | to_weave.join(from_weave, pb=self.pb, msg='merge inventory', | |
| 195 | version_ids=revs) | |
| 1534.1.11
by Robert Collins Format tweaks for latest merges. | 196 | self.pb.clear() | 
| 1240
by Martin Pool - clean up fetch code and add progress bar | 197 | |
| 1534.4.41
by Robert Collins Branch now uses BzrDir reasonably sanely. | 198 | |
| 1563.2.31
by Robert Collins Convert Knit repositories to use knits. | 199 | class GenericRepoFetcher(RepoFetcher): | 
| 200 | """This is a generic repo to repo fetcher. | |
| 201 | ||
| 202 |     This makes minimal assumptions about repo layout and contents.
 | |
| 203 |     It triggers a reconciliation after fetching to ensure integrity.
 | |
| 204 |     """
 | |
| 205 | ||
| 206 | def _fetch_revision_texts(self, revs): | |
| 207 | self.to_transaction = self.to_repository.get_transaction() | |
| 208 | count = 0 | |
| 209 | total = len(revs) | |
| 210 | for rev in revs: | |
| 211 | self.pb.update('copying revisions', count, total) | |
| 212 | try: | |
| 213 | sig_text = self.from_repository.get_signature_text(rev) | |
| 214 | self.to_repository._revision_store.add_revision_signature_text( | |
| 215 | rev, sig_text, self.to_transaction) | |
| 216 | except errors.NoSuchRevision: | |
| 217 |                 # not signed.
 | |
| 218 |                 pass
 | |
| 219 | self.to_repository._revision_store.add_revision( | |
| 220 | self.from_repository.get_revision(rev), | |
| 221 | self.to_transaction) | |
| 222 | count += 1 | |
| 223 | self.pb.update('copying revisions', count, total) | |
| 224 |         # fixup inventory if needed: 
 | |
| 225 |         # this is expensive because we have no inverse index to current ghosts.
 | |
| 226 |         # but on local disk its a few seconds and sftp push is already insane.
 | |
| 227 |         # so we just-do-it.
 | |
| 228 |         # FIXME: repository should inform if this is needed.
 | |
| 1594.2.10
by Robert Collins Teach knit fetching and branching to only duplicate relevant data avoiding unnecessary reconciles. | 229 | self.to_repository.reconcile() | 
| 1563.2.31
by Robert Collins Convert Knit repositories to use knits. | 230 | |
| 231 | ||
| 232 | class KnitRepoFetcher(RepoFetcher): | |
| 233 | """This is a knit format repository specific fetcher. | |
| 234 | ||
| 235 |     This differs from the GenericRepoFetcher by not doing a 
 | |
| 236 |     reconciliation after copying, and using knit joining to
 | |
| 237 |     copy revision texts.
 | |
| 238 |     """
 | |
| 239 | ||
| 240 | def _fetch_revision_texts(self, revs): | |
| 241 |         # may need to be a InterRevisionStore call here.
 | |
| 242 | from_transaction = self.from_repository.get_transaction() | |
| 243 | to_transaction = self.to_repository.get_transaction() | |
| 1563.2.35
by Robert Collins cleanup deprecation warnings and finish conversion so the inventory is knit based too. | 244 | to_sf = self.to_repository._revision_store.get_signature_file( | 
| 1563.2.31
by Robert Collins Convert Knit repositories to use knits. | 245 | to_transaction) | 
| 1563.2.35
by Robert Collins cleanup deprecation warnings and finish conversion so the inventory is knit based too. | 246 | from_sf = self.from_repository._revision_store.get_signature_file( | 
| 1563.2.31
by Robert Collins Convert Knit repositories to use knits. | 247 | from_transaction) | 
| 248 | to_sf.join(from_sf, version_ids=revs, pb=self.pb, ignore_missing=True) | |
| 249 | to_rf = self.to_repository._revision_store.get_revision_file( | |
| 250 | to_transaction) | |
| 251 | from_rf = self.from_repository._revision_store.get_revision_file( | |
| 252 | from_transaction) | |
| 253 | to_rf.join(from_rf, version_ids=revs, pb=self.pb) | |
| 254 | ||
| 255 | ||
| 1534.4.41
by Robert Collins Branch now uses BzrDir reasonably sanely. | 256 | class Fetcher(object): | 
| 1534.1.32
by Robert Collins Deprecate direct use of fetch.Fetcher. | 257 | """Backwards compatability glue for branch.fetch().""" | 
| 258 | ||
| 259 | @deprecated_method(zero_eight) | |
| 1534.4.41
by Robert Collins Branch now uses BzrDir reasonably sanely. | 260 | def __init__(self, to_branch, from_branch, last_revision=None, pb=None): | 
| 1534.1.32
by Robert Collins Deprecate direct use of fetch.Fetcher. | 261 | """Please see branch.fetch().""" | 
| 262 | to_branch.fetch(from_branch, last_revision, pb) |