30
30
31
31
if T .TYPE_CHECKING :
32
32
from typing_extensions import Literal , Protocol
33
+ from typing import TypedDict
33
34
34
35
from .._typing import ImmutableListProtocol
35
36
from ..build import ConfigurationData
@@ -756,40 +757,61 @@ def windows_detect_native_arch() -> str:
756
757
raise EnvironmentException ('Unable to detect native OS architecture' )
757
758
return arch
758
759
759
- def detect_vcs (source_dir : T .Union [str , Path ]) -> T .Optional [T .Dict [str , str ]]:
760
+ class VcsData :
761
+ def __init__ (self , * ,
762
+ name :str = '' ,
763
+ cmd :str = '' ,
764
+ repo_dir :str = '' ,
765
+ get_rev : 'T.List[str]' = ['' ],
766
+ rev_regex :str = '' ,
767
+ dep :str = '' ,
768
+ wc_dir :'T.Optional[str]' = None ):
769
+ self .name :str = name
770
+ self .cmd :str = cmd
771
+ self .repo_dir :str = repo_dir
772
+ self .get_rev : 'T.List[str]' = get_rev
773
+ self .rev_regex : str = rev_regex
774
+ self .dep : str = dep
775
+ self .wc_dir : 'T.Optional[str]' = wc_dir
776
+
777
+ def detect_vcs (source_dir : T .Union [str , Path ]) -> 'VcsData' :
760
778
vcs_systems = [
761
- {
762
- 'name' : 'git' ,
763
- 'cmd' : 'git' ,
764
- 'repo_dir' : '.git' ,
765
- 'get_rev' : 'git describe --dirty=+ --always' ,
766
- 'rev_regex' : '(.*)' ,
767
- 'dep' : '.git/logs/HEAD'
768
- },
769
- {
770
- 'name' : 'mercurial' ,
771
- 'cmd' : 'hg' ,
772
- 'repo_dir' : '.hg' ,
773
- 'get_rev' : 'hg id -i' ,
774
- 'rev_regex' : '(.*)' ,
775
- 'dep' : '.hg/dirstate'
776
- },
777
- {
778
- 'name' : 'subversion' ,
779
- 'cmd' : 'svn' ,
780
- 'repo_dir' : '.svn' ,
781
- 'get_rev' : 'svn info' ,
782
- 'rev_regex' : 'Revision: (.*)' ,
783
- 'dep' : '.svn/wc.db'
784
- },
785
- {
786
- 'name' : 'bazaar' ,
787
- 'cmd' : 'bzr' ,
788
- 'repo_dir' : '.bzr' ,
789
- 'get_rev' : 'bzr revno' ,
790
- 'rev_regex' : '(.*)' ,
791
- 'dep' : '.bzr'
792
- },
779
+ VcsData (
780
+ name = 'git' ,
781
+ cmd = ' git' ,
782
+ repo_dir = '.git' ,
783
+ get_rev = ['git' , 'describe' , '--dirty=+' , '--always' ],
784
+ rev_regex = '(.*)' ,
785
+ dep = '.git/logs/HEAD' ,
786
+ wc_dir = None ,
787
+ ),
788
+ VcsData (
789
+ name = 'mercurial' ,
790
+ cmd = 'hg' ,
791
+ repo_dir = '.hg' ,
792
+ get_rev = ['hg' , 'id' , '-i' ],
793
+ rev_regex = '(.*)' ,
794
+ dep = '.hg/dirstate' ,
795
+ wc_dir = None ,
796
+ ),
797
+ VcsData (
798
+ name = 'subversion' ,
799
+ cmd = 'svn' ,
800
+ repo_dir = '.svn' ,
801
+ get_rev = ['svn' , 'info' ],
802
+ rev_regex = 'Revision: (.*)' ,
803
+ dep = '.svn/wc.db' ,
804
+ wc_dir = None ,
805
+ ),
806
+ VcsData (
807
+ name = 'bazaar' ,
808
+ cmd = 'bzr' ,
809
+ repo_dir = '.bzr' ,
810
+ get_rev = ['bzr' , 'revno' ],
811
+ rev_regex = '(.*)' ,
812
+ dep = '.bzr' ,
813
+ wc_dir = None ,
814
+ ),
793
815
]
794
816
if isinstance (source_dir , str ):
795
817
source_dir = Path (source_dir )
@@ -800,8 +822,10 @@ def detect_vcs(source_dir: T.Union[str, Path]) -> T.Optional[T.Dict[str, str]]:
800
822
parent_paths_and_self .appendleft (source_dir )
801
823
for curdir in parent_paths_and_self :
802
824
for vcs in vcs_systems :
803
- if Path .is_dir (curdir .joinpath (vcs ['repo_dir' ])) and shutil .which (vcs ['cmd' ]):
804
- vcs ['wc_dir' ] = str (curdir )
825
+ repodir = vcs .repo_dir
826
+ cmd = vcs .cmd
827
+ if curdir .joinpath (repodir ).is_dir () and shutil .which (cmd ):
828
+ vcs .wc_dir = str (curdir )
805
829
return vcs
806
830
return None
807
831
0 commit comments