mirror of
https://github.com/quay/quay.git
synced 2025-04-18 10:44:06 +03:00
* chore: drop deprecated tables and remove unused code * isort imports * migration: check for table existence before drop
147 lines
3.2 KiB
Python
147 lines
3.2 KiB
Python
import io
|
|
import json
|
|
import logging
|
|
import re
|
|
|
|
|
|
class TriggerException(Exception):
|
|
pass
|
|
|
|
|
|
class TriggerAuthException(TriggerException):
|
|
pass
|
|
|
|
|
|
class InvalidPayloadException(TriggerException):
|
|
pass
|
|
|
|
|
|
class BuildArchiveException(TriggerException):
|
|
pass
|
|
|
|
|
|
class InvalidServiceException(TriggerException):
|
|
pass
|
|
|
|
|
|
class TriggerActivationException(TriggerException):
|
|
pass
|
|
|
|
|
|
class TriggerDeactivationException(TriggerException):
|
|
pass
|
|
|
|
|
|
class TriggerStartException(TriggerException):
|
|
pass
|
|
|
|
|
|
class ValidationRequestException(TriggerException):
|
|
pass
|
|
|
|
|
|
class SkipRequestException(TriggerException):
|
|
pass
|
|
|
|
|
|
class EmptyRepositoryException(TriggerException):
|
|
pass
|
|
|
|
|
|
class RepositoryReadException(TriggerException):
|
|
pass
|
|
|
|
|
|
class TriggerProviderException(TriggerException):
|
|
pass
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def determine_build_ref(run_parameters, get_branch_sha, get_tag_sha, default_branch):
|
|
run_parameters = run_parameters or {}
|
|
|
|
kind = ""
|
|
value = ""
|
|
|
|
if "refs" in run_parameters and run_parameters["refs"]:
|
|
kind = run_parameters["refs"]["kind"]
|
|
value = run_parameters["refs"]["name"]
|
|
elif "branch_name" in run_parameters:
|
|
kind = "branch"
|
|
value = run_parameters["branch_name"]
|
|
|
|
kind = kind or "branch"
|
|
value = value or default_branch or "master"
|
|
|
|
ref = "refs/tags/" + value if kind == "tag" else "refs/heads/" + value
|
|
commit_sha = get_tag_sha(value) if kind == "tag" else get_branch_sha(value)
|
|
return (commit_sha, ref)
|
|
|
|
|
|
def find_matching_branches(config, branches):
|
|
if "branchtag_regex" in config:
|
|
try:
|
|
regex = re.compile(config["branchtag_regex"])
|
|
return [branch for branch in branches if matches_ref("refs/heads/" + branch, regex)]
|
|
except:
|
|
pass
|
|
|
|
return branches
|
|
|
|
|
|
def should_skip_commit(metadata):
|
|
if "commit_info" in metadata:
|
|
message = metadata["commit_info"]["message"]
|
|
return "[skip build]" in message or "[build skip]" in message
|
|
return False
|
|
|
|
|
|
def raise_if_skipped_build(prepared_build, config):
|
|
"""
|
|
Raises a SkipRequestException if the given build should be skipped.
|
|
"""
|
|
# Check to ensure we have metadata.
|
|
if not prepared_build.metadata:
|
|
logger.debug("Skipping request due to missing metadata for prepared build")
|
|
raise SkipRequestException()
|
|
|
|
# Check the branchtag regex.
|
|
if "branchtag_regex" in config:
|
|
try:
|
|
regex = re.compile(config["branchtag_regex"])
|
|
except:
|
|
regex = re.compile(".*")
|
|
|
|
if not matches_ref(prepared_build.metadata.get("ref"), regex):
|
|
raise SkipRequestException()
|
|
|
|
# Check the commit message.
|
|
if should_skip_commit(prepared_build.metadata):
|
|
logger.debug("Skipping request due to commit message request")
|
|
raise SkipRequestException()
|
|
|
|
|
|
def matches_ref(ref, regex):
|
|
match_string = ref.split("/", 1)[1]
|
|
if not regex:
|
|
return False
|
|
|
|
m = regex.match(match_string)
|
|
if not m:
|
|
return False
|
|
|
|
return len(m.group(0)) == len(match_string)
|
|
|
|
|
|
def raise_unsupported():
|
|
raise io.UnsupportedOperation
|
|
|
|
|
|
def get_trigger_config(trigger):
|
|
try:
|
|
return json.loads(trigger.config)
|
|
except ValueError:
|
|
return {}
|