diff options
author | Markus Lehtonen <markus.lehtonen@linux.intel.com> | 2012-01-12 15:26:55 +0200 |
---|---|---|
committer | Markus Lehtonen <markus.lehtonen@linux.intel.com> | 2013-04-03 09:46:11 +0300 |
commit | a9cf7131bf22cbf3435a4df4075eb8ecf12d6b1f (patch) | |
tree | c48644e9f69b9e62ff1abc93e2012d2be73680c5 | |
parent | 48a243f94c8c42c813ffc8f0c59f567a0933d12a (diff) | |
download | git-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.sgml | 13 | ||||
-rwxr-xr-x | gbp/scripts/pull.py | 57 |
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") |