comparison hgext/convert/p4.py @ 25751:17a9da909186

convert: handle copies when converting from Perforce (issue4744)
author Eugene Baranov <eug.baranov@gmail.com>
date Wed, 08 Jul 2015 18:05:27 +0100
parents baea47cafe75
children 648323f41a89
comparison
equal deleted inserted replaced
25750:c9093d4d1ff6 25751:17a9da909186
34 34
35 self.p4changes = {} 35 self.p4changes = {}
36 self.heads = {} 36 self.heads = {}
37 self.changeset = {} 37 self.changeset = {}
38 self.files = {} 38 self.files = {}
39 self.copies = {}
39 self.tags = {} 40 self.tags = {}
40 self.lastbranch = {} 41 self.lastbranch = {}
41 self.parent = {} 42 self.parent = {}
42 self.encoding = "latin_1" 43 self.encoding = "latin_1"
43 self.depotname = {} # mapping from local name to depot name 44 self.depotname = {} # mapping from local name to depot name
45 self.localname = {} # mapping from depot name to local name
44 self.re_type = re.compile( 46 self.re_type = re.compile(
45 "([a-z]+)?(text|binary|symlink|apple|resource|unicode|utf\d+)" 47 "([a-z]+)?(text|binary|symlink|apple|resource|unicode|utf\d+)"
46 "(\+\w+)?$") 48 "(\+\w+)?$")
47 self.re_keywords = re.compile( 49 self.re_keywords = re.compile(
48 r"\$(Id|Header|Date|DateTime|Change|File|Revision|Author)" 50 r"\$(Id|Header|Date|DateTime|Change|File|Revision|Author)"
126 date=util.datestr(date, '%Y-%m-%d %H:%M:%S %1%2'), 128 date=util.datestr(date, '%Y-%m-%d %H:%M:%S %1%2'),
127 parents=parents, desc=desc, branch='', 129 parents=parents, desc=desc, branch='',
128 extra={"p4": change}) 130 extra={"p4": change})
129 131
130 files = [] 132 files = []
133 copies = {}
134 copiedfiles = []
131 i = 0 135 i = 0
132 while ("depotFile%d" % i) in d and ("rev%d" % i) in d: 136 while ("depotFile%d" % i) in d and ("rev%d" % i) in d:
133 oldname = d["depotFile%d" % i] 137 oldname = d["depotFile%d" % i]
134 filename = None 138 filename = None
135 for v in vieworder: 139 for v in vieworder:
137 filename = views[v] + oldname[len(v):] 141 filename = views[v] + oldname[len(v):]
138 break 142 break
139 if filename: 143 if filename:
140 files.append((filename, d["rev%d" % i])) 144 files.append((filename, d["rev%d" % i]))
141 self.depotname[filename] = oldname 145 self.depotname[filename] = oldname
146 if (d.get("action%d" % i) == "move/add"):
147 copiedfiles.append(filename)
148 self.localname[oldname] = filename
142 i += 1 149 i += 1
150
151 # Collect information about copied files
152 for filename in copiedfiles:
153 oldname = self.depotname[filename]
154
155 flcmd = 'p4 -G filelog %s' \
156 % util.shellquote(oldname)
157 flstdout = util.popen(flcmd, mode='rb')
158
159 copiedfilename = None
160 for d in loaditer(flstdout):
161 copiedoldname = None
162
163 i = 0
164 while ("change%d" % i) in d:
165 if (d["change%d" % i] == change and
166 d["action%d" % i] == "move/add"):
167 j = 0
168 while ("file%d,%d" % (i, j)) in d:
169 if d["how%d,%d" % (i, j)] == "moved from":
170 copiedoldname = d["file%d,%d" % (i, j)]
171 break
172 j += 1
173 i += 1
174
175 if copiedoldname and copiedoldname in self.localname:
176 copiedfilename = self.localname[copiedoldname]
177 break
178
179 if copiedfilename:
180 copies[filename] = copiedfilename
181 else:
182 ui.warn(_("cannot find source for copied file: %s@%s\n")
183 % (filename, change))
184
143 self.changeset[change] = c 185 self.changeset[change] = c
144 self.files[change] = files 186 self.files[change] = files
187 self.copies[change] = copies
145 lastid = change 188 lastid = change
146 189
147 if lastid: 190 if lastid:
148 self.heads = [lastid] 191 self.heads = [lastid]
149 192
196 return contents, mode 239 return contents, mode
197 240
198 def getchanges(self, rev, full): 241 def getchanges(self, rev, full):
199 if full: 242 if full:
200 raise util.Abort(_("convert from p4 do not support --full")) 243 raise util.Abort(_("convert from p4 do not support --full"))
201 return self.files[rev], {}, set() 244 return self.files[rev], self.copies[rev], set()
202 245
203 def getcommit(self, rev): 246 def getcommit(self, rev):
204 return self.changeset[rev] 247 return self.changeset[rev]
205 248
206 def gettags(self): 249 def gettags(self):