Mercurial > hgsubversion
annotate hgsubversion/replay.py @ 547:9e6499c415a9
tags: fix files edited during tag creation
This was broken because file edits were skipped if they were in tags, but
committags in svnmeta didn't check to see if any files were changed during
initial tag creation.
author | Augie Fackler <durin42@gmail.com> |
---|---|
date | Sat, 06 Feb 2010 10:36:21 -0600 |
parents | cf4fe45bf8fd |
children | d17cec76e769 |
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 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
23 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
|
24 |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
25 editor = meta.editor |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
26 editor.current.clear() |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
27 editor.current.rev = r |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
28 svn.get_replay(r.revnum, editor) |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
29 current = editor.current |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
30 current.findmissing(svn) |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
31 |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
32 # update externals |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
498
diff
changeset
|
33 # TODO fix and re-enable externals for single-directory clones |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
498
diff
changeset
|
34 if current.externals and not meta.layout == 'single': |
437
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
35 |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
36 # accumulate externals records for all branches |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
37 revnum = current.rev.revnum |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
38 branches = {} |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
39 for path, entry in current.externals.iteritems(): |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
40 if not meta.is_path_valid(path): |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
41 ui.warn('WARNING: Invalid path %s in externals\n' % path) |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
42 continue |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
43 |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
44 p, b, bp = meta.split_branch_path(path) |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
45 if bp not in branches: |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
46 external = svnexternals.externalsfile() |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
47 parent = meta.get_parent_revision(revnum, b) |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
48 pctx = meta.repo[parent] |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
49 if '.hgsvnexternals' in pctx: |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
50 external.read(pctx['.hgsvnexternals'].data()) |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
51 branches[bp] = external |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
52 else: |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
53 external = branches[bp] |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
54 |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
55 external[p] = entry |
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 # register externals file changes |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
58 for bp, external in branches.iteritems(): |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
498
diff
changeset
|
59 if bp and bp[-1] != '/': |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
498
diff
changeset
|
60 bp += '/' |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
498
diff
changeset
|
61 path = (bp and bp + '.hgsvnexternals') or '.hgsvnexternals' |
437
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
62 if external: |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
63 current.set(path, external.write(), False, False) |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
64 else: |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
65 current.delete(path) |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
66 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
67 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
|
68 traceback.print_exception(*current.exception) |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
69 raise ReplayException() |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
70 if current.missing: |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
71 raise MissingPlainTextError() |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
72 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
73 # 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
|
74 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
|
75 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
|
76 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
|
77 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
|
78 # 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
|
79 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
|
80 files_to_commit.sort() |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
81 branch_batches = {} |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
82 rev = current.rev |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
83 date = meta.fixdate(rev.date) |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
84 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
85 # 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
|
86 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
|
87 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
|
88 continue |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
89 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
|
90 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
|
91 branch_batches[b] = [] |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
92 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
|
93 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
94 closebranches = {} |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
95 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
|
96 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
|
97 if len(branchedits) < 1: |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
98 # 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
|
99 continue |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
100 ha = branchedits[0][1] |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
101 closebranches[branch] = ha |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
102 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
103 # 1. handle normal commits |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
104 closedrevs = closebranches.values() |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
105 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
|
106 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
107 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
|
108 del current.emptybranches[branch] |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
109 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
110 files = dict(files) |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
111 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
|
112 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
|
113 continue |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
114 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
115 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
|
116 tag = None |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
117 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
|
118 # 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
|
119 # 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
|
120 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
|
121 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
|
122 and branch not in meta.branches |
9e6499c415a9
tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents:
531
diff
changeset
|
123 and branch not in meta.repo.branchtags() |
9e6499c415a9
tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents:
531
diff
changeset
|
124 and not files): |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
125 continue |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
126 |
447
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
127 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
|
128 if tag: |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
129 if parentctx.node() == node.nullid: |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
130 continue |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
131 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
|
132 'close': 1}) |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
133 |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
134 if '.hgsvnexternals' not in parentctx and '.hgsvnexternals' in files: |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
135 # Do not register empty externals files |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
136 if (files['.hgsvnexternals'] in current.files |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
137 and not current.files[files['.hgsvnexternals']]): |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
138 del files['.hgsvnexternals'] |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
139 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
140 def filectxfn(repo, memctx, path): |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
141 current_file = files[path] |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
142 if current_file in current.deleted: |
531
cf4fe45bf8fd
Change all instantiations of IOError to set both errno and strerror.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
528
diff
changeset
|
143 raise IOError(errno.EBADF, |
cf4fe45bf8fd
Change all instantiations of IOError to set both errno and strerror.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
528
diff
changeset
|
144 'Operation on deleted file attempted') |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
145 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
|
146 flags = parentctx.flags(path) |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
147 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
|
148 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
|
149 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
|
150 data = current.files[current_file] |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
151 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
|
152 data = data[len('link '):] |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
153 elif is_link: |
437
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
154 ui.warn('file marked as link, but contains data: ' |
45ce07a4807f
replay: merge functions into a single function
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
436
diff
changeset
|
155 '%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
|
156 else: |
447
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
157 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
|
158 return context.memfilectx(path=path, |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
159 data=data, |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
160 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
|
161 copied=copied) |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
162 |
447
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
163 if not meta.usebranchnames or extra.get('branch', None) == 'default': |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
164 extra.pop('branch', None) |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
165 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
|
166 parents, |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
167 rev.message or '...', |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
168 files.keys(), |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
169 filectxfn, |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
170 meta.authors[rev.author], |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
171 date, |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
172 extra) |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
173 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
174 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
|
175 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
|
176 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
|
177 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
|
178 if tag: |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
179 meta.movetag(tag, new_hash, parentctx.extra().get('branch', None), rev, date) |
547
9e6499c415a9
tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents:
531
diff
changeset
|
180 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
|
181 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
182 # 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
|
183 for branch in current.emptybranches: |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
184 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
185 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
|
186 if ha == node.nullid: |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
187 continue |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
188 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
189 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
|
190 def del_all_files(*args): |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
191 raise IOError |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
192 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
193 # 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
|
194 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
|
195 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
|
196 'Please report this issue.') |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
197 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
198 extra = meta.genextra(rev.revnum, branch) |
447
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
199 |
435
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
200 if not meta.usebranchnames: |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
201 extra.pop('branch', None) |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
202 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
203 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
|
204 (ha, node.nullid), |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
205 rev.message or ' ', |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
206 [], |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
207 del_all_files, |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
208 meta.authors[rev.author], |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
209 date, |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
210 extra) |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
211 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
|
212 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
|
213 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
|
214 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
|
215 |
7c576ae19d80
replay: start new replay module that has the relevant functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
216 return closebranches |