aboutsummaryrefslogtreecommitdiff
path: root/git_remote_helpers/git/importer.py
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2011-11-23 13:28:53 -0800
committerJunio C Hamano <gitster@pobox.com>2011-11-23 13:28:53 -0800
commit3686aa1caf907d22fe318c28efe93f0e7870ba50 (patch)
treef99a303bd14c7343be7ccc5b9df5382f1bf79246 /git_remote_helpers/git/importer.py
parentaa2577a9c3bd5559bd580feca6edec4d70254adc (diff)
parent1e501a7c47ad5ada53d3b1acfb9f131f76e969ec (diff)
downloadgit-3686aa1caf907d22fe318c28efe93f0e7870ba50.tar.gz
git-3686aa1caf907d22fe318c28efe93f0e7870ba50.tar.xz
Merge branch 'maint' into tj/imap-send-remove-unused
* maint: (18123 commits) documentation fix: git difftool uses diff tools, not merge tools. Git 1.7.7.4 Makefile: add missing header file dependencies notes merge: eliminate OUTPUT macro mailmap: xcalloc mailmap_info name-rev --all: do not even attempt to describe non-commit object Git 1.7.7.3 docs: Update install-doc-quick docs: don't mention --quiet or --exit-code in git-log(1) Git 1.7.7.2 t7511: avoid use of reserved filename on Windows. clone: Quote user supplied path in a single quote pair read-cache.c: fix index memory allocation make the sample pre-commit hook script reject names with newlines, too Reindent closing bracket using tab instead of spaces Git 1.7.7.1 RelNotes/1.7.7.1: setgid bit patch is about fixing "git init" via Makefile setting gitweb: fix regression when filtering out forks Almost ready for 1.7.7.1 pack-objects: don't traverse objects unnecessarily ... Conflicts: imap-send.c
Diffstat (limited to 'git_remote_helpers/git/importer.py')
-rw-r--r--git_remote_helpers/git/importer.py66
1 files changed, 66 insertions, 0 deletions
diff --git a/git_remote_helpers/git/importer.py b/git_remote_helpers/git/importer.py
new file mode 100644
index 000000000..5c6b595e1
--- /dev/null
+++ b/git_remote_helpers/git/importer.py
@@ -0,0 +1,66 @@
+import os
+import subprocess
+
+from git_remote_helpers.util import check_call, check_output
+
+
+class GitImporter(object):
+ """An importer for testgit repositories.
+
+ This importer simply delegates to git fast-import.
+ """
+
+ def __init__(self, repo):
+ """Creates a new importer for the specified repo.
+ """
+
+ self.repo = repo
+
+ def get_refs(self, gitdir):
+ """Returns a dictionary with refs.
+ """
+ args = ["git", "--git-dir=" + gitdir, "for-each-ref", "refs/heads"]
+ lines = check_output(args).strip().split('\n')
+ refs = {}
+ for line in lines:
+ value, name = line.split(' ')
+ name = name.strip('commit\t')
+ refs[name] = value
+ return refs
+
+ def do_import(self, base):
+ """Imports a fast-import stream to the given directory.
+
+ Simply delegates to git fast-import.
+ """
+
+ dirname = self.repo.get_base_path(base)
+ if self.repo.local:
+ gitdir = self.repo.gitpath
+ else:
+ gitdir = os.path.abspath(os.path.join(dirname, '.git'))
+ path = os.path.abspath(os.path.join(dirname, 'git.marks'))
+
+ if not os.path.exists(dirname):
+ os.makedirs(dirname)
+
+ refs_before = self.get_refs(gitdir)
+
+ args = ["git", "--git-dir=" + gitdir, "fast-import", "--quiet", "--export-marks=" + path]
+
+ if os.path.exists(path):
+ args.append("--import-marks=" + path)
+
+ check_call(args)
+
+ refs_after = self.get_refs(gitdir)
+
+ changed = {}
+
+ for name, value in refs_after.iteritems():
+ if refs_before.get(name) == value:
+ continue
+
+ changed[name] = value
+
+ return changed