Skip to content

Commit

Permalink
Merge branch 'jc/check-x-z'
Browse files Browse the repository at this point in the history
"git check-ignore -z" applied the NUL termination to both its input
(with --stdin) and its output, but "git check-attr -z" ignored the
option on the output side.

This is potentially a backward incompatible fix.  Let's see if
anybody screams before deciding if we want to do anything to help
existing users (there may be none).

* jc/check-x-z:
  check-attr -z: a single -z should apply to both input and output
  check-ignore -z: a single -z should apply to both input and output
  check-attr: the name of the character is NUL, not NULL
  check-ignore: the name of the character is NUL, not NULL
  • Loading branch information
Junio C Hamano committed Sep 4, 2013
2 parents 0a41de8 + f7cd8c5 commit 0db320d
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 14 deletions.
9 changes: 7 additions & 2 deletions Documentation/git-check-attr.txt
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,9 @@ OPTIONS
Read file names from stdin instead of from the command-line.

-z::
Only meaningful with `--stdin`; paths are separated with a
NUL character instead of a linefeed character.
The output format is modified to be machine-parseable.
If `--stdin` is also given, input paths are separated
with a NUL character instead of a linefeed character.

\--::
Interpret all preceding arguments as attributes and all following
Expand All @@ -48,6 +49,10 @@ OUTPUT
The output is of the form:
<path> COLON SP <attribute> COLON SP <info> LF

unless `-z` is in effect, in which case NUL is used as delimiter:
<path> NUL <attribute> NUL <info> NUL


<path> is the path of a file being queried, <attribute> is an attribute
being queried and <info> can be either:

Expand Down
20 changes: 14 additions & 6 deletions builtin/check-attr.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@ N_("git check-attr --stdin [-z] [-a | --all | attr...] < <list-of-paths>"),
NULL
};

static int null_term_line;
static int nul_term_line;

static const struct option check_attr_options[] = {
OPT_BOOLEAN('a', "all", &all_attrs, N_("report all attributes set on file")),
OPT_BOOLEAN(0, "cached", &cached_attrs, N_("use .gitattributes only from the index")),
OPT_BOOLEAN(0 , "stdin", &stdin_paths, N_("read file names from stdin")),
OPT_BOOLEAN('z', NULL, &null_term_line,
N_("input paths are terminated by a null character")),
OPT_BOOLEAN('z', NULL, &nul_term_line,
N_("terminate input and output records by a NUL character")),
OPT_END()
};

Expand All @@ -38,8 +38,16 @@ static void output_attr(int cnt, struct git_attr_check *check,
else if (ATTR_UNSET(value))
value = "unspecified";

quote_c_style(file, NULL, stdout, 0);
printf(": %s: %s\n", git_attr_name(check[j].attr), value);
if (nul_term_line) {
printf("%s%c" /* path */
"%s%c" /* attrname */
"%s%c" /* attrvalue */,
file, 0, git_attr_name(check[j].attr), 0, value, 0);
} else {
quote_c_style(file, NULL, stdout, 0);
printf(": %s: %s\n", git_attr_name(check[j].attr), value);
}

}
}

Expand All @@ -65,7 +73,7 @@ static void check_attr_stdin_paths(const char *prefix, int cnt,
struct git_attr_check *check)
{
struct strbuf buf, nbuf;
int line_termination = null_term_line ? 0 : '\n';
int line_termination = nul_term_line ? 0 : '\n';

strbuf_init(&buf, 0);
strbuf_init(&nbuf, 0);
Expand Down
12 changes: 6 additions & 6 deletions builtin/check-ignore.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,16 @@ static const char * const check_ignore_usage[] = {
NULL
};

static int null_term_line;
static int nul_term_line;

static const struct option check_ignore_options[] = {
OPT__QUIET(&quiet, N_("suppress progress reporting")),
OPT__VERBOSE(&verbose, N_("be verbose")),
OPT_GROUP(""),
OPT_BOOLEAN(0, "stdin", &stdin_paths,
N_("read file names from stdin")),
OPT_BOOLEAN('z', NULL, &null_term_line,
N_("input paths are terminated by a null character")),
OPT_BOOLEAN('z', NULL, &nul_term_line,
N_("terminate input and output records by a NUL character")),
OPT_BOOLEAN('n', "non-matching", &show_non_matching,
N_("show non-matching input paths")),
OPT_END()
Expand All @@ -31,7 +31,7 @@ static void output_exclude(const char *path, struct exclude *exclude)
{
char *bang = (exclude && exclude->flags & EXC_FLAG_NEGATIVE) ? "!" : "";
char *slash = (exclude && exclude->flags & EXC_FLAG_MUSTBEDIR) ? "/" : "";
if (!null_term_line) {
if (!nul_term_line) {
if (!verbose) {
write_name_quoted(path, stdout, '\n');
} else {
Expand Down Expand Up @@ -107,7 +107,7 @@ static int check_ignore_stdin_paths(struct dir_struct *dir, const char *prefix)
{
struct strbuf buf, nbuf;
char *pathspec[2] = { NULL, NULL };
int line_termination = null_term_line ? 0 : '\n';
int line_termination = nul_term_line ? 0 : '\n';
int num_ignored = 0;

strbuf_init(&buf, 0);
Expand Down Expand Up @@ -142,7 +142,7 @@ int cmd_check_ignore(int argc, const char **argv, const char *prefix)
if (argc > 0)
die(_("cannot specify pathnames with --stdin"));
} else {
if (null_term_line)
if (nul_term_line)
die(_("-z only makes sense with --stdin"));
if (argc == 0)
die(_("no path specified"));
Expand Down

0 comments on commit 0db320d

Please sign in to comment.