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
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
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