From 396a703bf922e1632ac682c3b6c0d7c20a4b144f Mon Sep 17 00:00:00 2001 From: Sverre Rabbelier Date: Sun, 24 Jul 2011 12:38:57 +0200 Subject: [PATCH] git-remote-hg: add the helper The helper uses the previously added infrastructure. Signed-off-by: Johannes Schindelin --- .gitignore | 1 + Makefile | 1 + git-remote-hg.py | 101 ++++++++++++++++++++++++++++++++++++++++++++ git_remote_helpers/setup.py | 2 +- 4 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 git-remote-hg.py diff --git a/.gitignore b/.gitignore index a188a82bb1..c1c014a2f1 100644 --- a/.gitignore +++ b/.gitignore @@ -125,6 +125,7 @@ /git-remote-fd /git-remote-ext /git-remote-testgit +/git-remote-hg /git-repack /git-replace /git-repo-config diff --git a/Makefile b/Makefile index 57e2b244c1..2acfb39830 100644 --- a/Makefile +++ b/Makefile @@ -474,6 +474,7 @@ SCRIPT_PERL += git-send-email.perl SCRIPT_PERL += git-svn.perl SCRIPT_PYTHON += git-remote-testgit.py +SCRIPT_PYTHON += git-remote-hg.py SCRIPT_PYTHON += git-p4.py SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH)) \ diff --git a/git-remote-hg.py b/git-remote-hg.py new file mode 100644 index 0000000000..fdf61a737d --- /dev/null +++ b/git-remote-hg.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python + +import sys +import os +sys.path.insert(0, os.getenv("GITPYTHONLIB",".")) + +from git_remote_helpers.helper import RemoteHelper +from git_remote_helpers.util import debug, die, warn +from git_remote_helpers.hg import util +from git_remote_helpers.hg.hg import GitHg +from git_remote_helpers.hg.exporter import GitExporter +from git_remote_helpers.hg.importer import GitImporter +from git_remote_helpers.hg.non_local import NonLocalHg + + +class HgRemoteHelper(RemoteHelper): + def get_repo(self, alias, url): + """Returns a hg.repository object initialized for usage. + """ + + try: + from mercurial import hg, ui + except ImportError: + die("Mercurial python libraries not installed") + + remote = False + + if url.startswith("remote://"): + remote = True + url = "file://%s" % url[9:] + + ui = ui.ui() + source, revs, checkout = util.parseurl(ui.expandpath(url), ['default']) + repo = hg.repository(ui, source) + if repo.capable('branchmap'): + revs += repo.branchmap().keys() + revs = set(revs) + + prefix = 'refs/hg/%s/' % alias + debug("prefix: '%s'", prefix) + + repo.marksfile = 'git.marks' + repo.hg = hg + repo.prefix = prefix + repo.revs = revs + + self.setup_repo(repo, alias) + + repo.git_hg = GitHg(warn) + repo.exporter = GitExporter(repo) + repo.importer = GitImporter(repo) + repo.non_local = NonLocalHg(repo) + + repo.is_local = not remote and repo.local() + + return repo + + def local_repo(self, repo, path): + """Returns a hg.repository object initalized for usage. + """ + + local = repo.hg.repository(repo.ui, path) + + self.setup_local_repo(local, repo) + + local.git_hg = repo.git_hg + local.hg = repo.hg + local.revs = repo.revs + local.exporter = GitExporter(local) + local.importer = GitImporter(local) + local.is_local = repo.is_local + + return local + + def do_list(self, repo, args): + """Lists all known references. + """ + + for ref in repo.revs: + debug("? refs/heads/%s", ref) + print "? refs/heads/%s" % ref + + debug("@refs/heads/default HEAD") + print "@refs/heads/default HEAD" + + print # end list + + def sanitize(self, value): + """Cleans up the url. + """ + + if value.startswith('hg::'): + value = value[4:] + + return value + + def get_refs(self, repo, gitdir): + return repo.branchmap() + +if __name__ == '__main__': + sys.exit(HgRemoteHelper().main(sys.argv)) diff --git a/git_remote_helpers/setup.py b/git_remote_helpers/setup.py index a19c061fdf..4799513c24 100644 --- a/git_remote_helpers/setup.py +++ b/git_remote_helpers/setup.py @@ -14,5 +14,5 @@ setup( url = 'http://www.git-scm.com/', package_dir = {'git_remote_helpers': ''}, packages = ['git_remote_helpers', 'git_remote_helpers.git', - 'git_remote_helpers.fastimport'], + 'git_remote_helpers.fastimport', 'git_remote_helpers.hg'], ) -- 2.11.4.GIT