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
110 lines (80 loc) · 3.28 KB
/
util.py
File metadata and controls
110 lines (80 loc) · 3.28 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
importgit
fromgit.excimportInvalidGitRepositoryError
fromgit.configimportGitConfigParser
fromioimportBytesIO
importweakref
# typing -----------------------------------------------------------------------
fromtypingimportAny,Sequence,TYPE_CHECKING,Union
fromgit.typesimportPathLike
ifTYPE_CHECKING:
from .baseimportSubmodule
fromweakrefimportReferenceType
fromgit.repoimportRepo
fromgit.refsimportHead
fromgitimportRemote
fromgit.refsimportRemoteReference
__all__= ('sm_section','sm_name','mkhead','find_first_remote_branch',
'SubmoduleConfigParser')
#{ 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 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 _write, and updates the .gitmodules blob in the index
with the new data, if we have written into a stream. Otherwise it will
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(SubmoduleConfigParser,self).__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(SubmoduleConfigParser,self).write()
self.flush_to_index()
returnrval
# END overridden methods
#} END classes