Mark the commitable flag in the wt_status object in the call to
`wt_status_collect()`, instead of in `wt_longstatus_print_updated()`,
and simplify the logic in the latter function to take advantage of the
logic shifted to the former. This means that callers do not need to use
`wt_longstatus_print_updated()` to collect the `commitable` flag;
calling `wt_status_collect()` is sufficient.

As a result, invoking `git commit` with `--short` or `--porcelain`
(which imply `--dry-run`, but previously returned an inconsistent error
code inconsistent with dry run behavior) correctly returns status code
zero when there is something to commit. This fixes two bugs documented
in the test suite.

Signed-off-by: Samuel Lijin <sxli...@gmail.com>
---
 t/t7501-commit.sh |  4 ++--
 wt-status.c       | 38 +++++++++++++++++++++++++++-----------
 2 files changed, 29 insertions(+), 13 deletions(-)

diff --git a/t/t7501-commit.sh b/t/t7501-commit.sh
index fa61b1a4e..85a8217fd 100755
--- a/t/t7501-commit.sh
+++ b/t/t7501-commit.sh
@@ -87,12 +87,12 @@ test_expect_success '--dry-run with stuff to commit returns 
ok' '
        git commit -m next -a --dry-run
 '
 
-test_expect_failure '--short with stuff to commit returns ok' '
+test_expect_success '--short with stuff to commit returns ok' '
        echo bongo bongo bongo >>file &&
        git commit -m next -a --short
 '
 
-test_expect_failure '--porcelain with stuff to commit returns ok' '
+test_expect_success '--porcelain with stuff to commit returns ok' '
        echo bongo bongo bongo >>file &&
        git commit -m next -a --porcelain
 '
diff --git a/wt-status.c b/wt-status.c
index 50815e5fa..2e5452731 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -718,6 +718,19 @@ static void wt_status_collect_untracked(struct wt_status 
*s)
                s->untracked_in_ms = (getnanotime() - t_begin) / 1000000;
 }
 
+static void wt_status_mark_commitable(struct wt_status *s) {
+       int i;
+
+       for (i = 0; i < s->change.nr; i++) {
+               struct wt_status_change_data *d = (s->change.items[i]).util;
+
+               if (d->index_status && d->index_status != DIFF_STATUS_UNMERGED) 
{
+                       s->commitable = 1;
+                       return;
+               }
+       }
+}
+
 void wt_status_collect(struct wt_status *s)
 {
        wt_status_collect_changes_worktree(s);
@@ -726,7 +739,10 @@ void wt_status_collect(struct wt_status *s)
                wt_status_collect_changes_initial(s);
        else
                wt_status_collect_changes_index(s);
+
        wt_status_collect_untracked(s);
+
+       wt_status_mark_commitable(s);
 }
 
 static void wt_longstatus_print_unmerged(struct wt_status *s)
@@ -754,26 +770,26 @@ static void wt_longstatus_print_unmerged(struct wt_status 
*s)
 
 static void wt_longstatus_print_updated(struct wt_status *s)
 {
-       int shown_header = 0;
        int i;
 
+       if (!s->commitable) {
+               return;
+       }
+
+       wt_longstatus_print_cached_header(s);
+
        for (i = 0; i < s->change.nr; i++) {
                struct wt_status_change_data *d;
                struct string_list_item *it;
                it = &(s->change.items[i]);
                d = it->util;
-               if (!d->index_status ||
-                   d->index_status == DIFF_STATUS_UNMERGED)
-                       continue;
-               if (!shown_header) {
-                       wt_longstatus_print_cached_header(s);
-                       s->commitable = 1;
-                       shown_header = 1;
+               if (d->index_status &&
+                   d->index_status != DIFF_STATUS_UNMERGED) {
+                       wt_longstatus_print_change_data(s, WT_STATUS_UPDATED, 
it);
                }
-               wt_longstatus_print_change_data(s, WT_STATUS_UPDATED, it);
        }
-       if (shown_header)
-               wt_longstatus_print_trailer(s);
+
+       wt_longstatus_print_trailer(s);
 }
 
 /*
-- 
2.17.0

Reply via email to