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