Skip to content

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

Open
@athewsey

Description

@athewsey

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 or here), because 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 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?

Activity

mKoder

mKoder commented on Jan 20, 2020

@mKoder

Same problem here, any solutions?

dipeshwalia

dipeshwalia commented on Feb 12, 2020

@dipeshwalia

+1. had same issue

may be a config setting to provide path to git/parent will fix

katsar0v

katsar0v commented on Apr 2, 2020

@katsar0v

Still experiencing this issue. Is there an update?

stvreumi

stvreumi commented on Jul 15, 2020

@stvreumi

Hello, I have encountered this issue, too. And it seems that there is a PR to fix this issue. Why that PR is not merged yet? Is there anything we can do fix this issue? Thanks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @mKoder@dipeshwalia@katsar0v@stvreumi@athewsey

        Issue actions

          Fails in hook mode when package is a subdirectory of git repo · Issue #683 · commitizen/cz-cli