All of lore.kernel.org
 help / color / mirror / Atom feed
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 0/4] cat-file: optionally convert to worktree version
Date: Wed, 24 Aug 2016 14:23:30 +0200 (CEST)	[thread overview]
Message-ID: <cover.1472041389.git.johannes.schindelin@gmx.de> (raw)
In-Reply-To: <cover.1471524357.git.johannes.schindelin@gmx.de>

When third-party tools need to access to contents of blobs in the
database, they might be more interested in the worktree version than in
the "clean" version of said contents.

This branch introduces the --filters option to make that happen, the
--use-path option to provide the path separately if the blob name rather
than the tree name is availale, and offers batch support in which case
it expects the object names and the path on its input lines, separated
by white space.

The new --filters option is an obvious sibling of --textconv, and shares
the peculiar feature that the drivers (and end-of-line convention) are
determined from the current worktree, not from the attributes stored in
the revision that may have been part of the object name.

As --textconv is so similar to --filters, it was taught to understand
the --use-path option and it was made compatible with batch mode, too.

I briefly considered teaching the batch mode to extract the path from
object names if they are specified as <tree-ish>:<path>. The changes
would be quite intrusive, though, and uglify the code substanitially. So
I decided against that.

Changes vs v2:

- two commit messages were touched up

- --use-path=<path> was renamed to --path=<path>

- a test was added to verify that --path without --textconv/--filters
  errors out with helpful advice


Johannes Schindelin (4):
  cat-file: fix a grammo in the man page
  cat-file: introduce the --filters option
  cat-file --textconv/--filters: allow specifying the path separately
  cat-file: support --textconv/--filters in batch mode

 Documentation/git-cat-file.txt |  40 +++++++++++----
 builtin/cat-file.c             | 110 ++++++++++++++++++++++++++++++++++++++---
 t/t8010-cat-file-filters.sh    |  64 ++++++++++++++++++++++++
 3 files changed, 196 insertions(+), 18 deletions(-)
 create mode 100755 t/t8010-cat-file-filters.sh

Published-As: https://github.com/dscho/git/releases/tag/cat-file-filters-v2
Fetch-It-Via: git fetch https://github.com/dscho/git cat-file-filters-v2

Interdiff vs v1:

 diff --git a/Documentation/git-cat-file.txt b/Documentation/git-cat-file.txt
 index 1f4d954..204541c 100644
 --- a/Documentation/git-cat-file.txt
 +++ b/Documentation/git-cat-file.txt
 @@ -9,7 +9,7 @@ git-cat-file - Provide content or type and size information for repository objec
  SYNOPSIS
  --------
  [verse]
 -'git cat-file' (-t [--allow-unknown-type]| -s [--allow-unknown-type]| -e | -p | <type> | --textconv | --filters ) [--use-path=<path>] <object>
 +'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) [ --textconv | --filters ] [--follow-symlinks]
  
  DESCRIPTION
 @@ -63,12 +63,12 @@ OPTIONS
  	<path>.
  
  --filters::
 -	Show the content as transformed by the filters configured in
 +	Show the content as converted by the filters configured in
  	the current working tree for the given <path> (i.e. smudge filters,
  	end-of-line conversion, etc). In this case, <object> has to be of
  	the form <tree-ish>:<path>, or :<path>.
  
 ---use-path=<path>::
 +--path=<path>::
  	For use with --textconv or --filters, to allow specifying an object
  	name and a path separately, e.g. when it is difficult to figure out
  	the revision from which the blob came.
 diff --git a/builtin/cat-file.c b/builtin/cat-file.c
 index 5f91cf4..f8a3a08 100644
 --- a/builtin/cat-file.c
 +++ b/builtin/cat-file.c
 @@ -61,6 +61,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
  	struct object_info oi = {NULL};
  	struct strbuf sb = STRBUF_INIT;
  	unsigned flags = LOOKUP_REPLACE_OBJECT;
 +	const char *path = force_path;
  
  	if (unknown_type)
  		flags |= LOOKUP_UNKNOWN_OBJECT;
 @@ -68,6 +69,11 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
  	if (get_sha1_with_context(obj_name, 0, sha1, &obj_context))
  		die("Not a valid object name %s", obj_name);
  
 +	if (!path)
 +		path = obj_context.path;
 +	else if (obj_context.mode == S_IFINVALID)
 +		obj_context.mode = 0100644;
 +
  	buf = NULL;
  	switch (opt) {
  	case 't':
 @@ -92,23 +98,21 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
  		return !has_sha1_file(sha1);
  
  	case 'w':
 -		if (!force_path && !obj_context.path[0])
 +		if (!path[0])
  			die("git cat-file --filters %s: <object> must be "
  			    "<sha1:path>", obj_name);
  
 -		if (filter_object(force_path ? force_path : obj_context.path,
 -				  force_path ? 0100644 : obj_context.mode,
 +		if (filter_object(path, obj_context.mode,
  				  sha1, &buf, &size))
  			return -1;
  		break;
  
  	case 'c':
 -		if (!force_path && !obj_context.path[0])
 +		if (!path[0])
  			die("git cat-file --textconv %s: <object> must be <sha1:path>",
  			    obj_name);
  
 -		if (textconv_object(force_path ? force_path : obj_context.path,
 -				    force_path ? 0100644 : obj_context.mode,
 +		if (textconv_object(path, obj_context.mode,
  				    sha1, 1, &buf, &size))
  			break;
  
 @@ -510,7 +514,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) [--use-path=<path>] <object>"),
 +	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] [--textconv|--filters]"),
  	NULL
  };
 @@ -558,7 +562,7 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix)
  			    N_("for blob objects, run textconv on object's content"), 'c'),
  		OPT_CMDMODE(0, "filters", &opt,
  			    N_("for blob objects, run filters on object's content"), 'w'),
 -		OPT_STRING(0, "use-path", &force_path, N_("blob"),
 +		OPT_STRING(0, "path", &force_path, N_("blob"),
  			   N_("use a specific path for --textconv/--filters")),
  		OPT_BOOL(0, "allow-unknown-type", &unknown_type,
  			  N_("allow -s and -t to work with broken/corrupt objects")),
 @@ -609,12 +613,12 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix)
  	}
  
  	if (force_path && opt != 'c' && opt != 'w') {
 -		error("--use-path=<path> needs --textconv or --filters");
 +		error("--path=<path> needs --textconv or --filters");
  		usage_with_options(cat_file_usage, options);
  	}
  
  	if (force_path && batch.enabled) {
 -		error("--use-path=<path> incompatible with --batch");
 +		error("--path=<path> incompatible with --batch");
  		usage_with_options(cat_file_usage, options);
  	}
  
 diff --git a/t/t8010-cat-file-filters.sh b/t/t8010-cat-file-filters.sh
 index 89ae868..acdfa09 100755
 --- a/t/t8010-cat-file-filters.sh
 +++ b/t/t8010-cat-file-filters.sh
 @@ -31,19 +31,26 @@ test_expect_success 'cat-file --filters converts to worktree version' '
  	has_cr actual
  '
  
 -test_expect_success 'cat-file --filters --use-path=<path> works' '
 +test_expect_success 'cat-file --filters --path=<path> works' '
  	sha1=$(git rev-parse -q --verify HEAD:world.txt) &&
 -	git cat-file --filters --use-path=world.txt $sha1 >actual &&
 +	git cat-file --filters --path=world.txt $sha1 >actual &&
  	has_cr actual
  '
  
 -test_expect_success 'cat-file --textconv --use-path=<path> works' '
 +test_expect_success 'cat-file --textconv --path=<path> works' '
  	sha1=$(git rev-parse -q --verify HEAD:world.txt) &&
  	test_config diff.txt.textconv "tr A-Za-z N-ZA-Mn-za-m <" &&
 -	git cat-file --textconv --use-path=hello.txt $sha1 >rot13 &&
 +	git cat-file --textconv --path=hello.txt $sha1 >rot13 &&
  	test uryyb = "$(cat rot13 | remove_cr)"
  '
  
 +test_expect_success '----path=<path> complains without --textconv/--filters' '
 +	sha1=$(git rev-parse -q --verify HEAD:world.txt) &&
 +	test_must_fail git cat-file --path=hello.txt blob $sha1 >actual 2>err &&
 +	test ! -s actual &&
 +	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 <" &&

-- 
2.10.0.rc1.99.gcd66998

base-commit: 2632c897f74b1cc9b5533f467da459b9ec725538

  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 ` Johannes Schindelin [this message]
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   ` [PATCH v2 4/4] cat-file: support --textconv/--filters in batch mode Johannes Schindelin
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

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=cover.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.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.