mirror of
https://github.com/pre-commit/pre-commit.git
synced 2026-02-17 08:14:42 +04:00
Fix force-push without fetch
This commit is contained in:
parent
13c85f374b
commit
c294be513d
2 changed files with 28 additions and 4 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue