# test_commit.py # Copyright (C) 2008-2010 Michael Trier (mtrier@gmail.com) and contributors # # This module is part of GitPython and is released under # the BSD License: http://www.opensource.org/licenses/bsd-license.php from test.testlib import * from git import * class TestCommit(object): def setup(self): self.repo = Repo(GIT_REPO) @patch_object(Git, '_call_process') def test_bake(self, git): git.return_value = fixture('rev_list_single') commit = Commit(self.repo, **{'id': '4c8124ffcf4039d292442eeccabdeca5af5c5017'}) commit.author # bake assert_equal("Tom Preston-Werner", commit.author.name) assert_equal("tom@mojombo.com", commit.author.email) assert_true(git.called) assert_equal(git.call_args, (('rev_list', '4c8124ffcf4039d292442eeccabdeca5af5c5017', '--', ''), {'pretty': 'raw', 'max_count': 1})) @patch_object(Git, '_call_process') def test_id_abbrev(self, git): git.return_value = fixture('rev_list_commit_idabbrev') assert_equal('80f136f', self.repo.commit('80f136f500dfdb8c3e8abf4ae716f875f0a1b57f').id_abbrev) @patch_object(Git, '_call_process') def test_diff(self, git): git.return_value = fixture('diff_p') diffs = Commit.diff(self.repo, 'master') assert_equal(15, len(diffs)) assert_equal('.gitignore', diffs[0].a_path) assert_equal('.gitignore', diffs[0].b_path) assert_equal('4ebc8aea50e0a67e000ba29a30809d0a7b9b2666', diffs[0].a_commit.id) assert_equal('2dd02534615434d88c51307beb0f0092f21fd103', diffs[0].b_commit.id) assert_equal('100644', diffs[0].b_mode) assert_equal(False, diffs[0].new_file) assert_equal(False, diffs[0].deleted_file) assert_equal("--- a/.gitignore\n+++ b/.gitignore\n@@ -1 +1,2 @@\n coverage\n+pkg", diffs[0].diff) assert_equal('lib/grit/actor.rb', diffs[5].a_path) assert_equal(None, diffs[5].a_commit) assert_equal('f733bce6b57c0e5e353206e692b0e3105c2527f4', diffs[5].b_commit.id) assert_equal(True, diffs[5].new_file) assert_true(git.called) assert_equal(git.call_args, (('diff', '-M', 'master'), {'full_index': True})) @patch_object(Git, '_call_process') def test_diff_with_rename(self, git): git.return_value = fixture('diff_rename') diffs = Commit.diff(self.repo, 'rename') assert_equal(1, len(diffs)) diff = diffs[0] assert_true(diff.renamed) assert_equal(diff.rename_from, 'AUTHORS') assert_equal(diff.rename_to, 'CONTRIBUTORS') assert_true(git.called) assert_equal(git.call_args, (('diff', '-M', 'rename'), {'full_index': True})) @patch_object(Git, '_call_process') def test_diff_with_two_commits(self, git): git.return_value = fixture('diff_2') diffs = Commit.diff(self.repo, '59ddc32', '13d27d5') assert_equal(3, len(diffs)) assert_true(git.called) assert_equal(git.call_args, (('diff', '-M', '59ddc32', '13d27d5'), {'full_index': True})) @patch_object(Git, '_call_process') def test_diff_with_files(self, git): git.return_value = fixture('diff_f') diffs = Commit.diff(self.repo, '59ddc32', ['lib']) assert_equal(1, len(diffs)) assert_equal('lib/grit/diff.rb', diffs[0].a_path) assert_true(git.called) assert_equal(git.call_args, (('diff', '-M', '59ddc32', '--', 'lib'), {'full_index': True})) @patch_object(Git, '_call_process') def test_diff_with_two_commits_and_files(self, git): git.return_value = fixture('diff_2f') diffs = Commit.diff(self.repo, '59ddc32', '13d27d5', ['lib']) assert_equal(1, len(diffs)) assert_equal('lib/grit/commit.rb', diffs[0].a_path) assert_true(git.called) assert_equal(git.call_args, (('diff', '-M', '59ddc32', '13d27d5', '--', 'lib'), {'full_index': True})) @patch_object(Git, '_call_process') def test_diffs(self, git): git.return_value = fixture('diff_p') commit = Commit(self.repo, id='91169e1f5fa4de2eaea3f176461f5dc784796769', parents=['038af8c329ef7c1bae4568b98bd5c58510465493']) diffs = commit.diffs assert_equal(15, len(diffs)) assert_equal('.gitignore', diffs[0].a_path) assert_equal('.gitignore', diffs[0].b_path) assert_equal('4ebc8aea50e0a67e000ba29a30809d0a7b9b2666', diffs[0].a_commit.id) assert_equal('2dd02534615434d88c51307beb0f0092f21fd103', diffs[0].b_commit.id) assert_equal('100644', diffs[0].b_mode) assert_equal(False, diffs[0].new_file) assert_equal(False, diffs[0].deleted_file) assert_equal("--- a/.gitignore\n+++ b/.gitignore\n@@ -1 +1,2 @@\n coverage\n+pkg", diffs[0].diff) assert_equal('lib/grit/actor.rb', diffs[5].a_path) assert_equal(None, diffs[5].a_commit) assert_equal('f733bce6b57c0e5e353206e692b0e3105c2527f4', diffs[5].b_commit.id) assert_equal(True, diffs[5].new_file) assert_true(git.called) assert_equal(git.call_args, (('diff', '-M', '038af8c329ef7c1bae4568b98bd5c58510465493', '91169e1f5fa4de2eaea3f176461f5dc784796769', ), {'full_index': True})) @patch_object(Git, '_call_process') def test_diffs_on_initial_import(self, git): git.return_value = fixture('diff_i') commit = Commit(self.repo, id='634396b2f541a9f2d58b00be1a07f0c358b999b3') commit.__bake_it__() diffs = commit.diffs assert_equal(10, len(diffs)) assert_equal('History.txt', diffs[0].a_path) assert_equal('History.txt', diffs[0].b_path) assert_equal(None, diffs[0].a_commit) assert_equal('100644', diffs[0].b_mode) assert_equal('81d2c27608b352814cbe979a6acd678d30219678', diffs[0].b_commit.id) assert_equal(True, diffs[0].new_file) assert_equal(False, diffs[0].deleted_file) assert_equal("--- /dev/null\n+++ b/History.txt\n@@ -0,0 +1,5 @@\n+== 1.0.0 / 2007-10-09\n+\n+* 1 major enhancement\n+ * Birthday!\n+", diffs[0].diff) assert_equal('lib/grit.rb', diffs[5].a_path) assert_equal(None, diffs[5].a_commit) assert_equal('32cec87d1e78946a827ddf6a8776be4d81dcf1d1', diffs[5].b_commit.id) assert_equal(True, diffs[5].new_file) assert_true(git.called) assert_equal(git.call_args, (('show', '634396b2f541a9f2d58b00be1a07f0c358b999b3', '-M'), {'full_index': True, 'pretty': 'raw'})) @patch_object(Git, '_call_process') def test_diffs_on_initial_import_with_empty_commit(self, git): git.return_value = fixture('show_empty_commit') commit = Commit(self.repo, id='634396b2f541a9f2d58b00be1a07f0c358b999b3') diffs = commit.diffs assert_equal([], diffs) assert_true(git.called) assert_equal(git.call_args, (('show', '634396b2f541a9f2d58b00be1a07f0c358b999b3', '-M'), {'full_index': True, 'pretty': 'raw'})) @patch_object(Git, '_call_process') def test_diffs_with_mode_only_change(self, git): git.return_value = fixture('diff_mode_only') commit = Commit(self.repo, id='91169e1f5fa4de2eaea3f176461f5dc784796769') commit.__bake_it__() diffs = commit.diffs assert_equal(23, len(diffs)) assert_equal('100644', diffs[0].a_mode) assert_equal('100755', diffs[0].b_mode) assert_true(git.called) assert_equal(git.call_args, (('show', '91169e1f5fa4de2eaea3f176461f5dc784796769', '-M'), {'full_index': True, 'pretty': 'raw'})) @patch_object(Git, '_call_process') def test_stats(self, git): git.return_value = fixture('diff_tree_numstat_root') commit = Commit(self.repo, id='634396b2f541a9f2d58b00be1a07f0c358b999b3') commit.__bake_it__() stats = commit.stats keys = stats.files.keys() keys.sort() assert_equal(["a.txt", "b.txt"], keys) assert_true(git.called) assert_equal(git.call_args, (('diff_tree', '634396b2f541a9f2d58b00be1a07f0c358b999b3', '--'), {'numstat': True, 'root': True })) @patch_object(Git, '_call_process') def test_rev_list_bisect_all(self, git): """ 'git rev-list --bisect-all' returns additional information in the commit header. This test ensures that we properly parse it. """ git.return_value = fixture('rev_list_bisect_all') revs = self.repo.git.rev_list('HEAD', pretty='raw', first_parent=True, bisect_all=True) assert_true(git.called) commits = Commit.list_from_string(self.repo, revs) expected_ids = ( 'cf37099ea8d1d8c7fbf9b6d12d7ec0249d3acb8b', '33ebe7acec14b25c5f84f35a664803fcab2f7781', 'a6604a00a652e754cb8b6b0b9f194f839fc38d7c', '8df638c22c75ddc9a43ecdde90c0c9939f5009e7', 'c231551328faa864848bde6ff8127f59c9566e90', ) for sha1, commit in zip(expected_ids, commits): assert_equal(sha1, commit.id) def test_str(self): commit = Commit(self.repo, id='abc') assert_equal ("abc", str(commit)) def test_repr(self): commit = Commit(self.repo, id='abc') assert_equal('', repr(commit))