refactor ref status logic for pushing
[gitweb.git] / wt-status.c
index 8ef824e0d942b7d85789ceb15608dbbde0a6d557..5d569880163cccec91fdf1e9d50e03a6b5314d58 100644 (file)
@@ -47,24 +47,33 @@ void wt_status_prepare(struct wt_status *s)
 static void wt_status_print_unmerged_header(struct wt_status *s)
 {
        const char *c = color(WT_STATUS_HEADER, s);
+
        color_fprintf_ln(s->fp, c, "# Unmerged paths:");
-       if (!s->is_initial)
+       if (!advice_status_hints)
+               return;
+       if (s->in_merge)
+               ;
+       else if (!s->is_initial)
                color_fprintf_ln(s->fp, c, "#   (use \"git reset %s <file>...\" to unstage)", s->reference);
        else
                color_fprintf_ln(s->fp, c, "#   (use \"git rm --cached <file>...\" to unstage)");
-       color_fprintf_ln(s->fp, c, "#   (use \"git add <file>...\" to mark resolution)");
+       color_fprintf_ln(s->fp, c, "#   (use \"git add/rm <file>...\" as appropriate to mark resolution)");
        color_fprintf_ln(s->fp, c, "#");
 }
 
 static void wt_status_print_cached_header(struct wt_status *s)
 {
        const char *c = color(WT_STATUS_HEADER, s);
+
        color_fprintf_ln(s->fp, c, "# Changes to be committed:");
-       if (!s->is_initial) {
+       if (!advice_status_hints)
+               return;
+       if (s->in_merge)
+               ; /* NEEDSWORK: use "git reset --unresolve"??? */
+       else if (!s->is_initial)
                color_fprintf_ln(s->fp, c, "#   (use \"git reset %s <file>...\" to unstage)", s->reference);
-       } else {
+       else
                color_fprintf_ln(s->fp, c, "#   (use \"git rm --cached <file>...\" to unstage)");
-       }
        color_fprintf_ln(s->fp, c, "#");
 }
 
@@ -72,7 +81,10 @@ static void wt_status_print_dirty_header(struct wt_status *s,
                                         int has_deleted)
 {
        const char *c = color(WT_STATUS_HEADER, s);
+
        color_fprintf_ln(s->fp, c, "# Changed but not updated:");
+       if (!advice_status_hints)
+               return;
        if (!has_deleted)
                color_fprintf_ln(s->fp, c, "#   (use \"git add <file>...\" to update what will be committed)");
        else
@@ -85,6 +97,8 @@ static void wt_status_print_untracked_header(struct wt_status *s)
 {
        const char *c = color(WT_STATUS_HEADER, s);
        color_fprintf_ln(s->fp, c, "# Untracked files:");
+       if (!advice_status_hints)
+               return;
        color_fprintf_ln(s->fp, c, "#   (use \"git add <file>...\" to include in what will be committed)");
        color_fprintf_ln(s->fp, c, "#");
 }
@@ -330,7 +344,7 @@ static void wt_status_collect_untracked(struct wt_status *s)
        setup_standard_excludes(&dir);
 
        fill_directory(&dir, NULL);
-       for(i = 0; i < dir.nr; i++) {
+       for (i = 0; i < dir.nr; i++) {
                struct dir_entry *ent = dir.entries[i];
                if (!cache_name_is_other(ent->name, ent->len))
                        continue;
@@ -563,8 +577,8 @@ void wt_status_print(struct wt_status *s)
                color_fprintf_ln(s->fp, color(WT_STATUS_HEADER, s), "#");
        }
 
-       wt_status_print_unmerged(s);
        wt_status_print_updated(s);
+       wt_status_print_unmerged(s);
        wt_status_print_changed(s);
        if (s->submodule_summary)
                wt_status_print_submodule_summary(s);
@@ -608,14 +622,14 @@ static void wt_shortstatus_unmerged(int null_termination, struct string_list_ite
        case 6: how = "AA"; break; /* both added */
        case 7: how = "UU"; break; /* both modified */
        }
-       printf("%s ", how);
+       color_fprintf(s->fp, color(WT_STATUS_UNMERGED, s), "%s", how);
        if (null_termination) {
-               fprintf(stdout, "%s%c", it->string, 0);
+               fprintf(stdout, " %s%c", it->string, 0);
        } else {
                struct strbuf onebuf = STRBUF_INIT;
                const char *one;
                one = quote_path(it->string, -1, &onebuf, s->prefix);
-               printf("%s\n", one);
+               printf(" %s\n", one);
                strbuf_release(&onebuf);
        }
 }
@@ -625,9 +639,15 @@ static void wt_shortstatus_status(int null_termination, struct string_list_item
 {
        struct wt_status_change_data *d = it->util;
 
-       printf("%c%c ",
-               !d->index_status ? ' ' : d->index_status,
-               !d->worktree_status ? ' ' : d->worktree_status);
+       if (d->index_status)
+               color_fprintf(s->fp, color(WT_STATUS_UPDATED, s), "%c", d->index_status);
+       else
+               putchar(' ');
+       if (d->worktree_status)
+               color_fprintf(s->fp, color(WT_STATUS_CHANGED, s), "%c", d->worktree_status);
+       else
+               putchar(' ');
+       putchar(' ');
        if (null_termination) {
                fprintf(stdout, "%s%c", it->string, 0);
                if (d->head_path)
@@ -655,7 +675,8 @@ static void wt_shortstatus_untracked(int null_termination, struct string_list_it
                struct strbuf onebuf = STRBUF_INIT;
                const char *one;
                one = quote_path(it->string, -1, &onebuf, s->prefix);
-               printf("?? %s\n", one);
+               color_fprintf(s->fp, color(WT_STATUS_UNTRACKED, s), "??");
+               printf(" %s\n", one);
                strbuf_release(&onebuf);
        }
 }
@@ -681,3 +702,11 @@ void wt_shortstatus_print(struct wt_status *s, int null_termination)
                wt_shortstatus_untracked(null_termination, it, s);
        }
 }
+
+void wt_porcelain_print(struct wt_status *s, int null_termination)
+{
+       s->use_color = 0;
+       s->relative_paths = 0;
+       s->prefix = NULL;
+       wt_shortstatus_print(s, null_termination);
+}