Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(183)

Unified Diff: tests/git_rebase_update_test.py

Issue 184253003: Add git-reup and friends (Closed) Base URL: https://chromium.googlesource.com/chromium/tools/depot_tools.git@freeze_thaw
Patch Set: fix pylint Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tests/git_number_test.py ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tests/git_rebase_update_test.py
diff --git a/tests/git_rebase_update_test.py b/tests/git_rebase_update_test.py
new file mode 100755
index 0000000000000000000000000000000000000000..6fa97b8269a4e0da98cb4204a69857d0531ed9de
--- /dev/null
+++ b/tests/git_rebase_update_test.py
@@ -0,0 +1,337 @@
+#!/usr/bin/env python
+# Copyright 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Unit tests for git_rebase_update.py"""
+
+import os
+import sys
+
+DEPOT_TOOLS_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+sys.path.insert(0, DEPOT_TOOLS_ROOT)
+
+from testing_support import coverage_utils
+from testing_support import git_test_utils
+
+class GitRebaseUpdateTest(git_test_utils.GitRepoReadWriteTestBase):
+ REPO_SCHEMA = """
+ A B C D E F G
+ B H I J K
+ J L
+ """
+
+ @classmethod
+ def getRepoContent(cls, commit):
+ # Every commit X gets a file X with the content X
+ return {commit: {'data': commit}}
+
+ @classmethod
+ def setUpClass(cls):
+ super(GitRebaseUpdateTest, cls).setUpClass()
+ import git_rebase_update, git_new_branch, git_reparent_branch, git_common
+ import git_rename_branch
+ cls.reup = git_rebase_update
+ cls.rp = git_reparent_branch
+ cls.nb = git_new_branch
+ cls.mv = git_rename_branch
+ cls.gc = git_common
+ cls.gc.TEST_MODE = True
+
+ def setUp(self):
+ super(GitRebaseUpdateTest, self).setUp()
+ # Include branch_K, branch_L to make sure that ABCDEFG all get the
+ # same commit hashes as self.repo. Otherwise they get committed with the
+ # wrong timestamps, due to commit ordering.
+ # TODO(iannucci): Make commit timestamps deterministic in left to right, top
+ # to bottom order, not in lexi-topographical order.
+ origin_schema = git_test_utils.GitRepoSchema("""
+ A B C D E F G M N O
+ B H I J K
+ J L
+ """, self.getRepoContent)
+ self.origin = origin_schema.reify()
+ self.origin.git('checkout', 'master')
+ self.origin.git('branch', '-d', *['branch_'+l for l in 'KLG'])
+
+ self.repo.git('remote', 'add', 'origin', self.origin.repo_path)
+ self.repo.git('config', '--add', 'remote.origin.fetch',
+ '+refs/tags/*:refs/tags/*')
+ self.repo.git('update-ref', 'refs/remotes/origin/master', 'tag_E')
+ self.repo.git('branch', '--set-upstream-to', 'branch_G', 'branch_K')
+ self.repo.git('branch', '--set-upstream-to', 'branch_K', 'branch_L')
+ self.repo.git('branch', '--set-upstream-to', 'origin/master', 'branch_G')
+
+ self.repo.to_schema_refs += ['origin/master']
+
+ def tearDown(self):
+ self.origin.nuke()
+ super(GitRebaseUpdateTest, self).tearDown()
+
+ def testRebaseUpdate(self):
+ self.repo.git('checkout', 'branch_K')
+
+ self.repo.run(self.nb.main, ['foobar'])
+ self.assertEqual(self.repo.git('rev-parse', 'HEAD').stdout,
+ self.repo.git('rev-parse', 'origin/master').stdout)
+
+ with self.repo.open('foobar', 'w') as f:
+ f.write('this is the foobar file')
+ self.repo.git('add', 'foobar')
+ self.repo.git_commit('foobar1')
+
+ with self.repo.open('foobar', 'w') as f:
+ f.write('totes the Foobar file')
+ self.repo.git_commit('foobar2')
+
+ self.repo.git('checkout', 'branch_K')
+ self.repo.run(self.nb.main, ['--upstream_current', 'sub_K'])
+ with self.repo.open('K', 'w') as f:
+ f.write('This depends on K')
+ self.repo.git_commit('sub_K')
+
+ self.repo.run(self.nb.main, ['old_branch'])
+ self.repo.git('reset', '--hard', self.repo['A'])
+ with self.repo.open('old_file', 'w') as f:
+ f.write('old_files we want to keep around')
+ self.repo.git('add', 'old_file')
+ self.repo.git_commit('old_file')
+ self.repo.git('config', 'branch.old_branch.dormant', 'true')
+
+ self.repo.git('checkout', 'origin/master')
+
+ self.assertSchema("""
+ A B H I J K sub_K
+ J L
+ B C D E foobar1 foobar2
+ E F G
+ A old_file
+ """)
+ self.assertEquals(self.repo['A'], self.origin['A'])
+ self.assertEquals(self.repo['E'], self.origin['E'])
+
+ with self.repo.open('bob', 'wb') as f:
+ f.write('testing auto-freeze/thaw')
+
+ output, _ = self.repo.capture_stdio(self.reup.main)
+ self.assertIn('Cannot rebase-update', output)
+
+ self.repo.git('checkout', 'branch_K')
+
+ output, _ = self.repo.capture_stdio(self.reup.main)
+
+ self.assertIn('Rebasing: branch_G', output)
+ self.assertIn('Rebasing: branch_K', output)
+ self.assertIn('Rebasing: branch_L', output)
+ self.assertIn('Rebasing: foobar', output)
+ self.assertIn('Rebasing: sub_K', output)
+ self.assertIn('Deleted branch branch_G', output)
+ self.assertIn('Reparented branch_K to track origin/master', output)
+
+ self.assertSchema("""
+ A B C D E F G M N O H I J K sub_K
+ K L
+ O foobar1 foobar2
+ A old_file
+ """)
+
+ output, _ = self.repo.capture_stdio(self.reup.main)
+ self.assertIn('branch_K up-to-date', output)
+ self.assertIn('branch_L up-to-date', output)
+ self.assertIn('foobar up-to-date', output)
+ self.assertIn('sub_K up-to-date', output)
+
+ with self.repo.open('bob') as f:
+ self.assertEquals('testing auto-freeze/thaw', f.read())
+
+ self.assertEqual(self.repo.git('status', '--porcelain').stdout, '?? bob\n')
+
+ self.repo.git('checkout', 'origin/master')
+ _, err = self.repo.capture_stdio(self.rp.main, ['foobar'])
+ self.assertIn('Must be on the branch', err)
+
+ self.repo.git('checkout', 'branch_K')
+ _, err = self.repo.capture_stdio(self.rp.main, ['origin/master'])
+ self.assertIn('Cannot reparent a branch to its existing parent', err)
+ output, _ = self.repo.capture_stdio(self.rp.main, ['foobar'])
+ self.assertIn('Rebasing: branch_K', output)
+ self.assertIn('Rebasing: sub_K', output)
+ self.assertIn('Rebasing: branch_L', output)
+
+ self.assertSchema("""
+ A B C D E F G M N O foobar1 foobar2 H I J K L
+ K sub_K
+ A old_file
+ """)
+
+ self.repo.git('checkout', 'sub_K')
+ output, _ = self.repo.capture_stdio(self.rp.main, ['foobar'])
+ self.assertIn('Squashing failed', output)
+
+ self.assertTrue(self.repo.run(self.gc.in_rebase))
+
+ self.repo.git('rebase', '--abort')
+ self.assertIsNone(self.repo.run(self.gc.thaw))
+
+ self.assertSchema("""
+ A B C D E F G M N O foobar1 foobar2 H I J K L
+ A old_file
+ K sub_K
+ """)
+
+ self.assertEqual(self.repo.git('status', '--porcelain').stdout, '?? bob\n')
+
+ branches = self.repo.run(set, self.gc.branches())
+ self.assertEqual(branches, {'branch_K', 'master', 'sub_K', 'root_A',
+ 'branch_L', 'old_branch', 'foobar'})
+
+ self.repo.git('checkout', 'branch_K')
+ self.repo.run(self.mv.main, ['special_K'])
+
+ branches = self.repo.run(set, self.gc.branches())
+ self.assertEqual(branches, {'special_K', 'master', 'sub_K', 'root_A',
+ 'branch_L', 'old_branch', 'foobar'})
+
+ self.repo.git('checkout', 'origin/master')
+ _, err = self.repo.capture_stdio(self.mv.main, ['special_K', 'cool branch'])
+ self.assertIn('fatal: \'cool branch\' is not a valid branch name.', err)
+
+ self.repo.run(self.mv.main, ['special_K', 'cool_branch'])
+ branches = self.repo.run(set, self.gc.branches())
+ self.assertEqual(branches, {'cool_branch', 'master', 'sub_K', 'root_A',
+ 'branch_L', 'old_branch', 'foobar'})
+
+ _, branch_tree = self.repo.run(self.gc.get_branch_tree)
+ self.assertEqual(branch_tree['sub_K'], 'foobar')
+
+
+ def testRebaseConflicts(self):
+ # Pretend that branch_L landed
+ self.origin.git('checkout', 'master')
+ with self.origin.open('L', 'w') as f:
+ f.write('L')
+ self.origin.git('add', 'L')
+ self.origin.git_commit('L')
+
+ # Add a commit to branch_K so that things fail
+ self.repo.git('checkout', 'branch_K')
+ with self.repo.open('M', 'w') as f:
+ f.write('NOPE')
+ self.repo.git('add', 'M')
+ self.repo.git_commit('K NOPE')
+
+ # Add a commits to branch_L which will work when squashed
+ self.repo.git('checkout', 'branch_L')
+ self.repo.git('reset', 'branch_L~')
+ with self.repo.open('L', 'w') as f:
+ f.write('NOPE')
+ self.repo.git('add', 'L')
+ self.repo.git_commit('L NOPE')
+ with self.repo.open('L', 'w') as f:
+ f.write('L')
+ self.repo.git('add', 'L')
+ self.repo.git_commit('L YUP')
+
+ # start on a branch which will be deleted
+ self.repo.git('checkout', 'branch_G')
+
+ output, _ = self.repo.capture_stdio(self.reup.main)
+ self.assertIn('branch.branch_K.dormant true', output)
+
+ output, _ = self.repo.capture_stdio(self.reup.main)
+ self.assertIn('Rebase in progress', output)
+
+ self.repo.git('checkout', '--theirs', 'M')
+ self.repo.git('rebase', '--skip')
+
+ output, _ = self.repo.capture_stdio(self.reup.main)
+ self.assertIn('Failed! Attempting to squash', output)
+ self.assertIn('Deleted branch branch_G', output)
+ self.assertIn('Deleted branch branch_L', output)
+ self.assertIn('\'branch_G\' was merged', output)
+ self.assertIn('checking out \'origin/master\'', output)
+
+
+ def testTrackTag(self):
+ self.origin.git('tag', 'lkgr', self.origin['M'])
+ self.repo.git('tag', 'lkgr', self.repo['D'])
+
+ self.repo.git('config', 'branch.branch_G.remote', '.')
+ self.repo.git('config', 'branch.branch_G.merge', 'refs/tags/lkgr')
+
+ self.assertIn(
+ 'fatal: \'foo bar\' is not a valid branch name',
+ self.repo.capture_stdio(self.nb.main, ['--lkgr', 'foo bar'])[1])
+
+ self.repo.run(self.nb.main, ['--lkgr', 'foobar'])
+
+ with self.repo.open('foobar', 'w') as f:
+ f.write('this is the foobar file')
+ self.repo.git('add', 'foobar')
+ self.repo.git_commit('foobar1')
+
+ with self.repo.open('foobar', 'w') as f:
+ f.write('totes the Foobar file')
+ self.repo.git_commit('foobar2')
+
+ self.assertSchema("""
+ A B H I J K
+ J L
+ B C D E F G
+ D foobar1 foobar2
+ """)
+ self.assertEquals(self.repo['A'], self.origin['A'])
+ self.assertEquals(self.repo['G'], self.origin['G'])
+
+ output, _ = self.repo.capture_stdio(self.reup.main)
+ self.assertIn('Fetching', output)
+ self.assertIn('Rebasing: branch_G', output)
+ self.assertIn('Rebasing: branch_K', output)
+ self.assertIn('Rebasing: branch_L', output)
+ self.assertIn('Rebasing: foobar', output)
+ self.assertEquals(self.repo.git('rev-parse', 'lkgr').stdout.strip(),
+ self.origin['M'])
+
+ self.assertSchema("""
+ A B C D E F G M N O
+ M H I J K L
+ M foobar1 foobar2
+ """)
+
+ _, err = self.repo.capture_stdio(self.rp.main, ['tag F'])
+ self.assertIn('fatal: invalid reference', err)
+
+ output, _ = self.repo.capture_stdio(self.rp.main, ['tag_F'])
+ self.assertIn('to track tag_F [tag] (was lkgr [tag])', output)
+
+ self.assertSchema("""
+ A B C D E F G M N O
+ M H I J K L
+ F foobar1 foobar2
+ """)
+
+ output, _ = self.repo.capture_stdio(self.rp.main, ['--lkgr'])
+ self.assertIn('to track lkgr [tag] (was tag_F [tag])', output)
+
+ self.assertSchema("""
+ A B C D E F G M N O
+ M H I J K L
+ M foobar1 foobar2
+ """)
+
+ output, _ = self.repo.capture_stdio(self.rp.main, ['--root'])
+ self.assertIn('to track origin/master (was lkgr [tag])', output)
+
+ self.assertSchema("""
+ A B C D E F G M N O foobar1 foobar2
+ M H I J K L
+ """)
+
+
+if __name__ == '__main__':
+ sys.exit(coverage_utils.covered_main((
+ os.path.join(DEPOT_TOOLS_ROOT, 'git_rebase_update.py'),
+ os.path.join(DEPOT_TOOLS_ROOT, 'git_new_branch.py'),
+ os.path.join(DEPOT_TOOLS_ROOT, 'git_reparent_branch.py'),
+ os.path.join(DEPOT_TOOLS_ROOT, 'git_rename_branch.py')
+ )))
« no previous file with comments | « tests/git_number_test.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698