Skip to content
/ git Public
forked from git/git

Commit

Permalink
Merge branch 'jk/diff'
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
Junio C Hamano committed Sep 18, 2006
2 parents ac8e3f2 + db830b4 commit b467fb0
Show file tree
Hide file tree
Showing 15 changed files with 576 additions and 232 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ git-rev-list
git-rev-parse
git-revert
git-rm
git-runstatus
git-send-email
git-send-pack
git-sh-setup
Expand Down
14 changes: 14 additions & 0 deletions Documentation/config.txt
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,20 @@ showbranch.default::
The default set of branches for gitlink:git-show-branch[1].
See gitlink:git-show-branch[1].

status.color::
A boolean to enable/disable color in the output of
gitlink:git-status[1]. May be set to `true` (or `always`),
`false` (or `never`) or `auto`, in which case colors are used
only when the output is to a terminal. Defaults to false.

status.color.<slot>::
Use customized color for status colorization. `<slot>` is
one of `header` (the header text of the status message),
`updated` (files which are updated but not committed),
`changed` (files which are changed but not updated in the index),
or `untracked` (files which are not tracked by git). The values of
these variables may be specified as in diff.color.<slot>.

tar.umask::
By default, gitlink:git-tar-tree[1] sets file and directories modes
to 0666 or 0777. While this is both useful and acceptable for projects
Expand Down
4 changes: 3 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,8 @@ LIB_OBJS = \
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 \
Expand Down Expand Up @@ -288,6 +289,7 @@ BUILTIN_OBJS = \
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 \
Expand Down
36 changes: 36 additions & 0 deletions builtin-runstatus.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#include "wt-status.h"
#include "cache.h"

extern int wt_status_use_color;

static const char runstatus_usage[] =
"git-runstatus [--color|--nocolor] [--amend] [--verbose]";

int cmd_runstatus(int argc, const char **argv, const char *prefix)
{
struct wt_status s;
int i;

git_config(git_status_config);
wt_status_prepare(&s);

for (i = 1; i < argc; i++) {
if (!strcmp(argv[i], "--color"))
wt_status_use_color = 1;
else if (!strcmp(argv[i], "--nocolor"))
wt_status_use_color = 0;
else if (!strcmp(argv[i], "--amend")) {
s.amend = 1;
s.reference = "HEAD^1";
}
else if (!strcmp(argv[i], "--verbose"))
s.verbose = 1;
else if (!strcmp(argv[i], "--untracked"))
s.untracked = 1;
else
usage(runstatus_usage);
}

wt_status_print(&s);
return s.commitable ? 0 : 1;
}
1 change: 1 addition & 0 deletions builtin.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ extern int cmd_repo_config(int argc, const char **argv, const char *prefix);
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);
Expand Down
176 changes: 176 additions & 0 deletions color.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
#include "color.h"
#include "cache.h"
#include "git-compat-util.h"

#include <stdarg.h>

#define COLOR_RESET "\033[m"

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;
}

void color_parse(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);
}

int git_config_colorbool(const char *var, const char *value)
{
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 (!strcasecmp(value, "never"))
return 0;
if (!strcasecmp(value, "always"))
return 1;
return git_config_bool(var, value);
}

static int color_vprintf(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);
if (*color)
r += printf("%s", COLOR_RESET);
if (trail)
r += printf("%s", trail);
return r;
}



int color_printf(const char *color, const char *fmt, ...)
{
va_list args;
int r;
va_start(args, fmt);
r = color_vprintf(color, fmt, args, NULL);
va_end(args);
return r;
}

int color_printf_ln(const char *color, const char *fmt, ...)
{
va_list args;
int r;
va_start(args, fmt);
r = color_vprintf(color, fmt, args, "\n");
va_end(args);
return r;
}
12 changes: 12 additions & 0 deletions color.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#ifndef COLOR_H
#define COLOR_H

/* "\033[1;38;5;2xx;48;5;2xxm\0" is 23 bytes */
#define COLOR_MAXLEN 24

int git_config_colorbool(const char *var, const char *value);
void color_parse(const char *var, const char *value, char *dst);
int color_printf(const char *color, const char *fmt, ...);
int color_printf_ln(const char *color, const char *fmt, ...);

#endif /* COLOR_H */
Loading

0 comments on commit b467fb0

Please sign in to comment.