git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/6] git-check-attr should work for relative paths
@ 2011-08-04  4:47 Michael Haggerty
  2011-08-04  4:47 ` [PATCH v2 1/6] git-check-attr: test that no output is written to stderr Michael Haggerty
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: Michael Haggerty @ 2011-08-04  4:47 UTC (permalink / raw)
  To: git; +Cc: gitster, Michael Haggerty

This is a reroll of the earlier RFC.  It must be applied on top of
"Add --all option to git-check-attr" v3.

This re-roll differs in the following ways from the RFC:

* Adjusted for changes between the "--all" patch series v2 -> v3.

* Fixed some C problems found by Junio.


Currently, git-check-attr gets confused if it is passed certain types
of unnormalized paths or is invoked from a non-top-level directory.
For example, using the test repo created by t0003-attributes.sh,
inquiring about a path that starts with "./" causes git-check-attr to
emit a spurious warning:

    $ git check-attr test ./f
    [attr]notest !test
     not allowed: ./.gitattributes:1
    ./f: test: f
    $ git check-attr test ./a/i
    [attr]notest !test
     not allowed: ./.gitattributes:1
    ./a/i: test: a/i

In these cases it seems to find the right values, even including the
application of macros from the top-level .gitattributes file.  (My
guess is that it is loading the top-level .gitattributes file
twice--once as a top-level file, and once believing that it is in a
subdirectory.)

Invoking git-check-attr from a subdirectory using a relative path
gives incorrect answers; for example:

    $ (cd a; git check-attr test i )
    i: test: unspecified

(On the other hand, if invoked using the full path of a file, it
"works":

    $ (cd a; git check-attr test a/i )
    a/i: test: a/i

.)  I think that this behavior is confusing and inconsistent with
other git commands.  It is also inconsistent with the behavior of
.gitignore, which works from subdirectories.

The patches in this series add tests demonstrating the problem,
propose a possible solution, and add a couple of subcommands to
test-path-utils.

The changes to test-path-utils helped me figure out how the
corresponding functions work (comments? we don't need no stinkin'
comments) but they are not used anywhere.  Take 'em or leave 'em.


Michael Haggerty (6):
  git-check-attr: test that no output is written to stderr
  git-check-attr: Demonstrate problems with unnormalized paths
  git-check-attr: Demonstrate problems with relative paths
  git-check-attr: Normalize paths
  test-path-utils: Add subcommand "absolute_path"
  test-path-utils: Add subcommand "prefix_path"

 builtin/check-attr.c  |   20 ++++++++++++--------
 t/t0003-attributes.sh |   29 ++++++++++++++++++++++++++---
 test-path-utils.c     |   22 ++++++++++++++++++++++
 3 files changed, 60 insertions(+), 11 deletions(-)

-- 
1.7.6.8.gd2879

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v2 1/6] git-check-attr: test that no output is written to stderr
  2011-08-04  4:47 [PATCH v2 0/6] git-check-attr should work for relative paths Michael Haggerty
@ 2011-08-04  4:47 ` Michael Haggerty
  2011-08-04  4:47 ` [PATCH v2 2/6] git-check-attr: Demonstrate problems with unnormalized paths Michael Haggerty
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Michael Haggerty @ 2011-08-04  4:47 UTC (permalink / raw)
  To: git; +Cc: gitster, Michael Haggerty


Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
 t/t0003-attributes.sh |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/t/t0003-attributes.sh b/t/t0003-attributes.sh
index 5acb2d5..4f2fbc0 100755
--- a/t/t0003-attributes.sh
+++ b/t/t0003-attributes.sh
@@ -9,9 +9,10 @@ attr_check () {
 	path="$1"
 	expect="$2"
 
-	git check-attr test -- "$path" >actual &&
+	git check-attr test -- "$path" >actual 2>err &&
 	echo "$path: test: $2" >expect &&
-	test_cmp expect actual
+	test_cmp expect actual &&
+	test_line_count = 0 err
 
 }
 
-- 
1.7.6.8.gd2879

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 2/6] git-check-attr: Demonstrate problems with unnormalized paths
  2011-08-04  4:47 [PATCH v2 0/6] git-check-attr should work for relative paths Michael Haggerty
  2011-08-04  4:47 ` [PATCH v2 1/6] git-check-attr: test that no output is written to stderr Michael Haggerty
@ 2011-08-04  4:47 ` Michael Haggerty
  2011-08-04  4:47 ` [PATCH v2 3/6] git-check-attr: Demonstrate problems with relative paths Michael Haggerty
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Michael Haggerty @ 2011-08-04  4:47 UTC (permalink / raw)
  To: git; +Cc: gitster, Michael Haggerty


Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
 t/t0003-attributes.sh |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/t/t0003-attributes.sh b/t/t0003-attributes.sh
index 4f2fbc0..43957ea 100755
--- a/t/t0003-attributes.sh
+++ b/t/t0003-attributes.sh
@@ -93,6 +93,15 @@ test_expect_success 'attribute test' '
 
 '
 
+test_expect_failure 'unnormalized paths' '
+
+	attr_check ./f f &&
+	attr_check ./a/g a/g &&
+	attr_check a/./g a/g &&
+	attr_check a/c/../b/g a/b/g
+
+'
+
 test_expect_success 'core.attributesfile' '
 	attr_check global unspecified &&
 	git config core.attributesfile "$HOME/global-gitattributes" &&
-- 
1.7.6.8.gd2879

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 3/6] git-check-attr: Demonstrate problems with relative paths
  2011-08-04  4:47 [PATCH v2 0/6] git-check-attr should work for relative paths Michael Haggerty
  2011-08-04  4:47 ` [PATCH v2 1/6] git-check-attr: test that no output is written to stderr Michael Haggerty
  2011-08-04  4:47 ` [PATCH v2 2/6] git-check-attr: Demonstrate problems with unnormalized paths Michael Haggerty
@ 2011-08-04  4:47 ` Michael Haggerty
  2011-08-04  4:47 ` [PATCH v2 4/6] git-check-attr: Normalize paths Michael Haggerty
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Michael Haggerty @ 2011-08-04  4:47 UTC (permalink / raw)
  To: git; +Cc: gitster, Michael Haggerty


Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
 t/t0003-attributes.sh |   15 ++++++++++++++-
 1 files changed, 14 insertions(+), 1 deletions(-)

diff --git a/t/t0003-attributes.sh b/t/t0003-attributes.sh
index 43957ea..f6cf77d 100755
--- a/t/t0003-attributes.sh
+++ b/t/t0003-attributes.sh
@@ -19,7 +19,7 @@ attr_check () {
 
 test_expect_success 'setup' '
 
-	mkdir -p a/b/d a/c &&
+	mkdir -p a/b/d a/c b &&
 	(
 		echo "[attr]notest !test"
 		echo "f	test=f"
@@ -102,6 +102,19 @@ test_expect_failure 'unnormalized paths' '
 
 '
 
+test_expect_failure 'relative paths' '
+
+	(cd a && attr_check ../f f) &&
+	(cd a && attr_check f f) &&
+	(cd a && attr_check i a/i) &&
+	(cd a && attr_check g a/g) &&
+	(cd a && attr_check b/g a/b/g) &&
+	(cd b && attr_check ../a/f f) &&
+	(cd b && attr_check ../a/g a/g) &&
+	(cd b && attr_check ../a/b/g a/b/g)
+
+'
+
 test_expect_success 'core.attributesfile' '
 	attr_check global unspecified &&
 	git config core.attributesfile "$HOME/global-gitattributes" &&
-- 
1.7.6.8.gd2879

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 4/6] git-check-attr: Normalize paths
  2011-08-04  4:47 [PATCH v2 0/6] git-check-attr should work for relative paths Michael Haggerty
                   ` (2 preceding siblings ...)
  2011-08-04  4:47 ` [PATCH v2 3/6] git-check-attr: Demonstrate problems with relative paths Michael Haggerty
@ 2011-08-04  4:47 ` Michael Haggerty
  2011-08-04  4:47 ` [PATCH v2 5/6] test-path-utils: Add subcommand "absolute_path" Michael Haggerty
  2011-08-04  4:47 ` [PATCH v2 6/6] test-path-utils: Add subcommand "prefix_path" Michael Haggerty
  5 siblings, 0 replies; 7+ messages in thread
From: Michael Haggerty @ 2011-08-04  4:47 UTC (permalink / raw)
  To: git; +Cc: gitster, Michael Haggerty

Normalize the path arguments (relative to the working tree root, if
applicable) before looking up their attributes.  This requires passing
the prefix down the call chain.

This fixes two test cases for different reasons:

* "unnormalized paths" is fixed because the .gitattribute-file-seeking
  code is not confused into reading the top-level file twice.

* "relative paths" is fixed because the canonical pathnames are passed
  to get_check_attr() or get_all_attrs(), allowing them to match the
  pathname patterns as expected.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
 builtin/check-attr.c  |   20 ++++++++++++--------
 t/t0003-attributes.sh |    4 ++--
 2 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/builtin/check-attr.c b/builtin/check-attr.c
index 6b16368..708988a 100644
--- a/builtin/check-attr.c
+++ b/builtin/check-attr.c
@@ -41,22 +41,26 @@ static void output_attr(int cnt, struct git_attr_check *check,
 	}
 }
 
-static void check_attr(int cnt, struct git_attr_check *check,
-	const char *file)
+static void check_attr(const char *prefix, int cnt,
+	struct git_attr_check *check, const char *file)
 {
+	char *full_path =
+		prefix_path(prefix, prefix ? strlen(prefix) : 0, file);
 	if (check != NULL) {
-		if (git_check_attr(file, cnt, check))
+		if (git_check_attr(full_path, cnt, check))
 			die("git_check_attr died");
 		output_attr(cnt, check, file);
 	} else {
-		if (git_all_attrs(file, &cnt, &check))
+		if (git_all_attrs(full_path, &cnt, &check))
 			die("git_all_attrs died");
 		output_attr(cnt, check, file);
 		free(check);
 	}
+	free(full_path);
 }
 
-static void check_attr_stdin_paths(int cnt, struct git_attr_check *check)
+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';
@@ -70,7 +74,7 @@ static void check_attr_stdin_paths(int cnt, struct git_attr_check *check)
 				die("line is badly quoted");
 			strbuf_swap(&buf, &nbuf);
 		}
-		check_attr(cnt, check, buf.buf);
+		check_attr(prefix, cnt, check, buf.buf);
 		maybe_flush_or_die(stdout, "attribute to stdout");
 	}
 	strbuf_release(&buf);
@@ -154,10 +158,10 @@ int cmd_check_attr(int argc, const char **argv, const char *prefix)
 	}
 
 	if (stdin_paths)
-		check_attr_stdin_paths(cnt, check);
+		check_attr_stdin_paths(prefix, cnt, check);
 	else {
 		for (i = filei; i < argc; i++)
-			check_attr(cnt, check, argv[i]);
+			check_attr(prefix, cnt, check, argv[i]);
 		maybe_flush_or_die(stdout, "attribute to stdout");
 	}
 	return 0;
diff --git a/t/t0003-attributes.sh b/t/t0003-attributes.sh
index f6cf77d..ae2f1da 100755
--- a/t/t0003-attributes.sh
+++ b/t/t0003-attributes.sh
@@ -93,7 +93,7 @@ test_expect_success 'attribute test' '
 
 '
 
-test_expect_failure 'unnormalized paths' '
+test_expect_success 'unnormalized paths' '
 
 	attr_check ./f f &&
 	attr_check ./a/g a/g &&
@@ -102,7 +102,7 @@ test_expect_failure 'unnormalized paths' '
 
 '
 
-test_expect_failure 'relative paths' '
+test_expect_success 'relative paths' '
 
 	(cd a && attr_check ../f f) &&
 	(cd a && attr_check f f) &&
-- 
1.7.6.8.gd2879

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 5/6] test-path-utils: Add subcommand "absolute_path"
  2011-08-04  4:47 [PATCH v2 0/6] git-check-attr should work for relative paths Michael Haggerty
                   ` (3 preceding siblings ...)
  2011-08-04  4:47 ` [PATCH v2 4/6] git-check-attr: Normalize paths Michael Haggerty
@ 2011-08-04  4:47 ` Michael Haggerty
  2011-08-04  4:47 ` [PATCH v2 6/6] test-path-utils: Add subcommand "prefix_path" Michael Haggerty
  5 siblings, 0 replies; 7+ messages in thread
From: Michael Haggerty @ 2011-08-04  4:47 UTC (permalink / raw)
  To: git; +Cc: gitster, Michael Haggerty


Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
 test-path-utils.c |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/test-path-utils.c b/test-path-utils.c
index e767159..a410e30 100644
--- a/test-path-utils.c
+++ b/test-path-utils.c
@@ -20,6 +20,15 @@ int main(int argc, char **argv)
 		return 0;
 	}
 
+	if (argc >= 2 && !strcmp(argv[1], "absolute_path")) {
+		while (argc > 2) {
+			puts(absolute_path(argv[2]));
+			argc--;
+			argv++;
+		}
+		return 0;
+	}
+
 	if (argc == 4 && !strcmp(argv[1], "longest_ancestor_length")) {
 		int len = longest_ancestor_length(argv[2], argv[3]);
 		printf("%d\n", len);
-- 
1.7.6.8.gd2879

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 6/6] test-path-utils: Add subcommand "prefix_path"
  2011-08-04  4:47 [PATCH v2 0/6] git-check-attr should work for relative paths Michael Haggerty
                   ` (4 preceding siblings ...)
  2011-08-04  4:47 ` [PATCH v2 5/6] test-path-utils: Add subcommand "absolute_path" Michael Haggerty
@ 2011-08-04  4:47 ` Michael Haggerty
  5 siblings, 0 replies; 7+ messages in thread
From: Michael Haggerty @ 2011-08-04  4:47 UTC (permalink / raw)
  To: git; +Cc: gitster, Michael Haggerty


Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
 test-path-utils.c |   13 +++++++++++++
 1 files changed, 13 insertions(+), 0 deletions(-)

diff --git a/test-path-utils.c b/test-path-utils.c
index a410e30..3bc20e9 100644
--- a/test-path-utils.c
+++ b/test-path-utils.c
@@ -35,6 +35,19 @@ int main(int argc, char **argv)
 		return 0;
 	}
 
+	if (argc >= 4 && !strcmp(argv[1], "prefix_path")) {
+		char *prefix = argv[2];
+		int prefix_len = strlen(prefix);
+		int nongit_ok;
+		setup_git_directory_gently(&nongit_ok);
+		while (argc > 3) {
+			puts(prefix_path(prefix, prefix_len, argv[3]));
+			argc--;
+			argv++;
+		}
+		return 0;
+	}
+
 	if (argc == 4 && !strcmp(argv[1], "strip_path_suffix")) {
 		char *prefix = strip_path_suffix(argv[2], argv[3]);
 		printf("%s\n", prefix ? prefix : "(null)");
-- 
1.7.6.8.gd2879

^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2011-08-04  4:48 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-08-04  4:47 [PATCH v2 0/6] git-check-attr should work for relative paths Michael Haggerty
2011-08-04  4:47 ` [PATCH v2 1/6] git-check-attr: test that no output is written to stderr Michael Haggerty
2011-08-04  4:47 ` [PATCH v2 2/6] git-check-attr: Demonstrate problems with unnormalized paths Michael Haggerty
2011-08-04  4:47 ` [PATCH v2 3/6] git-check-attr: Demonstrate problems with relative paths Michael Haggerty
2011-08-04  4:47 ` [PATCH v2 4/6] git-check-attr: Normalize paths Michael Haggerty
2011-08-04  4:47 ` [PATCH v2 5/6] test-path-utils: Add subcommand "absolute_path" Michael Haggerty
2011-08-04  4:47 ` [PATCH v2 6/6] test-path-utils: Add subcommand "prefix_path" Michael Haggerty

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 NNTP newsgroup(s).