Skip to content

Commit 7e0f891

Browse files
committed
improve types according to test/test_merge.py
1 parent 1cb902a commit 7e0f891

File tree

3 files changed

+80
-37
lines changed

3 files changed

+80
-37
lines changed

pygit2/_pygit2.pyi

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ from typing import (
1919
from . import Index
2020
from ._libgit2.ffi import (
2121
GitCommitC,
22+
GitMergeOptionsC,
2223
GitObjectC,
2324
GitProxyOptionsC,
2425
GitRepositoryC,
@@ -43,6 +44,9 @@ from .enums import (
4344
DiffStatsFormat,
4445
FileMode,
4546
MergeAnalysis,
47+
MergeFavor,
48+
MergeFileFlag,
49+
MergeFlag,
4650
MergePreference,
4751
ObjectType,
4852
Option,
@@ -884,12 +888,40 @@ class Repository:
884888
def lookup_reference(self, name: str) -> Reference: ...
885889
def lookup_reference_dwim(self, name: str) -> Reference: ...
886890
def lookup_worktree(self, name: str) -> Worktree: ...
891+
def merge(
892+
self,
893+
source: Reference | Commit | Oid | str,
894+
favor: MergeFavor = MergeFavor.NORMAL,
895+
flags: MergeFlag = MergeFlag.FIND_RENAMES,
896+
file_flags: MergeFileFlag = MergeFileFlag.DEFAULT,
897+
) -> None: ...
887898
def merge_analysis(
888899
self, their_head: _OidArg, our_ref: str = 'HEAD'
889900
) -> tuple[MergeAnalysis, MergePreference]: ...
890901
def merge_base(self, oid1: _OidArg, oid2: _OidArg) -> Oid: ...
891902
def merge_base_many(self, oids: list[_OidArg]) -> Oid: ...
892903
def merge_base_octopus(self, oids: list[_OidArg]) -> Oid: ...
904+
def merge_commits(
905+
self,
906+
ours: str | Oid | Commit,
907+
theirs: str | Oid | Commit,
908+
favor: MergeFavor = MergeFavor.NORMAL,
909+
flags: MergeFlag = MergeFlag.FIND_RENAMES,
910+
file_flags: MergeFileFlag = MergeFileFlag.DEFAULT,
911+
) -> Index: ...
912+
@staticmethod
913+
def _merge_options(
914+
favor: int | MergeFavor, flags: int | MergeFlag, file_flags: int | MergeFileFlag
915+
) -> GitMergeOptionsC: ...
916+
def merge_trees(
917+
self,
918+
ancestor: str | Oid | Tree,
919+
ours: str | Oid | Tree,
920+
theirs: str | Oid | Tree,
921+
favor: MergeFavor = MergeFavor.NORMAL,
922+
flags: MergeFlag = MergeFlag.FIND_RENAMES,
923+
file_flags: MergeFileFlag = MergeFileFlag.DEFAULT,
924+
) -> Index: ...
893925
@property
894926
def message(self) -> str: ...
895927
def notes(self) -> Iterator[Note]: ...
@@ -898,6 +930,9 @@ class Repository:
898930
self, flag: BranchType = BranchType.LOCAL
899931
) -> list[bytes]: ...
900932
def raw_listall_references(self) -> list[bytes]: ...
933+
@property
934+
def raw_message(self) -> bytes: ...
935+
def remove_message(self) -> None: ...
901936
def references_iterator_init(self) -> Iterator[Reference]: ...
902937
def references_iterator_next(
903938
self,

pygit2/repository.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,9 @@ def index(self):
670670
# Merging
671671
#
672672
@staticmethod
673-
def _merge_options(favor: MergeFavor, flags: MergeFlag, file_flags: MergeFileFlag):
673+
def _merge_options(
674+
favor: int | MergeFavor, flags: int | MergeFlag, file_flags: int | MergeFileFlag
675+
):
674676
"""Return a 'git_merge_opts *'"""
675677

676678
# Check arguments type

test/test_merge.py

Lines changed: 42 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -30,28 +30,29 @@
3030
import pytest
3131

3232
import pygit2
33+
from pygit2 import Repository
3334
from pygit2.enums import FileStatus, MergeAnalysis, MergeFavor, MergeFileFlag, MergeFlag
3435

3536

3637
@pytest.mark.parametrize('id', [None, 42])
37-
def test_merge_invalid_type(mergerepo, id):
38+
def test_merge_invalid_type(mergerepo: Repository, id: None | int) -> None:
3839
with pytest.raises(TypeError):
39-
mergerepo.merge(id)
40+
mergerepo.merge(id) # type:ignore
4041

4142

4243
# TODO: Once Repository.merge drops support for str arguments,
4344
# add an extra parameter to test_merge_invalid_type above
4445
# to make sure we cover legacy code.
45-
def test_merge_string_argument_deprecated(mergerepo):
46+
def test_merge_string_argument_deprecated(mergerepo: Repository) -> None:
4647
branch_head_hex = '5ebeeebb320790caf276b9fc8b24546d63316533'
4748

4849
with pytest.warns(DeprecationWarning, match=r'Pass Commit.+instead'):
4950
mergerepo.merge(branch_head_hex)
5051

5152

52-
def test_merge_analysis_uptodate(mergerepo):
53+
def test_merge_analysis_uptodate(mergerepo: Repository) -> None:
5354
branch_head_hex = '5ebeeebb320790caf276b9fc8b24546d63316533'
54-
branch_id = mergerepo.get(branch_head_hex).id
55+
branch_id = mergerepo[branch_head_hex].id
5556

5657
analysis, preference = mergerepo.merge_analysis(branch_id)
5758
assert analysis & MergeAnalysis.UP_TO_DATE
@@ -64,9 +65,9 @@ def test_merge_analysis_uptodate(mergerepo):
6465
assert {} == mergerepo.status()
6566

6667

67-
def test_merge_analysis_fastforward(mergerepo):
68+
def test_merge_analysis_fastforward(mergerepo: Repository) -> None:
6869
branch_head_hex = 'e97b4cfd5db0fb4ebabf4f203979ca4e5d1c7c87'
69-
branch_id = mergerepo.get(branch_head_hex).id
70+
branch_id = mergerepo[branch_head_hex].id
7071

7172
analysis, preference = mergerepo.merge_analysis(branch_id)
7273
assert not analysis & MergeAnalysis.UP_TO_DATE
@@ -79,9 +80,9 @@ def test_merge_analysis_fastforward(mergerepo):
7980
assert {} == mergerepo.status()
8081

8182

82-
def test_merge_no_fastforward_no_conflicts(mergerepo):
83+
def test_merge_no_fastforward_no_conflicts(mergerepo: Repository) -> None:
8384
branch_head_hex = '03490f16b15a09913edb3a067a3dc67fbb8d41f1'
84-
branch_id = mergerepo.get(branch_head_hex).id
85+
branch_id = mergerepo[branch_head_hex].id
8586
analysis, preference = mergerepo.merge_analysis(branch_id)
8687
assert not analysis & MergeAnalysis.UP_TO_DATE
8788
assert not analysis & MergeAnalysis.FASTFORWARD
@@ -90,7 +91,7 @@ def test_merge_no_fastforward_no_conflicts(mergerepo):
9091
assert {} == mergerepo.status()
9192

9293

93-
def test_merge_invalid_hex(mergerepo):
94+
def test_merge_invalid_hex(mergerepo: Repository) -> None:
9495
branch_head_hex = '12345678'
9596
with (
9697
pytest.raises(KeyError),
@@ -99,19 +100,19 @@ def test_merge_invalid_hex(mergerepo):
99100
mergerepo.merge(branch_head_hex)
100101

101102

102-
def test_merge_already_something_in_index(mergerepo):
103+
def test_merge_already_something_in_index(mergerepo: Repository) -> None:
103104
branch_head_hex = '03490f16b15a09913edb3a067a3dc67fbb8d41f1'
104-
branch_oid = mergerepo.get(branch_head_hex).id
105+
branch_oid = mergerepo[branch_head_hex].id
105106
with (Path(mergerepo.workdir) / 'inindex.txt').open('w') as f:
106107
f.write('new content')
107108
mergerepo.index.add('inindex.txt')
108109
with pytest.raises(pygit2.GitError):
109110
mergerepo.merge(branch_oid)
110111

111112

112-
def test_merge_no_fastforward_conflicts(mergerepo):
113+
def test_merge_no_fastforward_conflicts(mergerepo: Repository) -> None:
113114
branch_head_hex = '1b2bae55ac95a4be3f8983b86cd579226d0eb247'
114-
branch_id = mergerepo.get(branch_head_hex).id
115+
branch_id = mergerepo[branch_head_hex].id
115116

116117
analysis, preference = mergerepo.merge_analysis(branch_id)
117118
assert not analysis & MergeAnalysis.UP_TO_DATE
@@ -144,7 +145,7 @@ def test_merge_no_fastforward_conflicts(mergerepo):
144145
assert {'.gitignore': FileStatus.INDEX_MODIFIED} == mergerepo.status()
145146

146147

147-
def test_merge_remove_conflicts(mergerepo):
148+
def test_merge_remove_conflicts(mergerepo: Repository) -> None:
148149
other_branch_tip = pygit2.Oid(hex='1b2bae55ac95a4be3f8983b86cd579226d0eb247')
149150
mergerepo.merge(other_branch_tip)
150151
idx = mergerepo.index
@@ -154,7 +155,7 @@ def test_merge_remove_conflicts(mergerepo):
154155
try:
155156
conflicts['.gitignore']
156157
except KeyError:
157-
mergerepo.fail("conflicts['.gitignore'] raised KeyError unexpectedly")
158+
mergerepo.fail("conflicts['.gitignore'] raised KeyError unexpectedly") # type: ignore
158159
del idx.conflicts['.gitignore']
159160
with pytest.raises(KeyError):
160161
conflicts.__getitem__('.gitignore')
@@ -170,14 +171,14 @@ def test_merge_remove_conflicts(mergerepo):
170171
MergeFavor.UNION,
171172
],
172173
)
173-
def test_merge_favor(mergerepo, favor):
174+
def test_merge_favor(mergerepo: Repository, favor: MergeFavor) -> None:
174175
branch_head = pygit2.Oid(hex='1b2bae55ac95a4be3f8983b86cd579226d0eb247')
175176
mergerepo.merge(branch_head, favor=favor)
176177

177178
assert mergerepo.index.conflicts is None
178179

179180

180-
def test_merge_fail_on_conflict(mergerepo):
181+
def test_merge_fail_on_conflict(mergerepo: Repository) -> None:
181182
branch_head = pygit2.Oid(hex='1b2bae55ac95a4be3f8983b86cd579226d0eb247')
182183

183184
with pytest.raises(pygit2.GitError, match=r'merge conflicts exist'):
@@ -186,7 +187,7 @@ def test_merge_fail_on_conflict(mergerepo):
186187
)
187188

188189

189-
def test_merge_commits(mergerepo):
190+
def test_merge_commits(mergerepo: Repository) -> None:
190191
branch_head = pygit2.Oid(hex='03490f16b15a09913edb3a067a3dc67fbb8d41f1')
191192

192193
merge_index = mergerepo.merge_commits(mergerepo.head.target, branch_head)
@@ -201,7 +202,7 @@ def test_merge_commits(mergerepo):
201202
assert merge_tree == merge_commits_tree
202203

203204

204-
def test_merge_commits_favor(mergerepo):
205+
def test_merge_commits_favor(mergerepo: Repository) -> None:
205206
branch_head = pygit2.Oid(hex='1b2bae55ac95a4be3f8983b86cd579226d0eb247')
206207

207208
merge_index = mergerepo.merge_commits(
@@ -211,10 +212,10 @@ def test_merge_commits_favor(mergerepo):
211212

212213
# Incorrect favor value
213214
with pytest.raises(TypeError, match=r'favor argument must be MergeFavor'):
214-
mergerepo.merge_commits(mergerepo.head.target, branch_head, favor='foo')
215+
mergerepo.merge_commits(mergerepo.head.target, branch_head, favor='foo') # type: ignore
215216

216217

217-
def test_merge_trees(mergerepo):
218+
def test_merge_trees(mergerepo: Repository) -> None:
218219
branch_id = pygit2.Oid(hex='03490f16b15a09913edb3a067a3dc67fbb8d41f1')
219220
ancestor_id = mergerepo.merge_base(mergerepo.head.target, branch_id)
220221

@@ -230,7 +231,7 @@ def test_merge_trees(mergerepo):
230231
assert merge_tree == merge_commits_tree
231232

232233

233-
def test_merge_trees_favor(mergerepo):
234+
def test_merge_trees_favor(mergerepo: Repository) -> None:
234235
branch_head_hex = '1b2bae55ac95a4be3f8983b86cd579226d0eb247'
235236
ancestor_id = mergerepo.merge_base(mergerepo.head.target, branch_head_hex)
236237
merge_index = mergerepo.merge_trees(
@@ -240,14 +241,19 @@ def test_merge_trees_favor(mergerepo):
240241

241242
with pytest.raises(TypeError):
242243
mergerepo.merge_trees(
243-
ancestor_id, mergerepo.head.target, branch_head_hex, favor='foo'
244+
ancestor_id,
245+
mergerepo.head.target,
246+
branch_head_hex,
247+
favor='foo', # type: ignore
244248
)
245249

246250

247-
def test_merge_options():
251+
def test_merge_options() -> None:
248252
favor = MergeFavor.OURS
249-
flags = MergeFlag.FIND_RENAMES | MergeFlag.FAIL_ON_CONFLICT
250-
file_flags = MergeFileFlag.IGNORE_WHITESPACE | MergeFileFlag.DIFF_PATIENCE
253+
flags: int | MergeFlag = MergeFlag.FIND_RENAMES | MergeFlag.FAIL_ON_CONFLICT
254+
file_flags: int | MergeFileFlag = (
255+
MergeFileFlag.IGNORE_WHITESPACE | MergeFileFlag.DIFF_PATIENCE
256+
)
251257
o1 = pygit2.Repository._merge_options(
252258
favor=favor, flags=flags, file_flags=file_flags
253259
)
@@ -280,9 +286,9 @@ def test_merge_options():
280286
assert file_flags == o1.file_flags
281287

282288

283-
def test_merge_many(mergerepo):
289+
def test_merge_many(mergerepo: Repository) -> None:
284290
branch_head_hex = '03490f16b15a09913edb3a067a3dc67fbb8d41f1'
285-
branch_id = mergerepo.get(branch_head_hex).id
291+
branch_id = mergerepo[branch_head_hex].id
286292
ancestor_id = mergerepo.merge_base_many([mergerepo.head.target, branch_id])
287293

288294
merge_index = mergerepo.merge_trees(
@@ -299,9 +305,9 @@ def test_merge_many(mergerepo):
299305
assert merge_tree == merge_commits_tree
300306

301307

302-
def test_merge_octopus(mergerepo):
308+
def test_merge_octopus(mergerepo: Repository) -> None:
303309
branch_head_hex = '03490f16b15a09913edb3a067a3dc67fbb8d41f1'
304-
branch_id = mergerepo.get(branch_head_hex).id
310+
branch_id = mergerepo[branch_head_hex].id
305311
ancestor_id = mergerepo.merge_base_octopus([mergerepo.head.target, branch_id])
306312

307313
merge_index = mergerepo.merge_trees(
@@ -318,7 +324,7 @@ def test_merge_octopus(mergerepo):
318324
assert merge_tree == merge_commits_tree
319325

320326

321-
def test_merge_mergeheads(mergerepo):
327+
def test_merge_mergeheads(mergerepo: Repository) -> None:
322328
assert mergerepo.listall_mergeheads() == []
323329

324330
branch_head = pygit2.Oid(hex='1b2bae55ac95a4be3f8983b86cd579226d0eb247')
@@ -332,7 +338,7 @@ def test_merge_mergeheads(mergerepo):
332338
)
333339

334340

335-
def test_merge_message(mergerepo):
341+
def test_merge_message(mergerepo: Repository) -> None:
336342
assert not mergerepo.message
337343
assert not mergerepo.raw_message
338344

@@ -346,7 +352,7 @@ def test_merge_message(mergerepo):
346352
assert not mergerepo.message
347353

348354

349-
def test_merge_remove_message(mergerepo):
355+
def test_merge_remove_message(mergerepo: Repository) -> None:
350356
branch_head = pygit2.Oid(hex='1b2bae55ac95a4be3f8983b86cd579226d0eb247')
351357
mergerepo.merge(branch_head)
352358

@@ -355,7 +361,7 @@ def test_merge_remove_message(mergerepo):
355361
assert not mergerepo.message
356362

357363

358-
def test_merge_commit(mergerepo):
364+
def test_merge_commit(mergerepo: Repository) -> None:
359365
commit = mergerepo['1b2bae55ac95a4be3f8983b86cd579226d0eb247']
360366
assert isinstance(commit, pygit2.Commit)
361367
mergerepo.merge(commit)
@@ -364,7 +370,7 @@ def test_merge_commit(mergerepo):
364370
assert mergerepo.listall_mergeheads() == [commit.id]
365371

366372

367-
def test_merge_reference(mergerepo):
373+
def test_merge_reference(mergerepo: Repository) -> None:
368374
branch = mergerepo.branches.local['branch-conflicts']
369375
branch_head_hex = '1b2bae55ac95a4be3f8983b86cd579226d0eb247'
370376
mergerepo.merge(branch)

0 commit comments

Comments
 (0)