You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
depot_tools/tests/git_squash_branch_tree_test.py

131 lines
5.1 KiB
Python

#!/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()