SIZEOF_REV introduced: 41 bytes of pure madness!
[tig] / tig.c
diff --git a/tig.c b/tig.c
index 72d57cc..711b9ad 100644 (file)
--- a/tig.c
+++ b/tig.c
@@ -59,6 +59,7 @@ static size_t utf8_length(const char *string, size_t max_width, int *coloffset,
 
 #define SIZEOF_STR     1024    /* Default string size. */
 #define SIZEOF_REF     256     /* Size of symbolic or SHA1 ID. */
+#define SIZEOF_REV     41      /* Holds a SHA-1 and an ending NUL */
 #define SIZEOF_REVGRAPH        19      /* Size of revision ancestry graphics. */
 
 /* This color name can be used to refer to the default term colors. */
@@ -109,7 +110,7 @@ static size_t utf8_length(const char *string, size_t max_width, int *coloffset,
 
 struct ref {
        char *name;             /* Ref name; tag or head names are shortened. */
-       char id[41];            /* Commit SHA1 ID */
+       char id[SIZEOF_REV];    /* Commit SHA1 ID */
        unsigned int tag:1;     /* Is it a tag? */
        unsigned int next:1;    /* For ref lists: are there more refs? */
 };
@@ -565,6 +566,7 @@ LINE(TREE,     "tree ",             COLOR_BLUE,     COLOR_DEFAULT,  0), \
 LINE(AUTHOR,      "author ",           COLOR_CYAN,     COLOR_DEFAULT,  0), \
 LINE(COMMITTER,           "committer ",        COLOR_MAGENTA,  COLOR_DEFAULT,  0), \
 LINE(SIGNOFF,     "    Signed-off-by", COLOR_YELLOW,   COLOR_DEFAULT,  0), \
+LINE(ACKED,       "    Acked-by",      COLOR_YELLOW,   COLOR_DEFAULT,  0), \
 LINE(DEFAULT,     "",                  COLOR_DEFAULT,  COLOR_DEFAULT,  A_NORMAL), \
 LINE(CURSOR,      "",                  COLOR_WHITE,    COLOR_GREEN,    A_BOLD), \
 LINE(STATUS,      "",                  COLOR_GREEN,    COLOR_DEFAULT,  0), \
@@ -1523,7 +1525,7 @@ scroll_view(struct view *view, enum request request)
 static void
 move_view(struct view *view, enum request request)
 {
-       bool scroll = FALSE;
+       int scroll_steps = 0;
        int steps;
 
        switch (request) {
@@ -1573,19 +1575,18 @@ move_view(struct view *view, enum request request)
        /* Check whether the view needs to be scrolled */
        if (view->lineno < view->offset ||
            view->lineno >= view->offset + view->height) {
+               scroll_steps = steps;
                if (steps < 0 && -steps > view->offset) {
-                       steps = -view->offset;
+                       scroll_steps = -view->offset;
 
                } else if (steps > 0) {
                        if (view->lineno == view->lines - 1 &&
                            view->lines > view->height) {
-                               steps = view->lines - view->offset - 1;
-                               if (steps >= view->height)
-                                       steps -= view->height - 1;
+                               scroll_steps = view->lines - view->offset - 1;
+                               if (scroll_steps >= view->height)
+                                       scroll_steps -= view->height - 1;
                        }
                }
-
-               scroll = TRUE;
        }
 
        if (!view_is_displayed(view)) {
@@ -1598,8 +1599,8 @@ move_view(struct view *view, enum request request)
        if (ABS(steps) < view->height)
                draw_view_line(view, view->lineno - steps - view->offset);
 
-       if (scroll) {
-               do_scroll_view(view, steps);
+       if (scroll_steps) {
+               do_scroll_view(view, scroll_steps);
                return;
        }
 
@@ -2447,7 +2448,7 @@ static struct view_ops pager_ops = {
  * Tree backend
  */
 
-/* Parse output from git ls-tree:
+/* Parse output from git-ls-tree(1):
  *
  * 100644 blob fb0e31ea6cc679b7379631188190e975f5789c26        Makefile
  * 100644 blob 5304ca4260aaddaee6498f9630e7d471b8591ea6        README
@@ -2557,8 +2558,7 @@ tree_read(struct view *view, char *text)
 static bool
 tree_enter(struct view *view, struct line *line)
 {
-       enum open_flags flags = OPEN_DEFAULT;
-       char *data = line->data;
+       enum open_flags flags = display[0] == view ? OPEN_SPLIT : OPEN_DEFAULT;
        enum request request;
 
        switch (line->type) {
@@ -2577,6 +2577,7 @@ tree_enter(struct view *view, struct line *line)
                } 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)) {
@@ -2592,10 +2593,6 @@ tree_enter(struct view *view, struct line *line)
                break;
 
        case LINE_TREE_FILE:
-               /* This causes the blob view to become split, and not having it
-                * in the tree dir case will make the blob view automatically
-                * disappear when moving to a different directory. */
-               flags |= OPEN_SPLIT;
                request = REQ_VIEW_BLOB;
                break;
 
@@ -2605,29 +2602,27 @@ tree_enter(struct view *view, struct line *line)
 
        open_view(view, request, flags);
 
-       if (!VIEW(request)->pipe)
-               return TRUE;
-
-       /* For tree views insert the path to the parent as the first line. */
-       if (request == REQ_VIEW_BLOB) {
-               /* Mirror what is showed in the title bar. */
-               string_ncopy(ref_blob, data + STRING_SIZE("100644 blob "), 40);
-               string_copy(VIEW(REQ_VIEW_BLOB)->ref, ref_blob);
-               return TRUE;
-       }
-
        return TRUE;
 }
 
 static void
 tree_select(struct view *view, struct line *line)
 {
-       if (line->type == LINE_TREE_DIR || line->type == LINE_TREE_FILE) {
-               char *text = line->data;
+       char *text = line->data;
 
-               string_ncopy(view->ref, text + STRING_SIZE("100644 blob "), 40);
-               string_copy(ref_blob, view->ref);
+       text += STRING_SIZE("100644 blob ");
+
+       if (line->type == LINE_TREE_FILE) {
+               string_ncopy(ref_blob, text, 40);
+               /* Also update the blob view's ref, since all there must always
+                * be in sync. */
+               string_copy(VIEW(REQ_VIEW_BLOB)->ref, ref_blob);
+
+       } else if (line->type != LINE_TREE_DIR) {
+               return;
        }
+
+       string_ncopy(view->ref, text, 40);
 }
 
 static struct view_ops tree_ops = {
@@ -2665,7 +2660,7 @@ static struct view_ops blob_ops = {
  */
 
 struct commit {
-       char id[41];                    /* SHA1 ID. */
+       char id[SIZEOF_REV];            /* SHA1 ID. */
        char title[75];                 /* First line of the commit message. */
        char author[75];                /* Author of the commit. */
        struct tm time;                 /* Date from the author ident. */