#include "cache.h"
-#include "pathspec.h"
#include "wt-status.h"
#include "object.h"
#include "dir.h"
static void wt_status_print_tracking(struct wt_status *s)
{
struct strbuf sb = STRBUF_INIT;
- const char *cp, *ep;
+ const char *cp, *ep, *branch_name;
struct branch *branch;
char comment_line_string[3];
int i;
assert(s->branch && !s->is_initial);
- if (!starts_with(s->branch, "refs/heads/"))
+ if (!skip_prefix(s->branch, "refs/heads/", &branch_name))
return;
- branch = branch_get(s->branch + 11);
+ branch = branch_get(branch_name);
if (!format_tracking_info(branch, &sb))
return;
{
struct strbuf sb = STRBUF_INIT;
unsigned char sha1[20];
+ const char *branch_name;
if (strbuf_read_file(&sb, git_path("%s", path), 0) <= 0)
goto got_nothing;
strbuf_setlen(&sb, sb.len - 1);
if (!sb.len)
goto got_nothing;
- if (starts_with(sb.buf, "refs/heads/"))
- strbuf_remove(&sb,0, strlen("refs/heads/"));
+ if (skip_prefix(sb.buf, "refs/heads/", &branch_name))
+ strbuf_remove(&sb, 0, branch_name - sb.buf);
else if (starts_with(sb.buf, "refs/"))
;
else if (!get_sha1_hex(sb.buf, sha1)) {
struct grab_1st_switch_cbdata *cb = cb_data;
const char *target = NULL, *end;
- if (!starts_with(message, "checkout: moving from "))
+ if (!skip_prefix(message, "checkout: moving from ", &message))
return 0;
- message += strlen("checkout: moving from ");
target = strstr(message, " to ");
if (!target)
return 0;
target += strlen(" to ");
strbuf_reset(&cb->buf);
hashcpy(cb->nsha1, nsha1);
- for (end = target; *end && *end != '\n'; end++)
- ;
+ end = strchrnul(target, '\n');
strbuf_add(&cb->buf, target, end - target);
+ if (!strcmp(cb->buf.buf, "HEAD")) {
+ /* HEAD is relative. Resolve it to the right reflog entry. */
+ strbuf_reset(&cb->buf);
+ strbuf_addstr(&cb->buf,
+ find_unique_abbrev(nsha1, DEFAULT_ABBREV));
+ }
return 1;
}
(!hashcmp(cb.nsha1, sha1) ||
/* perhaps sha1 is a tag, try to dereference to a commit */
((commit = lookup_commit_reference_gently(sha1, 1)) != NULL &&
- !hashcmp(cb.nsha1, commit->object.sha1)))) {
- int ofs;
- if (starts_with(ref, "refs/tags/"))
- ofs = strlen("refs/tags/");
- else if (starts_with(ref, "refs/remotes/"))
- ofs = strlen("refs/remotes/");
- else
- ofs = 0;
- state->detached_from = xstrdup(ref + ofs);
+ !hashcmp(cb.nsha1, commit->object.oid.hash)))) {
+ const char *from = ref;
+ if (!skip_prefix(from, "refs/tags/", &from))
+ skip_prefix(from, "refs/remotes/", &from);
+ state->detached_from = xstrdup(from);
} else
state->detached_from =
xstrdup(find_unique_abbrev(cb.nsha1, DEFAULT_ABBREV));
if (s->branch) {
const char *on_what = _("On branch ");
const char *branch_name = s->branch;
- if (starts_with(branch_name, "refs/heads/"))
- branch_name += 11;
- else if (!strcmp(branch_name, "HEAD")) {
+ if (!strcmp(branch_name, "HEAD")) {
branch_status_color = color(WT_STATUS_NOBRANCH, s);
if (state.rebase_in_progress || state.rebase_interactive_in_progress) {
if (state.rebase_interactive_in_progress)
branch_name = "";
on_what = _("Not currently on any branch.");
}
- }
+ } else
+ skip_prefix(branch_name, "refs/heads/", &branch_name);
status_printf(s, color(WT_STATUS_HEADER, s), "%s", "");
status_printf_more(s, branch_status_color, "%s", on_what);
status_printf_more(s, branch_color, "%s\n", branch_name);
return;
branch_name = s->branch;
- if (starts_with(branch_name, "refs/heads/"))
- branch_name += 11;
- else if (!strcmp(branch_name, "HEAD")) {
- branch_name = _("HEAD (no branch)");
- branch_color_local = color(WT_STATUS_NOBRANCH, s);
- }
-
- branch = branch_get(s->branch + 11);
if (s->is_initial)
color_fprintf(s->fp, header_color, _("Initial commit on "));
+ if (!strcmp(s->branch, "HEAD")) {
+ color_fprintf(s->fp, color(WT_STATUS_NOBRANCH, s), "%s",
+ _("HEAD (no branch)"));
+ goto conclude;
+ }
+
+ skip_prefix(branch_name, "refs/heads/", &branch_name);
+
+ branch = branch_get(branch_name);
+
color_fprintf(s->fp, branch_color_local, "%s", branch_name);
if (stat_tracking_info(branch, &num_ours, &num_theirs, &base) < 0) {
- if (!base) {
- fputc(s->null_termination ? '\0' : '\n', s->fp);
- return;
- }
+ if (!base)
+ goto conclude;
upstream_is_gone = 1;
}
color_fprintf(s->fp, branch_color_remote, "%s", base);
free((char *)base);
- if (!upstream_is_gone && !num_ours && !num_theirs) {
- fputc(s->null_termination ? '\0' : '\n', s->fp);
- return;
- }
+ if (!upstream_is_gone && !num_ours && !num_theirs)
+ goto conclude;
#define LABEL(string) (s->no_gettext ? (string) : _(string))
}
color_fprintf(s->fp, header_color, "]");
+ conclude:
fputc(s->null_termination ? '\0' : '\n', s->fp);
}