From: Johannes Schindelin <johannes.schindelin@gmx.de>
To: git@vger.kernel.org
Cc: "Junio C Hamano" <gitster@pobox.com>,
"Torsten Bögershausen" <tboegi@web.de>,
"Jeff King" <peff@peff.net>
Subject: [PATCH v2 4/4] cat-file: support --textconv/--filters in batch mode
Date: Wed, 24 Aug 2016 14:23:46 +0200 (CEST) [thread overview]
Message-ID: <89fdd570345a1b092024e5b8e608852f0ccc94fc.1472041389.git.johannes.schindelin@gmx.de> (raw)
In-Reply-To: <cover.1472041389.git.johannes.schindelin@gmx.de>
With this patch, --batch can be combined with --textconv or --filters.
For this to work, the input needs to have the form
<object name><single white space><path>
so that the filters can be chosen appropriately.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
Documentation/git-cat-file.txt | 18 +++++++++++-----
builtin/cat-file.c | 49 +++++++++++++++++++++++++++++++++++++-----
t/t8010-cat-file-filters.sh | 10 +++++++++
3 files changed, 67 insertions(+), 10 deletions(-)
diff --git a/Documentation/git-cat-file.txt b/Documentation/git-cat-file.txt
index 4fa9041..204541c 100644
--- a/Documentation/git-cat-file.txt
+++ b/Documentation/git-cat-file.txt
@@ -10,7 +10,7 @@ SYNOPSIS
--------
[verse]
'git cat-file' (-t [--allow-unknown-type]| -s [--allow-unknown-type]| -e | -p | <type> | --textconv | --filters ) [--path=<path>] <object>
-'git cat-file' (--batch | --batch-check) [--follow-symlinks]
+'git cat-file' (--batch | --batch-check) [ --textconv | --filters ] [--follow-symlinks]
DESCRIPTION
-----------
@@ -20,7 +20,11 @@ object type, or `-s` is used to find the object size, or `--textconv` or
`--filters` is used (which imply type "blob").
In the second form, a list of objects (separated by linefeeds) is provided on
-stdin, and the SHA-1, type, and size of each object is printed on stdout.
+stdin, and the SHA-1, type, and size of each object is printed on stdout. The
+output format can be overridden using the optional `<format>` argument. If
+either `--textconv` or `--filters` was specified, the input is expected to
+list the object names followed by the path name, separated by a single white
+space, so that the appropriate drivers can be determined.
OPTIONS
-------
@@ -72,13 +76,17 @@ OPTIONS
--batch::
--batch=<format>::
Print object information and contents for each object provided
- on stdin. May not be combined with any other options or arguments.
- See the section `BATCH OUTPUT` below for details.
+ on stdin. May not be combined with any other options or arguments
+ except `--textconv` or `--filters`, in which case the input lines
+ also need to specify the path, separated by white space. See the
+ section `BATCH OUTPUT` below for details.
--batch-check::
--batch-check=<format>::
Print object information for each object provided on stdin. May
- not be combined with any other options or arguments. See the
+ not be combined with any other options or arguments except
+ `--textconv` or `--filters`, in which case the input lines also
+ need to specify the path, separated by white space. See the
section `BATCH OUTPUT` below for details.
--batch-all-objects::
diff --git a/builtin/cat-file.c b/builtin/cat-file.c
index 2c799ac..f8a3a08 100644
--- a/builtin/cat-file.c
+++ b/builtin/cat-file.c
@@ -17,6 +17,7 @@ struct batch_options {
int print_contents;
int buffer_output;
int all_objects;
+ int cmdmode; /* may be 'w' or 'c' for --filters or --textconv */
const char *format;
};
@@ -285,7 +286,32 @@ static void print_object_or_die(struct batch_options *opt, struct expand_data *d
if (data->type == OBJ_BLOB) {
if (opt->buffer_output)
fflush(stdout);
- if (stream_blob_to_fd(1, sha1, NULL, 0) < 0)
+ if (opt->cmdmode) {
+ char *contents;
+ unsigned long size;
+
+ if (!data->rest)
+ die("missing path for '%s'", sha1_to_hex(sha1));
+
+ if (opt->cmdmode == 'w') {
+ if (filter_object(data->rest, 0100644, sha1,
+ &contents, &size))
+ die("could not convert '%s' %s",
+ sha1_to_hex(sha1), data->rest);
+ } else if (opt->cmdmode == 'c') {
+ enum object_type type;
+ if (!textconv_object(data->rest, 0100644, sha1,
+ 1, &contents, &size))
+ contents = read_sha1_file(sha1, &type,
+ &size);
+ if (!contents)
+ die("could not convert '%s' %s",
+ sha1_to_hex(sha1), data->rest);
+ } else
+ die("BUG: invalid cmdmode: %c", opt->cmdmode);
+ batch_write(opt, contents, size);
+ free(contents);
+ } else if (stream_blob_to_fd(1, sha1, NULL, 0) < 0)
die("unable to stream %s to stdout", sha1_to_hex(sha1));
}
else {
@@ -422,6 +448,8 @@ static int batch_objects(struct batch_options *opt)
data.mark_query = 1;
strbuf_expand(&buf, opt->format, expand_format, &data);
data.mark_query = 0;
+ if (opt->cmdmode)
+ data.split_on_whitespace = 1;
if (opt->all_objects) {
struct object_info empty;
@@ -487,7 +515,7 @@ static int batch_objects(struct batch_options *opt)
static const char * const cat_file_usage[] = {
N_("git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|<type>|--textconv|--filters) [--path=<path>] <object>"),
- N_("git cat-file (--batch | --batch-check) [--follow-symlinks]"),
+ N_("git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv|--filters]"),
NULL
};
@@ -558,7 +586,9 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix)
argc = parse_options(argc, argv, prefix, options, cat_file_usage, 0);
if (opt) {
- if (argc == 1)
+ if (batch.enabled && (opt == 'c' || opt == 'w'))
+ batch.cmdmode = opt;
+ else if (argc == 1)
obj_name = argv[0];
else
usage_with_options(cat_file_usage, options);
@@ -570,8 +600,12 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix)
} else
usage_with_options(cat_file_usage, options);
}
- if (batch.enabled && (opt || argc)) {
- usage_with_options(cat_file_usage, options);
+ if (batch.enabled) {
+ if (batch.cmdmode != opt || argc)
+ usage_with_options(cat_file_usage, options);
+ if (batch.cmdmode && batch.all_objects)
+ die("--batch-all-objects cannot be combined with "
+ "--textconv nor with --filters");
}
if ((batch.follow_symlinks || batch.all_objects) && !batch.enabled) {
@@ -583,6 +617,11 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix)
usage_with_options(cat_file_usage, options);
}
+ if (force_path && batch.enabled) {
+ error("--path=<path> incompatible with --batch");
+ usage_with_options(cat_file_usage, options);
+ }
+
if (batch.buffer_output < 0)
batch.buffer_output = batch.all_objects;
diff --git a/t/t8010-cat-file-filters.sh b/t/t8010-cat-file-filters.sh
index 0d5c33e..acdfa09 100755
--- a/t/t8010-cat-file-filters.sh
+++ b/t/t8010-cat-file-filters.sh
@@ -51,4 +51,14 @@ test_expect_success '----path=<path> complains without --textconv/--filters' '
grep "path.*needs.*filters" err
'
+test_expect_success 'cat-file --textconv --batch works' '
+ sha1=$(git rev-parse -q --verify HEAD:world.txt) &&
+ test_config diff.txt.textconv "tr A-Za-z N-ZA-Mn-za-m <" &&
+ printf "%s hello.txt\n%s hello\n" $sha1 $sha1 |
+ git cat-file --textconv --batch >actual &&
+ printf "%s blob 6\nuryyb\r\n\n%s blob 6\nhello\n\n" \
+ $sha1 $sha1 >expect &&
+ test_cmp expect actual
+'
+
test_done
--
2.10.0.rc1.99.gcd66998
next prev parent reply other threads:[~2016-08-24 12:24 UTC|newest]
Thread overview: 66+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-08-18 12:46 [PATCH 0/4] cat-file: optionally convert to worktree version Johannes Schindelin
2016-08-18 12:46 ` [PATCH 1/4] cat-file: fix a grammo in the man page Johannes Schindelin
2016-08-18 16:21 ` Junio C Hamano
2016-08-18 12:46 ` [PATCH 2/4] cat-file: introduce the --filters option Johannes Schindelin
2016-08-18 15:49 ` Torsten Bögershausen
2016-08-19 12:37 ` Johannes Schindelin
2016-08-19 16:06 ` Junio C Hamano
2016-08-18 16:37 ` Junio C Hamano
2016-08-19 12:49 ` Johannes Schindelin
2016-08-19 8:57 ` Torsten Bögershausen
2016-08-19 15:00 ` Johannes Schindelin
2016-08-19 16:06 ` Junio C Hamano
2016-08-22 16:51 ` Torsten Bögershausen
2016-08-24 8:00 ` Johannes Schindelin
2016-08-18 12:46 ` [PATCH 3/4] cat-file --textconv/--filters: allow specifying the path separately Johannes Schindelin
2016-08-18 16:52 ` Junio C Hamano
2016-08-19 14:49 ` Johannes Schindelin
2016-08-19 16:11 ` Junio C Hamano
2016-08-24 7:57 ` Johannes Schindelin
2016-08-18 12:46 ` [PATCH 4/4] cat-file: support --textconv/--filters in batch mode Johannes Schindelin
2016-08-18 15:42 ` Torsten Bögershausen
2016-08-19 12:25 ` Johannes Schindelin
2016-08-19 15:06 ` Jeff King
2016-08-19 16:19 ` Junio C Hamano
2016-08-18 17:08 ` Junio C Hamano
2016-08-19 12:59 ` Johannes Schindelin
2016-08-19 14:44 ` Jeff King
2016-08-18 22:05 ` Jeff King
2016-08-18 22:47 ` Junio C Hamano
2016-08-19 13:11 ` Johannes Schindelin
2016-08-19 13:09 ` Johannes Schindelin
2016-08-19 13:22 ` Jeff King
2016-08-24 12:23 ` [PATCH v2 0/4] cat-file: optionally convert to worktree version Johannes Schindelin
2016-08-24 12:23 ` [PATCH v2 1/4] cat-file: fix a grammo in the man page Johannes Schindelin
2016-08-24 12:23 ` [PATCH v2 2/4] cat-file: introduce the --filters option Johannes Schindelin
2016-08-24 17:46 ` Junio C Hamano
2016-08-24 17:52 ` Junio C Hamano
2016-08-31 20:31 ` Johannes Schindelin
2016-08-31 20:53 ` Junio C Hamano
2016-08-24 12:23 ` [PATCH v2 3/4] cat-file --textconv/--filters: allow specifying the path separately Johannes Schindelin
2016-08-24 17:49 ` Junio C Hamano
2016-08-24 18:25 ` Junio C Hamano
2016-08-31 19:49 ` Johannes Schindelin
2016-08-31 20:17 ` Junio C Hamano
2016-08-24 12:23 ` Johannes Schindelin [this message]
2016-08-24 16:09 ` [PATCH v2 0/4] cat-file: optionally convert to worktree version Junio C Hamano
2016-08-24 16:19 ` Jeff King
2016-08-24 17:02 ` Junio C Hamano
2016-08-24 17:32 ` Jeff King
2016-08-24 17:55 ` Junio C Hamano
2016-08-29 21:02 ` Junio C Hamano
2016-08-31 20:34 ` Johannes Schindelin
2016-09-09 10:10 ` [PATCH v3 " Johannes Schindelin
2016-09-09 10:10 ` [PATCH v3 1/4] cat-file: fix a grammo in the man page Johannes Schindelin
2016-09-09 10:10 ` [PATCH v3 2/4] cat-file: introduce the --filters option Johannes Schindelin
2016-09-09 15:09 ` Junio C Hamano
2016-09-09 16:01 ` Johannes Schindelin
2016-09-09 16:08 ` Junio C Hamano
2016-09-09 17:16 ` Junio C Hamano
2016-09-09 17:26 ` Junio C Hamano
2016-09-10 7:57 ` Johannes Schindelin
2016-09-11 21:44 ` Junio C Hamano
2016-09-09 10:10 ` [PATCH v3 3/4] cat-file --textconv/--filters: allow specifying the path separately Johannes Schindelin
2016-09-09 18:06 ` Junio C Hamano
2016-09-10 7:59 ` Johannes Schindelin
2016-09-09 10:10 ` [PATCH v3 4/4] cat-file: support --textconv/--filters in batch mode Johannes Schindelin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=89fdd570345a1b092024e5b8e608852f0ccc94fc.1472041389.git.johannes.schindelin@gmx.de \
--to=johannes.schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=peff@peff.net \
--cc=tboegi@web.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).