Merge branch 'jk/diff'
authorJunio C Hamano <junkio@cox.net>
Mon, 18 Sep 2006 01:14:03 +0000 (18:14 -0700)
committerJunio C Hamano <junkio@cox.net>
Mon, 18 Sep 2006 01:14:03 +0000 (18:14 -0700)
* jk/diff:
wt-status: remove extraneous newline from 'deleted:' output
git-status: document colorization config options
Teach runstatus about --untracked
git-commit.sh: convert run_status to a C builtin
Move color option parsing out of diff.c and into color.[ch]
diff: support custom callbacks for output

1  2 
.gitignore
Makefile
builtin.h
diff.c
git.c
diff --combined .gitignore
index 90d6d7c667e414130e06bda7cebfc35b16b4b5c7,97592abba908f4d32ab8e9219907851665d12194..a3d9c7a11dc8e2807db377090fd1d4144aad0056
@@@ -8,7 -8,6 +8,7 @@@ git-appl
  git-applymbox
  git-applypatch
  git-archimport
 +git-archive
  git-bisect
  git-branch
  git-cat-file
@@@ -95,6 -94,7 +95,7 @@@ git-rev-lis
  git-rev-parse
  git-revert
  git-rm
+ git-runstatus
  git-send-email
  git-send-pack
  git-sh-setup
@@@ -119,7 -119,6 +120,7 @@@ git-unpack-object
  git-update-index
  git-update-ref
  git-update-server-info
 +git-upload-archive
  git-upload-pack
  git-upload-tar
  git-var
diff --combined Makefile
index b98745045cef3a5f8db62ee58cd5f936c13e0f5a,a9314ac900763c89e32e674e146dbd4a7365119a..69915d865168817f72c084f15930e41bf5b9ad45
+++ b/Makefile
@@@ -126,8 -126,6 +126,8 @@@ GITWEB_CONFIG = gitweb_config.per
  GITWEB_HOME_LINK_STR = projects
  GITWEB_SITENAME =
  GITWEB_PROJECTROOT = /pub/git
 +GITWEB_EXPORT_OK =
 +GITWEB_STRICT_EXPORT =
  GITWEB_BASE_URL =
  GITWEB_LIST =
  GITWEB_HOMETEXT = indextext.html
@@@ -234,8 -232,8 +234,8 @@@ LIB_FILE=libgit.
  XDIFF_LIB=xdiff/lib.a
  
  LIB_H = \
 -      blob.h cache.h commit.h csum-file.h delta.h \
 -      diff.h object.h pack.h pkt-line.h quote.h refs.h \
 +      archive.h blob.h cache.h commit.h csum-file.h delta.h \
 +      diff.h object.h pack.h pkt-line.h quote.h refs.h sideband.h \
        run-command.h strbuf.h tag.h tree.h git-compat-util.h revision.h \
        tree-walk.h log-tree.h dir.h path-list.h unpack-trees.h builtin.h
  
@@@ -247,18 -245,18 +247,19 @@@ DIFF_OBJS = 
  LIB_OBJS = \
        blob.o commit.o connect.o csum-file.o cache-tree.o base85.o \
        date.o diff-delta.o entry.o exec_cmd.o ident.o lockfile.o \
 -      object.o pack-check.o patch-delta.o path.o pkt-line.o \
 +      object.o pack-check.o patch-delta.o path.o pkt-line.o sideband.o \
        quote.o read-cache.o refs.o run-command.o dir.o object-refs.o \
        server-info.o setup.o sha1_file.o sha1_name.o strbuf.o \
        tag.o tree.o usage.o config.o environment.o ctype.o copy.o \
        fetch-clone.o revision.o pager.o tree-walk.o xdiff-interface.o \
        write_or_die.o trace.o \
-       alloc.o merge-file.o path-list.o help.o unpack-trees.o $(DIFF_OBJS)
+       alloc.o merge-file.o path-list.o help.o unpack-trees.o $(DIFF_OBJS) \
+       color.o wt-status.o
  
  BUILTIN_OBJS = \
        builtin-add.o \
        builtin-apply.o \
 +      builtin-archive.o \
        builtin-cat-file.o \
        builtin-checkout-index.o \
        builtin-check-ref-format.o \
        builtin-rev-list.o \
        builtin-rev-parse.o \
        builtin-rm.o \
+       builtin-runstatus.o \
        builtin-show-branch.o \
        builtin-stripspace.o \
        builtin-symbolic-ref.o \
        builtin-unpack-objects.o \
        builtin-update-index.o \
        builtin-update-ref.o \
 +      builtin-upload-archive.o \
        builtin-upload-tar.o \
        builtin-verify-pack.o \
        builtin-write-tree.o \
@@@ -635,8 -633,6 +637,8 @@@ gitweb/gitweb.cgi: gitweb/gitweb.per
            -e 's|++GITWEB_HOME_LINK_STR++|$(GITWEB_HOME_LINK_STR)|g' \
            -e 's|++GITWEB_SITENAME++|$(GITWEB_SITENAME)|g' \
            -e 's|++GITWEB_PROJECTROOT++|$(GITWEB_PROJECTROOT)|g' \
 +          -e 's|++GITWEB_EXPORT_OK++|$(GITWEB_EXPORT_OK)|g' \
 +          -e 's|++GITWEB_STRICT_EXPORT++|$(GITWEB_STRICT_EXPORT)|g' \
            -e 's|++GITWEB_BASE_URL++|$(GITWEB_BASE_URL)|g' \
            -e 's|++GITWEB_LIST++|$(GITWEB_LIST)|g' \
            -e 's|++GITWEB_HOMETEXT++|$(GITWEB_HOMETEXT)|g' \
diff --combined builtin.h
index 37a8c875a8ff26e6550aec21655020694b118ea5,53a896c85c33d6396632d44e668270acdcadc9b2..ccade94e26b34f9005b1ed2575b4c11cb6ceab22
+++ b/builtin.h
@@@ -1,7 -1,8 +1,7 @@@
  #ifndef BUILTIN_H
  #define BUILTIN_H
  
 -#include <stdio.h>
 -#include <limits.h>
 +#include "git-compat-util.h"
  
  extern const char git_version_string[];
  extern const char git_usage_string[];
@@@ -14,7 -15,6 +14,7 @@@ extern int write_tree(unsigned char *sh
  
  extern int cmd_add(int argc, const char **argv, const char *prefix);
  extern int cmd_apply(int argc, const char **argv, const char *prefix);
 +extern int cmd_archive(int argc, const char **argv, const char *prefix);
  extern int cmd_cat_file(int argc, const char **argv, const char *prefix);
  extern int cmd_checkout_index(int argc, const char **argv, const char *prefix);
  extern int cmd_check_ref_format(int argc, const char **argv, const char *prefix);
@@@ -47,6 -47,7 +47,7 @@@ extern int cmd_repo_config(int argc, co
  extern int cmd_rev_list(int argc, const char **argv, const char *prefix);
  extern int cmd_rev_parse(int argc, const char **argv, const char *prefix);
  extern int cmd_rm(int argc, const char **argv, const char *prefix);
+ extern int cmd_runstatus(int argc, const char **argv, const char *prefix);
  extern int cmd_show_branch(int argc, const char **argv, const char *prefix);
  extern int cmd_show(int argc, const char **argv, const char *prefix);
  extern int cmd_stripspace(int argc, const char **argv, const char *prefix);
@@@ -56,7 -57,6 +57,7 @@@ extern int cmd_zip_tree(int argc, cons
  extern int cmd_unpack_objects(int argc, const char **argv, const char *prefix);
  extern int cmd_update_index(int argc, const char **argv, const char *prefix);
  extern int cmd_update_ref(int argc, const char **argv, const char *prefix);
 +extern int cmd_upload_archive(int argc, const char **argv, const char *prefix);
  extern int cmd_upload_tar(int argc, const char **argv, const char *prefix);
  extern int cmd_version(int argc, const char **argv, const char *prefix);
  extern int cmd_whatchanged(int argc, const char **argv, const char *prefix);
diff --combined diff.c
index 6638865709888cc0ad2860ca1389a098b6f402f1,8178c117f1ce7ebf68d5790a1fdffe9482ea0c4d..443e24861ba1857822dbe8e3c831f8037e4e832e
--- 1/diff.c
--- 2/diff.c
+++ b/diff.c
@@@ -10,6 -10,7 +10,7 @@@
  #include "diffcore.h"
  #include "delta.h"
  #include "xdiff-interface.h"
+ #include "color.h"
  
  static int use_size_cache;
  
@@@ -17,8 -18,7 +18,7 @@@ static int diff_detect_rename_default
  static int diff_rename_limit_default = -1;
  static int diff_use_color_default;
  
- /* "\033[1;38;5;2xx;48;5;2xxm\0" is 23 bytes */
- static char diff_colors[][24] = {
+ static char diff_colors[][COLOR_MAXLEN] = {
        "\033[m",       /* reset */
        "",             /* normal */
        "\033[1m",      /* bold */
@@@ -45,119 -45,6 +45,6 @@@ static int parse_diff_color_slot(const 
        die("bad config variable '%s'", var);
  }
  
- static int parse_color(const char *name, int len)
- {
-       static const char * const color_names[] = {
-               "normal", "black", "red", "green", "yellow",
-               "blue", "magenta", "cyan", "white"
-       };
-       char *end;
-       int i;
-       for (i = 0; i < ARRAY_SIZE(color_names); i++) {
-               const char *str = color_names[i];
-               if (!strncasecmp(name, str, len) && !str[len])
-                       return i - 1;
-       }
-       i = strtol(name, &end, 10);
-       if (*name && !*end && i >= -1 && i <= 255)
-               return i;
-       return -2;
- }
- static int parse_attr(const char *name, int len)
- {
-       static const int attr_values[] = { 1, 2, 4, 5, 7 };
-       static const char * const attr_names[] = {
-               "bold", "dim", "ul", "blink", "reverse"
-       };
-       int i;
-       for (i = 0; i < ARRAY_SIZE(attr_names); i++) {
-               const char *str = attr_names[i];
-               if (!strncasecmp(name, str, len) && !str[len])
-                       return attr_values[i];
-       }
-       return -1;
- }
- static void parse_diff_color_value(const char *value, const char *var, char *dst)
- {
-       const char *ptr = value;
-       int attr = -1;
-       int fg = -2;
-       int bg = -2;
-       if (!strcasecmp(value, "reset")) {
-               strcpy(dst, "\033[m");
-               return;
-       }
-       /* [fg [bg]] [attr] */
-       while (*ptr) {
-               const char *word = ptr;
-               int val, len = 0;
-               while (word[len] && !isspace(word[len]))
-                       len++;
-               ptr = word + len;
-               while (*ptr && isspace(*ptr))
-                       ptr++;
-               val = parse_color(word, len);
-               if (val >= -1) {
-                       if (fg == -2) {
-                               fg = val;
-                               continue;
-                       }
-                       if (bg == -2) {
-                               bg = val;
-                               continue;
-                       }
-                       goto bad;
-               }
-               val = parse_attr(word, len);
-               if (val < 0 || attr != -1)
-                       goto bad;
-               attr = val;
-       }
-       if (attr >= 0 || fg >= 0 || bg >= 0) {
-               int sep = 0;
-               *dst++ = '\033';
-               *dst++ = '[';
-               if (attr >= 0) {
-                       *dst++ = '0' + attr;
-                       sep++;
-               }
-               if (fg >= 0) {
-                       if (sep++)
-                               *dst++ = ';';
-                       if (fg < 8) {
-                               *dst++ = '3';
-                               *dst++ = '0' + fg;
-                       } else {
-                               dst += sprintf(dst, "38;5;%d", fg);
-                       }
-               }
-               if (bg >= 0) {
-                       if (sep++)
-                               *dst++ = ';';
-                       if (bg < 8) {
-                               *dst++ = '4';
-                               *dst++ = '0' + bg;
-                       } else {
-                               dst += sprintf(dst, "48;5;%d", bg);
-                       }
-               }
-               *dst++ = 'm';
-       }
-       *dst = 0;
-       return;
- bad:
-       die("bad config value '%s' for variable '%s'", value, var);
- }
  /*
   * These are to give UI layer defaults.
   * The core-level commands such as git-diff-files should
@@@ -171,22 -58,7 +58,7 @@@ int git_diff_ui_config(const char *var
                return 0;
        }
        if (!strcmp(var, "diff.color")) {
-               if (!value)
-                       diff_use_color_default = 1; /* bool */
-               else if (!strcasecmp(value, "auto")) {
-                       diff_use_color_default = 0;
-                       if (isatty(1) || (pager_in_use && pager_use_color)) {
-                               char *term = getenv("TERM");
-                               if (term && strcmp(term, "dumb"))
-                                       diff_use_color_default = 1;
-                       }
-               }
-               else if (!strcasecmp(value, "never"))
-                       diff_use_color_default = 0;
-               else if (!strcasecmp(value, "always"))
-                       diff_use_color_default = 1;
-               else
-                       diff_use_color_default = git_config_bool(var, value);
+               diff_use_color_default = git_config_colorbool(var, value);
                return 0;
        }
        if (!strcmp(var, "diff.renames")) {
        }
        if (!strncmp(var, "diff.color.", 11)) {
                int slot = parse_diff_color_slot(var, 11);
-               parse_diff_color_value(value, var, diff_colors[slot]);
+               color_parse(value, var, diff_colors[slot]);
                return 0;
        }
        return git_default_config(var, value);
@@@ -1588,12 -1460,6 +1460,12 @@@ static void run_diff(struct diff_filepa
        if (hashcmp(one->sha1, two->sha1)) {
                int abbrev = o->full_index ? 40 : DEFAULT_ABBREV;
  
 +              if (o->binary) {
 +                      mmfile_t mf;
 +                      if ((!fill_mmfile(&mf, one) && mmfile_is_binary(&mf)) ||
 +                          (!fill_mmfile(&mf, two) && mmfile_is_binary(&mf)))
 +                              abbrev = 40;
 +              }
                len += snprintf(msg + len, sizeof(msg) - len,
                                "index %.*s..%.*s",
                                abbrev, sha1_to_hex(one->sha1),
@@@ -1824,7 -1690,7 +1696,7 @@@ int diff_opt_parse(struct diff_options 
                options->full_index = 1;
        else if (!strcmp(arg, "--binary")) {
                options->output_format |= DIFF_FORMAT_PATCH;
 -              options->full_index = options->binary = 1;
 +              options->binary = 1;
        }
        else if (!strcmp(arg, "-a") || !strcmp(arg, "--text")) {
                options->text = 1;
@@@ -2593,6 -2459,9 +2465,9 @@@ void diff_flush(struct diff_options *op
                }
        }
  
+       if (output_format & DIFF_FORMAT_CALLBACK)
+               options->format_callback(q, options, options->format_callback_data);
        for (i = 0; i < q->nr; i++)
                diff_free_filepair(q->queue[i]);
  free_queue:
diff --combined git.c
index 70cafb02625016943f03622ff37949d8f64cdcfb,495b39ab99a46b881ef3f464b98e2a2fedb604b1..44ab0de94d84e3b09d753b1da85679efcfd793a0
--- 1/git.c
--- 2/git.c
+++ b/git.c
@@@ -220,12 -220,11 +220,12 @@@ static void handle_internal_command(in
        } commands[] = {
                { "add", cmd_add, RUN_SETUP },
                { "apply", cmd_apply },
 +              { "archive", cmd_archive },
                { "cat-file", cmd_cat_file, RUN_SETUP },
                { "checkout-index", cmd_checkout_index, RUN_SETUP },
                { "check-ref-format", cmd_check_ref_format },
                { "commit-tree", cmd_commit_tree, RUN_SETUP },
 -              { "count-objects", cmd_count_objects },
 +              { "count-objects", cmd_count_objects, RUN_SETUP },
                { "diff", cmd_diff, RUN_SETUP },
                { "diff-files", cmd_diff_files, RUN_SETUP },
                { "diff-index", cmd_diff_index, RUN_SETUP },
                { "rev-list", cmd_rev_list, RUN_SETUP },
                { "rev-parse", cmd_rev_parse, RUN_SETUP },
                { "rm", cmd_rm, RUN_SETUP },
+               { "runstatus", cmd_runstatus, RUN_SETUP },
                { "show-branch", cmd_show_branch, RUN_SETUP },
                { "show", cmd_show, RUN_SETUP | USE_PAGER },
                { "stripspace", cmd_stripspace },
                { "unpack-objects", cmd_unpack_objects, RUN_SETUP },
                { "update-index", cmd_update_index, RUN_SETUP },
                { "update-ref", cmd_update_ref, RUN_SETUP },
 +              { "upload-archive", cmd_upload_archive },
                { "upload-tar", cmd_upload_tar },
                { "version", cmd_version },
                { "whatchanged", cmd_whatchanged, RUN_SETUP | USE_PAGER },
  
  int main(int argc, const char **argv, char **envp)
  {
 -      const char *cmd = argv[0];
 +      const char *cmd = argv[0] ? argv[0] : "git-help";
        char *slash = strrchr(cmd, '/');
        const char *exec_path = NULL;
        int done_alias = 0;