Repository: pre-commit/pre-commit

Issue:
Unstaged check should not complain when running --all-files
```
$ pre-commit run --all-files
[ERROR] Your .pre-commit-config.yaml is unstaged.
`git add .pre-commit-config.yaml` to fix this.
Run pre-commit with --allow-unstaged-config to silence this.
```



Discussion:

Resolving patch:
diff --git a/pre_commit/commands/run.py b/pre_commit/commands/run.py
--- a/pre_commit/commands/run.py
+++ b/pre_commit/commands/run.py
@@ -139,6 +139,7 @@ def _has_unstaged_config(runner):
 
 
 def run(runner, args, write=sys_stdout_write_wrapper, environ=os.environ):
+    no_stash = args.no_stash or args.all_files or bool(args.files)
     # Set up our logging handler
     logger.addHandler(LoggingHandler(args.color, write=write))
     logger.setLevel(logging.INFO)
@@ -150,7 +151,7 @@ def run(runner, args, write=sys_stdout_write_wrapper, environ=os.environ):
     if bool(args.source) != bool(args.origin):
         logger.error('Specify both --origin and --source.')
         return 1
-    if _has_unstaged_config(runner) and not args.no_stash:
+    if _has_unstaged_config(runner) and not no_stash:
         if args.allow_unstaged_config:
             logger.warn(
                 'You have an unstaged config file and have specified the '
@@ -166,8 +167,7 @@ def run(runner, args, write=sys_stdout_write_wrapper, environ=os.environ):
             )
             return 1
 
-    # Don't stash if specified or files are specified
-    if args.no_stash or args.all_files or args.files:
+    if no_stash:
         ctx = noop_context()
     else:
         ctx = staged_files_only(runner.cmd_runner)


Test patch:
diff --git a/tests/commands/run_test.py b/tests/commands/run_test.py
--- a/tests/commands/run_test.py
+++ b/tests/commands/run_test.py
@@ -433,14 +433,17 @@ def test_allow_unstaged_config_option(
     assert ret == 0
 
 
-def test_no_allow_unstaged_config_option(
-    repo_with_passing_hook, mock_out_store_directory,
-):
-    with cwd(repo_with_passing_hook):
+def modify_config(path):
+    with cwd(path):
         with io.open('.pre-commit-config.yaml', 'a+') as config_file:
             # writing a newline should be relatively harmless to get a change
             config_file.write('\n')
 
+
+def test_no_allow_unstaged_config_option(
+    repo_with_passing_hook, mock_out_store_directory,
+):
+    modify_config(repo_with_passing_hook)
     args = _get_opts(allow_unstaged_config=False)
     ret, printed = _do_run(repo_with_passing_hook, args)
     assert 'Your .pre-commit-config.yaml is unstaged.' in printed
@@ -450,11 +453,25 @@ def test_no_allow_unstaged_config_option(
 def test_no_stash_suppresses_allow_unstaged_config_option(
         repo_with_passing_hook, mock_out_store_directory,
 ):
-    with cwd(repo_with_passing_hook):
-        with io.open('.pre-commit-config.yaml', 'a+') as config_file:
-            # writing a newline should be relatively harmless to get a change
-            config_file.write('\n')
-
+    modify_config(repo_with_passing_hook)
     args = _get_opts(allow_unstaged_config=False, no_stash=True)
     ret, printed = _do_run(repo_with_passing_hook, args)
     assert 'Your .pre-commit-config.yaml is unstaged.' not in printed
+
+
+def test_all_files_suppresses_allow_unstaged_config_option(
+        repo_with_passing_hook, mock_out_store_directory,
+):
+    modify_config(repo_with_passing_hook)
+    args = _get_opts(all_files=True)
+    ret, printed = _do_run(repo_with_passing_hook, args)
+    assert 'Your .pre-commit-config.yaml is unstaged.' not in printed
+
+
+def test_files_suppresses_allow_unstaged_config_option(
+        repo_with_passing_hook, mock_out_store_directory,
+):
+    modify_config(repo_with_passing_hook)
+    args = _get_opts(files=['.pre-commit-config.yaml'])
+    ret, printed = _do_run(repo_with_passing_hook, args)
+    assert 'Your .pre-commit-config.yaml is unstaged.' not in printed