From eced8c89a3c35cb6ac08ae2382f2dd3d1ee6bff6 Mon Sep 17 00:00:00 2001 From: Sverre Rabbelier Date: Sun, 24 Jul 2011 12:38:43 +0200 Subject: [PATCH] git-remote-hg: add GitExporter/GitImporter/NonLocalGit This is inftrastructure required to implement git-remote-hg. --- git_remote_helpers/hg/__init__.py | 0 git_remote_helpers/hg/exporter.py | 29 ++++++++++++++++++++++ git_remote_helpers/hg/importer.py | 29 ++++++++++++++++++++++ git_remote_helpers/hg/non_local.py | 51 ++++++++++++++++++++++++++++++++++++++ git_remote_helpers/hg/util.py | 14 +++++++++++ 5 files changed, 123 insertions(+) create mode 100644 git_remote_helpers/hg/__init__.py create mode 100644 git_remote_helpers/hg/exporter.py create mode 100644 git_remote_helpers/hg/importer.py create mode 100644 git_remote_helpers/hg/non_local.py create mode 100644 git_remote_helpers/hg/util.py diff --git a/git_remote_helpers/hg/__init__.py b/git_remote_helpers/hg/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/git_remote_helpers/hg/exporter.py b/git_remote_helpers/hg/exporter.py new file mode 100644 index 0000000000..20b564dfc0 --- /dev/null +++ b/git_remote_helpers/hg/exporter.py @@ -0,0 +1,29 @@ +import binascii +import os.path +import sys + +from git_remote_helpers.hg import hgexport + + +class GitExporter(object): + def __init__(self, repo): + self.repo = repo + + def export_repo(self, base, refs): + gitmarksfile = os.path.join(self.repo.hash, 'git.marks') + + exporter = hgexport.HgExportGenerator(self.repo) + + exporter.feature_relative_marks() + exporter.feature_export_marks(gitmarksfile) + + dirname = self.repo.get_base_path(base) + path = os.path.abspath(os.path.join(dirname, 'git.marks')) + + if os.path.exists(path): + exporter.feature_import_marks(gitmarksfile) + exporter.read_marks(base) + + exporter.export_repo(refs) + + exporter.write_marks(base) diff --git a/git_remote_helpers/hg/importer.py b/git_remote_helpers/hg/importer.py new file mode 100644 index 0000000000..ff1eabda02 --- /dev/null +++ b/git_remote_helpers/hg/importer.py @@ -0,0 +1,29 @@ +import os.path +import sys + +from git_remote_helpers.hg import hgimport +from git_remote_helpers.fastimport import processor, parser + + +class GitImporter(object): + def __init__(self, repo): + self.repo = repo + + def do_import(self, base): + sources = ["-"] + + dirname = self.repo.get_base_path(base) + + if not os.path.exists(dirname): + os.makedirs(dirname) + + procc = hgimport.HgImportProcessor(self.repo.ui, self.repo) + + marks_file = os.path.abspath(os.path.join(dirname, 'hg.marks')) + + if os.path.exists(marks_file): + procc.load_marksfile(marks_file) + + processor.parseMany(sources, parser.ImportParser, procc) + + procc.write_marksfile(marks_file) diff --git a/git_remote_helpers/hg/non_local.py b/git_remote_helpers/hg/non_local.py new file mode 100644 index 0000000000..715bd68cd4 --- /dev/null +++ b/git_remote_helpers/hg/non_local.py @@ -0,0 +1,51 @@ +import os + +from git_remote_helpers.util import die, warn + +class NonLocalHg(object): + def __init__(self, repo): + self.repo = repo + self.hg = repo.hg + + def clone(self, base): + path = self.repo.get_base_path(base) + + # already cloned + if os.path.exists(os.path.join(path, '.hg')): + return path + + if not os.path.exists(path): + os.makedirs(path) + + if self.repo.path.endswith(".hg"): + from_path = self.repo.path[:-3] + else: + from_path = self.repo.path + + self.repo.ui.setconfig('ui', 'quiet', "true") + self.hg.clone(self.repo.ui, from_path, path, update=False, pull=True) + + return path + + def update(self, base): + path = self.repo.get_base_path(base) + + if not os.path.exists(path): + die("could not find repo at %s", path) + + repo = self.hg.repository(self.repo.ui, path) + + repo.ui.setconfig('ui', 'quiet', "true") + repo.pull(self.repo, heads=self.repo.heads(), force=True) + + def push(self, base): + path = self.repo.get_base_path(base) + + if not os.path.exists(path): + die("could not find repo at %s", path) + + repo = self.hg.repository(self.repo.ui, path) + + self.repo.ui.setconfig('ui', 'quiet', "true") + repo.ui.setconfig('ui', 'quiet', "true") + repo.push(self.repo, force=False) diff --git a/git_remote_helpers/hg/util.py b/git_remote_helpers/hg/util.py new file mode 100644 index 0000000000..2cd54c1ad0 --- /dev/null +++ b/git_remote_helpers/hg/util.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python + +from mercurial import hg + +def parseurl(url, heads=[]): + url, heads = hg.parseurl(url, heads) + if isinstance(heads, tuple) and len(heads) == 2: + # hg 1.6 or later + _junk, heads = heads + if heads: + checkout = heads[0] + else: + checkout = None + return url, heads, checkout -- 2.11.4.GIT