Mercurial > hgsubversion
annotate hgsubversion/stupid.py @ 952:9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Reverting a branch with a remove followed by a copy results in a branch
replacement. By default, branch replacements are handled by closing the
replaced branch and committing the new branch on top of it. But we do
not really want that when reverting a branch, we only want a linear
history with a changeset capturing the revert.
author | Patrick Mezard <patrick@mezard.eu> |
---|---|
date | Tue, 16 Oct 2012 21:17:55 +0200 |
parents | d6db289f1548 |
children | c4b25a903ad3 |
rev | line source |
---|---|
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
1 import cStringIO |
531
cf4fe45bf8fd
Change all instantiations of IOError to set both errno and strerror.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
529
diff
changeset
|
2 import errno |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
3 import re |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
4 |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
5 from mercurial import context |
822
033b86e0f56d
stupid/filemap: disable this since it doesn't currently work
Augie Fackler <durin42@gmail.com>
parents:
814
diff
changeset
|
6 from mercurial import node |
033b86e0f56d
stupid/filemap: disable this since it doesn't currently work
Augie Fackler <durin42@gmail.com>
parents:
814
diff
changeset
|
7 from mercurial import patch |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
8 from mercurial import revlog |
822
033b86e0f56d
stupid/filemap: disable this since it doesn't currently work
Augie Fackler <durin42@gmail.com>
parents:
814
diff
changeset
|
9 from mercurial import util as hgutil |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
10 |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
11 import svnwrap |
174
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
12 import svnexternals |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
13 import util |
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
14 |
859
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
15 # Here is a diff mixing content and property changes in svn >= 1.7 |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
16 # |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
17 # Index: a |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
18 # =================================================================== |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
19 # --- a (revision 12) |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
20 # +++ a (working copy) |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
21 # @@ -1,2 +1,3 @@ |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
22 # a |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
23 # a |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
24 # +a |
932
dfb3afa6c619
stupid: Fail over to full revision when a PatchError is thrown (issue294)
Tim Delaney <timothy.c.delaney@gmail.com>
parents:
920
diff
changeset
|
25 # |
859
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
26 # Property changes on: a |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
27 # ___________________________________________________________________ |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
28 # Added: svn:executable |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
29 # ## -0,0 +1 ## |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
30 # +* |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
31 |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
32 class ParseError(Exception): |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
33 pass |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
34 |
859
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
35 index_header = r'''Index: ([^\n]*) |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
36 =* |
859
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
37 ''' |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
38 |
859
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
39 property_header = r'''Property changes on: ([^\n]*) |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
40 _* |
859
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
41 ''' |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
42 |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
43 headers_re = re.compile('(?:' + '|'.join([ |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
44 index_header, |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
45 property_header, |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
46 ]) + ')') |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
47 |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
48 property_special_added = r'''(?:Added|Name): (svn:special) |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
49 (?: \+|## -0,0 \+1 ## |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
50 \+)''' |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
51 |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
52 property_special_deleted = r'''(?:Deleted|Name): (svn:special) |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
53 (?: \-|## -1 \+0,0 ## |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
54 \-)''' |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
55 |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
56 property_exec_added = r'''(?:Added|Name): (svn:executable) |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
57 (?: \+|## -0,0 \+1 ## |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
58 \+)''' |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
59 |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
60 property_exec_deleted = r'''(?:Deleted|Name): (svn:executable) |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
61 (?: \-|## -1 \+0,0 ## |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
62 \-)''' |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
63 |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
64 properties_re = re.compile('(?:' + '|'.join([ |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
65 property_special_added, |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
66 property_special_deleted, |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
67 property_exec_added, |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
68 property_exec_deleted, |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
69 ]) + ')') |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
70 |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
71 class filediff: |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
72 def __init__(self, name): |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
73 self.name = name |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
74 self.diff = None |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
75 self.binary = False |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
76 self.executable = None |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
77 self.symlink = None |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
78 self.hasprops = False |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
79 |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
80 def isempty(self): |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
81 return (not self.diff and not self.binary and not self.hasprops) |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
82 |
860
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
83 def maybedir(self): |
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
84 return (not self.diff and not self.binary and self.hasprops |
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
85 and self.symlink is None and self.executable is None) |
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
86 |
859
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
87 def parsediff(diff): |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
88 changes = {} |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
89 headers = headers_re.split(diff)[1:] |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
90 if (len(headers) % 3) != 0: |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
91 # headers should be a sequence of (index file, property file, data) |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
92 raise ParseError('unexpected diff format') |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
93 files = [] |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
94 for i in xrange(len(headers)/3): |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
95 iname, pname, data = headers[3*i:3*i+3] |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
96 fname = iname or pname |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
97 if fname not in changes: |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
98 changes[fname] = filediff(fname) |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
99 files.append(changes[fname]) |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
100 f = changes[fname] |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
101 if iname is not None: |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
102 if data.strip(): |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
103 f.binary = data.lstrip().startswith( |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
104 'Cannot display: file marked as a binary type.') |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
105 if not f.binary and '@@' in data: |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
106 # Non-empty diff |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
107 f.diff = data |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
108 else: |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
109 f.hasprops = True |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
110 for m in properties_re.finditer(data): |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
111 p = m.group(1, 2, 3, 4) |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
112 if p[0] or p[1]: |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
113 f.symlink = bool(p[0]) |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
114 elif p[2] or p[3]: |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
115 f.executable = bool(p[2]) |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
116 return files |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
117 |
239
e2214c8fc91f
Put all stupid stuff in it's own module (separate from fetch-command).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
237
diff
changeset
|
118 |
e2214c8fc91f
Put all stupid stuff in it's own module (separate from fetch-command).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
237
diff
changeset
|
119 class BadPatchApply(Exception): |
e2214c8fc91f
Put all stupid stuff in it's own module (separate from fetch-command).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
237
diff
changeset
|
120 pass |
e2214c8fc91f
Put all stupid stuff in it's own module (separate from fetch-command).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
237
diff
changeset
|
121 |
837
805ef27fbcbe
hgsubversion/*.py: add space after comment symbol #
Yonggang Luo <luoyonggang@gmail.com>
parents:
832
diff
changeset
|
122 def print_your_svn_is_old_message(ui): # pragma: no cover |
239
e2214c8fc91f
Put all stupid stuff in it's own module (separate from fetch-command).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
237
diff
changeset
|
123 ui.status("In light of that, I'll fall back and do diffs, but it won't do " |
e2214c8fc91f
Put all stupid stuff in it's own module (separate from fetch-command).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
237
diff
changeset
|
124 "as good a job. You should really upgrade your server.\n") |
e2214c8fc91f
Put all stupid stuff in it's own module (separate from fetch-command).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
237
diff
changeset
|
125 |
127
7e45bcf52b64
fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
119
diff
changeset
|
126 def mempatchproxy(parentctx, files): |
7e45bcf52b64
fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
119
diff
changeset
|
127 # Avoid circular references patch.patchfile -> mempatch |
7e45bcf52b64
fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
119
diff
changeset
|
128 patchfile = patch.patchfile |
7e45bcf52b64
fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
119
diff
changeset
|
129 |
605
b72850177e5c
stupid: update monkeypatch for 91c58cf54eee
Augie Fackler <durin42@gmail.com>
parents:
601
diff
changeset
|
130 # TODO(durin42): make this a compat path for hg < 1.6. |
127
7e45bcf52b64
fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
119
diff
changeset
|
131 class mempatch(patchfile): |
605
b72850177e5c
stupid: update monkeypatch for 91c58cf54eee
Augie Fackler <durin42@gmail.com>
parents:
601
diff
changeset
|
132 def __init__(self, ui, fname, opener, missing=False, eolmode=None): |
b72850177e5c
stupid: update monkeypatch for 91c58cf54eee
Augie Fackler <durin42@gmail.com>
parents:
601
diff
changeset
|
133 patchfile.__init__(self, ui, fname, None, False, eolmode) |
133
2242dd1163c6
hg_delta_editor: fix bad parent revision calculation in the case of a branch
Augie Fackler <durin42@gmail.com>
parents:
129
diff
changeset
|
134 |
127
7e45bcf52b64
fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
119
diff
changeset
|
135 def readlines(self, fname): |
7e45bcf52b64
fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
119
diff
changeset
|
136 if fname not in parentctx: |
531
cf4fe45bf8fd
Change all instantiations of IOError to set both errno and strerror.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
529
diff
changeset
|
137 raise IOError(errno.ENOENT, 'Cannot find %r to patch' % fname) |
129
59f8603a6641
fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents:
128
diff
changeset
|
138 fctx = parentctx[fname] |
59f8603a6641
fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents:
128
diff
changeset
|
139 data = fctx.data() |
59f8603a6641
fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents:
128
diff
changeset
|
140 if 'l' in fctx.flags(): |
59f8603a6641
fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents:
128
diff
changeset
|
141 data = 'link ' + data |
59f8603a6641
fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents:
128
diff
changeset
|
142 return cStringIO.StringIO(data).readlines() |
127
7e45bcf52b64
fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
119
diff
changeset
|
143 |
7e45bcf52b64
fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
119
diff
changeset
|
144 def writelines(self, fname, lines): |
7e45bcf52b64
fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
119
diff
changeset
|
145 files[fname] = ''.join(lines) |
7e45bcf52b64
fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
119
diff
changeset
|
146 |
7e45bcf52b64
fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
119
diff
changeset
|
147 def unlink(self, fname): |
7e45bcf52b64
fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
119
diff
changeset
|
148 files[fname] = None |
7e45bcf52b64
fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
119
diff
changeset
|
149 |
7e45bcf52b64
fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
119
diff
changeset
|
150 return mempatch |
7e45bcf52b64
fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
119
diff
changeset
|
151 |
200
2e8c527f0456
stupid replay: Don't actually try and apply diffs to files we don't have anyway.
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
152 |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
153 def filteriterhunks(meta): |
200
2e8c527f0456
stupid replay: Don't actually try and apply diffs to files we don't have anyway.
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
154 iterhunks = patch.iterhunks |
801
37ad86983a6d
stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents:
787
diff
changeset
|
155 def filterhunks(*args, **kwargs): |
37ad86983a6d
stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents:
787
diff
changeset
|
156 # ui, fp, sourcefile=None, textmode=False |
200
2e8c527f0456
stupid replay: Don't actually try and apply diffs to files we don't have anyway.
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
157 applycurrent = False |
424
3ae8edc3d8f1
stupid: handle the new eol option in hg-crew.
Augie Fackler <durin42@gmail.com>
parents:
422
diff
changeset
|
158 # Passing False instead of textmode because we should never |
3ae8edc3d8f1
stupid: handle the new eol option in hg-crew.
Augie Fackler <durin42@gmail.com>
parents:
422
diff
changeset
|
159 # be ignoring EOL type. |
801
37ad86983a6d
stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents:
787
diff
changeset
|
160 if iterhunks.func_code.co_argcount == 1: |
37ad86983a6d
stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents:
787
diff
changeset
|
161 # Since 1.9 (28762bb767dc) |
37ad86983a6d
stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents:
787
diff
changeset
|
162 fp = args[0] |
37ad86983a6d
stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents:
787
diff
changeset
|
163 gen = iterhunks(fp) |
552
2d44461e8617
fix filterhunks for both crew and 1.4
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
547
diff
changeset
|
164 else: |
801
37ad86983a6d
stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents:
787
diff
changeset
|
165 ui, fp = args[:2] |
37ad86983a6d
stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents:
787
diff
changeset
|
166 if len(args) > 2: |
37ad86983a6d
stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents:
787
diff
changeset
|
167 sourcefile = args[2] |
37ad86983a6d
stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents:
787
diff
changeset
|
168 else: |
37ad86983a6d
stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents:
787
diff
changeset
|
169 sourcefile = kwargs.get('sourcefile', None) |
37ad86983a6d
stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents:
787
diff
changeset
|
170 if len(args) > 3: |
37ad86983a6d
stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents:
787
diff
changeset
|
171 textmode = args[3] |
37ad86983a6d
stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents:
787
diff
changeset
|
172 else: |
37ad86983a6d
stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents:
787
diff
changeset
|
173 textmode = kwargs.get('textmode', False) |
37ad86983a6d
stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents:
787
diff
changeset
|
174 if not iterhunks.func_defaults: |
37ad86983a6d
stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents:
787
diff
changeset
|
175 # Since 1.7 (cfedc529e4a1) |
37ad86983a6d
stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents:
787
diff
changeset
|
176 gen = iterhunks(ui, fp) |
37ad86983a6d
stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents:
787
diff
changeset
|
177 elif len(iterhunks.func_defaults) == 1: |
37ad86983a6d
stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents:
787
diff
changeset
|
178 gen = iterhunks(ui, fp, sourcefile) |
37ad86983a6d
stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents:
787
diff
changeset
|
179 else: |
37ad86983a6d
stupid: fix patch.iterhunks() wrapper after hg.28762bb767dc
Patrick Mezard <pmezard@gmail.com>
parents:
787
diff
changeset
|
180 gen = iterhunks(ui, fp, sourcefile, textmode) |
552
2d44461e8617
fix filterhunks for both crew and 1.4
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
547
diff
changeset
|
181 for data in gen: |
200
2e8c527f0456
stupid replay: Don't actually try and apply diffs to files we don't have anyway.
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
182 if data[0] == 'file': |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
183 if data[1][1] in meta.filemap: |
200
2e8c527f0456
stupid replay: Don't actually try and apply diffs to files we don't have anyway.
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
184 applycurrent = True |
2e8c527f0456
stupid replay: Don't actually try and apply diffs to files we don't have anyway.
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
185 else: |
2e8c527f0456
stupid replay: Don't actually try and apply diffs to files we don't have anyway.
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
186 applycurrent = False |
2e8c527f0456
stupid replay: Don't actually try and apply diffs to files we don't have anyway.
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
187 assert data[0] != 'git', 'Filtering git hunks not supported.' |
2e8c527f0456
stupid replay: Don't actually try and apply diffs to files we don't have anyway.
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
188 if applycurrent: |
2e8c527f0456
stupid replay: Don't actually try and apply diffs to files we don't have anyway.
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
189 yield data |
2e8c527f0456
stupid replay: Don't actually try and apply diffs to files we don't have anyway.
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
190 return filterhunks |
2e8c527f0456
stupid replay: Don't actually try and apply diffs to files we don't have anyway.
Augie Fackler <durin42@gmail.com>
parents:
198
diff
changeset
|
191 |
814
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
192 def patchrepoold(ui, meta, parentctx, patchfp): |
811
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
193 files = {} |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
194 try: |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
195 oldpatchfile = patch.patchfile |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
196 olditerhunks = patch.iterhunks |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
197 patch.patchfile = mempatchproxy(parentctx, files) |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
198 patch.iterhunks = filteriterhunks(meta) |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
199 try: |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
200 # We can safely ignore the changed list since we are |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
201 # handling non-git patches. Touched files are known |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
202 # by our memory patcher. |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
203 patch_st = patch.applydiff(ui, patchfp, {}, strip=0) |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
204 finally: |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
205 patch.patchfile = oldpatchfile |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
206 patch.iterhunks = olditerhunks |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
207 except patch.PatchError: |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
208 # TODO: this happens if the svn server has the wrong mime |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
209 # type stored and doesn't know a file is binary. It would |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
210 # be better to do one file at a time and only do a |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
211 # full fetch on files that had problems. |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
212 raise BadPatchApply('patching failed') |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
213 # if this patch didn't apply right, fall back to exporting the |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
214 # entire rev. |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
215 if patch_st == -1: |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
216 assert False, ('This should only happen on case-insensitive' |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
217 ' volumes.') |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
218 elif patch_st == 1: |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
219 # When converting Django, I saw fuzz on .po files that was |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
220 # causing revisions to end up failing verification. If that |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
221 # can be fixed, maybe this won't ever be reached. |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
222 raise BadPatchApply('patching succeeded with fuzz') |
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
223 return files |
239
e2214c8fc91f
Put all stupid stuff in it's own module (separate from fetch-command).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
237
diff
changeset
|
224 |
814
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
225 try: |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
226 class svnbackend(patch.repobackend): |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
227 def getfile(self, fname): |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
228 data, (islink, isexec) = super(svnbackend, self).getfile(fname) |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
229 if islink: |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
230 data = 'link ' + data |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
231 return data, (islink, isexec) |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
232 except AttributeError: |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
233 svnbackend = None |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
234 |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
235 def patchrepo(ui, meta, parentctx, patchfp): |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
236 if not svnbackend: |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
237 return patchrepoold(ui, meta, parentctx, patchfp) |
944
d6db289f1548
pull: add hgsubversion.filestoresize to control memory consumption
Patrick Mezard <patrick@mezard.eu>
parents:
932
diff
changeset
|
238 store = patch.filestore(util.getfilestoresize(ui)) |
814
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
239 try: |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
240 touched = set() |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
241 backend = svnbackend(ui, meta.repo, parentctx, store) |
932
dfb3afa6c619
stupid: Fail over to full revision when a PatchError is thrown (issue294)
Tim Delaney <timothy.c.delaney@gmail.com>
parents:
920
diff
changeset
|
242 |
dfb3afa6c619
stupid: Fail over to full revision when a PatchError is thrown (issue294)
Tim Delaney <timothy.c.delaney@gmail.com>
parents:
920
diff
changeset
|
243 try: |
dfb3afa6c619
stupid: Fail over to full revision when a PatchError is thrown (issue294)
Tim Delaney <timothy.c.delaney@gmail.com>
parents:
920
diff
changeset
|
244 ret = patch.patchbackend(ui, backend, patchfp, 0, touched) |
dfb3afa6c619
stupid: Fail over to full revision when a PatchError is thrown (issue294)
Tim Delaney <timothy.c.delaney@gmail.com>
parents:
920
diff
changeset
|
245 if ret < 0: |
dfb3afa6c619
stupid: Fail over to full revision when a PatchError is thrown (issue294)
Tim Delaney <timothy.c.delaney@gmail.com>
parents:
920
diff
changeset
|
246 raise BadPatchApply('patching failed') |
dfb3afa6c619
stupid: Fail over to full revision when a PatchError is thrown (issue294)
Tim Delaney <timothy.c.delaney@gmail.com>
parents:
920
diff
changeset
|
247 if ret > 0: |
dfb3afa6c619
stupid: Fail over to full revision when a PatchError is thrown (issue294)
Tim Delaney <timothy.c.delaney@gmail.com>
parents:
920
diff
changeset
|
248 raise BadPatchApply('patching succeeded with fuzz') |
dfb3afa6c619
stupid: Fail over to full revision when a PatchError is thrown (issue294)
Tim Delaney <timothy.c.delaney@gmail.com>
parents:
920
diff
changeset
|
249 except patch.PatchError, e: |
dfb3afa6c619
stupid: Fail over to full revision when a PatchError is thrown (issue294)
Tim Delaney <timothy.c.delaney@gmail.com>
parents:
920
diff
changeset
|
250 raise BadPatchApply(str(e)) |
dfb3afa6c619
stupid: Fail over to full revision when a PatchError is thrown (issue294)
Tim Delaney <timothy.c.delaney@gmail.com>
parents:
920
diff
changeset
|
251 |
814
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
252 files = {} |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
253 for f in touched: |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
254 try: |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
255 data, mode, copied = store.getfile(f) |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
256 files[f] = data |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
257 except IOError: |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
258 files[f] = None |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
259 return files |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
260 finally: |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
261 store.close() |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
262 |
532
b847e1a3ccd0
stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
531
diff
changeset
|
263 def diff_branchrev(ui, svn, meta, branch, branchpath, r, parentctx): |
108
de19a13edfa8
fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents:
107
diff
changeset
|
264 """Extract all 'branch' content at a given revision. |
de19a13edfa8
fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents:
107
diff
changeset
|
265 |
de19a13edfa8
fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents:
107
diff
changeset
|
266 Return a tuple (files, filectxfn) where 'files' is the list of all files |
de19a13edfa8
fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents:
107
diff
changeset
|
267 in the branch at the given revision, and 'filectxfn' is a memctx compatible |
109
460443a96497
fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
108
diff
changeset
|
268 callable to retrieve individual file information. Raise BadPatchApply upon |
460443a96497
fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
108
diff
changeset
|
269 error. |
108
de19a13edfa8
fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents:
107
diff
changeset
|
270 """ |
109
460443a96497
fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
108
diff
changeset
|
271 try: |
536
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
272 prev, pbranch, ppath = meta.get_source_rev(ctx=parentctx) |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
273 except KeyError: |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
274 prev, pbranch, ppath = None, None, None |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
275 try: |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
276 if prev is None or pbranch == branch: |
109
460443a96497
fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
108
diff
changeset
|
277 # letting patch handle binaries sounded |
460443a96497
fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
108
diff
changeset
|
278 # cool, but it breaks patch in sad ways |
920
1be4ea4f3c0d
stupid: diff with the good revision when restoring branch
Patrick Mezard <patrick@mezard.eu>
parents:
864
diff
changeset
|
279 d = svn.get_unified_diff(branchpath, r.revnum, other_rev=prev, |
1be4ea4f3c0d
stupid: diff with the good revision when restoring branch
Patrick Mezard <patrick@mezard.eu>
parents:
864
diff
changeset
|
280 deleted=False, ignore_type=False) |
109
460443a96497
fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
108
diff
changeset
|
281 else: |
532
b847e1a3ccd0
stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
531
diff
changeset
|
282 d = svn.get_unified_diff(branchpath, r.revnum, |
536
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
283 other_path=ppath, other_rev=prev, |
109
460443a96497
fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
108
diff
changeset
|
284 deleted=True, ignore_type=True) |
460443a96497
fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
108
diff
changeset
|
285 if d: |
460443a96497
fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
108
diff
changeset
|
286 raise BadPatchApply('branch creation with mods') |
460443a96497
fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
108
diff
changeset
|
287 except svnwrap.SubversionRepoCanNotDiff: |
460443a96497
fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
108
diff
changeset
|
288 raise BadPatchApply('subversion diffing code is not supported') |
601
0fe490ce2fbb
isolate all imports of Subversion modules in svnwrap.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
588
diff
changeset
|
289 except svnwrap.SubversionException, e: |
0fe490ce2fbb
isolate all imports of Subversion modules in svnwrap.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
588
diff
changeset
|
290 if len(e.args) > 1 and e.args[1] != svnwrap.ERR_FS_NOT_FOUND: |
109
460443a96497
fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
108
diff
changeset
|
291 raise |
460443a96497
fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
108
diff
changeset
|
292 raise BadPatchApply('previous revision does not exist') |
169
f1919e1c35bf
fetch_command: cancel patching when encountering binary diffs
Patrick Mezard <pmezard@gmail.com>
parents:
168
diff
changeset
|
293 if '\0' in d: |
f1919e1c35bf
fetch_command: cancel patching when encountering binary diffs
Patrick Mezard <pmezard@gmail.com>
parents:
168
diff
changeset
|
294 raise BadPatchApply('binary diffs are not supported') |
127
7e45bcf52b64
fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
119
diff
changeset
|
295 files_data = {} |
859
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
296 changed = parsediff(d) |
529
68667b627bd5
stupid: replace dicts with sets
Patrick Mezard <pmezard@gmail.com>
parents:
528
diff
changeset
|
297 # Here we ensure that all files, including the new empty ones |
68667b627bd5
stupid: replace dicts with sets
Patrick Mezard <pmezard@gmail.com>
parents:
528
diff
changeset
|
298 # are marked as touched. Content is loaded on demand. |
859
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
299 touched_files = set(f.name for f in changed) |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
300 d2 = '\n'.join(f.diff for f in changed if f.diff) |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
301 if changed: |
811
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
302 files_data = patchrepo(ui, meta, parentctx, cStringIO.StringIO(d2)) |
127
7e45bcf52b64
fetch_command: patch files in memory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
119
diff
changeset
|
303 for x in files_data.iterkeys(): |
186
6266ba36ee15
Create patch to make normal output much less verbose…
Dan Villiom Podlaski Christiansen <danchr@cs.au.dk>
parents:
185
diff
changeset
|
304 ui.note('M %s\n' % x) |
108
de19a13edfa8
fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents:
107
diff
changeset
|
305 else: |
de19a13edfa8
fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents:
107
diff
changeset
|
306 ui.status('Not using patch for %s, diff had no hunks.\n' % |
de19a13edfa8
fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents:
107
diff
changeset
|
307 r.revnum) |
de19a13edfa8
fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents:
107
diff
changeset
|
308 |
528
052050ca59d6
replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents:
517
diff
changeset
|
309 unknown_files = set() |
108
de19a13edfa8
fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents:
107
diff
changeset
|
310 for p in r.paths: |
528
052050ca59d6
replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents:
517
diff
changeset
|
311 action = r.paths[p].action |
532
b847e1a3ccd0
stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
531
diff
changeset
|
312 if not p.startswith(branchpath) or action not in 'DR': |
528
052050ca59d6
replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents:
517
diff
changeset
|
313 continue |
532
b847e1a3ccd0
stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
531
diff
changeset
|
314 if branchpath: |
b847e1a3ccd0
stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
531
diff
changeset
|
315 p2 = p[len(branchpath)+1:].strip('/') |
528
052050ca59d6
replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents:
517
diff
changeset
|
316 else: |
052050ca59d6
replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents:
517
diff
changeset
|
317 p2 = p |
052050ca59d6
replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents:
517
diff
changeset
|
318 if p2 in parentctx: |
052050ca59d6
replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents:
517
diff
changeset
|
319 toucheds = [p2] |
052050ca59d6
replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents:
517
diff
changeset
|
320 else: |
108
de19a13edfa8
fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents:
107
diff
changeset
|
321 # If this isn't in the parent ctx, it must've been a dir |
528
052050ca59d6
replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents:
517
diff
changeset
|
322 toucheds = [f for f in parentctx if f.startswith(p2 + '/')] |
052050ca59d6
replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents:
517
diff
changeset
|
323 if action == 'R': |
052050ca59d6
replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents:
517
diff
changeset
|
324 # Files were replaced, we don't know if they still exist |
052050ca59d6
replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents:
517
diff
changeset
|
325 unknown_files.update(toucheds) |
052050ca59d6
replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents:
517
diff
changeset
|
326 else: |
052050ca59d6
replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents:
517
diff
changeset
|
327 files_data.update((f, None) for f in toucheds) |
108
de19a13edfa8
fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents:
107
diff
changeset
|
328 |
529
68667b627bd5
stupid: replace dicts with sets
Patrick Mezard <pmezard@gmail.com>
parents:
528
diff
changeset
|
329 touched_files.update(files_data) |
68667b627bd5
stupid: replace dicts with sets
Patrick Mezard <pmezard@gmail.com>
parents:
528
diff
changeset
|
330 touched_files.update(unknown_files) |
129
59f8603a6641
fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents:
128
diff
changeset
|
331 |
860
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
332 # As of svn 1.7, diff may contain a lot of property changes for |
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
333 # directories. We do not what to include these in our touched |
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
334 # files list so we try to filter them while minimizing the number |
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
335 # of svn API calls. |
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
336 property_files = set(f.name for f in changed if f.maybedir()) |
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
337 property_files.discard('.') |
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
338 touched_files.discard('.') |
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
339 branchprefix = (branchpath and branchpath + '/') or branchpath |
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
340 for f in list(property_files): |
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
341 if f in parentctx: |
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
342 continue |
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
343 # We can be smarter here by checking if f is a subcomponent |
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
344 # of a know path in parentctx or touched_files. KISS for now. |
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
345 kind = svn.checkpath(branchprefix + f, r.revnum) |
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
346 if kind == 'd': |
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
347 touched_files.discard(f) |
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
348 |
532
b847e1a3ccd0
stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
531
diff
changeset
|
349 copies = getcopies(svn, meta, branch, branchpath, r, touched_files, |
110
a4dcffaa6538
fetch_command: pass parent changectx instead of identifier
Patrick Mezard <pmezard@gmail.com>
parents:
109
diff
changeset
|
350 parentctx) |
108
de19a13edfa8
fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents:
107
diff
changeset
|
351 |
863
c24130e9ddb7
stupid: add comment noting why we track modified binary files
Augie Fackler <raf@durin42.com>
parents:
859
diff
changeset
|
352 # We note binary files because svn's diff format doesn't describe |
c24130e9ddb7
stupid: add comment noting why we track modified binary files
Augie Fackler <raf@durin42.com>
parents:
859
diff
changeset
|
353 # what changed, only that a change occurred. This means we'll have |
c24130e9ddb7
stupid: add comment noting why we track modified binary files
Augie Fackler <raf@durin42.com>
parents:
859
diff
changeset
|
354 # to pull them as fulltexts from the server outside the diff |
c24130e9ddb7
stupid: add comment noting why we track modified binary files
Augie Fackler <raf@durin42.com>
parents:
859
diff
changeset
|
355 # apply. |
859
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
356 binary_files = set(f.name for f in changed if f.binary) |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
357 exec_files = dict((f.name, f.executable) for f in changed |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
358 if f.executable is not None) |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
359 link_files = dict((f.name, f.symlink) for f in changed |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
360 if f.symlink is not None) |
108
de19a13edfa8
fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents:
107
diff
changeset
|
361 def filectxfn(repo, memctx, path): |
129
59f8603a6641
fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents:
128
diff
changeset
|
362 if path in files_data and files_data[path] is None: |
557
d74bf020a61c
replay/stupid: raise the correct errno in IOError to fix hg >= e553a425751d
Augie Fackler <durin42@gmail.com>
parents:
552
diff
changeset
|
363 raise IOError(errno.ENOENT, '%s is deleted' % path) |
129
59f8603a6641
fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents:
128
diff
changeset
|
364 |
528
052050ca59d6
replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents:
517
diff
changeset
|
365 if path in binary_files or path in unknown_files: |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
366 pa = path |
532
b847e1a3ccd0
stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
531
diff
changeset
|
367 if branchpath: |
b847e1a3ccd0
stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
531
diff
changeset
|
368 pa = branchpath + '/' + path |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
369 data, mode = svn.get_file(pa, r.revnum) |
128
bab5bcbbb3dc
fetch_command: in stupid mode, load binary files when necessary
Patrick Mezard <pmezard@gmail.com>
parents:
127
diff
changeset
|
370 isexe = 'x' in mode |
bab5bcbbb3dc
fetch_command: in stupid mode, load binary files when necessary
Patrick Mezard <pmezard@gmail.com>
parents:
127
diff
changeset
|
371 islink = 'l' in mode |
129
59f8603a6641
fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents:
128
diff
changeset
|
372 else: |
59f8603a6641
fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents:
128
diff
changeset
|
373 isexe = exec_files.get(path, 'x' in parentctx.flags(path)) |
59f8603a6641
fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents:
128
diff
changeset
|
374 islink = link_files.get(path, 'l' in parentctx.flags(path)) |
59f8603a6641
fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents:
128
diff
changeset
|
375 data = '' |
59f8603a6641
fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents:
128
diff
changeset
|
376 if path in files_data: |
59f8603a6641
fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents:
128
diff
changeset
|
377 data = files_data[path] |
59f8603a6641
fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents:
128
diff
changeset
|
378 if islink: |
59f8603a6641
fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents:
128
diff
changeset
|
379 data = data[len('link '):] |
59f8603a6641
fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents:
128
diff
changeset
|
380 elif path in parentctx: |
59f8603a6641
fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents:
128
diff
changeset
|
381 data = parentctx[path].data() |
133
2242dd1163c6
hg_delta_editor: fix bad parent revision calculation in the case of a branch
Augie Fackler <durin42@gmail.com>
parents:
129
diff
changeset
|
382 |
108
de19a13edfa8
fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents:
107
diff
changeset
|
383 copied = copies.get(path) |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
384 # TODO this branch feels like it should not be required, |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
385 # and this may actually imply a bug in getcopies |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
386 if copied not in parentctx.manifest(): |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
387 copied = None |
128
bab5bcbbb3dc
fetch_command: in stupid mode, load binary files when necessary
Patrick Mezard <pmezard@gmail.com>
parents:
127
diff
changeset
|
388 return context.memfilectx(path=path, data=data, islink=islink, |
bab5bcbbb3dc
fetch_command: in stupid mode, load binary files when necessary
Patrick Mezard <pmezard@gmail.com>
parents:
127
diff
changeset
|
389 isexec=isexe, copied=copied) |
108
de19a13edfa8
fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents:
107
diff
changeset
|
390 |
129
59f8603a6641
fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents:
128
diff
changeset
|
391 return list(touched_files), filectxfn |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
392 |
588
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
393 def makecopyfinder(meta, r, branchpath): |
73
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
394 """Return a function detecting copies. |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
395 |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
396 Returned copyfinder(path) returns None if no copy information can |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
397 be found or ((source, sourcerev), sourcepath) where "sourcepath" is the |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
398 copy source path, "sourcerev" the source svn revision and "source" is the |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
399 copy record path causing the copy to occur. If a single file was copied |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
400 "sourcepath" and "source" are the same, while file copies dectected from |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
401 directory copies return the copied source directory in "source". |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
402 """ |
588
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
403 # cache changeset contexts and map them to source svn revisions |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
404 ctxs = {} |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
405 def getctx(branch, svnrev): |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
406 if svnrev in ctxs: |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
407 return ctxs[svnrev] |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
408 changeid = meta.get_parent_revision(svnrev + 1, branch, True) |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
409 ctx = None |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
410 if changeid != revlog.nullid: |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
411 ctx = meta.repo.changectx(changeid) |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
412 ctxs[svnrev] = ctx |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
413 return ctx |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
414 |
73
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
415 # filter copy information for current branch |
495
44bde69b6c49
stupid: detect renames with empty branchpath properly
Augie Fackler <durin42@gmail.com>
parents:
494
diff
changeset
|
416 branchpath = (branchpath and branchpath + '/') or '' |
73
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
417 copies = [] |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
418 for path, e in r.paths.iteritems(): |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
419 if not e.copyfrom_path: |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
420 continue |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
421 if not path.startswith(branchpath): |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
422 continue |
588
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
423 # compute converted source path and revision |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
424 frompath, frombranch = meta.split_branch_path(e.copyfrom_path)[:2] |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
425 if frompath is None: |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
426 continue |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
427 fromctx = getctx(frombranch, e.copyfrom_rev) |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
428 if fromctx is None: |
73
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
429 continue |
588
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
430 destpath = path[len(branchpath):] |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
431 copies.append((destpath, (frompath, fromctx))) |
73
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
432 |
163 | 433 copies.sort(reverse=True) |
73
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
434 exactcopies = dict(copies) |
101
a3b717e4abf5
Cleanups based on pyflakes output.
Augie Fackler <durin42@gmail.com>
parents:
98
diff
changeset
|
435 |
73
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
436 def finder(path): |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
437 if path in exactcopies: |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
438 return exactcopies[path], exactcopies[path][0] |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
439 # look for parent directory copy, longest first |
588
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
440 for dest, (source, sourcectx) in copies: |
73
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
441 dest = dest + '/' |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
442 if not path.startswith(dest): |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
443 continue |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
444 sourcepath = source + '/' + path[len(dest):] |
588
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
445 return (source, sourcectx), sourcepath |
73
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
446 return None |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
447 |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
448 return finder |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
449 |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
450 def getcopies(svn, meta, branch, branchpath, r, files, parentctx): |
73
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
451 """Return a mapping {dest: source} for every file copied into r. |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
452 """ |
110
a4dcffaa6538
fetch_command: pass parent changectx instead of identifier
Patrick Mezard <pmezard@gmail.com>
parents:
109
diff
changeset
|
453 if parentctx.node() == revlog.nullid: |
73
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
454 return {} |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
455 |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
456 # Extract svn copy information, group them by copy source. |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
457 # The idea is to duplicate the replay behaviour where copies are |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
458 # evaluated per copy event (one event for all files in a directory copy, |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
459 # one event for single file copy). We assume that copy events match |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
460 # copy sources in revision info. |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
461 svncopies = {} |
588
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
462 finder = makecopyfinder(meta, r, branchpath) |
73
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
463 for f in files: |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
464 copy = finder(f) |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
465 if copy: |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
466 svncopies.setdefault(copy[0], []).append((f, copy[1])) |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
467 if not svncopies: |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
468 return {} |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
469 |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
470 # check svn copies really make sense in mercurial |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
471 hgcopies = {} |
588
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
472 for (sourcepath, sourcectx), copies in svncopies.iteritems(): |
496
5e0dfe59d4c3
copies: fix under-reporting of copies in hg
Augie Fackler <durin42@gmail.com>
parents:
495
diff
changeset
|
473 for k, v in copies: |
497
cad864ed29de
util: make aresamefiles take one file and just be issamefile instead.
Augie Fackler <durin42@gmail.com>
parents:
496
diff
changeset
|
474 if not util.issamefile(sourcectx, parentctx, v): |
496
5e0dfe59d4c3
copies: fix under-reporting of copies in hg
Augie Fackler <durin42@gmail.com>
parents:
495
diff
changeset
|
475 continue |
5e0dfe59d4c3
copies: fix under-reporting of copies in hg
Augie Fackler <durin42@gmail.com>
parents:
495
diff
changeset
|
476 hgcopies.update({k: v}) |
73
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
477 return hgcopies |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
478 |
762
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
758
diff
changeset
|
479 def fetch_externals(ui, svn, branchpath, r, parentctx): |
174
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
480 """Extract svn:externals for the current revision and branch |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
481 |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
482 Return an externalsfile instance or None if there are no externals |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
483 to convert and never were. |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
484 """ |
762
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
758
diff
changeset
|
485 externals = svnexternals.parse(ui, parentctx) |
174
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
486 # Detect property additions only, changes are handled by checking |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
487 # existing entries individually. Projects are unlikely to store |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
488 # externals on many different root directories, so we trade code |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
489 # duplication and complexity for a constant lookup price at every |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
490 # revision in the common case. |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
491 dirs = set(externals) |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
492 if parentctx.node() == revlog.nullid: |
832
e9af7eba88db
globally: clean up whitespace around operators and commas to conform with PEP8
Yonggang Luo <luoyonggang@gmail.com>
parents:
831
diff
changeset
|
493 dirs.update([p for p, k in svn.list_files(branchpath, r.revnum) if k == 'd']) |
174
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
494 dirs.add('') |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
495 else: |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
496 branchprefix = (branchpath and branchpath + '/') or branchpath |
174
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
497 for path, e in r.paths.iteritems(): |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
498 if e.action == 'D': |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
499 continue |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
500 if not path.startswith(branchprefix) and path != branchpath: |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
501 continue |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
502 kind = svn.checkpath(path, r.revnum) |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
503 if kind != 'd': |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
504 continue |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
505 path = path[len(branchprefix):] |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
506 dirs.add(path) |
184
d3ea6c98a086
Do not recurse for externals on copied directory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
182
diff
changeset
|
507 if e.action == 'M' or (e.action == 'A' and e.copyfrom_path): |
d3ea6c98a086
Do not recurse for externals on copied directory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
182
diff
changeset
|
508 # Do not recurse in copied directories, changes are marked |
d3ea6c98a086
Do not recurse for externals on copied directory in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
182
diff
changeset
|
509 # as 'M', except for the copied one. |
174
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
510 continue |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
511 for child, k in svn.list_files(branchprefix + path, r.revnum): |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
512 if k == 'd': |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
513 dirs.add((path + '/' + child).strip('/')) |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
514 |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
515 # Retrieve new or updated values |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
516 for dir in dirs: |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
517 try: |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
518 dpath = (branchpath and branchpath + '/' + dir) or dir |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
519 values = svn.list_props(dpath, r.revnum) |
174
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
520 externals[dir] = values.get('svn:externals', '') |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
521 except IOError: |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
522 externals[dir] = '' |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
523 return externals |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
524 |
239
e2214c8fc91f
Put all stupid stuff in it's own module (separate from fetch-command).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
237
diff
changeset
|
525 |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
526 def fetch_branchrev(svn, meta, branch, branchpath, r, parentctx): |
77
ed3dd5bf45da
fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents:
76
diff
changeset
|
527 """Extract all 'branch' content at a given revision. |
ed3dd5bf45da
fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents:
76
diff
changeset
|
528 |
ed3dd5bf45da
fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents:
76
diff
changeset
|
529 Return a tuple (files, filectxfn) where 'files' is the list of all files |
ed3dd5bf45da
fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents:
76
diff
changeset
|
530 in the branch at the given revision, and 'filectxfn' is a memctx compatible |
ed3dd5bf45da
fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents:
76
diff
changeset
|
531 callable to retrieve individual file information. |
ed3dd5bf45da
fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents:
76
diff
changeset
|
532 """ |
87
b033d74be76b
fetch_command: in stupid non-diffy mode, take changed paths in account
Patrick Mezard <pmezard@gmail.com>
parents:
79
diff
changeset
|
533 files = [] |
110
a4dcffaa6538
fetch_command: pass parent changectx instead of identifier
Patrick Mezard <pmezard@gmail.com>
parents:
109
diff
changeset
|
534 if parentctx.node() == revlog.nullid: |
88
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
535 # Initial revision, fetch all files |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
536 for path, kind in svn.list_files(branchpath, r.revnum): |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
537 if kind == 'f': |
87
b033d74be76b
fetch_command: in stupid non-diffy mode, take changed paths in account
Patrick Mezard <pmezard@gmail.com>
parents:
79
diff
changeset
|
538 files.append(path) |
88
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
539 else: |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
540 branchprefix = (branchpath and branchpath + '/') or '' |
88
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
541 for path, e in r.paths.iteritems(): |
952
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
542 if path == branchpath: |
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
543 if e.action != 'R' or branch not in meta.branches: |
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
544 # Full-branch replacements are handled as reverts, |
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
545 # skip everything else. |
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
546 continue |
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
547 elif not path.startswith(branchprefix): |
87
b033d74be76b
fetch_command: in stupid non-diffy mode, take changed paths in account
Patrick Mezard <pmezard@gmail.com>
parents:
79
diff
changeset
|
548 continue |
417
8630d1ebcdb9
svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
416
diff
changeset
|
549 if not meta.is_path_valid(path): |
179
a336e3e82648
Fetch: add a filemap argument for use in converting old repositories to
Graham Booker <gbooker@cod3r.com>
parents:
176
diff
changeset
|
550 continue |
88
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
551 kind = svn.checkpath(path, r.revnum) |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
552 path = path[len(branchprefix):] |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
553 if kind == 'f': |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
554 files.append(path) |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
555 elif kind == 'd': |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
556 if e.action == 'M': |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
557 continue |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
558 dirpath = branchprefix + path |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
559 for child, k in svn.list_files(dirpath, r.revnum): |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
560 if k == 'f': |
656
1add57910c82
stupid: remove an incorrect, implicit assumption in fetch_branchrev()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
648
diff
changeset
|
561 if path: |
1add57910c82
stupid: remove an incorrect, implicit assumption in fetch_branchrev()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
648
diff
changeset
|
562 childpath = '%s/%s' % (path, child) |
1add57910c82
stupid: remove an incorrect, implicit assumption in fetch_branchrev()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
648
diff
changeset
|
563 else: |
1add57910c82
stupid: remove an incorrect, implicit assumption in fetch_branchrev()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
648
diff
changeset
|
564 childpath = child |
1add57910c82
stupid: remove an incorrect, implicit assumption in fetch_branchrev()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
648
diff
changeset
|
565 files.append(childpath) |
583
a016b253910b
stupid: handle directory replacement in very stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
574
diff
changeset
|
566 if e.action == 'R': |
a016b253910b
stupid: handle directory replacement in very stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
574
diff
changeset
|
567 # Check all files in replaced directory |
a016b253910b
stupid: handle directory replacement in very stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
574
diff
changeset
|
568 path = path + '/' |
a016b253910b
stupid: handle directory replacement in very stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
574
diff
changeset
|
569 files += [f for f in parentctx if f.startswith(path)] |
88
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
570 else: |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
571 if path in parentctx: |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
572 files.append(path) |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
573 continue |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
574 # Assume it's a deleted directory |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
575 path = path + '/' |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
576 deleted = [f for f in parentctx if f.startswith(path)] |
101
a3b717e4abf5
Cleanups based on pyflakes output.
Augie Fackler <durin42@gmail.com>
parents:
98
diff
changeset
|
577 files += deleted |
87
b033d74be76b
fetch_command: in stupid non-diffy mode, take changed paths in account
Patrick Mezard <pmezard@gmail.com>
parents:
79
diff
changeset
|
578 |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
579 copies = getcopies(svn, meta, branch, branchpath, r, files, parentctx) |
101
a3b717e4abf5
Cleanups based on pyflakes output.
Augie Fackler <durin42@gmail.com>
parents:
98
diff
changeset
|
580 |
77
ed3dd5bf45da
fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents:
76
diff
changeset
|
581 def filectxfn(repo, memctx, path): |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
582 svnpath = path |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
583 if branchpath: |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
584 svnpath = branchpath + '/' + path |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
585 data, mode = svn.get_file(svnpath, r.revnum) |
77
ed3dd5bf45da
fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents:
76
diff
changeset
|
586 isexec = 'x' in mode |
ed3dd5bf45da
fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents:
76
diff
changeset
|
587 islink = 'l' in mode |
ed3dd5bf45da
fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents:
76
diff
changeset
|
588 copied = copies.get(path) |
535
715d2e3e153b
stupid: port hack from stupid to moderately stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
532
diff
changeset
|
589 # TODO this branch feels like it should not be required, |
715d2e3e153b
stupid: port hack from stupid to moderately stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
532
diff
changeset
|
590 # and this may actually imply a bug in getcopies |
715d2e3e153b
stupid: port hack from stupid to moderately stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
532
diff
changeset
|
591 if copied not in parentctx.manifest(): |
715d2e3e153b
stupid: port hack from stupid to moderately stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
532
diff
changeset
|
592 copied = None |
77
ed3dd5bf45da
fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents:
76
diff
changeset
|
593 return context.memfilectx(path=path, data=data, islink=islink, |
ed3dd5bf45da
fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents:
76
diff
changeset
|
594 isexec=isexec, copied=copied) |
ed3dd5bf45da
fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents:
76
diff
changeset
|
595 |
ed3dd5bf45da
fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents:
76
diff
changeset
|
596 return files, filectxfn |
ed3dd5bf45da
fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents:
76
diff
changeset
|
597 |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
598 def checkbranch(meta, r, branch): |
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
599 branchedits = meta.revmap.branchedits(branch, r) |
373
8c91e6a69d05
Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
368
diff
changeset
|
600 if not branchedits: |
8c91e6a69d05
Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
368
diff
changeset
|
601 return None |
8c91e6a69d05
Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
368
diff
changeset
|
602 branchtip = branchedits[0][1] |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
603 for child in meta.repo[branchtip].children(): |
375
af9fc01299b4
Make branch closing more Mercurial-like.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
374
diff
changeset
|
604 b = child.branch() != 'default' and child.branch() or None |
af9fc01299b4
Make branch closing more Mercurial-like.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
374
diff
changeset
|
605 if b == branch and child.extra().get('close'): |
373
8c91e6a69d05
Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
368
diff
changeset
|
606 return None |
8c91e6a69d05
Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
368
diff
changeset
|
607 return branchtip |
8c91e6a69d05
Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
368
diff
changeset
|
608 |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
609 def branches_in_paths(meta, tbdelta, paths, revnum, checkpath, listdir): |
377
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
610 '''Given a list of paths, return mapping of all branches touched |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
611 to their branch path. |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
612 ''' |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
613 branches = {} |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
614 paths_need_discovery = [] |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
615 for p in paths: |
540
8dc759dc9ca9
svnmeta: remove split_branch_tag() exacttag argument
Patrick Mezard <pmezard@gmail.com>
parents:
536
diff
changeset
|
616 relpath, branch, branchpath = meta.split_branch_path(p) |
377
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
617 if relpath is not None: |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
618 branches[branch] = branchpath |
517
ef288fb7f2fe
svnmeta: is_path_tag() is really get_path_tag()
Patrick Mezard <pmezard@gmail.com>
parents:
514
diff
changeset
|
619 elif paths[p].action == 'D' and not meta.get_path_tag(p): |
417
8630d1ebcdb9
svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
416
diff
changeset
|
620 ln = meta.localname(p) |
377
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
621 # must check in branches_to_delete as well, because this runs after we |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
622 # already updated the branch map |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
623 if ln in meta.branches or ln in tbdelta['branches'][1]: |
377
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
624 branches[ln] = p |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
625 else: |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
626 paths_need_discovery.append(p) |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
627 |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
628 if not paths_need_discovery: |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
629 return branches |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
630 |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
631 paths_need_discovery = [(len(p), p) for p in paths_need_discovery] |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
632 paths_need_discovery.sort() |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
633 paths_need_discovery = [p[1] for p in paths_need_discovery] |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
634 actually_files = [] |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
635 while paths_need_discovery: |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
636 p = paths_need_discovery.pop(0) |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
637 path_could_be_file = True |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
638 ind = 0 |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
639 while ind < len(paths_need_discovery) and not paths_need_discovery: |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
640 if op.startswith(p): |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
641 path_could_be_file = False |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
642 ind += 1 |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
643 if path_could_be_file: |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
644 if checkpath(p, revnum) == 'f': |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
645 actually_files.append(p) |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
646 # if there's a copyfrom_path and there were files inside that copyfrom, |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
647 # we need to detect those branches. It's a little thorny and slow, but |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
648 # seems to be the best option. |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
649 elif paths[p].copyfrom_path and not p.startswith('tags/'): |
832
e9af7eba88db
globally: clean up whitespace around operators and commas to conform with PEP8
Yonggang Luo <luoyonggang@gmail.com>
parents:
831
diff
changeset
|
650 paths_need_discovery.extend(['%s/%s' % (p, x[0]) |
377
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
651 for x in listdir(p, revnum) |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
652 if x[1] == 'f']) |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
653 |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
654 if not actually_files: |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
655 continue |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
656 |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
657 filepaths = [p.split('/') for p in actually_files] |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
658 filepaths = [(len(p), p) for p in filepaths] |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
659 filepaths.sort() |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
660 filepaths = [p[1] for p in filepaths] |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
661 while filepaths: |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
662 path = filepaths.pop(0) |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
663 parentdir = '/'.join(path[:-1]) |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
664 filepaths = [p for p in filepaths if not '/'.join(p).startswith(parentdir)] |
417
8630d1ebcdb9
svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
416
diff
changeset
|
665 branchpath = meta.normalize(parentdir) |
377
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
666 if branchpath.startswith('tags/'): |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
667 continue |
417
8630d1ebcdb9
svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
416
diff
changeset
|
668 branchname = meta.localname(branchpath) |
377
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
669 if branchpath.startswith('trunk/'): |
417
8630d1ebcdb9
svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
416
diff
changeset
|
670 branches[meta.localname('trunk')] = 'trunk' |
377
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
671 continue |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
672 if branchname and branchname.startswith('../'): |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
673 continue |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
674 branches[branchname] = branchpath |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
675 return branches |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
676 |
787
4bbc6bf947f5
replay: fetch full revision at most once per run (issue252)
Patrick Mezard <pmezard@gmail.com>
parents:
769
diff
changeset
|
677 def convert_rev(ui, meta, svn, r, tbdelta, firstrun): |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
678 # this server fails at replay |
367
ce64d57172a3
Generate separate data structure containing revision's tags/branches changes.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
366
diff
changeset
|
679 |
822
033b86e0f56d
stupid/filemap: disable this since it doesn't currently work
Augie Fackler <durin42@gmail.com>
parents:
814
diff
changeset
|
680 if meta.filemap: |
033b86e0f56d
stupid/filemap: disable this since it doesn't currently work
Augie Fackler <durin42@gmail.com>
parents:
814
diff
changeset
|
681 raise hgutil.Abort('filemaps currently unsupported with stupid replay.') |
033b86e0f56d
stupid/filemap: disable this since it doesn't currently work
Augie Fackler <durin42@gmail.com>
parents:
814
diff
changeset
|
682 |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
683 branches = branches_in_paths(meta, tbdelta, r.paths, r.revnum, |
412
5cba60948f92
stupid: eliminate dependency on editor.current
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
411
diff
changeset
|
684 svn.checkpath, svn.list_files) |
203
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
200
diff
changeset
|
685 brpaths = branches.values() |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
200
diff
changeset
|
686 bad_branch_paths = {} |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
200
diff
changeset
|
687 for br, bp in branches.iteritems(): |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
200
diff
changeset
|
688 bad_branch_paths[br] = [] |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
200
diff
changeset
|
689 |
490 | 690 # This next block might be needed, but for now I'm omitting it until it |
691 # can be proven necessary. | |
203
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
200
diff
changeset
|
692 # for bad in brpaths: |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
200
diff
changeset
|
693 # if bad.startswith(bp) and len(bad) > len(bp): |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
200
diff
changeset
|
694 # bad_branch_paths[br].append(bad[len(bp)+1:]) |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
200
diff
changeset
|
695 |
490 | 696 # We've go a branch that contains other branches. We have to be careful |
697 # to get results similar to real replay in this case. | |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
698 for existingbr in meta.branches: |
417
8630d1ebcdb9
svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
416
diff
changeset
|
699 bad = meta.remotename(existingbr) |
203
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
200
diff
changeset
|
700 if bad.startswith(bp) and len(bad) > len(bp): |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
200
diff
changeset
|
701 bad_branch_paths[br].append(bad[len(bp)+1:]) |
373
8c91e6a69d05
Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
368
diff
changeset
|
702 |
8c91e6a69d05
Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
368
diff
changeset
|
703 deleted_branches = {} |
203
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
200
diff
changeset
|
704 for p in r.paths: |
547
9e6499c415a9
tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents:
540
diff
changeset
|
705 tag = meta.get_path_tag(p) |
9e6499c415a9
tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents:
540
diff
changeset
|
706 if tag and tag not in meta.tags: |
203
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
200
diff
changeset
|
707 continue |
417
8630d1ebcdb9
svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
416
diff
changeset
|
708 branch = meta.localname(p) |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
709 if not (r.paths[p].action == 'R' and branch in meta.branches): |
373
8c91e6a69d05
Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
368
diff
changeset
|
710 continue |
952
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
711 # Check the branch is not being replaced by one of its |
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
712 # ancestors, it happens a lot with project-wide reverts. |
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
713 frompath = r.paths[p].copyfrom_path |
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
714 frompath, frombranch = meta.split_branch_path( |
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
715 frompath, existing=False)[:2] |
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
716 if frompath == '': |
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
717 fromnode = meta.get_parent_revision( |
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
718 r.paths[p].copyfrom_rev + 1, frombranch, exact=True) |
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
719 if fromnode != node.nullid: |
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
720 fromctx = meta.repo[fromnode] |
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
721 pctx = meta.repo[meta.get_parent_revision( |
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
722 r.revnum, branch, exact=True)] |
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
723 if util.isancestor(pctx, fromctx): |
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
724 continue |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
725 closed = checkbranch(meta, r, branch) |
373
8c91e6a69d05
Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
368
diff
changeset
|
726 if closed is not None: |
8c91e6a69d05
Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
368
diff
changeset
|
727 deleted_branches[branch] = closed |
237
c90cfa665b81
Cope with date-less revisions.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
234
diff
changeset
|
728 |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
729 date = meta.fixdate(r.date) |
472
ba65e97538d1
stupid: take tbdelta closed branches in account
Patrick Mezard <pmezard@gmail.com>
parents:
452
diff
changeset
|
730 check_deleted_branches = set(tbdelta['branches'][1]) |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
731 for b in branches: |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
732 parentctx = meta.repo[meta.get_parent_revision(r.revnum, b)] |
536
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
733 tag = meta.get_path_tag(meta.remotename(b)) |
119
ea65fe2b0856
hg_delta_editor: fix update of stray files in branches/
Patrick Mezard <pmezard@gmail.com>
parents:
118
diff
changeset
|
734 kind = svn.checkpath(branches[b], r.revnum) |
ea65fe2b0856
hg_delta_editor: fix update of stray files in branches/
Patrick Mezard <pmezard@gmail.com>
parents:
118
diff
changeset
|
735 if kind != 'd': |
536
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
736 if not tag: |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
737 # Branch does not exist at this revision. Get parent |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
738 # revision and remove everything. |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
739 deleted_branches[b] = parentctx.node() |
133
2242dd1163c6
hg_delta_editor: fix bad parent revision calculation in the case of a branch
Augie Fackler <durin42@gmail.com>
parents:
129
diff
changeset
|
740 continue |
179
a336e3e82648
Fetch: add a filemap argument for use in converting old repositories to
Graham Booker <gbooker@cod3r.com>
parents:
176
diff
changeset
|
741 |
861
6fc7f74f0cf6
stupid: force non-incremental mode for unrelated branches creation
Patrick Mezard <patrick@mezard.eu>
parents:
860
diff
changeset
|
742 # The nullrev check might not be necessary in theory but svn < |
6fc7f74f0cf6
stupid: force non-incremental mode for unrelated branches creation
Patrick Mezard <patrick@mezard.eu>
parents:
860
diff
changeset
|
743 # 1.7 failed to diff branch creation so the diff_branchrev() |
6fc7f74f0cf6
stupid: force non-incremental mode for unrelated branches creation
Patrick Mezard <patrick@mezard.eu>
parents:
860
diff
changeset
|
744 # path does not support this case with svn >= 1.7. We can fix |
6fc7f74f0cf6
stupid: force non-incremental mode for unrelated branches creation
Patrick Mezard <patrick@mezard.eu>
parents:
860
diff
changeset
|
745 # it, or we can force the existing fetch_branchrev() path. Do |
6fc7f74f0cf6
stupid: force non-incremental mode for unrelated branches creation
Patrick Mezard <patrick@mezard.eu>
parents:
860
diff
changeset
|
746 # the latter for now. |
6fc7f74f0cf6
stupid: force non-incremental mode for unrelated branches creation
Patrick Mezard <patrick@mezard.eu>
parents:
860
diff
changeset
|
747 incremental = (meta.revmap.oldest > 0 and |
6fc7f74f0cf6
stupid: force non-incremental mode for unrelated branches creation
Patrick Mezard <patrick@mezard.eu>
parents:
860
diff
changeset
|
748 parentctx.rev() != node.nullrev) |
648
8fb38602e3ed
stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
640
diff
changeset
|
749 |
8fb38602e3ed
stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
640
diff
changeset
|
750 if incremental: |
8fb38602e3ed
stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
640
diff
changeset
|
751 try: |
8fb38602e3ed
stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
640
diff
changeset
|
752 files_touched, filectxfn2 = diff_branchrev( |
8fb38602e3ed
stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
640
diff
changeset
|
753 ui, svn, meta, b, branches[b], r, parentctx) |
8fb38602e3ed
stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
640
diff
changeset
|
754 except BadPatchApply, e: |
8fb38602e3ed
stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
640
diff
changeset
|
755 # Either this revision or the previous one does not exist. |
8fb38602e3ed
stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
640
diff
changeset
|
756 ui.note("Fetching entire revision: %s.\n" % e.args[0]) |
8fb38602e3ed
stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
640
diff
changeset
|
757 incremental = False |
8fb38602e3ed
stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
640
diff
changeset
|
758 if not incremental: |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
759 files_touched, filectxfn2 = fetch_branchrev( |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
760 svn, meta, b, branches[b], r, parentctx) |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
761 |
757
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
739
diff
changeset
|
762 externals = {} |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
763 if meta.layout != 'single': |
762
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
758
diff
changeset
|
764 externals = fetch_externals(ui, svn, branches[b], r, parentctx) |
757
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
739
diff
changeset
|
765 externals = svnexternals.getchanges(ui, meta.repo, parentctx, |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
739
diff
changeset
|
766 externals) |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
739
diff
changeset
|
767 files_touched.extend(externals) |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
768 |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
769 def filectxfn(repo, memctx, path): |
757
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
739
diff
changeset
|
770 if path in externals: |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
739
diff
changeset
|
771 if externals[path] is None: |
557
d74bf020a61c
replay/stupid: raise the correct errno in IOError to fix hg >= e553a425751d
Augie Fackler <durin42@gmail.com>
parents:
552
diff
changeset
|
772 raise IOError(errno.ENOENT, 'no externals') |
757
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
739
diff
changeset
|
773 return context.memfilectx(path=path, data=externals[path], |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
739
diff
changeset
|
774 islink=False, isexec=False, |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
739
diff
changeset
|
775 copied=None) |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
776 for bad in bad_branch_paths[b]: |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
777 if path.startswith(bad): |
557
d74bf020a61c
replay/stupid: raise the correct errno in IOError to fix hg >= e553a425751d
Augie Fackler <durin42@gmail.com>
parents:
552
diff
changeset
|
778 raise IOError(errno.ENOENT, 'Path %s is bad' % path) |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
779 return filectxfn2(repo, memctx, path) |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
780 |
59
430af23bef4a
Performance fix for branches-from-tags in real replay, which is tied up with
Augie Fackler <durin42@gmail.com>
parents:
58
diff
changeset
|
781 if '' in files_touched: |
430af23bef4a
Performance fix for branches-from-tags in real replay, which is tied up with
Augie Fackler <durin42@gmail.com>
parents:
58
diff
changeset
|
782 files_touched.remove('') |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
783 excluded = [f for f in files_touched if f not in meta.filemap] |
188
f48cd62a9de4
fetch_command: fix coding style
Patrick Mezard <pmezard@gmail.com>
parents:
187
diff
changeset
|
784 for f in excluded: |
f48cd62a9de4
fetch_command: fix coding style
Patrick Mezard <pmezard@gmail.com>
parents:
187
diff
changeset
|
785 files_touched.remove(f) |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
786 |
536
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
787 if b: |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
788 # Regular tag without modifications, it will be committed by |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
789 # svnmeta.committag(), we can skip the whole branch for now |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
790 if (tag and tag not in meta.tags and |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
791 b not in meta.branches |
547
9e6499c415a9
tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents:
540
diff
changeset
|
792 and b not in meta.repo.branchtags() |
9e6499c415a9
tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents:
540
diff
changeset
|
793 and not files_touched): |
536
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
794 continue |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
795 |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
796 if parentctx.node() == node.nullid and not files_touched: |
494
6eea269ff134
stupid: remove stray print statements, keep one as a ui.debug
Augie Fackler <durin42@gmail.com>
parents:
490
diff
changeset
|
797 meta.repo.ui.debug('skipping commit since parent is null and no files touched.\n') |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
798 continue |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
799 |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
800 for f in files_touched: |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
801 if f: |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
802 # this is a case that really shouldn't ever happen, it means |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
803 # something is very wrong |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
804 assert f[0] != '/' |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
805 |
422
6086363e8230
svnmeta: move util.build_extra() to SVNMeta.genextra()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
418
diff
changeset
|
806 extra = meta.genextra(r.revnum, b) |
447
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
807 if tag: |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
808 if parentctx.node() == node.nullid: |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
809 continue |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
810 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
|
811 'close': 1}) |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
812 |
640
a3d20d6e96b0
stupid: handle branch mapping.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
634
diff
changeset
|
813 origbranch = extra.get('branch', None) |
574
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
557
diff
changeset
|
814 meta.mapbranch(extra) |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
815 current_ctx = context.memctx(meta.repo, |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
816 [parentctx.node(), revlog.nullid], |
769
cc1d4aa3ba41
configurable substitution for empty commit message (fixes #195)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
762
diff
changeset
|
817 r.message or util.default_commit_msg(ui), |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
818 files_touched, |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
819 filectxfn, |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
820 meta.authors[r.author], |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
821 date, |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
822 extra) |
831
be5bbb2f2d68
svnrepo: kludge to work around hash changes between stupid and replay in hg 1.9
Augie Fackler <durin42@gmail.com>
parents:
822
diff
changeset
|
823 ha = meta.repo.svn_commitctx(current_ctx) |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
824 |
447
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
825 if not tag: |
640
a3d20d6e96b0
stupid: handle branch mapping.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
634
diff
changeset
|
826 if (not origbranch in meta.branches |
a3d20d6e96b0
stupid: handle branch mapping.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
634
diff
changeset
|
827 and not meta.get_path_tag(meta.remotename(origbranch))): |
a3d20d6e96b0
stupid: handle branch mapping.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
634
diff
changeset
|
828 meta.branches[origbranch] = None, 0, r.revnum |
447
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
829 meta.revmap[r.revnum, b] = ha |
452
ae35c389cdef
tags: allow editing tags of closed branches without reopening the branch
Augie Fackler <durin42@gmail.com>
parents:
447
diff
changeset
|
830 else: |
634
a400f3bf5611
replay/stupid: fix tagging on a branch renamed using a branch map
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
623
diff
changeset
|
831 meta.movetag(tag, ha, r, date) |
547
9e6499c415a9
tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents:
540
diff
changeset
|
832 meta.addedtags.pop(tag, None) |
452
ae35c389cdef
tags: allow editing tags of closed branches without reopening the branch
Augie Fackler <durin42@gmail.com>
parents:
447
diff
changeset
|
833 util.describe_commit(ui, ha, b) |
373
8c91e6a69d05
Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
368
diff
changeset
|
834 |
8c91e6a69d05
Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
368
diff
changeset
|
835 # These are branches with an 'R' status in svn log. This means they were |
147
22162380c4b9
Improve branch closing in the case of a single-rev replacement of one branch
Augie Fackler <durin42@gmail.com>
parents:
141
diff
changeset
|
836 # replaced by some other branch, so we need to verify they get marked as closed. |
22162380c4b9
Improve branch closing in the case of a single-rev replacement of one branch
Augie Fackler <durin42@gmail.com>
parents:
141
diff
changeset
|
837 for branch in check_deleted_branches: |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
838 closed = checkbranch(meta, r, branch) |
373
8c91e6a69d05
Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
368
diff
changeset
|
839 if closed is not None: |
8c91e6a69d05
Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
368
diff
changeset
|
840 deleted_branches[branch] = closed |
8c91e6a69d05
Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
368
diff
changeset
|
841 |
432
4bf90f8c9b7b
consolidate metadata calls from stupid and replay code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
424
diff
changeset
|
842 return deleted_branches |