* GNU General Public License for more details.
*/
-#ifndef VERSION
-#define VERSION "unknown-version"
+#ifndef TIG_VERSION
+#define TIG_VERSION "unknown-version"
#endif
#ifndef DEBUG
#include <curses.h>
+#include "config.h"
+
#if __GNUC__ >= 3
#define __NORETURN __attribute__((__noreturn__))
#else
#define SCALE_SPLIT_VIEW(height) ((height) * 2 / 3)
+#ifndef GIT_CONFIG
+#define "git config"
+#endif
+
#define TIG_LS_REMOTE \
"git ls-remote $(git rev-parse --git-dir) 2>/dev/null"
*/
static const char usage[] =
-"tig " VERSION " (" __DATE__ ")\n"
+"tig " TIG_VERSION " (" __DATE__ ")\n"
"\n"
"Usage: tig [options]\n"
" or: tig [options] [--] [git log options]\n"
}
if (check_option(opt, 'v', "version", OPT_NONE)) {
- printf("tig version %s\n", VERSION);
+ printf("tig version %s\n", TIG_VERSION);
return FALSE;
}
/* When running random commands, initially show the
* command in the title. However, it maybe later be
* overwritten if a commit line is selected. */
- string_copy(view->ref, view->cmd);
+ if (view == VIEW(REQ_VIEW_PAGER))
+ string_copy(view->ref, view->cmd);
+ else
+ view->ref[0] = 0;
} else if (view == VIEW(REQ_VIEW_TREE)) {
const char *format = view->cmd_env ? view->cmd_env : view->cmd_fmt;
line[linelen - 1] = 0;
if (opt_iconv != ICONV_NONE) {
- char *inbuf = line;
+ ICONV_INBUF_TYPE inbuf = line;
size_t inlen = linelen;
char *outbuf = out_buffer;
if ((view == VIEW(REQ_VIEW_DIFF) &&
view->parent == VIEW(REQ_VIEW_MAIN)) ||
+ (view == VIEW(REQ_VIEW_DIFF) &&
+ view->parent == VIEW(REQ_VIEW_STATUS)) ||
(view == VIEW(REQ_VIEW_BLOB) &&
view->parent == VIEW(REQ_VIEW_TREE))) {
int line;
move_view(view, request);
if (view_is_displayed(view))
update_view_title(view);
- if (line == view->lineno)
- break;
+ if (line != view->lineno)
+ view->ops->request(view, REQ_ENTER,
+ &view->line[view->lineno]);
+
} else {
move_view(view, request);
- break;
}
- /* Fall-through */
-
+ break;
case REQ_VIEW_NEXT:
{
break;
case REQ_SHOW_VERSION:
- report("tig-%s (built %s)", VERSION, __DATE__);
+ report("tig-%s (built %s)", TIG_VERSION, __DATE__);
return TRUE;
case REQ_SCREEN_RESIZE:
* Tree backend
*/
+struct tree_stack_entry {
+ struct tree_stack_entry *prev; /* Entry below this in the stack */
+ unsigned long lineno; /* Line number to restore */
+ char *name; /* Position of name in opt_path */
+};
+
+/* The top of the path stack. */
+static struct tree_stack_entry *tree_stack = NULL;
+unsigned long tree_lineno = 0;
+
+static void
+pop_tree_stack_entry(void)
+{
+ struct tree_stack_entry *entry = tree_stack;
+
+ tree_lineno = entry->lineno;
+ entry->name[0] = 0;
+ tree_stack = entry->prev;
+ free(entry);
+}
+
+static void
+push_tree_stack_entry(char *name, unsigned long lineno)
+{
+ struct tree_stack_entry *entry = calloc(1, sizeof(*entry));
+ size_t pathlen = strlen(opt_path);
+
+ if (!entry)
+ return;
+
+ entry->prev = tree_stack;
+ entry->name = opt_path + pathlen;
+ tree_stack = entry;
+
+ if (!string_format_from(opt_path, &pathlen, "%s/", name)) {
+ pop_tree_stack_entry();
+ return;
+ }
+
+ /* Move the current line to the first tree entry. */
+ tree_lineno = 1;
+ entry->lineno = lineno;
+}
+
/* Parse output from git-ls-tree(1):
*
* 100644 blob fb0e31ea6cc679b7379631188190e975f5789c26 Makefile
if (!add_line_text(view, text, type))
return FALSE;
- /* Move the current line to the first tree entry. */
- if (first_read)
- view->lineno++;
+ if (tree_lineno > view->lineno) {
+ view->lineno = tree_lineno;
+ tree_lineno = 0;
+ }
return TRUE;
}
if (request != REQ_ENTER)
return request;
+ /* Cleanup the stack if the tree view is at a different tree. */
+ while (!*opt_path && tree_stack)
+ pop_tree_stack_entry();
+
switch (line->type) {
case LINE_TREE_DIR:
/* Depending on whether it is a subdir or parent (updir?) link
* mangle the path buffer. */
if (line == &view->line[1] && *opt_path) {
- size_t path_len = strlen(opt_path);
- char *dirsep = opt_path + path_len - 1;
-
- while (dirsep > opt_path && dirsep[-1] != '/')
- dirsep--;
-
- dirsep[0] = 0;
+ pop_tree_stack_entry();
} else {
- size_t pathlen = strlen(opt_path);
- size_t origlen = pathlen;
char *data = line->data;
char *basename = data + SIZEOF_TREE_ATTR;
- if (!string_format_from(opt_path, &pathlen, "%s/", basename)) {
- opt_path[origlen] = 0;
- return TRUE;
- }
+ push_tree_stack_entry(basename, view->lineno);
}
/* Trees and subtrees share the same ID, so they are not not
}
open_view(view, request, flags);
+ if (request == REQ_VIEW_TREE) {
+ view->lineno = tree_lineno;
+ }
return REQ_NONE;
}
static int
load_repo_config(void)
{
- return read_properties(popen("git repo-config --list", "r"),
+ return read_properties(popen(GIT_CONFIG " --list", "r"),
"=", read_repo_config_option);
}