0

I'm trying to create an R function that automatically creates git commit hooks in the file .pre-commit-config.yaml if it isn't already present in the current directory.

The function is as follows:

create_commit_hook_yaml <- function() {
if (!file.exists(".pre-commit-config.yaml")) {
    system('printf "repos:\n- repo: local\n  hooks:\n  - id: jupyter-nb-clear-output\n    name: jupyter-nb-clear-output\n    files: \\.ipynb$\n    stages: commit\n    language: system\n    entry: jupyter nbconvert --ClearOutputPreprocessor.enabled=True --inplace\n" > .pre-commit-config.yaml')
}}

It creates the file and the file looks as expected:

repos:
- repo: local
  hooks:
  - id: jupyter-nb-clear-output
    name: jupyter-nb-clear-output
    files: \.ipynb$
    stages: commit
    language: system
    entry: jupyter nbconvert --ClearOutputPreprocessor.enabled=True --inplace

However, when trying to push the file to github I get the following error:

An error has occurred: InvalidConfigError: ==> File .pre-commit-config.yaml ==> At Config() ==> At key: repos ==> At Repository(repo='local') ==> At key: hooks ==> At Hook(id='jupyter-nb-clear-output') ==> At key: stages =====> Expected array but got 'str' Check the log at /home/jupyter/.cache/pre-commit/pre-commit.log

The log contains the following:

### version information

```
pre-commit version: 2.20.0
git --version: git version 2.20.1
sys.version:
    3.7.12 | packaged by conda-forge | (default, Oct 26 2021, 06:08:53) 
    [GCC 9.4.0]
sys.executable: /opt/conda/bin/python3.7
os.name: posix
sys.platform: linux
```

### error information

```
An error has occurred: InvalidConfigError: 
==> File .pre-commit-config.yaml
==> At Config()
==> At key: repos
==> At Repository(repo='local')
==> At key: hooks
==> At Hook(id='jupyter-nb-clear-output')
==> At key: stages
=====> Expected array but got 'str'
```

```
Traceback (most recent call last):
  File "/opt/conda/lib/python3.7/site-packages/pre_commit/error_handler.py", line 73, in error_handler
    yield
  File "/opt/conda/lib/python3.7/site-packages/pre_commit/main.py", line 365, in main
    args=args.rest[1:],
  File "/opt/conda/lib/python3.7/site-packages/pre_commit/commands/hook_impl.py", line 254, in hook_impl
    return retv | run(config, store, ns)
  File "/opt/conda/lib/python3.7/site-packages/pre_commit/commands/run.py", line 408, in run
    config = load_config(config_file)
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 411, in load_from_filename
    return apply_defaults(data, schema)
  File "/opt/conda/lib/python3.7/contextlib.py", line 130, in __exit__
    self.gen.throw(type, value, traceback)
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 43, in reraise_as
    raise tp(e).with_traceback(tb) from None
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 40, in reraise_as
    yield
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 411, in load_from_filename
    return apply_defaults(data, schema)
  File "/opt/conda/lib/python3.7/contextlib.py", line 130, in __exit__
    self.gen.throw(type, value, traceback)
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 34, in validate_context
    raise ValidationError(e, ctx=msg).with_traceback(tb) from None
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 31, in validate_context
    yield
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 410, in load_from_filename
    validate(data, schema)
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 376, in validate
    schema.check(v)
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 244, in check
    item.check(v)
  File "/opt/conda/lib/python3.7/contextlib.py", line 130, in __exit__
    self.gen.throw(type, value, traceback)
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 34, in validate_context
    raise ValidationError(e, ctx=msg).with_traceback(tb) from None
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 31, in validate_context
    yield
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 244, in check
    item.check(v)
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 73, in _check_required
    _check_optional(self, dct)
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 54, in _check_optional
    self.check_fn(dct[self.key])
  File "/opt/conda/lib/python3.7/contextlib.py", line 130, in __exit__
    self.gen.throw(type, value, traceback)
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 34, in validate_context
    raise ValidationError(e, ctx=msg).with_traceback(tb) from None
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 31, in validate_context
    yield
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 54, in _check_optional
    self.check_fn(dct[self.key])
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 79, in check_fn
    validate(val, self.schema)
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 376, in validate
    schema.check(v)
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 272, in check
    validate(val, self.of)
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 376, in validate
    schema.check(v)
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 244, in check
    item.check(v)
  File "/opt/conda/lib/python3.7/contextlib.py", line 130, in __exit__
    self.gen.throw(type, value, traceback)
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 34, in validate_context
    raise ValidationError(e, ctx=msg).with_traceback(tb) from None
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 31, in validate_context
    yield
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 244, in check
    item.check(v)
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 106, in _check_conditional
    inner(self, dct)
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 73, in _check_required
    _check_optional(self, dct)
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 54, in _check_optional
    self.check_fn(dct[self.key])
  File "/opt/conda/lib/python3.7/contextlib.py", line 130, in __exit__
    self.gen.throw(type, value, traceback)
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 34, in validate_context
    raise ValidationError(e, ctx=msg).with_traceback(tb) from None
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 31, in validate_context
    yield
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 54, in _check_optional
    self.check_fn(dct[self.key])
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 79, in check_fn
    validate(val, self.schema)
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 376, in validate
    schema.check(v)
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 272, in check
    validate(val, self.of)
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 376, in validate
    schema.check(v)
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 244, in check
    item.check(v)
  File "/opt/conda/lib/python3.7/contextlib.py", line 130, in __exit__
    self.gen.throw(type, value, traceback)
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 34, in validate_context
    raise ValidationError(e, ctx=msg).with_traceback(tb) from None
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 31, in validate_context
    yield
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 244, in check
    item.check(v)
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 54, in _check_optional
    self.check_fn(dct[self.key])
  File "/opt/conda/lib/python3.7/contextlib.py", line 130, in __exit__
    self.gen.throw(type, value, traceback)
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 34, in validate_context
    raise ValidationError(e, ctx=msg).with_traceback(tb) from None
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 31, in validate_context
    yield
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 54, in _check_optional
    self.check_fn(dct[self.key])
  File "/opt/conda/lib/python3.7/site-packages/cfgv.py", line 359, in check_array_fn
    f'Expected array but got {type(v).__name__!r}',
pre_commit.clientlib.InvalidConfigError: 
==> File .pre-commit-config.yaml
==> At Config()
==> At key: repos
==> At Repository(repo='local')
==> At key: hooks
==> At Hook(id='jupyter-nb-clear-output')
==> At key: stages
=====> Expected array but got 'str'
```

To my knowledge, the repo and hook id's should be arrays as they have a '-' in front, but I've tried removing the '-'s and have also tried adding more in in various places but none of it works. I'm new to commit hooks and yaml files so don't understand what isn't working. Is anyone able to help me do this right?

EDIT:

To be specific about what I've tried, I added "- " in front of stages, which is what the error suggests but that results in a different error message which I don't understand:

An error has occurred: InvalidConfigError: ==> File .pre-commit-config.yaml =====> while parsing a block mapping in "<unicode string>", line 4, column 5 did not find expected key in "<unicode string>", line 7, column 5 Check the log at /home/jupyter/.cache/pre-commit/pre-commit.log
tsv
  • 31
  • 6
  • 2
    `At key: stages, Expected array but got 'str'` seems pretty obvious to me? – anthony sottile Nov 30 '22 at 16:35
  • 1
    By the way, you can't push *files* at all, you can only push *commits*. It's not a good idea to make a *new* commit in a pre-commit hook (you'd have to do that to push it). It's also not a good idea in general to attempt to modify the about-to-be-committed files that are stored in Git's index, as there may actually be more than one active index. – torek Nov 30 '22 at 16:37
  • @anthonysottile I had tried that, I have added the error message that that results in to my post. If that's also obvious to you, please tell me what you would do to fix it – tsv Dec 01 '22 at 09:42

0 Answers0