diff options
-rw-r--r-- | modules/llvm.py | 17 | ||||
-rw-r--r-- | scripts/llvm.py | 21 | ||||
-rw-r--r-- | tests/cli/testllvmpush.py | 5 | ||||
-rw-r--r-- | tests/unittests/testpush.py | 190 |
4 files changed, 139 insertions, 94 deletions
diff --git a/modules/llvm.py b/modules/llvm.py index 2e7c44f..2ce4994 100644 --- a/modules/llvm.py +++ b/modules/llvm.py @@ -268,25 +268,26 @@ def get_user_from_remote(url): return match.group('user') -def push_current_branch(proj, pathToRepo): - """Push the current branch to origin. - - It will be pushed into linaro-local/$user/$branch, where $branch is the - current branch and $user is the username used as part of the remote URL. +def get_remote_branch(repo, local_branch): + """ + Get the name of the remote branch corresponding to the given local branch. """ - repo = Worktree(proj, pathToRepo) - with cd(repo.repodir): remote = git("remote", "get-url", "--push", "origin").strip() user = get_user_from_remote(remote) if not user: raise EnvironmentError("Couldn't parse user from {}.".format(remote)) - local_branch = repo.getbranch() remote_branch = "linaro-local/{}/{}".format(user, local_branch) if not repo.is_valid_branch_name(remote_branch): raise EnvironmentError( "{} is not a valid branch name.".format(remote_branch)) + return remote_branch + + +def push_branch(proj, local_branch, remote_branch, pathToRepo): + """Push the given local branch into origin's given remote branch.""" + repo = Worktree(proj, pathToRepo) with cd(repo.repodir): git("push", "-u", "origin", "+{}:{}".format(local_branch, remote_branch)) diff --git a/scripts/llvm.py b/scripts/llvm.py index 2252ab2..3244bde 100644 --- a/scripts/llvm.py +++ b/scripts/llvm.py @@ -3,7 +3,11 @@ import os from sys import exit -from modules.llvm import LLVMSubproject, LLVMSourceConfig, push_current_branch +from modules.llvm import LLVMSubproject +from modules.llvm import LLVMSourceConfig +from modules.llvm import get_remote_branch +from modules.llvm import push_branch + from linaropy.git.clone import Clone from linaropy.proj import Proj @@ -66,7 +70,7 @@ def projects(args): dump_config(config) -def push_branch(args): +def push_current_branch(args): """Push current branch to origin.""" proj = Proj() @@ -74,13 +78,18 @@ def push_branch(args): llvm_worktree_root = get_worktree_root(args.env) config = LLVMSourceConfig(proj, llvm_worktree_root) - llvmBranch = Clone(proj, llvm_worktree_root).getbranch() + llvm_worktree = Clone(proj, llvm_worktree_root) + local_branch = llvm_worktree.getbranch() try: - config.for_each_enabled(partial(push_current_branch, proj)) - except RuntimeError as exc: + remote_branch = get_remote_branch(llvm_worktree, local_branch) + config.for_each_enabled(partial(push_branch, proj, local_branch, + remote_branch)) + print("Pushed to {}".format(remote_branch)) + except (EnvironmentError, RuntimeError) as exc: die("Failed to push branch because: " + str(exc) + str(exc.__cause__)) + ########################################################################## # Command line parsing # ########################################################################## @@ -127,7 +136,7 @@ projs.add_argument( push = subcommands.add_parser( "push", help="Push current branch to origin linaro-local/<user>/<branch>, for all linked subprojects.") -push.set_defaults(run_command=push_branch) +push.set_defaults(run_command=push_current_branch) args = options.parse_args() args.run_command(args) diff --git a/tests/cli/testllvmpush.py b/tests/cli/testllvmpush.py index 769aa18..1d9b8ab 100644 --- a/tests/cli/testllvmpush.py +++ b/tests/cli/testllvmpush.py @@ -101,9 +101,12 @@ class Testllvmpush(LLVMTestCase): with cd(worktreePath): self.create_dummy_commit("Test {} push".format(subproj)) - self.run_quietly(self.llvm_push()) + pushed = self.run_with_output(self.llvm_push()) remote_branch = "linaro-local/{}/{}".format(self.user, self.branch) + self.assertRegex( + pushed, "(.*\n)*Pushed to {}(.*\n)*".format(remote_branch)) + for subproj in self.all_repos: origin = self.get_origin_path(subproj) diff --git a/tests/unittests/testpush.py b/tests/unittests/testpush.py index 0046e2b..3eb8e35 100644 --- a/tests/unittests/testpush.py +++ b/tests/unittests/testpush.py @@ -9,7 +9,30 @@ from linaropy.proj import Proj from linaropy.git.clone import Clone from linaropy.git.worktree import Worktree -from modules.llvm import get_user_from_remote, push_current_branch +from modules.llvm import get_user_from_remote, get_remote_branch, push_branch + +# FIXME: Maybe move these helpers somewhere more public, or use LLVMTestCase for +# these tests as well... + + +def create_dummy_commit(message="Branches without commits confuse git"): + filename = "file" + str(uuid.uuid4()) + open(filename, "a").close() + git("add", filename) + git("commit", "-m", message) + + +def get_last_commit_message(branch=""): + return str(git("rev-list", "-1", "--oneline", branch)).strip() + + +def create_dummy_repo(path): + if not os.path.exists(path): + os.makedirs(path) + + with cd(path): + git("init") + create_dummy_commit() class TestGetUser(unittest.TestCase): @@ -31,27 +54,69 @@ class TestGetUser(unittest.TestCase): self.assertEqual(user, None) -class TestPush(unittest.TestCase): - testdirprefix = "PushUT" +class TestGetRemoteBranch(unittest.TestCase): + testdirprefix = "GetRemoteBranchUT" + + def setUp(self): + # Create a git repo so we can play with its remotes. + self.proj = Proj(prefix=self.testdirprefix) + + path = os.path.join(self.proj.projdir, "repo") + create_dummy_repo(path) + self.repo = Clone(self.proj, path) + + def tearDown(self): + self.proj.cleanup() + + def test_valid_branch(self): + """ + Test that we return the correct remote branch name if everything is + valid. + """ + user = "a.user" + remote = "file://{}@{}".format(user, self.repo.repodir) + with cd(self.repo.repodir): + git("remote", "add", "origin", remote) + + local_branch = "a-branch" + remote_branch = get_remote_branch(self.repo, local_branch) + self.assertEqual( + remote_branch, "linaro-local/{}/{}".format(user, local_branch)) + + def test_no_user(self): + """Test that we error out when we can't parse a user in the remote name.""" + remote = "file://" + self.repo.repodir + with cd(self.repo.repodir): + git("remote", "add", "origin", remote) + + with self.assertRaises(EnvironmentError) as context: + get_remote_branch(self.repo, "a-branch") + + self.assertEqual(str(context.exception), + "Couldn't parse user from {}.".format(remote)) + + def test_invalid_user(self): + """ + Test that we error out when the value of the user parsed from the remote + wouldn't look good in a branch name (e.g. if it contains spaces). + """ + + badUser = "LLVM Developer" + with cd(self.repo.repodir): + git("remote", "add", "origin", + "file://{}@{}".format(badUser, self.repo.repodir)) - def __create_dummy_commit( - self, - message="Branches without commits confuse git"): - filename = "file" + str(uuid.uuid4()) - open(filename, "a").close() - git("add", filename) - git("commit", "-m", message) + branch = "a-branch" + with self.assertRaises(EnvironmentError) as context: + get_remote_branch(self.repo, branch) - def __get_last_commit_message(self, branch=""): - return str(git("rev-list", "-1", "--oneline", branch)).strip() + self.assertEqual(str(context.exception), + "linaro-local/{}/{} is not a valid branch name.".format(badUser, + branch)) - def __create_dummy_repo(self, path): - if not os.path.exists(path): - os.makedirs(path) - with cd(path): - git("init") - self.__create_dummy_commit() +class TestPushBranch(unittest.TestCase): + testdirprefix = "PushBranchUT" def setUp(self): # We're going to create a hierarchy with an origin repo, a clone repo @@ -61,7 +126,7 @@ class TestPush(unittest.TestCase): self.user = "llvm-developer" path = os.path.join(self.proj.projdir, "origin") - self.__create_dummy_repo(path) + create_dummy_repo(path) self.origin = Clone(self.proj, path) path = os.path.join(self.proj.projdir, "clone") @@ -69,6 +134,7 @@ class TestPush(unittest.TestCase): self.clone = Clone(self.proj, path) self.worktreeBranch = "a-branch" + self.remoteBranch = "remotely/a-branch" self.worktree = Worktree.create( self.proj, self.clone, os.path.join( self.proj.projdir, "worktree"), self.worktreeBranch) @@ -80,35 +146,30 @@ class TestPush(unittest.TestCase): """Test that we can push a new branch to origin.""" with cd(self.worktree.repodir): - self.__create_dummy_commit("This should make it to origin") + create_dummy_commit("This should make it to origin") - push_current_branch(self.proj, self.worktree.repodir) + push_branch(self.proj, self.worktreeBranch, self.remoteBranch, + self.worktree.repodir) with cd(self.origin.repodir): self.assertRegex( - self.__get_last_commit_message( - "linaro-local/{}/{}".format( - self.user, - self.worktreeBranch)), + get_last_commit_message(self.remoteBranch), ".*This should make it to origin") def test_push_existing_branch(self): """Test that we can push to a branch that already exists in origin.""" - - remoteBranch = "linaro-local/{}/{}".format( - self.user, self.worktreeBranch) - with cd(self.worktree.repodir): - self.__create_dummy_commit("This already exists in origin") + create_dummy_commit("This already exists in origin") git("push", "origin", "{}:{}".format( - self.worktreeBranch, remoteBranch)) + self.worktreeBranch, self.remoteBranch)) - self.__create_dummy_commit("This should make it to origin too") + create_dummy_commit("This should make it to origin too") - push_current_branch(self.proj, self.worktree.repodir) + push_branch(self.proj, self.worktreeBranch, self.remoteBranch, + self.worktree.repodir) with cd(self.origin.repodir): - self.assertRegex(self.__get_last_commit_message(remoteBranch), + self.assertRegex(get_last_commit_message(self.remoteBranch), ".*This should make it to origin too") def test_push_squashed_update(self): @@ -117,84 +178,55 @@ class TestPush(unittest.TestCase): that has already been pushed to origin. This isn't a nice thing to do, but we need to support it because Gerrit requires squashes. """ - remoteBranch = "linaro-local/{}/{}".format(self.user, - self.worktreeBranch) with cd(self.worktree.repodir): - self.__create_dummy_commit("First version of the patch") + create_dummy_commit("First version of the patch") - push_current_branch(self.proj, self.worktree.repodir) + push_branch(self.proj, self.worktreeBranch, self.remoteBranch, + self.worktree.repodir) with cd(self.origin.repodir): self.assertRegex( - self.__get_last_commit_message(remoteBranch), + get_last_commit_message(self.remoteBranch), ".*First version of the patch") with cd(self.worktree.repodir): git("commit", "--amend", "-m", "Second version of the patch") - push_current_branch(self.proj, self.worktree.repodir) + push_branch(self.proj, self.worktreeBranch, self.remoteBranch, + self.worktree.repodir) with cd(self.origin.repodir): self.assertRegex( - self.__get_last_commit_message(remoteBranch), + get_last_commit_message(self.remoteBranch), "/*Second version of the patch") def test_push_rebased_branch(self): """ Test that we can push again with new updates after a rebase.""" - remoteBranch = "linaro-local/{}/{}".format(self.user, - self.worktreeBranch) with cd(self.worktree.repodir): - self.__create_dummy_commit("First change") + create_dummy_commit("First change") - push_current_branch(self.proj, self.worktree.repodir) + push_branch(self.proj, self.worktreeBranch, self.remoteBranch, + self.worktree.repodir) with cd(self.origin.repodir): self.assertRegex( - self.__get_last_commit_message(remoteBranch), + get_last_commit_message(self.remoteBranch), ".*First change") with cd(self.origin.repodir): - self.__create_dummy_commit("Master moving forward") + create_dummy_commit("Master moving forward") with cd(self.worktree.repodir): - self.__create_dummy_commit("Second change") + create_dummy_commit("Second change") git("fetch", "origin", "master") git("rebase", "origin/master") - push_current_branch(self.proj, self.worktree.repodir) + push_branch(self.proj, self.worktreeBranch, self.remoteBranch, + self.worktree.repodir) with cd(self.origin.repodir): - self.assertRegex(self.__get_last_commit_message(remoteBranch), + self.assertRegex(get_last_commit_message(self.remoteBranch), ".*Second change") - def test_push_no_user(self): - """Test that we error out when we can't parse a user in the remote name.""" - remote = "file://" + self.origin.repodir - with cd(self.worktree.repodir): - git("remote", "set-url", "origin", remote) - self.__create_dummy_commit("Make it look like a real branch") - - with self.assertRaises(EnvironmentError) as context: - push_current_branch(self.proj, self.worktree.repodir) - - self.assertEqual(str(context.exception), - "Couldn't parse user from {}.".format(remote)) - - def test_push_invalid_user(self): - """Test that we error out when the value of LLVM_GITUSER wouldn't look good in a branch name (e.g. if it contains spaces).""" - - badUser = "LLVM Developer" - with cd(self.worktree.repodir): - git("remote", "set-url", "origin", - "file://{}@{}".format(badUser, self.origin.repodir)) - self.__create_dummy_commit("Make it look like a real branch") - - with self.assertRaises(EnvironmentError) as context: - push_current_branch(self.proj, self.worktree.repodir) - - self.assertEqual(str(context.exception), - "linaro-local/{}/{} is not a valid branch name.".format(badUser, - self.worktreeBranch)) - if __name__ == "__main__": unittest.main() |