Mercurial > hg
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): |