X-Git-Url: https://git.ralfj.de/git-mirror.git/blobdiff_plain/eea79d998ebaa55f0553696fbd51528f8f1f07ba..HEAD:/git_mirror.py diff --git a/git_mirror.py b/git_mirror.py index 859b376..6b72775 100644 --- a/git_mirror.py +++ b/git_mirror.py @@ -29,6 +29,17 @@ import email.mime.text, email.utils, smtplib mail_sender = "null@localhost" config_file = os.path.join(os.path.dirname(__file__), 'git-mirror.conf') +def Popen_quirky(cmd, **args): + ''' + Runs cmd via subprocess.Popen; and if that fails, puts it into the shell (/bin/sh). + It seems that's what executing things in bash does, and even execve. Also, + all so-far released versions of Gitolite get the shebang line wrong. + ''' + try: + return subprocess.Popen(cmd, **args) + except OSError as e: + return subprocess.Popen(['/bin/sh'] + cmd, **args) + class GitCommand: def __getattr__(self, name): def call(*args, capture_stderr = False, check = True): @@ -84,7 +95,7 @@ class Repo: self.name = name self.local = conf['local'] self.owner = conf['owner'] # email address to notify in case of problems - self.hmac_secret = conf['hmac-secret'].encode('utf-8') + self.hmac_secret = conf['hmac-secret'].encode('utf-8') if 'hmac-secret' in conf else None self.deploy_key = conf['deploy-key'] # the SSH ky used for authenticating against remote hosts self.mirrors = {} # maps mirrors to their URLs mirror_prefix = 'mirror-' @@ -97,6 +108,7 @@ class Repo: send_mail("git-mirror {}".format(self.name), msg, recipients = [self.owner], sender = mail_sender) def compute_hmac(self, data): + assert self.hmac_secret is not None h = hmac.new(self.hmac_secret, digestmod = hashlib.sha1) h.update(data) return h.hexdigest() @@ -176,7 +188,7 @@ class Repo: # Now run the post-receive hooks. This will *also* push the changes to all mirrors, as we # are one of these hooks! os.putenv("GIT_MIRROR_SOURCE", mirror) # tell ourselves which repo we do *not* have to update - with subprocess.Popen(['/bin/sh', 'hooks/post-receive'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) as p: + with Popen_quirky(['hooks/post-receive'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) as p: (stdout, stderr) = p.communicate("{} {} {}\n".format(oldsha, newsha, ref).encode('utf-8')) stdout = stdout.decode('utf-8') if p.returncode: