userdiff: skip textconv caching when not in a repository
The textconv caching system uses git-notes to store its cache entries. But if you're using "diff --no-index" outside of a repository, then obviously that isn't going to work. Since caching is just an optimization, it's OK for us to skip it. However, the current behavior is much worse: we call notes_cache_init() which tries to look up the ref, and the low-level ref code hits a BUG(), killing the program. Instead, we should notice before setting up the cache that it there's no repository, and just silently skip it. Reported-by: Paweł Dominiak <dominiak.pawel@gmail.com> Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									0d464a4e6a
								
							
						
					
					
						commit
						affe355fe7
					
				|  | @ -118,4 +118,26 @@ test_expect_success 'log notes cache and still use cache for -p' ' | ||||||
| 	git log --no-walk -p refs/notes/textconv/magic HEAD | 	git log --no-walk -p refs/notes/textconv/magic HEAD | ||||||
| ' | ' | ||||||
|  |  | ||||||
|  | test_expect_success 'caching is silently ignored outside repo' ' | ||||||
|  | 	mkdir -p non-repo && | ||||||
|  | 	echo one >non-repo/one && | ||||||
|  | 	echo two >non-repo/two && | ||||||
|  | 	echo "* diff=test" >attr && | ||||||
|  | 	test_expect_code 1 \ | ||||||
|  | 	nongit git -c core.attributesFile="$PWD/attr" \ | ||||||
|  | 		   -c diff.test.textconv="tr a-z A-Z <" \ | ||||||
|  | 		   -c diff.test.cachetextconv=true \ | ||||||
|  | 		   diff --no-index one two >actual && | ||||||
|  | 	cat >expect <<-\EOF && | ||||||
|  | 	diff --git a/one b/two | ||||||
|  | 	index 5626abf..f719efd 100644 | ||||||
|  | 	--- a/one | ||||||
|  | 	+++ b/two | ||||||
|  | 	@@ -1 +1 @@ | ||||||
|  | 	-ONE | ||||||
|  | 	+TWO | ||||||
|  | 	EOF | ||||||
|  | 	test_cmp expect actual | ||||||
|  | ' | ||||||
|  |  | ||||||
| test_done | test_done | ||||||
|  |  | ||||||
|  | @ -3,6 +3,7 @@ | ||||||
| #include "userdiff.h" | #include "userdiff.h" | ||||||
| #include "attr.h" | #include "attr.h" | ||||||
| #include "strbuf.h" | #include "strbuf.h" | ||||||
|  | #include "environment.h" | ||||||
|  |  | ||||||
| static struct userdiff_driver *drivers; | static struct userdiff_driver *drivers; | ||||||
| static int ndrivers; | static int ndrivers; | ||||||
|  | @ -460,7 +461,8 @@ struct userdiff_driver *userdiff_get_textconv(struct repository *r, | ||||||
| 	if (!driver->textconv) | 	if (!driver->textconv) | ||||||
| 		return NULL; | 		return NULL; | ||||||
|  |  | ||||||
| 	if (driver->textconv_want_cache && !driver->textconv_cache) { | 	if (driver->textconv_want_cache && !driver->textconv_cache && | ||||||
|  | 	    have_git_dir()) { | ||||||
| 		struct notes_cache *c = xmalloc(sizeof(*c)); | 		struct notes_cache *c = xmalloc(sizeof(*c)); | ||||||
| 		struct strbuf name = STRBUF_INIT; | 		struct strbuf name = STRBUF_INIT; | ||||||
|  |  | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Jeff King
						Jeff King