/* Copyright (c) 2006 Jonas Fonseca <fonseca@diku.dk>
*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
static void die(const char *err, ...);
static void report(const char *msg, ...);
-static int read_properties(const char *cmd, int separator, int (*read)(char *, int, char *, int));
+static int read_properties(FILE *pipe, int separator, int (*read)(char *, int, char *, int));
static void set_nonblocking_input(bool loading);
static size_t utf8_length(const char *string, size_t max_width, int *coloffset, int *trimmed);
" -l Start up in log view\n"
" -d Start up in diff view\n"
" -n[I], --line-number[=I] Show line numbers with given interval\n"
-" -t[N], --tab-size[=N] Set number of spaces for tab expansion\n"
+" -b[N], --tab-size[=N] Set number of spaces for tab expansion\n"
" -- Mark end of tig options\n"
" -v, --version Show version and exit\n"
" -h, --help Show help message and exit\n";
}
/**
- * -t[NSPACES], --tab-size[=NSPACES]::
+ * -b[NSPACES], --tab-size[=NSPACES]::
* Set the number of spaces tabs should be expanded to.
**/
- if (!strncmp(opt, "-t", 2) ||
+ if (!strncmp(opt, "-b", 2) ||
!strncmp(opt, "--tab-size", 10)) {
char *num = opt;
- if (opt[1] == 't') {
+ if (opt[1] == 'b') {
num = opt + 2;
} else if (opt[STRING_SIZE("--tab-size")] == '=') {
"git ls-remote . 2>/dev/null"
/**
- * [[view-commands]]
- * View commands
- * ~~~~~~~~~~~~~
+ * [[history-commands]]
+ * History commands
+ * ~~~~~~~~~~~~~~~~
* It is possible to alter which commands are used for the different views.
* If for example you prefer commits in the main view to be sorted by date
* and only show 500 commits, use:
* [main] c622eefaa485995320bc743431bae0d497b1d875 - commit 1 of 61 (1%)
*
* By default, the title of the current view is highlighted using bold font.
+ * For long loading views (taking over 3 seconds) the time since loading
+ * started will be appended:
+ *
+ * [main] 77d9e40fbcea3238015aea403e06f61542df9a31 - commit 1 of 779 (0%) 5s
**/
static void
break;
case REQ_STOP_LOADING:
- foreach_view (view, i) {
+ for (i = 0; i < ARRAY_SIZE(views); i++) {
+ view = &views[i];
if (view->pipe)
- report("Stopped loaded the %s view", view->name),
+ report("Stopped loading the %s view", view->name),
end_update(view);
}
break;
return TRUE;
case REQ_VIEW_CLOSE:
- if (view->parent) {
+ /* XXX: Mark closed views by letting view->parent point to the
+ * view itself. Parents to closed view should never be
+ * followed. */
+ if (view->parent &&
+ view->parent->parent != view->parent) {
memset(display, 0, sizeof(display));
current_view = 0;
display[current_view] = view->parent;
- view->parent = NULL;
+ view->parent = view;
resize_display();
redraw_display();
break;
const char *cmd_env = getenv("TIG_LS_REMOTE");
const char *cmd = cmd_env && *cmd_env ? cmd_env : TIG_LS_REMOTE;
- return read_properties(cmd, '\t', read_ref);
+ return read_properties(popen(cmd, "r"), '\t', read_ref);
}
static int
-read_config_option(char *name, int namelen, char *value, int valuelen)
+read_repo_config_option(char *name, int namelen, char *value, int valuelen)
{
if (!strcmp(name, "i18n.commitencoding")) {
string_copy(opt_encoding, value);
}
static int
-load_config(void)
+load_repo_config(void)
{
- return read_properties("git repo-config --list", '=',
- read_config_option);
+ return read_properties(popen("git repo-config --list", "r"),
+ "=", read_repo_config_option);
}
static int
-read_properties(const char *cmd, int separator,
+read_properties(FILE *pipe, int separator,
int (*read_property)(char *, int, char *, int))
{
- FILE *pipe = popen(cmd, "r");
char buffer[BUFSIZ];
char *name;
int state = OK;
/* Load the repo config file first so options can be overwritten from
* the command line. */
- if (load_config() == ERR)
+ if (load_repo_config() == ERR)
die("Failed to load repo config.");
if (!parse_options(argc, argv))
memcpy(opt_cmd, "git ", 4);
opt_request = REQ_VIEW_PAGER;
} else {
- request = ERR;
+ report("Prompt interrupted by loading view, "
+ "press 'z' to stop loading views");
+ request = REQ_SCREEN_UPDATE;
}
noecho();
*
* You can tune the interaction with git by making use of the options
* explained in this section. For example, by configuring the environment
- * variables described in the <<view-commands, "View commands">> section.
+ * variables described in the <<history-commands, "History commands">>
+ * section.
*
* Limit by path name
* ~~~~~~~~~~~~~~~~~~
* - The cursor can wrap-around on the last line and cause the
* window to scroll.
*
+ * - The prompt doesn't work while loading.
+ *
* TODO
* ----
* Features that should be explored.
* - link:http://www.kernel.org/pub/software/scm/cogito/docs/[cogito(7)]
*
* Other git repository browsers:
-*
+ *
* - gitk(1)
* - qgit(1)
* - gitview(1)