bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 1615.1.2
by Martin Pool [merge] robert's knit-performance work | 1 | # Copyright (C) 2005, 2006 by Canonical Ltd
 | 
| 1887.1.1
by Adeodato Simó Do not separate paragraphs in the copyright statement with blank lines, | 2 | #
 | 
| 974.1.27
by aaron.bentley at utoronto Initial greedy fetch work | 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.
 | |
| 1887.1.1
by Adeodato Simó Do not separate paragraphs in the copyright statement with blank lines, | 7 | #
 | 
| 974.1.27
by aaron.bentley at utoronto Initial greedy fetch work | 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.
 | |
| 1887.1.1
by Adeodato Simó Do not separate paragraphs in the copyright statement with blank lines, | 12 | #
 | 
| 974.1.27
by aaron.bentley at utoronto Initial greedy fetch work | 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 | |
| 1773.4.1
by Martin Pool Add pyflakes makefile target; fix many warnings | 36 | from bzrlib.errors import (InstallFailed, | 
| 37 |                            )
 | |
| 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. | 38 | from bzrlib.trace import mutter | 
| 1773.4.1
by Martin Pool Add pyflakes makefile target; fix many warnings | 39 | from bzrlib.progress import ProgressPhase | 
| 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. | 40 | from bzrlib.revision import NULL_REVISION | 
| 1773.4.1
by Martin Pool Add pyflakes makefile target; fix many warnings | 41 | from bzrlib.symbol_versioning import (deprecated_function, | 
| 42 | deprecated_method, | |
| 43 | zero_eight, | |
| 44 |         )
 | |
| 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. | 45 | |
| 46 | ||
| 1231
by Martin Pool - more progress on fetch on top of weaves | 47 | # TODO: Avoid repeatedly opening weaves so many times.
 | 
| 974.1.27
by aaron.bentley at utoronto Initial greedy fetch work | 48 | |
| 1238
by Martin Pool - remove a lot of dead code from fetch | 49 | # XXX: This doesn't handle ghost (not present in branch) revisions at
 | 
| 1240
by Martin Pool - clean up fetch code and add progress bar | 50 | # all yet.  I'm not sure they really should be supported.
 | 
| 51 | ||
| 1262
by Martin Pool - fetch should also copy ancestry records | 52 | # NOTE: This doesn't copy revisions which may be present but not
 | 
| 53 | # 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 | 54 | |
| 55 | # - get a list of revisions that need to be pulled in
 | |
| 56 | # - for each one, pull in that revision file
 | |
| 57 | #   and get the inventory, and store the inventory with right
 | |
| 58 | #   parents.
 | |
| 59 | # - and get the ancestry, and store that with right parents too
 | |
| 60 | # - and keep a note of all file ids and version seen
 | |
| 61 | # - then go through all files; for each one get the weave,
 | |
| 62 | #   and add in all file versions
 | |
| 63 | ||
| 64 | ||
| 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. | 65 | @deprecated_function(zero_eight) | 
| 1260
by Martin Pool - some updates for fetch/update function | 66 | def greedy_fetch(to_branch, from_branch, revision=None, pb=None): | 
| 1534.1.32
by Robert Collins Deprecate direct use of fetch.Fetcher. | 67 | """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 | 68 | f = Fetcher(to_branch, from_branch, revision, pb) | 
| 69 | return f.count_copied, f.failed_revisions | |
| 70 | ||
| 1534.1.32
by Robert Collins Deprecate direct use of fetch.Fetcher. | 71 | fetch = greedy_fetch | 
| 72 | ||
| 1219
by Martin Pool - BROKEN: start refactoring fetch code to work well with weaves | 73 | |
| 1534.4.41
by Robert Collins Branch now uses BzrDir reasonably sanely. | 74 | class RepoFetcher(object): | 
| 75 | """Pull revisions and texts from one repository to another. | |
| 76 | ||
| 77 |     last_revision
 | |
| 78 |         if set, try to limit to the data this revision references.
 | |
| 79 | ||
| 80 |     after running:
 | |
| 1260
by Martin Pool - some updates for fetch/update function | 81 |     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. | 82 | |
| 83 |     This should not be used directory, its essential a object to encapsulate
 | |
| 84 |     the logic in InterRepository.fetch().
 | |
| 1260
by Martin Pool - some updates for fetch/update function | 85 |     """
 | 
| 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. | 86 | 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. | 87 |         # result variables.
 | 
| 88 | self.failed_revisions = [] | |
| 89 | 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. | 90 | 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. | 91 |             # check that last_revision is in 'from' and then return a no-operation.
 | 
| 92 | if last_revision not in (None, NULL_REVISION): | |
| 93 | from_repository.get_revision(last_revision) | |
| 94 |             return
 | |
| 1534.4.41
by Robert Collins Branch now uses BzrDir reasonably sanely. | 95 | self.to_repository = to_repository | 
| 96 | self.from_repository = from_repository | |
| 97 |         # must not mutate self._last_revision as its potentially a shared instance
 | |
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 98 | self._last_revision = last_revision | 
| 99 | if pb is None: | |
| 1594.1.3
by Robert Collins Fixup pb usage to use nested_progress_bar. | 100 | self.pb = bzrlib.ui.ui_factory.nested_progress_bar() | 
| 101 | self.nested_pb = self.pb | |
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 102 | else: | 
| 103 | self.pb = pb | |
| 1594.1.3
by Robert Collins Fixup pb usage to use nested_progress_bar. | 104 | self.nested_pb = None | 
| 1534.4.41
by Robert Collins Branch now uses BzrDir reasonably sanely. | 105 | self.from_repository.lock_read() | 
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 106 | try: | 
| 1534.4.41
by Robert Collins Branch now uses BzrDir reasonably sanely. | 107 | self.to_repository.lock_write() | 
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 108 | try: | 
| 109 | self.__fetch() | |
| 110 | finally: | |
| 1594.1.3
by Robert Collins Fixup pb usage to use nested_progress_bar. | 111 | if self.nested_pb is not None: | 
| 112 | self.nested_pb.finished() | |
| 1534.4.41
by Robert Collins Branch now uses BzrDir reasonably sanely. | 113 | self.to_repository.unlock() | 
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 114 | finally: | 
| 1534.4.41
by Robert Collins Branch now uses BzrDir reasonably sanely. | 115 | self.from_repository.unlock() | 
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 116 | |
| 117 | def __fetch(self): | |
| 118 | """Primary worker function. | |
| 119 | ||
| 120 |         This initialises all the needed variables, and then fetches the 
 | |
| 121 |         requested revisions, finally clearing the progress bar.
 | |
| 122 |         """
 | |
| 1185.67.2
by Aaron Bentley Renamed Branch.storage to Branch.repository | 123 | self.to_weaves = self.to_repository.weave_store | 
| 124 | self.to_control = self.to_repository.control_weaves | |
| 125 | self.from_weaves = self.from_repository.weave_store | |
| 126 | self.from_control = self.from_repository.control_weaves | |
| 1240
by Martin Pool - clean up fetch code and add progress bar | 127 | self.count_total = 0 | 
| 1185.33.55
by Martin Pool [patch] weave fetch optimizations (Goffredo Baroncelli) | 128 | self.file_ids_names = {} | 
| 1733.2.6
by Michael Ellerman Fix phase handling in fetch code. | 129 | pp = ProgressPhase('Fetch phase', 4, self.pb) | 
| 1392
by Robert Collins reinstate testfetch test case | 130 | try: | 
| 1733.2.6
by Michael Ellerman Fix phase handling in fetch code. | 131 | pp.next_phase() | 
| 1185.65.30
by Robert Collins Merge integration. | 132 | revs = self._revids_to_fetch() | 
| 1596.2.22
by Robert Collins Fetch changes to use new pb. | 133 |             # something to do ?
 | 
| 1615.1.2
by Martin Pool [merge] robert's knit-performance work | 134 | if revs: | 
| 1551.2.36
by Aaron Bentley Make pull update the progress bar more nicely | 135 | pp.next_phase() | 
| 1534.1.11
by Robert Collins Format tweaks for latest merges. | 136 | self._fetch_weave_texts(revs) | 
| 1551.2.36
by Aaron Bentley Make pull update the progress bar more nicely | 137 | pp.next_phase() | 
| 1534.1.11
by Robert Collins Format tweaks for latest merges. | 138 | self._fetch_inventory_weave(revs) | 
| 1551.2.36
by Aaron Bentley Make pull update the progress bar more nicely | 139 | pp.next_phase() | 
| 1534.1.11
by Robert Collins Format tweaks for latest merges. | 140 | 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 | 141 | self.count_copied += len(revs) | 
| 1185.12.15
by Aaron Bentley Cleared progress bar properly after fetch | 142 | finally: | 
| 143 | self.pb.clear() | |
| 1231
by Martin Pool - more progress on fetch on top of weaves | 144 | |
| 1185.65.30
by Robert Collins Merge integration. | 145 | def _revids_to_fetch(self): | 
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 146 | 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. | 147 | if self._last_revision is NULL_REVISION: | 
| 148 |             # explicit limit of no revisions needed
 | |
| 1534.4.41
by Robert Collins Branch now uses BzrDir reasonably sanely. | 149 | return None | 
| 1963.2.6
by Robey Pointer pychecker is on crack; go back to using 'is None'. | 150 | if (self._last_revision is not None and | 
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 151 | self.to_repository.has_revision(self._last_revision)): | 
| 1534.4.41
by Robert Collins Branch now uses BzrDir reasonably sanely. | 152 | return None | 
| 153 | ||
| 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 | 154 | 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. | 155 | return self.to_repository.missing_revision_ids(self.from_repository, | 
| 156 | self._last_revision) | |
| 1534.4.41
by Robert Collins Branch now uses BzrDir reasonably sanely. | 157 | except errors.NoSuchRevision: | 
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 158 | 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 | 159 | |
| 1534.1.11
by Robert Collins Format tweaks for latest merges. | 160 | def _fetch_weave_texts(self, revs): | 
| 1596.2.22
by Robert Collins Fetch changes to use new pb. | 161 | texts_pb = bzrlib.ui.ui_factory.nested_progress_bar() | 
| 1551.2.36
by Aaron Bentley Make pull update the progress bar more nicely | 162 | try: | 
| 1863.1.2
by John Arbash Meinel Enable caching for the from inventory while fetching. | 163 |             # fileids_altered_by_revision_ids requires reading the inventory
 | 
| 164 |             # weave, we will need to read the inventory weave again when
 | |
| 165 |             # all this is done, so enable caching for that specific weave
 | |
| 166 | inv_w = self.from_repository.get_inventory_weave() | |
| 167 | inv_w.enable_cache() | |
| 1694.2.6
by Martin Pool [merge] bzr.dev | 168 | file_ids = self.from_repository.fileids_altered_by_revision_ids(revs) | 
| 1596.2.22
by Robert Collins Fetch changes to use new pb. | 169 | count = 0 | 
| 170 | num_file_ids = len(file_ids) | |
| 1694.2.6
by Martin Pool [merge] bzr.dev | 171 | for file_id, required_versions in file_ids.items(): | 
| 1596.2.22
by Robert Collins Fetch changes to use new pb. | 172 | texts_pb.update("fetch texts", count, num_file_ids) | 
| 1551.2.36
by Aaron Bentley Make pull update the progress bar more nicely | 173 | count +=1 | 
| 1666.1.8
by Robert Collins Remove unneeded optimisation in fetch_texts - the interversioned file optimisers now do this. | 174 | to_weave = self.to_weaves.get_weave_or_empty(file_id, | 
| 175 | self.to_repository.get_transaction()) | |
| 176 | from_weave = self.from_weaves.get_weave(file_id, | |
| 177 | self.from_repository.get_transaction()) | |
| 178 |                 # we fetch all the texts, because texts do
 | |
| 179 |                 # not reference anything, and its cheap enough
 | |
| 1863.1.2
by John Arbash Meinel Enable caching for the from inventory while fetching. | 180 | to_weave.join(from_weave, version_ids=required_versions) | 
| 1759.2.2
by Jelmer Vernooij Revert some of my spelling fixes and fix some typos after review by Aaron. | 181 |                 # we don't need *all* of this data anymore, but we dont know
 | 
| 1753.1.2
by Robert Collins Shrink memory usage in branch. | 182 |                 # what we do. This cache clearing will result in a new read 
 | 
| 183 |                 # of the knit data when we do the checkout, but probably we
 | |
| 184 |                 # want to emit the needed data on the fly rather than at the
 | |
| 185 |                 # end anyhow.
 | |
| 186 |                 # the from weave should know not to cache data being joined,
 | |
| 187 |                 # but its ok to ask it to clear.
 | |
| 188 | from_weave.clear_cache() | |
| 189 | to_weave.clear_cache() | |
| 1551.2.36
by Aaron Bentley Make pull update the progress bar more nicely | 190 | finally: | 
| 1596.2.22
by Robert Collins Fetch changes to use new pb. | 191 | texts_pb.finished() | 
| 1185.64.3
by Goffredo Baroncelli This patch changes the fetch code. Before, the original code expanded every inventory and | 192 | |
| 1534.1.11
by Robert Collins Format tweaks for latest merges. | 193 | def _fetch_inventory_weave(self, revs): | 
| 1551.2.36
by Aaron Bentley Make pull update the progress bar more nicely | 194 | pb = bzrlib.ui.ui_factory.nested_progress_bar() | 
| 195 | try: | |
| 1615.1.2
by Martin Pool [merge] robert's knit-performance work | 196 | pb.update("fetch inventory", 0, 2) | 
| 1551.2.36
by Aaron Bentley Make pull update the progress bar more nicely | 197 | to_weave = self.to_control.get_weave('inventory', | 
| 198 | self.to_repository.get_transaction()) | |
| 1596.2.22
by Robert Collins Fetch changes to use new pb. | 199 | |
| 1551.2.36
by Aaron Bentley Make pull update the progress bar more nicely | 200 | child_pb = bzrlib.ui.ui_factory.nested_progress_bar() | 
| 201 | try: | |
| 1759.2.2
by Jelmer Vernooij Revert some of my spelling fixes and fix some typos after review by Aaron. | 202 |                 # just merge, this is optimisable and its means we don't
 | 
| 1551.2.37
by Aaron Bentley Merge from bzr.ab.integration | 203 |                 # copy unreferenced data such as not-needed inventories.
 | 
| 1615.1.2
by Martin Pool [merge] robert's knit-performance work | 204 | pb.update("fetch inventory", 1, 3) | 
| 1551.2.37
by Aaron Bentley Merge from bzr.ab.integration | 205 | from_weave = self.from_repository.get_inventory_weave() | 
| 1615.1.2
by Martin Pool [merge] robert's knit-performance work | 206 | pb.update("fetch inventory", 2, 3) | 
| 1551.2.37
by Aaron Bentley Merge from bzr.ab.integration | 207 |                 # we fetch only the referenced inventories because we do not
 | 
| 208 |                 # know for unselected inventories whether all their required
 | |
| 209 |                 # texts are present in the other repository - it could be
 | |
| 210 |                 # corrupt.
 | |
| 211 | to_weave.join(from_weave, pb=child_pb, msg='merge inventory', | |
| 212 | version_ids=revs) | |
| 1863.1.2
by John Arbash Meinel Enable caching for the from inventory while fetching. | 213 | from_weave.clear_cache() | 
| 1551.2.36
by Aaron Bentley Make pull update the progress bar more nicely | 214 | finally: | 
| 215 | child_pb.finished() | |
| 216 | finally: | |
| 217 | pb.finished() | |
| 1240
by Martin Pool - clean up fetch code and add progress bar | 218 | |
| 1534.4.41
by Robert Collins Branch now uses BzrDir reasonably sanely. | 219 | |
| 1563.2.31
by Robert Collins Convert Knit repositories to use knits. | 220 | class GenericRepoFetcher(RepoFetcher): | 
| 221 | """This is a generic repo to repo fetcher. | |
| 222 | ||
| 223 |     This makes minimal assumptions about repo layout and contents.
 | |
| 224 |     It triggers a reconciliation after fetching to ensure integrity.
 | |
| 225 |     """
 | |
| 226 | ||
| 227 | def _fetch_revision_texts(self, revs): | |
| 1615.1.2
by Martin Pool [merge] robert's knit-performance work | 228 | """Fetch revision object texts""" | 
| 1596.2.22
by Robert Collins Fetch changes to use new pb. | 229 | rev_pb = bzrlib.ui.ui_factory.nested_progress_bar() | 
| 1551.2.36
by Aaron Bentley Make pull update the progress bar more nicely | 230 | try: | 
| 1615.1.2
by Martin Pool [merge] robert's knit-performance work | 231 | to_txn = self.to_transaction = self.to_repository.get_transaction() | 
| 1596.2.22
by Robert Collins Fetch changes to use new pb. | 232 | count = 0 | 
| 233 | total = len(revs) | |
| 1615.1.2
by Martin Pool [merge] robert's knit-performance work | 234 | to_store = self.to_repository._revision_store | 
| 1551.2.36
by Aaron Bentley Make pull update the progress bar more nicely | 235 | for rev in revs: | 
| 1615.1.2
by Martin Pool [merge] robert's knit-performance work | 236 | pb = bzrlib.ui.ui_factory.nested_progress_bar() | 
| 1551.2.36
by Aaron Bentley Make pull update the progress bar more nicely | 237 | try: | 
| 1615.1.2
by Martin Pool [merge] robert's knit-performance work | 238 | pb.update('copying revisions', count, total) | 
| 239 | try: | |
| 240 | sig_text = self.from_repository.get_signature_text(rev) | |
| 241 | to_store.add_revision_signature_text(rev, sig_text, to_txn) | |
| 242 | except errors.NoSuchRevision: | |
| 243 |                         # not signed.
 | |
| 244 |                         pass
 | |
| 245 | to_store.add_revision(self.from_repository.get_revision(rev), | |
| 246 | to_txn) | |
| 247 | count += 1 | |
| 248 | finally: | |
| 249 | pb.finished() | |
| 1596.2.22
by Robert Collins Fetch changes to use new pb. | 250 |             # fixup inventory if needed: 
 | 
| 251 |             # this is expensive because we have no inverse index to current ghosts.
 | |
| 252 |             # but on local disk its a few seconds and sftp push is already insane.
 | |
| 253 |             # so we just-do-it.
 | |
| 254 |             # FIXME: repository should inform if this is needed.
 | |
| 255 | self.to_repository.reconcile() | |
| 1551.2.36
by Aaron Bentley Make pull update the progress bar more nicely | 256 | finally: | 
| 1596.2.22
by Robert Collins Fetch changes to use new pb. | 257 | rev_pb.finished() | 
| 1563.2.31
by Robert Collins Convert Knit repositories to use knits. | 258 | |
| 259 | ||
| 260 | class KnitRepoFetcher(RepoFetcher): | |
| 261 | """This is a knit format repository specific fetcher. | |
| 262 | ||
| 263 |     This differs from the GenericRepoFetcher by not doing a 
 | |
| 264 |     reconciliation after copying, and using knit joining to
 | |
| 265 |     copy revision texts.
 | |
| 266 |     """
 | |
| 267 | ||
| 268 | def _fetch_revision_texts(self, revs): | |
| 269 |         # may need to be a InterRevisionStore call here.
 | |
| 270 | from_transaction = self.from_repository.get_transaction() | |
| 271 | 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. | 272 | to_sf = self.to_repository._revision_store.get_signature_file( | 
| 1563.2.31
by Robert Collins Convert Knit repositories to use knits. | 273 | to_transaction) | 
| 1563.2.35
by Robert Collins cleanup deprecation warnings and finish conversion so the inventory is knit based too. | 274 | from_sf = self.from_repository._revision_store.get_signature_file( | 
| 1563.2.31
by Robert Collins Convert Knit repositories to use knits. | 275 | from_transaction) | 
| 1596.2.22
by Robert Collins Fetch changes to use new pb. | 276 | to_sf.join(from_sf, version_ids=revs, ignore_missing=True) | 
| 1563.2.31
by Robert Collins Convert Knit repositories to use knits. | 277 | to_rf = self.to_repository._revision_store.get_revision_file( | 
| 278 | to_transaction) | |
| 279 | from_rf = self.from_repository._revision_store.get_revision_file( | |
| 280 | from_transaction) | |
| 1596.2.22
by Robert Collins Fetch changes to use new pb. | 281 | to_rf.join(from_rf, version_ids=revs) | 
| 1563.2.31
by Robert Collins Convert Knit repositories to use knits. | 282 | |
| 283 | ||
| 1910.2.24
by Aaron Bentley Got intra-repository fetch working between model1 and 2 for all types | 284 | class Inter1and2Helper(object): | 
| 1910.2.48
by Aaron Bentley Update from review comments | 285 | """Helper for operations that convert data from model 1 and 2 | 
| 286 |     
 | |
| 287 |     This is for use by fetchers and converters.
 | |
| 288 |     """
 | |
| 289 | ||
| 290 | def __init__(self, source, target): | |
| 291 | """Constructor. | |
| 292 | ||
| 293 |         :param source: The repository data comes from
 | |
| 294 |         :param target: The repository data goes to
 | |
| 295 |         """
 | |
| 296 | self.source = source | |
| 297 | self.target = target | |
| 298 | ||
| 299 | def iter_rev_trees(self, revs): | |
| 300 | """Iterate through RevisionTrees efficiently. | |
| 301 | ||
| 302 |         Additionally, the inventory's revision_id is set if unset.
 | |
| 303 | ||
| 304 |         Trees are retrieved in batches of 100, and then yielded in the order
 | |
| 305 |         they were requested.
 | |
| 306 | ||
| 307 |         :param revs: A list of revision ids
 | |
| 308 |         """
 | |
| 309 | while revs: | |
| 310 | for tree in self.source.revision_trees(revs[:100]): | |
| 1910.2.44
by Aaron Bentley Retrieve only 500 revision trees at once | 311 | if tree.inventory.revision_id is None: | 
| 312 | tree.inventory.revision_id = tree.get_revision_id() | |
| 313 | yield tree | |
| 1910.2.48
by Aaron Bentley Update from review comments | 314 | revs = revs[100:] | 
| 1910.2.44
by Aaron Bentley Retrieve only 500 revision trees at once | 315 | |
| 1910.2.48
by Aaron Bentley Update from review comments | 316 | def generate_root_texts(self, revs): | 
| 317 | """Generate VersionedFiles for all root ids. | |
| 318 |         
 | |
| 319 |         :param revs: the revisions to include
 | |
| 320 |         """
 | |
| 321 | inventory_weave = self.source.get_inventory_weave() | |
| 322 | parent_texts = {} | |
| 323 | versionedfile = {} | |
| 324 | to_store = self.target.weave_store | |
| 325 | for tree in self.iter_rev_trees(revs): | |
| 1910.2.18
by Aaron Bentley Implement creation of knits for tree roots | 326 | revision_id = tree.inventory.root.revision | 
| 1910.2.48
by Aaron Bentley Update from review comments | 327 | root_id = tree.inventory.root.file_id | 
| 1910.2.18
by Aaron Bentley Implement creation of knits for tree roots | 328 | parents = inventory_weave.get_parents(revision_id) | 
| 1910.2.48
by Aaron Bentley Update from review comments | 329 | if root_id not in versionedfile: | 
| 330 | versionedfile[root_id] = to_store.get_weave_or_empty(root_id, | |
| 331 | self.target.get_transaction()) | |
| 332 | parent_texts[root_id] = versionedfile[root_id].add_lines( | |
| 333 | revision_id, parents, [], parent_texts) | |
| 334 | ||
| 335 | def regenerate_inventory(self, revs): | |
| 336 | """Generate a new inventory versionedfile in target, convertin data. | |
| 337 |         
 | |
| 338 |         The inventory is retrieved from the source, (deserializing it), and
 | |
| 339 |         stored in the target (reserializing it in a different format).
 | |
| 340 |         :param revs: The revisions to include
 | |
| 341 |         """
 | |
| 342 | inventory_weave = self.source.get_inventory_weave() | |
| 343 | for tree in self.iter_rev_trees(revs): | |
| 1910.2.22
by Aaron Bentley Make commits preserve root entry data | 344 | parents = inventory_weave.get_parents(tree.get_revision_id()) | 
| 1910.2.48
by Aaron Bentley Update from review comments | 345 | self.target.add_inventory(tree.get_revision_id(), tree.inventory, | 
| 346 | parents) | |
| 1910.2.24
by Aaron Bentley Got intra-repository fetch working between model1 and 2 for all types | 347 | |
| 348 | ||
| 349 | class Model1toKnit2Fetcher(GenericRepoFetcher): | |
| 350 | """Fetch from a Model1 repository into a Knit2 repository | |
| 351 |     """
 | |
| 1910.2.48
by Aaron Bentley Update from review comments | 352 | def __init__(self, to_repository, from_repository, last_revision=None, | 
| 353 | pb=None): | |
| 354 | self.helper = Inter1and2Helper(from_repository, to_repository) | |
| 355 | GenericRepoFetcher.__init__(self, to_repository, from_repository, | |
| 356 | last_revision, pb) | |
| 1910.2.24
by Aaron Bentley Got intra-repository fetch working between model1 and 2 for all types | 357 | |
| 358 | def _fetch_weave_texts(self, revs): | |
| 359 | GenericRepoFetcher._fetch_weave_texts(self, revs) | |
| 360 |         # Now generate a weave for the tree root
 | |
| 1910.2.48
by Aaron Bentley Update from review comments | 361 | self.helper.generate_root_texts(revs) | 
| 1910.2.24
by Aaron Bentley Got intra-repository fetch working between model1 and 2 for all types | 362 | |
| 363 | def _fetch_inventory_weave(self, revs): | |
| 1910.2.48
by Aaron Bentley Update from review comments | 364 | self.helper.regenerate_inventory(revs) | 
| 1910.2.24
by Aaron Bentley Got intra-repository fetch working between model1 and 2 for all types | 365 | |
| 366 | ||
| 367 | class Knit1to2Fetcher(KnitRepoFetcher): | |
| 368 | """Fetch from a Knit1 repository into a Knit2 repository""" | |
| 369 | ||
| 1910.2.48
by Aaron Bentley Update from review comments | 370 | def __init__(self, to_repository, from_repository, last_revision=None, | 
| 371 | pb=None): | |
| 372 | self.helper = Inter1and2Helper(from_repository, to_repository) | |
| 373 | KnitRepoFetcher.__init__(self, to_repository, from_repository, | |
| 374 | last_revision, pb) | |
| 375 | ||
| 1910.2.24
by Aaron Bentley Got intra-repository fetch working between model1 and 2 for all types | 376 | def _fetch_weave_texts(self, revs): | 
| 377 | KnitRepoFetcher._fetch_weave_texts(self, revs) | |
| 378 |         # Now generate a weave for the tree root
 | |
| 1910.2.48
by Aaron Bentley Update from review comments | 379 | self.helper.generate_root_texts(revs) | 
| 1910.2.24
by Aaron Bentley Got intra-repository fetch working between model1 and 2 for all types | 380 | |
| 381 | def _fetch_inventory_weave(self, revs): | |
| 1910.2.48
by Aaron Bentley Update from review comments | 382 | self.helper.regenerate_inventory(revs) | 
| 1910.2.24
by Aaron Bentley Got intra-repository fetch working between model1 and 2 for all types | 383 | |
| 1910.2.17
by Aaron Bentley Get fetching from 1 to 2 under test | 384 | |
| 1534.4.41
by Robert Collins Branch now uses BzrDir reasonably sanely. | 385 | class Fetcher(object): | 
| 1759.2.1
by Jelmer Vernooij Fix some types (found using aspell). | 386 | """Backwards compatibility glue for branch.fetch().""" | 
| 1534.1.32
by Robert Collins Deprecate direct use of fetch.Fetcher. | 387 | |
| 388 | @deprecated_method(zero_eight) | |
| 1534.4.41
by Robert Collins Branch now uses BzrDir reasonably sanely. | 389 | def __init__(self, to_branch, from_branch, last_revision=None, pb=None): | 
| 1534.1.32
by Robert Collins Deprecate direct use of fetch.Fetcher. | 390 | """Please see branch.fetch().""" | 
| 391 | to_branch.fetch(from_branch, last_revision, pb) |