Merge branch 'master' of remote-server:src/tig
authorJonas Fonseca <fonseca@diku.dk>
Wed, 2 Apr 2008 22:01:15 +0000 (00:01 +0200)
committerJonas Fonseca <fonseca@diku.dk>
Wed, 2 Apr 2008 22:01:15 +0000 (00:01 +0200)
1  2 
tig.c

diff --combined tig.c
--- 1/tig.c
--- 2/tig.c
+++ b/tig.c
@@@ -143,12 -143,11 +143,12 @@@ static size_t utf8_length(const char *s
  struct ref {
        char *name;             /* Ref name; tag or head names are shortened. */
        char id[SIZEOF_REV];    /* Commit SHA1 ID */
 +      unsigned int head:1;    /* Is it the current HEAD? */
        unsigned int tag:1;     /* Is it a tag? */
        unsigned int ltag:1;    /* If so, is the tag local? */
        unsigned int remote:1;  /* Is it a remote ref? */
 +      unsigned int tracked:1; /* Is it the remote for the current HEAD? */
        unsigned int next:1;    /* For ref lists: are there more refs? */
 -      unsigned int head:1;    /* Is it the current HEAD? */
  };
  
  static struct ref **get_refs(char *id);
@@@ -332,6 -331,7 +332,7 @@@ sq_quote(char buf[SIZEOF_STR], size_t b
        REQ_(PREVIOUS,          "Move to previous"), \
        REQ_(VIEW_NEXT,         "Move focus to next view"), \
        REQ_(REFRESH,           "Reload and refresh"), \
+       REQ_(MAXIMIZE,          "Maximize the current view"), \
        REQ_(VIEW_CLOSE,        "Close the current view"), \
        REQ_(QUIT,              "Close all views and quit"), \
        \
@@@ -447,7 -447,6 +448,7 @@@ static char opt_path[SIZEOF_STR]   = ""
  static char opt_file[SIZEOF_STR]      = "";
  static char opt_ref[SIZEOF_REF]               = "";
  static char opt_head[SIZEOF_REF]      = "";
 +static char opt_remote[SIZEOF_REF]    = "";
  static bool opt_no_head                       = TRUE;
  static FILE *opt_pipe                 = NULL;
  static char opt_encoding[20]          = "UTF-8";
@@@ -591,11 -590,10 +592,11 @@@ LINE(MAIN_DATE,    "",                  COLOR_BLUE,     CO
  LINE(MAIN_AUTHOR,  "",                        COLOR_GREEN,    COLOR_DEFAULT,  0), \
  LINE(MAIN_COMMIT,  "",                        COLOR_DEFAULT,  COLOR_DEFAULT,  0), \
  LINE(MAIN_TAG,     "",                        COLOR_MAGENTA,  COLOR_DEFAULT,  A_BOLD), \
 -LINE(MAIN_LOCAL_TAG,"",                       COLOR_MAGENTA,  COLOR_DEFAULT,  A_BOLD), \
 -LINE(MAIN_REMOTE,  "",                        COLOR_YELLOW,   COLOR_DEFAULT,  A_BOLD), \
 -LINE(MAIN_REF,     "",                        COLOR_CYAN,     COLOR_DEFAULT,  A_BOLD), \
 -LINE(MAIN_HEAD,    "",                        COLOR_RED,      COLOR_DEFAULT,  A_BOLD), \
 +LINE(MAIN_LOCAL_TAG,"",                       COLOR_MAGENTA,  COLOR_DEFAULT,  0), \
 +LINE(MAIN_REMOTE,  "",                        COLOR_YELLOW,   COLOR_DEFAULT,  0), \
 +LINE(MAIN_TRACKED, "",                        COLOR_YELLOW,   COLOR_DEFAULT,  A_BOLD), \
 +LINE(MAIN_REF,     "",                        COLOR_CYAN,     COLOR_DEFAULT,  0), \
 +LINE(MAIN_HEAD,    "",                        COLOR_CYAN,     COLOR_DEFAULT,  A_BOLD), \
  LINE(MAIN_REVGRAPH,"",                        COLOR_MAGENTA,  COLOR_DEFAULT,  0), \
  LINE(TREE_DIR,     "",                        COLOR_DEFAULT,  COLOR_DEFAULT,  A_NORMAL), \
  LINE(TREE_FILE,    "",                        COLOR_DEFAULT,  COLOR_DEFAULT,  A_NORMAL), \
@@@ -733,6 -731,7 +734,7 @@@ static struct keybinding default_keybin
        { KEY_UP,       REQ_PREVIOUS },
        { KEY_DOWN,     REQ_NEXT },
        { 'R',          REQ_REFRESH },
+       { 'M',          REQ_MAXIMIZE },
  
        /* Cursor navigation */
        { 'k',          REQ_MOVE_UP },
@@@ -1440,7 -1439,8 +1442,8 @@@ static struct view views[] = 
        VIEW_(STAGE,  "stage",  &stage_ops,  TRUE,  ""),
  };
  
- #define VIEW(req) (&views[(req) - REQ_OFFSET - 1])
+ #define VIEW(req)     (&views[(req) - REQ_OFFSET - 1])
+ #define VIEW_REQ(view)        ((view) - views + REQ_OFFSET + 1)
  
  #define foreach_view(view, i) \
        for (i = 0; i < ARRAY_SIZE(views) && (view = &views[i]); i++)
@@@ -1482,6 -1482,43 +1485,43 @@@ draw_text(struct view *view, const cha
        return len;
  }
  
+ static int
+ draw_lineno(struct view *view, unsigned int lineno, int max, bool selected)
+ {
+       static char fmt[] = "%1ld";
+       char number[10] = "          ";
+       int max_number = MIN(view->digits, STRING_SIZE(number));
+       bool showtrimmed = FALSE;
+       int col;
+       lineno += view->offset + 1;
+       if (lineno == 1 || (lineno % opt_num_interval) == 0) {
+               if (view->digits <= 9)
+                       fmt[1] = '0' + view->digits;
+               if (!string_format(number, fmt, lineno))
+                       number[0] = 0;
+               showtrimmed = TRUE;
+       }
+       if (max < max_number)
+               max_number = max;
+       col = draw_text(view, number, max_number, showtrimmed, selected);
+       if (col < max) {
+               if (!selected)
+                       wattrset(view->win, A_NORMAL);
+               waddch(view->win, ACS_VLINE);
+               col++;
+       }
+       if (col < max) {
+               waddch(view->win, ' ');
+               col++;
+       }
+       return col;
+ }
  static bool
  draw_view_line(struct view *view, unsigned int lineno)
  {
@@@ -2590,6 -2627,11 +2630,11 @@@ view_driver(struct view *view, enum req
                report("Refreshing is not yet supported for the %s view", view->name);
                break;
  
+       case REQ_MAXIMIZE:
+               if (displayed_views() == 2)
+                       open_view(view, VIEW_REQ(view), OPEN_DEFAULT);
+               break;
        case REQ_TOGGLE_LINENO:
                opt_line_number = !opt_line_number;
                redraw_display();
  static bool
  pager_draw(struct view *view, struct line *line, unsigned int lineno, bool selected)
  {
+       static char spaces[] = "                    ";
        char *text = line->data;
        enum line_type type = line->type;
-       int attr;
+       int attr = A_NORMAL;
+       int col = 0;
  
        wmove(view->win, lineno, 0);
  
        if (selected) {
                type = LINE_CURSOR;
                wchgat(view->win, -1, 0, type, NULL);
+               attr = get_line_attr(type);
        }
-       attr = get_line_attr(type);
        wattrset(view->win, attr);
  
-       if (opt_line_number || opt_tab_size < TABSIZE) {
-               static char spaces[] = "                    ";
-               int col_offset = 0, col = 0;
-               if (opt_line_number) {
-                       unsigned long real_lineno = view->offset + lineno + 1;
-                       if (real_lineno == 1 ||
-                           (real_lineno % opt_num_interval) == 0) {
-                               wprintw(view->win, "%.*d", view->digits, real_lineno);
+       if (opt_line_number) {
+               col += draw_lineno(view, lineno, view->width, selected);
+               if (col >= view->width)
+                       return TRUE;
+       }
  
-                       } else {
-                               waddnstr(view->win, spaces,
-                                        MIN(view->digits, STRING_SIZE(spaces)));
-                       }
-                       waddstr(view->win, ": ");
-                       col_offset = view->digits + 2;
-               }
+       if (!selected) {
+               attr = get_line_attr(type);
+               wattrset(view->win, attr);
+       }
+       if (opt_tab_size < TABSIZE) {
+               int col_offset = col;
  
+               col = 0;
                while (text && col_offset + col < view->width) {
                        int cols_max = view->width - col_offset - col;
                        char *pos = text;
                }
  
        } else {
-               draw_text(view, text, view->width, TRUE, selected);
+               draw_text(view, text, view->width - col, TRUE, selected);
        }
  
        return TRUE;
@@@ -3594,43 -3632,13 +3635,13 @@@ blame_draw(struct view *view, struct li
        }
  
        {
-               unsigned long real_lineno = view->offset + lineno + 1;
-               char number[10] = "          ";
-               int max = MIN(view->digits, STRING_SIZE(number));
-               bool showtrimmed = FALSE;
-               if (real_lineno == 1 ||
-                   (real_lineno % opt_num_interval) == 0) {
-                       char fmt[] = "%1ld";
-                       if (view->digits <= 9)
-                               fmt[1] = '0' + view->digits;
-                       if (!string_format(number, fmt, real_lineno))
-                               number[0] = 0;
-                       showtrimmed = TRUE;
-               }
-               if (max > view->width - col)
-                       max = view->width - col;
                if (!selected)
                        wattrset(view->win, get_line_attr(LINE_BLAME_LINENO));
-               col += draw_text(view, number, max, showtrimmed, selected);
+               col += draw_lineno(view, lineno, view->width - col, selected);
                if (col >= view->width)
                        return TRUE;
        }
  
-       if (!selected)
-               wattrset(view->win, A_NORMAL);
-       if (col >= view->width)
-               return TRUE;
-       waddch(view->win, ACS_VLINE);
-       col++;
-       if (col >= view->width)
-               return TRUE;
-       waddch(view->win, ' ');
-       col++;
        col += draw_text(view, blame->text, view->width - col, TRUE, selected);
  
        return TRUE;
@@@ -3994,6 -4002,8 +4005,8 @@@ static boo
  status_draw(struct view *view, struct line *line, unsigned int lineno, bool selected)
  {
        struct status *status = line->data;
+       char *text;
+       int col = 0;
  
        wmove(view->win, lineno, 0);
  
        }
  
        if (!status) {
-               char *text;
                switch (line->type) {
                case LINE_STAT_STAGED:
                        text = "Changes to be committed:";
                default:
                        return FALSE;
                }
+       } else {
+               char buf[] = { status->status, ' ', ' ', ' ', 0 };
  
-               draw_text(view, text, view->width, TRUE, selected);
-               return TRUE;
+               col += draw_text(view, buf, view->width, TRUE, selected);
+               if (!selected)
+                       wattrset(view->win, A_NORMAL);
+               text = status->new.name;
        }
  
-       waddch(view->win, status->status);
-       if (!selected)
-               wattrset(view->win, A_NORMAL);
-       wmove(view->win, lineno, 4);
-       if (view->width < 5)
-               return TRUE;
-       draw_text(view, status->new.name, view->width - 5, TRUE, selected);
+       draw_text(view, text, view->width - col, TRUE, selected);
        return TRUE;
  }
  
@@@ -4895,8 -4900,6 +4903,8 @@@ main_draw(struct view *view, struct lin
                                wattrset(view->win, get_line_attr(LINE_MAIN_LOCAL_TAG));
                        else if (commit->refs[i]->tag)
                                wattrset(view->win, get_line_attr(LINE_MAIN_TAG));
 +                      else if (commit->refs[i]->tracked)
 +                              wattrset(view->win, get_line_attr(LINE_MAIN_TRACKED));
                        else if (commit->refs[i]->remote)
                                wattrset(view->win, get_line_attr(LINE_MAIN_REMOTE));
                        else
@@@ -5504,7 -5507,6 +5512,7 @@@ read_ref(char *id, size_t idlen, char *
        bool tag = FALSE;
        bool ltag = FALSE;
        bool remote = FALSE;
 +      bool tracked = FALSE;
        bool check_replace = FALSE;
        bool head = FALSE;
  
                remote = TRUE;
                namelen -= STRING_SIZE("refs/remotes/");
                name    += STRING_SIZE("refs/remotes/");
 +              tracked  = !strcmp(opt_remote, name);
  
        } else if (!strncmp(name, "refs/heads/", STRING_SIZE("refs/heads/"))) {
                namelen -= STRING_SIZE("refs/heads/");
  
        strncpy(ref->name, name, namelen);
        ref->name[namelen] = 0;
 +      ref->head = head;
        ref->tag = tag;
        ref->ltag = ltag;
        ref->remote = remote;
 -      ref->head = head;
 +      ref->tracked = tracked;
        string_copy_rev(ref->id, id);
  
        return OK;
@@@ -5587,28 -5587,6 +5595,28 @@@ read_repo_config_option(char *name, siz
        if (!strcmp(name, "core.editor"))
                string_ncopy(opt_editor, value, valuelen);
  
 +      /* branch.<head>.remote */
 +      if (*opt_head &&
 +          !strncmp(name, "branch.", 7) &&
 +          !strncmp(name + 7, opt_head, strlen(opt_head)) &&
 +          !strcmp(name + 7 + strlen(opt_head), ".remote"))
 +              string_ncopy(opt_remote, value, valuelen);
 +
 +      if (*opt_head && *opt_remote &&
 +          !strncmp(name, "branch.", 7) &&
 +          !strncmp(name + 7, opt_head, strlen(opt_head)) &&
 +          !strcmp(name + 7 + strlen(opt_head), ".merge")) {
 +              size_t from = strlen(opt_remote);
 +
 +              if (!strncmp(value, "refs/heads/", STRING_SIZE("refs/heads/"))) {
 +                      value += STRING_SIZE("refs/heads/");
 +                      valuelen -= STRING_SIZE("refs/heads/");
 +              }
 +
 +              if (!string_format_from(opt_remote, &from, "/%s", value))
 +                      opt_remote[0] = 0;
 +      }
 +
        return OK;
  }