Repository: pre-commit/pre-commit-hooks

Issue:
no-commit-to-branch on CI
As a safety net, we've started running pre-commit on CI, e.g.
```
git diff --name-only "$GIT_COMMIT"^..."$GIT_COMMIT" | xargs pre-commit run --files
```

one of our projects uses `no-commit-to-branch` and we just noticed this behavior on CI:
```
Don't commit to branch...................................................Failed
hookid: no-commit-to-branch

Traceback (most recent call last):
  File "/var/lib/jenkins/.cache/pre-commit/repoVUdrA6/py_env-python2.7/bin/no-commit-to-branch", line 11, in <module>
    load_entry_point('pre-commit-hooks==1.1.0', 'console_scripts', 'no-commit-to-branch')()
  File "/var/lib/jenkins/.cache/pre-commit/repoVUdrA6/py_env-python2.7/local/lib/python2.7/site-packages/pre_commit_hooks/no_commit_to_branch.py", line 22, in main
    return int(is_on_branch(args.branch))
  File "/var/lib/jenkins/.cache/pre-commit/repoVUdrA6/py_env-python2.7/local/lib/python2.7/site-packages/pre_commit_hooks/no_commit_to_branch.py", line 10, in is_on_branch
    branch = cmd_output('git', 'symbolic-ref', 'HEAD')
  File "/var/lib/jenkins/.cache/pre-commit/repoVUdrA6/py_env-python2.7/local/lib/python2.7/site-packages/pre_commit_hooks/util.py", line 28, in cmd_output
    raise CalledProcessError(cmd, retcode, proc.returncode, stdout, stderr)
pre_commit_hooks.util.CalledProcessError: (('git', 'symbolic-ref', 'HEAD'), 0, 128, u'', u'fatal: ref HEAD is not a symbolic ref\n')
```

most likely this is not really an issue with `pre-commit` but with the way our Jenkins jobs are set up (?). I worked around this by using `SKIP=no-commit-to-branch pre-commit run` but just thought I would let you know.

Discussion:

Patch:
diff --git a/pre_commit_hooks/no_commit_to_branch.py b/pre_commit_hooks/no_commit_to_branch.py
index 22ee95e..0c75217 100644
--- a/pre_commit_hooks/no_commit_to_branch.py
+++ b/pre_commit_hooks/no_commit_to_branch.py
@@ -1,21 +1,25 @@
 from __future__ import print_function
 
 import argparse
-import sys
 
+from pre_commit_hooks.util import CalledProcessError
 from pre_commit_hooks.util import cmd_output
 
 
 def is_on_branch(protected):
-    branch = cmd_output('git', 'symbolic-ref', 'HEAD')
+    try:
+        branch = cmd_output('git', 'symbolic-ref', 'HEAD')
+    except CalledProcessError:
+        return False
     chunks = branch.strip().split('/')
     return '/'.join(chunks[2:]) == protected
 
 
-def main(argv=[]):
+def main(argv=None):
     parser = argparse.ArgumentParser()
     parser.add_argument(
-        '-b', '--branch', default='master', help='branch to disallow commits to',
+        '-b', '--branch', default='master',
+        help='branch to disallow commits to',
     )
     args = parser.parse_args(argv)
 
@@ -23,4 +27,4 @@ def main(argv=[]):
 
 
 if __name__ == '__main__':
-    sys.exit(main(sys.argv))
+    exit(main())


Test patch:
diff --git a/tests/check_no_commit_to_branch_test.py b/tests/check_no_commit_to_branch_test.py
index 99af938..7e39256 100644
--- a/tests/check_no_commit_to_branch_test.py
+++ b/tests/check_no_commit_to_branch_test.py
@@ -29,19 +29,22 @@ def test_master_branch(temp_git_dir):
         assert is_on_branch('master') is True
 
 
-def test_main_b_call(temp_git_dir):
-    with temp_git_dir.as_cwd():
-        cmd_output('git', 'checkout', '-b', 'other')
-        assert main(['-b', 'other']) == 1
-
-
 def test_main_branch_call(temp_git_dir):
     with temp_git_dir.as_cwd():
         cmd_output('git', 'checkout', '-b', 'other')
-        assert main(['--branch', 'other']) == 1
+        assert main(('--branch', 'other')) == 1
 
 
 def test_main_default_call(temp_git_dir):
     with temp_git_dir.as_cwd():
         cmd_output('git', 'checkout', '-b', 'anotherbranch')
-        assert main() == 0
+        assert main(()) == 0
+
+
+def test_not_on_a_branch(temp_git_dir):
+    with temp_git_dir.as_cwd():
+        cmd_output('git', 'commit', '--no-gpg-sign', '--allow-empty', '-m1')
+        head = cmd_output('git', 'rev-parse', 'HEAD').strip()
+        cmd_output('git', 'checkout', head)
+        # we're not on a branch!
+        assert main(()) == 0