annotate hgsubversion/replay.py @ 1565:8a66277136ab

cleanup: use __getitem__ instead of .changectx on localrepo
author Augie Fackler <raf@durin42.com>
date Fri, 20 Apr 2018 15:47:08 -0400
parents ae572c9be4e6
children 7bb6562feb85
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
1555
cff81f35b31e cleanup: reference Abort from mercurial.error instead of mercurial.util
Augie Fackler <raf@durin42.com>
parents: 1549
diff changeset
4 from mercurial import error as hgerror
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
5 from mercurial import revlog
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
6 from mercurial import node
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
7 from mercurial import context
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:
1555
cff81f35b31e cleanup: reference Abort from mercurial.error instead of mercurial.util
Augie Fackler <raf@durin42.com>
parents: 1549
diff changeset
96 raise hgerror.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
1565
8a66277136ab cleanup: use __getitem__ instead of .changectx on localrepo
Augie Fackler <raf@durin42.com>
parents: 1558
diff changeset
147 parentctx = meta.repo[parents[0]]
447
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
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
214 files = []
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
215 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
216 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
217
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
218 # 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
219 # 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
220 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
221 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
222
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
223 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
224 meta.mapbranch(extra)
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
225
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
226 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
227 (ha, node.nullid),
1527
d03995e69785 meta: force user and message to be bytes
Augie Fackler <raf@durin42.com>
parents: 1526
diff changeset
228 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
229 [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
230 del_all_files,
1527
d03995e69785 meta: force user and message to be bytes
Augie Fackler <raf@durin42.com>
parents: 1526
diff changeset
231 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
232 date,
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
233 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
234 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
235 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
236 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
237 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
238
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
239 return closebranches