diff options
Diffstat (limited to 'gbp/scripts/pull.py')
-rw-r--r-- | gbp/scripts/pull.py | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/gbp/scripts/pull.py b/gbp/scripts/pull.py new file mode 100644 index 0000000..69ad1a6 --- /dev/null +++ b/gbp/scripts/pull.py @@ -0,0 +1,134 @@ +# vim: set fileencoding=utf-8 : +# +# (C) 2009 Guido Guenther <agx@sigxcpu.org> +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# heavily inspired by dom-safe-pull which is © 2009 Stéphane Glondu <steph@glondu.net> +# +"""fast forward debian, upstream and pristine-tar branch""" + +import sys +import os, os.path +from gbp.command_wrappers import (Command, + CommandExecFailed, PristineTar) +from gbp.config import (GbpOptionParser, GbpOptionGroup) +from gbp.errors import GbpError +from gbp.git import (GitRepositoryError, GitRepository) +import gbp.log + +def fast_forward_branch(branch, repo, options): + """ + update branch to its remote branch, fail on non fast forward updates + unless --force is given + @return: branch updated or already up to date + @rtype: boolean + """ + update = False + + remote = repo.get_merge_branch(branch) + if not remote: + gbp.log.warn("No branch tracking '%s' found - skipping." % branch) + return False + + can_fast_forward, up_to_date = repo.is_fast_forward(branch, remote) + + if up_to_date: # Great, we're done + gbp.log.info("Branch '%s' is already up to date." % branch) + return True + + if can_fast_forward: + update = True + else: + if options.force: + gbp.log.info("Non-fast forwarding '%s' due to --force" % branch) + update = True + else: + gbp.log.warn("Skipping non-fast forward of '%s' - use --force" % branch) + + if update: + gbp.log.info("Updating '%s'" % branch) + repo.set_branch(branch) + repo.merge(remote) + return update + +def main(argv): + retval = 0 + + parser = GbpOptionParser(command=os.path.basename(argv[0]), prefix='', + 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("--redo-pq", action="store_true", dest="redo_pq", default=False, + help="redo the patch queue branch after a pull. Warning: this drops the old patch-queue branch") + branch_group.add_config_file_option(option_name="upstream-branch", dest="upstream_branch") + branch_group.add_config_file_option(option_name="debian-branch", dest="debian_branch") + branch_group.add_boolean_config_file_option(option_name="pristine-tar", dest="pristine_tar") + parser.add_option("-v", "--verbose", action="store_true", dest="verbose", default=False, + help="verbose command execution") + parser.add_config_file_option(option_name="color", dest="color", type='tristate') + + + (options, args) = parser.parse_args(argv) + gbp.log.setup(options.color, options.verbose) + + try: + repo = GitRepository(os.path.curdir) + except GitRepositoryError: + gbp.log.err("%s is not a git repository" % (os.path.abspath('.'))) + return 1 + + try: + branches = [] + current = repo.get_branch() + + for branch in [ options.debian_branch, options.upstream_branch ]: + if repo.has_branch(branch): + branches += [ branch ] + + if repo.has_branch(PristineTar.branch) and options.pristine_tar: + branches += [ PristineTar.branch ] + + (ret, out) = repo.is_clean() + if not ret: + gbp.log.err("You have uncommitted changes in your source tree:") + gbp.log.err(out) + raise GbpError + + repo.fetch() + for branch in branches: + if not fast_forward_branch(branch, repo, options): + retval = 2 + + if options.redo_pq: + repo.set_branch(options.debian_branch) + Command("gbp-pq")(["drop"]) + Command("gbp-pq")(["import"]) + + repo.set_branch(current) + except CommandExecFailed: + retval = 1 + except GbpError, err: + if len(err.__str__()): + gbp.log.err(err) + retval = 1 + + return retval + +if __name__ == '__main__': + sys.exit(main(sys.argv)) + +# vim:et:ts=4:sw=4:et:sts=4:ai:set list listchars=tab\:»·,trail\:·: |