chiark / gitweb /
Merge with master
authorJonas Fonseca <fonseca@diku.dk>
Sun, 3 Sep 2006 20:04:25 +0000 (22:04 +0200)
committerJonas Fonseca <fonseca@antimatter.localdomain>
Sun, 3 Sep 2006 20:04:25 +0000 (22:04 +0200)
Makefile
tig.c
tigrc.5.txt

index 42387c8bb4fbfd08b97186e4a57d3aa8f046e2d9..9d8c57ba761983a8f8b11cae0df8ea22b4d07fc4 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -9,7 +9,8 @@ CFLAGS  = -Wall -O2
 DFLAGS = -g -DDEBUG -Werror
 PROGS  = tig
 DOCS   = tig.1.html tig.1 tigrc.5.html tigrc.5 \
-         manual.toc manual.html manual.html-chunked README.html \
+         manual.toc manual.html manual.html-chunked manual.pdf \
+         README.html
 
 ifneq (,$(wildcard .git))
 VERSION = $(shell git-describe)
@@ -23,6 +24,7 @@ all-debug: CFLAGS += $(DFLAGS)
 doc: $(DOCS)
 
 install: all
+       mkdir -p $(DESTDIR)$(bindir) && \
        for prog in $(PROGS); do \
                install $$prog $(DESTDIR)$(bindir); \
        done
@@ -41,7 +43,7 @@ install-doc: doc
 
 clean:
        rm -rf manual.html-chunked
-       rm -f $(PROGS) $(DOCS) core
+       rm -f $(PROGS) $(DOCS) core *.xml
 
 spell-check:
        aspell --lang=en --check tig.1.txt tigrc.5.txt manual.txt
@@ -65,6 +67,9 @@ tig: tig.c
 README.html: README
        asciidoc -b xhtml11 -d article -a readme $<
 
+%.pdf : %.xml
+       docbook2pdf $<
+
 %.1.html : %.1.txt
        asciidoc -b xhtml11 -d manpage $<
 
diff --git a/tig.c b/tig.c
index 5ed2bb1c5113b20cc6ec03cbee810ef8fab44bf2..1ad19946bb6b2e32cfc369813d9047a08e2b1188 100644 (file)
--- a/tig.c
+++ b/tig.c
@@ -12,7 +12,7 @@
  */
 
 #ifndef        VERSION
-#define VERSION        "tig-0.3"
+#define VERSION        "tig-0.4.git"
 #endif
 
 #ifndef DEBUG
 #include <unistd.h>
 #include <time.h>
 
+#include <locale.h>
+#include <langinfo.h>
+#include <iconv.h>
+
 #include <curses.h>
 
 #if __GNUC__ >= 3
@@ -57,6 +61,8 @@ static size_t utf8_length(const char *string, size_t max_width, int *coloffset,
 /* This color name can be used to refer to the default term colors. */
 #define COLOR_DEFAULT  (-1)
 
+#define ICONV_NONE     ((iconv_t) -1)
+
 /* The format and size of the date column in the main view. */
 #define DATE_FORMAT    "%Y-%m-%d %H:%M"
 #define DATE_COLS      STRING_SIZE("2006-04-29 14:21 ")
@@ -74,13 +80,13 @@ static size_t utf8_length(const char *string, size_t max_width, int *coloffset,
        "git ls-remote . 2>/dev/null"
 
 #define TIG_DIFF_CMD \
-       "git show --patch-with-stat --find-copies-harder -B -C %s"
+       "git show --root --patch-with-stat --find-copies-harder -B -C %s 2>/dev/null"
 
 #define TIG_LOG_CMD    \
-       "git log --cc --stat -n100 %s"
+       "git log --cc --stat -n100 %s 2>/dev/null"
 
 #define TIG_MAIN_CMD \
-       "git log --topo-order --stat --pretty=raw %s"
+       "git log --topo-order --pretty=raw %s 2>/dev/null"
 
 /* XXX: Needs to be defined to the empty string. */
 #define TIG_HELP_CMD   ""
@@ -361,9 +367,11 @@ static int opt_num_interval        = NUMBER_INTERVAL;
 static int opt_tab_size                = TABSIZE;
 static enum request opt_request = REQ_VIEW_MAIN;
 static char opt_cmd[SIZEOF_CMD]        = "";
-static char opt_encoding[20]   = "";
-static bool opt_utf8           = TRUE;
 static FILE *opt_pipe          = NULL;
+static char opt_encoding[20]   = "UTF-8";
+static bool opt_utf8           = TRUE;
+static char opt_codeset[20]    = "UTF-8";
+static iconv_t opt_iconv       = ICONV_NONE;
 
 enum option_type {
        OPT_NONE,
@@ -679,7 +687,7 @@ static struct keybinding default_keybindings[] = {
        { 'v',          REQ_SHOW_VERSION },
        { 'r',          REQ_SCREEN_REDRAW },
        { 'n',          REQ_TOGGLE_LINENO },
-       { 'g',          REQ_TOGGLE_REV_GRAPH},
+       { 'g',          REQ_TOGGLE_REV_GRAPH },
        { ':',          REQ_PROMPT },
 
        /* wgetch() with nodelay() enabled returns ERR when there's no input. */
@@ -1616,7 +1624,8 @@ realloc_lines(struct view *view, size_t line_size)
 static bool
 update_view(struct view *view)
 {
-       char buffer[BUFSIZ];
+       char in_buffer[BUFSIZ];
+       char out_buffer[BUFSIZ * 2];
        char *line;
        /* The number of lines to read. If too low it will cause too much
         * redrawing (and possible flickering), if too high responsiveness
@@ -1634,12 +1643,28 @@ update_view(struct view *view)
        if (!realloc_lines(view, view->lines + lines))
                goto alloc_error;
 
-       while ((line = fgets(buffer, sizeof(buffer), view->pipe))) {
-               int linelen = strlen(line);
+       while ((line = fgets(in_buffer, sizeof(in_buffer), view->pipe))) {
+               size_t linelen = strlen(line);
 
                if (linelen)
                        line[linelen - 1] = 0;
 
+               if (opt_iconv != ICONV_NONE) {
+                       char *inbuf = line;
+                       size_t inlen = linelen;
+
+                       char *outbuf = out_buffer;
+                       size_t outlen = sizeof(out_buffer);
+
+                       size_t ret;
+
+                       ret = iconv(opt_iconv, &inbuf, &inlen, &outbuf, &outlen);
+                       if (ret != (size_t) -1) {
+                               line = out_buffer;
+                               linelen = strlen(out_buffer);
+                       }
+               }
+
                if (!view->ops->read(view, line))
                        goto alloc_error;
 
@@ -2286,10 +2311,22 @@ main_read(struct view *view, char *line)
                        break;
 
                if (end) {
+                       char *email = end + 1;
+
                        for (; end > ident && isspace(end[-1]); end--) ;
+
+                       if (end == ident && *email) {
+                               ident = email;
+                               end = strchr(ident, '>');
+                               for (; end > ident && isspace(end[-1]); end--) ;
+                       }
                        *end = 0;
                }
 
+               /* End is NULL or ident meaning there's no author. */
+               if (end <= ident)
+                       ident = "Unknown";
+
                string_copy(commit->author, ident);
 
                /* Parse epoch and timezone */
@@ -2583,6 +2620,8 @@ init_display(void)
                /* Leave stdin and stdout alone when acting as a pager. */
                FILE *io = fopen("/dev/tty", "r+");
 
+               if (!io)
+                       die("Failed to open /dev/tty");
                cursed = !!newterm(NULL, io, io);
        }
 
@@ -2665,7 +2704,10 @@ read_prompt(void)
        buf[pos++] = 0;
        if (!string_format(opt_cmd, "git %s", buf))
                return ERR;
-       opt_request = REQ_VIEW_PAGER;
+       if (strncmp(buf, "show", 4) && isspace(buf[4]))
+               opt_request = REQ_VIEW_DIFF;
+       else
+               opt_request = REQ_VIEW_PAGER;
 
        return OK;
 }
@@ -2877,6 +2919,10 @@ main(int argc, char *argv[])
 
        signal(SIGINT, quit);
 
+       if (setlocale(LC_ALL, "")) {
+               string_copy(opt_codeset, nl_langinfo(CODESET));
+       }
+
        if (load_options() == ERR)
                die("Failed to load user config.");
 
@@ -2888,6 +2934,12 @@ main(int argc, char *argv[])
        if (!parse_options(argc, argv))
                return 0;
 
+       if (*opt_codeset && strcmp(opt_codeset, opt_encoding)) {
+               opt_iconv = iconv_open(opt_codeset, opt_encoding);
+               if (opt_iconv == (iconv_t) -1)
+                       die("Failed to initialize character set conversion");
+       }
+
        if (load_refs() == ERR)
                die("Failed to load refs.");
 
index 5ae95b2c828c34c8ba65341e9ef513a96993a5b1..3b4b7a2740c4d6ad4480ae83bc31d78dd93336db 100644 (file)
@@ -150,7 +150,7 @@ ifdef::backend-xhtml11[]
 [frame="none"]
 `-----------------------`-----------------------------------------------------
 endif::backend-xhtml11[]
-View switching::
+View switching:
 ------------------------------------------------------------------------------
 view-main              Show main view
 view-diff              Show diff view
@@ -163,7 +163,7 @@ ifdef::backend-xhtml11[]
 [frame="none"]
 `-----------------------`-----------------------------------------------------
 endif::backend-xhtml11[]
-View manipulation::
+View manipulation:
 ------------------------------------------------------------------------------
 enter                  Enter current line and scroll
 next                   Move to next
@@ -177,7 +177,7 @@ ifdef::backend-xhtml11[]
 [frame="none"]
 `-----------------------`-----------------------------------------------------
 endif::backend-xhtml11[]
-Cursor navigation::
+Cursor navigation:
 ------------------------------------------------------------------------------
 move-up                        Move cursor one line up
 move-down              Move cursor one line down
@@ -191,7 +191,7 @@ ifdef::backend-xhtml11[]
 [frame="none"]
 `-----------------------`-----------------------------------------------------
 endif::backend-xhtml11[]
-Scrolling::
+Scrolling:
 ------------------------------------------------------------------------------
 scroll-line_up         Scroll one line up
 scroll-line_down       Scroll one line down
@@ -203,7 +203,7 @@ ifdef::backend-xhtml11[]
 [frame="none"]
 `-----------------------`-----------------------------------------------------
 endif::backend-xhtml11[]
-Misc::
+Misc:
 ------------------------------------------------------------------------------
 prompt                 Bring up the prompt
 screen-update          Update the screen