Push remote env var details

This commit is contained in:
David Martinez Barreiro
2020-01-16 18:01:26 +01:00
committed by Anthony Sottile
parent b66d28964b
commit 57cc814b8b
5 changed files with 50 additions and 3 deletions

View File

@@ -312,6 +312,10 @@ def run(
environ['PRE_COMMIT_ORIGIN'] = args.origin
environ['PRE_COMMIT_SOURCE'] = args.source
if args.push_remote_name and args.push_remote_url:
environ['PRE_COMMIT_REMOTE_NAME'] = args.push_remote_name
environ['PRE_COMMIT_REMOTE_URL'] = args.push_remote_url
with contextlib.ExitStack() as exit_stack:
if stash:
exit_stack.enter_context(staged_files_only(store.directory))

View File

@@ -101,6 +101,12 @@ def _add_run_options(parser: argparse.ArgumentParser) -> None:
'--commit-msg-filename',
help='Filename to check when running during `commit-msg`',
)
parser.add_argument(
'--push-remote-name', help='Remote name used by `git push`.',
)
parser.add_argument(
'--push-remote-url', help='Remote url used by `git push`.',
)
parser.add_argument(
'--hook-stage', choices=C.STAGES, default='commit',
help='The stage during which the hook is fired. One of %(choices)s',

View File

@@ -120,7 +120,8 @@ def _rev_exists(rev: str) -> bool:
def _pre_push(stdin: bytes) -> Tuple[str, ...]:
remote = sys.argv[1]
remote_name = sys.argv[1]
remote_url = sys.argv[2]
opts: Tuple[str, ...] = ()
for line in stdin.decode().splitlines():
@@ -133,7 +134,7 @@ def _pre_push(stdin: bytes) -> Tuple[str, ...]:
# ancestors not found in remote
ancestors = subprocess.check_output((
'git', 'rev-list', local_sha, '--topo-order', '--reverse',
'--not', f'--remotes={remote}',
'--not', f'--remotes={remote_name}',
)).decode().strip()
if not ancestors:
continue
@@ -150,7 +151,10 @@ def _pre_push(stdin: bytes) -> Tuple[str, ...]:
opts = ('--origin', local_sha, '--source', source)
if opts:
return opts
remote_opts = (
'--push-remote-name', remote_name, '--push-remote-url', remote_url,
)
return opts + remote_opts
else:
# An attempt to push an empty changeset
raise EarlyExit()

View File

@@ -67,6 +67,8 @@ def run_opts(
hook=None,
origin='',
source='',
push_remote_name='',
push_remote_url='',
hook_stage='commit',
show_diff_on_failure=False,
commit_msg_filename='',
@@ -81,6 +83,8 @@ def run_opts(
hook=hook,
origin=origin,
source=source,
push_remote_name=push_remote_name,
push_remote_url=push_remote_url,
hook_stage=hook_stage,
show_diff_on_failure=show_diff_on_failure,
commit_msg_filename=commit_msg_filename,

View File

@@ -687,6 +687,35 @@ def test_stages(cap_out, store, repo_with_passing_hook):
assert _run_for_stage('commit-msg').startswith(b'hook 5...')
def test_push_remote_environment(cap_out, store, repo_with_passing_hook):
config = {
'repo': 'local',
'hooks': [
{
'id': 'print-push-remote',
'name': 'Print push remote name',
'entry': 'entry: bash -c \'echo "$PRE_COMMIT_REMOTE_NAME"\'',
'language': 'system',
'verbose': bool(1),
},
],
}
add_config_to_repo(repo_with_passing_hook, config)
_test_run(
cap_out,
store,
repo_with_passing_hook,
opts={
'push_remote_name': 'origin',
'push_remote_url': 'https://github.com/pre-commit/pre-commit',
},
expected_outputs=[b'Print push remote name', b'Passed'],
expected_ret=0,
stage=['push'],
)
def test_commit_msg_hook(cap_out, store, commit_msg_repo):
filename = '.git/COMMIT_EDITMSG'
with open(filename, 'w') as f: