summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Lehtonen <markus.lehtonen@linux.intel.com>2012-01-12 15:26:55 +0200
committerMarkus Lehtonen <markus.lehtonen@linux.intel.com>2013-04-03 09:46:11 +0300
commita9cf7131bf22cbf3435a4df4075eb8ecf12d6b1f (patch)
treec48644e9f69b9e62ff1abc93e2012d2be73680c5
parent48a243f94c8c42c813ffc8f0c59f567a0933d12a (diff)
downloadgit-buildpackage-a9cf7131bf22cbf3435a4df4075eb8ecf12d6b1f.tar.gz
git-buildpackage-a9cf7131bf22cbf3435a4df4075eb8ecf12d6b1f.tar.bz2
git-buildpackage-a9cf7131bf22cbf3435a4df4075eb8ecf12d6b1f.zip
gbp-pull: two modes for --force
The 'force' option now has two possible values: 'merge': upstream branch is merged, even if fast-forward is not possible. 'clean': check out a clean copy from the upstream if fast-forward is not possible (i.e. no merge). Local changes are lost in this case. Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com>
-rw-r--r--docs/manpages/gbp-pull.sgml13
-rwxr-xr-xgbp/scripts/pull.py57
2 files changed, 46 insertions, 24 deletions
diff --git a/docs/manpages/gbp-pull.sgml b/docs/manpages/gbp-pull.sgml
index d52f9cbe..6849b7cb 100644
--- a/docs/manpages/gbp-pull.sgml
+++ b/docs/manpages/gbp-pull.sgml
@@ -22,7 +22,7 @@
&gbp-pull;
<arg><option>--verbose</option></arg>
- <arg><option>--force</option></arg>
+ <arg><option>--force=</option><replaceable>[merge|clean]</replaceable></arg>
<arg><option>--all</option></arg>
<arg><option>--redo-pq</option></arg>
<arg><option>--[no-]pristine-tar</option></arg>
@@ -45,11 +45,14 @@
<variablelist>
<varlistentry>
- <term><option>--force</option></term>
+ <term><option>--force=</option><replaceable>[merge|clean]</replaceable></term>
<listitem>
- <para>force a branch update even if this results in a non fast
- forward update. <warning><para>Forcing a branch updates
- makes you lose your modifications.</para></warning></para>
+ <para>Force a branch update even if this results in a non fast
+ forward update.
+ <emphasis>merge</emphasis> does a git-merge.
+ <emphasis>clean</emphasis> checks out a clean copy from upstream.
+ <warning><para>using <emphasis>clean</emphasis>
+ makes you lose your modifications.</para></warning></para>
</listitem>
</varlistentry>
<varlistentry>
diff --git a/gbp/scripts/pull.py b/gbp/scripts/pull.py
index 6259a633..63928d6c 100755
--- a/gbp/scripts/pull.py
+++ b/gbp/scripts/pull.py
@@ -35,7 +35,7 @@ def update_branch(branch, repo, options):
@return: branch updated or already up to date
@rtype: boolean
"""
- update = False
+ update = None
remote = repo.get_merge_branch(branch)
if not remote:
@@ -49,11 +49,14 @@ def update_branch(branch, repo, options):
return True
if can_fast_forward:
- update = True
+ update = 'merge'
else:
- if options.force:
- gbp.log.info("Non-fast forwarding '%s' due to --force" % branch)
- update = True
+ if options.force == 'merge':
+ gbp.log.info("Non-fast forwarding '%s' due to --force=merge" % branch)
+ update = 'merge'
+ elif options.force == 'clean':
+ gbp.log.info("Checking out clean copy of '%s' due to --force=clean" % branch)
+ update = 'clean'
else:
gbp.log.warn("Skipping non-fast forward of '%s' - use --force or "
"update manually" % branch)
@@ -61,19 +64,32 @@ def update_branch(branch, repo, options):
if update:
gbp.log.info("Updating '%s'" % branch)
if repo.branch == branch:
- repo.merge(remote)
- elif can_fast_forward:
- sha1 = repo.rev_parse(remote)
- repo.update_ref("refs/heads/%s" % branch, sha1,
- msg="gbp: forward %s to %s" % (branch, remote))
+ if update == 'merge':
+ repo.merge(remote)
+ elif update == 'clean':
+ # Have to drop our current branch
+ tmpbranch = "_gbptmp-"+branch
+ gbp.log.debug("Checking out '%s' to '%s'" % (remote, tmpbranch))
+ repo.create_branch(tmpbranch, remote)
+ gbp.log.debug("Switching current branch to '%s'" % (tmpbranch))
+ repo.set_branch(tmpbranch)
+ gbp.log.debug("Dropping branch '%s'" % branch)
+ repo.delete_branch(branch)
+ gbp.log.info("Renaming branch '%s' to '%s'" % (tmpbranch, branch))
+ repo.rename_branch(tmpbranch, branch)
else:
- # Merge other branch, if it cannot be fast-forwarded
- current_branch=repo.branch
- repo.set_branch(branch)
- repo.merge(remote)
- repo.set_branch(current_branch)
-
- return update
+ if can_fast_forward or (update == 'clean'):
+ sha1 = repo.rev_parse(remote)
+ repo.update_ref("refs/heads/%s" % branch, sha1,
+ msg="gbp: forward %s to %s" % (branch, remote))
+ elif update == 'merge':
+ # Merge other branch, if it cannot be fast-forwarded
+ current_branch=repo.branch
+ repo.set_branch(branch)
+ repo.merge(remote)
+ repo.set_branch(current_branch)
+
+ return (update != None)
def main(argv):
retval = 0
@@ -82,8 +98,11 @@ def main(argv):
usage='%prog [options] - safely update a repository from remote')
branch_group = GbpOptionGroup(parser, "branch options", "branch update and layout options")
parser.add_option_group(branch_group)
- branch_group.add_option("--force", action="store_true", dest="force", default=False,
- help="force a branch update even if can't be fast forwarded")
+ branch_group.add_option("--force", action="store", dest="force",
+ default=None,
+ help="force a branch update even if can't be fast "
+ "forwarded (valid ACTIONs are 'merge', "
+ "'clean')", metavar='ACTION')
branch_group.add_option("--all", action="store_true", default=False,
help="update all remote-tracking branches that "
"have identical name in the remote")