Mercurial > hgsubversion
annotate hgsubversion/replay.py @ 769:cc1d4aa3ba41
configurable substitution for empty commit message (fixes #195)
The value of the default commit message is now configurable by setting
'hgsubversion.defaultmessage'. In addition, the log output is made
consistent with the result of the conversion.
author | Dan Villiom Podlaski Christiansen <danchr@gmail.com> |
---|---|
date | Sun, 28 Nov 2010 03:47:04 +0100 |
parents | c31a1f92e1c6 |
children | 607f43a0f09c |
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 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
9 import svnexternals |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
10 import util |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
11 |
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 class MissingPlainTextError(Exception): |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
14 """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
|
15 a txdelta. |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
16 """ |
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 class ReplayException(Exception): |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
19 """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
|
20 exception. |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
21 """ |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
22 |
756
379c7837222f
replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents:
741
diff
changeset
|
23 def updateexternals(ui, meta, current): |
379c7837222f
replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents:
741
diff
changeset
|
24 # 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
|
25 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
|
26 return |
379c7837222f
replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents:
741
diff
changeset
|
27 |
379c7837222f
replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents:
741
diff
changeset
|
28 # accumulate externals records for all branches |
379c7837222f
replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents:
741
diff
changeset
|
29 revnum = current.rev.revnum |
379c7837222f
replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents:
741
diff
changeset
|
30 branches = {} |
379c7837222f
replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents:
741
diff
changeset
|
31 for path, entry in current.externals.iteritems(): |
379c7837222f
replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents:
741
diff
changeset
|
32 if not meta.is_path_valid(path): |
379c7837222f
replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents:
741
diff
changeset
|
33 ui.warn('WARNING: Invalid path %s in externals\n' % 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 |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
55 def convert_rev(ui, meta, svn, r, tbdelta): |
437
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
56 |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
57 editor = meta.editor |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
58 editor.current.clear() |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
59 editor.current.rev = r |
650
685f91015ed6
replay: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
635
diff
changeset
|
60 |
685f91015ed6
replay: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
635
diff
changeset
|
61 if meta.revmap.oldest <= 0: |
685f91015ed6
replay: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
635
diff
changeset
|
62 # no prior revisions are known, so fetch the entire revision contents |
685f91015ed6
replay: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
635
diff
changeset
|
63 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
|
64 else: |
685f91015ed6
replay: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
635
diff
changeset
|
65 svn.get_replay(r.revnum, editor, meta.revmap.oldest) |
685f91015ed6
replay: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
635
diff
changeset
|
66 |
437
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
67 current = editor.current |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
68 current.findmissing(svn) |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
69 |
756
379c7837222f
replay: extract externals updating from convert_rev()
Patrick Mezard <pmezard@gmail.com>
parents:
741
diff
changeset
|
70 updateexternals(ui, meta, current) |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
71 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
72 if current.exception is not None: #pragma: no cover |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
73 traceback.print_exception(*current.exception) |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
74 raise ReplayException() |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
75 if current.missing: |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
76 raise MissingPlainTextError() |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
77 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
78 # paranoidly generate the list of files to commit |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
79 files_to_commit = set(current.files.keys()) |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
80 files_to_commit.update(current.symlinks.keys()) |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
81 files_to_commit.update(current.execfiles.keys()) |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
82 files_to_commit.update(current.deleted.keys()) |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
83 # back to a list and sort so we get sane behavior |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
84 files_to_commit = list(files_to_commit) |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
85 files_to_commit.sort() |
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 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
91 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
|
92 if not meta.is_path_valid(f): |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
93 continue |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
94 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
|
95 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
|
96 branch_batches[b] = [] |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
97 branch_batches[b].append((p, f)) |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
98 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
99 closebranches = {} |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
100 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
|
101 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
|
102 if len(branchedits) < 1: |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
103 # 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
|
104 continue |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
105 ha = branchedits[0][1] |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
106 closebranches[branch] = ha |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
107 |
551
d17cec76e769
replay: correctly handle renaming the parent dir of a branch
Augie Fackler <durin42@gmail.com>
parents:
547
diff
changeset
|
108 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
|
109 (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
|
110 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
|
111 |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
112 # 1. handle normal commits |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
113 closedrevs = closebranches.values() |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
114 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
|
115 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
116 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
|
117 del current.emptybranches[branch] |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
118 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
119 files = dict(files) |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
120 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
|
121 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
|
122 continue |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
123 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
124 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
|
125 tag = None |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
126 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
|
127 # 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
|
128 # 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
|
129 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
|
130 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
|
131 and branch not in meta.branches |
9e6499c415a9
tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents:
531
diff
changeset
|
132 and branch not in meta.repo.branchtags() |
9e6499c415a9
tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents:
531
diff
changeset
|
133 and not files): |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
134 continue |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
135 |
447
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
136 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
|
137 if tag: |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
138 if parentctx.node() == node.nullid: |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
139 continue |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
140 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
|
141 'close': 1}) |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
142 |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
143 def filectxfn(repo, memctx, path): |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
144 current_file = files[path] |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
145 if current_file in current.deleted: |
557
d74bf020a61c
replay/stupid: raise the correct errno in IOError to fix hg >= e553a425751d
Augie Fackler <durin42@gmail.com>
parents:
551
diff
changeset
|
146 raise IOError(errno.ENOENT, '%s is deleted' % path) |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
147 copied = current.copies.get(current_file) |
447
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
148 flags = parentctx.flags(path) |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
149 is_exec = current.execfiles.get(current_file, 'x' in flags) |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
150 is_link = current.symlinks.get(current_file, 'l' in flags) |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
151 if current_file in current.files: |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
152 data = current.files[current_file] |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
153 if is_link and data.startswith('link '): |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
154 data = data[len('link '):] |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
155 elif is_link: |
741
b3128fec5d54
editor: handle property changes to links.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
650
diff
changeset
|
156 ui.debug('file marked as link, but may contain data: ' |
b3128fec5d54
editor: handle property changes to links.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
650
diff
changeset
|
157 '%s (%r)\n' % (current_file, flags)) |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
158 else: |
447
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
159 data = parentctx.filectx(path).data() |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
160 return context.memfilectx(path=path, |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
161 data=data, |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
162 islink=is_link, isexec=is_exec, |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
163 copied=copied) |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
164 |
574
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
557
diff
changeset
|
165 meta.mapbranch(extra) |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
166 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
|
167 parents, |
769
cc1d4aa3ba41
configurable substitution for empty commit message (fixes #195)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
762
diff
changeset
|
168 rev.message or util.default_commit_msg(ui), |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
169 files.keys(), |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
170 filectxfn, |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
171 meta.authors[rev.author], |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
172 date, |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
173 extra) |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
174 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
175 new_hash = meta.repo.commitctx(current_ctx) |
437
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
176 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
|
177 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
|
178 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
|
179 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
|
180 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
|
181 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
|
182 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
183 # 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
|
184 for branch in current.emptybranches: |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
185 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
186 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
|
187 if ha == node.nullid: |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
188 continue |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
189 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
190 parent_ctx = meta.repo.changectx(ha) |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
191 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
|
192 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
|
193 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
194 # True here meant nuke all files, shouldn't happen with branch closing |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
195 if current.emptybranches[branch]: #pragma: no cover |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
196 raise hgutil.Abort('Empty commit to an open branch attempted. ' |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
197 'Please report this issue.') |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
198 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
199 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
|
200 meta.mapbranch(extra) |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
201 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
202 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
|
203 (ha, node.nullid), |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
204 rev.message or ' ', |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
205 [], |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
206 del_all_files, |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
207 meta.authors[rev.author], |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
208 date, |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
209 extra) |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
210 new_hash = meta.repo.commitctx(current_ctx) |
437
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
211 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
|
212 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
|
213 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
|
214 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
215 return closebranches |