@@ -19,7 +19,7 @@ class EOLType(Enum):
1919
2020 @classmethod
2121 def for_open (cls ) -> str :
22- c = cmd .run ("git config core.eol" )
22+ c = cmd .run ([ "git" , " config" , " core.eol"] )
2323 eol = c .out .strip ().upper ()
2424 return cls ._char_for_open ()[cls ._safe_cast (eol )]
2525
@@ -164,17 +164,17 @@ def tag(
164164 tag : str , annotated : bool = False , signed : bool = False , msg : str | None = None
165165) -> cmd .Command :
166166 if not annotated and not signed :
167- return cmd .run (f "git tag { tag } " )
167+ return cmd .run ([ "git" , " tag" , tag ] )
168168
169169 # according to https://git-scm.com/book/en/v2/Git-Basics-Tagging,
170170 # we're not able to create lightweight tag with message.
171171 # by adding message, we make it a annotated tags
172172 option = "-s" if signed else "-a" # The else case is for annotated tags
173- return cmd .run (f' git tag { option } { tag } -m " { msg or tag } "' )
173+ return cmd .run ([ " git" , " tag" , option , tag , "-m" , msg or tag ] )
174174
175175
176176def add (* args : str ) -> cmd .Command :
177- return cmd .run (f "git add { ' ' . join ( args ) } " )
177+ return cmd .run ([ "git" , " add" , * args ] )
178178
179179
180180def commit (
@@ -186,20 +186,18 @@ def commit(
186186 f .write (message .encode ("utf-8" ))
187187 f .close ()
188188
189- command = _create_commit_cmd_string ( args , committer_date , f . name )
190- c = cmd . run ( command )
191- os . unlink ( f . name )
192- return c
189+ cmd_args = [ "git" , "commit" ]
190+ if args :
191+ cmd_args . extend ( args . split () )
192+ cmd_args . extend ([ "-F" , f . name ])
193193
194+ env : dict [str , str ] | None = None
195+ if committer_date :
196+ env = {"GIT_COMMITTER_DATE" : committer_date }
194197
195- def _create_commit_cmd_string (args : str , committer_date : str | None , name : str ) -> str :
196- command = f'git commit { args } -F "{ name } "'
197- if not committer_date :
198- return command
199- if os .name != "nt" :
200- return f"GIT_COMMITTER_DATE={ committer_date } { command } "
201- # Using `cmd /v /c "{command}"` sets environment variables only for that command
202- return f'cmd /v /c "set GIT_COMMITTER_DATE={ committer_date } && { command } "'
198+ c = cmd .run (cmd_args , env = env )
199+ os .unlink (f .name )
200+ return c
203201
204202
205203def get_commits (
@@ -226,7 +224,10 @@ def get_filenames_in_commit(git_reference: str = "") -> list[str]:
226224
227225 :returns: file names committed in the last commit by default or inside the passed git reference
228226 """
229- c = cmd .run (f"git show --name-only --pretty=format: { git_reference } " )
227+ cmd_args = ["git" , "show" , "--name-only" , "--pretty=format:" ]
228+ if git_reference :
229+ cmd_args .append (git_reference )
230+ c = cmd .run (cmd_args )
230231 if c .return_code == 0 :
231232 return c .out .strip ().split ("\n " )
232233 raise GitCommandError (c .err )
@@ -237,15 +238,17 @@ def get_tags(
237238) -> list [GitTag ]:
238239 inner_delimiter = "---inner_delimiter---"
239240 formatter = (
240- f' "%(refname:strip=2){ inner_delimiter } '
241+ f"%(refname:strip=2){ inner_delimiter } "
241242 f"%(objectname){ inner_delimiter } "
242243 f"%(creatordate:format:{ dateformat } ){ inner_delimiter } "
243- f' %(object)"'
244+ f" %(object)"
244245 )
245- extra = "--merged" if reachable_only else ""
246+ cmd_args = ["git" , "tag" , f"--format={ formatter } " , "--sort=-creatordate" ]
247+ if reachable_only :
248+ cmd_args .append ("--merged" )
246249 # Force the default language for parsing
247250 env = {"LC_ALL" : "C" , "LANG" : "C" , "LANGUAGE" : "C" }
248- c = cmd .run (f"git tag --format= { formatter } --sort=-creatordate { extra } " , env = env )
251+ c = cmd .run (cmd_args , env = env )
249252 if c .return_code != 0 :
250253 if reachable_only and c .err == "fatal: malformed object name HEAD\n " :
251254 # this can happen if there are no commits in the repo yet
@@ -262,55 +265,55 @@ def get_tags(
262265
263266
264267def tag_exist (tag : str ) -> bool :
265- c = cmd .run (f "git tag --list { tag } " )
268+ c = cmd .run ([ "git" , " tag" , " --list" , tag ] )
266269 return tag in c .out
267270
268271
269272def is_signed_tag (tag : str ) -> bool :
270- return cmd .run (f "git tag -v { tag } " ).return_code == 0
273+ return cmd .run ([ "git" , " tag" , "-v" , tag ] ).return_code == 0
271274
272275
273276def get_latest_tag_name () -> str | None :
274- c = cmd .run ("git describe --abbrev=0 --tags" )
277+ c = cmd .run ([ "git" , " describe" , " --abbrev=0" , " --tags"] )
275278 if c .err :
276279 return None
277280 return c .out .strip ()
278281
279282
280283def get_tag_message (tag : str ) -> str | None :
281- c = cmd .run (f "git tag -l --format=' %(contents:subject)' { tag } " )
284+ c = cmd .run ([ "git" , " tag" , "-l" , " --format=%(contents:subject)" , tag ] )
282285 if c .err :
283286 return None
284287 return c .out .strip ()
285288
286289
287290def get_tag_names () -> list [str ]:
288- c = cmd .run ("git tag --list" )
291+ c = cmd .run ([ "git" , " tag" , " --list"] )
289292 if c .err :
290293 return []
291294 return [tag for raw in c .out .split ("\n " ) if (tag := raw .strip ())]
292295
293296
294297def find_git_project_root () -> Path | None :
295- c = cmd .run ("git rev-parse --show-toplevel" )
298+ c = cmd .run ([ "git" , " rev-parse" , " --show-toplevel"] )
296299 if c .err :
297300 return None
298301 return Path (c .out .strip ())
299302
300303
301304def is_staging_clean () -> bool :
302305 """Check if staging is clean."""
303- c = cmd .run ("git diff --no-ext-diff --cached --name-only" )
306+ c = cmd .run ([ "git" , " diff" , " --no-ext-diff" , " --cached" , " --name-only"] )
304307 return not bool (c .out )
305308
306309
307310def is_git_project () -> bool :
308- c = cmd .run ("git rev-parse --is-inside-work-tree" )
311+ c = cmd .run ([ "git" , " rev-parse" , " --is-inside-work-tree"] )
309312 return c .out .strip () == "true"
310313
311314
312315def get_core_editor () -> str | None :
313- c = cmd .run ("git var GIT_EDITOR" )
316+ c = cmd .run ([ "git" , " var" , " GIT_EDITOR"] )
314317 if c .out :
315318 return c .out .strip ()
316319 return None
@@ -326,16 +329,26 @@ def _get_log_as_str_list(start: str | None, end: str, args: str) -> list[str]:
326329 delimiter = "----------commit-delimiter----------"
327330 log_format : str = "%H%n%P%n%s%n%an%n%ae%n%b"
328331 command_range = f"{ start } ..{ end } " if start else end
329- command = f"git -c log.showSignature=False log --pretty={ log_format } { delimiter } { args } { command_range } "
332+ cmd_args = [
333+ "git" ,
334+ "-c" ,
335+ "log.showSignature=False" ,
336+ "log" ,
337+ f"--pretty={ log_format } { delimiter } " ,
338+ ]
339+ if args :
340+ cmd_args .extend (args .split ())
341+ if command_range :
342+ cmd_args .append (command_range )
330343
331- c = cmd .run (command )
344+ c = cmd .run (cmd_args )
332345 if c .return_code != 0 :
333346 raise GitCommandError (c .err )
334347 return c .out .split (f"{ delimiter } \n " )
335348
336349
337350def get_default_branch () -> str :
338- c = cmd .run ("git symbolic-ref refs/remotes/origin/HEAD" )
351+ c = cmd .run ([ "git" , " symbolic-ref" , " refs/remotes/origin/HEAD"] )
339352 if c .return_code != 0 :
340353 raise GitCommandError (c .err )
341354 return c .out .strip ()
0 commit comments