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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
fdc249cd1a0a Combine sort and reverse.
Martin Geisler <mg@daimi.au.dk>
parents: 158
diff changeset
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
b5413ff66f52 stupid: 80col OCD
Augie Fackler <durin42@gmail.com>
parents: 488
diff changeset
680 # This next block might be needed, but for now I'm omitting it until it
b5413ff66f52 stupid: 80col OCD
Augie Fackler <durin42@gmail.com>
parents: 488
diff changeset
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
b5413ff66f52 stupid: 80col OCD
Augie Fackler <durin42@gmail.com>
parents: 488
diff changeset
686 # We've go a branch that contains other branches. We have to be careful
b5413ff66f52 stupid: 80col OCD
Augie Fackler <durin42@gmail.com>
parents: 488
diff changeset
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