annotate hgsubversion/stupid.py @ 864:39d45f2190ee

Merge
author Augie Fackler <raf@durin42.com>
date Thu, 19 Apr 2012 17:30:08 -0500
parents 6fc7f74f0cf6 c24130e9ddb7
children 1be4ea4f3c0d
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
532
b847e1a3ccd0 stupid: use real branch path in diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 531
diff changeset
274 d = svn.get_unified_diff(branchpath, r.revnum, deleted=False,
109
460443a96497 fetch_command: only raise BadPatchApply() from stupid_diff_branchrev()
Patrick Mezard <pmezard@gmail.com>
parents: 108
diff changeset
275 ignore_type=False)
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