index 32f4b648493b2bbfb4aacf16de78ff0240f22e08..b17d8dd07b50607a0a40c44c4ba236aa76810e4a 100644 (file)
--- a/tig.c
+++ b/tig.c
return !env || argv_from_string(argv, &argc, env);
}
+static void
+argv_free(const char *argv[])
+{
+ int argc;
+
+ for (argc = 0; argv[argc]; argc++)
+ free((void *) argv[argc]);
+}
+
/*
* Executing external commands.
}
static bool
-io_run_append(const char **argv, enum format_flags flags, int fd)
+io_run_append(const char **argv, int fd)
{
struct io io = {};
- if (!io_format(&io, NULL, IO_AP, argv, flags)) {
+ if (!io_format(&io, NULL, IO_AP, argv, FORMAT_NONE)) {
close(fd);
return FALSE;
}
}
static bool
-io_run_rd(struct io *io, const char **argv, const char *dir, enum format_flags flags)
+io_run_rd(struct io *io, const char **argv, const char *dir)
{
- return io_format(io, dir, IO_RD, argv, flags) && io_start(io);
+ return io_format(io, dir, IO_RD, argv, FORMAT_NONE) && io_start(io);
}
static bool
{
struct io io = {};
- return io_run_rd(&io, argv, NULL, FORMAT_NONE)
- && io_read_buf(&io, buf, bufsize);
+ return io_run_rd(&io, argv, NULL) && io_read_buf(&io, buf, bufsize);
}
static int
enum keymap keymap; /* What keymap does this view have */
bool git_dir; /* Whether the view requires a git directory. */
- bool refresh; /* Whether the view supports refreshing. */
char ref[SIZEOF_REF]; /* Hovered commit reference */
char vid[SIZEOF_REF]; /* View ID. Set to id member when updating. */
static struct view_ops tree_ops;
static struct view_ops branch_ops;
-#define VIEW_STR(type, name, env, ref, ops, map, git, refresh) \
- { type, name, #env, ref, ops, map, git, refresh }
+#define VIEW_STR(type, name, env, ref, ops, map, git) \
+ { type, name, #env, ref, ops, map, git }
-#define VIEW_(id, name, ops, git, refresh, ref) \
- VIEW_STR(VIEW_##id, name, TIG_##id##_CMD, ref, ops, KEYMAP_##id, git, refresh)
+#define VIEW_(id, name, ops, git, ref) \
+ VIEW_STR(VIEW_##id, name, TIG_##id##_CMD, ref, ops, KEYMAP_##id, git)
static struct view views[] = {
- VIEW_(MAIN, "main", &main_ops, TRUE, TRUE, ref_head),
- VIEW_(DIFF, "diff", &diff_ops, TRUE, FALSE, ref_commit),
- VIEW_(LOG, "log", &log_ops, TRUE, TRUE, ref_head),
- VIEW_(TREE, "tree", &tree_ops, TRUE, FALSE, ref_commit),
- VIEW_(BLOB, "blob", &blob_ops, TRUE, FALSE, ref_blob),
- VIEW_(BLAME, "blame", &blame_ops, TRUE, FALSE, ref_commit),
- VIEW_(BRANCH, "branch", &branch_ops, TRUE, TRUE, ref_head),
- VIEW_(HELP, "help", &help_ops, FALSE, FALSE, ""),
- VIEW_(PAGER, "pager", &pager_ops, FALSE, FALSE, "stdin"),
- VIEW_(STATUS, "status", &status_ops, TRUE, TRUE, ""),
- VIEW_(STAGE, "stage", &stage_ops, TRUE, TRUE, ""),
+ VIEW_(MAIN, "main", &main_ops, TRUE, ref_head),
+ VIEW_(DIFF, "diff", &diff_ops, TRUE, ref_commit),
+ VIEW_(LOG, "log", &log_ops, TRUE, ref_head),
+ VIEW_(TREE, "tree", &tree_ops, TRUE, ref_commit),
+ VIEW_(BLOB, "blob", &blob_ops, TRUE, ref_blob),
+ VIEW_(BLAME, "blame", &blame_ops, TRUE, ref_commit),
+ VIEW_(BRANCH, "branch", &branch_ops, TRUE, ref_head),
+ VIEW_(HELP, "help", &help_ops, FALSE, ""),
+ VIEW_(PAGER, "pager", &pager_ops, FALSE, "stdin"),
+ VIEW_(STATUS, "status", &status_ops, TRUE, ""),
+ VIEW_(STAGE, "stage", &stage_ops, TRUE, ""),
};
#define VIEW(req) (&views[(req) - REQ_OFFSET - 1])
#define view_is_displayed(view) \
(view == display[0] || view == display[1])
+static enum request
+view_request(struct view *view, enum request request)
+{
+ if (!view || !view->lines)
+ return request;
+ return view->ops->request(view, request, &view->line[view->lineno]);
+}
+
/*
* View drawing.
view->update_secs = 0;
}
-static void
-free_argv(const char *argv[])
-{
- int argc;
-
- for (argc = 0; argv[argc]; argc++)
- free((void *) argv[argc]);
-}
-
static const char *
format_arg(const char *name)
{
@@ -3187,7 +3193,7 @@ format_argv(const char *dst_argv[], const char *src_argv[], enum format_flags fl
int argc;
bool noreplace = flags == FORMAT_NONE;
- free_argv(dst_argv);
+ argv_free(dst_argv);
for (argc = 0; src_argv[argc]; argc++) {
const char *arg = src_argv[argc];
if (format_argv(argv, req->argv, FORMAT_ALL))
open_external_viewer(argv, NULL);
- free_argv(argv);
+ argv_free(argv);
}
/*
if (request > REQ_NONE) {
open_run_request(request);
- /* FIXME: When all views can refresh always do this. */
- if (view->refresh)
- request = REQ_REFRESH;
- else
- return TRUE;
+ view_request(view, REQ_REFRESH);
+ return TRUE;
}
- if (view && view->lines) {
- request = view->ops->request(view, request, &view->line[view->lineno]);
- if (request == REQ_NONE)
- return TRUE;
- }
+ request = view_request(view, request);
+ if (request == REQ_NONE)
+ return TRUE;
switch (request) {
case REQ_MOVE_UP:
if (view_is_displayed(view))
update_view_title(view);
if (line != view->lineno)
- view->ops->request(view, REQ_ENTER,
- &view->line[view->lineno]);
-
+ view_request(view, REQ_ENTER);
} else {
move_view(view, request);
}
return TRUE;
}
- if (!io_run_rd(&io, log_file, opt_cdup, FORMAT_NONE)) {
+ if (!io_run_rd(&io, log_file, opt_cdup)) {
report("Failed to load tree data");
return TRUE;
}
if (fd == -1)
report("Failed to create temporary file");
- else if (!io_run_append(blob_argv, FORMAT_NONE, fd))
+ else if (!io_run_append(blob_argv, fd))
report("Failed to save blob data to file");
else
open_editor(file);
* reading output from git-blame.
*/
-static const char *blame_head_argv[] = {
- "git", "blame", "--incremental", "--", "%(file)", NULL
-};
-
-static const char *blame_ref_argv[] = {
- "git", "blame", "--incremental", "%(ref)", "--", "%(file)", NULL
-};
-
-static const char *blame_cat_file_argv[] = {
- "git", "cat-file", "blob", "%(ref):%(file)", NULL
-};
-
struct blame_commit {
char id[SIZEOF_REV]; /* SHA1 ID. */
char title[128]; /* First line of the commit message. */
}
if (*opt_ref || !io_open(&view->io, "%s%s", opt_cdup, opt_file)) {
- if (!io_run_rd(&view->io, blame_cat_file_argv, opt_cdup, FORMAT_ALL))
+ const char *blame_cat_file_argv[] = {
+ "git", "cat-file", "blob", path, NULL
+ };
+
+ if (!string_format(path, "%s:%s", opt_ref, opt_file) ||
+ !io_run_rd(&view->io, blame_cat_file_argv, opt_cdup))
return FALSE;
}
blame_read_file(struct view *view, const char *line, bool *read_file)
{
if (!line) {
- const char **argv = *opt_ref ? blame_ref_argv : blame_head_argv;
+ const char *blame_argv[] = {
+ "git", "blame", "--incremental",
+ *opt_ref ? opt_ref : "--incremental", "--", opt_file, NULL
+ };
struct io io = {};
if (view->lines == 0 && !view->prev)
die("No blame exist for %s", view->vid);
- if (view->lines == 0 || !io_run_rd(&io, argv, opt_cdup, FORMAT_ALL)) {
+ if (view->lines == 0 || !io_run_rd(&io, blame_argv, opt_cdup)) {
report("Failed to load blame data");
return TRUE;
}
"--simplify-by-decoration", "--all", NULL
};
- if (!io_run_rd(&view->io, branch_log, NULL, FORMAT_NONE)) {
+ if (!io_run_rd(&view->io, branch_log, NULL)) {
report("Failed to load branch data");
return TRUE;
}