Skip to content

Commit 8810e4c

Browse files
committed
Deprecate passing str to Repository.merge
1 parent b1a54e0 commit 8810e4c

File tree

2 files changed

+46
-34
lines changed

2 files changed

+46
-34
lines changed

pygit2/repository.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
# along with this program; see the file COPYING. If not, write to
2323
# the Free Software Foundation, 51 Franklin Street, Fifth Floor,
2424
# Boston, MA 02110-1301, USA.
25-
25+
import warnings
2626
from io import BytesIO
2727
from os import PathLike
2828
from string import hexdigits
@@ -43,7 +43,6 @@
4343
from .enums import (
4444
AttrCheck,
4545
BlameFlag,
46-
BranchType,
4746
CheckoutStrategy,
4847
DescribeStrategy,
4948
DiffOption,
@@ -879,15 +878,18 @@ def merge(
879878
# Annotated commit from commit id
880879
if isinstance(source, str):
881880
# For backwards compatibility, parse a string as a partial commit hash
881+
warnings.warn(
882+
'Passing str to Repository.merge is deprecated. '
883+
'Pass Commit, Oid, or a Reference (such as a Branch) instead.',
884+
DeprecationWarning,
885+
)
882886
oid = self[source].peel(Commit).id
883887
elif isinstance(source, Commit):
884888
oid = source.id
885889
elif isinstance(source, Oid):
886890
oid = source
887891
else:
888-
raise TypeError(
889-
'expected Reference, Commit, Oid, or commit hash string'
890-
)
892+
raise TypeError('expected Reference, Commit, or Oid')
891893
c_id = ffi.new('git_oid *')
892894
ffi.buffer(c_id)[:] = oid.raw[:]
893895
commit_ptr = ffi.new('git_annotated_commit **')

test/test_merge.py

+39-29
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,16 @@ def test_merge_invalid_type(mergerepo, id):
3939
mergerepo.merge(id)
4040

4141

42+
# TODO: Once Repository.merge drops support for str arguments,
43+
# add an extra parameter to test_merge_invalid_type above
44+
# to make sure we cover legacy code.
45+
def test_merge_string_argument_deprecated(mergerepo):
46+
branch_head_hex = '5ebeeebb320790caf276b9fc8b24546d63316533'
47+
48+
with pytest.warns(DeprecationWarning, match=r'Pass Commit.+instead'):
49+
mergerepo.merge(branch_head_hex)
50+
51+
4252
def test_merge_analysis_uptodate(mergerepo):
4353
branch_head_hex = '5ebeeebb320790caf276b9fc8b24546d63316533'
4454
branch_id = mergerepo.get(branch_head_hex).id
@@ -82,7 +92,10 @@ def test_merge_no_fastforward_no_conflicts(mergerepo):
8292

8393
def test_merge_invalid_hex(mergerepo):
8494
branch_head_hex = '12345678'
85-
with pytest.raises(KeyError):
95+
with (
96+
pytest.raises(KeyError),
97+
pytest.warns(DeprecationWarning, match=r'Pass Commit.+instead'),
98+
):
8699
mergerepo.merge(branch_head_hex)
87100

88101

@@ -132,7 +145,7 @@ def test_merge_no_fastforward_conflicts(mergerepo):
132145

133146

134147
def test_merge_remove_conflicts(mergerepo):
135-
other_branch_tip = '1b2bae55ac95a4be3f8983b86cd579226d0eb247'
148+
other_branch_tip = pygit2.Oid(hex='1b2bae55ac95a4be3f8983b86cd579226d0eb247')
136149
mergerepo.merge(other_branch_tip)
137150
idx = mergerepo.index
138151
conflicts = idx.conflicts
@@ -158,30 +171,29 @@ def test_merge_remove_conflicts(mergerepo):
158171
],
159172
)
160173
def test_merge_favor(mergerepo, favor):
161-
branch_head_hex = '1b2bae55ac95a4be3f8983b86cd579226d0eb247'
162-
mergerepo.merge(branch_head_hex, favor=favor)
174+
branch_head = pygit2.Oid(hex='1b2bae55ac95a4be3f8983b86cd579226d0eb247')
175+
mergerepo.merge(branch_head, favor=favor)
163176

164177
assert mergerepo.index.conflicts is None
165178

166179

167180
def test_merge_fail_on_conflict(mergerepo):
168-
branch_head_hex = '1b2bae55ac95a4be3f8983b86cd579226d0eb247'
181+
branch_head = pygit2.Oid(hex='1b2bae55ac95a4be3f8983b86cd579226d0eb247')
169182

170-
with pytest.raises(pygit2.GitError):
183+
with pytest.raises(pygit2.GitError, match=r'merge conflicts exist'):
171184
mergerepo.merge(
172-
branch_head_hex, flags=MergeFlag.FIND_RENAMES | MergeFlag.FAIL_ON_CONFLICT
185+
branch_head, flags=MergeFlag.FIND_RENAMES | MergeFlag.FAIL_ON_CONFLICT
173186
)
174187

175188

176189
def test_merge_commits(mergerepo):
177-
branch_head_hex = '03490f16b15a09913edb3a067a3dc67fbb8d41f1'
178-
branch_id = mergerepo.get(branch_head_hex).id
190+
branch_head = pygit2.Oid(hex='03490f16b15a09913edb3a067a3dc67fbb8d41f1')
179191

180-
merge_index = mergerepo.merge_commits(mergerepo.head.target, branch_head_hex)
192+
merge_index = mergerepo.merge_commits(mergerepo.head.target, branch_head)
181193
assert merge_index.conflicts is None
182194
merge_commits_tree = merge_index.write_tree(mergerepo)
183195

184-
mergerepo.merge(branch_id)
196+
mergerepo.merge(branch_head)
185197
index = mergerepo.index
186198
assert index.conflicts is None
187199
merge_tree = index.write_tree()
@@ -190,26 +202,23 @@ def test_merge_commits(mergerepo):
190202

191203

192204
def test_merge_commits_favor(mergerepo):
193-
branch_head_hex = '1b2bae55ac95a4be3f8983b86cd579226d0eb247'
205+
branch_head = pygit2.Oid(hex='1b2bae55ac95a4be3f8983b86cd579226d0eb247')
194206

195207
merge_index = mergerepo.merge_commits(
196-
mergerepo.head.target, branch_head_hex, favor=MergeFavor.OURS
208+
mergerepo.head.target, branch_head, favor=MergeFavor.OURS
197209
)
198210
assert merge_index.conflicts is None
199211

200212
# Incorrect favor value
201-
with pytest.raises(TypeError):
202-
mergerepo.merge_commits(mergerepo.head.target, branch_head_hex, favor='foo')
213+
with pytest.raises(TypeError, match=r'favor argument must be MergeFavor'):
214+
mergerepo.merge_commits(mergerepo.head.target, branch_head, favor='foo')
203215

204216

205217
def test_merge_trees(mergerepo):
206-
branch_head_hex = '03490f16b15a09913edb3a067a3dc67fbb8d41f1'
207-
branch_id = mergerepo.get(branch_head_hex).id
218+
branch_id = pygit2.Oid(hex='03490f16b15a09913edb3a067a3dc67fbb8d41f1')
208219
ancestor_id = mergerepo.merge_base(mergerepo.head.target, branch_id)
209220

210-
merge_index = mergerepo.merge_trees(
211-
ancestor_id, mergerepo.head.target, branch_head_hex
212-
)
221+
merge_index = mergerepo.merge_trees(ancestor_id, mergerepo.head.target, branch_id)
213222
assert merge_index.conflicts is None
214223
merge_commits_tree = merge_index.write_tree(mergerepo)
215224

@@ -312,10 +321,10 @@ def test_merge_octopus(mergerepo):
312321
def test_merge_mergeheads(mergerepo):
313322
assert mergerepo.listall_mergeheads() == []
314323

315-
branch_head_hex = '1b2bae55ac95a4be3f8983b86cd579226d0eb247'
316-
mergerepo.merge(branch_head_hex)
324+
branch_head = pygit2.Oid(hex='1b2bae55ac95a4be3f8983b86cd579226d0eb247')
325+
mergerepo.merge(branch_head)
317326

318-
assert mergerepo.listall_mergeheads() == [pygit2.Oid(hex=branch_head_hex)]
327+
assert mergerepo.listall_mergeheads() == [branch_head]
319328

320329
mergerepo.state_cleanup()
321330
assert mergerepo.listall_mergeheads() == [], (
@@ -327,27 +336,28 @@ def test_merge_message(mergerepo):
327336
assert not mergerepo.message
328337
assert not mergerepo.raw_message
329338

330-
branch_head_hex = '1b2bae55ac95a4be3f8983b86cd579226d0eb247'
331-
mergerepo.merge(branch_head_hex)
339+
branch_head = pygit2.Oid(hex='1b2bae55ac95a4be3f8983b86cd579226d0eb247')
340+
mergerepo.merge(branch_head)
332341

333-
assert mergerepo.message.startswith(f"Merge commit '{branch_head_hex}'")
342+
assert mergerepo.message.startswith(f"Merge commit '{branch_head}'")
334343
assert mergerepo.message.encode('utf-8') == mergerepo.raw_message
335344

336345
mergerepo.state_cleanup()
337346
assert not mergerepo.message
338347

339348

340349
def test_merge_remove_message(mergerepo):
341-
branch_head_hex = '1b2bae55ac95a4be3f8983b86cd579226d0eb247'
342-
mergerepo.merge(branch_head_hex)
350+
branch_head = pygit2.Oid(hex='1b2bae55ac95a4be3f8983b86cd579226d0eb247')
351+
mergerepo.merge(branch_head)
343352

344-
assert mergerepo.message.startswith(f"Merge commit '{branch_head_hex}'")
353+
assert mergerepo.message.startswith(f"Merge commit '{branch_head}'")
345354
mergerepo.remove_message()
346355
assert not mergerepo.message
347356

348357

349358
def test_merge_commit(mergerepo):
350359
commit = mergerepo['1b2bae55ac95a4be3f8983b86cd579226d0eb247']
360+
assert isinstance(commit, pygit2.Commit)
351361
mergerepo.merge(commit)
352362

353363
assert mergerepo.message.startswith(f"Merge commit '{str(commit.id)}'")

0 commit comments

Comments
 (0)