Skip to content

Commit

Permalink
git-remote-testgit: fix error handling
Browse files Browse the repository at this point in the history
If fast-export did not complete successfully the error handling code
itself would error out.

This was broken in commit 23b093e (Brandon Casey, Wed Jun 9 2010,
Remove python 2.5'isms). Revert that commit an introduce our own copy
of check_call in util.py instead.

Tested by changing 'if retcode' to 'if not retcode' temporarily.

Signed-off-by: Sverre Rabbelier <srabbelier@gmail.com>
Acked-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Sverre Rabbelier authored and Junio C Hamano committed Jul 19, 2011
1 parent 0fb56ce commit 460d102
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 22 deletions.
6 changes: 3 additions & 3 deletions git_remote_helpers/git/exporter.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
import subprocess
import sys

from git_remote_helpers.util import check_call


class GitExporter(object):
"""An exporter for testgit repositories.
Expand Down Expand Up @@ -53,6 +55,4 @@ def export_repo(self, base, refs=None):

args = ["sed", "s_refs/heads/_" + self.repo.prefix + "_g"]

child = subprocess.Popen(args, stdin=p1.stdout)
if child.wait() != 0:
raise CalledProcessError
check_call(args, stdin=p1.stdout)
6 changes: 3 additions & 3 deletions git_remote_helpers/git/importer.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import os
import subprocess

from git_remote_helpers.util import check_call


class GitImporter(object):
"""An importer for testgit repositories.
Expand Down Expand Up @@ -35,6 +37,4 @@ def do_import(self, base):
if os.path.exists(path):
args.append("--import-marks=" + path)

child = subprocess.Popen(args)
if child.wait() != 0:
raise CalledProcessError
check_call(args)
18 changes: 5 additions & 13 deletions git_remote_helpers/git/non_local.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import os
import subprocess

from git_remote_helpers.util import die, warn
from git_remote_helpers.util import check_call, die, warn


class NonLocalGit(object):
Expand Down Expand Up @@ -29,9 +29,7 @@ def clone(self, base):
os.makedirs(path)
args = ["git", "clone", "--bare", "--quiet", self.repo.gitpath, path]

child = subprocess.Popen(args)
if child.wait() != 0:
raise CalledProcessError
check_call(args)

return path

Expand All @@ -45,14 +43,10 @@ def update(self, base):
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
check_call(args)

args = ["git", "--git-dir=" + path, "update-ref", "refs/heads/master", "FETCH_HEAD"]
child = subprocess.Popen(args)
if child.wait() != 0:
raise CalledProcessError
child = check_call(args)

def push(self, base):
"""Pushes from the non-local repo to base.
Expand All @@ -64,6 +58,4 @@ def push(self, base):
die("could not find repo at %s", path)

args = ["git", "--git-dir=" + path, "push", "--quiet", self.repo.gitpath, "--all"]
child = subprocess.Popen(args)
if child.wait() != 0:
raise CalledProcessError
child = check_call(args)
7 changes: 4 additions & 3 deletions git_remote_helpers/git/repo.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import os
import subprocess

from git_remote_helpers.util import check_call


def sanitize(rev, sep='\t'):
"""Converts a for-each-ref line to a name/value pair.
"""
Expand Down Expand Up @@ -53,9 +56,7 @@ def get_revs(self):
path = ".cached_revs"
ofile = open(path, "w")

child = subprocess.Popen(args, stdout=ofile)
if child.wait() != 0:
raise CalledProcessError
check_call(args, stdout=ofile)
output = open(path).readlines()
self.revmap = dict(sanitize(i) for i in output)
if "HEAD" in self.revmap:
Expand Down
47 changes: 47 additions & 0 deletions git_remote_helpers/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,21 @@
import os
import subprocess

try:
from subprocess import CalledProcessError
except ImportError:
# from python2.7:subprocess.py
# Exception classes used by this module.
class CalledProcessError(Exception):
"""This exception is raised when a process run by check_call() returns
a non-zero exit status. The exit status will be stored in the
returncode attribute."""
def __init__(self, returncode, cmd):
self.returncode = returncode
self.cmd = cmd
def __str__(self):
return "Command '%s' returned non-zero exit status %d" % (self.cmd, self.returncode)


# Whether or not to show debug messages
DEBUG = False
Expand Down Expand Up @@ -128,6 +143,38 @@ def run_command (args, cwd = None, shell = False, add_env = None,
return (exit_code, output, errors)


# from python2.7:subprocess.py
def call(*popenargs, **kwargs):
"""Run command with arguments. Wait for command to complete, then
return the returncode attribute.
The arguments are the same as for the Popen constructor. Example:
retcode = call(["ls", "-l"])
"""
return subprocess.Popen(*popenargs, **kwargs).wait()


# from python2.7:subprocess.py
def check_call(*popenargs, **kwargs):
"""Run command with arguments. Wait for command to complete. If
the exit code was zero then return, otherwise raise
CalledProcessError. The CalledProcessError object will have the
return code in the returncode attribute.
The arguments are the same as for the Popen constructor. Example:
check_call(["ls", "-l"])
"""
retcode = call(*popenargs, **kwargs)
if retcode:
cmd = kwargs.get("args")
if cmd is None:
cmd = popenargs[0]
raise CalledProcessError(retcode, cmd)
return 0


def file_reader_method (missing_ok = False):
"""Decorator for simplifying reading of files.
Expand Down

0 comments on commit 460d102

Please sign in to comment.