#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 */
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)
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;
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);
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)
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) {
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;
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
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"));
}
}