Exemple #1
0
    def do_update(self, request=None, method=None):
        '''
        Wrapper for doing repository update and pushing them to translations.
        '''
        if self.is_repo_link:
            return self.linked_subproject.do_update(request)

        # pull remote
        if not self.update_remote_branch():
            return False

        # do we have something to merge?
        if not self.repo_needs_merge() and method != 'rebase':
            return True

        # commit possible pending changes
        self.commit_pending(request)

        # update remote branch
        ret = self.update_branch(request, method=method)

        # run post update hook
        vcs_post_update.send(sender=self.__class__, component=self)

        # create translation objects for all files
        self.create_translations(request=request)

        # Push after possible merge
        if (self.repo_needs_push() and
                ret and
                self.project.push_on_commit and
                self.can_push()):
            self.do_push(request, force_commit=False, do_update=False)

        return ret
Exemple #2
0
    def update_branch(self, request=None, method=None):
        """
        Updates current branch to match remote (if possible).
        """
        if self.is_repo_link:
            return self.linked_subproject.update_branch(request)

        if method is None:
            method = self.merge_style

        # Merge/rebase
        if method == "rebase":
            method = self.repository.rebase
            error_msg = _("Failed to rebase our branch onto remote branch %s.")
            action = Change.ACTION_REBASE
            action_failed = Change.ACTION_FAILED_REBASE
        else:
            method = self.repository.merge
            error_msg = _("Failed to merge remote branch into %s.")
            action = Change.ACTION_MERGE
            action_failed = Change.ACTION_FAILED_MERGE

        with self.repository_lock:
            try:
                # Try to merge it
                method(self.branch)
                self.log_info("%s remote into repo", self.merge_style)
                if self.id:
                    Change.objects.create(subproject=self, user=request.user if request else None, action=action)

                    # run post update hook
                    vcs_post_update.send(sender=self.__class__, component=self)
                return True
            except RepositoryException as error:
                # In case merge has failer recover
                error = str(error)
                status = self.repository.status()

                # Log error
                self.log_error("failed %s on repo: %s", self.merge_style, error)

                # Reset repo back
                method(abort=True)

        if self.id:
            Change.objects.create(
                subproject=self, user=request.user if request else None, action=action_failed, target=str(error)
            )

        # Notify subscribers and admins
        self.notify_merge_failure(error, status)

        # Tell user (if there is any)
        if request is not None:
            messages.error(request, error_msg % self.__unicode__())

        return False
Exemple #3
0
    def update_branch(self, request=None, method=None):
        '''
        Updates current branch to match remote (if possible).
        '''
        if self.is_repo_link:
            return self.linked_subproject.update_branch(request)

        if method is None:
            method = self.merge_style

        # Merge/rebase
        if method == 'rebase':
            method = self.repository.rebase
            error_msg = _('Failed to rebase our branch onto remote branch %s.')
            action = Change.ACTION_REBASE
            action_failed = Change.ACTION_FAILED_REBASE
        else:
            method = self.repository.merge
            error_msg = _('Failed to merge remote branch into %s.')
            action = Change.ACTION_MERGE
            action_failed = Change.ACTION_FAILED_MERGE

        with self.repository_lock:
            try:
                # Try to merge it
                method(self.branch)
                self.log_info(
                    '%s remote into repo',
                    self.merge_style,
                )
                if self.id:
                    Change.objects.create(
                        subproject=self,
                        user=request.user if request else None,
                        action=action,
                    )

                    # run post update hook
                    vcs_post_update.send(sender=self.__class__, component=self)
                return True
            except RepositoryException as error:
                # In case merge has failer recover
                error = str(error)
                status = self.repository.status()

                # Log error
                self.log_error(
                    'failed %s on repo: %s',
                    self.merge_style,
                    error
                )

                # Reset repo back
                method(abort=True)

        if self.id:
            Change.objects.create(
                subproject=self,
                user=request.user if request else None,
                action=action_failed,
                target=str(error),
            )

        # Notify subscribers and admins
        self.notify_merge_failure(error, status)

        # Tell user (if there is any)
        if request is not None:
            messages.error(
                request,
                error_msg % self.__unicode__()
            )

        return False