X-Git-Url: https://git.distorted.org.uk/~mdw/tig/blobdiff_plain/f4de14c5762fe2beef8633a254c470a37376b4c2..251acae219225cb1b6e5cfef73e1720b6dd2d528:/tig.c diff --git a/tig.c b/tig.c index ee9d706..c41f2b2 100644 --- a/tig.c +++ b/tig.c @@ -143,11 +143,12 @@ static size_t utf8_length(const char *string, size_t max_width, int *trimmed, bo struct ref { char *name; /* Ref name; tag or head names are shortened. */ char id[SIZEOF_REV]; /* Commit SHA1 ID */ + unsigned int head:1; /* Is it the current HEAD? */ unsigned int tag:1; /* Is it a tag? */ unsigned int ltag:1; /* If so, is the tag local? */ unsigned int remote:1; /* Is it a remote ref? */ + unsigned int tracked:1; /* Is it the remote for the current HEAD? */ unsigned int next:1; /* For ref lists: are there more refs? */ - unsigned int head:1; /* Is it the current HEAD? */ }; static struct ref **get_refs(char *id); @@ -447,6 +448,7 @@ static char opt_path[SIZEOF_STR] = ""; static char opt_file[SIZEOF_STR] = ""; static char opt_ref[SIZEOF_REF] = ""; static char opt_head[SIZEOF_REF] = ""; +static char opt_remote[SIZEOF_REF] = ""; static bool opt_no_head = TRUE; static FILE *opt_pipe = NULL; static char opt_encoding[20] = "UTF-8"; @@ -590,10 +592,11 @@ LINE(MAIN_DATE, "", COLOR_BLUE, COLOR_DEFAULT, 0), \ LINE(MAIN_AUTHOR, "", COLOR_GREEN, COLOR_DEFAULT, 0), \ LINE(MAIN_COMMIT, "", COLOR_DEFAULT, COLOR_DEFAULT, 0), \ LINE(MAIN_TAG, "", COLOR_MAGENTA, COLOR_DEFAULT, A_BOLD), \ -LINE(MAIN_LOCAL_TAG,"", COLOR_MAGENTA, COLOR_DEFAULT, A_BOLD), \ -LINE(MAIN_REMOTE, "", COLOR_YELLOW, COLOR_DEFAULT, A_BOLD), \ -LINE(MAIN_REF, "", COLOR_CYAN, COLOR_DEFAULT, A_BOLD), \ -LINE(MAIN_HEAD, "", COLOR_RED, COLOR_DEFAULT, A_BOLD), \ +LINE(MAIN_LOCAL_TAG,"", COLOR_MAGENTA, COLOR_DEFAULT, 0), \ +LINE(MAIN_REMOTE, "", COLOR_YELLOW, COLOR_DEFAULT, 0), \ +LINE(MAIN_TRACKED, "", COLOR_YELLOW, COLOR_DEFAULT, A_BOLD), \ +LINE(MAIN_REF, "", COLOR_CYAN, COLOR_DEFAULT, 0), \ +LINE(MAIN_HEAD, "", COLOR_CYAN, COLOR_DEFAULT, A_BOLD), \ LINE(MAIN_REVGRAPH,"", COLOR_MAGENTA, COLOR_DEFAULT, 0), \ LINE(TREE_DIR, "", COLOR_DEFAULT, COLOR_DEFAULT, A_NORMAL), \ LINE(TREE_FILE, "", COLOR_DEFAULT, COLOR_DEFAULT, A_NORMAL), \ @@ -4002,6 +4005,8 @@ static bool status_draw(struct view *view, struct line *line, unsigned int lineno, bool selected) { struct status *status = line->data; + char *text; + int col = 0; wmove(view->win, lineno, 0); @@ -4022,8 +4027,6 @@ status_draw(struct view *view, struct line *line, unsigned int lineno, bool sele } if (!status) { - char *text; - switch (line->type) { case LINE_STAT_STAGED: text = "Changes to be committed:"; @@ -4048,19 +4051,16 @@ status_draw(struct view *view, struct line *line, unsigned int lineno, bool sele default: return FALSE; } + } else { + char buf[] = { status->status, ' ', ' ', ' ', 0 }; - draw_text(view, text, view->width, TRUE, selected); - return TRUE; + col += draw_text(view, buf, view->width, TRUE, selected); + if (!selected) + wattrset(view->win, A_NORMAL); + text = status->new.name; } - waddch(view->win, status->status); - if (!selected) - wattrset(view->win, A_NORMAL); - wmove(view->win, lineno, 4); - if (view->width < 5) - return TRUE; - - draw_text(view, status->new.name, view->width - 5, TRUE, selected); + draw_text(view, text, view->width - col, TRUE, selected); return TRUE; } @@ -4903,6 +4903,8 @@ main_draw(struct view *view, struct line *line, unsigned int lineno, bool select wattrset(view->win, get_line_attr(LINE_MAIN_LOCAL_TAG)); else if (commit->refs[i]->tag) wattrset(view->win, get_line_attr(LINE_MAIN_TAG)); + else if (commit->refs[i]->tracked) + wattrset(view->win, get_line_attr(LINE_MAIN_TRACKED)); else if (commit->refs[i]->remote) wattrset(view->win, get_line_attr(LINE_MAIN_REMOTE)); else @@ -5510,6 +5512,7 @@ read_ref(char *id, size_t idlen, char *name, size_t namelen) bool tag = FALSE; bool ltag = FALSE; bool remote = FALSE; + bool tracked = FALSE; bool check_replace = FALSE; bool head = FALSE; @@ -5531,6 +5534,7 @@ read_ref(char *id, size_t idlen, char *name, size_t namelen) remote = TRUE; namelen -= STRING_SIZE("refs/remotes/"); name += STRING_SIZE("refs/remotes/"); + tracked = !strcmp(opt_remote, name); } else if (!strncmp(name, "refs/heads/", STRING_SIZE("refs/heads/"))) { namelen -= STRING_SIZE("refs/heads/"); @@ -5563,10 +5567,11 @@ read_ref(char *id, size_t idlen, char *name, size_t namelen) strncpy(ref->name, name, namelen); ref->name[namelen] = 0; + ref->head = head; ref->tag = tag; ref->ltag = ltag; ref->remote = remote; - ref->head = head; + ref->tracked = tracked; string_copy_rev(ref->id, id); return OK; @@ -5590,6 +5595,28 @@ read_repo_config_option(char *name, size_t namelen, char *value, size_t valuelen if (!strcmp(name, "core.editor")) string_ncopy(opt_editor, value, valuelen); + /* branch..remote */ + if (*opt_head && + !strncmp(name, "branch.", 7) && + !strncmp(name + 7, opt_head, strlen(opt_head)) && + !strcmp(name + 7 + strlen(opt_head), ".remote")) + string_ncopy(opt_remote, value, valuelen); + + if (*opt_head && *opt_remote && + !strncmp(name, "branch.", 7) && + !strncmp(name + 7, opt_head, strlen(opt_head)) && + !strcmp(name + 7 + strlen(opt_head), ".merge")) { + size_t from = strlen(opt_remote); + + if (!strncmp(value, "refs/heads/", STRING_SIZE("refs/heads/"))) { + value += STRING_SIZE("refs/heads/"); + valuelen -= STRING_SIZE("refs/heads/"); + } + + if (!string_format_from(opt_remote, &from, "/%s", value)) + opt_remote[0] = 0; + } + return OK; }