annotate hgsubversion/replay.py @ 1549:8410a978c650

compathacks: be compatible with upstream 8a0cac20a1ad memfilectx change See hg change 8a0cac20a1ad. Since the interface has changed more than one time, switch to explicit keywords arguments to avoid surprises. Since hgsubversion targets hg >= 3.2.4, drop support for hg 3.0 and 3.1 here.
author Jun Wu <quark@fb.com>
date Tue, 19 Dec 2017 14:29:55 -0800
parents d03995e69785
children cff81f35b31e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
531
cf4fe45bf8fd Change all instantiations of IOError to set both errno and strerror.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 528
diff changeset
1 import errno
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
2 import traceback
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
3
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
4 from mercurial import revlog
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
5 from mercurial import node
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
6 from mercurial import context
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
7 from mercurial import util as hgutil
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
8
1103
6e1dbf6cbc92 compathacks: new module to collect hacks to work around hg internals changing
Augie Fackler <raf@durin42.com>
parents: 1099
diff changeset
9 import compathacks
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
10 import svnexternals
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
11 import util
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
12
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
13
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
14 class MissingPlainTextError(Exception):
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
15 """Exception raised when the repo lacks a source file required for replaying
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
16 a txdelta.
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
17 """
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
18
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
19 class ReplayException(Exception):
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
20 """Exception raised when you try and commit but the replay encountered an
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
21 exception.
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
22 """
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
23
756
379c7837222f replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents: 741
diff changeset
24 def updateexternals(ui, meta, current):
379c7837222f replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents: 741
diff changeset
25 # TODO fix and re-enable externals for single-directory clones
379c7837222f replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents: 741
diff changeset
26 if not current.externals or meta.layout == 'single':
379c7837222f replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents: 741
diff changeset
27 return
379c7837222f replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents: 741
diff changeset
28
379c7837222f replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents: 741
diff changeset
29 # accumulate externals records for all branches
379c7837222f replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents: 741
diff changeset
30 revnum = current.rev.revnum
379c7837222f replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents: 741
diff changeset
31 branches = {}
379c7837222f replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents: 741
diff changeset
32 for path, entry in current.externals.iteritems():
379c7837222f replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents: 741
diff changeset
33 if not meta.is_path_valid(path):
379c7837222f replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents: 741
diff changeset
34 continue
379c7837222f replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents: 741
diff changeset
35
379c7837222f replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents: 741
diff changeset
36 p, b, bp = meta.split_branch_path(path)
379c7837222f replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents: 741
diff changeset
37 if bp not in branches:
379c7837222f replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents: 741
diff changeset
38 parent = meta.get_parent_revision(revnum, b)
379c7837222f replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents: 741
diff changeset
39 pctx = meta.repo[parent]
762
c31a1f92e1c6 svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents: 758
diff changeset
40 branches[bp] = (svnexternals.parse(ui, pctx), pctx)
758
76ebfc41f490 svnexternals: hide .hgsvnexternals parsing in parse()
Patrick Mezard <pmezard@gmail.com>
parents: 757
diff changeset
41 branches[bp][0][p] = entry
756
379c7837222f replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents: 741
diff changeset
42
379c7837222f replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents: 741
diff changeset
43 # register externals file changes
757
6e18d9ab6557 pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents: 756
diff changeset
44 for bp, (external, pctx) in branches.iteritems():
756
379c7837222f replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents: 741
diff changeset
45 if bp and bp[-1] != '/':
379c7837222f replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents: 741
diff changeset
46 bp += '/'
757
6e18d9ab6557 pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents: 756
diff changeset
47 updates = svnexternals.getchanges(ui, meta.repo, pctx, external)
6e18d9ab6557 pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents: 756
diff changeset
48 for fn, data in updates.iteritems():
6e18d9ab6557 pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents: 756
diff changeset
49 path = (bp and bp + fn) or fn
6e18d9ab6557 pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents: 756
diff changeset
50 if data is not None:
6e18d9ab6557 pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents: 756
diff changeset
51 current.set(path, data, False, False)
6e18d9ab6557 pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents: 756
diff changeset
52 else:
6e18d9ab6557 pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents: 756
diff changeset
53 current.delete(path)
756
379c7837222f replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents: 741
diff changeset
54
787
4bbc6bf947f5 replay: fetch full revision at most once per run (issue252)
Patrick Mezard <pmezard@gmail.com>
parents: 786
diff changeset
55 def convert_rev(ui, meta, svn, r, tbdelta, firstrun):
943
c49c3c418f9d editor: move RevisionData on the filesystem over a given threshold
Patrick Mezard <patrick@mezard.eu>
parents: 938
diff changeset
56 try:
c49c3c418f9d editor: move RevisionData on the filesystem over a given threshold
Patrick Mezard <patrick@mezard.eu>
parents: 938
diff changeset
57 return _convert_rev(ui, meta, svn, r, tbdelta, firstrun)
c49c3c418f9d editor: move RevisionData on the filesystem over a given threshold
Patrick Mezard <patrick@mezard.eu>
parents: 938
diff changeset
58 finally:
c49c3c418f9d editor: move RevisionData on the filesystem over a given threshold
Patrick Mezard <patrick@mezard.eu>
parents: 938
diff changeset
59 meta.editor.current.close()
c49c3c418f9d editor: move RevisionData on the filesystem over a given threshold
Patrick Mezard <patrick@mezard.eu>
parents: 938
diff changeset
60
c49c3c418f9d editor: move RevisionData on the filesystem over a given threshold
Patrick Mezard <patrick@mezard.eu>
parents: 938
diff changeset
61 def _convert_rev(ui, meta, svn, r, tbdelta, firstrun):
437
45ce07a4807f replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 436
diff changeset
62
45ce07a4807f replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 436
diff changeset
63 editor = meta.editor
45ce07a4807f replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 436
diff changeset
64 editor.current.clear()
45ce07a4807f replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 436
diff changeset
65 editor.current.rev = r
962
8648ccfb8325 editor: process missing files with regular files
Patrick Mezard <patrick@mezard.eu>
parents: 960
diff changeset
66 editor.setsvn(svn)
650
685f91015ed6 replay: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 635
diff changeset
67
1434
0a6b3da6d34c RevMap: move lastpulled from SVNMeta down into RevMap
Augie Fackler <raf@durin42.com>
parents: 1356
diff changeset
68 if firstrun and meta.revmap.firstpulled <= 0:
787
4bbc6bf947f5 replay: fetch full revision at most once per run (issue252)
Patrick Mezard <pmezard@gmail.com>
parents: 786
diff changeset
69 # We know nothing about this project, so fetch everything before
4bbc6bf947f5 replay: fetch full revision at most once per run (issue252)
Patrick Mezard <pmezard@gmail.com>
parents: 786
diff changeset
70 # trying to apply deltas.
786
607f43a0f09c replay: make --debug trace full fetches
Patrick Mezard <pmezard@gmail.com>
parents: 769
diff changeset
71 ui.debug('replay: fetching full revision\n')
650
685f91015ed6 replay: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 635
diff changeset
72 svn.get_revision(r.revnum, editor)
685f91015ed6 replay: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 635
diff changeset
73 else:
1434
0a6b3da6d34c RevMap: move lastpulled from SVNMeta down into RevMap
Augie Fackler <raf@durin42.com>
parents: 1356
diff changeset
74 svn.get_replay(r.revnum, editor, meta.revmap.firstpulled)
938
f9014e28721b editor: start separating svn copies from open files
Patrick Mezard <patrick@mezard.eu>
parents: 910
diff changeset
75 editor.close()
650
685f91015ed6 replay: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 635
diff changeset
76
437
45ce07a4807f replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 436
diff changeset
77 current = editor.current
45ce07a4807f replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 436
diff changeset
78
756
379c7837222f replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents: 741
diff changeset
79 updateexternals(ui, meta, current)
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
80
837
805ef27fbcbe hgsubversion/*.py: add space after comment symbol #
Yonggang Luo <luoyonggang@gmail.com>
parents: 831
diff changeset
81 if current.exception is not None: # pragma: no cover
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
82 traceback.print_exception(*current.exception)
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
83 raise ReplayException()
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
84
943
c49c3c418f9d editor: move RevisionData on the filesystem over a given threshold
Patrick Mezard <patrick@mezard.eu>
parents: 938
diff changeset
85 files_to_commit = current.files()
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
86 branch_batches = {}
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
87 rev = current.rev
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
88 date = meta.fixdate(rev.date)
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
89
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
90 # build up the branches that have files on them
960
502613f6b583 editor: ignore added or copied files excluded by a filemap
Patrick Mezard <patrick@mezard.eu>
parents: 955
diff changeset
91 failoninvalid = ui.configbool('hgsubversion',
502613f6b583 editor: ignore added or copied files excluded by a filemap
Patrick Mezard <patrick@mezard.eu>
parents: 955
diff changeset
92 'failoninvalidreplayfile', False)
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
93 for f in files_to_commit:
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
94 if not meta.is_path_valid(f):
960
502613f6b583 editor: ignore added or copied files excluded by a filemap
Patrick Mezard <patrick@mezard.eu>
parents: 955
diff changeset
95 if failoninvalid:
502613f6b583 editor: ignore added or copied files excluded by a filemap
Patrick Mezard <patrick@mezard.eu>
parents: 955
diff changeset
96 raise hgutil.Abort('file %s should not be in commit list' % f)
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
97 continue
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
98 p, b = meta.split_branch_path(f)[:2]
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
99 if b not in branch_batches:
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
100 branch_batches[b] = []
1099
c6f7a8cfeca9 pull: correctly handle replacing the root of a branch with a non-copied directory
David Schleimer <dschleimer@fb.com>
parents: 1045
diff changeset
101 if p:
c6f7a8cfeca9 pull: correctly handle replacing the root of a branch with a non-copied directory
David Schleimer <dschleimer@fb.com>
parents: 1045
diff changeset
102 branch_batches[b].append((p, f))
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
103
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
104 closebranches = {}
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
105 for branch in tbdelta['branches'][1]:
1472
cf79525f507c maps: change branchedits to accept revnum directly
Jun Wu <quark@fb.com>
parents: 1434
diff changeset
106 branchedits = meta.revmap.branchedits(branch, rev.revnum)
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
107 if len(branchedits) < 1:
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
108 # can't close a branch that never existed
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
109 continue
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
110 ha = branchedits[0][1]
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
111 closebranches[branch] = ha
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
112
551
d17cec76e769 replay: correctly handle renaming the parent dir of a branch
Augie Fackler <durin42@gmail.com>
parents: 547
diff changeset
113 extraempty = (set(tbdelta['branches'][0]) -
d17cec76e769 replay: correctly handle renaming the parent dir of a branch
Augie Fackler <durin42@gmail.com>
parents: 547
diff changeset
114 (set(current.emptybranches) | set(branch_batches.keys())))
d17cec76e769 replay: correctly handle renaming the parent dir of a branch
Augie Fackler <durin42@gmail.com>
parents: 547
diff changeset
115 current.emptybranches.update([(x, False) for x in extraempty])
d17cec76e769 replay: correctly handle renaming the parent dir of a branch
Augie Fackler <durin42@gmail.com>
parents: 547
diff changeset
116
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
117 # 1. handle normal commits
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
118 closedrevs = closebranches.values()
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
119 for branch, files in branch_batches.iteritems():
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
120
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
121 if branch in current.emptybranches and files:
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
122 del current.emptybranches[branch]
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
123
1356
57d65269d30c maps: allow an empty map to not convert specific branches
Sean Farley <sean@farley.io>
parents: 1285
diff changeset
124 if meta.skipbranch(branch):
57d65269d30c maps: allow an empty map to not convert specific branches
Sean Farley <sean@farley.io>
parents: 1285
diff changeset
125 # make sure we also get rid of it from emptybranches
57d65269d30c maps: allow an empty map to not convert specific branches
Sean Farley <sean@farley.io>
parents: 1285
diff changeset
126 if branch in current.emptybranches:
57d65269d30c maps: allow an empty map to not convert specific branches
Sean Farley <sean@farley.io>
parents: 1285
diff changeset
127 del current.emptybranches[branch]
57d65269d30c maps: allow an empty map to not convert specific branches
Sean Farley <sean@farley.io>
parents: 1285
diff changeset
128 continue
57d65269d30c maps: allow an empty map to not convert specific branches
Sean Farley <sean@farley.io>
parents: 1285
diff changeset
129
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
130 files = dict(files)
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
131 parents = meta.get_parent_revision(rev.revnum, branch), revlog.nullid
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
132 if parents[0] in closedrevs and branch in meta.closebranches:
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
133 continue
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
134
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
135 extra = meta.genextra(rev.revnum, branch)
517
ef288fb7f2fe svnmeta: is_path_tag() is really get_path_tag()
Patrick Mezard <pmezard@gmail.com>
parents: 499
diff changeset
136 tag = None
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
137 if branch is not None:
517
ef288fb7f2fe svnmeta: is_path_tag() is really get_path_tag()
Patrick Mezard <pmezard@gmail.com>
parents: 499
diff changeset
138 # New regular tag without modifications, it will be committed by
ef288fb7f2fe svnmeta: is_path_tag() is really get_path_tag()
Patrick Mezard <pmezard@gmail.com>
parents: 499
diff changeset
139 # svnmeta.committag(), we can skip the whole branch for now
ef288fb7f2fe svnmeta: is_path_tag() is really get_path_tag()
Patrick Mezard <pmezard@gmail.com>
parents: 499
diff changeset
140 tag = meta.get_path_tag(meta.remotename(branch))
547
9e6499c415a9 tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents: 531
diff changeset
141 if (tag and tag not in meta.tags
9e6499c415a9 tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents: 531
diff changeset
142 and branch not in meta.branches
1103
6e1dbf6cbc92 compathacks: new module to collect hacks to work around hg internals changing
Augie Fackler <raf@durin42.com>
parents: 1099
diff changeset
143 and branch not in compathacks.branchset(meta.repo)
547
9e6499c415a9 tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents: 531
diff changeset
144 and not files):
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
145 continue
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
146
447
0d3b5acb1d51 tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents: 444
diff changeset
147 parentctx = meta.repo.changectx(parents[0])
0d3b5acb1d51 tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents: 444
diff changeset
148 if tag:
0d3b5acb1d51 tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents: 444
diff changeset
149 if parentctx.node() == node.nullid:
0d3b5acb1d51 tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents: 444
diff changeset
150 continue
0d3b5acb1d51 tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents: 444
diff changeset
151 extra.update({'branch': parentctx.extra().get('branch', None),
0d3b5acb1d51 tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents: 444
diff changeset
152 'close': 1})
0d3b5acb1d51 tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents: 444
diff changeset
153
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
154 def filectxfn(repo, memctx, path):
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
155 current_file = files[path]
1242
df6cb54604eb replay: use compat hack for filectxfn for deleted files
Siddharth Agarwal <sid0@fb.com>
parents: 1228
diff changeset
156 try:
df6cb54604eb replay: use compat hack for filectxfn for deleted files
Siddharth Agarwal <sid0@fb.com>
parents: 1228
diff changeset
157 data, isexec, islink, copied = current.pop(current_file)
df6cb54604eb replay: use compat hack for filectxfn for deleted files
Siddharth Agarwal <sid0@fb.com>
parents: 1228
diff changeset
158 except IOError:
df6cb54604eb replay: use compat hack for filectxfn for deleted files
Siddharth Agarwal <sid0@fb.com>
parents: 1228
diff changeset
159 return compathacks.filectxfn_deleted_reraise(memctx)
943
c49c3c418f9d editor: move RevisionData on the filesystem over a given threshold
Patrick Mezard <patrick@mezard.eu>
parents: 938
diff changeset
160 if isexec is None or islink is None:
c49c3c418f9d editor: move RevisionData on the filesystem over a given threshold
Patrick Mezard <patrick@mezard.eu>
parents: 938
diff changeset
161 flags = parentctx.flags(path)
c49c3c418f9d editor: move RevisionData on the filesystem over a given threshold
Patrick Mezard <patrick@mezard.eu>
parents: 938
diff changeset
162 if isexec is None:
c49c3c418f9d editor: move RevisionData on the filesystem over a given threshold
Patrick Mezard <patrick@mezard.eu>
parents: 938
diff changeset
163 isexec = 'x' in flags
c49c3c418f9d editor: move RevisionData on the filesystem over a given threshold
Patrick Mezard <patrick@mezard.eu>
parents: 938
diff changeset
164 if islink is None:
c49c3c418f9d editor: move RevisionData on the filesystem over a given threshold
Patrick Mezard <patrick@mezard.eu>
parents: 938
diff changeset
165 islink = 'l' in flags
c49c3c418f9d editor: move RevisionData on the filesystem over a given threshold
Patrick Mezard <patrick@mezard.eu>
parents: 938
diff changeset
166
c49c3c418f9d editor: move RevisionData on the filesystem over a given threshold
Patrick Mezard <patrick@mezard.eu>
parents: 938
diff changeset
167 if data is not None:
c49c3c418f9d editor: move RevisionData on the filesystem over a given threshold
Patrick Mezard <patrick@mezard.eu>
parents: 938
diff changeset
168 if islink:
c49c3c418f9d editor: move RevisionData on the filesystem over a given threshold
Patrick Mezard <patrick@mezard.eu>
parents: 938
diff changeset
169 if data.startswith('link '):
c49c3c418f9d editor: move RevisionData on the filesystem over a given threshold
Patrick Mezard <patrick@mezard.eu>
parents: 938
diff changeset
170 data = data[len('link '):]
c49c3c418f9d editor: move RevisionData on the filesystem over a given threshold
Patrick Mezard <patrick@mezard.eu>
parents: 938
diff changeset
171 else:
c49c3c418f9d editor: move RevisionData on the filesystem over a given threshold
Patrick Mezard <patrick@mezard.eu>
parents: 938
diff changeset
172 ui.debug('file marked as link, but may contain data: '
c49c3c418f9d editor: move RevisionData on the filesystem over a given threshold
Patrick Mezard <patrick@mezard.eu>
parents: 938
diff changeset
173 '%s\n' % current_file)
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
174 else:
447
0d3b5acb1d51 tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents: 444
diff changeset
175 data = parentctx.filectx(path).data()
1220
02f886e59ae6 replay: call makememfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 1103
diff changeset
176 return compathacks.makememfilectx(repo,
1549
8410a978c650 compathacks: be compatible with upstream 8a0cac20a1ad memfilectx change
Jun Wu <quark@fb.com>
parents: 1527
diff changeset
177 memctx=memctx,
1220
02f886e59ae6 replay: call makememfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 1103
diff changeset
178 path=path,
02f886e59ae6 replay: call makememfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 1103
diff changeset
179 data=data,
02f886e59ae6 replay: call makememfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 1103
diff changeset
180 islink=islink,
02f886e59ae6 replay: call makememfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 1103
diff changeset
181 isexec=isexec,
02f886e59ae6 replay: call makememfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 1103
diff changeset
182 copied=copied)
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
183
574
8e025a6f0db4 add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 557
diff changeset
184 meta.mapbranch(extra)
1511
cb29f4bffcc7 replay: fix tests
Stanislau Hlebik <stash@fb.com>
parents: 1472
diff changeset
185 if 'branch' not in extra:
cb29f4bffcc7 replay: fix tests
Stanislau Hlebik <stash@fb.com>
parents: 1472
diff changeset
186 extra['branch'] = 'default'
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
187 current_ctx = context.memctx(meta.repo,
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
188 parents,
1527
d03995e69785 meta: force user and message to be bytes
Augie Fackler <raf@durin42.com>
parents: 1526
diff changeset
189 util.forceutf8(meta.getmessage(rev)),
1526
5adfb81c4680 util: add method for forcing unicode objects back to utf8 bytes
Augie Fackler <raf@durin42.com>
parents: 1511
diff changeset
190 [util.forceutf8(f) for f in files.keys()],
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
191 filectxfn,
1527
d03995e69785 meta: force user and message to be bytes
Augie Fackler <raf@durin42.com>
parents: 1526
diff changeset
192 util.forceutf8(meta.authors[rev.author]),
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
193 date,
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
194 extra)
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
195
831
be5bbb2f2d68 svnrepo: kludge to work around hash changes between stupid and replay in hg 1.9
Augie Fackler <durin42@gmail.com>
parents: 787
diff changeset
196 new_hash = meta.repo.svn_commitctx(current_ctx)
437
45ce07a4807f replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 436
diff changeset
197 util.describe_commit(ui, new_hash, branch)
447
0d3b5acb1d51 tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents: 444
diff changeset
198 if (rev.revnum, branch) not in meta.revmap and not tag:
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
199 meta.revmap[rev.revnum, branch] = new_hash
447
0d3b5acb1d51 tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents: 444
diff changeset
200 if tag:
634
a400f3bf5611 replay/stupid: fix tagging on a branch renamed using a branch map
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 574
diff changeset
201 meta.movetag(tag, new_hash, rev, date)
547
9e6499c415a9 tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents: 531
diff changeset
202 meta.addedtags.pop(tag, None)
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
203
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
204 # 2. handle branches that need to be committed without any files
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
205 for branch in current.emptybranches:
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
206
1356
57d65269d30c maps: allow an empty map to not convert specific branches
Sean Farley <sean@farley.io>
parents: 1285
diff changeset
207 if meta.skipbranch(branch):
57d65269d30c maps: allow an empty map to not convert specific branches
Sean Farley <sean@farley.io>
parents: 1285
diff changeset
208 continue
57d65269d30c maps: allow an empty map to not convert specific branches
Sean Farley <sean@farley.io>
parents: 1285
diff changeset
209
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
210 ha = meta.get_parent_revision(rev.revnum, branch)
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
211 if ha == node.nullid:
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
212 continue
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
213
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
214 parent_ctx = meta.repo.changectx(ha)
1099
c6f7a8cfeca9 pull: correctly handle replacing the root of a branch with a non-copied directory
David Schleimer <dschleimer@fb.com>
parents: 1045
diff changeset
215 files = []
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
216 def del_all_files(*args):
557
d74bf020a61c replay/stupid: raise the correct errno in IOError to fix hg >= e553a425751d
Augie Fackler <durin42@gmail.com>
parents: 551
diff changeset
217 raise IOError(errno.ENOENT, 'deleting all files')
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
218
1099
c6f7a8cfeca9 pull: correctly handle replacing the root of a branch with a non-copied directory
David Schleimer <dschleimer@fb.com>
parents: 1045
diff changeset
219 # True here means nuke all files. This happens when you
c6f7a8cfeca9 pull: correctly handle replacing the root of a branch with a non-copied directory
David Schleimer <dschleimer@fb.com>
parents: 1045
diff changeset
220 # replace a branch root with an empty directory
c6f7a8cfeca9 pull: correctly handle replacing the root of a branch with a non-copied directory
David Schleimer <dschleimer@fb.com>
parents: 1045
diff changeset
221 if current.emptybranches[branch]:
c6f7a8cfeca9 pull: correctly handle replacing the root of a branch with a non-copied directory
David Schleimer <dschleimer@fb.com>
parents: 1045
diff changeset
222 files = meta.repo[ha].files()
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
223
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
224 extra = meta.genextra(rev.revnum, branch)
635
e2c3349b2cca branchmap: map empty commits in replay mode.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 634
diff changeset
225 meta.mapbranch(extra)
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
226
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
227 current_ctx = context.memctx(meta.repo,
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
228 (ha, node.nullid),
1527
d03995e69785 meta: force user and message to be bytes
Augie Fackler <raf@durin42.com>
parents: 1526
diff changeset
229 util.forceutf8(meta.getmessage(rev)),
1526
5adfb81c4680 util: add method for forcing unicode objects back to utf8 bytes
Augie Fackler <raf@durin42.com>
parents: 1511
diff changeset
230 [util.forceutf8(f) for f in files],
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
231 del_all_files,
1527
d03995e69785 meta: force user and message to be bytes
Augie Fackler <raf@durin42.com>
parents: 1526
diff changeset
232 util.forceutf8(meta.authors[rev.author]),
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
233 date,
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
234 extra)
831
be5bbb2f2d68 svnrepo: kludge to work around hash changes between stupid and replay in hg 1.9
Augie Fackler <durin42@gmail.com>
parents: 787
diff changeset
235 new_hash = meta.repo.svn_commitctx(current_ctx)
437
45ce07a4807f replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 436
diff changeset
236 util.describe_commit(ui, new_hash, branch)
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
237 if (rev.revnum, branch) not in meta.revmap:
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
238 meta.revmap[rev.revnum, branch] = new_hash
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
239
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
240 return closebranches