Mercurial > hgsubversion
view utility_commands.py @ 326:33736e2e25f0
alternate approach for supporting svn schemes for repository paths
We now intercept the operations in the local repo class, and handle
the relevant operation ourselves. This frees us from wrapping all
relevant commands and replicating their functionality.
The implementation is incomplete; only one test has been modified to
use the standard Mercurial API with the changed URLs. Once changed,
those tests will likely reveal bugs or missing features in the new
wrappers. Also, new wrappers will be needed for handling conversion
flags such as -A/--authormap.
author | Dan Villiom Podlaski Christiansen <danchr@gmail.com> |
---|---|
date | Thu, 07 May 2009 20:50:53 +0200 |
parents | 1d48d9a34c19 |
children | 75f082b5897e |
line wrap: on
line source
import os from mercurial import util as hgutil import svnwrap import cmdutil import util import hg_delta_editor def url(ui, repo, hg_repo_path, **opts): """show the location (URL) of the Subversion repository """ hge = hg_delta_editor.HgChangeReceiver(hg_repo_path, ui_=ui) ui.status(hge.url, '\n') def genignore(ui, repo, hg_repo_path, force=False, **opts): """generate .hgignore from svn:ignore properties. """ ignpath = os.path.join(hg_repo_path, '.hgignore') if not force and os.path.exists(ignpath): raise hgutil.Abort('not overwriting existing .hgignore, try --force?') ignorefile = open(ignpath, 'w') ignorefile.write('.hgignore\nsyntax:glob\n') hge = hg_delta_editor.HgChangeReceiver(hg_repo_path, ui_=ui) svn_commit_hashes = dict(zip(hge.revmap.itervalues(), hge.revmap.iterkeys())) parent = cmdutil.parentrev(ui, repo, hge, svn_commit_hashes) r, br = svn_commit_hashes[parent.node()] if br == None: branchpath = 'trunk' else: branchpath = 'branches/%s' % br url = hge.url if url[-1] == '/': url = url[:-1] user, passwd = util.getuserpass(opts) svn = svnwrap.SubversionRepo(url, user, passwd) dirs = [''] + [d[0] for d in svn.list_files(branchpath, r) if d[1] == 'd'] for dir in dirs: props = svn.list_props('%s/%s/' % (branchpath,dir), r) if 'svn:ignore' in props: lines = props['svn:ignore'].strip().split('\n') for prop in lines: if dir: ignorefile.write('%s/%s\n' % (dir, prop)) else: ignorefile.write('%s\n' % prop) def info(ui, repo, hg_repo_path, **opts): """show Subversion details similar to `svn info' """ hge = hg_delta_editor.HgChangeReceiver(hg_repo_path, ui_=ui) svn_commit_hashes = dict(zip(hge.revmap.itervalues(), hge.revmap.iterkeys())) parent = cmdutil.parentrev(ui, repo, hge, svn_commit_hashes) pn = parent.node() if pn not in svn_commit_hashes: ui.status('Not a child of an svn revision.\n') return 0 r, br = svn_commit_hashes[pn] subdir = parent.extra()['convert_revision'][40:].split('@')[0] if br == None: branchpath = '/trunk' elif br.startswith('../'): branchpath = '/%s' % br[3:] subdir = subdir.replace('branches/../', '') else: branchpath = '/branches/%s' % br url = hge.url if url[-1] == '/': url = url[:-1] url = '%s%s' % (url, branchpath) author = hge.authors.reverselookup(parent.user()) # cleverly figure out repo root w/o actually contacting the server reporoot = url[:len(url)-len(subdir)] ui.status('''URL: %(url)s Repository Root: %(reporoot)s Repository UUID: %(uuid)s Revision: %(revision)s Node Kind: directory Last Changed Author: %(author)s Last Changed Rev: %(revision)s Last Changed Date: %(date)s\n''' % {'reporoot': reporoot, 'uuid': open(hge.uuid_file).read(), 'url': url, 'author': author, 'revision': r, # TODO I'd like to format this to the user's local TZ if possible 'date': hgutil.datestr(parent.date(), '%Y-%m-%d %H:%M:%S %1%2 (%a, %d %b %Y)') }) def listauthors(ui, args, authors=None, **opts): """list all authors in a Subversion repository """ if not len(args): ui.status('No repository specified.\n') return svn = svnwrap.SubversionRepo(util.normalize_url(args[0])) author_set = set() for rev in svn.revisions(): author_set.add(str(rev.author)) # So None becomes 'None' if authors: authorfile = open(authors, 'w') authorfile.write('%s=\n' % '=\n'.join(sorted(author_set))) authorfile.close() else: ui.status('%s\n' % '\n'.join(sorted(author_set))) def version(ui, **opts): """Show current version of hg and hgsubversion. """ ui.status('hg: %s\n' % hgutil.version()) ui.status('svn bindings: %s\n' % svnwrap.version()) ui.status('hgsubversion: %s\n' % util.version(ui)) nourl = ['version', 'listauthors'] table = { 'url': url, 'genignore': genignore, 'info': info, 'listauthors': listauthors, 'version': version, }