git-push: make git push --porcelain print "Done"
The script calling git push --porcelain --dry-run can see clearly from the output if an update was rejected. However, it will probably need to distinguish this condition from the push failing for other reasons, such as the remote not being reachable. This patch modifies git push --porcelain to print "Done" after the rest of its output unless any errors have occurred. For the purpose of the "Done" line, knowing a ref will be rejected in a --dry-run does not count as an error. Actual rejections in non --dry-run pushes do count as errors. Signed-off-by: Larry D'Anna <larry@elder-gods.org> Acked-by: Tay Ray Chuan <rctay89@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Larry D'Anna committed
Feb 26, 2010 at 23:52 UTC
77555854be6e7fbce07c9ded30ea859b54699be0
3 files changed
+13
-5
builtin-send-pack.c
+4
@@ -476,6 +476,10 @@ int send_pack(struct send_pack_args *args,
476
477
if (ret < 0)
478
return ret;
479
+
480
+ if (args->porcelain)
481
+ return 0;
482
+
483
for (ref = remote_refs; ref; ref = ref->next) {
484
switch (ref->status) {
485
case REF_STATUS_NONE:
send-pack.h
+1
@@ -4,6 +4,7 @@
4
struct send_pack_args {
5
unsigned verbose:1,
6
quiet:1,
7
+ porcelain:1,
8
send_mirror:1,
9
force_update:1,
10
use_thin_pack:1,
transport.c
+8
-5
@@ -791,6 +791,7 @@ static int git_transport_push(struct transport *transport, struct ref *remote_re
791
args.verbose = !!(flags & TRANSPORT_PUSH_VERBOSE);
792
args.quiet = !!(flags & TRANSPORT_PUSH_QUIET);
793
args.dry_run = !!(flags & TRANSPORT_PUSH_DRY_RUN);
794
+ args.porcelain = !!(flags & TRANSPORT_PUSH_PORCELAIN);
795
796
ret = send_pack(&args, data->fd, data->conn, remote_refs,
797
&data->extra_have);
@@ -1035,7 +1036,7 @@ int transport_push(struct transport *transport,
1036
int quiet = flags & TRANSPORT_PUSH_QUIET;
1037
int porcelain = flags & TRANSPORT_PUSH_PORCELAIN;
1038
int pretend = flags & TRANSPORT_PUSH_DRY_RUN;
1038
- int ret, err;
1039
+ int push_ret, ret, err;
1040
1041
if (flags & TRANSPORT_PUSH_ALL)
1042
match_flags |= MATCH_REFS_ALL;
@@ -1051,10 +1052,9 @@ int transport_push(struct transport *transport,
1052
flags & TRANSPORT_PUSH_MIRROR,
1053
flags & TRANSPORT_PUSH_FORCE);
1054
1054
- ret = transport->push_refs(transport, remote_refs, flags);
1055
+ push_ret = transport->push_refs(transport, remote_refs, flags);
1056
err = push_had_errors(remote_refs);
1056
-
1057
- ret |= err;
1057
+ ret = push_ret | err;
1058
1059
if (!quiet || err)
1060
print_push_status(transport->url, remote_refs,
@@ -1070,8 +1070,11 @@ int transport_push(struct transport *transport,
1070
update_tracking_ref(transport->remote, ref, verbose);
1071
}
1072
1073
- if (!quiet && !ret && !refs_pushed(remote_refs))
1073
+ if (porcelain && !push_ret)
1074
+ puts("Done");
1075
+ else if (!quiet && !ret && !refs_pushed(remote_refs))
1076
fprintf(stderr, "Everything up-to-date\n");
1077
+
1078
return ret;
1079
}
1080
return 1;