def pre_install(cls, component, request): if cls.trigger_update: perform_update.delay('Component', component.pk, auto=True) if component.repo_needs_merge(): messages.warning( request, _('The repository is outdated, you might not get ' 'expected results until you update it.'))
def update_project(request, project): """API hook for updating git repos.""" if not settings.ENABLE_HOOKS: return HttpResponseNotAllowed([]) obj = get_project(request, project, True) if not obj.enable_hooks: return HttpResponseNotAllowed([]) perform_update.delay("Project", obj.pk) return hook_response()
def warn_outdated(self, form): linked = form.instance.linked_component if linked: perform_update.delay("Component", linked.pk, auto=True) if linked.repo_needs_merge(): messages.warning( self.request, _("The repository is outdated, you might not get " "expected results until you update it."), )
def vcs_service_hook(request, service): """Shared code between VCS service hooks. Currently used for bitbucket_hook, github_hook and gitlab_hook, but should be usable for other VCS services (Google Code, custom coded sites, etc.) too. """ # We support only post methods if not settings.ENABLE_HOOKS: return HttpResponseNotAllowed(()) # Check if we got payload try: data = parse_hook_payload(request) except (ValueError, KeyError): return HttpResponseBadRequest("Could not parse JSON payload!") if not data: return HttpResponseBadRequest("Invalid data in json payload!") # Get service helper hook_helper = HOOK_HANDLERS[service] # Send the request data to the service handler. try: service_data = hook_helper(data, request) except Exception as error: LOGGER.error("failed to parse service %s data", service) report_error(error, request) return HttpResponseBadRequest("Invalid data in json payload!") # This happens on ping request upon installation if service_data is None: return hook_response("Hook working", status=201) # Log data service_long_name = service_data["service_long_name"] repos = service_data["repos"] repo_url = service_data["repo_url"] branch = service_data["branch"] full_name = service_data["full_name"] # Generate filter spfilter = Q(repo__in=repos) | Q(repo__iendswith=full_name) # We need to match also URLs which include username and password for repo in repos: if repo.startswith("http://"): spfilter = spfilter | ( Q(repo__startswith="http://") & Q(repo__endswith="@{0}".format(repo[7:])) ) elif repo.startswith("https://"): spfilter = spfilter | ( Q(repo__startswith="https://") & Q(repo__endswith="@{0}".format(repo[8:])) ) all_components = Component.objects.filter(spfilter) if branch is not None: all_components = all_components.filter(branch=branch) components = all_components.filter(project__enable_hooks=True) LOGGER.info( "received %s notification on repository %s, branch %s, " "%d matching components, %d to process", service_long_name, repo_url, branch, all_components.count(), components.count(), ) # Trigger updates updates = 0 for obj in components: updates += 1 LOGGER.info("%s notification will update %s", service_long_name, obj) Change.objects.create( component=obj, action=Change.ACTION_HOOK, details=service_data ) perform_update.delay("Component", obj.pk) if updates == 0: return hook_response("No matching repositories found!", "failure", status=202) return hook_response( "Update triggered: {}".format(", ".join(obj.full_slug for obj in components)) )
def vcs_service_hook(request, service): """Shared code between VCS service hooks. Currently used for bitbucket_hook, github_hook and gitlab_hook, but should be usable for other VCS services (Google Code, custom coded sites, etc.) too. """ # We support only post methods if not settings.ENABLE_HOOKS: return HttpResponseNotAllowed(()) # Check if we got payload try: data = parse_hook_payload(request) except (ValueError, KeyError, UnicodeError): return HttpResponseBadRequest('Could not parse JSON payload!') # Get service helper hook_helper = HOOK_HANDLERS[service] # Send the request data to the service handler. try: service_data = hook_helper(data) except Exception as error: LOGGER.error('failed to parse service %s data', service) report_error(error, sys.exc_info()) return HttpResponseBadRequest('Invalid data in json payload!') # This happens on ping request upon installation if service_data is None: return hook_response('Hook working') # Log data service_long_name = service_data['service_long_name'] repos = service_data['repos'] repo_url = service_data['repo_url'] branch = service_data['branch'] full_name = service_data['full_name'] # Generate filter spfilter = Q(repo__in=repos) | Q(repo__iendswith=full_name) # We need to match also URLs which include username and password for repo in repos: if not repo.startswith('https://'): continue spfilter = spfilter | ( Q(repo__startswith='https://') & Q(repo__endswith='@{0}'.format(repo[8:])) ) all_components = Component.objects.filter(spfilter) if branch is not None: all_components = all_components.filter(branch=branch) components = all_components.filter(project__enable_hooks=True) LOGGER.info( 'received %s notification on repository %s, branch %s, ' '%d matching components, %d to process', service_long_name, repo_url, branch, all_components.count(), components.count(), ) # Trigger updates updates = 0 for obj in components: updates += 1 LOGGER.info( '%s notification will update %s', service_long_name, obj ) perform_update.delay('Component', obj.pk) if updates == 0: return hook_response('No matching repositories found!', 'failure') return hook_response('Update triggered: {}'.format( ', '.join([obj.log_prefix for obj in components]) ))
def handle(self, *args, **options): for component in self.get_components(*args, **options): perform_update.delay('Component', component.pk)