@matheusbsbs / matheus-bagliano / commits / 77555854be
Fork 0

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;