Some refactors of the previous change, including transparent upgrade of old-style pickled dictionaries.

This commit is contained in:
Augie Fackler 2008-10-17 11:03:52 -05:00
parent 4430556e43
commit 1243e68e75
3 changed files with 46 additions and 25 deletions

View File

@ -14,6 +14,8 @@ from mercurial import node
from svn import delta
from svn import core
import util as our_util
def pickle_atomic(data, file_path, dir=None):
"""pickle some data to a path atomically.
@ -73,15 +75,7 @@ class HgChangeReceiver(delta.Editor):
self.subdir = self.subdir[1:]
self.revmap = {}
if os.path.exists(self.revmap_file):
f = open(self.revmap_file)
for l in f:
revnum, node_hash, branch = l.split(' ', 2)
if branch == '\n':
branch = None
else:
branch = branch[:-1]
self.revmap[int(revnum), branch] = node.bin(node_hash)
f.close()
self.revmap = our_util.parse_revmap(self.revmap_file)
self.branches = {}
if os.path.exists(self.branch_info_file):
f = open(self.branch_info_file)
@ -119,7 +113,10 @@ class HgChangeReceiver(delta.Editor):
else:
self.repo = hg.repository(self.ui, repo_path, create=True)
os.makedirs(os.path.dirname(self.uuid_file))
open(self.revmap_file, 'w') # make empty file
f = open(self.revmap_file, 'w')
f.write('%s\n' % our_util.REVMAP_FILE_VERSION)
f.flush()
f.close()
def clear_current_info(self):
'''Clear the info relevant to a replayed revision so that the next

View File

@ -64,19 +64,6 @@ def generate_hg_tags(ui, hg_repo_path, **opts):
source_ha = hg_editor.get_parent_revision(source[1]+1, source[0])
f.write('%s tag/%s\n' % (node.hex(source_ha), tag))
def parse_revmap(revmap_filename):
revmap = {}
f = open(revmap_filename)
for l in f:
revnum, node_hash, branch = l.split(' ', 2)
if branch == '\n':
branch = None
else:
branch = branch[:-1]
revmap[int(revnum), branch] = node.bin(node_hash)
f.close()
return revmap
@register_subcommand('up')
def update(ui, args, repo, clean=False, **opts):
"""Update to a specified Subversion revision number.
@ -85,7 +72,7 @@ def update(ui, args, repo, clean=False, **opts):
rev = int(args[0])
path = os.path.join(repo.path, 'svn', 'rev_map')
answers = []
for k,v in parse_revmap(path).iteritems():
for k,v in util.parse_revmap(path).iteritems():
if k[0] == rev:
answers.append((v, k[1]))
if len(answers) == 1:
@ -152,7 +139,7 @@ def verify_all_revisions(ui, args, repo, **opts):
args = list(args)
if args:
start_rev = int(args.pop(0))
revmap = parse_revmap(os.path.join(repo.path, 'svn', 'rev_map'))
revmap = util.parse_revmap(os.path.join(repo.path, 'svn', 'rev_map'))
revs = sorted(revmap.keys())
for revnum, br in revs:
if revnum < start_rev:

37
util.py
View File

@ -1,6 +1,9 @@
import os
import pickle
import shutil
from mercurial import node
svn_subcommands = { }
def register_subcommand(name):
@ -18,3 +21,37 @@ def wipe_all_files(hg_wc_path):
shutil.rmtree(f)
else:
os.remove(f)
REVMAP_FILE_VERSION = 1
def parse_revmap(revmap_filename):
revmap = {}
f = open(revmap_filename)
try:
# Remove compat code after March of 2009. That should be more than long
# enough.
revmap = pickle.load(f)
f.close()
f = open(revmap_filename, 'w')
f.write('1\n')
for key, value in sorted(revmap.items()):
f.write('%s %s %s\n' % (str(key[0]), node.hex(value), key[1] or ''))
f.close()
except:
f.close()
f = open(revmap_filename)
ver = int(f.readline())
if ver == 1:
for l in f:
revnum, node_hash, branch = l.split(' ', 2)
if branch == '\n':
branch = None
else:
branch = branch[:-1]
revmap[int(revnum), branch] = node.bin(node_hash)
f.close()
else:
print ('Your revmap was made by a newer version of hgsubversion.'
' Please upgrade.')
raise NotImplementedError
return revmap