Mercurial > hg
annotate hgext/fastexport.py @ 51409:2f39c7aeb549
phases: large rewrite on retract boundary
The new code is still pure Python, so we still have room to going significantly
faster. However its complexity of the complex part is `O(|[min_new_draft, tip]|)` instead of
`O(|[min_draft, tip]|` which should help tremendously one repository with old
draft (like mercurial-devel or mozilla-try).
This is especially useful as the most common "retract boundary" operation
happens when we commit/rewrite new drafts or when we push new draft to a
non-publishing server. In this case, the smallest new_revs is very close to the
tip and there is very few work to do.
A few smaller optimisation could be done for these cases and will be introduced in
later changesets.
We still have iterate over large sets of roots, but this is already a great
improvement for a very small amount of work. We gather information on the
affected changeset as we go as we can put it to use in the next changesets.
This extra data collection might slowdown the `register_new` case a bit, however
for register_new, it should not really matters. The set of new nodes is either
small, so the impact is negligible, or the set of new nodes is large, and the
amount of work to do to had them will dominate the overhead the collecting
information in `changed_revs`.
As this new code compute the changes on the fly, it unlock other interesting
improvement to be done in later changeset.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Wed, 21 Feb 2024 10:41:09 +0100 |
parents | a97f2b50219b |
children | f4733654f144 |
rev | line source |
---|---|
44280
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
1 # Copyright 2020 Joerg Sonnenberger <joerg@bec.de> |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
2 # |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
3 # This software may be used and distributed according to the terms of the |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
4 # GNU General Public License version 2 or any later version. |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
5 """export repositories as git fast-import stream""" |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
6 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
7 # The format specification for fast-import streams can be found at |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
8 # https://git-scm.com/docs/git-fast-import#_input_format |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
9 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
10 import re |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
11 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
12 from mercurial.i18n import _ |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
13 from mercurial.node import hex, nullrev |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
14 from mercurial.utils import stringutil |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
15 from mercurial import ( |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
16 error, |
48116
5ced12cfa41b
errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents:
44821
diff
changeset
|
17 logcmdutil, |
44280
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
18 registrar, |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
19 scmutil, |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
20 ) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
21 from .convert import convcmd |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
22 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
23 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
24 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
25 # be specifying the version(s) of Mercurial they are tested with, or |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
26 # leave the attribute unspecified. |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
27 testedwith = b"ships-with-hg-core" |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
28 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
29 cmdtable = {} |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
30 command = registrar.command(cmdtable) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
31 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
32 GIT_PERSON_PROHIBITED = re.compile(b'[<>\n"]') |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
33 GIT_EMAIL_PROHIBITED = re.compile(b"[<> \n]") |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
34 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
35 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
36 def convert_to_git_user(authormap, user, rev): |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
37 mapped_user = authormap.get(user, user) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
38 user_person = stringutil.person(mapped_user) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
39 user_email = stringutil.email(mapped_user) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
40 if GIT_EMAIL_PROHIBITED.match(user_email) or GIT_PERSON_PROHIBITED.match( |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
41 user_person |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
42 ): |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
43 raise error.Abort( |
44690
44aff45b556d
fastexport: make a diagnostics message more localizable
Joerg Sonnenberger <joerg@bec.de>
parents:
44280
diff
changeset
|
44 _(b"Unable to parse user into person and email for revision %s") |
44aff45b556d
fastexport: make a diagnostics message more localizable
Joerg Sonnenberger <joerg@bec.de>
parents:
44280
diff
changeset
|
45 % rev |
44280
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
46 ) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
47 if user_person: |
50994
a97f2b50219b
fastexport: simplify code
Joerg Sonnenberger <joerg@bec.de>
parents:
50875
diff
changeset
|
48 return b'"%s" <%s>' % (user_person, user_email) |
44280
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
49 else: |
50994
a97f2b50219b
fastexport: simplify code
Joerg Sonnenberger <joerg@bec.de>
parents:
50875
diff
changeset
|
50 return b"<%s>" % user_email |
44280
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
51 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
52 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
53 def convert_to_git_date(date): |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
54 timestamp, utcoff = date |
44821
edffab2cf0ea
fastexport: adjust output to be more canonical
Joerg Sonnenberger <joerg@bec.de>
parents:
44811
diff
changeset
|
55 tzsign = b"+" if utcoff <= 0 else b"-" |
44280
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
56 if utcoff % 60 != 0: |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
57 raise error.Abort( |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
58 _(b"UTC offset in %b is not an integer number of seconds") % (date,) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
59 ) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
60 utcoff = abs(utcoff) // 60 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
61 tzh = utcoff // 60 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
62 tzmin = utcoff % 60 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
63 return b"%d " % int(timestamp) + tzsign + b"%02d%02d" % (tzh, tzmin) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
64 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
65 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
66 def convert_to_git_ref(branch): |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
67 # XXX filter/map depending on git restrictions |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
68 return b"refs/heads/" + branch |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
69 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
70 |
50401
dd42156b6441
fastexport: rework newline logic
Felipe Contreras <felipe.contreras@gmail.com>
parents:
48875
diff
changeset
|
71 def write_data(buf, data, add_newline=False): |
44280
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
72 buf.append(b"data %d\n" % len(data)) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
73 buf.append(data) |
50401
dd42156b6441
fastexport: rework newline logic
Felipe Contreras <felipe.contreras@gmail.com>
parents:
48875
diff
changeset
|
74 if add_newline or data[-1:] != b"\n": |
44280
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
75 buf.append(b"\n") |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
76 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
77 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
78 def export_commit(ui, repo, rev, marks, authormap): |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
79 ctx = repo[rev] |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
80 revid = ctx.hex() |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
81 if revid in marks: |
44811
5d309906ed0e
fastexport: downgrade message about already exported changesets to debug
Joerg Sonnenberger <joerg@bec.de>
parents:
44690
diff
changeset
|
82 ui.debug(b"warning: revision %s already exported, skipped\n" % revid) |
44280
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
83 return |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
84 parents = [p for p in ctx.parents() if p.rev() != nullrev] |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
85 for p in parents: |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
86 if p.hex() not in marks: |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
87 ui.warn( |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
88 _(b"warning: parent %s of %s has not been exported, skipped\n") |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
89 % (p, revid) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
90 ) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
91 return |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
92 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
93 # For all files modified by the commit, check if they have already |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
94 # been exported and otherwise dump the blob with the new mark. |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
95 for fname in ctx.files(): |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
96 if fname not in ctx: |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
97 continue |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
98 filectx = ctx.filectx(fname) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
99 filerev = hex(filectx.filenode()) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
100 if filerev not in marks: |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
101 mark = len(marks) + 1 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
102 marks[filerev] = mark |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
103 data = filectx.data() |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
104 buf = [b"blob\n", b"mark :%d\n" % mark] |
50401
dd42156b6441
fastexport: rework newline logic
Felipe Contreras <felipe.contreras@gmail.com>
parents:
48875
diff
changeset
|
105 write_data(buf, data, True) |
44280
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
106 ui.write(*buf, keepprogressbar=True) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
107 del buf |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
108 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
109 # Assign a mark for the current revision for references by |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
110 # latter merge commits. |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
111 mark = len(marks) + 1 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
112 marks[revid] = mark |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
113 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
114 ref = convert_to_git_ref(ctx.branch()) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
115 buf = [ |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
116 b"commit %s\n" % ref, |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
117 b"mark :%d\n" % mark, |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
118 b"committer %s %s\n" |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
119 % ( |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
120 convert_to_git_user(authormap, ctx.user(), revid), |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
121 convert_to_git_date(ctx.date()), |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
122 ), |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
123 ] |
50401
dd42156b6441
fastexport: rework newline logic
Felipe Contreras <felipe.contreras@gmail.com>
parents:
48875
diff
changeset
|
124 write_data(buf, ctx.description()) |
44280
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
125 if parents: |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
126 buf.append(b"from :%d\n" % marks[parents[0].hex()]) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
127 if len(parents) == 2: |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
128 buf.append(b"merge :%d\n" % marks[parents[1].hex()]) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
129 p0ctx = repo[parents[0]] |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
130 files = ctx.manifest().diff(p0ctx.manifest()) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
131 else: |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
132 files = ctx.files() |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
133 filebuf = [] |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
134 for fname in files: |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
135 if fname not in ctx: |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
136 filebuf.append((fname, b"D %s\n" % fname)) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
137 else: |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
138 filectx = ctx.filectx(fname) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
139 filerev = filectx.filenode() |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
140 fileperm = b"755" if filectx.isexec() else b"644" |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
141 changed = b"M %s :%d %s\n" % (fileperm, marks[hex(filerev)], fname) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
142 filebuf.append((fname, changed)) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
143 filebuf.sort() |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
144 buf.extend(changed for (fname, changed) in filebuf) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
145 del filebuf |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
146 buf.append(b"\n") |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
147 ui.write(*buf, keepprogressbar=True) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
148 del buf |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
149 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
150 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
151 isrev = re.compile(b"^[0-9a-f]{40}$") |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
152 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
153 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
154 @command( |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
155 b"fastexport", |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
156 [ |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
157 (b"r", b"rev", [], _(b"revisions to export"), _(b"REV")), |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
158 (b"i", b"import-marks", b"", _(b"old marks file to read"), _(b"FILE")), |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
159 (b"e", b"export-marks", b"", _(b"new marks file to write"), _(b"FILE")), |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
160 ( |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
161 b"A", |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
162 b"authormap", |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
163 b"", |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
164 _(b"remap usernames using this file"), |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
165 _(b"FILE"), |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
166 ), |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
167 ], |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
168 _(b"[OPTION]... [REV]..."), |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
169 helpcategory=command.CATEGORY_IMPORT_EXPORT, |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
170 ) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
171 def fastexport(ui, repo, *revs, **opts): |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
172 """export repository as git fast-import stream |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
173 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
174 This command lets you dump a repository as a human-readable text stream. |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
175 It can be piped into corresponding import routines like "git fast-import". |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
176 Incremental dumps can be created by using marks files. |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
177 """ |
50875
00081fa564ed
fastexport: migrate `opts` to native kwargs
Matt Harbison <matt_harbison@yahoo.com>
parents:
50401
diff
changeset
|
178 revs += tuple(opts.get("rev", [])) |
44280
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
179 if not revs: |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
180 revs = scmutil.revrange(repo, [b":"]) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
181 else: |
48116
5ced12cfa41b
errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents:
44821
diff
changeset
|
182 revs = logcmdutil.revrange(repo, revs) |
44280
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
183 if not revs: |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
184 raise error.Abort(_(b"no revisions matched")) |
50875
00081fa564ed
fastexport: migrate `opts` to native kwargs
Matt Harbison <matt_harbison@yahoo.com>
parents:
50401
diff
changeset
|
185 authorfile = opts.get("authormap") |
44280
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
186 if authorfile: |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
187 authormap = convcmd.readauthormap(ui, authorfile) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
188 else: |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
189 authormap = {} |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
190 |
50875
00081fa564ed
fastexport: migrate `opts` to native kwargs
Matt Harbison <matt_harbison@yahoo.com>
parents:
50401
diff
changeset
|
191 import_marks = opts.get("import_marks") |
44280
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
192 marks = {} |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
193 if import_marks: |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
194 with open(import_marks, "rb") as import_marks_file: |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
195 for line in import_marks_file: |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
196 line = line.strip() |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
197 if not isrev.match(line) or line in marks: |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
198 raise error.Abort(_(b"Corrupted marks file")) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
199 marks[line] = len(marks) + 1 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
200 |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
201 revs.sort() |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
202 with ui.makeprogress( |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
203 _(b"exporting"), unit=_(b"revisions"), total=len(revs) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
204 ) as progress: |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
205 for rev in revs: |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
206 export_commit(ui, repo, rev, marks, authormap) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
207 progress.increment() |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
208 |
50875
00081fa564ed
fastexport: migrate `opts` to native kwargs
Matt Harbison <matt_harbison@yahoo.com>
parents:
50401
diff
changeset
|
209 export_marks = opts.get("export_marks") |
44280
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
210 if export_marks: |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
211 with open(export_marks, "wb") as export_marks_file: |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
212 output_marks = [None] * len(marks) |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
213 for k, v in marks.items(): |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
214 output_marks[v - 1] = k |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
215 for k in output_marks: |
93a05cb223da
hgext: initial version of fastexport extension
Joerg Sonnenberger <joerg@bec.de>
parents:
diff
changeset
|
216 export_marks_file.write(k + b"\n") |