You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.9 KiB
69 lines
1.9 KiB
import os |
|
import subprocess |
|
|
|
from git_remote_helpers.util import die, warn |
|
|
|
|
|
class NonLocalGit(object): |
|
"""Handler to interact with non-local repos. |
|
""" |
|
|
|
def __init__(self, repo): |
|
"""Creates a new non-local handler for the specified repo. |
|
""" |
|
|
|
self.repo = repo |
|
|
|
def clone(self, base): |
|
"""Clones the non-local repo to base. |
|
|
|
Does nothing if a clone already exists. |
|
""" |
|
|
|
path = os.path.join(self.repo.get_base_path(base), '.git') |
|
|
|
# already cloned |
|
if os.path.exists(path): |
|
return path |
|
|
|
os.makedirs(path) |
|
args = ["git", "clone", "--bare", "--quiet", self.repo.gitpath, path] |
|
|
|
child = subprocess.Popen(args) |
|
if child.wait() != 0: |
|
raise CalledProcessError |
|
|
|
return path |
|
|
|
def update(self, base): |
|
"""Updates checkout of the non-local repo in base. |
|
""" |
|
|
|
path = os.path.join(self.repo.get_base_path(base), '.git') |
|
|
|
if not os.path.exists(path): |
|
die("could not find repo at %s", path) |
|
|
|
args = ["git", "--git-dir=" + path, "fetch", "--quiet", self.repo.gitpath] |
|
child = subprocess.Popen(args) |
|
if child.wait() != 0: |
|
raise CalledProcessError |
|
|
|
args = ["git", "--git-dir=" + path, "update-ref", "refs/heads/master", "FETCH_HEAD"] |
|
child = subprocess.Popen(args) |
|
if child.wait() != 0: |
|
raise CalledProcessError |
|
|
|
def push(self, base): |
|
"""Pushes from the non-local repo to base. |
|
""" |
|
|
|
path = os.path.join(self.repo.get_base_path(base), '.git') |
|
|
|
if not os.path.exists(path): |
|
die("could not find repo at %s", path) |
|
|
|
args = ["git", "--git-dir=" + path, "push", "--quiet", self.repo.gitpath] |
|
child = subprocess.Popen(args) |
|
if child.wait() != 0: |
|
raise CalledProcessError
|
|
|