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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
531
cf4fe45bf8fd Change all instantiations of IOError to set both errno and strerror.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 528
diff changeset
1 import errno
435
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
2 import traceback
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
3
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
4 from mercurial import revlog
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
5 from mercurial import node
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
6 from mercurial import context
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
7 from mercurial import util as hgutil
7c576ae19d80 replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
8
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