**/
#ifndef VERSION
-#define VERSION "tig-0.1"
+#define VERSION "tig-0.3"
#endif
#ifndef DEBUG
*/
static inline void
-string_ncopy(char *dst, char *src, int dstlen)
+string_ncopy(char *dst, const char *src, int dstlen)
{
strncpy(dst, src, dstlen - 1);
dst[dstlen - 1] = 0;
{
char c;
-#define BUFPUT(x) ( (bufsize < SIZEOF_CMD) && (buf[bufsize++] = (x)) )
+#define BUFPUT(x) do { if (bufsize < SIZEOF_CMD) buf[bufsize++] = (x); } while (0)
BUFPUT('\'');
while ((c = *src++)) {
};
struct line_info {
- char *line; /* The start of line to match. */
+ const char *line; /* The start of line to match. */
int linelen; /* Size of string to match. */
int fg, bg, attr; /* Color and text attributes for the lines. */
};
**/
#define TIG_LS_REMOTE \
- "git ls-remote ."
+ "git ls-remote . 2>/dev/null"
/**
* [[view-commands]]
/* ... silently ignore that the following are also exported. */
#define TIG_HELP_CMD \
- "man tig 2> /dev/null"
+ "man tig 2>/dev/null"
#define TIG_PAGER_CMD \
""
*
* The main view::
* Is the default view, and it shows a one line summary of each commit
- * in the chosen list of revision. The summary includes commit date,
+ * in the chosen list of revisions. The summary includes commit date,
* author, and the first line of the log message. Additionally, any
* repository references, such as tags, will be shown.
*
struct view {
const char *name; /* View name */
- char *cmd_fmt; /* Default command line format */
- char *cmd_env; /* Command line set via environment */
- char *id; /* Points to either of ref_{head,commit} */
+ const char *cmd_fmt; /* Default command line format */
+ const char *cmd_env; /* Command line set via environment */
+ const char *id; /* Points to either of ref_{head,commit} */
size_t objsize; /* Size of objects in the line index */
struct view_ops {
/* What type of content being displayed. Used in the
* title bar. */
- char *type;
+ const char *type;
/* Draw one line; @lineno must be < view->height. */
bool (*draw)(struct view *view, unsigned int lineno);
/* Read one line; updates view->line. */
}
static void
+update_view_title(struct view *view)
+{
+ if (view == display[current_view])
+ wbkgdset(view->title, get_line_attr(LINE_TITLE_FOCUS));
+ else
+ wbkgdset(view->title, get_line_attr(LINE_TITLE_BLUR));
+
+ werase(view->title);
+ wmove(view->title, 0, 0);
+
+ /* [main] ref: 334b506... - commit 6 of 4383 (0%) */
+
+ if (*view->ref)
+ wprintw(view->title, "[%s] %s", view->name, view->ref);
+ else
+ wprintw(view->title, "[%s]", view->name);
+
+ if (view->lines) {
+ wprintw(view->title, " - %s %d of %d (%d%%)",
+ view->ops->type,
+ view->lineno + 1,
+ view->lines,
+ (view->lineno + 1) * 100 / view->lines);
+ }
+
+ wrefresh(view->title);
+}
+
+static void
resize_display(void)
{
int offset, i;
}
static void
-update_view_title(struct view *view)
+redraw_display(void)
{
- if (view == display[current_view])
- wbkgdset(view->title, get_line_attr(LINE_TITLE_FOCUS));
- else
- wbkgdset(view->title, get_line_attr(LINE_TITLE_BLUR));
-
- werase(view->title);
- wmove(view->title, 0, 0);
-
- /* [main] ref: 334b506... - commit 6 of 4383 (0%) */
-
- if (*view->ref)
- wprintw(view->title, "[%s] %s", view->name, view->ref);
- else
- wprintw(view->title, "[%s]", view->name);
+ struct view *view;
+ int i;
- if (view->lines) {
- wprintw(view->title, " - %s %d of %d (%d%%)",
- view->ops->type,
- view->lineno + 1,
- view->lines,
- (view->lineno + 1) * 100 / view->lines);
+ foreach_view (view, i) {
+ redraw_view(view);
+ update_view_title(view);
}
-
- wrefresh(view->title);
}
+
/*
* Navigation
*/
static bool
begin_update(struct view *view)
{
- char *id = view->id;
+ const char *id = view->id;
if (opt_cmd[0]) {
string_copy(view->cmd, opt_cmd);
* invalid so clear it. */
view->ref[0] = 0;
} else {
- char *format = view->cmd_env ? view->cmd_env : view->cmd_fmt;
+ const char *format = view->cmd_env ? view->cmd_env : view->cmd_fmt;
if (snprintf(view->cmd, sizeof(view->cmd), format,
id, id, id, id, id) >= sizeof(view->cmd))
time_t secs = time(NULL) - view->start_time;
if (view == VIEW(REQ_VIEW_HELP)) {
- char *msg = TIG_HELP;
+ const char *msg = TIG_HELP;
if (view->lines == 0) {
/* Slightly ugly, but abusing view->ref keeps
}
case REQ_TOGGLE_LINE_NUMBERS:
opt_line_number = !opt_line_number;
- redraw_view(view);
- update_view_title(view);
+ redraw_display();
break;
case REQ_PROMPT:
resize_display();
/* Fall-through */
case REQ_SCREEN_REDRAW:
- foreach_view (view, i) {
- redraw_view(view);
- update_view_title(view);
- }
+ redraw_display();
break;
case REQ_SCREEN_UPDATE:
static int
load_refs(void)
{
- char *cmd_env = getenv("TIG_LS_REMOTE");
- char *cmd = cmd_env && *cmd_env ? cmd_env : TIG_LS_REMOTE;
+ const char *cmd_env = getenv("TIG_LS_REMOTE");
+ const char *cmd = cmd_env && *cmd_env ? cmd_env : TIG_LS_REMOTE;
FILE *pipe = popen(cmd, "r");
char buffer[BUFSIZ];
char *line;
pclose(pipe);
+ if (refs_size == 0)
+ die("Not a git repository");
+
return OK;
}
* Main
*/
-static void
+#if __GNUC__ >= 3
+#define __NORETURN __attribute__((__noreturn__))
+#else
+#define __NORETURN
+#endif
+
+static void __NORETURN
quit(int sig)
{
/* XXX: Restore tty modes and let the OS cleanup the rest! */
exit(0);
}
-static void die(const char *err, ...)
+static void __NORETURN
+die(const char *err, ...)
{
va_list args;
* If you are interested only in those revisions that made changes to a
* specific file (or even several files) list the files like this:
*
- * $ tig log Makefile
+ * $ tig log Makefile README
*
* To avoid ambiguity with repository references such as tag name, be sure
* to separate file names from other git options using "\--". So if you
* have a file named 'master' it will clash with the reference named
* 'master', and thus you will have to use:
*
- * $ tag log -- master
+ * $ tig log -- master
*
* NOTE: For the main view, avoiding ambiguity will in some cases require
* you to specify two "\--" options. The first will make tig(1) stop
* If you are only interested in changed that happened between two dates
* you can use:
*
- * $ tig -- --after=may.5th --before=2006-05-16.15:44
+ * $ tig -- --after="May 5th" --before="2006-05-16 15:44"
*
- * NOTE: The dot (".") is used as a separator instead of a space to avoid
- * having to quote the option value.
+ * NOTE: If you want to avoid having to quote dates containing spaces you
+ * can use "." instead, e.g. `--after=May.5th`.
*
* Limiting by commit ranges
* ~~~~~~~~~~~~~~~~~~~~~~~~~
* link:http://www.kernel.org/pub/software/scm/git/docs/[git(7)],
* link:http://www.kernel.org/pub/software/scm/cogito/docs/[cogito(7)]
* gitk(1): git repository browser written using tcl/tk,
+ * qgit(1): git repository browser written using c++/Qt,
* gitview(1): git repository browser written using python/gtk.
**/