aboutsummaryrefslogtreecommitdiffhomepage
path: root/gbp/scripts/import_orig.py
diff options
context:
space:
mode:
authorGuido Günther <agx@sigxcpu.org>2018-02-26 15:08:05 +0100
committerGuido Günther <agx@sigxcpu.org>2018-02-26 15:08:05 +0100
commit53016921be103ae1e906b09bb840d3f0c7fcca0f (patch)
tree6e9bd7aad84bac8578895788f91e9168e387fab8 /gbp/scripts/import_orig.py
parent23874c2c50ebd57426797d38f4f9c6c40dc336ec (diff)
Move rollback code out of import_orig
so it can be reused in gbp import-ref
Diffstat (limited to 'gbp/scripts/import_orig.py')
-rw-r--r--gbp/scripts/import_orig.py137
1 files changed, 3 insertions, 134 deletions
diff --git a/gbp/scripts/import_orig.py b/gbp/scripts/import_orig.py
index 72d353f4..ad543e68 100644
--- a/gbp/scripts/import_orig.py
+++ b/gbp/scripts/import_orig.py
@@ -28,7 +28,7 @@ from gbp.deb.format import DebianSourceFormat
from gbp.deb.upstreamsource import DebianUpstreamSource, unpack_component_tarball
from gbp.deb.uscan import (Uscan, UscanError)
from gbp.deb.changelog import ChangeLog, NoChangeLogError
-from gbp.deb.git import (GitRepositoryError, DebianGitRepository)
+from gbp.deb.git import GitRepositoryError
from gbp.config import GbpOptionParserDebian, GbpOptionGroup, no_upstream_branch_msg
from gbp.errors import GbpError
from gbp.format import format_str
@@ -39,138 +39,7 @@ from gbp.scripts.common.import_orig import (orig_needs_repack, cleanup_tmp_tree,
ask_package_name, ask_package_version,
repack_upstream, is_link_target, download_orig)
from gbp.scripts.common.hook import Hook
-
-
-class RollbackError(GitRepositoryError):
- """
- Error raised if the rollback failed
- """
- def __init__(self, errors):
- self.msg = "Automatic rollback failed"
- super(RollbackError, self).__init__(self.msg)
- self.errors = errors
-
- def __str__(self):
- return "%s %s" % (self.msg, self.errors)
-
-
-class ImportOrigDebianGitRepository(DebianGitRepository):
- """
- Like a DebianGitRepository but can also perform rollbacks and knows
- about some of the inner workings upstream vcs_tag, …
- """
- def __init__(self, *args, **kwargs):
- self.rollbacks = []
- self.rollback_errors = []
- DebianGitRepository.__init__(self, *args, **kwargs)
-
- def has_rollbacks(self):
- return len(self.rollbacks) > 0
-
- def vcs_tag_parent(self, vcs_tag_format, version):
- """If linking to the upstream VCS get the commit id"""
- if vcs_tag_format:
- return [self.rev_parse("%s^{}" % self.version_to_tag(vcs_tag_format, version))],
- else:
- return None
-
- def rrr(self, refname, action, reftype):
- """
- Remember ref for rollback
-
- @param refname: ref to roll back
- @param action: the rollback action (delete, reset, ...)
- @param reftype: the reference type (tag, branch, ...)
- """
- sha = None
-
- if action == 'reset':
- try:
- sha = self.rev_parse(refname)
- except GitRepositoryError as err:
- gbp.log.warn("Failed to rev-parse %s: %s" % (refname, err))
- elif action == 'delete':
- pass
- elif action == 'abortmerge':
- pass
- else:
- raise GbpError("Unknown action %s for %s %s" % (action, reftype, refname))
- self.rollbacks.append((refname, reftype, action, sha))
-
- def rrr_branch(self, branchname, action='reset-or-delete'):
- if action == 'reset-or-delete':
- if self.has_branch(branchname):
- return self.rrr(branchname, 'reset', 'branch')
- else:
- return self.rrr(branchname, 'delete', 'branch')
- else:
- return self.rrr(branchname, action, 'branch')
-
- def rrr_tag(self, tagname, action='delete'):
- return self.rrr(tagname, action, 'tag')
-
- def rrr_merge(self, commit, action='abortmerge'):
- return self.rrr(commit, action, 'commit')
-
- def rollback(self):
- """
- Perform a complete rollback
-
- Try to roll back as much as possible and remember what failed.
- """
- for (name, reftype, action, sha) in self.rollbacks:
- try:
- if action == 'delete':
- gbp.log.info('Rolling back %s %s by deleting it' % (reftype, name))
- if reftype == 'tag':
- self.delete_tag(name)
- elif reftype == 'branch':
- self.delete_branch(name)
- else:
- raise GitRepositoryError("Don't know how to delete %s %s" % (reftype, name))
- elif action == 'reset' and reftype == 'branch':
- gbp.log.info('Rolling back branch %s by resetting it to %s' % (name, sha))
- self.update_ref("refs/heads/%s" % name, sha, msg="gbp import-orig: failure rollback of %s" % name)
- elif action == 'abortmerge':
- if self.is_in_merge():
- gbp.log.info('Rolling back failed merge of %s' % name)
- self.abort_merge()
- else:
- gbp.log.info("Nothing to rollback for merge of '%s'" % name)
- else:
- raise GitRepositoryError("Don't know how to %s %s %s" % (action, reftype, name))
- except GitRepositoryError as e:
- self.rollback_errors.append((name, reftype, action, sha, e))
- if self.rollback_errors:
- raise RollbackError(self.rollback_errors)
-
- # Wrapped methods for rollbacks
- def create_tag(self, *args, **kwargs):
- name = kwargs['name']
- ret = super(ImportOrigDebianGitRepository, self).create_tag(*args, **kwargs)
- self.rrr_tag(name)
- return ret
-
- def commit_dir(self, *args, **kwargs):
- import_branch = kwargs['branch']
- self.rrr_branch(import_branch)
- return super(ImportOrigDebianGitRepository, self).commit_dir(*args, **kwargs)
-
- def create_branch(self, *args, **kwargs):
- branch = kwargs['branch']
- ret = super(ImportOrigDebianGitRepository, self).create_branch(*args, **kwargs)
- self.rrr_branch(branch, 'delete')
- return ret
-
- def merge(self, *args, **kwargs):
- commit = args[0] if args else kwargs['commit']
- try:
- return super(ImportOrigDebianGitRepository, self).merge(*args, **kwargs)
- except GitRepositoryError:
- # Only cleanup in the error case to undo working copy
- # changes. Resetting the refs handles the other cases.
- self.rrr_merge(commit)
- raise
+from gbp.deb.rollbackgit import RollbackDebianGitRepository
def prepare_pristine_tar(archive, pkg, version):
@@ -535,7 +404,7 @@ def main(argv):
try:
try:
- repo = ImportOrigDebianGitRepository('.')
+ repo = RollbackDebianGitRepository('.')
except GitRepositoryError:
raise GbpError("%s is not a git repository" % (os.path.abspath('.')))