Merge pull request #778 from pre-commit/pre_push_force_push

Fix force-push without fetch
This commit is contained in:
Anthony Sottile 2018-07-02 10:50:14 -07:00 committed by GitHub
commit 09114f1c16
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 28 additions and 4 deletions

View file

@ -105,6 +105,10 @@ def _exe():
) )
def _rev_exists(rev):
return not subprocess.call(('git', 'rev-list', '--quiet', rev))
def _pre_push(stdin): def _pre_push(stdin):
remote = sys.argv[1] remote = sys.argv[1]
@ -113,7 +117,7 @@ def _pre_push(stdin):
_, local_sha, _, remote_sha = line.split() _, local_sha, _, remote_sha = line.split()
if local_sha == Z40: if local_sha == Z40:
continue continue
elif remote_sha != Z40: elif remote_sha != Z40 and _rev_exists(remote_sha):
opts = ('--origin', local_sha, '--source', remote_sha) opts = ('--origin', local_sha, '--source', remote_sha)
else: else:
# First ancestor not found in remote # First ancestor not found in remote

View file

@ -495,13 +495,13 @@ def test_installed_from_venv(tempdir_factory, store):
assert NORMAL_PRE_COMMIT_RUN.match(output) assert NORMAL_PRE_COMMIT_RUN.match(output)
def _get_push_output(tempdir_factory): def _get_push_output(tempdir_factory, opts=()):
return cmd_output_mocked_pre_commit_home( return cmd_output_mocked_pre_commit_home(
'git', 'push', 'origin', 'HEAD:new_branch', 'git', 'push', 'origin', 'HEAD:new_branch', *opts,
# git push puts pre-commit to stderr # git push puts pre-commit to stderr
stderr=subprocess.STDOUT, stderr=subprocess.STDOUT,
tempdir_factory=tempdir_factory, tempdir_factory=tempdir_factory,
retcode=None, retcode=None
)[:2] )[:2]
@ -535,6 +535,26 @@ def test_pre_push_integration_accepted(tempdir_factory, store):
assert 'Passed' in output assert 'Passed' in output
def test_pre_push_force_push_without_fetch(tempdir_factory, store):
upstream = make_consuming_repo(tempdir_factory, 'script_hooks_repo')
path1 = tempdir_factory.get()
path2 = tempdir_factory.get()
cmd_output('git', 'clone', upstream, path1)
cmd_output('git', 'clone', upstream, path2)
with cwd(path1):
assert _get_commit_output(tempdir_factory)[0] == 0
assert _get_push_output(tempdir_factory)[0] == 0
with cwd(path2):
install(Runner(path2, C.CONFIG_FILE), store, hook_type='pre-push')
assert _get_commit_output(tempdir_factory, commit_msg='force!')[0] == 0
retc, output = _get_push_output(tempdir_factory, opts=('--force',))
assert retc == 0
assert 'Bash hook' in output
assert 'Passed' in output
def test_pre_push_new_upstream(tempdir_factory, store): def test_pre_push_new_upstream(tempdir_factory, store):
upstream = make_consuming_repo(tempdir_factory, 'script_hooks_repo') upstream = make_consuming_repo(tempdir_factory, 'script_hooks_repo')
upstream2 = git_dir(tempdir_factory) upstream2 = git_dir(tempdir_factory)