147.1.65
by Aaron Bentley
Support creating repositories instead of standalone branches. |
1 |
# Copyright (C) 2005, 2006 by Aaron Bentley
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
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
|
|
147.1.2
by Robert Collins
test empty import and tagged branches |
16 |
|
147.4.10
by Robert Collins
missing an errno import |
17 |
import errno |
18 |
||
147.1.59
by Aaron Bentley
Reverted bzrtools.py to mainline version. |
19 |
from bzrlib.bzrdir import BzrDir |
147.1.64
by Aaron Bentley
Switched to using checkouts instead of branch copies |
20 |
import bzrlib.bzrdir as bzrdir |
147.1.65
by Aaron Bentley
Support creating repositories instead of standalone branches. |
21 |
from bzrlib.errors import (BzrError, |
22 |
NotBranchError, |
|
23 |
NoWorkingTree, |
|
24 |
BzrCommandError, |
|
25 |
NoSuchRevision, |
|
26 |
NoRepositoryPresent, |
|
27 |
)
|
|
115
by aaron.bentley at utoronto
Import fixes from magnus@therning.org |
28 |
from bzrlib.branch import Branch |
147.2.8
by Aaron Bentley
Quieten commits |
29 |
from bzrlib.commit import Commit, NullCommitReporter |
147.1.36
by Robert Collins
updates for bzr api changes |
30 |
from bzrlib.commands import Command |
147.1.66
by Aaron Bentley
Added prefixes param to specify branches to import |
31 |
from bzrlib.option import _global_option, Option |
147.1.64
by Aaron Bentley
Switched to using checkouts instead of branch copies |
32 |
from bzrlib.merge import merge_inner |
33 |
from bzrlib.revision import NULL_REVISION |
|
147.1.63
by Aaron Bentley
Killed progress bar in tests |
34 |
import bzrlib.ui |
372
by Aaron Bentley
Add import for standalone test (why?) |
35 |
import bzrlib.ui.text |
147.4.19
by Robert Collins
Update for integration move of read_working_inventory from Branch to WorkingTree. |
36 |
from bzrlib.workingtree import WorkingTree |
105
by Aaron Bentley
Fixed NoPyBaz detection |
37 |
from errors import NoPyBaz |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
38 |
try: |
147.2.3
by Aaron Bentley
Fixed import issues w/ PyBaz |
39 |
import pybaz |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
40 |
import pybaz.errors |
147.1.14
by Robert Collins
implement a namespace mapper |
41 |
from pybaz import NameParser as NameParser |
147.2.3
by Aaron Bentley
Fixed import issues w/ PyBaz |
42 |
from pybaz.backends.baz import null_cmd |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
43 |
except ImportError: |
147.2.3
by Aaron Bentley
Fixed import issues w/ PyBaz |
44 |
raise NoPyBaz |
147.2.2
by Aaron Bentley
Committed debugging changes |
45 |
from fai import iter_new_merges, direct_merges |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
46 |
import tempfile |
47 |
import os |
|
48 |
import os.path |
|
49 |
import shutil |
|
50 |
import bzrlib |
|
51 |
import bzrlib.trace |
|
52 |
import bzrlib.merge |
|
97
by aaron.bentley at utoronto
Added now-required imports |
53 |
import bzrlib.inventory |
54 |
import bzrlib.osutils |
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
55 |
import sys |
56 |
import email.Utils |
|
57 |
from progress import * |
|
58 |
||
453
by Aaron Bentley
Update baz_import to match unique-root changes |
59 |
|
60 |
BAZ_IMPORT_ROOT = 'TREE_ROOT' |
|
61 |
||
62 |
||
147.2.8
by Aaron Bentley
Quieten commits |
63 |
class ImportCommitReporter(NullCommitReporter): |
64 |
||
65 |
def escaped(self, escape_count, message): |
|
66 |
bzrlib.trace.warning("replaced %d control characters in message" % |
|
67 |
escape_count) |
|
68 |
||
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
69 |
def add_id(files, id=None): |
70 |
"""Adds an explicit id to a list of files.
|
|
71 |
||
72 |
:param files: the name of the file to add an id to
|
|
73 |
:type files: list of str
|
|
74 |
:param id: tag one file using the specified id, instead of generating id
|
|
75 |
:type id: str
|
|
76 |
"""
|
|
77 |
args = ["add-id"] |
|
78 |
if id is not None: |
|
79 |
args.extend(["--id", id]) |
|
80 |
args.extend(files) |
|
81 |
return null_cmd(args) |
|
82 |
||
147.1.2
by Robert Collins
test empty import and tagged branches |
83 |
saved_dir = None |
84 |
||
147.1.60
by Aaron Bentley
Stopped using deprecated PyBaz functionality |
85 |
def make_archive(name, location): |
86 |
pb_location = pybaz.ArchiveLocation(location) |
|
87 |
pb_location.create_master(pybaz.Archive(name), |
|
88 |
pybaz.ArchiveLocationParams()) |
|
89 |
||
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
90 |
def test_environ(): |
91 |
"""
|
|
92 |
>>> q = test_environ()
|
|
93 |
>>> os.path.exists(q)
|
|
94 |
True
|
|
95 |
>>> os.path.exists(os.path.join(q, "home", ".arch-params"))
|
|
96 |
True
|
|
97 |
>>> teardown_environ(q)
|
|
98 |
>>> os.path.exists(q)
|
|
99 |
False
|
|
100 |
"""
|
|
147.1.2
by Robert Collins
test empty import and tagged branches |
101 |
global saved_dir |
102 |
saved_dir = os.getcwdu() |
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
103 |
tdir = tempfile.mkdtemp(prefix="testdir-") |
104 |
os.environ["HOME"] = os.path.join(tdir, "home") |
|
105 |
os.mkdir(os.environ["HOME"]) |
|
106 |
arch_dir = os.path.join(tdir, "archive_dir") |
|
147.1.60
by Aaron Bentley
Stopped using deprecated PyBaz functionality |
107 |
make_archive("test@example.com", arch_dir) |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
108 |
work_dir = os.path.join(tdir, "work_dir") |
109 |
os.mkdir(work_dir) |
|
110 |
os.chdir(work_dir) |
|
111 |
pybaz.init_tree(work_dir, "test@example.com/test--test--0") |
|
112 |
lib_dir = os.path.join(tdir, "lib_dir") |
|
113 |
os.mkdir(lib_dir) |
|
114 |
pybaz.register_revision_library(lib_dir) |
|
115 |
pybaz.set_my_id("Test User<test@example.org>") |
|
116 |
return tdir |
|
117 |
||
118 |
def add_file(path, text, id): |
|
119 |
"""
|
|
120 |
>>> q = test_environ()
|
|
121 |
>>> add_file("path with space", "text", "lalala")
|
|
122 |
>>> tree = pybaz.tree_root(".")
|
|
123 |
>>> inv = list(tree.iter_inventory_ids(source=True, both=True))
|
|
124 |
>>> ("x_lalala", "path with space") in inv
|
|
125 |
True
|
|
126 |
>>> teardown_environ(q)
|
|
127 |
"""
|
|
128 |
file(path, "wb").write(text) |
|
129 |
add_id([path], id) |
|
130 |
||
131 |
||
132 |
def add_dir(path, id): |
|
133 |
"""
|
|
134 |
>>> q = test_environ()
|
|
135 |
>>> add_dir("path with\(sp) space", "lalala")
|
|
136 |
>>> tree = pybaz.tree_root(".")
|
|
137 |
>>> inv = list(tree.iter_inventory_ids(source=True, both=True))
|
|
138 |
>>> ("x_lalala", "path with\(sp) space") in inv
|
|
139 |
True
|
|
140 |
>>> teardown_environ(q)
|
|
141 |
"""
|
|
142 |
os.mkdir(path) |
|
143 |
add_id([path], id) |
|
144 |
||
145 |
def teardown_environ(tdir): |
|
147.1.2
by Robert Collins
test empty import and tagged branches |
146 |
os.chdir(saved_dir) |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
147 |
shutil.rmtree(tdir) |
148 |
||
149 |
def timport(tree, summary): |
|
150 |
msg = tree.log_message() |
|
151 |
msg["summary"] = summary |
|
152 |
tree.import_(msg) |
|
153 |
||
154 |
def commit(tree, summary): |
|
155 |
"""
|
|
156 |
>>> q = test_environ()
|
|
157 |
>>> tree = pybaz.tree_root(".")
|
|
158 |
>>> timport(tree, "import")
|
|
159 |
>>> commit(tree, "commit")
|
|
160 |
>>> logs = [str(l.revision) for l in tree.iter_logs()]
|
|
161 |
>>> len(logs)
|
|
162 |
2
|
|
163 |
>>> logs[0]
|
|
164 |
'test@example.com/test--test--0--base-0'
|
|
165 |
>>> logs[1]
|
|
166 |
'test@example.com/test--test--0--patch-1'
|
|
167 |
>>> teardown_environ(q)
|
|
168 |
"""
|
|
169 |
msg = tree.log_message() |
|
170 |
msg["summary"] = summary |
|
171 |
tree.commit(msg) |
|
172 |
||
173 |
def commit_test_revisions(): |
|
174 |
"""
|
|
175 |
>>> q = test_environ()
|
|
176 |
>>> commit_test_revisions()
|
|
177 |
>>> a = pybaz.Archive("test@example.com")
|
|
178 |
>>> revisions = list(a.iter_revisions("test--test--0"))
|
|
179 |
>>> len(revisions)
|
|
180 |
3
|
|
181 |
>>> str(revisions[2])
|
|
182 |
'test@example.com/test--test--0--base-0'
|
|
183 |
>>> str(revisions[1])
|
|
184 |
'test@example.com/test--test--0--patch-1'
|
|
185 |
>>> str(revisions[0])
|
|
186 |
'test@example.com/test--test--0--patch-2'
|
|
187 |
>>> teardown_environ(q)
|
|
188 |
"""
|
|
189 |
tree = pybaz.tree_root(".") |
|
190 |
add_file("mainfile", "void main(void){}", "mainfile by aaron") |
|
191 |
timport(tree, "Created mainfile") |
|
192 |
file("mainfile", "wb").write("or something like that") |
|
193 |
commit(tree, "altered mainfile") |
|
194 |
add_file("ofile", "this is another file", "ofile by aaron") |
|
195 |
commit(tree, "altered mainfile") |
|
196 |
||
197 |
||
198 |
def commit_more_test_revisions(): |
|
199 |
"""
|
|
200 |
>>> q = test_environ()
|
|
201 |
>>> commit_test_revisions()
|
|
202 |
>>> commit_more_test_revisions()
|
|
203 |
>>> a = pybaz.Archive("test@example.com")
|
|
204 |
>>> revisions = list(a.iter_revisions("test--test--0"))
|
|
205 |
>>> len(revisions)
|
|
206 |
4
|
|
207 |
>>> str(revisions[0])
|
|
208 |
'test@example.com/test--test--0--patch-3'
|
|
209 |
>>> teardown_environ(q)
|
|
210 |
"""
|
|
211 |
tree = pybaz.tree_root(".") |
|
212 |
add_file("trainfile", "void train(void){}", "trainfile by aaron") |
|
213 |
commit(tree, "altered trainfile") |
|
214 |
||
215 |
class NoSuchVersion(Exception): |
|
216 |
def __init__(self, version): |
|
217 |
Exception.__init__(self, "The version %s does not exist." % version) |
|
218 |
self.version = version |
|
219 |
||
220 |
def version_ancestry(version): |
|
221 |
"""
|
|
222 |
>>> q = test_environ()
|
|
223 |
>>> commit_test_revisions()
|
|
224 |
>>> version = pybaz.Version("test@example.com/test--test--0")
|
|
225 |
>>> ancestors = version_ancestry(version)
|
|
226 |
>>> str(ancestors[0])
|
|
227 |
'test@example.com/test--test--0--base-0'
|
|
228 |
>>> str(ancestors[1])
|
|
229 |
'test@example.com/test--test--0--patch-1'
|
|
230 |
>>> version = pybaz.Version("test@example.com/test--test--0.5")
|
|
231 |
>>> ancestors = version_ancestry(version)
|
|
232 |
Traceback (most recent call last):
|
|
233 |
NoSuchVersion: The version test@example.com/test--test--0.5 does not exist.
|
|
234 |
>>> teardown_environ(q)
|
|
235 |
"""
|
|
236 |
try: |
|
237 |
revision = version.iter_revisions(reverse=True).next() |
|
147.2.7
by Aaron Bentley
Handle empty versions correctly |
238 |
except StopIteration: |
239 |
return () |
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
240 |
except: |
147.1.2
by Robert Collins
test empty import and tagged branches |
241 |
print version |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
242 |
if not version.exists(): |
243 |
raise NoSuchVersion(version) |
|
244 |
else: |
|
245 |
raise
|
|
246 |
ancestors = list(revision.iter_ancestors(metoo=True)) |
|
247 |
ancestors.reverse() |
|
248 |
return ancestors |
|
249 |
||
250 |
def get_last_revision(branch): |
|
221
by abentley
bzrtools 0.1.1 (baz-import patch) |
251 |
last_patch = branch.last_revision() |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
252 |
try: |
253 |
return arch_revision(last_patch) |
|
254 |
except NotArchRevision: |
|
255 |
raise UserError( |
|
256 |
"Directory \"%s\" already exists, and the last revision is not" |
|
147.2.10
by Aaron Bentley
Improved error handling, esp when invoking on wrong branch |
257 |
" an Arch revision (%s)" % (branch.base, last_patch)) |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
258 |
|
147.4.6
by Robert Collins
Fix continuation direct_merges output, and allow reusing history in a version import |
259 |
def do_branch(br_from, to_location, revision_id): |
260 |
"""Derived from branch in builtins."""
|
|
261 |
br_from.lock_read() |
|
262 |
try: |
|
263 |
try: |
|
264 |
os.mkdir(to_location) |
|
265 |
except OSError, e: |
|
266 |
if e.errno == errno.EEXIST: |
|
267 |
raise UserError('Target directory "%s" already' |
|
268 |
' exists.' % to_location) |
|
269 |
if e.errno == errno.ENOENT: |
|
270 |
raise UserError('Parent of "%s" does not exist.' % |
|
271 |
to_location) |
|
272 |
else: |
|
273 |
raise
|
|
274 |
try: |
|
147.1.55
by Aaron Bentley
Got imports working, via a big hammer |
275 |
br_from.bzrdir.clone(to_location, revision_id) |
147.4.6
by Robert Collins
Fix continuation direct_merges output, and allow reusing history in a version import |
276 |
except NoSuchRevision: |
277 |
rmtree(to_location) |
|
147.1.57
by Aaron Bentley
Cleaned up baz_import and tests |
278 |
msg = "The branch %s has no revision %s." % (from_location, |
279 |
revision_id) |
|
147.4.6
by Robert Collins
Fix continuation direct_merges output, and allow reusing history in a version import |
280 |
raise UserError(msg) |
281 |
finally: |
|
282 |
br_from.unlock() |
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
283 |
|
460
by Aaron Bentley
Add encoding parameter everywhere |
284 |
def get_remaining_revisions(output_dir, version, encoding, |
285 |
reuse_history_from=[]): |
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
286 |
last_patch = None |
287 |
old_revno = None |
|
147.4.6
by Robert Collins
Fix continuation direct_merges output, and allow reusing history in a version import |
288 |
output_exists = os.path.exists(output_dir) |
289 |
if output_exists: |
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
290 |
# We are starting from an existing directory, figure out what
|
291 |
# the current version is
|
|
147.1.29
by Robert Collins
update to latest bzr api |
292 |
branch = Branch.open(output_dir) |
461
by Aaron Bentley
implement encoding reverse-mapping |
293 |
last_patch, last_encoding = get_last_revision(branch) |
294 |
assert encoding == last_encoding |
|
278
by Aaron Bentley
Handled cases where user supplies empty directories or branches |
295 |
if last_patch is None: |
364.1.2
by Aaron Bentley
Patch from robert to allow import into empty branches |
296 |
if branch.last_revision() != None: |
297 |
raise NotPreviousImport(branch.base) |
|
298 |
elif version is None: |
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
299 |
version = last_patch.version |
300 |
elif version is None: |
|
301 |
raise UserError("No version specified, and directory does not exist.") |
|
302 |
||
303 |
try: |
|
304 |
ancestors = version_ancestry(version) |
|
147.4.6
by Robert Collins
Fix continuation direct_merges output, and allow reusing history in a version import |
305 |
if not output_exists and reuse_history_from != []: |
306 |
for ancestor in reversed(ancestors): |
|
147.4.11
by Robert Collins
tweak to fix reusing history with more than one candidate ancestor |
307 |
if last_patch is not None: |
308 |
# found something to copy
|
|
309 |
break
|
|
147.4.6
by Robert Collins
Fix continuation direct_merges output, and allow reusing history in a version import |
310 |
# try to grab a copy of ancestor
|
311 |
# note that is not optimised: we could look for namespace
|
|
312 |
# transitions and only look for the past after the
|
|
313 |
# transition.
|
|
314 |
for history_root in reuse_history_from: |
|
315 |
possible_source = os.path.join(history_root, |
|
316 |
map_namespace(ancestor.version)) |
|
317 |
try: |
|
318 |
source = Branch.open(possible_source) |
|
460
by Aaron Bentley
Add encoding parameter everywhere |
319 |
rev_id = revision_id(ancestor, encoding) |
147.4.6
by Robert Collins
Fix continuation direct_merges output, and allow reusing history in a version import |
320 |
if rev_id in source.revision_history(): |
321 |
do_branch(source, output_dir, rev_id) |
|
322 |
last_patch = ancestor |
|
323 |
break
|
|
324 |
except NotBranchError: |
|
325 |
pass
|
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
326 |
except NoSuchVersion, e: |
147.1.37
by Robert Collins
get all tests passing again, and disable importing the body of continuation log messages |
327 |
raise UserError(str(e)) |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
328 |
|
329 |
if last_patch: |
|
330 |
for i in range(len(ancestors)): |
|
331 |
if ancestors[i] == last_patch: |
|
332 |
break
|
|
333 |
else: |
|
334 |
raise UserError("Directory \"%s\" already exists, and the last " |
|
335 |
"revision (%s) is not in the ancestry of %s" % |
|
336 |
(output_dir, last_patch, version)) |
|
337 |
# Strip off all of the ancestors which are already present
|
|
338 |
# And get a directory starting with the latest ancestor
|
|
339 |
latest_ancestor = ancestors[i] |
|
147.1.29
by Robert Collins
update to latest bzr api |
340 |
old_revno = Branch.open(output_dir).revno() |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
341 |
ancestors = ancestors[i+1:] |
342 |
return ancestors, old_revno |
|
343 |
||
147.4.6
by Robert Collins
Fix continuation direct_merges output, and allow reusing history in a version import |
344 |
|
345 |
###class Importer(object):
|
|
346 |
### """An importer.
|
|
347 |
###
|
|
348 |
### Currently this is used as a parameter object, though more behaviour is
|
|
349 |
### possible later.
|
|
350 |
### """
|
|
351 |
###
|
|
364.1.1
by Aaron Bentley
Merge progress bar updates from robertc |
352 |
### def __init__(self, output_dir, version, fast=False,
|
147.4.6
by Robert Collins
Fix continuation direct_merges output, and allow reusing history in a version import |
353 |
### verbose=False, dry_run=False, max_count=None,
|
354 |
### reuse_history_from=[]):
|
|
355 |
### self.output_dir = output_dir
|
|
356 |
### self.version = version
|
|
357 |
### self.
|
|
358 |
||
359 |
||
460
by Aaron Bentley
Add encoding parameter everywhere |
360 |
def import_version(output_dir, version, encoding, fast=False, |
147.4.6
by Robert Collins
Fix continuation direct_merges output, and allow reusing history in a version import |
361 |
verbose=False, dry_run=False, max_count=None, |
147.1.65
by Aaron Bentley
Support creating repositories instead of standalone branches. |
362 |
reuse_history_from=[], standalone=True): |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
363 |
"""
|
364 |
>>> q = test_environ()
|
|
364.1.1
by Aaron Bentley
Merge progress bar updates from robertc |
365 |
|
366 |
Progress bars output to stderr, but doctest does not capture that.
|
|
367 |
||
368 |
>>> old_stderr = sys.stderr
|
|
369 |
>>> sys.stderr = sys.stdout
|
|
370 |
||
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
371 |
>>> result_path = os.path.join(q, "result")
|
372 |
>>> commit_test_revisions()
|
|
373 |
>>> version = pybaz.Version("test@example.com/test--test--0.1")
|
|
364.1.1
by Aaron Bentley
Merge progress bar updates from robertc |
374 |
>>> old_ui = bzrlib.ui.ui_factory
|
375 |
>>> bzrlib.ui.ui_factory = bzrlib.ui.text.TextUIFactory(
|
|
376 |
... bar_type=bzrlib.progress.DotsProgressBar)
|
|
377 |
||
460
by Aaron Bentley
Add encoding parameter everywhere |
378 |
>>> import_version('/', version, None, dry_run=True)
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
379 |
Traceback (most recent call last):
|
147.1.45
by Aaron Bentley
Fixed test case |
380 |
NotPreviousImport: / is not the location of a previous import.
|
460
by Aaron Bentley
Add encoding parameter everywhere |
381 |
>>> import_version(result_path, version, None, dry_run=True)
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
382 |
Traceback (most recent call last):
|
383 |
UserError: The version test@example.com/test--test--0.1 does not exist.
|
|
384 |
>>> version = pybaz.Version("test@example.com/test--test--0")
|
|
460
by Aaron Bentley
Add encoding parameter everywhere |
385 |
>>> import_version(result_path, version, None, dry_run=True) #doctest: +ELLIPSIS
|
364.1.1
by Aaron Bentley
Merge progress bar updates from robertc |
386 |
importing test@example.com/test--test--0 into ...
|
387 |
...
|
|
388 |
revisions: ..........................................
|
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
389 |
Dry run, not modifying output_dir
|
390 |
Cleaning up
|
|
460
by Aaron Bentley
Add encoding parameter everywhere |
391 |
>>> import_version(result_path, version, None) #doctest: +ELLIPSIS
|
364.1.1
by Aaron Bentley
Merge progress bar updates from robertc |
392 |
importing test@example.com/test--test--0 into ...
|
393 |
...
|
|
394 |
revisions: .....................................................................
|
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
395 |
Cleaning up
|
396 |
Import complete.
|
|
460
by Aaron Bentley
Add encoding parameter everywhere |
397 |
>>> import_version(result_path, version, None) #doctest: +ELLIPSIS
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
398 |
Tree is up-to-date with test@example.com/test--test--0--patch-2
|
399 |
>>> commit_more_test_revisions()
|
|
460
by Aaron Bentley
Add encoding parameter everywhere |
400 |
>>> import_version(result_path, version, None) #doctest: +ELLIPSIS
|
364.1.1
by Aaron Bentley
Merge progress bar updates from robertc |
401 |
importing test@example.com/test--test--0 into ...
|
402 |
revisions: ....................................................
|
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
403 |
Cleaning up
|
404 |
Import complete.
|
|
364.1.1
by Aaron Bentley
Merge progress bar updates from robertc |
405 |
>>> bzrlib.ui.ui_factory = old_ui
|
406 |
>>> sys.stderr = old_stderr
|
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
407 |
>>> teardown_environ(q)
|
408 |
"""
|
|
364.1.1
by Aaron Bentley
Merge progress bar updates from robertc |
409 |
progress_bar = bzrlib.ui.ui_factory.nested_progress_bar() |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
410 |
try: |
364.1.1
by Aaron Bentley
Merge progress bar updates from robertc |
411 |
try: |
412 |
ancestors, old_revno = get_remaining_revisions(output_dir, version, |
|
460
by Aaron Bentley
Add encoding parameter everywhere |
413 |
encoding, |
364.1.1
by Aaron Bentley
Merge progress bar updates from robertc |
414 |
reuse_history_from) |
415 |
except NotBranchError, e: |
|
416 |
raise NotPreviousImport(e.path) |
|
417 |
if old_revno is None and len(ancestors) == 0: |
|
418 |
progress_bar.note('Version %s has no revisions.' % version) |
|
419 |
return
|
|
420 |
if len(ancestors) == 0: |
|
461
by Aaron Bentley
implement encoding reverse-mapping |
421 |
last_revision, last_encoding = \ |
422 |
get_last_revision(Branch.open(output_dir)) |
|
364.1.1
by Aaron Bentley
Merge progress bar updates from robertc |
423 |
progress_bar.note('Tree is up-to-date with %s' % last_revision) |
424 |
return
|
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
425 |
|
364.1.1
by Aaron Bentley
Merge progress bar updates from robertc |
426 |
progress_bar.note("importing %s into %s" % (version, output_dir)) |
427 |
||
428 |
tempdir = tempfile.mkdtemp(prefix="baz2bzr-", |
|
429 |
dir=os.path.dirname(output_dir)) |
|
430 |
try: |
|
431 |
wt = WorkingTree.open(output_dir) |
|
432 |
except (NotBranchError, NoWorkingTree): |
|
433 |
wt = None |
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
434 |
try: |
435 |
for result in iter_import_version(output_dir, ancestors, tempdir, |
|
460
by Aaron Bentley
Add encoding parameter everywhere |
436 |
pb=progress_bar, encoding=encoding, fast=fast, |
437 |
verbose=verbose, dry_run=dry_run, max_count=max_count, |
|
438 |
standalone=standalone): |
|
364.1.1
by Aaron Bentley
Merge progress bar updates from robertc |
439 |
show_progress(progress_bar, result) |
440 |
if dry_run: |
|
441 |
progress_bar.note('Dry run, not modifying output_dir') |
|
442 |
return
|
|
443 |
||
444 |
# Update the working tree of the branch
|
|
445 |
try: |
|
446 |
wt = WorkingTree.open(output_dir) |
|
447 |
except NoWorkingTree: |
|
448 |
wt = None |
|
449 |
if wt is not None: |
|
450 |
wt.set_last_revision(wt.branch.last_revision()) |
|
453
by Aaron Bentley
Update baz_import to match unique-root changes |
451 |
wt.set_root_id(BAZ_IMPORT_ROOT) |
364.1.1
by Aaron Bentley
Merge progress bar updates from robertc |
452 |
wt.revert([]) |
453 |
||
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
454 |
finally: |
364.1.1
by Aaron Bentley
Merge progress bar updates from robertc |
455 |
|
456 |
progress_bar.note('Cleaning up') |
|
457 |
shutil.rmtree(tempdir) |
|
458 |
progress_bar.note("Import complete.") |
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
459 |
finally: |
364.1.1
by Aaron Bentley
Merge progress bar updates from robertc |
460 |
progress_bar.finished() |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
461 |
|
278
by Aaron Bentley
Handled cases where user supplies empty directories or branches |
462 |
class UserError(BzrCommandError): |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
463 |
def __init__(self, message): |
464 |
"""Exception to throw when a user makes an impossible request
|
|
465 |
:param message: The message to emit when printing this exception
|
|
466 |
:type message: string
|
|
467 |
"""
|
|
278
by Aaron Bentley
Handled cases where user supplies empty directories or branches |
468 |
BzrCommandError.__init__(self, message) |
469 |
||
470 |
class NotPreviousImport(UserError): |
|
471 |
def __init__(self, path): |
|
472 |
UserError.__init__(self, "%s is not the location of a previous import." |
|
473 |
% path) |
|
474 |
||
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
475 |
|
460
by Aaron Bentley
Add encoding parameter everywhere |
476 |
def revision_id(arch_revision, encoding): |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
477 |
"""
|
478 |
Generate a Bzr revision id from an Arch revision id. 'x' in the id
|
|
479 |
designates a revision imported with an experimental algorithm. A number
|
|
480 |
would indicate a particular standardized version.
|
|
481 |
||
482 |
:param arch_revision: The Arch revision to generate an ID for.
|
|
483 |
||
460
by Aaron Bentley
Add encoding parameter everywhere |
484 |
>>> revision_id(pybaz.Revision("you@example.com/cat--br--0--base-0"), None)
|
147.1.2
by Robert Collins
test empty import and tagged branches |
485 |
'Arch-1:you@example.com%cat--br--0--base-0'
|
460
by Aaron Bentley
Add encoding parameter everywhere |
486 |
>>> revision_id(pybaz.Revision("you@example.com/cat--br--0--base-0"), 'utf-8')
|
487 |
'Arch-1-utf-8:you@example.com%cat--br--0--base-0'
|
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
488 |
"""
|
460
by Aaron Bentley
Add encoding parameter everywhere |
489 |
if encoding is None: |
490 |
encoding = '' |
|
491 |
else: |
|
492 |
encoding = '-' + encoding |
|
493 |
return "Arch-1%s:%s" % (encoding, str(arch_revision).replace('/', '%')) |
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
494 |
|
495 |
class NotArchRevision(Exception): |
|
496 |
def __init__(self, revision_id): |
|
497 |
msg = "The revision id %s does not look like it came from Arch."\ |
|
498 |
% revision_id |
|
499 |
Exception.__init__(self, msg) |
|
500 |
||
501 |
def arch_revision(revision_id): |
|
502 |
"""
|
|
147.1.2
by Robert Collins
test empty import and tagged branches |
503 |
>>> str(arch_revision("Arch-1:jrandom@example.com%test--test--0"))
|
504 |
Traceback (most recent call last):
|
|
505 |
NotArchRevision: The revision id Arch-1:jrandom@example.com%test--test--0 does not look like it came from Arch.
|
|
506 |
>>> str(arch_revision("Arch-1:jrandom@example.com%test--test--0--base-5"))
|
|
507 |
Traceback (most recent call last):
|
|
508 |
NotArchRevision: The revision id Arch-1:jrandom@example.com%test--test--0--base-5 does not look like it came from Arch.
|
|
461
by Aaron Bentley
implement encoding reverse-mapping |
509 |
>>> str(arch_revision("Arch-1:jrandom@example.com%test--test--0--patch-5")[0])
|
510 |
'jrandom@example.com/test--test--0--patch-5'
|
|
511 |
>>> str(arch_revision("Arch-1:jrandom@example.com%test--test--0--patch-5")[0])
|
|
512 |
'jrandom@example.com/test--test--0--patch-5'
|
|
513 |
>>> str(arch_revision("Arch-1:jrandom@example.com%test--test--0--patch-5")[1])
|
|
514 |
'None'
|
|
515 |
>>> str(arch_revision("Arch-1-utf-8:jrandom@example.com%test--test--0--patch-5")[1])
|
|
516 |
'utf-8'
|
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
517 |
"""
|
518 |
if revision_id is None: |
|
461
by Aaron Bentley
implement encoding reverse-mapping |
519 |
return None, None |
520 |
if revision_id[:7] not in ('Arch-1:', 'Arch-1-'): |
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
521 |
raise NotArchRevision(revision_id) |
522 |
else: |
|
523 |
try: |
|
461
by Aaron Bentley
implement encoding reverse-mapping |
524 |
encoding, arch_name = revision_id[6:].split(':', 1) |
525 |
arch_name = arch_name.replace('%', '/') |
|
526 |
if encoding == '': |
|
527 |
encoding = None |
|
528 |
else: |
|
529 |
encoding = encoding[1:] |
|
530 |
return pybaz.Revision(arch_name), encoding |
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
531 |
except pybaz.errors.NamespaceError, e: |
532 |
raise NotArchRevision(revision_id) |
|
147.1.64
by Aaron Bentley
Switched to using checkouts instead of branch copies |
533 |
|
534 |
||
147.1.65
by Aaron Bentley
Support creating repositories instead of standalone branches. |
535 |
def create_shared_repository(output_dir): |
536 |
bd = bzrdir.BzrDirMetaFormat1().initialize(output_dir) |
|
537 |
bd.create_repository(shared=True) |
|
538 |
||
539 |
def create_branch(output_dir): |
|
540 |
os.mkdir(output_dir) |
|
541 |
bd = bzrdir.BzrDirMetaFormat1().initialize(output_dir) |
|
542 |
return bd.create_branch() |
|
543 |
||
544 |
||
147.1.64
by Aaron Bentley
Switched to using checkouts instead of branch copies |
545 |
def create_checkout(source, to_location, revision_id=None): |
546 |
checkout = bzrdir.BzrDirMetaFormat1().initialize(to_location) |
|
547 |
bzrlib.branch.BranchReferenceFormat().initialize(checkout, source) |
|
548 |
return checkout.create_workingtree(revision_id) |
|
549 |
||
550 |
||
551 |
def create_checkout_metadata(source, to_location, revision_id=None): |
|
552 |
if revision_id is None: |
|
553 |
revision_id = source.last_revision() |
|
554 |
wt = create_checkout(source, to_location, NULL_REVISION) |
|
515.1.2
by Aaron Bentley
Fix all test suite bugs w/ dirstate |
555 |
wt.lock_write() |
556 |
try: |
|
557 |
wt.set_last_revision(revision_id) |
|
558 |
wt.flush() |
|
559 |
if revision_id not in (NULL_REVISION, None): |
|
560 |
basis = wt.basis_tree() |
|
561 |
basis.lock_read() |
|
562 |
try: |
|
563 |
wt._write_inventory(basis.inventory) |
|
564 |
finally: |
|
565 |
basis.unlock() |
|
566 |
finally: |
|
567 |
wt.unlock() |
|
147.1.64
by Aaron Bentley
Switched to using checkouts instead of branch copies |
568 |
return wt |
569 |
||
570 |
||
460
by Aaron Bentley
Add encoding parameter everywhere |
571 |
def iter_import_version(output_dir, ancestors, tempdir, pb, encoding, |
572 |
fast=False, verbose=False, dry_run=False, |
|
573 |
max_count=None, standalone=False): |
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
574 |
revdir = None |
462
by Aaron Bentley
Get encoding working |
575 |
log_encoding = 'ascii' |
576 |
if encoding is not None: |
|
577 |
log_encoding = encoding |
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
578 |
|
579 |
# Uncomment this for testing, it basically just has baz2bzr only update
|
|
580 |
# 5 patches at a time
|
|
581 |
if max_count: |
|
582 |
ancestors = ancestors[:max_count] |
|
583 |
||
584 |
# Not sure if I want this output. basically it tells you ahead of time
|
|
585 |
# what it is going to do, but then later it tells you as it is doing it.
|
|
586 |
# what probably would be best would be to collapse it into ranges, so that
|
|
587 |
# this gives the simple view, and then later it gives the blow by blow.
|
|
588 |
#if verbose:
|
|
589 |
# print 'Adding the following revisions:'
|
|
590 |
# for a in ancestors:
|
|
591 |
# print '\t%s' % a
|
|
592 |
||
593 |
previous_version=None |
|
147.1.20
by Robert Collins
handle missing ancestry |
594 |
missing_ancestor = None |
147.1.64
by Aaron Bentley
Switched to using checkouts instead of branch copies |
595 |
if dry_run: |
596 |
dry_output_dir = os.path.join(tempdir, 'od') |
|
597 |
if os.path.exists(output_dir): |
|
598 |
shutil.copytree(output_dir, dry_output_dir) |
|
599 |
output_dir = dry_output_dir |
|
600 |
||
601 |
if os.path.exists(output_dir): |
|
602 |
target_branch = Branch.open(output_dir) |
|
603 |
else: |
|
147.1.65
by Aaron Bentley
Support creating repositories instead of standalone branches. |
604 |
if standalone: |
147.4.30
by Robert Collins
Merge from ab-baz2bzr |
605 |
wt = BzrDir.create_standalone_workingtree(output_dir) |
147.1.65
by Aaron Bentley
Support creating repositories instead of standalone branches. |
606 |
target_branch = wt.branch |
607 |
else: |
|
608 |
target_branch = create_branch(output_dir) |
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
609 |
|
610 |
for i in range(len(ancestors)): |
|
611 |
revision = ancestors[i] |
|
460
by Aaron Bentley
Add encoding parameter everywhere |
612 |
rev_id = revision_id(revision, encoding) |
147.1.3
by Robert Collins
test and deliver basic pending-merges into bzr so that merging is recorded |
613 |
direct_merges = [] |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
614 |
if verbose: |
615 |
version = str(revision.version) |
|
616 |
if version != previous_version: |
|
364.1.1
by Aaron Bentley
Merge progress bar updates from robertc |
617 |
pb.note('On version: %s' % version) |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
618 |
yield Progress(str(revision.patchlevel), i, len(ancestors)) |
619 |
previous_version = version |
|
620 |
else: |
|
621 |
yield Progress("revisions", i, len(ancestors)) |
|
147.1.64
by Aaron Bentley
Switched to using checkouts instead of branch copies |
622 |
|
623 |
if target_branch.repository.has_revision(rev_id): |
|
624 |
target_branch.append_revision(rev_id) |
|
625 |
continue
|
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
626 |
if revdir is None: |
627 |
revdir = os.path.join(tempdir, "rd") |
|
147.1.20
by Robert Collins
handle missing ancestry |
628 |
try: |
147.2.14
by abentley
Allouche: More efficient PyBaz use |
629 |
tree, baz_inv, log = get_revision(revdir, revision) |
147.1.20
by Robert Collins
handle missing ancestry |
630 |
except pybaz.errors.ExecProblem, e: |
631 |
if ("%s" % e.args).find('could not connect') == -1: |
|
632 |
raise
|
|
633 |
missing_ancestor = revision |
|
634 |
revdir = None |
|
364.1.1
by Aaron Bentley
Merge progress bar updates from robertc |
635 |
pb.note("unable to access ancestor %s, making into a merge." |
147.1.20
by Robert Collins
handle missing ancestry |
636 |
% missing_ancestor) |
637 |
continue
|
|
147.1.64
by Aaron Bentley
Switched to using checkouts instead of branch copies |
638 |
target_tree = create_checkout_metadata(target_branch, revdir) |
639 |
branch = target_tree.branch |
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
640 |
else: |
641 |
old = os.path.join(revdir, ".bzr") |
|
642 |
new = os.path.join(tempdir, ".bzr") |
|
643 |
os.rename(old, new) |
|
147.2.14
by abentley
Allouche: More efficient PyBaz use |
644 |
baz_inv, log = apply_revision(tree, revision) |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
645 |
os.rename(new, old) |
147.1.61
by Aaron Bentley
Stopped using deprecated bzrlib functionality |
646 |
target_tree = WorkingTree.open(revdir) |
647 |
branch = target_tree.branch |
|
147.4.2
by Robert Collins
use direct merge log always, whether its a new tree or a patch being applied |
648 |
# cached so we can delete the log
|
649 |
log_date = log.date |
|
650 |
log_summary = log.summary |
|
651 |
log_description = log.description |
|
652 |
is_continuation = log.continuation_of is not None |
|
653 |
log_creator = log.creator |
|
147.4.6
by Robert Collins
Fix continuation direct_merges output, and allow reusing history in a version import |
654 |
direct_merges = get_direct_merges(revdir, revision, log) |
147.4.2
by Robert Collins
use direct merge log always, whether its a new tree or a patch being applied |
655 |
|
147.1.3
by Robert Collins
test and deliver basic pending-merges into bzr so that merging is recorded |
656 |
timestamp = email.Utils.mktime_tz(log_date + (0,)) |
147.2.5
by Aaron Bentley
Handled empty summary lines |
657 |
if log_summary is None: |
658 |
log_summary = "" |
|
147.1.37
by Robert Collins
get all tests passing again, and disable importing the body of continuation log messages |
659 |
# log_descriptions of None and "" are ignored.
|
660 |
if not is_continuation and log_description: |
|
147.2.9
by Aaron Bentley
Fixed log conversion |
661 |
log_message = "\n".join((log_summary, log_description)) |
662 |
else: |
|
663 |
log_message = log_summary |
|
147.1.61
by Aaron Bentley
Stopped using deprecated bzrlib functionality |
664 |
target_tree.lock_write() |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
665 |
branch.lock_write() |
666 |
try: |
|
147.1.20
by Robert Collins
handle missing ancestry |
667 |
if missing_ancestor: |
668 |
# if we want it to be in revision-history, do that here.
|
|
460
by Aaron Bentley
Add encoding parameter everywhere |
669 |
target_tree.set_parent_ids( |
670 |
[revision_id(missing_ancestor, encoding)], |
|
671 |
allow_leftmost_as_ghost=True) |
|
444
by Aaron Bentley
Better fix for new API |
672 |
missing_ancestor = None |
147.4.6
by Robert Collins
Fix continuation direct_merges output, and allow reusing history in a version import |
673 |
for merged_rev in direct_merges: |
460
by Aaron Bentley
Add encoding parameter everywhere |
674 |
target_tree.add_pending_merge(revision_id(merged_rev, |
675 |
encoding)) |
|
453
by Aaron Bentley
Update baz_import to match unique-root changes |
676 |
target_tree.set_root_id(BAZ_IMPORT_ROOT) |
515.1.2
by Aaron Bentley
Fix all test suite bugs w/ dirstate |
677 |
target_tree.flush() |
147.4.19
by Robert Collins
Update for integration move of read_working_inventory from Branch to WorkingTree. |
678 |
target_tree.set_inventory(baz_inv) |
364.1.1
by Aaron Bentley
Merge progress bar updates from robertc |
679 |
commitobj = Commit(reporter=ImportCommitReporter()) |
147.1.61
by Aaron Bentley
Stopped using deprecated bzrlib functionality |
680 |
commitobj.commit(working_tree=target_tree, |
462
by Aaron Bentley
Get encoding working |
681 |
message=log_message.decode(log_encoding, 'replace'), |
682 |
verbose=False, committer=log_creator, timestamp=timestamp, |
|
683 |
timezone=0, rev_id=rev_id, revprops={}) |
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
684 |
finally: |
147.4.19
by Robert Collins
Update for integration move of read_working_inventory from Branch to WorkingTree. |
685 |
target_tree.unlock() |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
686 |
branch.unlock() |
687 |
yield Progress("revisions", len(ancestors), len(ancestors)) |
|
688 |
||
147.4.6
by Robert Collins
Fix continuation direct_merges output, and allow reusing history in a version import |
689 |
def get_direct_merges(revdir, revision, log): |
690 |
continuation = log.continuation_of |
|
691 |
previous_version = revision.version |
|
692 |
if pybaz.WorkingTree(revdir).tree_version != previous_version: |
|
693 |
pybaz.WorkingTree(revdir).set_tree_version(previous_version) |
|
147.1.3
by Robert Collins
test and deliver basic pending-merges into bzr so that merging is recorded |
694 |
log_path = "%s/{arch}/%s/%s/%s/%s/patch-log/%s" % (revdir, |
695 |
revision.category.nonarch, revision.branch.nonarch, |
|
696 |
revision.version.nonarch, revision.archive, revision.patchlevel) |
|
147.2.13
by abentley
Allouche: always use a temp dir on the same filesystem |
697 |
temp_path = tempfile.mktemp(dir=os.path.dirname(revdir)) |
147.1.3
by Robert Collins
test and deliver basic pending-merges into bzr so that merging is recorded |
698 |
os.rename(log_path, temp_path) |
147.1.24
by Robert Collins
trim fai cribbage |
699 |
merges = list(iter_new_merges(revdir, revision.version)) |
147.4.6
by Robert Collins
Fix continuation direct_merges output, and allow reusing history in a version import |
700 |
direct = direct_merges(merges, [continuation]) |
147.1.3
by Robert Collins
test and deliver basic pending-merges into bzr so that merging is recorded |
701 |
os.rename(temp_path, log_path) |
702 |
return direct |
|
703 |
||
147.1.61
by Aaron Bentley
Stopped using deprecated bzrlib functionality |
704 |
def unlink_unversioned(wt): |
705 |
for unversioned in wt.extras(): |
|
706 |
path = wt.abspath(unversioned) |
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
707 |
if os.path.isdir(path): |
708 |
shutil.rmtree(path) |
|
709 |
else: |
|
710 |
os.unlink(path) |
|
711 |
||
712 |
def get_log(tree, revision): |
|
147.2.14
by abentley
Allouche: More efficient PyBaz use |
713 |
log = pybaz.Patchlog(revision, tree=tree) |
133
by Aaron Bentley
Weakened check so baz-import works |
714 |
assert str(log.revision) == str(revision), (log.revision, revision) |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
715 |
return log |
716 |
||
147.1.6
by Robert Collins
import symlinks (needs symlink enabled bzr) |
717 |
def get_revision(revdir, revision): |
147.2.14
by abentley
Allouche: More efficient PyBaz use |
718 |
tree = revision.get(revdir) |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
719 |
log = get_log(tree, revision) |
720 |
try: |
|
147.2.14
by abentley
Allouche: More efficient PyBaz use |
721 |
return tree, bzr_inventory_data(tree), log |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
722 |
except BadFileKind, e: |
147.1.57
by Aaron Bentley
Cleaned up baz_import and tests |
723 |
raise UserError("Cannot convert %s because %s is a %s" % |
724 |
(revision,e.path, e.kind)) |
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
725 |
|
726 |
||
147.2.14
by abentley
Allouche: More efficient PyBaz use |
727 |
def apply_revision(tree, revision): |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
728 |
revision.apply(tree) |
729 |
log = get_log(tree, revision) |
|
730 |
try: |
|
147.1.6
by Robert Collins
import symlinks (needs symlink enabled bzr) |
731 |
return bzr_inventory_data(tree), log |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
732 |
except BadFileKind, e: |
147.1.57
by Aaron Bentley
Cleaned up baz_import and tests |
733 |
raise UserError("Cannot convert %s because %s is a %s" % |
734 |
(revision,e.path, e.kind)) |
|
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
735 |
|
736 |
||
737 |
class BadFileKind(Exception): |
|
738 |
"""The file kind is not permitted in bzr inventories"""
|
|
739 |
def __init__(self, tree_root, path, kind): |
|
740 |
self.tree_root = tree_root |
|
741 |
self.path = path |
|
742 |
self.kind = kind |
|
743 |
Exception.__init__(self, "File %s is of forbidden type %s" % |
|
744 |
(os.path.join(tree_root, path), kind)) |
|
745 |
||
147.1.29
by Robert Collins
update to latest bzr api |
746 |
|
147.1.6
by Robert Collins
import symlinks (needs symlink enabled bzr) |
747 |
def bzr_inventory_data(tree): |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
748 |
inv_iter = tree.iter_inventory_ids(source=True, both=True) |
749 |
inv_map = {} |
|
106
by Aaron Bentley
Used limited url-encoding for file ids |
750 |
for arch_id, path in inv_iter: |
147.4.1
by Robert Collins
test escaping of file ids is working |
751 |
bzr_file_id = map_file_id(arch_id) |
106
by Aaron Bentley
Used limited url-encoding for file ids |
752 |
inv_map[path] = bzr_file_id |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
753 |
|
754 |
bzr_inv = [] |
|
755 |
for path, file_id in inv_map.iteritems(): |
|
756 |
full_path = os.path.join(tree, path) |
|
757 |
kind = bzrlib.osutils.file_kind(full_path) |
|
147.1.6
by Robert Collins
import symlinks (needs symlink enabled bzr) |
758 |
if kind not in ("file", "directory", "symlink"): |
83
by Aaron Bentley
Moved most baz2bzr code to baz_import, added Python plugin |
759 |
raise BadFileKind(tree, path, kind) |
760 |
parent_dir = os.path.dirname(path) |
|
761 |
if parent_dir != "": |
|
762 |
parent_id = inv_map[parent_dir] |
|
763 |
else: |
|
764 |
parent_id = bzrlib.inventory.ROOT_ID |
|
765 |
bzr_inv.append((path, file_id, parent_id, kind)) |
|
766 |
bzr_inv.sort() |
|
767 |
return bzr_inv |
|
768 |
||
769 |
||
430
by Aaron Bentley
Avoid loading PyBaz unless running baz-import |
770 |
def baz_import_branch(to_location, from_branch, fast, max_count, verbose, |
460
by Aaron Bentley
Add encoding parameter everywhere |
771 |
encoding, dry_run, reuse_history_list): |
430
by Aaron Bentley
Avoid loading PyBaz unless running baz-import |
772 |
to_location = os.path.realpath(str(to_location)) |
773 |
if from_branch is not None: |
|
774 |
try: |
|
775 |
from_branch = pybaz.Version(from_branch) |
|
776 |
except pybaz.errors.NamespaceError: |
|
777 |
print "%s is not a valid Arch branch." % from_branch |
|
778 |
return 1 |
|
779 |
if reuse_history_list is None: |
|
780 |
reuse_history_list = [] |
|
460
by Aaron Bentley
Add encoding parameter everywhere |
781 |
import_version(to_location, from_branch, encoding, max_count=max_count, |
430
by Aaron Bentley
Avoid loading PyBaz unless running baz-import |
782 |
reuse_history_from=reuse_history_list) |
147.1.44
by Aaron Bentley
Merged the bzrtools mainline |
783 |
|
784 |
||
785 |
class NotInABranch(Exception): |
|
786 |
def __init__(self, path): |
|
787 |
Exception.__init__(self, "%s is not in a branch." % path) |
|
788 |
self.path = path |
|
147.1.11
by Robert Collins
move baz-import to baz-import-branch |
789 |
|
147.1.29
by Robert Collins
update to latest bzr api |
790 |
|
430
by Aaron Bentley
Avoid loading PyBaz unless running baz-import |
791 |
|
460
by Aaron Bentley
Add encoding parameter everywhere |
792 |
def baz_import(to_root_dir, from_archive, encoding, verbose=False, |
793 |
reuse_history_list=[], prefixes=None): |
|
430
by Aaron Bentley
Avoid loading PyBaz unless running baz-import |
794 |
if reuse_history_list is None: |
795 |
reuse_history_list = [] |
|
796 |
to_root = str(os.path.realpath(to_root_dir)) |
|
797 |
if not os.path.exists(to_root): |
|
798 |
os.mkdir(to_root) |
|
799 |
if prefixes is not None: |
|
800 |
prefixes = prefixes.split(':') |
|
460
by Aaron Bentley
Add encoding parameter everywhere |
801 |
import_archive(to_root, from_archive, verbose, encoding, |
430
by Aaron Bentley
Avoid loading PyBaz unless running baz-import |
802 |
reuse_history_list, prefixes=prefixes) |
147.4.8
by Robert Collins
Enable reuse of history on archive imports, just append the history locations to the command line |
803 |
|
804 |
||
364.1.1
by Aaron Bentley
Merge progress bar updates from robertc |
805 |
def import_archive(to_root, from_archive, verbose, |
460
by Aaron Bentley
Add encoding parameter everywhere |
806 |
encoding, reuse_history_from=[], standalone=False, |
147.1.66
by Aaron Bentley
Added prefixes param to specify branches to import |
807 |
prefixes=None): |
808 |
def selected(version): |
|
809 |
if prefixes is None: |
|
810 |
return True |
|
811 |
else: |
|
812 |
for prefix in prefixes: |
|
813 |
if version.nonarch.startswith(prefix): |
|
814 |
return True |
|
815 |
return False |
|
147.4.8
by Robert Collins
Enable reuse of history on archive imports, just append the history locations to the command line |
816 |
real_to = os.path.realpath(to_root) |
817 |
history_locations = [real_to] + reuse_history_from |
|
147.1.65
by Aaron Bentley
Support creating repositories instead of standalone branches. |
818 |
if standalone is False: |
819 |
try: |
|
820 |
bd = BzrDir.open(to_root) |
|
821 |
bd.find_repository() |
|
822 |
except NotBranchError: |
|
823 |
create_shared_repository(to_root) |
|
824 |
except NoRepositoryPresent: |
|
825 |
raise BzrCommandError("Can't create repository at existing branch.") |
|
326
by Aaron Bentley
Initial nested progressbar work. (Need console fix) |
826 |
versions = list(pybaz.Archive(str(from_archive)).iter_versions()) |
364.1.1
by Aaron Bentley
Merge progress bar updates from robertc |
827 |
progress_bar = bzrlib.ui.ui_factory.nested_progress_bar() |
326
by Aaron Bentley
Initial nested progressbar work. (Need console fix) |
828 |
try: |
829 |
for num, version in enumerate(versions): |
|
364.1.1
by Aaron Bentley
Merge progress bar updates from robertc |
830 |
progress_bar.update("Branch", num, len(versions)) |
326
by Aaron Bentley
Initial nested progressbar work. (Need console fix) |
831 |
if not selected(version): |
832 |
print "Skipping %s" % version |
|
833 |
continue
|
|
834 |
target = os.path.join(to_root, map_namespace(version)) |
|
835 |
if not os.path.exists(os.path.dirname(target)): |
|
836 |
os.makedirs(os.path.dirname(target)) |
|
837 |
try: |
|
460
by Aaron Bentley
Add encoding parameter everywhere |
838 |
import_version(target, version, encoding, |
326
by Aaron Bentley
Initial nested progressbar work. (Need console fix) |
839 |
reuse_history_from=reuse_history_from, |
840 |
standalone=standalone) |
|
841 |
except pybaz.errors.ExecProblem,e: |
|
842 |
if str(e).find('The requested revision cannot be built.') != -1: |
|
364.1.1
by Aaron Bentley
Merge progress bar updates from robertc |
843 |
progress_bar.note( |
844 |
"Skipping version %s as it cannot be built due" |
|
845 |
" to a missing parent archive." % version) |
|
326
by Aaron Bentley
Initial nested progressbar work. (Need console fix) |
846 |
else: |
847 |
raise
|
|
848 |
except UserError, e: |
|
849 |
if str(e).find('already exists, and the last revision ') != -1: |
|
364.1.1
by Aaron Bentley
Merge progress bar updates from robertc |
850 |
progress_bar.note( |
851 |
"Skipping version %s as it has had commits made" |
|
852 |
" since it was converted to bzr." % version) |
|
326
by Aaron Bentley
Initial nested progressbar work. (Need console fix) |
853 |
else: |
854 |
raise
|
|
855 |
finally: |
|
364.1.1
by Aaron Bentley
Merge progress bar updates from robertc |
856 |
progress_bar.finished() |
857 |
||
147.1.29
by Robert Collins
update to latest bzr api |
858 |
|
147.1.13
by Robert Collins
create the output directory |
859 |
def map_namespace(a_version): |
147.1.14
by Robert Collins
implement a namespace mapper |
860 |
a_version = pybaz.Version("%s" % a_version) |
861 |
parser = NameParser(a_version) |
|
862 |
version = parser.get_version() |
|
863 |
branch = parser.get_branch() |
|
864 |
category = parser.get_category() |
|
865 |
if branch is None or branch == '': |
|
866 |
branch = "+trunk" |
|
867 |
if version == '0': |
|
868 |
return "%s/%s" % (category, branch) |
|
869 |
return "%s/%s/%s" % (category, version, branch) |
|
147.4.1
by Robert Collins
test escaping of file ids is working |
870 |
|
364.1.1
by Aaron Bentley
Merge progress bar updates from robertc |
871 |
|
147.4.1
by Robert Collins
test escaping of file ids is working |
872 |
def map_file_id(file_id): |
873 |
"""Convert a baz file id to a bzr one."""
|
|
874 |
return file_id.replace('%', '%25').replace('/', '%2f') |