t/perf: fix regression in testing older versions of git
[gitweb.git] / grep.c
diff --git a/grep.c b/grep.c
index f950651ae61e80cd57c6d224a461313d14cb320d..528b652f713d2b6db5f48e3829448212cc3837bf 100644 (file)
--- a/grep.c
+++ b/grep.c
@@ -31,14 +31,14 @@ void init_grep_defaults(void)
        opt->max_depth = -1;
        opt->pattern_type_option = GREP_PATTERN_TYPE_UNSPECIFIED;
        opt->extended_regexp_option = 0;
-       strcpy(opt->color_context, "");
-       strcpy(opt->color_filename, "");
-       strcpy(opt->color_function, "");
-       strcpy(opt->color_lineno, "");
-       strcpy(opt->color_match_context, GIT_COLOR_BOLD_RED);
-       strcpy(opt->color_match_selected, GIT_COLOR_BOLD_RED);
-       strcpy(opt->color_selected, "");
-       strcpy(opt->color_sep, GIT_COLOR_CYAN);
+       color_set(opt->color_context, "");
+       color_set(opt->color_filename, "");
+       color_set(opt->color_function, "");
+       color_set(opt->color_lineno, "");
+       color_set(opt->color_match_context, GIT_COLOR_BOLD_RED);
+       color_set(opt->color_match_selected, GIT_COLOR_BOLD_RED);
+       color_set(opt->color_selected, "");
+       color_set(opt->color_sep, GIT_COLOR_CYAN);
        opt->color = -1;
 }
 
@@ -87,6 +87,11 @@ int grep_config(const char *var, const char *value, void *cb)
                return 0;
        }
 
+       if (!strcmp(var, "grep.fullname")) {
+               opt->relative = !git_config_bool(var, value);
+               return 0;
+       }
+
        if (!strcmp(var, "color.grep"))
                opt->color = git_config_colorbool(var, value);
        else if (!strcmp(var, "color.grep.context"))
@@ -109,15 +114,15 @@ int grep_config(const char *var, const char *value, void *cb)
                int rc = 0;
                if (!value)
                        return config_error_nonbool(var);
-               color_parse(value, var, opt->color_match_context);
-               color_parse(value, var, opt->color_match_selected);
+               rc |= color_parse(value, opt->color_match_context);
+               rc |= color_parse(value, opt->color_match_selected);
                return rc;
        }
 
        if (color) {
                if (!value)
                        return config_error_nonbool(var);
-               color_parse(value, var, color);
+               return color_parse(value, color);
        }
        return 0;
 }
@@ -146,14 +151,14 @@ void grep_init(struct grep_opt *opt, const char *prefix)
        opt->regflags = def->regflags;
        opt->relative = def->relative;
 
-       strcpy(opt->color_context, def->color_context);
-       strcpy(opt->color_filename, def->color_filename);
-       strcpy(opt->color_function, def->color_function);
-       strcpy(opt->color_lineno, def->color_lineno);
-       strcpy(opt->color_match_context, def->color_match_context);
-       strcpy(opt->color_match_selected, def->color_match_selected);
-       strcpy(opt->color_selected, def->color_selected);
-       strcpy(opt->color_sep, def->color_sep);
+       color_set(opt->color_context, def->color_context);
+       color_set(opt->color_filename, def->color_filename);
+       color_set(opt->color_function, def->color_function);
+       color_set(opt->color_lineno, def->color_lineno);
+       color_set(opt->color_match_context, def->color_match_context);
+       color_set(opt->color_match_selected, def->color_match_selected);
+       color_set(opt->color_selected, def->color_selected);
+       color_set(opt->color_sep, def->color_sep);
 }
 
 void grep_commit_pattern_type(enum grep_pattern_type pattern_type, struct grep_opt *opt)
@@ -301,9 +306,9 @@ static NORETURN void compile_regexp_failed(const struct grep_pat *p,
        char where[1024];
 
        if (p->no)
-               sprintf(where, "In '%s' at %d, ", p->origin, p->no);
+               xsnprintf(where, sizeof(where), "In '%s' at %d, ", p->origin, p->no);
        else if (p->origin)
-               sprintf(where, "%s, ", p->origin);
+               xsnprintf(where, sizeof(where), "%s, ", p->origin);
        else
                where[0] = 0;
 
@@ -1577,8 +1582,11 @@ static int grep_source_1(struct grep_opt *opt, struct grep_source *gs, int colle
         */
        if (opt->count && count) {
                char buf[32];
-               output_color(opt, gs->name, strlen(gs->name), opt->color_filename);
-               output_sep(opt, ':');
+               if (opt->pathname) {
+                       output_color(opt, gs->name, strlen(gs->name),
+                                    opt->color_filename);
+                       output_sep(opt, ':');
+               }
                snprintf(buf, sizeof(buf), "%u\n", count);
                opt->output(opt, buf, strlen(buf));
                return 1;
@@ -1653,8 +1661,8 @@ void grep_source_init(struct grep_source *gs, enum grep_source_type type,
                      const void *identifier)
 {
        gs->type = type;
-       gs->name = name ? xstrdup(name) : NULL;
-       gs->path = path ? xstrdup(path) : NULL;
+       gs->name = xstrdup_or_null(name);
+       gs->path = xstrdup_or_null(path);
        gs->buf = NULL;
        gs->size = 0;
        gs->driver = NULL;
@@ -1665,7 +1673,7 @@ void grep_source_init(struct grep_source *gs, enum grep_source_type type,
                break;
        case GREP_SOURCE_SHA1:
                gs->identifier = xmalloc(20);
-               memcpy(gs->identifier, identifier, 20);
+               hashcpy(gs->identifier, identifier);
                break;
        case GREP_SOURCE_BUF:
                gs->identifier = NULL;
@@ -1733,7 +1741,7 @@ static int grep_source_load_file(struct grep_source *gs)
        i = open(filename, O_RDONLY);
        if (i < 0)
                goto err_ret;
-       data = xmalloc(size + 1);
+       data = xmallocz(size);
        if (st.st_size != read_in_full(i, data, size)) {
                error(_("'%s': short read %s"), filename, strerror(errno));
                close(i);
@@ -1741,7 +1749,6 @@ static int grep_source_load_file(struct grep_source *gs)
                return -1;
        }
        close(i);
-       data[size] = 0;
 
        gs->buf = data;
        gs->size = size;