|
@@ -0,0 +1,130 @@
|
|
|
+#!/usr/bin/env vpython3
|
|
|
+# coding=utf-8
|
|
|
+# Copyright 2024 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.
|
|
|
+"""Tests for git_squash_branch_tree."""
|
|
|
+
|
|
|
+import os
|
|
|
+import sys
|
|
|
+import unittest
|
|
|
+
|
|
|
+DEPOT_TOOLS_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
|
+sys.path.insert(0, DEPOT_TOOLS_ROOT)
|
|
|
+
|
|
|
+from testing_support import git_test_utils
|
|
|
+
|
|
|
+import git_squash_branch_tree
|
|
|
+import git_common
|
|
|
+
|
|
|
+git_common.TEST_MODE = True
|
|
|
+
|
|
|
+
|
|
|
+class GitSquashBranchTreeTest(git_test_utils.GitRepoReadWriteTestBase):
|
|
|
+ # Empty repo.
|
|
|
+ REPO_SCHEMA = """
|
|
|
+ """
|
|
|
+
|
|
|
+ def setUp(self):
|
|
|
+ super(GitSquashBranchTreeTest, self).setUp()
|
|
|
+
|
|
|
+ # Note: Using the REPO_SCHEMA wouldn't simplify this test so it is not
|
|
|
+ # used.
|
|
|
+ #
|
|
|
+ # Create a repo with the follow schema
|
|
|
+ #
|
|
|
+ # main <- branchA <- branchB
|
|
|
+ # ^
|
|
|
+ # \ branchC
|
|
|
+ #
|
|
|
+ # where each branch has 2 commits.
|
|
|
+
|
|
|
+ # The repo is empty. Add the first commit or else most commands don't
|
|
|
+ # work, including `git branch`, which doesn't even show the main branch.
|
|
|
+ self.repo.git('commit', '-m', 'First commit', '--allow-empty')
|
|
|
+
|
|
|
+ # Create the first branch downstream from `main` with 2 commits.
|
|
|
+ self.repo.git('checkout', '-B', 'branchA', '--track', 'main')
|
|
|
+ self._createFileAndCommit('fileA1')
|
|
|
+ self._createFileAndCommit('fileA2')
|
|
|
+
|
|
|
+ # Create a branch downstream from `branchA` with 2 commits.
|
|
|
+ self.repo.git('checkout', '-B', 'branchB', '--track', 'branchA')
|
|
|
+ self._createFileAndCommit('fileB1')
|
|
|
+ self._createFileAndCommit('fileB2')
|
|
|
+
|
|
|
+ # Create another branch downstream from `branchA` with 2 commits.
|
|
|
+ self.repo.git('checkout', '-B', 'branchC', '--track', 'branchA')
|
|
|
+ self._createFileAndCommit('fileC1')
|
|
|
+ self._createFileAndCommit('fileC2')
|
|
|
+
|
|
|
+ def testGitSquashBranchTreeDefaultCurrent(self):
|
|
|
+ self.assertEqual(self._getCountAheadOfUpstream('branchA'), 2)
|
|
|
+ self.assertEqual(self._getCountAheadOfUpstream('branchB'), 2)
|
|
|
+ self.assertEqual(self._getCountAheadOfUpstream('branchC'), 2)
|
|
|
+
|
|
|
+ # Note: Passing --ignore-no-upstream as this repo has no remote and so
|
|
|
+ # the `main` branch can't have an upstream.
|
|
|
+ self.repo.git('checkout', 'branchB')
|
|
|
+ self.repo.run(git_squash_branch_tree.main, ['--ignore-no-upstream'])
|
|
|
+
|
|
|
+ self.assertEqual(self._getCountAheadOfUpstream('branchA'), 2)
|
|
|
+ self.assertEqual(self._getCountAheadOfUpstream('branchB'), 1)
|
|
|
+ self.assertEqual(self._getCountAheadOfUpstream('branchC'), 2)
|
|
|
+
|
|
|
+ def testGitSquashBranchTreeAll(self):
|
|
|
+ self.assertEqual(self._getCountAheadOfUpstream('branchA'), 2)
|
|
|
+ self.assertEqual(self._getCountAheadOfUpstream('branchB'), 2)
|
|
|
+ self.assertEqual(self._getCountAheadOfUpstream('branchC'), 2)
|
|
|
+
|
|
|
+ self.repo.run(git_squash_branch_tree.main,
|
|
|
+ ['--branch', 'branchA', '--ignore-no-upstream'])
|
|
|
+
|
|
|
+ self.assertEqual(self._getCountAheadOfUpstream('branchA'), 1)
|
|
|
+ self.assertEqual(self._getCountAheadOfUpstream('branchB'), 1)
|
|
|
+ self.assertEqual(self._getCountAheadOfUpstream('branchC'), 1)
|
|
|
+
|
|
|
+ def testGitSquashBranchTreeSingle(self):
|
|
|
+ self.assertEqual(self._getCountAheadOfUpstream('branchA'), 2)
|
|
|
+ self.assertEqual(self._getCountAheadOfUpstream('branchB'), 2)
|
|
|
+ self.assertEqual(self._getCountAheadOfUpstream('branchC'), 2)
|
|
|
+
|
|
|
+ self.repo.run(git_squash_branch_tree.main,
|
|
|
+ ['--branch', 'branchB', '--ignore-no-upstream'])
|
|
|
+
|
|
|
+ self.assertEqual(self._getCountAheadOfUpstream('branchA'), 2)
|
|
|
+ self.assertEqual(self._getCountAheadOfUpstream('branchB'), 1)
|
|
|
+ self.assertEqual(self._getCountAheadOfUpstream('branchC'), 2)
|
|
|
+
|
|
|
+ self.repo.run(git_squash_branch_tree.main,
|
|
|
+ ['--branch', 'branchC', '--ignore-no-upstream'])
|
|
|
+
|
|
|
+ self.assertEqual(self._getCountAheadOfUpstream('branchA'), 2)
|
|
|
+ self.assertEqual(self._getCountAheadOfUpstream('branchB'), 1)
|
|
|
+ self.assertEqual(self._getCountAheadOfUpstream('branchC'), 1)
|
|
|
+
|
|
|
+ self.repo.run(git_squash_branch_tree.main,
|
|
|
+ ['--branch', 'branchA', '--ignore-no-upstream'])
|
|
|
+
|
|
|
+ self.assertEqual(self._getCountAheadOfUpstream('branchA'), 1)
|
|
|
+ self.assertEqual(self._getCountAheadOfUpstream('branchB'), 1)
|
|
|
+ self.assertEqual(self._getCountAheadOfUpstream('branchC'), 1)
|
|
|
+
|
|
|
+ # Creates a file with arbitrary contents and commit it to the current
|
|
|
+ # branch.
|
|
|
+ def _createFileAndCommit(self, filename):
|
|
|
+ with self.repo.open(filename, 'w') as f:
|
|
|
+ f.write('content')
|
|
|
+ self.repo.git('add', filename)
|
|
|
+ self.repo.git_commit('Added file ' + filename)
|
|
|
+
|
|
|
+ # Returns the count of how many commits `branch` is ahead of its upstream.
|
|
|
+ def _getCountAheadOfUpstream(self, branch):
|
|
|
+ upstream = branch + '@{u}'
|
|
|
+ output = self.repo.git('rev-list', '--count',
|
|
|
+ upstream + '..' + branch).stdout
|
|
|
+ return int(output)
|
|
|
+
|
|
|
+
|
|
|
+if __name__ == '__main__':
|
|
|
+ unittest.main()
|