comparison hgsubversion/svnmeta.py @ 517:ef288fb7f2fe

svnmeta: is_path_tag() is really get_path_tag() Enforce that returned tags are non-empty.
author Patrick Mezard <pmezard@gmail.com>
date Sat, 16 Jan 2010 17:25:09 +0100
parents 1fd3cfa47c5e
children 247110c633f7
comparison
equal deleted inserted replaced
516:f089f46729ee 517:ef288fb7f2fe
227 path = path[len(self.subdir):] 227 path = path[len(self.subdir):]
228 if path and path[0] == '/': 228 if path and path[0] == '/':
229 path = path[1:] 229 path = path[1:]
230 return path 230 return path
231 231
232 def is_path_tag(self, path): 232 def get_path_tag(self, path):
233 """If path could represent the path to a tag, returns the potential tag 233 """If path could represent the path to a tag, returns the
234 name. Otherwise, returns False. 234 potential (non-empty) tag name. Otherwise, returns None
235 235
236 Note that it's only a tag if it was copied from the path '' in a branch 236 Note that it's only a tag if it was copied from the path '' in a branch
237 (or tag) we have, for our purposes. 237 (or tag) we have, for our purposes.
238 """ 238 """
239 if self.layout == 'single': 239 if self.layout != 'single':
240 return False 240 path = self.normalize(path)
241 path = self.normalize(path) 241 for tagspath in self.tag_locations:
242 for tagspath in self.tag_locations: 242 if path.startswith(tagspath + '/'):
243 onpath = path.startswith(tagspath) 243 tag = path[len(tagspath) + 1:]
244 longer = len(path) > len('%s/' % tagspath) 244 if tag:
245 if path and onpath and longer: 245 return tag
246 tag, subpath = path[len(tagspath) + 1:], '' 246 return None
247 return tag
248 return False
249 247
250 def split_branch_path(self, path, existing=True): 248 def split_branch_path(self, path, existing=True):
251 """Figure out which branch inside our repo this path represents, and 249 """Figure out which branch inside our repo this path represents, and
252 also figure out which path inside that branch it is. 250 also figure out which path inside that branch it is.
253 251
258 known. Server-side branch path should be relative to our subdirectory. 256 known. Server-side branch path should be relative to our subdirectory.
259 """ 257 """
260 path = self.normalize(path) 258 path = self.normalize(path)
261 if self.layout == 'single': 259 if self.layout == 'single':
262 return (path, None, '') 260 return (path, None, '')
263 if self.is_path_tag(path): 261 tag = self.get_path_tag(path)
264 tag = self.is_path_tag(path) 262 if tag:
265 matched = [t for t in self.tags.iterkeys() if tag.startswith(t+'/')] 263 matched = [t for t in self.tags.iterkeys() if tag.startswith(t+'/')]
266 if not matched: 264 if not matched:
267 return None, None, None 265 return None, None, None
268 matched.sort(cmp=lambda x,y: cmp(len(x),len(y)), reverse=True) 266 matched.sort(cmp=lambda x,y: cmp(len(x),len(y)), reverse=True)
269 brpath = tag[len(matched[0])+1:] 267 brpath = tag[len(matched[0])+1:]
297 return path, ln, test 295 return path, ln, test
298 296
299 def _determine_parent_branch(self, p, src_path, src_rev, revnum): 297 def _determine_parent_branch(self, p, src_path, src_rev, revnum):
300 if src_path is not None: 298 if src_path is not None:
301 src_file, src_branch = self.split_branch_path(src_path)[:2] 299 src_file, src_branch = self.split_branch_path(src_path)[:2]
302 src_tag = self.is_path_tag(src_path) 300 src_tag = self.get_path_tag(src_path)
303 if src_tag != False or src_file == '': # case 2 301 if src_tag or src_file == '':
304 ln = self.localname(p) 302 ln = self.localname(p)
305 if src_tag != False and src_tag in self.tags: 303 if src_tag and src_tag in self.tags:
306 ci = self.repo[self.tags[src_tag]].extra()['convert_revision'] 304 ci = self.repo[self.tags[src_tag]].extra()['convert_revision']
307 src_rev, src_branch, = self.parse_converted_revision(ci) 305 src_rev, src_branch, = self.parse_converted_revision(ci)
308 return {ln: (src_branch, src_rev, revnum)} 306 return {ln: (src_branch, src_rev, revnum)}
309 return {} 307 return {}
310 308
348 return None, None 346 return None, None
349 347
350 def get_parent_revision(self, number, branch): 348 def get_parent_revision(self, number, branch):
351 '''Get the parent revision hash for a commit on a specific branch. 349 '''Get the parent revision hash for a commit on a specific branch.
352 ''' 350 '''
353 tag = self.is_path_tag(self.remotename(branch)) 351 tag = self.get_path_tag(self.remotename(branch))
354 limitedtags = maps.TagMap(self.repo, endrev=number-1) 352 limitedtags = maps.TagMap(self.repo, endrev=number-1)
355 if tag and tag in limitedtags: 353 if tag and tag in limitedtags:
356 ha = limitedtags[tag] 354 ha = limitedtags[tag]
357 return ha 355 return ha
358 r, br = self.get_parent_svn_branch_and_rev(number, branch) 356 r, br = self.get_parent_svn_branch_and_rev(number, branch)
382 added_branches = {} 380 added_branches = {}
383 added_tags = {} 381 added_tags = {}
384 self.closebranches = set() 382 self.closebranches = set()
385 tags_to_delete = set() 383 tags_to_delete = set()
386 for p in sorted(paths): 384 for p in sorted(paths):
387 t_name = self.is_path_tag(p) 385 t_name = self.get_path_tag(p)
388 if t_name != False: 386 if t_name:
389 src_p, src_rev = paths[p].copyfrom_path, paths[p].copyfrom_rev 387 src_p, src_rev = paths[p].copyfrom_path, paths[p].copyfrom_rev
390 # if you commit to a tag, I'm calling you stupid and ignoring 388 # if you commit to a tag, I'm calling you stupid and ignoring
391 # you. 389 # you.
392 if src_p is not None and src_rev is not None: 390 if src_p is not None and src_rev is not None:
393 file, branch = self.split_branch_path(src_p)[:2] 391 file, branch = self.split_branch_path(src_p)[:2]
394 if file is None: 392 if file is None:
395 # some crazy people make tags from other tags 393 # some crazy people make tags from other tags
396 from_tag = self.is_path_tag(src_p) 394 from_tag = self.get_path_tag(src_p)
397 if not from_tag: 395 if not from_tag:
398 continue 396 continue
399 if from_tag in self.tags: 397 if from_tag in self.tags:
400 ci = self.repo[self.tags[from_tag]].extra()['convert_revision'] 398 ci = self.repo[self.tags[from_tag]].extra()['convert_revision']
401 src_rev, branch, = self.parse_converted_revision(ci) 399 src_rev, branch, = self.parse_converted_revision(ci)
525 branches.setdefault(b, []).append(('add', tag, r)) 523 branches.setdefault(b, []).append(('add', tag, r))
526 for tag, branch in delta[1].iteritems(): 524 for tag, branch in delta[1].iteritems():
527 branches.setdefault(branch, []).append(('rm', tag, None)) 525 branches.setdefault(branch, []).append(('rm', tag, None))
528 526
529 for b, tags in branches.iteritems(): 527 for b, tags in branches.iteritems():
530 fromtag = self.is_path_tag(self.remotename(b)) 528 fromtag = self.get_path_tag(self.remotename(b))
531 # modify parent's .hgtags source 529 # modify parent's .hgtags source
532 parent = self.repo[self.get_parent_revision(rev.revnum, b)] 530 parent = self.repo[self.get_parent_revision(rev.revnum, b)]
533 if '.hgtags' not in parent: 531 if '.hgtags' not in parent:
534 src = '' 532 src = ''
535 else: 533 else: