comparison svncommand.py @ 33:a9c15cae50e5

Faster append-only revmap implementation.
author Andreas Hartmetz <ahartmetz@gmail.com>
date Wed, 15 Oct 2008 21:47:48 -0400
parents 9c481cae0428
children 50d55c3e0d85
comparison
equal deleted inserted replaced
32:d01196ca1e39 33:a9c15cae50e5
62 f = open(os.path.join(hg_repo_path, '.hg', 'localtags'), 'w') 62 f = open(os.path.join(hg_repo_path, '.hg', 'localtags'), 'w')
63 for tag, source in tag_info.iteritems(): 63 for tag, source in tag_info.iteritems():
64 source_ha = hg_editor.get_parent_revision(source[1]+1, source[0]) 64 source_ha = hg_editor.get_parent_revision(source[1]+1, source[0])
65 f.write('%s tag/%s\n' % (node.hex(source_ha), tag)) 65 f.write('%s tag/%s\n' % (node.hex(source_ha), tag))
66 66
67 def parse_revmap(revmap_filename):
68 revmap = {}
69 f = open(revmap_filename)
70 for l in f:
71 revnum, node_hash, branch = l.split(' ', 2)
72 if branch == '\n':
73 branch = None
74 else:
75 branch = branch[:-1]
76 revmap[int(revnum), branch] = node.bin(node_hash)
77 f.close()
78 return revmap
79
67 @register_subcommand('up') 80 @register_subcommand('up')
68 def update(ui, args, repo, clean=False, **opts): 81 def update(ui, args, repo, clean=False, **opts):
69 """Update to a specified Subversion revision number. 82 """Update to a specified Subversion revision number.
70 """ 83 """
71 assert len(args) == 1 84 assert len(args) == 1
72 rev = int(args[0]) 85 rev = int(args[0])
73 path = os.path.join(repo.path, 'svn', 'rev_map') 86 path = os.path.join(repo.path, 'svn', 'rev_map')
74 answers = [] 87 answers = []
75 for k,v in pickle.load(open(path)).iteritems(): 88 for k,v in parse_revmap(path).iteritems():
76 if k[0] == rev: 89 if k[0] == rev:
77 answers.append((v, k[1])) 90 answers.append((v, k[1]))
78 if len(answers) == 1: 91 if len(answers) == 1:
79 if clean: 92 if clean:
80 return hg.clean(repo, answers[0][0]) 93 return hg.clean(repo, answers[0][0])
137 unknown=True) == ([], [], [], [], [], [], []) 150 unknown=True) == ([], [], [], [], [], [], [])
138 start_rev = 0 151 start_rev = 0
139 args = list(args) 152 args = list(args)
140 if args: 153 if args:
141 start_rev = int(args.pop(0)) 154 start_rev = int(args.pop(0))
142 revmap_f = open(os.path.join(repo.path, 'svn', 'rev_map')) 155 revmap = parse_revmap(os.path.join(repo.path, 'svn', 'rev_map'))
143 revmap = pickle.load(revmap_f)
144 revs = sorted(revmap.keys()) 156 revs = sorted(revmap.keys())
145 for revnum, br in revs: 157 for revnum, br in revs:
146 if revnum < start_rev: 158 if revnum < start_rev:
147 continue 159 continue
148 res = verify_revision(ui, [revnum], repo, force=True) 160 res = verify_revision(ui, [revnum], repo, force=True)