Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork966
Expand file tree
/
Copy pathutil.py
More file actions
121 lines (87 loc) · 3.43 KB
/
util.py
File metadata and controls
121 lines (87 loc) · 3.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# This module is part of GitPython and is released under the
# 3-Clause BSD License: https://opensource.org/license/bsd-3-clause/
__all__= [
"sm_section",
"sm_name",
"mkhead",
"find_first_remote_branch",
"SubmoduleConfigParser",
]
fromioimportBytesIO
importweakref
importgit
fromgit.configimportGitConfigParser
fromgit.excimportInvalidGitRepositoryError
# typing -----------------------------------------------------------------------
fromtypingimportAny,Sequence,TYPE_CHECKING,Union
fromgit.typesimportPathLike
ifTYPE_CHECKING:
fromweakrefimportReferenceType
fromgit.refsimportHead,RemoteReference
fromgit.remoteimportRemote
fromgit.repoimportRepo
from .baseimportSubmodule
# { Utilities
defsm_section(name:str)->str:
""":return: Section title used in ``.gitmodules`` configuration file"""
returnf'submodule "{name}"'
defsm_name(section:str)->str:
""":return: Name of the submodule as parsed from the section name"""
section=section.strip()
returnsection[11:-1]
defmkhead(repo:"Repo",path:PathLike)->"Head":
""":return: New branch/head instance"""
returngit.Head(repo,git.Head.to_full_path(path))
deffind_first_remote_branch(remotes:Sequence["Remote"],branch_name:str)->"RemoteReference":
"""Find the remote branch matching the name of the given branch or raise
:exc:`~git.exc.InvalidGitRepositoryError`."""
forremoteinremotes:
try:
returnremote.refs[branch_name]
exceptIndexError:
continue
# END exception handling
# END for remote
raiseInvalidGitRepositoryError("Didn't find remote branch '%r' in any of the given remotes"%branch_name)
# } END utilities
# { Classes
classSubmoduleConfigParser(GitConfigParser):
"""Catches calls to :meth:`~git.config.GitConfigParser.write`, and updates the
``.gitmodules`` blob in the index with the new data, if we have written into a
stream.
Otherwise it would add the local file to the index to make it correspond with the
working tree. Additionally, the cache must be cleared.
Please note that no mutating method will work in bare mode.
"""
def__init__(self,*args:Any,**kwargs:Any)->None:
self._smref:Union["ReferenceType[Submodule]",None]=None
self._index=None
self._auto_write=True
super().__init__(*args,**kwargs)
# { Interface
defset_submodule(self,submodule:"Submodule")->None:
"""Set this instance's submodule. It must be called before the first write
operation begins."""
self._smref=weakref.ref(submodule)
defflush_to_index(self)->None:
"""Flush changes in our configuration file to the index."""
assertself._smrefisnotNone
# Should always have a file here.
assertnotisinstance(self._file_or_files,BytesIO)
sm=self._smref()
ifsmisnotNone:
index=self._index
ifindexisNone:
index=sm.repo.index
# END handle index
index.add([sm.k_modules_file],write=self._auto_write)
sm._clear_cache()
# END handle weakref
# } END interface
# { Overridden Methods
defwrite(self)->None:# type: ignore[override]
rval:None=super().write()
self.flush_to_index()
returnrval
# END overridden methods
# } END classes