All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] en/object-list-with-pathspec v5
@ 2010-09-19 23:24 Nguyễn Thái Ngọc Duy
  2010-09-19 23:24 ` [PATCH 1/2] Make rev-list --objects work together with pathspecs Nguyễn Thái Ngọc Duy
  2010-09-19 23:24 ` [PATCH 2/2] Add testcases showing how pathspecs are handled with rev-list --objects Nguyễn Thái Ngọc Duy
  0 siblings, 2 replies; 3+ messages in thread
From: Nguyễn Thái Ngọc Duy @ 2010-09-19 23:24 UTC (permalink / raw)
  To: git, Junio C Hamano, Elijah Newren; +Cc: Nguyễn Thái Ngọc Duy

Just a rebase version of en/object-list-with-pathspec on top of

http://mid.gmane.org/1284938514-16663-1-git-send-email-pclouds@gmail.com

Elijah Newren (2):
  Make rev-list --objects work together with pathspecs
  Add testcases showing how pathspecs are handled with rev-list
    --objects

 list-objects.c           |   23 ++++++++++++++++++++
 revision.c               |    8 +++++-
 revision.h               |    3 +-
 t/t6000-rev-list-misc.sh |   51 ++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 82 insertions(+), 3 deletions(-)
 create mode 100755 t/t6000-rev-list-misc.sh

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

* [PATCH 1/2] Make rev-list --objects work together with pathspecs
  2010-09-19 23:24 [PATCH 0/2] en/object-list-with-pathspec v5 Nguyễn Thái Ngọc Duy
@ 2010-09-19 23:24 ` Nguyễn Thái Ngọc Duy
  2010-09-19 23:24 ` [PATCH 2/2] Add testcases showing how pathspecs are handled with rev-list --objects Nguyễn Thái Ngọc Duy
  1 sibling, 0 replies; 3+ messages in thread
From: Nguyễn Thái Ngọc Duy @ 2010-09-19 23:24 UTC (permalink / raw)
  To: git, Junio C Hamano, Elijah Newren
  Cc: Elijah Newren, Junio C Hamano,
	Nguyễn Thái Ngọc Duy

From: Elijah Newren <newren@gmail.com>

When traversing commits, the selection of commits would heed the list of
pathspecs passed, but subsequent walking of the trees of those commits
would not.  This resulted in 'rev-list --objects HEAD -- <paths>'
displaying objects at unwanted paths.

Have process_tree() call tree_entry_interesting() to determine which paths
are interesting and should be walked.

Naturally, this change can provide a large speedup when paths are specified
together with --objects, since many tree entries are now correctly ignored.
Interestingly, though, this change also gives me a small (~1%) but
repeatable speedup even when no paths are specified with --objects.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 list-objects.c |   23 +++++++++++++++++++++++
 revision.c     |    8 ++++++--
 revision.h     |    3 ++-
 3 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/list-objects.c b/list-objects.c
index 8953548..be4cf9f 100644
--- a/list-objects.c
+++ b/list-objects.c
@@ -67,6 +67,9 @@ static void process_tree(struct rev_info *revs,
 	struct tree_desc desc;
 	struct name_entry entry;
 	struct name_path me;
+	int all_interesting = (revs->diffopt.pathspec.nr == 0);
+	char *full_prefix = NULL;
+	int full_prefix_len = 0;
 
 	if (!revs->tree_objects)
 		return;
@@ -82,9 +85,28 @@ static void process_tree(struct rev_info *revs,
 	me.elem = name;
 	me.elem_len = strlen(name);
 
+	if (!all_interesting) {
+		full_prefix = path_name_impl(path, name, 1);
+		full_prefix_len = strlen(full_prefix);
+	}
+
 	init_tree_desc(&desc, tree->buffer, tree->size);
 
 	while (tree_entry(&desc, &entry)) {
+		if (!all_interesting) {
+			int showit = tree_entry_interesting(&entry,
+							    full_prefix,
+							    full_prefix_len,
+							    &revs->diffopt.pathspec);
+
+			if (showit < 0)
+				break;
+			else if (!showit)
+				continue;
+			else if (showit == 2)
+				all_interesting = 1;
+		}
+
 		if (S_ISDIR(entry.mode))
 			process_tree(revs,
 				     lookup_tree(entry.sha1),
@@ -97,6 +119,7 @@ static void process_tree(struct rev_info *revs,
 				     lookup_blob(entry.sha1),
 				     show, &me, entry.path);
 	}
+	free(full_prefix);
 	free(tree->buffer);
 	tree->buffer = NULL;
 }
diff --git a/revision.c b/revision.c
index e77184a..352837f 100644
--- a/revision.c
+++ b/revision.c
@@ -16,7 +16,7 @@
 
 volatile show_early_output_fn_t show_early_output;
 
-char *path_name(const struct name_path *path, const char *name)
+char *path_name_impl(const struct name_path *path, const char *name, int isdir)
 {
 	const struct name_path *p;
 	char *n, *m;
@@ -27,7 +27,7 @@ char *path_name(const struct name_path *path, const char *name)
 		if (p->elem_len)
 			len += p->elem_len + 1;
 	}
-	n = xmalloc(len);
+	n = xmalloc(len + !!isdir);
 	m = n + len - (nlen + 1);
 	strcpy(m, name);
 	for (p = path; p; p = p->up) {
@@ -37,6 +37,10 @@ char *path_name(const struct name_path *path, const char *name)
 			m[p->elem_len] = '/';
 		}
 	}
+	if (isdir && len > 1) {
+		n[len-1] = '/';
+		n[len] = '\0';
+	}
 	return n;
 }
 
diff --git a/revision.h b/revision.h
index 05659c6..92f4feb 100644
--- a/revision.h
+++ b/revision.h
@@ -173,7 +173,8 @@ struct name_path {
 	const char *elem;
 };
 
-char *path_name(const struct name_path *path, const char *name);
+char *path_name_impl(const struct name_path *path, const char *name, int isdir);
+#define path_name(path, name) path_name_impl(path, name, 0)
 
 extern void add_object(struct object *obj,
 		       struct object_array *p,
-- 
1.7.1.rc1.70.g788ca

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

* [PATCH 2/2] Add testcases showing how pathspecs are handled with rev-list --objects
  2010-09-19 23:24 [PATCH 0/2] en/object-list-with-pathspec v5 Nguyễn Thái Ngọc Duy
  2010-09-19 23:24 ` [PATCH 1/2] Make rev-list --objects work together with pathspecs Nguyễn Thái Ngọc Duy
@ 2010-09-19 23:24 ` Nguyễn Thái Ngọc Duy
  1 sibling, 0 replies; 3+ messages in thread
From: Nguyễn Thái Ngọc Duy @ 2010-09-19 23:24 UTC (permalink / raw)
  To: git, Junio C Hamano, Elijah Newren
  Cc: Elijah Newren, Junio C Hamano,
	Nguyễn Thái Ngọc Duy

From: Elijah Newren <newren@gmail.com>

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 t/t6000-rev-list-misc.sh |   51 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 51 insertions(+), 0 deletions(-)
 create mode 100755 t/t6000-rev-list-misc.sh

diff --git a/t/t6000-rev-list-misc.sh b/t/t6000-rev-list-misc.sh
new file mode 100755
index 0000000..b10685a
--- /dev/null
+++ b/t/t6000-rev-list-misc.sh
@@ -0,0 +1,51 @@
+#!/bin/sh
+
+test_description='miscellaneous rev-list tests'
+
+. ./test-lib.sh
+
+test_expect_success setup '
+	echo content1 >wanted_file &&
+	echo content2 >unwanted_file &&
+	git add wanted_file unwanted_file &&
+	git commit -m one
+'
+
+test_expect_success 'rev-list --objects heeds pathspecs' '
+	git rev-list --objects HEAD -- wanted_file >output &&
+	grep wanted_file output &&
+	! grep unwanted_file output
+'
+
+test_expect_success 'rev-list --objects with pathspecs and deeper paths' '
+	mkdir foo &&
+	>foo/file &&
+	git add foo/file &&
+	git commit -m two &&
+
+	git rev-list --objects HEAD -- foo >output &&
+	grep foo/file output &&
+
+	git rev-list --objects HEAD -- foo/file >output &&
+	grep foo/file output &&
+	! grep unwanted_file output
+'
+
+test_expect_success 'rev-list --objects with pathspecs and copied files' '
+	git checkout --orphan junio-testcase &&
+	git rm -rf . &&
+
+	mkdir two &&
+	echo frotz >one &&
+	cp one two/three &&
+	git add one two/three &&
+	test_tick &&
+	git commit -m that &&
+
+	ONE=$(git rev-parse HEAD:one)
+	git rev-list --objects HEAD two >output &&
+	grep "$ONE two/three" output &&
+	! grep one output
+'
+
+test_done
-- 
1.7.1.rc1.70.g788ca

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

end of thread, other threads:[~2010-09-19 23:25 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-09-19 23:24 [PATCH 0/2] en/object-list-with-pathspec v5 Nguyễn Thái Ngọc Duy
2010-09-19 23:24 ` [PATCH 1/2] Make rev-list --objects work together with pathspecs Nguyễn Thái Ngọc Duy
2010-09-19 23:24 ` [PATCH 2/2] Add testcases showing how pathspecs are handled with rev-list --objects Nguyễn Thái Ngọc Duy

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.