Mercurial > hgsubversion
annotate hgsubversion/replay.py @ 1395:53184be1b1fd
maps: add _findkey method
This private method will help us find a key that matches a regex. Priority is
given to old-style strings.
author | Sean Farley <sean.michael.farley@gmail.com> |
---|---|
date | Mon, 24 Mar 2014 11:21:00 -0500 |
parents | 57d65269d30c |
children | 0a6b3da6d34c |
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 |
1186
f9650d24464a
svnmeta: move revmap.oldest to meta.firstpulled
Sean Farley <sean.michael.farley@gmail.com>
parents:
1103
diff
changeset
|
68 if firstrun and meta.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: |
1186
f9650d24464a
svnmeta: move revmap.oldest to meta.firstpulled
Sean Farley <sean.michael.farley@gmail.com>
parents:
1103
diff
changeset
|
74 svn.get_replay(r.revnum, editor, meta.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]: |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
106 branchedits = meta.revmap.branchedits(branch, rev) |
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, |
02f886e59ae6
replay: call makememfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents:
1103
diff
changeset
|
177 path=path, |
02f886e59ae6
replay: call makememfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents:
1103
diff
changeset
|
178 data=data, |
02f886e59ae6
replay: call makememfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents:
1103
diff
changeset
|
179 islink=islink, |
02f886e59ae6
replay: call makememfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents:
1103
diff
changeset
|
180 isexec=isexec, |
02f886e59ae6
replay: call makememfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents:
1103
diff
changeset
|
181 copied=copied) |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
182 |
574
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
557
diff
changeset
|
183 meta.mapbranch(extra) |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
184 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
|
185 parents, |
1285
f2d1c59738f9
replay: call meta.getmessage instead of util
Sean Farley <sean.michael.farley@gmail.com>
parents:
1242
diff
changeset
|
186 meta.getmessage(rev), |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
187 files.keys(), |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
188 filectxfn, |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
189 meta.authors[rev.author], |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
190 date, |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
191 extra) |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
192 |
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
|
193 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
|
194 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
|
195 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
|
196 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
|
197 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
|
198 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
|
199 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
|
200 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
201 # 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
|
202 for branch in current.emptybranches: |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
203 |
1356
57d65269d30c
maps: allow an empty map to not convert specific branches
Sean Farley <sean@farley.io>
parents:
1285
diff
changeset
|
204 if meta.skipbranch(branch): |
57d65269d30c
maps: allow an empty map to not convert specific branches
Sean Farley <sean@farley.io>
parents:
1285
diff
changeset
|
205 continue |
57d65269d30c
maps: allow an empty map to not convert specific branches
Sean Farley <sean@farley.io>
parents:
1285
diff
changeset
|
206 |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
207 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
|
208 if ha == node.nullid: |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
209 continue |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
210 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
211 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
|
212 files = [] |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
213 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
|
214 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
|
215 |
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
|
216 # 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
|
217 # 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
|
218 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
|
219 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
|
220 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
221 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
|
222 meta.mapbranch(extra) |
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 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
|
225 (ha, node.nullid), |
1285
f2d1c59738f9
replay: call meta.getmessage instead of util
Sean Farley <sean.michael.farley@gmail.com>
parents:
1242
diff
changeset
|
226 meta.getmessage(rev), |
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
|
227 files, |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
228 del_all_files, |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
229 meta.authors[rev.author], |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
230 date, |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
231 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
|
232 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
|
233 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
|
234 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
|
235 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
|
236 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
237 return closebranches |