11"""Package with general repository related functions"""
2+ from git .refs .reference import Reference
3+ from git .types import Commit_ish
24import os
35import stat
46from string import digits
@@ -202,7 +204,7 @@ def rev_parse(repo: 'Repo', rev: str) -> Union['Commit', 'Tag', 'Tree', 'Blob']:
202204raise NotImplementedError ("commit by message search ( regex )" )
203205# END handle search
204206
205- obj = cast ( Object ,None ) # not ideal. Should use guards
207+ obj : Union [ Commit_ish , Reference ,None ] = None
206208ref = None
207209output_type = "commit"
208210start = 0
@@ -222,14 +224,16 @@ def rev_parse(repo: 'Repo', rev: str) -> Union['Commit', 'Tag', 'Tree', 'Blob']:
222224ref = repo .head .ref
223225else :
224226if token == '@' :
225- ref = name_to_object (repo ,rev [:start ],return_ref = True )
227+ ref = cast ( Reference , name_to_object (repo ,rev [:start ],return_ref = True ) )
226228else :
227- obj = name_to_object (repo ,rev [:start ])
229+ obj = cast ( Commit_ish , name_to_object (repo ,rev [:start ]) )
228230# END handle token
229231# END handle refname
232+ else :
233+ assert obj is not None
230234
231235if ref is not None :
232- obj = ref .commit
236+ obj = cast ( Commit , ref .commit )
233237# END handle ref
234238# END initialize obj on first token
235239
@@ -247,11 +251,13 @@ def rev_parse(repo: 'Repo', rev: str) -> Union['Commit', 'Tag', 'Tree', 'Blob']:
247251pass # default
248252elif output_type == 'tree' :
249253try :
254+ obj = cast (Object ,obj )
250255obj = to_commit (obj ).tree
251256except (AttributeError ,ValueError ):
252257pass # error raised later
253258# END exception handling
254259elif output_type in ('' ,'blob' ):
260+ obj = cast (TagObject ,obj )
255261if obj and obj .type == 'tag' :
256262obj = deref_tag (obj )
257263else :
@@ -280,13 +286,13 @@ def rev_parse(repo: 'Repo', rev: str) -> Union['Commit', 'Tag', 'Tree', 'Blob']:
280286obj = Object .new_from_sha (repo ,hex_to_bin (entry .newhexsha ))
281287
282288# make it pass the following checks
283- output_type = None
289+ output_type = ''
284290else :
285291raise ValueError ("Invalid output type: %s ( in %s )" % (output_type ,rev ))
286292# END handle output type
287293
288294# empty output types don't require any specific type, its just about dereferencing tags
289- if output_type and obj .type != output_type :
295+ if output_type and obj and obj .type != output_type :
290296raise ValueError ("Could not accommodate requested object type %r, got %s" % (output_type ,obj .type ))
291297# END verify output type
292298
@@ -319,6 +325,7 @@ def rev_parse(repo: 'Repo', rev: str) -> Union['Commit', 'Tag', 'Tree', 'Blob']:
319325parsed_to = start
320326# handle hierarchy walk
321327try :
328+ obj = cast (Commit_ish ,obj )
322329if token == "~" :
323330obj = to_commit (obj )
324331for _ in range (num ):
@@ -347,7 +354,7 @@ def rev_parse(repo: 'Repo', rev: str) -> Union['Commit', 'Tag', 'Tree', 'Blob']:
347354
348355# still no obj ? Its probably a simple name
349356if obj is None :
350- obj = name_to_object (repo ,rev )
357+ obj = cast ( Commit_ish , name_to_object (repo ,rev ) )
351358parsed_to = lr
352359# END handle simple name
353360