Introduce new function real_path_if_valid()
[gitweb.git] / wt-status.c
index 6d0b71f74733e7bf345b04abb0987f7ad6602101..2a9658bad4c5035893e9363b51985f285dd3b34c 100644 (file)
@@ -12,6 +12,7 @@
 #include "refs.h"
 #include "submodule.h"
 #include "column.h"
+#include "strbuf.h"
 
 static char default_wt_status_colors[][COLOR_MAXLEN] = {
        GIT_COLOR_NORMAL, /* WT_STATUS_HEADER */
@@ -23,7 +24,6 @@ static char default_wt_status_colors[][COLOR_MAXLEN] = {
        GIT_COLOR_GREEN,  /* WT_STATUS_LOCAL_BRANCH */
        GIT_COLOR_RED,    /* WT_STATUS_REMOTE_BRANCH */
        GIT_COLOR_NIL,    /* WT_STATUS_ONBRANCH */
-       GIT_COLOR_NORMAL, /* WT_STATUS_IN_PROGRESS */
 };
 
 static const char *color(int slot, struct wt_status *s)
@@ -100,8 +100,8 @@ void status_printf(struct wt_status *s, const char *color,
        va_end(ap);
 }
 
-void status_printf_more(struct wt_status *s, const char *color,
-                       const char *fmt, ...)
+static void status_printf_more(struct wt_status *s, const char *color,
+                              const char *fmt, ...)
 {
        va_list ap;
 
@@ -221,7 +221,7 @@ static void wt_status_print_other_header(struct wt_status *s,
                                         const char *how)
 {
        const char *c = color(WT_STATUS_HEADER, s);
-       status_printf_ln(s, c, _("%s files:"), what);
+       status_printf_ln(s, c, "%s:", what);
        if (!advice_status_hints)
                return;
        status_printf_ln(s, c, _("  (use \"git %s <file>...\" to include in what will be committed)"), how);
@@ -817,6 +817,52 @@ static void show_am_in_progress(struct wt_status *s,
        wt_status_print_trailer(s);
 }
 
+static char *read_line_from_git_path(const char *filename)
+{
+       struct strbuf buf = STRBUF_INIT;
+       FILE *fp = fopen(git_path("%s", filename), "r");
+       if (!fp) {
+               strbuf_release(&buf);
+               return NULL;
+       }
+       strbuf_getline(&buf, fp, '\n');
+       if (!fclose(fp)) {
+               return strbuf_detach(&buf, NULL);
+       } else {
+               strbuf_release(&buf);
+               return NULL;
+       }
+}
+
+static int split_commit_in_progress(struct wt_status *s)
+{
+       int split_in_progress = 0;
+       char *head = read_line_from_git_path("HEAD");
+       char *orig_head = read_line_from_git_path("ORIG_HEAD");
+       char *rebase_amend = read_line_from_git_path("rebase-merge/amend");
+       char *rebase_orig_head = read_line_from_git_path("rebase-merge/orig-head");
+
+       if (!head || !orig_head || !rebase_amend || !rebase_orig_head ||
+           !s->branch || strcmp(s->branch, "HEAD"))
+               return split_in_progress;
+
+       if (!strcmp(rebase_amend, rebase_orig_head)) {
+               if (strcmp(head, rebase_amend))
+                       split_in_progress = 1;
+       } else if (strcmp(orig_head, rebase_orig_head)) {
+               split_in_progress = 1;
+       }
+
+       if (!s->amend && !s->nowarn && !s->workdir_dirty)
+               split_in_progress = 0;
+
+       free(head);
+       free(orig_head);
+       free(rebase_amend);
+       free(rebase_orig_head);
+       return split_in_progress;
+}
+
 static void show_rebase_in_progress(struct wt_status *s,
                                struct wt_status_state *state,
                                const char *color)
@@ -838,6 +884,11 @@ static void show_rebase_in_progress(struct wt_status *s,
                if (advice_status_hints)
                        status_printf_ln(s, color,
                                _("  (all conflicts fixed: run \"git rebase --continue\")"));
+       } else if (split_commit_in_progress(s)) {
+               status_printf_ln(s, color, _("You are currently splitting a commit during a rebase."));
+               if (advice_status_hints)
+                       status_printf_ln(s, color,
+                               _("  (Once your working directory is clean, run \"git rebase --continue\")"));
        } else {
                status_printf_ln(s, color, _("You are currently editing a commit during a rebase."));
                if (advice_status_hints && !s->amend) {
@@ -879,7 +930,7 @@ static void show_bisect_in_progress(struct wt_status *s,
 
 static void wt_status_print_state(struct wt_status *s)
 {
-       const char *state_color = color(WT_STATUS_IN_PROGRESS, s);
+       const char *state_color = color(WT_STATUS_HEADER, s);
        struct wt_status_state state;
        struct stat st;
 
@@ -957,9 +1008,9 @@ void wt_status_print(struct wt_status *s)
                wt_status_print_submodule_summary(s, 1);  /* unstaged */
        }
        if (s->show_untracked_files) {
-               wt_status_print_other(s, &s->untracked, _("Untracked"), "add");
+               wt_status_print_other(s, &s->untracked, _("Untracked files"), "add");
                if (s->show_ignored_files)
-                       wt_status_print_other(s, &s->ignored, _("Ignored"), "add -f");
+                       wt_status_print_other(s, &s->ignored, _("Ignored files"), "add -f");
        } else if (s->commitable)
                status_printf_ln(s, GIT_COLOR_NORMAL, _("Untracked files not listed%s"),
                        advice_status_hints
@@ -972,23 +1023,31 @@ void wt_status_print(struct wt_status *s)
                        status_printf_ln(s, GIT_COLOR_NORMAL, _("No changes"));
                else if (s->nowarn)
                        ; /* nothing */
-               else if (s->workdir_dirty)
-                       printf(_("no changes added to commit%s\n"),
-                               advice_status_hints
-                               ? _(" (use \"git add\" and/or \"git commit -a\")") : "");
-               else if (s->untracked.nr)
-                       printf(_("nothing added to commit but untracked files present%s\n"),
-                               advice_status_hints
-                               ? _(" (use \"git add\" to track)") : "");
-               else if (s->is_initial)
-                       printf(_("nothing to commit%s\n"), advice_status_hints
-                               ? _(" (create/copy files and use \"git add\" to track)") : "");
-               else if (!s->show_untracked_files)
-                       printf(_("nothing to commit%s\n"), advice_status_hints
-                               ? _(" (use -u to show untracked files)") : "");
-               else
-                       printf(_("nothing to commit%s\n"), advice_status_hints
-                               ? _(" (working directory clean)") : "");
+               else if (s->workdir_dirty) {
+                       if (advice_status_hints)
+                               printf(_("no changes added to commit "
+                                        "(use \"git add\" and/or \"git commit -a\")\n"));
+                       else
+                               printf(_("no changes added to commit\n"));
+               } else if (s->untracked.nr) {
+                       if (advice_status_hints)
+                               printf(_("nothing added to commit but untracked files "
+                                        "present (use \"git add\" to track)\n"));
+                       else
+                               printf(_("nothing added to commit but untracked files present\n"));
+               } else if (s->is_initial) {
+                       if (advice_status_hints)
+                               printf(_("nothing to commit (create/copy files "
+                                        "and use \"git add\" to track)\n"));
+                       else
+                               printf(_("nothing to commit\n"));
+               } else if (!s->show_untracked_files) {
+                       if (advice_status_hints)
+                               printf(_("nothing to commit (use -u to show untracked files)\n"));
+                       else
+                               printf(_("nothing to commit\n"));
+               } else
+                       printf(_("nothing to commit, working directory clean\n"));
        }
 }