Merge branch 'ld/push-porcelain'
* ld/push-porcelain: t5516: Use test_cmp when appropriate git-push: add tests for git push --porcelain git-push: make git push --porcelain print "Done" git-push: send "To <remoteurl>" messages to the standard output in --porcelain mode git-push: fix an advice message so it goes to stderr Conflicts: transport.c
This commit is contained in:
commit
66bce02ec4
@ -124,9 +124,9 @@ static int push_with_options(struct transport *transport, int flags)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (nonfastforward && advice_push_nonfastforward) {
|
if (nonfastforward && advice_push_nonfastforward) {
|
||||||
printf("To prevent you from losing history, non-fast-forward updates were rejected\n"
|
fprintf(stderr, "To prevent you from losing history, non-fast-forward updates were rejected\n"
|
||||||
"Merge the remote changes before pushing again. See the 'Note about\n"
|
"Merge the remote changes before pushing again. See the 'Note about\n"
|
||||||
"fast-forwards' section of 'git push --help' for details.\n");
|
"fast-forwards' section of 'git push --help' for details.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -361,6 +361,10 @@ int send_pack(struct send_pack_args *args,
|
|||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
if (args->porcelain)
|
||||||
|
return 0;
|
||||||
|
|
||||||
for (ref = remote_refs; ref; ref = ref->next) {
|
for (ref = remote_refs; ref; ref = ref->next) {
|
||||||
switch (ref->status) {
|
switch (ref->status) {
|
||||||
case REF_STATUS_NONE:
|
case REF_STATUS_NONE:
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
struct send_pack_args {
|
struct send_pack_args {
|
||||||
unsigned verbose:1,
|
unsigned verbose:1,
|
||||||
quiet:1,
|
quiet:1,
|
||||||
|
porcelain:1,
|
||||||
send_mirror:1,
|
send_mirror:1,
|
||||||
force_update:1,
|
force_update:1,
|
||||||
use_thin_pack:1,
|
use_thin_pack:1,
|
||||||
|
@ -660,4 +660,54 @@ test_expect_success 'push with branches containing #' '
|
|||||||
git checkout master
|
git checkout master
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'push --porcelain' '
|
||||||
|
mk_empty &&
|
||||||
|
echo >.git/foo "To testrepo" &&
|
||||||
|
echo >>.git/foo "* refs/heads/master:refs/remotes/origin/master [new branch]" &&
|
||||||
|
echo >>.git/foo "Done" &&
|
||||||
|
git push >.git/bar --porcelain testrepo refs/heads/master:refs/remotes/origin/master &&
|
||||||
|
(
|
||||||
|
cd testrepo &&
|
||||||
|
r=$(git show-ref -s --verify refs/remotes/origin/master) &&
|
||||||
|
test "z$r" = "z$the_commit" &&
|
||||||
|
test 1 = $(git for-each-ref refs/remotes/origin | wc -l)
|
||||||
|
) &&
|
||||||
|
test_cmp .git/foo .git/bar
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'push --porcelain bad url' '
|
||||||
|
mk_empty &&
|
||||||
|
test_must_fail git push >.git/bar --porcelain asdfasdfasd refs/heads/master:refs/remotes/origin/master &&
|
||||||
|
test_must_fail grep -q Done .git/bar
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'push --porcelain rejected' '
|
||||||
|
mk_empty &&
|
||||||
|
git push testrepo refs/heads/master:refs/remotes/origin/master &&
|
||||||
|
(cd testrepo &&
|
||||||
|
git reset --hard origin/master^
|
||||||
|
git config receive.denyCurrentBranch true) &&
|
||||||
|
|
||||||
|
echo >.git/foo "To testrepo" &&
|
||||||
|
echo >>.git/foo "! refs/heads/master:refs/heads/master [remote rejected] (branch is currently checked out)" &&
|
||||||
|
|
||||||
|
test_must_fail git push >.git/bar --porcelain testrepo refs/heads/master:refs/heads/master &&
|
||||||
|
test_cmp .git/foo .git/bar
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'push --porcelain --dry-run rejected' '
|
||||||
|
mk_empty &&
|
||||||
|
git push testrepo refs/heads/master:refs/remotes/origin/master &&
|
||||||
|
(cd testrepo &&
|
||||||
|
git reset --hard origin/master
|
||||||
|
git config receive.denyCurrentBranch true) &&
|
||||||
|
|
||||||
|
echo >.git/foo "To testrepo" &&
|
||||||
|
echo >>.git/foo "! refs/heads/master^:refs/heads/master [rejected] (non-fast-forward)" &&
|
||||||
|
echo >>.git/foo "Done" &&
|
||||||
|
|
||||||
|
test_must_fail git push >.git/bar --porcelain --dry-run testrepo refs/heads/master^:refs/heads/master &&
|
||||||
|
test_cmp .git/foo .git/bar
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
15
transport.c
15
transport.c
@ -673,7 +673,7 @@ static void print_ok_ref_status(struct ref *ref, int porcelain)
|
|||||||
static int print_one_push_status(struct ref *ref, const char *dest, int count, int porcelain)
|
static int print_one_push_status(struct ref *ref, const char *dest, int count, int porcelain)
|
||||||
{
|
{
|
||||||
if (!count)
|
if (!count)
|
||||||
fprintf(stderr, "To %s\n", dest);
|
fprintf(porcelain ? stdout : stderr, "To %s\n", dest);
|
||||||
|
|
||||||
switch(ref->status) {
|
switch(ref->status) {
|
||||||
case REF_STATUS_NONE:
|
case REF_STATUS_NONE:
|
||||||
@ -789,6 +789,7 @@ static int git_transport_push(struct transport *transport, struct ref *remote_re
|
|||||||
args.verbose = !!(flags & TRANSPORT_PUSH_VERBOSE);
|
args.verbose = !!(flags & TRANSPORT_PUSH_VERBOSE);
|
||||||
args.quiet = !!(flags & TRANSPORT_PUSH_QUIET);
|
args.quiet = !!(flags & TRANSPORT_PUSH_QUIET);
|
||||||
args.dry_run = !!(flags & TRANSPORT_PUSH_DRY_RUN);
|
args.dry_run = !!(flags & TRANSPORT_PUSH_DRY_RUN);
|
||||||
|
args.porcelain = !!(flags & TRANSPORT_PUSH_PORCELAIN);
|
||||||
|
|
||||||
ret = send_pack(&args, data->fd, data->conn, remote_refs,
|
ret = send_pack(&args, data->fd, data->conn, remote_refs,
|
||||||
&data->extra_have);
|
&data->extra_have);
|
||||||
@ -1049,7 +1050,7 @@ int transport_push(struct transport *transport,
|
|||||||
int quiet = flags & TRANSPORT_PUSH_QUIET;
|
int quiet = flags & TRANSPORT_PUSH_QUIET;
|
||||||
int porcelain = flags & TRANSPORT_PUSH_PORCELAIN;
|
int porcelain = flags & TRANSPORT_PUSH_PORCELAIN;
|
||||||
int pretend = flags & TRANSPORT_PUSH_DRY_RUN;
|
int pretend = flags & TRANSPORT_PUSH_DRY_RUN;
|
||||||
int ret, err;
|
int push_ret, ret, err;
|
||||||
|
|
||||||
if (flags & TRANSPORT_PUSH_ALL)
|
if (flags & TRANSPORT_PUSH_ALL)
|
||||||
match_flags |= MATCH_REFS_ALL;
|
match_flags |= MATCH_REFS_ALL;
|
||||||
@ -1065,10 +1066,9 @@ int transport_push(struct transport *transport,
|
|||||||
flags & TRANSPORT_PUSH_MIRROR,
|
flags & TRANSPORT_PUSH_MIRROR,
|
||||||
flags & TRANSPORT_PUSH_FORCE);
|
flags & TRANSPORT_PUSH_FORCE);
|
||||||
|
|
||||||
ret = transport->push_refs(transport, remote_refs, flags);
|
push_ret = transport->push_refs(transport, remote_refs, flags);
|
||||||
err = push_had_errors(remote_refs);
|
err = push_had_errors(remote_refs);
|
||||||
|
ret = push_ret | err;
|
||||||
ret |= err;
|
|
||||||
|
|
||||||
if (!quiet || err)
|
if (!quiet || err)
|
||||||
transport_print_push_status(transport->url, remote_refs,
|
transport_print_push_status(transport->url, remote_refs,
|
||||||
@ -1084,8 +1084,11 @@ int transport_push(struct transport *transport,
|
|||||||
transport_update_tracking_ref(transport->remote, ref, verbose);
|
transport_update_tracking_ref(transport->remote, ref, verbose);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!quiet && !ret && !transport_refs_pushed(remote_refs))
|
if (porcelain && !push_ret)
|
||||||
|
puts("Done");
|
||||||
|
else if (!quiet && !ret && !transport_refs_pushed(remote_refs))
|
||||||
fprintf(stderr, "Everything up-to-date\n");
|
fprintf(stderr, "Everything up-to-date\n");
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
|
Loading…
Reference in New Issue
Block a user