X-Git-Url: https://git.distorted.org.uk/~mdw/tig/blobdiff_plain/226da94bdeb7c80ca7ecc889dc62a3fef9fd4e95..c38c64bb6e5e9c1f173e24c964b06497e24108d9:/tig.c diff --git a/tig.c b/tig.c index 246812f..cc7f6b8 100644 --- a/tig.c +++ b/tig.c @@ -318,6 +318,7 @@ sq_quote(char buf[SIZEOF_STR], size_t bufsize, const char *src) REQ_(NEXT, "Move to next"), \ REQ_(PREVIOUS, "Move to previous"), \ REQ_(VIEW_NEXT, "Move focus to next view"), \ + REQ_(REFRESH, "Reload and refresh"), \ REQ_(VIEW_CLOSE, "Close the current view"), \ REQ_(QUIT, "Close all views and quit"), \ \ @@ -439,6 +440,7 @@ static iconv_t opt_iconv = ICONV_NONE; static char opt_search[SIZEOF_STR] = ""; static char opt_cdup[SIZEOF_STR] = ""; static char opt_git_dir[SIZEOF_STR] = ""; +static char opt_is_inside_work_tree = -1; /* set to TRUE or FALSE */ static char opt_editor[SIZEOF_STR] = ""; enum option_type { @@ -751,6 +753,7 @@ static struct keybinding default_keybindings[] = { { KEY_RETURN, REQ_ENTER }, { KEY_UP, REQ_PREVIOUS }, { KEY_DOWN, REQ_NEXT }, + { 'R', REQ_REFRESH }, /* Cursor navigation */ { 'k', REQ_MOVE_UP }, @@ -2143,11 +2146,12 @@ open_view(struct view *prev, enum request request, enum open_flags flags) } static void -open_editor(struct view *view, char *file) +open_editor(bool from_root, char *file) { char cmd[SIZEOF_STR]; char file_sq[SIZEOF_STR]; char *editor; + char *prefix = from_root ? opt_cdup : ""; editor = getenv("GIT_EDITOR"); if (!editor && *opt_editor) @@ -2160,7 +2164,7 @@ open_editor(struct view *view, char *file) editor = "vi"; if (sq_quote(file_sq, 0, file) < sizeof(file_sq) && - string_format(cmd, "%s %s", editor, file_sq)) { + string_format(cmd, "%s %s%s", editor, prefix, file_sq)) { def_prog_mode(); /* save current tty modes */ endwin(); /* restore original tty modes */ system(cmd); @@ -2178,6 +2182,11 @@ view_driver(struct view *view, enum request request) { int i; + if (request == REQ_NONE) { + doupdate(); + return TRUE; + } + if (view && view->lines) { request = view->ops->request(view, request, &view->line[view->lineno]); if (request == REQ_NONE) @@ -2228,12 +2237,19 @@ view_driver(struct view *view, enum request request) open_view(view, request, OPEN_DEFAULT); break; + case REQ_VIEW_STATUS: + if (opt_is_inside_work_tree == FALSE) { + report("The status view requires a working tree"); + break; + } + open_view(view, request, OPEN_DEFAULT); + break; + case REQ_VIEW_MAIN: case REQ_VIEW_DIFF: case REQ_VIEW_LOG: case REQ_VIEW_TREE: case REQ_VIEW_HELP: - case REQ_VIEW_STATUS: open_view(view, request, OPEN_DEFAULT); break; @@ -2279,6 +2295,10 @@ view_driver(struct view *view, enum request request) report(""); break; } + case REQ_REFRESH: + report("Refreshing is not yet supported for the %s view", view->name); + break; + case REQ_TOGGLE_LINENO: opt_line_number = !opt_line_number; redraw_display(); @@ -2628,6 +2648,9 @@ help_open(struct view *view) for (i = 0; i < ARRAY_SIZE(req_info); i++) { char *key; + if (req_info[i].request == REQ_NONE) + continue; + if (!req_info[i].request) { add_line_text(view, "", LINE_DEFAULT); add_line_text(view, req_info[i].help, LINE_DEFAULT); @@ -2635,6 +2658,9 @@ help_open(struct view *view) } key = get_key(req_info[i].request); + if (!*key) + key = "(no key defined)"; + if (!string_format(buf, " %-25s %s", key, req_info[i].help)) continue; @@ -3046,12 +3072,13 @@ status_open(struct view *view) struct stat statbuf; char exclude[SIZEOF_STR]; char cmd[SIZEOF_STR]; + unsigned long prev_lineno = view->lineno; size_t i; for (i = 0; i < view->lines; i++) free(view->line[i].data); free(view->line); - view->lines = view->line_size = 0; + view->lines = view->line_size = view->lineno = 0; view->line = NULL; if (!realloc_lines(view, view->line_size + 6)) @@ -3075,6 +3102,13 @@ status_open(struct view *view) !status_run(view, cmd, FALSE, LINE_STAT_UNTRACKED)) return FALSE; + /* If all went well restore the previous line number to stay in + * the context. */ + if (prev_lineno < view->lines) + view->lineno = prev_lineno; + else + view->lineno = view->lines - 1; + return TRUE; } @@ -3304,13 +3338,18 @@ status_request(struct view *view, enum request request, struct line *line) if (!status) return request; - open_editor(view, status->name); + open_editor(status->status != '?', status->name); + open_view(view, REQ_VIEW_STATUS, OPEN_RELOAD); break; case REQ_ENTER: status_enter(view, line); break; + case REQ_REFRESH: + open_view(view, REQ_VIEW_STATUS, OPEN_RELOAD); + break; + default: return request; } @@ -3538,7 +3577,7 @@ stage_request(struct view *view, enum request request, struct line *line) if (!stage_status.name[0]) return request; - open_editor(view, stage_status.name); + open_editor(stage_status.status != '?', stage_status.name); break; case REQ_ENTER: @@ -4256,6 +4295,21 @@ report(const char *msg, ...) if (input_mode) return; + if (!view) { + char buf[SIZEOF_STR]; + va_list args; + + va_start(args, msg); + if (vsnprintf(buf, sizeof(buf), msg, args) >= sizeof(buf)) { + buf[sizeof(buf) - 1] = 0; + buf[sizeof(buf) - 2] = '.'; + buf[sizeof(buf) - 3] = '.'; + buf[sizeof(buf) - 4] = '.'; + } + va_end(args); + die("%s", buf); + } + if (!status_empty || *msg) { va_list args; @@ -4535,10 +4589,21 @@ load_repo_config(void) static int read_repo_info(char *name, size_t namelen, char *value, size_t valuelen) { - if (!opt_git_dir[0]) + if (!opt_git_dir[0]) { string_ncopy(opt_git_dir, name, namelen); - else + + } else if (opt_is_inside_work_tree == -1) { + /* This can be 3 different values depending on the + * version of git being used. If git-rev-parse does not + * understand --is-inside-work-tree it will simply echo + * the option else either "true" or "false" is printed. + * Default to true for the unknown case. */ + opt_is_inside_work_tree = strcmp(name, "false") ? TRUE : FALSE; + + } else { string_ncopy(opt_cdup, name, namelen); + } + return OK; } @@ -4547,7 +4612,7 @@ read_repo_info(char *name, size_t namelen, char *value, size_t valuelen) static int load_repo_info(void) { - return read_properties(popen("git rev-parse --git-dir --show-cdup 2>/dev/null", "r"), + return read_properties(popen("git rev-parse --git-dir --is-inside-work-tree --show-cdup 2>/dev/null", "r"), "=", read_repo_info); }