7aeaa2fc0a
Currently the remote helper infrastructure is only used by the curl helper, which does not give a good impression of how remote helpers can be used to interact with foreign repositories. Since implementing such a helper is non-trivial it would be good to have at least one easy-to-follow example demonstrating how to implement a helper that interacts with a foreign vcs using fast-import/fast-export. The testgit helper can be used to interact with remote git repositories by prefixing the url with "testgit::". Signed-off-by: Junio C Hamano <gitster@pobox.com>
71 lines
1.8 KiB
Python
71 lines
1.8 KiB
Python
import os
|
|
import subprocess
|
|
|
|
def sanitize(rev, sep='\t'):
|
|
"""Converts a for-each-ref line to a name/value pair.
|
|
"""
|
|
|
|
splitrev = rev.split(sep)
|
|
branchval = splitrev[0]
|
|
branchname = splitrev[1].strip()
|
|
if branchname.startswith("refs/heads/"):
|
|
branchname = branchname[11:]
|
|
|
|
return branchname, branchval
|
|
|
|
def is_remote(url):
|
|
"""Checks whether the specified value is a remote url.
|
|
"""
|
|
|
|
prefixes = ["http", "file", "git"]
|
|
|
|
return any(url.startswith(i) for i in prefixes)
|
|
|
|
class GitRepo(object):
|
|
"""Repo object representing a repo.
|
|
"""
|
|
|
|
def __init__(self, path):
|
|
"""Initializes a new repo at the given path.
|
|
"""
|
|
|
|
self.path = path
|
|
self.head = None
|
|
self.revmap = {}
|
|
self.local = not is_remote(self.path)
|
|
|
|
if(self.path.endswith('.git')):
|
|
self.gitpath = self.path
|
|
else:
|
|
self.gitpath = os.path.join(self.path, '.git')
|
|
|
|
if self.local and not os.path.exists(self.gitpath):
|
|
os.makedirs(self.gitpath)
|
|
|
|
def get_revs(self):
|
|
"""Fetches all revs from the remote.
|
|
"""
|
|
|
|
args = ["git", "ls-remote", self.gitpath]
|
|
path = ".cached_revs"
|
|
ofile = open(path, "w")
|
|
|
|
subprocess.check_call(args, stdout=ofile)
|
|
output = open(path).readlines()
|
|
self.revmap = dict(sanitize(i) for i in output)
|
|
if "HEAD" in self.revmap:
|
|
del self.revmap["HEAD"]
|
|
self.revs = self.revmap.keys()
|
|
ofile.close()
|
|
|
|
def get_head(self):
|
|
"""Determines the head of a local repo.
|
|
"""
|
|
|
|
if not self.local:
|
|
return
|
|
|
|
path = os.path.join(self.gitpath, "HEAD")
|
|
head = open(path).readline()
|
|
self.head, _ = sanitize(head, ' ')
|