@@ -236,13 +236,53 @@ def get_pre_commit_modified_documents(
236236 return git_head_documents , pre_committed_documents , diff_documents
237237
238238
239- def parse_commit_range (commit_range : str , path : str ) -> tuple [str , str ]:
240- from_commit_rev = None
241- to_commit_rev = None
239+ def parse_commit_range_sca (commit_range : str , path : str ) -> tuple [Optional [str ], Optional [str ]]:
240+ # FIXME(MarshalX): i truly believe that this function does NOT work as expected
241+ # it does not handle cases like 'A..B' correctly
242+ # i leave it as it for SCA to not break anything
243+ # the more correct approach is implemented for SAST
244+ from_commit_rev = to_commit_rev = None
242245
243246 for commit in git_proxy .get_repo (path ).iter_commits (rev = commit_range ):
244247 if not to_commit_rev :
245248 to_commit_rev = commit .hexsha
246249 from_commit_rev = commit .hexsha
247250
248251 return from_commit_rev , to_commit_rev
252+
253+
254+ def parse_commit_range_sast (commit_range : str , path : str ) -> tuple [Optional [str ], Optional [str ]]:
255+ """Parses a git commit range string and returns the full SHAs for the 'from' and 'to' commits.
256+
257+ Supports:
258+ - 'from..to'
259+ - 'from...to'
260+ - 'commit' (interpreted as 'commit..HEAD')
261+ - '..to' (interpreted as 'HEAD..to')
262+ - 'from..' (interpreted as 'from..HEAD')
263+ """
264+ repo = git_proxy .get_repo (path )
265+
266+ if '...' in commit_range :
267+ from_spec , to_spec = commit_range .split ('...' , 1 )
268+ elif '..' in commit_range :
269+ from_spec , to_spec = commit_range .split ('..' , 1 )
270+ else :
271+ # Git commands like 'git diff <commit>' compare against HEAD.
272+ from_spec = commit_range
273+ to_spec = 'HEAD'
274+
275+ # If a spec is empty (e.g., from '..master'), default it to 'HEAD'
276+ if not from_spec :
277+ from_spec = 'HEAD'
278+ if not to_spec :
279+ to_spec = 'HEAD'
280+
281+ try :
282+ # Use rev_parse to resolve each specifier to its full commit SHA
283+ from_commit_rev = repo .rev_parse (from_spec ).hexsha
284+ to_commit_rev = repo .rev_parse (to_spec ).hexsha
285+ return from_commit_rev , to_commit_rev
286+ except git_proxy .get_git_command_error () as e :
287+ logger .warning ("Failed to parse commit range '%s'" , commit_range , exc_info = e )
288+ return None , None
0 commit comments