3b705268f5
Basically this is what we want: == pull == testgit transport-helper * export -> import # testgit.marks git.marks == push == testgit transport-helper * import <- export # testgit.marks git.marks Each side should be agnostic of the other side. Because testgit.marks (our helper marks) could be anything, not necessarily a format parsable by fast-export or fast-import. In this test they happen to be compatible, because we use those tools, but in the real world it would be something completely different. For example, they might be mapping marks to mercurial revisions (certainly not parsable by fast-import/export). This is what we have: == pull == testgit transport-helper * export -> import # testgit.marks git.marks == push == testgit transport-helper * import <- export # git.marks testgit.marks The only reason this is working is that git.marks and testgit.marks are roughly the same. This new behavior used to not be possible before due to a bug in fast-export, but with the bug fixed, it works fine. Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
67 lines
1.7 KiB
Python
67 lines
1.7 KiB
Python
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, 'testgit.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
|