summaryrefslogtreecommitdiff
path: root/gbp/scripts/pull.py
diff options
context:
space:
mode:
Diffstat (limited to 'gbp/scripts/pull.py')
-rw-r--r--gbp/scripts/pull.py134
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\:·: