commit bfcdc9e9816dc81c90ce2db28ad9b602ec06b95a from: Stefan Sperling date: Thu May 11 07:53:20 2023 UTC make 'got patch' display statistics about files with conflicts and rejects ok op@ commit - e423877dd3fa76444ef448d4272a9f6d3ff32b54 commit + bfcdc9e9816dc81c90ce2db28ad9b602ec06b95a blob - 5b1264a0869935160185d8dbf60cfca23110939d blob + 8d34fc2c0463ba9b0482b97a427cd03c82b875d8 --- got/got.c +++ got/got.c @@ -8164,6 +8164,12 @@ patch_from_stdin(int *patchfd) return err; } + +struct got_patch_progress_arg { + int did_something; + int conflicts; + int rejects; +}; static const struct got_error * patch_progress(void *arg, const char *old, const char *new, @@ -8172,13 +8178,24 @@ patch_progress(void *arg, const char *old, const char int ws_mangled, const struct got_error *hunk_err) { const char *path = new == NULL ? old : new; + struct got_patch_progress_arg *a = arg; while (*path == '/') path++; - if (status != 0) + if (status != GOT_STATUS_NO_CHANGE && + status != 0 /* per-hunk progress */) { printf("%c %s\n", status, path); + a->did_something = 1; + } + if (hunk_err == NULL) { + if (status == GOT_STATUS_CANNOT_UPDATE) + a->rejects++; + else if (status == GOT_STATUS_CONFLICT) + a->conflicts++; + } + if (error != NULL) fprintf(stderr, "%s: %s\n", getprogname(), error->msg); @@ -8194,6 +8211,21 @@ patch_progress(void *arg, const char *old, const char } return NULL; +} + +static void +print_patch_progress_stats(struct got_patch_progress_arg *ppa) +{ + if (!ppa->did_something) + return; + + if (ppa->conflicts > 0) + printf("Files with merge conflicts: %d\n", ppa->conflicts); + + if (ppa->rejects > 0) { + printf("Files where patch failed to apply: %d\n", + ppa->rejects); + } } static const struct got_error * @@ -8211,6 +8243,7 @@ cmd_patch(int argc, char *argv[]) int ch, nop = 0, strip = -1, reverse = 0; int patchfd; int *pack_fds = NULL; + struct got_patch_progress_arg ppa; TAILQ_INIT(&refs); @@ -8301,9 +8334,10 @@ cmd_patch(int argc, char *argv[]) goto done; } + memset(&ppa, 0, sizeof(ppa)); error = got_patch(patchfd, worktree, repo, nop, strip, reverse, - commit_id, &patch_progress, NULL, check_cancelled, NULL); - + commit_id, patch_progress, &ppa, check_cancelled, NULL); + print_patch_progress_stats(&ppa); done: got_ref_list_free(&refs); free(commit_id); blob - f8f96458bc264b17a74e776857380fbf625c03d2 blob + 17db471e5c3aa81e0eb9233b406861cdccd08fcd --- regress/cmdline/patch.sh +++ regress/cmdline/patch.sh @@ -202,6 +202,7 @@ EOF @@ -1,1 +1,2 @@ hunk failed to apply # numbers @@ -1,9 +0,0 @@ hunk failed to apply +Files where patch failed to apply: 2 EOF cmp -s $testroot/stdout.expected $testroot/stdout @@ -561,6 +562,7 @@ EOF # iota # kappa # lambda +Files where patch failed to apply: 5 EOF cat < $testroot/stderr.expected @@ -1528,6 +1530,7 @@ test_patch_merge_conflict() { echo 'C alpha' > $testroot/stdout.expected echo 'C numbers' >> $testroot/stdout.expected + echo 'Files with merge conflicts: 2' >> $testroot/stdout.expected cmp -s $testroot/stdout $testroot/stdout.expected ret=$? if [ $ret -ne 0 ]; then