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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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")