85
86
repo.get_revision_graph(bzr_revisions[3]))
87
88
def test_get_revision(self):
88
# Test that GitRepository.get_revision gives a Revision object.
89
# GitRepository.get_revision gives a Revision object.
90
91
# Create a git repository with a revision.
91
92
tests.run_git('init')
92
93
builder = tests.GitBranchBuilder()
93
file_handle = builder.set_file('a', 'text for a\n', False)
94
builder.set_file('a', 'text for a\n', False)
94
95
commit_handle = builder.commit('Joe Foo <joe@foo.com>', u'message')
95
96
mapping = builder.finish()
96
97
commit_id = mapping[commit_handle]
100
101
repo = repository.Repository.open('.')
101
102
rev = repo.get_revision(revid)
102
103
self.assertIsInstance(rev, revision.Revision)
106
class TestGitRepositoryParseRev(tests.TestCase):
107
"""Unit tests for GitRepository._parse_rev."""
109
def test_base_commit(self):
110
# GitRepository._parse_rev works for a simple base commit.
111
rev = git_repository.GitRepository._parse_rev([
112
"873a8ae0d682b0e63e9795bc53056d32ed3de93f\n",
113
"tree aaff74984cccd156a469afa7d9ab10e4777beb24\n",
114
"author Jane Bar <jane@bar.com> 1198784533 +0200\n",
115
"committer Joe Foo <joe@foo.com> 1198784532 +0100\n",
120
rev.revision_id, 'git1r-873a8ae0d682b0e63e9795bc53056d32ed3de93f')
121
self.assertEqual(rev.parent_ids, [])
122
self.assertEqual(rev.committer, 'Joe Foo <joe@foo.com>')
123
self.assertEqual(rev.timestamp, 1198784532.0)
124
self.assertEqual(rev.timezone, '+0100')
125
self.assertEqual(rev.message, 'message\n')
128
{'git-tree-id': 'aaff74984cccd156a469afa7d9ab10e4777beb24',
129
'author': 'Jane Bar <jane@bar.com>',
130
'git-author-timestamp': '1198784533',
131
'git-author-timezone': '+0200'})
133
def test_merge_commit(self):
134
# Multi-parent commits (merges) are parsed correctly.
135
rev = git_repository.GitRepository._parse_rev([
136
"873a8ae0d682b0e63e9795bc53056d32ed3de93f\n",
137
"tree aaff74984cccd156a469afa7d9ab10e4777beb24\n",
138
"parent 263ed20f0d4898be994404ca418bafe8e89abb8a\n",
139
"parent 546563eb8f3e94a557f3bb779b6e5a2bd9658752\n",
140
"parent 3116d42db7b5c5e69e58f651721e179791479c23\n",
141
"author Jane Bar <jane@bar.com> 1198784533 +0200\n",
142
"committer Joe Foo <joe@foo.com> 1198784532 +0100\n",
146
# Git records merges in the same way as bzr. The first parent is the
147
# commit base, the following parents are the ordered merged revisions.
150
['git1r-263ed20f0d4898be994404ca418bafe8e89abb8a',
151
'git1r-546563eb8f3e94a557f3bb779b6e5a2bd9658752',
152
'git1r-3116d42db7b5c5e69e58f651721e179791479c23'])
154
def test_redundant_spaces(self):
155
# Redundant spaces in author and committer are preserved.
156
rev = git_repository.GitRepository._parse_rev([
157
"873a8ae0d682b0e63e9795bc53056d32ed3de93f\n",
158
"tree aaff74984cccd156a469afa7d9ab10e4777beb24\n",
159
"author Jane Bar <jane@bar.com> 1198784533 +0200\n",
160
"committer Joe Foo <joe@foo.com> 1198784532 +0100\n",
164
self.assertEqual(rev.committer, ' Joe Foo <joe@foo.com> ')
166
rev.properties['author'], ' Jane Bar <jane@bar.com> ')
168
def test_no_committer(self):
169
# If committer is not set, then author is used.
171
# Folks in #git say that git fsck would likely accept commits that do
172
# not set committer, but that author is a mandatory value.
173
rev = git_repository.GitRepository._parse_rev([
174
"873a8ae0d682b0e63e9795bc53056d32ed3de93f\n",
175
"tree aaff74984cccd156a469afa7d9ab10e4777beb24\n",
176
"author Jane Bar <jane@bar.com> 1198784533 +0200\n",
180
self.assertEqual(rev.committer, 'Jane Bar <jane@bar.com>')
181
self.assertEqual(rev.timestamp, 1198784533.0)
182
self.assertEqual(rev.timezone, '+0200')
183
self.assertEqual(rev.properties['author'], 'Jane Bar <jane@bar.com>')
184
self.assertEqual(rev.properties['git-author-timestamp'], '1198784533')
185
self.assertEqual(rev.properties['git-author-timezone'], '+0200')