index 65973d2bcb4ea659170d73ee25f9782b6082953d..b0032ea67a9fd869b658fa3e984c38007a6250d6 100644 (file)
--- a/tig.c
+++ b/tig.c
static bool prompt_menu(const char *prompt, const struct menu_item *items, int *selected);
-enum graphic {
- GRAPHIC_ASCII = 0,
- GRAPHIC_DEFAULT,
- GRAPHIC_UTF8
-};
+#define GRAPHIC_ENUM(_) \
+ _(GRAPHIC, ASCII), \
+ _(GRAPHIC, DEFAULT), \
+ _(GRAPHIC, UTF_8)
-static const struct enum_map graphic_map[] = {
-#define GRAPHIC_(name) ENUM_MAP(#name, GRAPHIC_##name)
- GRAPHIC_(ASCII),
- GRAPHIC_(DEFAULT),
- GRAPHIC_(UTF8)
-#undef GRAPHIC_
-};
+DEFINE_ENUM(graphic, GRAPHIC_ENUM);
-#define DATE_INFO \
- DATE_(NO), \
- DATE_(DEFAULT), \
- DATE_(LOCAL), \
- DATE_(RELATIVE), \
- DATE_(SHORT)
-
-enum date {
-#define DATE_(name) DATE_##name
- DATE_INFO
-#undef DATE_
-};
+#define DATE_ENUM(_) \
+ _(DATE, NO), \
+ _(DATE, DEFAULT), \
+ _(DATE, LOCAL), \
+ _(DATE, RELATIVE), \
+ _(DATE, SHORT)
-static const struct enum_map date_map[] = {
-#define DATE_(name) ENUM_MAP(#name, DATE_##name)
- DATE_INFO
-#undef DATE_
-};
+DEFINE_ENUM(date, DATE_ENUM);
struct time {
time_t sec;
}
-#define AUTHOR_VALUES \
- AUTHOR_(NO), \
- AUTHOR_(FULL), \
- AUTHOR_(ABBREVIATED)
+#define AUTHOR_ENUM(_) \
+ _(AUTHOR, NO), \
+ _(AUTHOR, FULL), \
+ _(AUTHOR, ABBREVIATED)
-enum author {
-#define AUTHOR_(name) AUTHOR_##name
- AUTHOR_VALUES,
-#undef AUTHOR_
- AUTHOR_DEFAULT = AUTHOR_FULL
-};
-
-static const struct enum_map author_map[] = {
-#define AUTHOR_(name) ENUM_MAP(#name, AUTHOR_##name)
- AUTHOR_VALUES
-#undef AUTHOR_
-};
+DEFINE_ENUM(author, AUTHOR_ENUM);
static const char *
get_author_initials(const char *author)
unsigned char bytes;
size_t i;
- while (is_initial_sep(*author))
+ while (author < end && is_initial_sep(*author))
author++;
bytes = utf8_char_length(author, end);
- if (bytes < sizeof(initials) - 1 - pos) {
- while (bytes--) {
- initials[pos++] = *author++;
- }
+ if (bytes >= sizeof(initials) - 1 - pos)
+ break;
+ while (bytes--) {
+ initials[pos++] = *author++;
}
- for (i = pos; author < end && !is_initial_sep(*author); author++) {
- if (i < sizeof(initials) - 1)
- initials[i++] = *author;
+ i = pos;
+ while (author < end && !is_initial_sep(*author)) {
+ bytes = utf8_char_length(author, end);
+ if (bytes >= sizeof(initials) - 1 - i) {
+ while (author < end && !is_initial_sep(*author))
+ author++;
+ break;
+ }
+ while (bytes--) {
+ initials[i++] = *author++;
+ }
}
initials[i++] = 0;
return initials;
}
+#define author_trim(cols) (cols == 0 || cols > 5)
+
+static const char *
+mkauthor(const char *text, int cols, enum author author)
+{
+ bool trim = author_trim(cols);
+ bool abbreviate = author == AUTHOR_ABBREVIATED || !trim;
+
+ if (author == AUTHOR_NO)
+ return "";
+ if (abbreviate && text)
+ return get_author_initials(text);
+ return text;
+}
+
+static const char *
+mkmode(mode_t mode)
+{
+ if (S_ISDIR(mode))
+ return "drwxr-xr-x";
+ else if (S_ISLNK(mode))
+ return "lrwxrwxrwx";
+ else if (S_ISGITLINK(mode))
+ return "m---------";
+ else if (S_ISREG(mode) && mode & S_IXUSR)
+ return "-rwxr-xr-x";
+ else if (S_ISREG(mode))
+ return "-rw-r--r--";
+ else
+ return "----------";
+}
+
/*
* User requests
/* Option and state variables. */
static enum graphic opt_line_graphics = GRAPHIC_DEFAULT;
static enum date opt_date = DATE_DEFAULT;
-static enum author opt_author = AUTHOR_DEFAULT;
+static enum author opt_author = AUTHOR_FULL;
static bool opt_rev_graph = TRUE;
static bool opt_line_number = FALSE;
static bool opt_show_refs = TRUE;
{ 'e', REQ_EDIT },
};
-#define KEYMAP_INFO \
- KEYMAP_(GENERIC), \
- KEYMAP_(MAIN), \
- KEYMAP_(DIFF), \
- KEYMAP_(LOG), \
- KEYMAP_(TREE), \
- KEYMAP_(BLOB), \
- KEYMAP_(BLAME), \
- KEYMAP_(BRANCH), \
- KEYMAP_(PAGER), \
- KEYMAP_(HELP), \
- KEYMAP_(STATUS), \
- KEYMAP_(STAGE)
-
-enum keymap {
-#define KEYMAP_(name) KEYMAP_##name
- KEYMAP_INFO
-#undef KEYMAP_
-};
+#define KEYMAP_ENUM(_) \
+ _(KEYMAP, GENERIC), \
+ _(KEYMAP, MAIN), \
+ _(KEYMAP, DIFF), \
+ _(KEYMAP, LOG), \
+ _(KEYMAP, TREE), \
+ _(KEYMAP, BLOB), \
+ _(KEYMAP, BLAME), \
+ _(KEYMAP, BRANCH), \
+ _(KEYMAP, PAGER), \
+ _(KEYMAP, HELP), \
+ _(KEYMAP, STATUS), \
+ _(KEYMAP, STAGE)
-static const struct enum_map keymap_table[] = {
-#define KEYMAP_(name) ENUM_MAP(#name, KEYMAP_##name)
- KEYMAP_INFO
-#undef KEYMAP_
-};
+DEFINE_ENUM(keymap, KEYMAP_ENUM);
-#define set_keymap(map, name) map_enum(map, keymap_table, name)
+#define set_keymap(map, name) map_enum(map, keymap_map, name)
struct keybinding_table {
struct keybinding *data;
size_t size;
};
-static struct keybinding_table keybindings[ARRAY_SIZE(keymap_table)];
+static struct keybinding_table keybindings[ARRAY_SIZE(keymap_map)];
static void
add_keybinding(enum keymap keymap, enum request request, int key)
VIEW_(BRANCH, "branch", &branch_ops, TRUE, ref_head),
VIEW_(HELP, "help", &help_ops, FALSE, ""),
VIEW_(PAGER, "pager", &pager_ops, FALSE, ""),
- VIEW_(STATUS, "status", &status_ops, TRUE, ""),
+ VIEW_(STATUS, "status", &status_ops, TRUE, "status"),
VIEW_(STAGE, "stage", &stage_ops, TRUE, ""),
};
static bool
draw_author(struct view *view, const char *author)
{
- bool trim = opt_author_cols == 0 || opt_author_cols > 5;
- bool abbreviate = opt_author == AUTHOR_ABBREVIATED || !trim;
+ bool trim = author_trim(opt_author_cols);
+ const char *text = mkauthor(author, opt_author_cols, opt_author);
if (opt_author == AUTHOR_NO)
return FALSE;
- if (abbreviate && author)
- author = get_author_initials(author);
-
- return draw_field(view, LINE_AUTHOR, author, opt_author_cols, trim);
+ return draw_field(view, LINE_AUTHOR, text, opt_author_cols, trim);
}
static bool
draw_mode(struct view *view, mode_t mode)
{
- const char *str;
-
- if (S_ISDIR(mode))
- str = "drwxr-xr-x";
- else if (S_ISLNK(mode))
- str = "lrwxrwxrwx";
- else if (S_ISGITLINK(mode))
- str = "m---------";
- else if (S_ISREG(mode) && mode & S_IXUSR)
- str = "-rwxr-xr-x";
- else if (S_ISREG(mode))
- str = "-rw-r--r--";
- else
- str = "----------";
+ const char *str = mkmode(mode);
return draw_field(view, LINE_MODE, str, STRING_SIZE("-rw-r--r-- "), FALSE);
}
}
#define refresh_view(view) load_view(view, OPEN_REFRESH)
+#define reload_view(view) load_view(view, OPEN_RELOAD)
static void
split_view(struct view *prev, struct view *view)
* Help backend
*/
-static bool help_keymap_hidden[ARRAY_SIZE(keymap_table)];
+static bool help_keymap_hidden[ARRAY_SIZE(keymap_map)];
static bool
help_open_keymap_title(struct view *view, enum keymap keymap)
line = add_line_format(view, LINE_HELP_KEYMAP, "[%c] %s bindings",
help_keymap_hidden[keymap] ? '+' : '-',
- enum_name(keymap_table[keymap]));
+ enum_name(keymap_map[keymap]));
if (line)
line->other = keymap;
add_line_text(view, "Quick reference for tig keybindings:", LINE_DEFAULT);
add_line_text(view, "", LINE_DEFAULT);
- for (keymap = 0; keymap < ARRAY_SIZE(keymap_table); keymap++)
+ for (keymap = 0; keymap < ARRAY_SIZE(keymap_map); keymap++)
help_open_keymap(view, keymap);
return TRUE;
struct tree_entry *entry = line->data;
const char *text[] = {
entry->name,
- opt_author ? entry->author : "",
+ mkauthor(entry->author, opt_author_cols, opt_author),
mkdate(&entry->time, opt_date),
NULL
};
if (*opt_ref || !begin_update(view, opt_cdup, file_argv, flags)) {
const char *blame_cat_file_argv[] = {
- "git", "cat-file", "blob", path, NULL
+ "git", "cat-file", "blob", "%(ref):%(file)", NULL
};
- if (!string_format(path, "%s:%s", opt_ref, opt_file) ||
- !begin_update(view, opt_cdup, blame_cat_file_argv, flags))
+ if (!begin_update(view, opt_cdup, blame_cat_file_argv, flags))
return FALSE;
}
free(blame->commit);
}
- string_format(view->vid, "%s:%s", opt_ref, opt_file);
+ string_format(view->vid, "%s", opt_file);
string_format(view->ref, "%s ...", opt_file);
return TRUE;
string_copy(opt_file, blame->commit->filename);
if (blame->lineno)
view->lineno = blame->lineno;
- refresh_view(view);
+ reload_view(view);
}
break;
string_copy_rev(opt_ref, blame->commit->parent_id);
string_copy(opt_file, blame->commit->parent_filename);
setup_blame_parent_line(view, blame);
- refresh_view(view);
+ reload_view(view);
}
break;
struct branch *branch = line->data;
const char *text[] = {
branch->ref->name,
- branch->author,
+ mkauthor(branch->author, opt_author_cols, opt_author),
NULL
};
struct commit *commit = line->data;
const char *text[] = {
commit->title,
- opt_author ? commit->author : "",
+ mkauthor(commit->author, opt_author_cols, opt_author),
mkdate(&commit->time, opt_date),
NULL
};