From 46178f0169ccc79a2b43f89eb5b425290fb7452d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9ophile=20Bastian?= Date: Sat, 3 Mar 2018 02:01:18 +0100 Subject: [PATCH] Fix git cloning, updating, refactor code --- .gitignore | 1 + gogsmaker.py | 56 +++++++++++++++++++++++++++++++--------------------- 2 files changed, 34 insertions(+), 23 deletions(-) diff --git a/.gitignore b/.gitignore index 9d9b57e..7b79916 100644 --- a/.gitignore +++ b/.gitignore @@ -60,3 +60,4 @@ target/ venv settings.py +repos diff --git a/gogsmaker.py b/gogsmaker.py index e7bd7d3..7124c1a 100644 --- a/gogsmaker.py +++ b/gogsmaker.py @@ -4,6 +4,7 @@ A webhook-handler for Gogs running `make` when needed. """ import os import subprocess +from functools import wraps from flask import Flask, request from . import settings @@ -16,6 +17,7 @@ class UnmonitoredRepository(Exception): class GitError(Exception): def __init__(self, what): + super().__init__() self.what = what def __str__(self): @@ -39,12 +41,6 @@ def update_repo(hook, clone_url): ''' Update (or clone) the given repository. May raise GitError. ''' path = repo_path(hook) if os.path.isdir(os.path.join(path, '.git')): # Repo is already cloned - try: - subprocess.run(['git', 'clone', clone_url, path], check=True) - except subprocess.CalledProcessError: - raise GitError("Cannot clone {}".format(clone_url)) - - else: # Simply update try: subprocess.run(['git', '-C', path, 'reset', '--hard'], check=True) # Just in case. @@ -52,29 +48,43 @@ def update_repo(hook, clone_url): except subprocess.CalledProcessError: raise GitError("Cannot pull {}".format(hook['name'])) + else: # Simply update + try: + subprocess.run(['mkdir', '-p', path]) + subprocess.run(['git', 'clone', clone_url, path], check=True) + except subprocess.CalledProcessError: + raise GitError("Cannot clone {}".format(clone_url)) + def gogs_payload(required): def wrapper(fct): - payload = request.json - if payload is None: - return 'Expected json\n', 415 + @wraps(fct) + def wrapped(*args, **kwargs): + # TODO: check signature + # payload_raw = request.data - for field in required + ['repository/html_url']: - path = field.split('/') - explore = payload - for section in path: - if section not in explore: - return ( - 'Invalid json: missing {}\n'.format('/'.join(path)), - 400) - explore = explore[section] + payload = request.json + if payload is None: + return 'Expected json\n', 415 - try: - hook = get_hook(payload['repository']['html_url']) - except UnmonitoredRepository: - return 'Unmonitored repository\n', 403 + for field in required + ['repository/html_url']: + path = field.split('/') + explore = payload + for section in path: + if section not in explore: + return ( + 'Invalid json: missing {}\n'.format( + '/'.join(path)), + 400) + explore = explore[section] - return fct(payload, hook) + try: + hook = get_hook(payload['repository']['html_url']) + except UnmonitoredRepository: + return 'Unmonitored repository\n', 403 + + return fct(payload, hook, *args, **kwargs) + return wrapped return wrapper