spine-tools / spine-conductor

Release orchestration & automation scripts for Spine tools
GNU General Public License v3.0
1 stars 1 forks source link

Creating release tags fails because Conductor's environment is missing programs needed by Git precommit hooks #28

Closed soininen closed 1 month ago

soininen commented 2 months ago

I have installed Git's precommit hooks for Toolbox which run black and isort. This leads to failure when trying to create release tags because Conductor's Python environment is missing both programs. Traceback:

┌─────────────────────────────── Traceback (most recent call last) ────────────────────────────────┐
│ site-packages\git\index\fun.py:101 in │
│ run_commit_hook                                                                                  │
│                                                                                                  │
│    98 │   │   │   relative_hp = Path(hp).relative_to(index.repo.working_dir).as_posix()          │
│    99 │   │   │   cmd = ["bash.exe", relative_hp]                                                │
│   100 │   │                                                                                      │
│ > 101 │   │   process = safer_popen(                                                             │
│   102 │   │   │   cmd + list(args),                                                              │
│   103 │   │   │   env=env,                                                                       │
│   104 │   │   │   stdout=subprocess.PIPE,                                                        │
│                                                                                                  │
│ ┌─────────────────────────────────────── locals ────────────────────────────────────────┐        │
│ │        args = ()                                                                      │        │
│ │         cmd = ['bash.exe', '.git/hooks/pre-commit']                                   │        │
│ │         env = {                                                                       │        │
│ │               │   'ALLUSERSPROFILE': 'C:\\ProgramData',                               │        │
│ │               │   'APPDATA': '\\AppData\\Roaming',                │        │
│ │               │   'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files',            │        │
│ │               │   'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', │        │
│ │               │   'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files',            │        │
│ │               │   'COMPUTERNAME': 'ESPTE21K2280',                                     │        │
│ │               │   'COMSPEC': 'C:\\WINDOWS\\system32\\cmd.exe',                        │        │
│ │               │   'DEPLOYMENT.EXPIRATION.CHECK.ENABLED': 'false',                     │        │
│ │               │   'DRIVERDATA': 'C:\\Windows\\System32\\Drivers\\DriverData',         │        │
│ │               │   'FPS_BROWSER_APP_PROFILE_STRING': 'Internet Explorer',              │        │
│ │               │   ... +43                                                             │        │
│ │               }                                                                       │        │
│ │          hp = 'Spine-Toolbox\\.git\\hooks\\pre-commit' │        │
│ │       index = <git.index.base.IndexFile object at 0x000001D07C1ED170>                 │        │
│ │        name = 'pre-commit'                                                            │        │
│ │ relative_hp = '.git/hooks/pre-commit'                                                 │        │
│ └───────────────────────────────────────────────────────────────────────────────────────┘        │
│                                                                                                  │
│ site-packages\git\cmd.py:257 in       │
│ _safer_popen_windows                                                                             │
│                                                                                                  │
│    254 │   # shell is searched for unsafely. Setting NoDefaultCurrentDirectoryInExePath in all   │
│    255 │   # cases, as here, is simpler and protects against that. (The "1" can be any value.)   │
│    256 │   with patch_env("NoDefaultCurrentDirectoryInExePath", "1"):                            │
│ >  257 │   │   return Popen(                                                                     │
│    258 │   │   │   command,                                                                      │
│    259 │   │   │   shell=shell,                                                                  │
│    260 │   │   │   env=safer_env,                                                                │
│                                                                                                  │
│ ┌─────────────────────────────────────────── locals ───────────────────────────────────────────┐ │
│ │       command = ['bash.exe', '.git/hooks/pre-commit']                                        │ │
│ │ creationflags = 134218240                                                                    │ │
│ │           env = {                                                                            │ │
│ │                 │   'ALLUSERSPROFILE': 'C:\\ProgramData',                                    │ │
│ │                 │   'APPDATA': 'AppData\\Roaming',                     │ │
│ │                 │   'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files',                 │ │
│ │                 │   'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files',      │ │
│ │                 │   'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files',                 │ │
│ │                 │   'COMPUTERNAME': 'ESPTE21K2280',                                          │ │
│ │                 │   'COMSPEC': 'C:\\WINDOWS\\system32\\cmd.exe',                             │ │
│ │                 │   'DEPLOYMENT.EXPIRATION.CHECK.ENABLED': 'false',                          │ │
│ │                 │   'DRIVERDATA': 'C:\\Windows\\System32\\Drivers\\DriverData',              │ │
│ │                 │   'FPS_BROWSER_APP_PROFILE_STRING': 'Internet Explorer',                   │ │
│ │                 │   ... +43                                                                  │ │
│ │                 }                                                                            │ │
│ │        kwargs = {                                                                            │ │
│ │                 │   'stdout': -1,                                                            │ │
│ │                 │   'stderr': -1,                                                            │ │
│ │                 │   'cwd': '\\Spine-Toolbox'                    │ │
│ │                 }                                                                            │ │
│ │     safer_env = {                                                                            │ │
│ │                 │   'ALLUSERSPROFILE': 'C:\\ProgramData',                                    │ │
│ │                 │   'APPDATA': 'AppData\\Roaming',                     │ │
│ │                 │   'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files',                 │ │
│ │                 │   'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files',      │ │
│ │                 │   'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files',                 │ │
│ │                 │   'COMPUTERNAME': 'ESPTE21K2280',                                          │ │
│ │                 │   'COMSPEC': 'C:\\WINDOWS\\system32\\cmd.exe',                             │ │
│ │                 │   'DEPLOYMENT.EXPIRATION.CHECK.ENABLED': 'false',                          │ │
│ │                 │   'DRIVERDATA': 'C:\\Windows\\System32\\Drivers\\DriverData',              │ │
│ │                 │   'FPS_BROWSER_APP_PROFILE_STRING': 'Internet Explorer',                   │ │
│ │                 │   ... +43                                                                  │ │
│ │                 }                                                                            │ │
│ │         shell = False                                                                        │ │
│ └──────────────────────────────────────────────────────────────────────────────────────────────┘ │
│                                                                                                  │
│ subprocess.py:1026 in __init__    │
│                                                                                                  │
│   1023 │   │   │   │   │   self.stderr = io.TextIOWrapper(self.stderr,                           │
│   1024 │   │   │   │   │   │   │   encoding=encoding, errors=errors)                             │
│   1025 │   │   │                                                                                 │
│ > 1026 │   │   │   self._execute_child(args, executable, preexec_fn, close_fds,                  │
│   1027 │   │   │   │   │   │   │   │   pass_fds, cwd, env,                                       │
│   1028 │   │   │   │   │   │   │   │   startupinfo, creationflags, shell,                        │
│   1029 │   │   │   │   │   │   │   │   p2cread, p2cwrite,                                        │
│                                                                                                  │
│ ┌─────────────────────────────────────────── locals ───────────────────────────────────────────┐ │
│ │               args = ['bash.exe', '.git/hooks/pre-commit']                                   │ │
│ │            bufsize = -1                                                                      │ │
│ │            c2pread = 7                                                                       │ │
│ │           c2pwrite = Handle(948)                                                             │ │
│ │          close_fds = True                                                                    │ │
│ │      creationflags = 134218240                                                               │ │
│ │                cwd = '\\Spine-Toolbox'                          │ │
│ │           encoding = None                                                                    │ │
│ │                env = {                                                                       │ │
│ │                      │   'ALLUSERSPROFILE': 'C:\\ProgramData',                               │ │
│ │                      │   'APPDATA': 'AppData\\Roaming',                │ │
│ │                      │   'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files',            │ │
│ │                      │   'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', │ │
│ │                      │   'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files',            │ │
│ │                      │   'COMPUTERNAME': 'ESPTE21K2280',                                     │ │
│ │                      │   'COMSPEC': 'C:\\WINDOWS\\system32\\cmd.exe',                        │ │
│ │                      │   'DEPLOYMENT.EXPIRATION.CHECK.ENABLED': 'false',                     │ │
│ │                      │   'DRIVERDATA': 'C:\\Windows\\System32\\Drivers\\DriverData',         │ │
│ │                      │   'FPS_BROWSER_APP_PROFILE_STRING': 'Internet Explorer',              │ │
│ │                      │   ... +43                                                             │ │
│ │                      }                                                                       │ │
│ │             errors = None                                                                    │ │
│ │            errread = 8                                                                       │ │
│ │           errwrite = Handle(896)                                                             │ │
│ │         executable = None                                                                    │ │
│ │       extra_groups = None                                                                    │ │
│ │                  f = <_io.BufferedReader name=8>                                             │ │
│ │                gid = None                                                                    │ │
│ │               gids = None                                                                    │ │
│ │              group = None                                                                    │ │
│ │            p2cread = Handle(932)                                                             │ │
│ │           p2cwrite = -1                                                                      │ │
│ │           pass_fds = ()                                                                      │ │
│ │           pipesize = -1                                                                      │ │
│ │         preexec_fn = None                                                                    │ │
│ │      process_group = -1                                                                      │ │
│ │    restore_signals = True                                                                    │ │
│ │               self = <Popen: returncode: None args: ['bash.exe', '.git/hooks/pre-commit']>   │ │
│ │              shell = False                                                                   │ │
│ │  start_new_session = False                                                                   │ │
│ │        startupinfo = None                                                                    │ │
│ │             stderr = -1                                                                      │ │
│ │              stdin = None                                                                    │ │
│ │             stdout = -1                                                                      │ │
│ │               text = None                                                                    │ │
│ │                uid = None                                                                    │ │
│ │              umask = -1                                                                      │ │
│ │ universal_newlines = None                                                                    │ │
│ │               user = None                                                                    │ │
│ └──────────────────────────────────────────────────────────────────────────────────────────────┘ │
│                                                                                                  │
│ subprocess.py:1538 in             │
│ _execute_child                                                                                   │
│                                                                                                  │
│   1535 │   │   │                                                                                 │
│   1536 │   │   │   # Start the process                                                           │
│   1537 │   │   │   try:                                                                          │
│ > 1538 │   │   │   │   hp, ht, pid, tid = _winapi.CreateProcess(executable, args,                │
│   1539 │   │   │   │   │   │   │   │   │   │    # no special security                            │
│   1540 │   │   │   │   │   │   │   │   │   │    None, None,                                      │
│   1541 │   │   │   │   │   │   │   │   │   │    int(not close_fds),                              │
│                                                                                                  │
│ ┌─────────────────────────────────────────── locals ───────────────────────────────────────────┐ │
│ │                     args = 'bash.exe .git/hooks/pre-commit'                                  │ │
│ │           attribute_list = {'handle_list': [896, 948, 932]}                                  │ │
│ │                  c2pread = 7                                                                 │ │
│ │                 c2pwrite = Handle(948)                                                       │ │
│ │                close_fds = False                                                             │ │
│ │            creationflags = 134218240                                                         │ │
│ │                      cwd = '\\Spine-Toolbox'                    │ │
│ │                      env = {                                                                 │ │
│ │                            │   'ALLUSERSPROFILE': 'C:\\ProgramData',                         │ │
│ │                            │   'APPDATA': 'AppData\\Roaming',          │ │
│ │                            │   'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files',      │ │
│ │                            │   'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common   │ │
│ │                            Files',                                                           │ │
│ │                            │   'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files',      │ │
│ │                            │   'COMPUTERNAME': 'ESPTE21K2280',                               │ │
│ │                            │   'COMSPEC': 'C:\\WINDOWS\\system32\\cmd.exe',                  │ │
│ │                            │   'DEPLOYMENT.EXPIRATION.CHECK.ENABLED': 'false',               │ │
│ │                            │   'DRIVERDATA': 'C:\\Windows\\System32\\Drivers\\DriverData',   │ │
│ │                            │   'FPS_BROWSER_APP_PROFILE_STRING': 'Internet Explorer',        │ │
│ │                            │   ... +43                                                       │ │
│ │                            }                                                                 │ │
│ │                  errread = 8                                                                 │ │
│ │                 errwrite = Handle(896)                                                       │ │
│ │               executable = None                                                              │ │
│ │              handle_list = [896, 948, 932]                                                   │ │
│ │         have_handle_list = False                                                             │ │
│ │                  p2cread = Handle(932)                                                       │ │
│ │                 p2cwrite = -1                                                                │ │
│ │                 pass_fds = ()                                                                │ │
│ │               preexec_fn = None                                                              │ │
│ │                     self = <Popen: returncode: None args: ['bash.exe',                       │ │
│ │                            '.git/hooks/pre-commit']>                                         │ │
│ │                    shell = False                                                             │ │
│ │              startupinfo = <subprocess.STARTUPINFO object at 0x000001D07C4D0D70>             │ │
│ │               unused_gid = None                                                              │ │
│ │              unused_gids = None                                                              │ │
│ │     unused_process_group = -1                                                                │ │
│ │   unused_restore_signals = True                                                              │ │
│ │ unused_start_new_session = False                                                             │ │
│ │               unused_uid = None                                                              │ │
│ │             unused_umask = -1                                                                │ │
│ │          use_std_handles = True                                                              │ │
│ └──────────────────────────────────────────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────────────────────────────────────┘
FileNotFoundError: [WinError 2] The system cannot find the file specified

The above exception was the direct cause of the following exception:

┌─────────────────────────────── Traceback (most recent call last) ────────────────────────────────┐
│ spine-conductor\orchestra\__main__.py:65 in release                   │
│                                                                                                  │
│    62 │   │   raise BadArgumentUsage("`--only` and `--exclude` are mutually exclusive")          │
│    63 │   elif exclude:                                                                          │
│    64 │   │   only = [pkg for pkg in conf["repos"].keys() if pkg not in exclude]                 │
│ >  65 │   make_release(conf, bump_version, output, only)                                         │
│    66                                                                                            │
│    67                                                                                            │
│    68 @cli.command()                                                                             │
│                                                                                                  │
│ ┌─────────────────────────────────────────── locals ───────────────────────────────────────────┐ │
│ │ bump_version = <VersionPart.patch: 'patch'>                                                  │ │
│ │         conf = {                                                                             │ │
│ │                │   'packagename_regex': 'spine(toolbox|(db){0,1}[_-][a-z]+)',                │ │
│ │                │   'pkgname_re': re.compile('spine(toolbox|(db){0,1}[_-][a-z]+)'),           │ │
│ │                │   'repos': {'spinetoolbox': '.', 'spine_items': '../spine-items',           │ │
│ │                'spine_engine': '../spine-engine', 'spinedb_api': '../Spine-Database-API'},   │ │
│ │                │   'dependency_graph': {'spinetoolbox': ['spine_items', 'spine_engine',      │ │
│ │                'spinedb_api'], 'spine_items': ['spinetoolbox', 'spine_engine',               │ │
│ │                'spinedb_api'], 'spine_engine': ['spinedb_api'], 'spinedb_api': []},          │ │
│ │                │   'default_branch': 'master',                                               │ │
│ │                │   'branches': {'spinetoolbox': 'release', 'spine_items': 'release',         │ │
│ │                'spine_engine': 'release', 'spinedb_api': 'release'},                         │ │
│ │                │   'workflow': {'repo': 'spine-tools/spine-conductor', 'file':               │ │
│ │                'test-n-publish.yml'}                                                         │ │
│ │                }                                                                             │ │
│ │       config = WindowsPath('release.toml')                                                   │ │
│ │          ctx = <click.core.Context object at 0x000001D07C4D0680>                             │ │
│ │      exclude = []                                                                            │ │
│ │         only = []                                                                            │ │
│ │       output = WindowsPath('pkgtags.json')                                                   │ │
│ └──────────────────────────────────────────────────────────────────────────────────────────────┘ │
│                                                                                                  │
│spine-conductor\orchestra\release.py:347 in make_release              │
│                                                                                                  │
│   344 │   │   console.print(format_exc(err, "Aborting!"))                                        │
│   345 │   │   ErrorCodes.BRANCH_ERR.exit()                                                       │
│   346 │                                                                                          │
│ > 347 │   summary = create_tags(CONF, bump_version)                                              │
│   348 │   json_str = json.dumps(summary, indent=4)                                               │
│   349 │   output.write_text(json_str)                                                            │
│   350 │   msg = "\n[underline]Package Tags summary[/underline] "                                 │
│                                                                                                  │
│ ┌─────────────────────────────────────────── locals ───────────────────────────────────────────┐ │
│ │     branches = {'spinetoolbox': 'release', 'spine_items': 'release', 'spine_engine':         │ │
│ │                'release', 'spinedb_api': 'release'}                                          │ │
│ │ bump_version = <VersionPart.patch: 'patch'>                                                  │ │
│ │         CONF = {                                                                             │ │
│ │                │   'packagename_regex': 'spine(toolbox|(db){0,1}[_-][a-z]+)',                │ │
│ │                │   'pkgname_re': re.compile('spine(toolbox|(db){0,1}[_-][a-z]+)'),           │ │
│ │                │   'repos': {'spinetoolbox': '.', 'spine_items': '../spine-items',           │ │
│ │                'spine_engine': '../spine-engine', 'spinedb_api': '../Spine-Database-API'},   │ │
│ │                │   'dependency_graph': {'spinetoolbox': ['spine_items', 'spine_engine',      │ │
│ │                'spinedb_api'], 'spine_items': ['spinetoolbox', 'spine_engine',               │ │
│ │                'spinedb_api'], 'spine_engine': ['spinedb_api'], 'spinedb_api': []},          │ │
│ │                │   'default_branch': 'master',                                               │ │
│ │                │   'branches': {'spinetoolbox': 'release', 'spine_items': 'release',         │ │
│ │                'spine_engine': 'release', 'spinedb_api': 'release'},                         │ │
│ │                │   'workflow': {'repo': 'spine-tools/spine-conductor', 'file':               │ │
│ │                'test-n-publish.yml'}                                                         │ │
│ │                }                                                                             │ │
│ │         only = []                                                                            │ │
│ │       output = WindowsPath('pkgtags.json')                                                   │ │
│ └──────────────────────────────────────────────────────────────────────────────────────────────┘ │
│                                                                                                  │
│ spine-conductor\orchestra\release.py:312 in create_tags               │
│                                                                                                  │
│   309 │   │   │   │   console.print(format_exc(err, "Aborting commit!"))                         │
│   310 │   │   │   │   ErrorCodes.COMMIT_ERR.exit()                                               │
│   311 │   │   │   else:                                                                          │
│ > 312 │   │   │   │   repo.index.commit(msg)                                                     │
│   313 │   │                                                                                      │
│   314 │   │   console.print(                                                                     │
│   315 │   │   │   f"Creating tag: {next_version} @ [yellow]{repo.head.commit.hexsha[:7]}"        │
│                                                                                                  │
│ ┌─────────────────────────────────────────── locals ───────────────────────────────────────────┐ │
│ │ _next_versions = ['0.8.3', '0.22.3', '0.24.2', '0.31.3']                                     │ │
│ │         _repos = [                                                                           │ │
│ │                  │   <git.repo.base.Repo                                                     │ │
│ │                  'C:\\Users\\ajsanttij\\Sources\\Spine-Toolbox\\.git'>,                      │ │
│ │                  │   <git.repo.base.Repo                                                     │ │
│ │                  'C:\\Users\\ajsanttij\\Sources\\spine-items\\.git'>,                        │ │
│ │                  │   <git.repo.base.Repo                                                     │ │
│ │                  'C:\\Users\\ajsanttij\\Sources\\spine-engine\\.git'>,                       │ │
│ │                  │   <git.repo.base.Repo                                                     │ │
│ │                  'C:\\Users\\ajsanttij\\Sources\\Spine-Database-API\\.git'>                  │ │
│ │                  ]                                                                           │ │
│ │          _tags = ['v0.4.2-alpha.0', '0.9.0', '0.6.0-beta.0', 'v0.0.9']                       │ │
│ │          added = 2                                                                           │ │
│ │   bump_version = <VersionPart.patch: 'patch'>                                                │ │
│ │           CONF = {                                                                           │ │
│ │                  │   'packagename_regex': 'spine(toolbox|(db){0,1}[_-][a-z]+)',              │ │
│ │                  │   'pkgname_re': re.compile('spine(toolbox|(db){0,1}[_-][a-z]+)'),         │ │
│ │                  │   'repos': {'spinetoolbox': '.', 'spine_items': '../spine-items',         │ │
│ │                  'spine_engine': '../spine-engine', 'spinedb_api': '../Spine-Database-API'}, │ │
│ │                  │   'dependency_graph': {'spinetoolbox': ['spine_items', 'spine_engine',    │ │
│ │                  'spinedb_api'], 'spine_items': ['spinetoolbox', 'spine_engine',             │ │
│ │                  'spinedb_api'], 'spine_engine': ['spinedb_api'], 'spinedb_api': []},        │ │
│ │                  │   'default_branch': 'master',                                             │ │
│ │                  │   'branches': {'spinetoolbox': 'release', 'spine_items': 'release',       │ │
│ │                  'spine_engine': 'release', 'spinedb_api': 'release'},                       │ │
│ │                  │   'workflow': {'repo': 'spine-tools/spine-conductor', 'file':             │ │
│ │                  'test-n-publish.yml'}                                                       │ │
│ │                  }                                                                           │ │
│ │       modified = []                                                                          │ │
│ │            msg = 'Release 0.8.3\n\n\n'                                                       │ │
│ │   next_version = '0.8.3'                                                                     │ │
│ │  next_versions = {                                                                           │ │
│ │                  │   'spinetoolbox': '0.8.3',                                                │ │
│ │                  │   'spine_items': '0.22.3',                                                │ │
│ │                  │   'spine_engine': '0.24.2',                                               │ │
│ │                  │   'spinedb_api': '0.31.3'                                                 │ │
│ │                  }                                                                           │ │
│ │            pkg = 'spinetoolbox'                                                              │ │
│ │           pkgs = {                                                                           │ │
│ │                  │   'spinetoolbox': (                                                       │ │
│ │                  │   │   <git.repo.base.Repo                                                 │ │
│ │                  'Spine-Toolbox\\.git'>,                      │ │
│ │                  │   │   'v0.4.2-alpha.0',                                                   │ │
│ │                  │   │   '0.8.3'                                                             │ │
│ │                  │   ),                                                                      │ │
│ │                  │   'spine_items': (                                                        │ │
│ │                  │   │   <git.repo.base.Repo                                                 │ │
│ │                  'spine-items\\.git'>,                        │ │
│ │                  │   │   '0.9.0',                                                            │ │
│ │                  │   │   '0.22.3'                                                            │ │
│ │                  │   ),                                                                      │ │
│ │                  │   'spine_engine': (                                                       │ │
│ │                  │   │   <git.repo.base.Repo                                                 │ │
│ │                  'spine-engine\\.git'>,                       │ │
│ │                  │   │   '0.6.0-beta.0',                                                     │ │
│ │                  │   │   '0.24.2'                                                            │ │
│ │                  │   ),                                                                      │ │
│ │                  │   'spinedb_api': (                                                        │ │
│ │                  │   │   <git.repo.base.Repo                                                 │ │
│ │                  'Spine-Database-API\\.git'>,                 │ │
│ │                  │   │   'v0.0.9',                                                           │ │
│ │                  │   │   '0.31.3'                                                            │ │
│ │                  │   )                                                                       │ │
│ │                  }                                                                           │ │
│ │           repo = <git.repo.base.Repo 'Spine-Toolbox\\.git'>   │ │
│ │     repo_paths = {'spinetoolbox': '.', 'spine_items': '../spine-items', 'spine_engine':      │ │
│ │                  '../spine-engine', 'spinedb_api': '../Spine-Database-API'}                  │ │
│ │        summary = {}                                                                          │ │
│ │            tag = 'v0.4.2-alpha.0'                                                            │ │
│ └──────────────────────────────────────────────────────────────────────────────────────────────┘ │
│                                                                                                  │
│ site-packages\git\index\base.py:1101  │
│ in commit                                                                                        │
│                                                                                                  │
│   1098 │   │   :return: :class:`Commit` object representing the new commit                       │
│   1099 │   │   """                                                                               │
│   1100 │   │   if not skip_hooks:                                                                │
│ > 1101 │   │   │   run_commit_hook("pre-commit", self)                                           │
│   1102 │   │   │                                                                                 │
│   1103 │   │   │   self._write_commit_editmsg(message)                                           │
│   1104 │   │   │   run_commit_hook("commit-msg", self, self._commit_editmsg_filepath())          │
│                                                                                                  │
│ ┌───────────────────────────────── locals ─────────────────────────────────┐                     │
│ │         author = None                                                    │                     │
│ │    author_date = None                                                    │                     │
│ │    commit_date = None                                                    │                     │
│ │      committer = None                                                    │                     │
│ │           head = True                                                    │                     │
│ │        message = 'Release 0.8.3\n\n\n'                                   │                     │
│ │ parent_commits = None                                                    │                     │
│ │           self = <git.index.base.IndexFile object at 0x000001D07C1ED170> │                     │
│ │     skip_hooks = False                                                   │                     │
│ └──────────────────────────────────────────────────────────────────────────┘                     │
│                                                                                                  │
│ site-packages\git\index\fun.py:109 in │
│ run_commit_hook                                                                                  │
│                                                                                                  │
│   106 │   │   │   cwd=index.repo.working_dir,                                                    │
│   107 │   │   )                                                                                  │
│   108 │   except Exception as ex:                                                                │
│ > 109 │   │   raise HookExecutionError(hp, ex) from ex                                           │
│   110 │   else:                                                                                  │
│   111 │   │   stdout_list: List[str] = []                                                        │
│   112 │   │   stderr_list: List[str] = []                                                        │
│                                                                                                  │
│ ┌─────────────────────────────────────── locals ────────────────────────────────────────┐        │
│ │        args = ()                                                                      │        │
│ │         cmd = ['bash.exe', '.git/hooks/pre-commit']                                   │        │
│ │         env = {                                                                       │        │
│ │               │   'ALLUSERSPROFILE': 'C:\\ProgramData',                               │        │
│ │               │   'APPDATA': 'AppData\\Roaming',                │        │
│ │               │   'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files',            │        │
│ │               │   'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', │        │
│ │               │   'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files',            │        │
│ │               │   'COMPUTERNAME': 'ESPTE21K2280',                                     │        │
│ │               │   'COMSPEC': 'C:\\WINDOWS\\system32\\cmd.exe',                        │        │
│ │               │   'DEPLOYMENT.EXPIRATION.CHECK.ENABLED': 'false',                     │        │
│ │               │   'DRIVERDATA': 'C:\\Windows\\System32\\Drivers\\DriverData',         │        │
│ │               │   'FPS_BROWSER_APP_PROFILE_STRING': 'Internet Explorer',              │        │
│ │               │   ... +43                                                             │        │
│ │               }                                                                       │        │
│ │          hp = 'Spine-Toolbox\\.git\\hooks\\pre-commit' │        │
│ │       index = <git.index.base.IndexFile object at 0x000001D07C1ED170>                 │        │
│ │        name = 'pre-commit'                                                            │        │
│ │ relative_hp = '.git/hooks/pre-commit'                                                 │        │
│ └───────────────────────────────────────────────────────────────────────────────────────┘        │
└──────────────────────────────────────────────────────────────────────────────────────────────────┘
HookExecutionError: Hook('Spine-Toolbox\.git\hooks\pre-commit') failed due to:
FileNotFoundError('[WinError 2] The system cannot find the file specified')
  cmdline: Spine-Toolbox\.git\hooks\pre-commit
soininen commented 2 months ago

I tried to install Toolbox dev-requirements.txt to Conductor's Python environment, but it did not help.

suvayu commented 2 months ago

This is bit of a stickler in Python. These kind of tools are independent of the code base, but since they are implemented in python, they end up being installed in the project's venv. So running the tool starts depending on the dev environment, when there's no need. I think the clean way to solve this is to install these kinds of tools globally, e.g. with pipx (just like the conductor itself).

That said, maybe it's possible to have another config like: tools.conductor.dev-venv (or a CLI flag). But I don't know if this will be straightforward or messy to implement, because we've to customise PATH for the execution environment of git which is a couple of layers deep.

soininen commented 2 months ago

It would probably be OK to skip the pre-commit hooks with git commit --no-verify (or whatever) since the release commits usually include changes just in pyproject.toml and CHANGELOG.md so there is no need to run black or isort.

suvayu commented 2 months ago

Good point, conductor can even check if any Python files have been modified. How about this:

Check which files were modified.

soininen commented 2 months ago

Sounds good!