From b863399aa94e5ec4cdd7c60f131fb229b8f3b7b0 Mon Sep 17 00:00:00 2001 From: Guido Günther Date: Thu, 19 Jan 2017 11:46:30 +0100 Subject: pull: Allow to specify remote on the command line Closes: #851844 --- docs/manpages/gbp-pull.sgml | 10 +++++++- gbp/scripts/pull.py | 31 +++++++++++++++++------- tests/component/deb/test_pull.py | 52 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 9 deletions(-) create mode 100644 tests/component/deb/test_pull.py diff --git a/docs/manpages/gbp-pull.sgml b/docs/manpages/gbp-pull.sgml index 185a0d0b..9795ac2a 100644 --- a/docs/manpages/gbp-pull.sgml +++ b/docs/manpages/gbp-pull.sgml @@ -29,6 +29,7 @@ branch_name branch_name depth + repository @@ -36,9 +37,16 @@ &gbp-pull; updates the debian, upstream and pristine-tar - branches from a remote repository in one go. It checks if the update is safe (would + branches from remote repositories in one go. It checks if the update is safe (would result in a fast-forward merge) and aborts otherwise. + + If given on the command line the changes are fetched from the + given repository otherwise the default + for repository is read from + the remote configuration for each + branch (in git's configuration). + OPTIONS diff --git a/gbp/scripts/pull.py b/gbp/scripts/pull.py index 004156b9..ec8285fa 100755 --- a/gbp/scripts/pull.py +++ b/gbp/scripts/pull.py @@ -1,6 +1,6 @@ # vim: set fileencoding=utf-8 : # -# (C) 2009,2013 Guido Guenther +# (C) 2009,2013,2017 Guido Guenther # 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 @@ -31,7 +31,7 @@ from gbp.scripts.common import ExitCodes import gbp.log -def fast_forward_branch(branch, repo, options): +def fast_forward_branch(rem_repo, branch, repo, options): """ update branch to its remote branch, fail on non fast forward updates unless --force is given @@ -40,7 +40,11 @@ def fast_forward_branch(branch, repo, options): """ update = False - remote = repo.get_merge_branch(branch) + if rem_repo: + remote = 'refs/remotes/%s/%s' % (rem_repo, branch) + else: + remote = repo.get_merge_branch(branch) + if not remote: gbp.log.warn("No branch tracking '%s' found - skipping." % branch) return False @@ -74,7 +78,7 @@ def fast_forward_branch(branch, repo, options): def build_parser(name): try: parser = GbpOptionParser(command=os.path.basename(name), prefix='', - usage='%prog [options] - safely update a repository from remote') + usage='%prog [options] [repo] - safely update a repository from remote') except GbpError as err: gbp.log.err(err) return None @@ -103,12 +107,17 @@ def parse_args(argv): parser = build_parser(argv[0]) if not parser: return None, None - return parser.parse_args(argv) + options, args = parser.parse_args(argv) + if len(args) > 2: + parser.print_help(file=sys.stderr) + return None, None + return options, args def main(argv): retval = 0 current = None + rem_repo = None (options, args) = parse_args(argv) if not options: @@ -116,6 +125,12 @@ def main(argv): gbp.log.setup(options.color, options.verbose, options.color_scheme) + if len(args) == 2: + rem_repo = args[1] + gbp.log.info("Fetching from '%s'" % rem_repo) + else: + gbp.log.info("Fetching from default remote for each branch") + try: repo = DebianGitRepository(os.path.curdir) except GitRepositoryError: @@ -147,10 +162,10 @@ def main(argv): gbp.log.err(out) raise GbpError - repo.fetch(depth=options.depth) - repo.fetch(depth=options.depth, tags=True) + repo.fetch(rem_repo, depth=options.depth) + repo.fetch(rem_repo, depth=options.depth, tags=True) for branch in branches: - if not fast_forward_branch(branch, repo, options): + if not fast_forward_branch(rem_repo, branch, repo, options): retval = 2 if options.redo_pq: diff --git a/tests/component/deb/test_pull.py b/tests/component/deb/test_pull.py new file mode 100644 index 00000000..80f6fe66 --- /dev/null +++ b/tests/component/deb/test_pull.py @@ -0,0 +1,52 @@ +# vim: set fileencoding=utf-8 : +# +# (C) 2017 Guido Günther +# +# 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, please see +# + +import os + +from tests.component import (ComponentTestBase, + ComponentTestGitRepository) +from tests.component.deb.fixtures import RepoFixtures + +from nose.tools import eq_ + +from gbp.scripts.clone import main as clone +from gbp.scripts.pull import main as pull + + +class TestPull(ComponentTestBase): + """Test cloning from a remote""" + + @RepoFixtures.native + def test_pull_explicit_remote(self, repo): + """Test that pulling of debian native packages works""" + dest = os.path.join(self._tmpdir, 'cloned_repo') + clone(['arg0', repo.path, dest]) + cloned = ComponentTestGitRepository(dest) + self._check_repo_state(cloned, 'master', ['master']) + eq_(pull(['argv0', 'origin']), 0) + assert len(repo.get_commits()) == 1 + + @RepoFixtures.native + def test_pull_default_remote(self, repo): + """Test that pulling of debian native packages works""" + dest = os.path.join(self._tmpdir, 'cloned_repo') + clone(['arg0', repo.path, dest]) + cloned = ComponentTestGitRepository(dest) + self._check_repo_state(cloned, 'master', ['master']) + eq_(pull(['argv0']), 0) + assert len(repo.get_commits()) == 1 -- cgit v1.2.3