Repository: pre-commit/pre-commit

Issue:
Deprecate `pcre` language
Now that pygrep (#630) is a much more portable alternative, pcre is unnecessary and should be deprecated.

A deprecation warning should be issued when loading a configuration containing `language: pcre` and should point the consumer in the right direction to correcting it (either by suggesting a pull request, or by indicating they should modify their `local` configuration).

The `pcre` language will likely be removed in `pre-commit==2.0.0`

Discussion:

Patch:
diff --git a/pre_commit/commands/run.py b/pre_commit/commands/run.py
index c70eff0..a16d8fe 100644
--- a/pre_commit/commands/run.py
+++ b/pre_commit/commands/run.py
@@ -67,6 +67,15 @@ def _run_single_hook(filenames, hook, repo, args, skips, cols):
     filenames = _filter_by_include_exclude(filenames, include, exclude)
     types, exclude_types = hook['types'], hook['exclude_types']
     filenames = _filter_by_types(filenames, types, exclude_types)
+
+    if hook['language'] == 'pcre':
+        logger.warning(
+            '`{}` (from {}) uses the deprecated pcre language.\n'
+            'The pcre language is scheduled for removal in pre-commit 2.x.\n'
+            'The pygrep language is a more portable (and usually drop-in) '
+            'replacement.'.format(hook['id'], repo.repo_config['repo']),
+        )
+
     if hook['id'] in skips:
         output.write(get_hook_message(
             _hook_msg_start(hook, args.verbose),


Test patch:
diff --git a/tests/commands/run_test.py b/tests/commands/run_test.py
index 97c82c2..cbf4e98 100644
--- a/tests/commands/run_test.py
+++ b/tests/commands/run_test.py
@@ -529,7 +529,7 @@ def test_push_hook(cap_out, repo_with_passing_hook, mock_out_store_directory):
                     ('id', 'do_not_commit'),
                     ('name', 'hook 2'),
                     ('entry', 'DO NOT COMMIT'),
-                    ('language', 'pcre'),
+                    ('language', 'pygrep'),
                     ('types', ['text']),
                     ('stages', ['push']),
                 )),
@@ -592,7 +592,7 @@ def test_local_hook_passes(
                     ('id', 'do_not_commit'),
                     ('name', 'Block if "DO NOT COMMIT" is found'),
                     ('entry', 'DO NOT COMMIT'),
-                    ('language', 'pcre'),
+                    ('language', 'pygrep'),
                     ('files', '^(.*)$'),
                 )),
             ),
@@ -645,6 +645,35 @@ def test_local_hook_fails(
     )
 
 
+def test_pcre_deprecation_warning(
+        cap_out, repo_with_passing_hook, mock_out_store_directory,
+):
+    config = OrderedDict((
+        ('repo', 'local'),
+        (
+            'hooks', [OrderedDict((
+                ('id', 'pcre-hook'),
+                ('name', 'pcre-hook'),
+                ('language', 'pcre'),
+                ('entry', '.'),
+            ))],
+        ),
+    ))
+    add_config_to_repo(repo_with_passing_hook, config)
+
+    _test_run(
+        cap_out,
+        repo_with_passing_hook,
+        opts={},
+        expected_outputs=[
+            b'[WARNING] `pcre-hook` (from local) uses the deprecated '
+            b'pcre language.',
+        ],
+        expected_ret=0,
+        stage=False,
+    )
+
+
 def test_meta_hook_passes(
         cap_out, repo_with_passing_hook, mock_out_store_directory,
 ):