commit: do not add extra LF at the end of the summary.
[gitweb.git] / color.c
diff --git a/color.c b/color.c
index d8c8399d5916432eaa4122175f5e5d7ce209001b..7bd424a8f6012859f40f2aa6210e7d4ce7686dc0 100644 (file)
--- a/color.c
+++ b/color.c
@@ -1,8 +1,5 @@
-#include "color.h"
 #include "cache.h"
-#include "git-compat-util.h"
-
-#include <stdarg.h>
+#include "color.h"
 
 #define COLOR_RESET "\033[m"
 
@@ -119,58 +116,66 @@ void color_parse(const char *value, const char *var, char *dst)
        die("bad config value '%s' for variable '%s'", value, var);
 }
 
-int git_config_colorbool(const char *var, const char *value)
+int git_config_colorbool(const char *var, const char *value, int stdout_is_tty)
 {
-       if (!value)
-               return 1;
-       if (!strcasecmp(value, "auto")) {
-               if (isatty(1) || (pager_in_use && pager_use_color)) {
-                       char *term = getenv("TERM");
-                       if (term && strcmp(term, "dumb"))
-                               return 1;
-               }
-               return 0;
+       if (value) {
+               if (!strcasecmp(value, "never"))
+                       return 0;
+               if (!strcasecmp(value, "always"))
+                       return 1;
+               if (!strcasecmp(value, "auto"))
+                       goto auto_color;
        }
-       if (!strcasecmp(value, "never"))
+
+       /* Missing or explicit false to turn off colorization */
+       if (!git_config_bool(var, value))
                return 0;
-       if (!strcasecmp(value, "always"))
-               return 1;
-       return git_config_bool(var, value);
+
+       /* any normal truth value defaults to 'auto' */
+ auto_color:
+       if (stdout_is_tty < 0)
+               stdout_is_tty = isatty(1);
+       if (stdout_is_tty || (pager_in_use && pager_use_color)) {
+               char *term = getenv("TERM");
+               if (term && strcmp(term, "dumb"))
+                       return 1;
+       }
+       return 0;
 }
 
-static int color_vprintf(const char *color, const char *fmt,
+static int color_vfprintf(FILE *fp, const char *color, const char *fmt,
                va_list args, const char *trail)
 {
        int r = 0;
 
        if (*color)
-               r += printf("%s", color);
-       r += vprintf(fmt, args);
+               r += fprintf(fp, "%s", color);
+       r += vfprintf(fp, fmt, args);
        if (*color)
-               r += printf("%s", COLOR_RESET);
+               r += fprintf(fp, "%s", COLOR_RESET);
        if (trail)
-               r += printf("%s", trail);
+               r += fprintf(fp, "%s", trail);
        return r;
 }
 
 
 
-int color_printf(const char *color, const char *fmt, ...)
+int color_fprintf(FILE *fp, const char *color, const char *fmt, ...)
 {
        va_list args;
        int r;
        va_start(args, fmt);
-       r = color_vprintf(color, fmt, args, NULL);
+       r = color_vfprintf(fp, color, fmt, args, NULL);
        va_end(args);
        return r;
 }
 
-int color_printf_ln(const char *color, const char *fmt, ...)
+int color_fprintf_ln(FILE *fp, const char *color, const char *fmt, ...)
 {
        va_list args;
        int r;
        va_start(args, fmt);
-       r = color_vprintf(color, fmt, args, "\n");
+       r = color_vfprintf(fp, color, fmt, args, "\n");
        va_end(args);
        return r;
 }