From 9e426aa43231073c4a98dae3f6c16d67ab6f3b59 Mon Sep 17 00:00:00 2001 From: Daniel Sandler Date: Thu, 1 Apr 2010 10:42:33 -0400 Subject: rebase: Automatically rebase branch on upstrea Usage: repo rebase [[-i] ...] Rebases the current topic branch of the specified (or all) projects against the appropriate upstream. Note: Interactive rebase is currently only supported when exactly one project is specified on the command line. Change-Id: I7376e35f27a6585149def82938c1ca99f36db2c4 Signed-off-by: Shawn O. Pearce --- subcmds/rebase.py | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 subcmds/rebase.py (limited to 'subcmds/rebase.py') diff --git a/subcmds/rebase.py b/subcmds/rebase.py new file mode 100644 index 00000000..44cdd2eb --- /dev/null +++ b/subcmds/rebase.py @@ -0,0 +1,75 @@ +# +# Copyright (C) 2010 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys + +from command import Command +from git_command import GitCommand +from git_refs import GitRefs, HEAD, R_HEADS, R_TAGS, R_PUB, R_M +from error import GitError + +class Rebase(Command): + common = True + helpSummary = "Rebase local branches on upstream branch" + helpUsage = """ +%prog {[...] | -i ...} +""" + helpDescription = """ +'%prog' uses git rebase to move local changes in the current topic branch to +the HEAD of the upstream history, useful when you have made commits in a topic +branch but need to incorporate new upstream changes "underneath" them. +""" + + def _Options(self, p): + p.add_option('-i', '--interactive', + dest="interactive", action="store_true", + help="interactive rebase (single project only)") + + def Execute(self, opt, args): + all = self.GetProjects(args) + one_project = len(all) == 1 + + if opt.interactive and not one_project: + print >>sys.stderr, 'error: interactive rebase not supported with multiple projects' + return -1 + + for project in all: + cb = project.CurrentBranch + if not cb: + if one_project: + print >>sys.stderr, "error: project %s has a detatched HEAD" % project.name + return -1 + # ignore branches with detatched HEADs + continue + + upbranch = project.GetBranch(cb) + if not upbranch.LocalMerge: + if one_project: + print >>sys.stderr, "error: project %s does not track any remote branches" % project.name + return -1 + # ignore branches without remotes + continue + + upstream = project.GetRevisionId() + + args = ["rebase"] + if opt.interactive: + args.append("-i") + args.append(upstream) + + print '# project %s: rebasing branch %s -> %s (%s)' % ( + project.relpath, cb, upbranch.LocalMerge, upstream[0:7]) + if GitCommand(project, args).Wait() != 0: + return -1 -- cgit v1.2.3-54-g00ecf From a22f99ae41a9cdda2129c89678a6f581b0445c85 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Thu, 15 Jul 2010 17:40:41 -0700 Subject: rebase: Pass through more options Passing through --whitespace=fix to rebase can be useful to clean up a branch prior to uploading it for review. Change-Id: Id85f1912e5e11ff9602e3b342c2fd7441abe67d7 Signed-off-by: Shawn O. Pearce --- subcmds/rebase.py | 46 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 7 deletions(-) (limited to 'subcmds/rebase.py') diff --git a/subcmds/rebase.py b/subcmds/rebase.py index 44cdd2eb..7c8e9389 100644 --- a/subcmds/rebase.py +++ b/subcmds/rebase.py @@ -37,6 +37,22 @@ branch but need to incorporate new upstream changes "underneath" them. dest="interactive", action="store_true", help="interactive rebase (single project only)") + p.add_option('-f', '--force-rebase', + dest='force_rebase', action='store_true', + help='Pass --force-rebase to git rebase') + p.add_option('--no-ff', + dest='no_ff', action='store_true', + help='Pass --no-ff to git rebase') + p.add_option('-q', '--quiet', + dest='quiet', action='store_true', + help='Pass --quiet to git rebase') + p.add_option('--autosquash', + dest='autosquash', action='store_true', + help='Pass --autosquash to git rebase') + p.add_option('--whitespace', + dest='whitespace', action='store', metavar='WS', + help='Pass --whitespace to git rebase') + def Execute(self, opt, args): all = self.GetProjects(args) one_project = len(all) == 1 @@ -49,7 +65,7 @@ branch but need to incorporate new upstream changes "underneath" them. cb = project.CurrentBranch if not cb: if one_project: - print >>sys.stderr, "error: project %s has a detatched HEAD" % project.name + print >>sys.stderr, "error: project %s has a detatched HEAD" % project.relpath return -1 # ignore branches with detatched HEADs continue @@ -57,19 +73,35 @@ branch but need to incorporate new upstream changes "underneath" them. upbranch = project.GetBranch(cb) if not upbranch.LocalMerge: if one_project: - print >>sys.stderr, "error: project %s does not track any remote branches" % project.name + print >>sys.stderr, "error: project %s does not track any remote branches" % project.relpath return -1 # ignore branches without remotes continue - upstream = project.GetRevisionId() - args = ["rebase"] + + if opt.whitespace: + args.append('--whitespace=%s' % opt.whitespace) + + if opt.quiet: + args.append('--quiet') + + if opt.force_rebase: + args.append('--force-rebase') + + if opt.no_ff: + args.append('--no-ff') + + if opt.autosquash: + args.append('--autosquash') + if opt.interactive: args.append("-i") - args.append(upstream) - print '# project %s: rebasing branch %s -> %s (%s)' % ( - project.relpath, cb, upbranch.LocalMerge, upstream[0:7]) + args.append(upbranch.LocalMerge) + + print >>sys.stderr, '# %s: rebasing %s -> %s' % \ + (project.relpath, cb, upbranch.LocalMerge) + if GitCommand(project, args).Wait() != 0: return -1 -- cgit v1.2.3-54-g00ecf