5
5
from os .path import isfile
6
6
from os .path import join
7
7
from os .path import samefile
8
+ from shlex import quote
8
9
9
10
from .config import Configuration
10
11
from .scm_workdir import Workdir
@@ -36,7 +37,11 @@ class GitWorkdir(Workdir):
36
37
def from_potential_worktree (cls , wd ):
37
38
require_command (cls .COMMAND )
38
39
wd = os .path .abspath (wd )
39
- real_wd , _ , ret = do_ex ("git rev-parse --show-prefix" , wd )
40
+ git_dir = join (wd , ".git" )
41
+ real_wd , _ , ret = do_ex (
42
+ f"git --git-dir={ quote (git_dir )} rev-parse --show-prefix" ,
43
+ wd ,
44
+ )
40
45
real_wd = real_wd [:- 1 ] # remove the trailing pathsep
41
46
if ret :
42
47
return
@@ -54,23 +59,35 @@ def from_potential_worktree(cls, wd):
54
59
55
60
return cls (real_wd )
56
61
62
+ def __init__ (self , * args , ** kwargs ):
63
+ super ().__init__ (* args , ** kwargs )
64
+ self ._git_dir = join (self .path , ".git" )
65
+
57
66
def is_dirty (self ):
58
- out , _ , _ = self .do_ex ("git status --porcelain --untracked-files=no" )
67
+ out , _ , _ = self .do_ex (
68
+ f"git --git-dir={ quote (self ._git_dir )} "
69
+ "status --porcelain --untracked-files=no"
70
+ )
59
71
return bool (out )
60
72
61
73
def get_branch (self ):
62
- branch , err , ret = self .do_ex ("git rev-parse --abbrev-ref HEAD" )
74
+ branch , err , ret = self .do_ex (
75
+ f"git --git-dir={ quote (self ._git_dir )} rev-parse --abbrev-ref HEAD"
76
+ )
63
77
if ret :
64
78
trace ("branch err" , branch , err , ret )
65
- branch , err , ret = self .do_ex ("git symbolic-ref --short HEAD" )
79
+ branch , err , ret = self .do_ex (
80
+ f"git --git-dir={ quote (self ._git_dir )} symbolic-ref --short HEAD"
81
+ )
66
82
if ret :
67
83
trace ("branch err (symbolic-ref)" , branch , err , ret )
68
84
branch = None
69
85
return branch
70
86
71
87
def get_head_date (self ):
72
88
timestamp , err , ret = self .do_ex (
73
- "git -c log.showSignature=false log -n 1 HEAD --format=%cI"
89
+ f"git --git-dir={ quote (self ._git_dir )} -c log.showSignature=false "
90
+ "log -n 1 HEAD --format=%cI"
74
91
)
75
92
if ret :
76
93
trace ("timestamp err" , timestamp , err , ret )
@@ -83,22 +100,26 @@ def get_head_date(self):
83
100
return datetime .strptime (date_part , r"%Y-%m-%d" ).date ()
84
101
85
102
def is_shallow (self ):
86
- return isfile (join (self .path , ".git/ shallow" ))
103
+ return isfile (join (self ._git_dir , "shallow" ))
87
104
88
105
def fetch_shallow (self ):
89
- self .do_ex ("git fetch --unshallow" )
106
+ self .do_ex (f "git --git-dir= { quote ( self . _git_dir ) } fetch --unshallow" )
90
107
91
108
def node (self ):
92
- node , _ , ret = self .do_ex ("git rev-parse --verify --quiet HEAD" )
109
+ node , _ , ret = self .do_ex (
110
+ f"git --git-dir={ quote (self ._git_dir )} rev-parse --verify --quiet HEAD"
111
+ )
93
112
if not ret :
94
113
return node [:7 ]
95
114
96
115
def count_all_nodes (self ):
97
- revs , _ , _ = self .do_ex ("git rev-list HEAD" )
116
+ revs , _ , _ = self .do_ex (f "git --git-dir= { quote ( self . _git_dir ) } rev-list HEAD" )
98
117
return revs .count ("\n " ) + 1
99
118
100
119
def default_describe (self ):
101
- return self .do_ex (DEFAULT_DESCRIBE )
120
+ return self .do_ex (
121
+ DEFAULT_DESCRIBE [:1 ] + ["--git-dir" , self ._git_dir ] + DEFAULT_DESCRIBE [1 :]
122
+ )
102
123
103
124
104
125
def warn_on_shallow (wd ):
0 commit comments