commitizen / commitizen/cz-cli

Fails in hook mode when package is a subdirectory of git repo

Open
#683 4 comments 12 reactions 0 assignees View on GitHub
Dominant language
JavaScript
Stars
17.5k
Forks
566
Avg merge
8h 16m
Merged PRs (30d)
1

Description

### Scenario:

Everything Node.JS lives within a subfolder e.g myGitRepo/source/package.json:
```
"devDependencies": {
"commitizen": "^4.0.3",
"cz-conventional-changelog": "^3.0.2",
"husky": "^3.0.9"
},
"config": {
"commitizen": {
"path": "cz-conventional-changelog"
}
},
"husky": {
"hooks": {
"prepare-commit-msg": "exec < /dev/tty && npx git cz --hook || true"
}
}
```

Overriding `config.commitizen.path` to the plain npm module name `cz-conventional-changelog` (as per #469) is sufficient to get `npx git cz` working, BUT...

### Problem:

Trying to use the husky hook (which is from the README) will throw:
```
myGitRepo/source $ git commit
# (Prompting works fine, but then...)
Error: ENOENT: no such file or directory, open '/myCoolParentFolder/myGitRepo/source/.git/COMMIT_EDITMSG
```

Note that it's always taking the package.json folder, not the current working directory e.g:
```
myGitRepo/source/packages $ git commit
# (Also prompts fine, but tries to write to same wrong .git folder...)
Error: ENOENT: no such file or directory, open '/myCoolParentFolder/myGitRepo/source/.git/COMMIT_EDITMSG
```

It doesn't seem to be possible to override via environment variables (e.g. by messing with `GIT_DIR` in the husky hook statement like they do [here](https://github.com/typicode/husky/issues/364) or [here](https://github.com/typicode/husky/issues/584)), because [cli/strategies/git-cz.js](https://github.com/commitizen/cz-cli/blob/master/src/cli/strategies/git-cz.js) explicitly calls `commitizen.commit` with `repoPath = process.cwd()`:

```
commit(sh, inquirer, process.cwd(), prompter, {
args: parsedGitCzArgs,
disableAppendPaths: true,
emitData: true,
quiet: false,
retryLastCommit,
hookMode
}, function (error) {
if (error) {
throw error;
}
});
```

...and [git/commit.js](https://github.com/commitizen/cz-cli/blob/master/src/git/commit.js) uses that repoPath to store the captured message:
```
const commitFilePath = path.join(repoPath, '/.git/COMMIT_EDITMSG');
```

This issue only affects running in hook mode, because in standard `git cz` we just pass the message through as an argument to a spawned git process, which manages to figure out that it's in a subfolder of a repository.

### Fix Investigation:

I had a look around to try and figure what a fix might look like, but I don't really understand why `cliPath` and `repoPath` are tracked as separate variables when the CLI strategy seems to just force `repoPath` to the package root?

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.