Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 53d0897

Browse files
committed
Add enums MergeAnalysis, MergePreference
1 parent f58384f commit 53d0897

5 files changed

Lines changed: 73 additions & 26 deletions

File tree

pygit2/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@
4949
DiffOption,
5050
Feature,
5151
FileMode,
52+
MergeAnalysis,
53+
MergePreference,
5254
ReferenceFilter,
5355
ReferenceType,
5456
RepositoryInitFlag,

pygit2/_pygit2.pyi

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ from . import Index, Submodule
44
from .enums import ApplyLocation
55
from .enums import BranchType
66
from .enums import DiffOption
7+
from .enums import MergeAnalysis
8+
from .enums import MergePreference
79
from .enums import ReferenceFilter
810

911
GIT_BLAME_FIRST_PARENT: int
@@ -57,14 +59,6 @@ GIT_DIFF_STATS_INCLUDE_SUMMARY: int
5759
GIT_DIFF_STATS_NONE: int
5860
GIT_DIFF_STATS_NUMBER: int
5961
GIT_DIFF_STATS_SHORT: int
60-
GIT_MERGE_ANALYSIS_FASTFORWARD: int
61-
GIT_MERGE_ANALYSIS_NONE: int
62-
GIT_MERGE_ANALYSIS_NORMAL: int
63-
GIT_MERGE_ANALYSIS_UNBORN: int
64-
GIT_MERGE_ANALYSIS_UP_TO_DATE: int
65-
GIT_MERGE_PREFERENCE_FASTFORWARD_ONLY: int
66-
GIT_MERGE_PREFERENCE_NONE: int
67-
GIT_MERGE_PREFERENCE_NO_FASTFORWARD: int
6862
GIT_OBJ_ANY: Literal[-2]
6963
GIT_OBJ_BLOB: Literal[3]
7064
GIT_OBJ_COMMIT: Literal[1]
@@ -448,7 +442,7 @@ class Repository:
448442
def lookup_reference(self, name: str) -> Reference: ...
449443
def lookup_reference_dwim(self, name: str) -> Reference: ...
450444
def lookup_worktree(self, name: str) -> Worktree: ...
451-
def merge_analysis(self, their_head: _OidArg, our_ref: str = "HEAD") -> tuple[int,int]: ...
445+
def merge_analysis(self, their_head: _OidArg, our_ref: str = "HEAD") -> tuple[MergeAnalysis, MergePreference]: ...
452446
def merge_base(self, oid1: _OidArg, oid2: _OidArg) -> Oid: ...
453447
def merge_base_many(self, oids: list[_OidArg]) -> Oid: ...
454448
def merge_base_octopus(self, oids: list[_OidArg]) -> Oid: ...

pygit2/enums.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,58 @@ class FileMode(IntFlag):
368368
COMMIT = _pygit2.GIT_FILEMODE_COMMIT
369369

370370

371+
class MergeAnalysis(IntFlag):
372+
""" The results of `Repository.merge_analysis` indicate the merge opportunities. """
373+
374+
NONE = _pygit2.GIT_MERGE_ANALYSIS_NONE
375+
"No merge is possible. (Unused.)"
376+
377+
NORMAL = _pygit2.GIT_MERGE_ANALYSIS_NORMAL
378+
"""
379+
A "normal" merge; both HEAD and the given merge input have diverged
380+
from their common ancestor. The divergent commits must be merged.
381+
"""
382+
383+
UP_TO_DATE = _pygit2.GIT_MERGE_ANALYSIS_UP_TO_DATE
384+
"""
385+
All given merge inputs are reachable from HEAD, meaning the
386+
repository is up-to-date and no merge needs to be performed.
387+
"""
388+
389+
FASTFORWARD = _pygit2.GIT_MERGE_ANALYSIS_FASTFORWARD
390+
"""
391+
The given merge input is a fast-forward from HEAD and no merge
392+
needs to be performed. Instead, the client can check out the
393+
given merge input.
394+
"""
395+
396+
UNBORN = _pygit2.GIT_MERGE_ANALYSIS_UNBORN
397+
"""
398+
The HEAD of the current repository is "unborn" and does not point to
399+
a valid commit. No merge can be performed, but the caller may wish
400+
to simply set HEAD to the target commit(s).
401+
"""
402+
403+
404+
class MergePreference(IntFlag):
405+
""" The user's stated preference for merges. """
406+
407+
NONE = _pygit2.GIT_MERGE_PREFERENCE_NONE
408+
"No configuration was found that suggests a preferred behavior for merge."
409+
410+
NO_FASTFORWARD = _pygit2.GIT_MERGE_PREFERENCE_NO_FASTFORWARD
411+
"""
412+
There is a `merge.ff=false` configuration setting, suggesting that
413+
the user does not want to allow a fast-forward merge.
414+
"""
415+
416+
FASTFORWARD_ONLY = _pygit2.GIT_MERGE_PREFERENCE_FASTFORWARD_ONLY
417+
"""
418+
There is a `merge.ff=only` configuration setting, suggesting that
419+
the user only wants fast-forward merges.
420+
"""
421+
422+
371423
class ReferenceFilter(IntEnum):
372424
""" Filters for References.iterator(). """
373425

src/repository.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,7 @@ Repository_merge_base_octopus(Repository *self, PyObject *args)
647647
}
648648

649649
PyDoc_STRVAR(Repository_merge_analysis__doc__,
650-
"merge_analysis(their_head: Oid, our_ref: str = \"HEAD\") -> tuple[int, int]\n"
650+
"merge_analysis(their_head: Oid, our_ref: str = \"HEAD\") -> tuple[MergeAnalysis, MergePreference]\n"
651651
"\n"
652652
"Analyzes the given branch and determines the opportunities for\n"
653653
"merging it into a reference (defaults to HEAD).\n"
@@ -660,8 +660,8 @@ PyDoc_STRVAR(Repository_merge_analysis__doc__,
660660
"their_head\n"
661661
" Head (commit Oid) to merge into\n"
662662
"\n"
663-
"The first returned value is a mixture of the GIT_MERGE_ANALYSIS_NONE, _NORMAL,\n"
664-
"_UP_TO_DATE, _FASTFORWARD and _UNBORN flags.\n"
663+
"The first returned value is a mixture of the MergeAnalysis.NONE, NORMAL,\n"
664+
"UP_TO_DATE, FASTFORWARD and UNBORN flags.\n"
665665
"The second value is the user's preference from 'merge.ff'");
666666

667667
PyObject *

test/test_merge.py

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@
2929

3030
import pytest
3131

32-
from pygit2 import GIT_MERGE_ANALYSIS_UP_TO_DATE
33-
from pygit2 import GIT_MERGE_ANALYSIS_FASTFORWARD
32+
from pygit2 import MergeAnalysis
3433
import pygit2
3534

3635

@@ -43,35 +42,35 @@ def test_merge_analysis_uptodate(mergerepo):
4342
branch_id = mergerepo.get(branch_head_hex).id
4443

4544
analysis, preference = mergerepo.merge_analysis(branch_id)
46-
assert analysis & GIT_MERGE_ANALYSIS_UP_TO_DATE
47-
assert not analysis & GIT_MERGE_ANALYSIS_FASTFORWARD
45+
assert analysis & MergeAnalysis.UP_TO_DATE
46+
assert not analysis & MergeAnalysis.FASTFORWARD
4847
assert {} == mergerepo.status()
4948

5049
analysis, preference = mergerepo.merge_analysis(branch_id, 'refs/heads/ff-branch')
51-
assert analysis & GIT_MERGE_ANALYSIS_UP_TO_DATE
52-
assert not analysis & GIT_MERGE_ANALYSIS_FASTFORWARD
50+
assert analysis & MergeAnalysis.UP_TO_DATE
51+
assert not analysis & MergeAnalysis.FASTFORWARD
5352
assert {} == mergerepo.status()
5453

5554
def test_merge_analysis_fastforward(mergerepo):
5655
branch_head_hex = 'e97b4cfd5db0fb4ebabf4f203979ca4e5d1c7c87'
5756
branch_id = mergerepo.get(branch_head_hex).id
5857

5958
analysis, preference = mergerepo.merge_analysis(branch_id)
60-
assert not analysis & GIT_MERGE_ANALYSIS_UP_TO_DATE
61-
assert analysis & GIT_MERGE_ANALYSIS_FASTFORWARD
59+
assert not analysis & MergeAnalysis.UP_TO_DATE
60+
assert analysis & MergeAnalysis.FASTFORWARD
6261
assert {} == mergerepo.status()
6362

6463
analysis, preference = mergerepo.merge_analysis(branch_id, 'refs/heads/master')
65-
assert not analysis & GIT_MERGE_ANALYSIS_UP_TO_DATE
66-
assert analysis & GIT_MERGE_ANALYSIS_FASTFORWARD
64+
assert not analysis & MergeAnalysis.UP_TO_DATE
65+
assert analysis & MergeAnalysis.FASTFORWARD
6766
assert {} == mergerepo.status()
6867

6968
def test_merge_no_fastforward_no_conflicts(mergerepo):
7069
branch_head_hex = '03490f16b15a09913edb3a067a3dc67fbb8d41f1'
7170
branch_id = mergerepo.get(branch_head_hex).id
7271
analysis, preference = mergerepo.merge_analysis(branch_id)
73-
assert not analysis & GIT_MERGE_ANALYSIS_UP_TO_DATE
74-
assert not analysis & GIT_MERGE_ANALYSIS_FASTFORWARD
72+
assert not analysis & MergeAnalysis.UP_TO_DATE
73+
assert not analysis & MergeAnalysis.FASTFORWARD
7574
# Asking twice to assure the reference counting is correct
7675
assert {} == mergerepo.status()
7776
assert {} == mergerepo.status()
@@ -94,8 +93,8 @@ def test_merge_no_fastforward_conflicts(mergerepo):
9493
branch_id = mergerepo.get(branch_head_hex).id
9594

9695
analysis, preference = mergerepo.merge_analysis(branch_id)
97-
assert not analysis & GIT_MERGE_ANALYSIS_UP_TO_DATE
98-
assert not analysis & GIT_MERGE_ANALYSIS_FASTFORWARD
96+
assert not analysis & MergeAnalysis.UP_TO_DATE
97+
assert not analysis & MergeAnalysis.FASTFORWARD
9998

10099
mergerepo.merge(branch_id)
101100
assert mergerepo.index.conflicts is not None

0 commit comments

Comments
 (0)