Mercurial > hgsubversion
annotate hgsubversion/stupid.py @ 920:1be4ea4f3c0d
stupid: diff with the good revision when restoring branch
Converting history like:
r1 create trunk
r2 remove trunk
r3 make some unrelated commit
r4 restore trunk from r2
stupid mode would retrieve and apply the diff with r3 instead of the
one with r2. All the code deciding r2 is the actual parent was already
there, only the revision argument was not passed.
This fixes:
- test_delete_restore_trunk in comprehensive/test_stupid_pull.py
- test_delete_restore_trunk_stupid in comprehensive/test_verify_and_startrev.py
Tested on OSX 10.6 with macports svn-1.7.5. I can no longer test with
svn-1.6.
author | Patrick Mezard <patrick@mezard.eu> |
---|---|
date | Sun, 29 Jul 2012 13:13:56 +0200 |
parents | 39d45f2190ee |
children | dfb3afa6c619 |
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 |
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
25 # |
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) |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
238 store = patch.filestore() |
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) |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
242 ret = patch.patchbackend(ui, backend, patchfp, 0, touched) |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
243 if ret < 0: |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
244 raise BadPatchApply('patching failed') |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
245 if ret > 0: |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
246 raise BadPatchApply('patching succeeded with fuzz') |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
247 files = {} |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
248 for f in touched: |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
249 try: |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
250 data, mode, copied = store.getfile(f) |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
251 files[f] = data |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
252 except IOError: |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
253 files[f] = None |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
254 return files |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
255 finally: |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
256 store.close() |
d32735c507cd
stupid: use new patching facility introduced by adbf5e7df96d
Patrick Mezard <pmezard@gmail.com>
parents:
811
diff
changeset
|
257 |
532
b847e1a3ccd0
stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
531
diff
changeset
|
258 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
|
259 """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
|
260 |
de19a13edfa8
fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents:
107
diff
changeset
|
261 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
|
262 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
|
263 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
|
264 error. |
108
de19a13edfa8
fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents:
107
diff
changeset
|
265 """ |
109
460443a96497
fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
108
diff
changeset
|
266 try: |
536
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
267 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
|
268 except KeyError: |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
269 prev, pbranch, ppath = None, None, None |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
270 try: |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
271 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
|
272 # letting patch handle binaries sounded |
460443a96497
fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
108
diff
changeset
|
273 # 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
|
274 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
|
275 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
|
276 else: |
532
b847e1a3ccd0
stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
531
diff
changeset
|
277 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
|
278 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
|
279 deleted=True, ignore_type=True) |
460443a96497
fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
108
diff
changeset
|
280 if d: |
460443a96497
fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
108
diff
changeset
|
281 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
|
282 except svnwrap.SubversionRepoCanNotDiff: |
460443a96497
fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
108
diff
changeset
|
283 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
|
284 except svnwrap.SubversionException, e: |
0fe490ce2fbb
isolate all imports of Subversion modules in svnwrap.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
588
diff
changeset
|
285 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
|
286 raise |
460443a96497
fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
108
diff
changeset
|
287 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
|
288 if '\0' in d: |
f1919e1c35bf
fetch_command: cancel patching when encountering binary diffs
Patrick Mezard <pmezard@gmail.com>
parents:
168
diff
changeset
|
289 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
|
290 files_data = {} |
859
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
291 changed = parsediff(d) |
529
68667b627bd5
stupid: replace dicts with sets
Patrick Mezard <pmezard@gmail.com>
parents:
528
diff
changeset
|
292 # 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
|
293 # 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
|
294 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
|
295 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
|
296 if changed: |
811
ccefff0c4f91
stupid: extract old patching code into patchrepo()
Patrick Mezard <pmezard@gmail.com>
parents:
801
diff
changeset
|
297 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
|
298 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
|
299 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
|
300 else: |
de19a13edfa8
fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents:
107
diff
changeset
|
301 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
|
302 r.revnum) |
de19a13edfa8
fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents:
107
diff
changeset
|
303 |
528
052050ca59d6
replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents:
517
diff
changeset
|
304 unknown_files = set() |
108
de19a13edfa8
fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents:
107
diff
changeset
|
305 for p in r.paths: |
528
052050ca59d6
replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents:
517
diff
changeset
|
306 action = r.paths[p].action |
532
b847e1a3ccd0
stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
531
diff
changeset
|
307 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
|
308 continue |
532
b847e1a3ccd0
stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
531
diff
changeset
|
309 if branchpath: |
b847e1a3ccd0
stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
531
diff
changeset
|
310 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
|
311 else: |
052050ca59d6
replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents:
517
diff
changeset
|
312 p2 = p |
052050ca59d6
replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents:
517
diff
changeset
|
313 if p2 in parentctx: |
052050ca59d6
replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents:
517
diff
changeset
|
314 toucheds = [p2] |
052050ca59d6
replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents:
517
diff
changeset
|
315 else: |
108
de19a13edfa8
fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents:
107
diff
changeset
|
316 # 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
|
317 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
|
318 if action == 'R': |
052050ca59d6
replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents:
517
diff
changeset
|
319 # 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
|
320 unknown_files.update(toucheds) |
052050ca59d6
replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents:
517
diff
changeset
|
321 else: |
052050ca59d6
replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents:
517
diff
changeset
|
322 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
|
323 |
529
68667b627bd5
stupid: replace dicts with sets
Patrick Mezard <pmezard@gmail.com>
parents:
528
diff
changeset
|
324 touched_files.update(files_data) |
68667b627bd5
stupid: replace dicts with sets
Patrick Mezard <pmezard@gmail.com>
parents:
528
diff
changeset
|
325 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
|
326 |
860
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
327 # 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
|
328 # 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
|
329 # 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
|
330 # of svn API calls. |
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
331 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
|
332 property_files.discard('.') |
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
333 touched_files.discard('.') |
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
334 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
|
335 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
|
336 if f in parentctx: |
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
337 continue |
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
338 # 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
|
339 # 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
|
340 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
|
341 if kind == 'd': |
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
342 touched_files.discard(f) |
4cf20a687bff
stupid: ignore directories svn:mergeinfo in svn >= 1.7
Patrick Mezard <patrick@mezard.eu>
parents:
859
diff
changeset
|
343 |
532
b847e1a3ccd0
stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
531
diff
changeset
|
344 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
|
345 parentctx) |
108
de19a13edfa8
fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents:
107
diff
changeset
|
346 |
863
c24130e9ddb7
stupid: add comment noting why we track modified binary files
Augie Fackler <raf@durin42.com>
parents:
859
diff
changeset
|
347 # 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
|
348 # 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
|
349 # 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
|
350 # apply. |
859
1d07e86f5797
stupid: handle changes in svn 1.7 diff format
Patrick Mezard <patrick@mezard.eu>
parents:
837
diff
changeset
|
351 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
|
352 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
|
353 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
|
354 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
|
355 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
|
356 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
|
357 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
|
358 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
|
359 |
528
052050ca59d6
replay: disable maybeedit filtering, could discard copy records
Patrick Mezard <pmezard@gmail.com>
parents:
517
diff
changeset
|
360 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
|
361 pa = path |
532
b847e1a3ccd0
stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
531
diff
changeset
|
362 if branchpath: |
b847e1a3ccd0
stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents:
531
diff
changeset
|
363 pa = branchpath + '/' + path |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
364 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
|
365 isexe = 'x' in mode |
bab5bcbbb3dc
fetch_command: in stupid mode, load binary files when necessary
Patrick Mezard <pmezard@gmail.com>
parents:
127
diff
changeset
|
366 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
|
367 else: |
59f8603a6641
fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents:
128
diff
changeset
|
368 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
|
369 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
|
370 data = '' |
59f8603a6641
fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents:
128
diff
changeset
|
371 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
|
372 data = files_data[path] |
59f8603a6641
fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents:
128
diff
changeset
|
373 if islink: |
59f8603a6641
fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents:
128
diff
changeset
|
374 data = data[len('link '):] |
59f8603a6641
fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents:
128
diff
changeset
|
375 elif path in parentctx: |
59f8603a6641
fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents:
128
diff
changeset
|
376 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
|
377 |
108
de19a13edfa8
fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents:
107
diff
changeset
|
378 copied = copies.get(path) |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
379 # 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
|
380 # and this may actually imply a bug in getcopies |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
381 if copied not in parentctx.manifest(): |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
382 copied = None |
128
bab5bcbbb3dc
fetch_command: in stupid mode, load binary files when necessary
Patrick Mezard <pmezard@gmail.com>
parents:
127
diff
changeset
|
383 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
|
384 isexec=isexe, copied=copied) |
108
de19a13edfa8
fetch_command: extract diff code in a function
Patrick Mezard <pmezard@gmail.com>
parents:
107
diff
changeset
|
385 |
129
59f8603a6641
fetch_command: in stupid mode, load file content on demand
Patrick Mezard <pmezard@gmail.com>
parents:
128
diff
changeset
|
386 return list(touched_files), filectxfn |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
387 |
588
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
388 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
|
389 """Return a function detecting copies. |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
390 |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
391 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
|
392 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
|
393 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
|
394 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
|
395 "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
|
396 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
|
397 """ |
588
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
398 # cache changeset contexts and map them to source svn revisions |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
399 ctxs = {} |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
400 def getctx(branch, svnrev): |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
401 if svnrev in ctxs: |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
402 return ctxs[svnrev] |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
403 changeid = meta.get_parent_revision(svnrev + 1, branch, True) |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
404 ctx = None |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
405 if changeid != revlog.nullid: |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
406 ctx = meta.repo.changectx(changeid) |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
407 ctxs[svnrev] = ctx |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
408 return ctx |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
409 |
73
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
410 # filter copy information for current branch |
495
44bde69b6c49
stupid: detect renames with empty branchpath properly
Augie Fackler <durin42@gmail.com>
parents:
494
diff
changeset
|
411 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
|
412 copies = [] |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
413 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
|
414 if not e.copyfrom_path: |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
415 continue |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
416 if not path.startswith(branchpath): |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
417 continue |
588
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
418 # compute converted source path and revision |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
419 frompath, frombranch = meta.split_branch_path(e.copyfrom_path)[:2] |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
420 if frompath is None: |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
421 continue |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
422 fromctx = getctx(frombranch, e.copyfrom_rev) |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
423 if fromctx is None: |
73
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
424 continue |
588
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
425 destpath = path[len(branchpath):] |
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
426 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
|
427 |
163 | 428 copies.sort(reverse=True) |
73
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
429 exactcopies = dict(copies) |
101
a3b717e4abf5
Cleanups based on pyflakes output.
Augie Fackler <durin42@gmail.com>
parents:
98
diff
changeset
|
430 |
73
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
431 def finder(path): |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
432 if path in exactcopies: |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
433 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
|
434 # look for parent directory copy, longest first |
588
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
435 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
|
436 dest = dest + '/' |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
437 if not path.startswith(dest): |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
438 continue |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
439 sourcepath = source + '/' + path[len(dest):] |
588
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
440 return (source, sourcectx), sourcepath |
73
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
441 return None |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
442 |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
443 return finder |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
444 |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
445 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
|
446 """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
|
447 """ |
110
a4dcffaa6538
fetch_command: pass parent changectx instead of identifier
Patrick Mezard <pmezard@gmail.com>
parents:
109
diff
changeset
|
448 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
|
449 return {} |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
450 |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
451 # 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
|
452 # 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
|
453 # 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
|
454 # 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
|
455 # copy sources in revision info. |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
456 svncopies = {} |
588
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
457 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
|
458 for f in files: |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
459 copy = finder(f) |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
460 if copy: |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
461 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
|
462 if not svncopies: |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
463 return {} |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
464 |
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
465 # 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
|
466 hgcopies = {} |
588
2723152c8111
stupid: fix getcopies() logic
Patrick Mezard <pmezard@gmail.com>
parents:
583
diff
changeset
|
467 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
|
468 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
|
469 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
|
470 continue |
5e0dfe59d4c3
copies: fix under-reporting of copies in hg
Augie Fackler <durin42@gmail.com>
parents:
495
diff
changeset
|
471 hgcopies.update({k: v}) |
73
9c1b53abefcb
fetch_command: support svn copy detection in stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
63
diff
changeset
|
472 return hgcopies |
0
f2636cfed115
Initial import of hgsubversion into a public repository.
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
473 |
762
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
758
diff
changeset
|
474 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
|
475 """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
|
476 |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
477 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
|
478 to convert and never were. |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
479 """ |
762
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
758
diff
changeset
|
480 externals = svnexternals.parse(ui, parentctx) |
174
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
481 # 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
|
482 # 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
|
483 # 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
|
484 # 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
|
485 # revision in the common case. |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
486 dirs = set(externals) |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
487 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
|
488 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
|
489 dirs.add('') |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
490 else: |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
491 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
|
492 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
|
493 if e.action == 'D': |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
494 continue |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
495 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
|
496 continue |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
497 kind = svn.checkpath(path, r.revnum) |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
498 if kind != '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 path = path[len(branchprefix):] |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
501 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
|
502 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
|
503 # 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
|
504 # 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
|
505 continue |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
506 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
|
507 if k == 'd': |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
508 dirs.add((path + '/' + child).strip('/')) |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
509 |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
510 # Retrieve new or updated values |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
511 for dir in dirs: |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
512 try: |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
513 dpath = (branchpath and branchpath + '/' + dir) or dir |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
514 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
|
515 externals[dir] = values.get('svn:externals', '') |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
516 except IOError: |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
517 externals[dir] = '' |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
518 return externals |
f80132c5fea5
Convert svn:externals properties into a .hgsvnexternals file
Patrick Mezard <pmezard@gmail.com>
parents:
169
diff
changeset
|
519 |
239
e2214c8fc91f
Put all stupid stuff in it's own module (separate from fetch-command).
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
237
diff
changeset
|
520 |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
521 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
|
522 """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
|
523 |
ed3dd5bf45da
fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents:
76
diff
changeset
|
524 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
|
525 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
|
526 callable to retrieve individual file information. |
ed3dd5bf45da
fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents:
76
diff
changeset
|
527 """ |
87
b033d74be76b
fetch_command: in stupid non-diffy mode, take changed paths in account
Patrick Mezard <pmezard@gmail.com>
parents:
79
diff
changeset
|
528 files = [] |
110
a4dcffaa6538
fetch_command: pass parent changectx instead of identifier
Patrick Mezard <pmezard@gmail.com>
parents:
109
diff
changeset
|
529 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
|
530 # 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
|
531 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
|
532 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
|
533 files.append(path) |
88
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
534 else: |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
535 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
|
536 for path, e in r.paths.iteritems(): |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
537 if 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
|
538 continue |
417
8630d1ebcdb9
svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
416
diff
changeset
|
539 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
|
540 continue |
88
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
541 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
|
542 path = path[len(branchprefix):] |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
543 if kind == 'f': |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
544 files.append(path) |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
545 elif kind == 'd': |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
546 if e.action == 'M': |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
547 continue |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
548 dirpath = branchprefix + path |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
549 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
|
550 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
|
551 if path: |
1add57910c82
stupid: remove an incorrect, implicit assumption in fetch_branchrev()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
648
diff
changeset
|
552 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
|
553 else: |
1add57910c82
stupid: remove an incorrect, implicit assumption in fetch_branchrev()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
648
diff
changeset
|
554 childpath = child |
1add57910c82
stupid: remove an incorrect, implicit assumption in fetch_branchrev()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
648
diff
changeset
|
555 files.append(childpath) |
583
a016b253910b
stupid: handle directory replacement in very stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
574
diff
changeset
|
556 if e.action == 'R': |
a016b253910b
stupid: handle directory replacement in very stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
574
diff
changeset
|
557 # Check all files in replaced directory |
a016b253910b
stupid: handle directory replacement in very stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
574
diff
changeset
|
558 path = path + '/' |
a016b253910b
stupid: handle directory replacement in very stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
574
diff
changeset
|
559 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
|
560 else: |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
561 if path in parentctx: |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
562 files.append(path) |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
563 continue |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
564 # 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
|
565 path = path + '/' |
3b60f223893a
fetch_command: handle nullid parent in stupid non-diffy mode
Patrick Mezard <pmezard@gmail.com>
parents:
87
diff
changeset
|
566 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
|
567 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
|
568 |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
569 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
|
570 |
77
ed3dd5bf45da
fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents:
76
diff
changeset
|
571 def filectxfn(repo, memctx, path): |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
572 svnpath = path |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
573 if branchpath: |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
574 svnpath = branchpath + '/' + path |
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
575 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
|
576 isexec = 'x' in mode |
ed3dd5bf45da
fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents:
76
diff
changeset
|
577 islink = 'l' in mode |
ed3dd5bf45da
fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents:
76
diff
changeset
|
578 copied = copies.get(path) |
535
715d2e3e153b
stupid: port hack from stupid to moderately stupid mode
Patrick Mezard <pmezard@gmail.com>
parents:
532
diff
changeset
|
579 # 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
|
580 # 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
|
581 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
|
582 copied = None |
77
ed3dd5bf45da
fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents:
76
diff
changeset
|
583 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
|
584 isexec=isexec, copied=copied) |
ed3dd5bf45da
fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents:
76
diff
changeset
|
585 |
ed3dd5bf45da
fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents:
76
diff
changeset
|
586 return files, filectxfn |
ed3dd5bf45da
fetch_command: bypass export3() and checkout manually
Patrick Mezard <pmezard@gmail.com>
parents:
76
diff
changeset
|
587 |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
588 def checkbranch(meta, r, branch): |
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
589 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
|
590 if not branchedits: |
8c91e6a69d05
Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
368
diff
changeset
|
591 return None |
8c91e6a69d05
Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
368
diff
changeset
|
592 branchtip = branchedits[0][1] |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
593 for child in meta.repo[branchtip].children(): |
375
af9fc01299b4
Make branch closing more Mercurial-like.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
374
diff
changeset
|
594 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
|
595 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
|
596 return None |
8c91e6a69d05
Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
368
diff
changeset
|
597 return branchtip |
8c91e6a69d05
Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
368
diff
changeset
|
598 |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
599 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
|
600 '''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
|
601 to their branch path. |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
602 ''' |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
603 branches = {} |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
604 paths_need_discovery = [] |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
605 for p in paths: |
540
8dc759dc9ca9
svnmeta: remove split_branch_tag() exacttag argument
Patrick Mezard <pmezard@gmail.com>
parents:
536
diff
changeset
|
606 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
|
607 if relpath is not None: |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
608 branches[branch] = branchpath |
517
ef288fb7f2fe
svnmeta: is_path_tag() is really get_path_tag()
Patrick Mezard <pmezard@gmail.com>
parents:
514
diff
changeset
|
609 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
|
610 ln = meta.localname(p) |
377
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
611 # 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
|
612 # already updated the branch map |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
613 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
|
614 branches[ln] = p |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
615 else: |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
616 paths_need_discovery.append(p) |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
617 |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
618 if not paths_need_discovery: |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
619 return branches |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
620 |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
621 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
|
622 paths_need_discovery.sort() |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
623 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
|
624 actually_files = [] |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
625 while paths_need_discovery: |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
626 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
|
627 path_could_be_file = True |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
628 ind = 0 |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
629 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
|
630 if op.startswith(p): |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
631 path_could_be_file = False |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
632 ind += 1 |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
633 if path_could_be_file: |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
634 if checkpath(p, revnum) == 'f': |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
635 actually_files.append(p) |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
636 # 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
|
637 # 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
|
638 # seems to be the best option. |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
639 elif paths[p].copyfrom_path and not p.startswith('tags/'): |
832
e9af7eba88db
globally: clean up whitespace around operators and commas to conform with PEP8
Yonggang Luo <luoyonggang@gmail.com>
parents:
831
diff
changeset
|
640 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
|
641 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
|
642 if x[1] == 'f']) |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
643 |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
644 if not actually_files: |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
645 continue |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
646 |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
647 filepaths = [p.split('/') for p in actually_files] |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
648 filepaths = [(len(p), p) for p in filepaths] |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
649 filepaths.sort() |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
650 filepaths = [p[1] for p in filepaths] |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
651 while filepaths: |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
652 path = filepaths.pop(0) |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
653 parentdir = '/'.join(path[:-1]) |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
654 filepaths = [p for p in filepaths if not '/'.join(p).startswith(parentdir)] |
417
8630d1ebcdb9
svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
416
diff
changeset
|
655 branchpath = meta.normalize(parentdir) |
377
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
656 if branchpath.startswith('tags/'): |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
657 continue |
417
8630d1ebcdb9
svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
416
diff
changeset
|
658 branchname = meta.localname(branchpath) |
377
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
659 if branchpath.startswith('trunk/'): |
417
8630d1ebcdb9
svnmeta: deprivatize a bunch of member functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
416
diff
changeset
|
660 branches[meta.localname('trunk')] = 'trunk' |
377
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
661 continue |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
662 if branchname and branchname.startswith('../'): |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
663 continue |
7e9269555e72
Move HgChangeReceiver.branches_in_paths() to the stupid module.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
376
diff
changeset
|
664 branches[branchname] = branchpath |
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 |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
701 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
|
702 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
|
703 deleted_branches[branch] = closed |
237
c90cfa665b81
Cope with date-less revisions.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
234
diff
changeset
|
704 |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
705 date = meta.fixdate(r.date) |
472
ba65e97538d1
stupid: take tbdelta closed branches in account
Patrick Mezard <pmezard@gmail.com>
parents:
452
diff
changeset
|
706 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
|
707 for b in branches: |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
708 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
|
709 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
|
710 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
|
711 if kind != 'd': |
536
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
712 if not tag: |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
713 # 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
|
714 # revision and remove everything. |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
715 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
|
716 continue |
179
a336e3e82648
Fetch: add a filemap argument for use in converting old repositories to
Graham Booker <gbooker@cod3r.com>
parents:
176
diff
changeset
|
717 |
861
6fc7f74f0cf6
stupid: force non-incremental mode for unrelated branches creation
Patrick Mezard <patrick@mezard.eu>
parents:
860
diff
changeset
|
718 # 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
|
719 # 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
|
720 # 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
|
721 # 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
|
722 # the latter for now. |
6fc7f74f0cf6
stupid: force non-incremental mode for unrelated branches creation
Patrick Mezard <patrick@mezard.eu>
parents:
860
diff
changeset
|
723 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
|
724 parentctx.rev() != node.nullrev) |
648
8fb38602e3ed
stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
640
diff
changeset
|
725 |
8fb38602e3ed
stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
640
diff
changeset
|
726 if incremental: |
8fb38602e3ed
stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
640
diff
changeset
|
727 try: |
8fb38602e3ed
stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
640
diff
changeset
|
728 files_touched, filectxfn2 = diff_branchrev( |
8fb38602e3ed
stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
640
diff
changeset
|
729 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
|
730 except BadPatchApply, e: |
8fb38602e3ed
stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
640
diff
changeset
|
731 # 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
|
732 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
|
733 incremental = False |
8fb38602e3ed
stupid: always fetch the entire first revision
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
640
diff
changeset
|
734 if not incremental: |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
735 files_touched, filectxfn2 = fetch_branchrev( |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
736 svn, meta, b, branches[b], r, parentctx) |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
737 |
757
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
739
diff
changeset
|
738 externals = {} |
499
1fd3cfa47c5e
Support for single-directory clones.
Augie Fackler <durin42@gmail.com>
parents:
497
diff
changeset
|
739 if meta.layout != 'single': |
762
c31a1f92e1c6
svnexternals: preliminary support for subrepos based externals
Patrick Mezard <pmezard@gmail.com>
parents:
758
diff
changeset
|
740 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
|
741 externals = svnexternals.getchanges(ui, meta.repo, parentctx, |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
739
diff
changeset
|
742 externals) |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
739
diff
changeset
|
743 files_touched.extend(externals) |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
744 |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
745 def filectxfn(repo, memctx, path): |
757
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
739
diff
changeset
|
746 if path in externals: |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
739
diff
changeset
|
747 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
|
748 raise IOError(errno.ENOENT, 'no externals') |
757
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
739
diff
changeset
|
749 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
|
750 islink=False, isexec=False, |
6e18d9ab6557
pull: stop handling .hgsvnexternals explicitely in memctx
Patrick Mezard <pmezard@gmail.com>
parents:
739
diff
changeset
|
751 copied=None) |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
752 for bad in bad_branch_paths[b]: |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
753 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
|
754 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
|
755 return filectxfn2(repo, memctx, path) |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
756 |
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
|
757 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
|
758 files_touched.remove('') |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
759 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
|
760 for f in excluded: |
f48cd62a9de4
fetch_command: fix coding style
Patrick Mezard <pmezard@gmail.com>
parents:
187
diff
changeset
|
761 files_touched.remove(f) |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
762 |
536
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
763 if b: |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
764 # 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
|
765 # 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
|
766 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
|
767 b not in meta.branches |
547
9e6499c415a9
tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents:
540
diff
changeset
|
768 and b not in meta.repo.branchtags() |
9e6499c415a9
tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents:
540
diff
changeset
|
769 and not files_touched): |
536
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
770 continue |
460eb781d840
Handle subdirectory tags in stupid mode (issue119)
Patrick Mezard <pmezard@gmail.com>
parents:
535
diff
changeset
|
771 |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
772 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
|
773 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
|
774 continue |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
775 |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
776 for f in files_touched: |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
777 if f: |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
778 # 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
|
779 # something is very wrong |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
780 assert f[0] != '/' |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
781 |
422
6086363e8230
svnmeta: move util.build_extra() to SVNMeta.genextra()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
418
diff
changeset
|
782 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
|
783 if tag: |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
784 if parentctx.node() == node.nullid: |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
785 continue |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
786 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
|
787 'close': 1}) |
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
788 |
640
a3d20d6e96b0
stupid: handle branch mapping.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
634
diff
changeset
|
789 origbranch = extra.get('branch', None) |
574
8e025a6f0db4
add basic branchmap functionality, to rename branches
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
557
diff
changeset
|
790 meta.mapbranch(extra) |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
791 current_ctx = context.memctx(meta.repo, |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
792 [parentctx.node(), revlog.nullid], |
769
cc1d4aa3ba41
configurable substitution for empty commit message (fixes #195)
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
762
diff
changeset
|
793 r.message or util.default_commit_msg(ui), |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
794 files_touched, |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
795 filectxfn, |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
796 meta.authors[r.author], |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
797 date, |
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
798 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
|
799 ha = meta.repo.svn_commitctx(current_ctx) |
401
9e87f7047bf1
stupid: simplify stupid committing code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
377
diff
changeset
|
800 |
447
0d3b5acb1d51
tags: handle edits to tags as gracefully as possible
Augie Fackler <durin42@gmail.com>
parents:
444
diff
changeset
|
801 if not tag: |
640
a3d20d6e96b0
stupid: handle branch mapping.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
634
diff
changeset
|
802 if (not origbranch in meta.branches |
a3d20d6e96b0
stupid: handle branch mapping.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
634
diff
changeset
|
803 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
|
804 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
|
805 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
|
806 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
|
807 meta.movetag(tag, ha, r, date) |
547
9e6499c415a9
tags: fix files edited during tag creation
Augie Fackler <durin42@gmail.com>
parents:
540
diff
changeset
|
808 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
|
809 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
|
810 |
8c91e6a69d05
Get rid of duplicate branch closing detection code for stupid mode.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
368
diff
changeset
|
811 # 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
|
812 # 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
|
813 for branch in check_deleted_branches: |
416
cd6317fe70be
invert the svnmeta/editor relationship
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
415
diff
changeset
|
814 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
|
815 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
|
816 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
|
817 |
432
4bf90f8c9b7b
consolidate metadata calls from stupid and replay code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
424
diff
changeset
|
818 return deleted_branches |