git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Gitk strangeness..

From
Junio C Hamano <junkio@cox.net>
Date
Mar 29, 2006, 00:50 UTC
Message-ID
<7vacbagjlv.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<17449.48630.370867.10251@cargo.ozlabs.ibm.com>
Paul Mackerras <paulus@samba.org> writes:
Show 9 quoted lines
> Junio C Hamano writes:
>
>> How about this alternative patch, then?  It turned out to be
>> quite convoluted as I feared.
>
> That's brilliant.  Thank you!  With the patch to gitk below, the
> graph display on Linus' example looks much saner.
>
> Could you check in your patch to the git.git repository, please?

The patch I sent was a total mess, and the one in "pu" right now was somewhat cleaned up but was still far suboptimal. **Blush**

Most notably, the code from yesterday was re-injecting the parents of the boundary commits into the list marked as UNINTERESTING, which was unnecessary and stupid. This one just pops boundary commits off the list after consuming it.

Here is a cleaned-up one for eyeballing.

Although I am reasonably sure that this does not affect the way it works when --boundary is not given, I'd pretty much appreciate an independent sanity check on this one. rev-list is so fundamental to git.

-- >8 --
diff --git a/rev-list.c b/rev-list.c
index 441c437..f3a989c 100644
--- a/rev-list.c
+++ b/rev-list.c
@@ -7,9 +7,9 @@ #include "blob.h"
 #include "diff.h"
 #include "revision.h"
 
-/* bits #0-4 in revision.h */
+/* bits #0-5 in revision.h */
 
-#define COUNTED		(1u<<5)
+#define COUNTED		(1u<<6)
 
 static const char rev_list_usage[] =
 "git-rev-list [OPTION] <commit-id>... [ -- paths... ]\n"
@@ -51,6 +51,8 @@ static void show_commit(struct commit *c
 		printf("%lu ", commit->date);
 	if (commit_prefix[0])
 		fputs(commit_prefix, stdout);
+	if (commit->object.flags & BOUNDARY)
+		putchar('-');
 	fputs(sha1_to_hex(commit->object.sha1), stdout);
 	if (show_parents) {
 		struct commit_list *parents = commit->parents;
diff --git a/revision.c b/revision.c
index d7678cf..745b0d2 100644
--- a/revision.c
+++ b/revision.c
@@ -419,6 +419,27 @@ static void limit_list(struct rev_info *
 			continue;
 		p = &commit_list_insert(commit, p)->next;
 	}
+	if (revs->boundary) {
+		list = newlist;
+		while (list) {
+			struct commit *commit = list->item;
+			struct object *obj = &commit->object;
+			struct commit_list *parent = commit->parents;
+			if (obj->flags & (UNINTERESTING|BOUNDARY)) {
+				list = list->next;
+				continue;
+			}
+			while (parent) {
+				struct commit *pcommit = parent->item;
+				parent = parent->next;
+				if (!(pcommit->object.flags & UNINTERESTING))
+					continue;
+				pcommit->object.flags |= BOUNDARY;
+				p = &commit_list_insert(pcommit, p)->next;
+			}
+			list = list->next;
+		}
+	}
 	revs->commits = newlist;
 }
 
@@ -591,6 +612,10 @@ int setup_revisions(int argc, const char
 				revs->no_merges = 1;
 				continue;
 			}
+			if (!strcmp(arg, "--boundary")) {
+				revs->boundary = 1;
+				continue;
+			}
 			if (!strcmp(arg, "--objects")) {
 				revs->tag_objects = 1;
 				revs->tree_objects = 1;
@@ -731,13 +756,17 @@ struct commit *get_revision(struct rev_i
 	do {
 		struct commit *commit = revs->commits->item;
 
-		if (commit->object.flags & (UNINTERESTING|SHOWN))
+		if (commit->object.flags & SHOWN)
+			goto next;
+		if (!(commit->object.flags & BOUNDARY) &&
+		    (commit->object.flags & UNINTERESTING))
 			goto next;
 		if (revs->min_age != -1 && (commit->date > revs->min_age))
 			goto next;
 		if (revs->max_age != -1 && (commit->date < revs->max_age))
 			return NULL;
-		if (revs->no_merges && commit->parents && commit->parents->next)
+		if (revs->no_merges &&
+		    commit->parents && commit->parents->next)
 			goto next;
 		if (revs->prune_fn && revs->dense) {
 			if (!(commit->object.flags & TREECHANGE))
@@ -745,8 +774,19 @@ struct commit *get_revision(struct rev_i
 			rewrite_parents(commit);
 		}
 		/* More to go? */
-		if (revs->max_count)
-			pop_most_recent_commit(&revs->commits, SEEN);
+		if (revs->max_count) {
+			if (commit->object.flags & BOUNDARY) {
+				/* this is already uninteresting,
+				 * so there is no point popping its
+				 * parents into the list.
+				 */
+				struct commit_list *it = revs->commits;
+				revs->commits = it->next;
+				free(it);
+			}
+			else
+				pop_most_recent_commit(&revs->commits, SEEN);
+		}
 		commit->object.flags |= SHOWN;
 		return commit;
 next:
diff --git a/revision.h b/revision.h
index 6c2beca..61e6bc9 100644
--- a/revision.h
+++ b/revision.h
@@ -6,6 +6,7 @@ #define UNINTERESTING   (1u<<1)
 #define TREECHANGE	(1u<<2)
 #define SHOWN		(1u<<3)
 #define TMP_MARK	(1u<<4) /* for isolated cases; clean after use */
+#define BOUNDARY	(1u<<5)
 
 struct rev_info;
 
@@ -32,7 +33,8 @@ struct rev_info {
 			blob_objects:1,
 			edge_hint:1,
 			limited:1,
-			unpacked:1;
+			unpacked:1,
+			boundary:1;
 
 	/* special limits */
 	int max_count;
Previous: Paul MackerrasNext: Junio C Hamano
Message 26 of 33 in “What's in git.git”
  1. Junio C HamanoMar 28, 2006
  2. Add ALL_LDFLAGS to the git target.Jason Riedy, Mar 28, 2006
  3. Junio C HamanoMar 28, 2006
  4. Jason RiedyMar 28, 2006
  5. Junio C HamanoMar 28, 2006
  6. Jason RiedyMar 28, 2006
  7. Mark WoodingMar 28, 2006
  8. Linus TorvaldsMar 28, 2006
  9. Junio C HamanoMar 28, 2006
  10. Jason RiedyMar 28, 2006
  11. Junio C HamanoMar 29, 2006
  12. Mark WoodingMar 28, 2006
  13. Support for pickaxe matching regular expressionsPetr Baudis, Mar 29, 2006
  14. Johannes SchindelinMar 29, 2006
  15. Petr BaudisMar 29, 2006
  16. Gitk strangeness..Linus Torvalds, Mar 28, 2006
  17. Junio C HamanoMar 28, 2006
  18. Paul MackerrasMar 28, 2006
  19. Linus TorvaldsMar 28, 2006
  20. Junio C HamanoMar 28, 2006
  21. Paul MackerrasMar 28, 2006
  22. Junio C HamanoMar 28, 2006
  23. Paul MackerrasMar 28, 2006
  24. Junio C HamanoMar 28, 2006
  25. Paul MackerrasMar 28, 2006
  26. Junio C HamanoMar 29, 2006
  27. Junio C HamanoMar 29, 2006
  28. Alex RiesenMar 30, 2006
  29. Paul MackerrasMar 30, 2006
  30. Paul MackerrasMar 30, 2006
  31. Junio C HamanoMar 31, 2006
  32. Alex RiesenMar 31, 2006
  33. Linus TorvaldsMar 28, 2006

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.