29cf0d3873
Although 2to3 will fix most issues in Python 2 code to make it run under Python 3, it does not handle the new strict separation between byte strings and unicode strings. There is one instance in git_remote_helpers where we are caught by this, which is when reading refs from "git for-each-ref". Fix this by operating on the returned string as a byte string rather than a unicode string. As this method is currently only used internally by the class this does not affect code anywhere else. Note that we cannot use byte strings in the source as the 'b' prefix is not supported before Python 2.7 so in order to maintain compatibility with the maximum range of Python versions we use an explicit call to encode(). Signed-off-by: John Keeping <john@keeping.me.uk> Signed-off-by: Junio C Hamano <gitster@pobox.com>
70 lines
1.9 KiB
Python
70 lines
1.9 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.
|
|
|
|
Note that the keys in the returned dictionary are byte strings as
|
|
read from git.
|
|
"""
|
|
args = ["git", "--git-dir=" + gitdir, "for-each-ref", "refs/heads"]
|
|
lines = check_output(args).strip().split('\n'.encode('ascii'))
|
|
refs = {}
|
|
for line in lines:
|
|
value, name = line.split(' '.encode('ascii'))
|
|
name = name.strip('commit\t'.encode('ascii'))
|
|
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
|