Mercurial > hgsubversion
annotate hgsubversion/stupid.py @ 1045:67e11b650e94
handle invalid UTF-8 in commit messages consistently
312f36a425f0 fixed this for replay, but not for stupid mode; we
address this by consolidating our means of generating a Mercurial
commit message in a single function in 'util.py'.
author | Dan Villiom Podlaski Christiansen <dan@cabo.dk> |
---|---|
date | Thu, 08 Aug 2013 09:38:55 +0200 |
parents | 4e4c47351102 |
children | 36fe4b316a6b |
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. |
1031
4e4c47351102
stupid: use layouts library for detecting branch mapping
David Schleimer <dschleimer@fb.com>
parents:
1028
diff
changeset
|
649 elif paths[p].copyfrom_path and not meta.get_path_tag(p): |
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 |
1031
4e4c47351102
stupid: use layouts library for detecting branch mapping
David Schleimer <dschleimer@fb.com>
parents:
1028
diff
changeset
|
657 for path in actually_files: |
4e4c47351102
stupid: use layouts library for detecting branch mapping
David Schleimer <dschleimer@fb.com>
parents:
1028
diff
changeset
|
658 if meta.get_path_tag(path): |
377
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
659 continue |
1031
4e4c47351102
stupid: use layouts library for detecting branch mapping
David Schleimer <dschleimer@fb.com>
parents:
1028
diff
changeset
|
660 fpath, branch, bpath = meta.split_branch_path(path, existing=False) |
4e4c47351102
stupid: use layouts library for detecting branch mapping
David Schleimer <dschleimer@fb.com>
parents:
1028
diff
changeset
|
661 if bpath is None: |
377
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
662 continue |
1031
4e4c47351102
stupid: use layouts library for detecting branch mapping
David Schleimer <dschleimer@fb.com>
parents:
1028
diff
changeset
|
663 branches[branch] = bpath |
4e4c47351102
stupid: use layouts library for detecting branch mapping
David Schleimer <dschleimer@fb.com>
parents:
1028
diff
changeset
|
664 |
377
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
665 return branches |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
666 |
787
4bbc6bf947f5
replay: fetch full revision at most once per run (issue252)
Patrick Mezard <pmezard@gmail.com>
parents:
769
diff
changeset
|
667 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
|
668 # 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
|
669 |
822
033b86e0f56d
stupid/filemap: disable this since it doesn't currently work
Augie Fackler <durin42@gmail.com>
parents:
814
diff
changeset
|
670 if meta.filemap: |
033b86e0f56d
stupid/filemap: disable this since it doesn't currently work
Augie Fackler <durin42@gmail.com>
parents:
814
diff
changeset
|
671 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
|
672 |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
673 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
|
674 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
|
675 brpaths = branches.values() |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
200
diff
changeset
|
676 bad_branch_paths = {} |
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
200
diff
changeset
|
677 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
|
678 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
|
679 |
490 | 680 # This next block might be needed, but for now I'm omitting it until it |
681 # 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
|
682 # 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
|
683 # 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
|
684 # 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
|
685 |
490 | 686 # We've go a branch that contains other branches. We have to be careful |
687 # 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
|
688 for existingbr in meta.branches: |
417
8630d1ebcdb9
svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
416
diff
changeset
|
689 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
|
690 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
|
691 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
|
692 |
8c91e6a69d05
Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
368
diff
changeset
|
693 deleted_branches = {} |
203
907c160c6289
Refactor branch handling to be much more dynamic (and hopefully robust).
Augie Fackler <durin42@gmail.com>
parents:
200
diff
changeset
|
694 for p in r.paths: |
547
9e6499c415a9
tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents:
540
diff
changeset
|
695 tag = meta.get_path_tag(p) |
9e6499c415a9
tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents:
540
diff
changeset
|
696 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
|
697 continue |
417
8630d1ebcdb9
svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
416
diff
changeset
|
698 branch = meta.localname(p) |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
699 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
|
700 continue |
952
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
701 # 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
|
702 # 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
|
703 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
|
704 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
|
705 frompath, existing=False)[:2] |
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
706 if frompath == '': |
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
707 fromnode = meta.get_parent_revision( |
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
708 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
|
709 if fromnode != node.nullid: |
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
710 fromctx = meta.repo[fromnode] |
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
711 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
|
712 r.revnum, branch, exact=True)] |
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
713 if util.isancestor(pctx, fromctx): |
9c3b4f59e7e6
stupid: do not close branch upon branch-wide revert
Patrick Mezard <patrick@mezard.eu>
parents:
944
diff
changeset
|
714 continue |
1028
c4b25a903ad3
layouts: consistently return None for default branch
David Schleimer <dschleimer@fb.com>
parents:
952
diff
changeset
|
715 closed = checkbranch(meta, r, branch) |
c4b25a903ad3
layouts: consistently return None for default branch
David Schleimer <dschleimer@fb.com>
parents:
952
diff
changeset
|
716 if closed is not None: |
c4b25a903ad3
layouts: consistently return None for default branch
David Schleimer <dschleimer@fb.com>
parents:
952
diff
changeset
|
717 deleted_branches[branch] = closed |
237
c90cfa665b81
Cope with date-less revisions.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
234
diff
changeset
|
718 |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
719 date = meta.fixdate(r.date) |
472
ba65e97538d1
stupid: take tbdelta closed branches in account
Patrick Mezard <pmezard@gmail.com>
parents:
452
diff
changeset
|
720 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
|
721 for b in branches: |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
722 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
|
723 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
|
724 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
|
725 if kind != 'd': |
536
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
726 if not tag: |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
727 # 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
|
728 # revision and remove everything. |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
729 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
|
730 continue |
179
a336e3e82648
Fetch: add a filemap argument for use in converting old repositories to
Graham Booker <gbooker@cod3r.com>
parents:
176
diff
changeset
|
731 |
861
6fc7f74f0cf6
stupid: force non-incremental mode for unrelated branches creation
Patrick Mezard <patrick@mezard.eu>
parents:
860
diff
changeset
|
732 # 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
|
733 # 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
|
734 # 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
|
735 # 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
|
736 # the latter for now. |
6fc7f74f0cf6
stupid: force non-incremental mode for unrelated branches creation
Patrick Mezard <patrick@mezard.eu>
parents:
860
diff
changeset
|
737 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
|
738 parentctx.rev() != node.nullrev) |
648
8fb38602e3ed
stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
640
diff
changeset
|
739 |
8fb38602e3ed
stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
640
diff
changeset
|
740 if incremental: |
8fb38602e3ed
stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
640
diff
changeset
|
741 try: |
8fb38602e3ed
stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
640
diff
changeset
|
742 files_touched, filectxfn2 = diff_branchrev( |
8fb38602e3ed
stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
640
diff
changeset
|
743 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
|
744 except BadPatchApply, e: |
8fb38602e3ed
stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
640
diff
changeset
|
745 # 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
|
746 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
|
747 incremental = False |
8fb38602e3ed
stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
640
diff
changeset
|
748 if not incremental: |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
749 files_touched, filectxfn2 = fetch_branchrev( |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
750 svn, meta, b, branches[b], r, parentctx) |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
751 |
757
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
739
diff
changeset
|
752 externals = {} |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
753 if meta.layout != 'single': |
762
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
758
diff
changeset
|
754 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
|
755 externals = svnexternals.getchanges(ui, meta.repo, parentctx, |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
739
diff
changeset
|
756 externals) |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
739
diff
changeset
|
757 files_touched.extend(externals) |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
758 |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
759 def filectxfn(repo, memctx, path): |
757
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
739
diff
changeset
|
760 if path in externals: |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
739
diff
changeset
|
761 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
|
762 raise IOError(errno.ENOENT, 'no externals') |
757
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
739
diff
changeset
|
763 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
|
764 islink=False, isexec=False, |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
739
diff
changeset
|
765 copied=None) |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
766 for bad in bad_branch_paths[b]: |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
767 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
|
768 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
|
769 return filectxfn2(repo, memctx, path) |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
770 |
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
|
771 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
|
772 files_touched.remove('') |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
773 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
|
774 for f in excluded: |
f48cd62a9de4
fetch_command: fix coding style
Patrick Mezard <pmezard@gmail.com>
parents:
187
diff
changeset
|
775 files_touched.remove(f) |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
776 |
536
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
777 if b: |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
778 # 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
|
779 # 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
|
780 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
|
781 b not in meta.branches |
547
9e6499c415a9
tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents:
540
diff
changeset
|
782 and b not in meta.repo.branchtags() |
9e6499c415a9
tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents:
540
diff
changeset
|
783 and not files_touched): |
536
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
784 continue |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
785 |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
786 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
|
787 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
|
788 continue |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
789 |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
790 for f in files_touched: |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
791 if f: |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
792 # 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
|
793 # something is very wrong |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
794 assert f[0] != '/' |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
795 |
422
6086363e8230
svnmeta: move util.build_extra() to SVNMeta.genextra()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
418
diff
changeset
|
796 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
|
797 if tag: |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
798 if parentctx.node() == node.nullid: |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
799 continue |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
800 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
|
801 'close': 1}) |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
802 |
640
a3d20d6e96b0
stupid: handle branch mapping.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
634
diff
changeset
|
803 origbranch = extra.get('branch', None) |
574
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
557
diff
changeset
|
804 meta.mapbranch(extra) |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
805 current_ctx = context.memctx(meta.repo, |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
806 [parentctx.node(), revlog.nullid], |
1045
67e11b650e94
handle invalid UTF-8 in commit messages consistently
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents:
1031
diff
changeset
|
807 util.getmessage(ui, r), |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
808 files_touched, |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
809 filectxfn, |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
810 meta.authors[r.author], |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
811 date, |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
812 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
|
813 ha = meta.repo.svn_commitctx(current_ctx) |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
814 |
447
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
815 if not tag: |
640
a3d20d6e96b0
stupid: handle branch mapping.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
634
diff
changeset
|
816 if (not origbranch in meta.branches |
a3d20d6e96b0
stupid: handle branch mapping.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
634
diff
changeset
|
817 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
|
818 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
|
819 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
|
820 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
|
821 meta.movetag(tag, ha, r, date) |
547
9e6499c415a9
tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents:
540
diff
changeset
|
822 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
|
823 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
|
824 |
8c91e6a69d05
Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
368
diff
changeset
|
825 # 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
|
826 # 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
|
827 for branch in check_deleted_branches: |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
828 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
|
829 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
|
830 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
|
831 |
432
4bf90f8c9b7b
consolidate metadata calls from stupid and replay code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
424
diff
changeset
|
832 return deleted_branches |