From: Adam Simpkins <adam@adamsimpkins.net>
To: git@vger.kernel.org
Cc: Adam Simpkins <adam@adamsimpkins.net>
Subject: [PATCH 2/2] get_revision(): honor the topo_order flag for boundary commits
Date: Sat, 24 May 2008 16:02:05 -0700 [thread overview]
Message-ID: <1211670125-10215-3-git-send-email-adam@adamsimpkins.net> (raw)
In-Reply-To: <1211670125-10215-2-git-send-email-adam@adamsimpkins.net>
Now get_revision() sorts the boundary commits when topo_order is set.
Since sort_in_topological_order() takes a struct commit_list, it first
places the boundary commits into revs->commits.
Signed-off-by: Adam Simpkins <adam@adamsimpkins.net>
---
graph.c | 9 +------
revision.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++-------------
2 files changed, 58 insertions(+), 24 deletions(-)
diff --git a/graph.c b/graph.c
index ce1abc0..412b5ec 100644
--- a/graph.c
+++ b/graph.c
@@ -197,16 +197,9 @@ static int graph_is_interesting(struct git_graph *graph, struct commit *commit)
* If revs->boundary is set, commits whose children have
* been shown are always interesting, even if they have the
* UNINTERESTING or TREESAME flags set.
- *
- * However, ignore the commit if SHOWN is set. If SHOWN is set,
- * the commit is interesting, but it has already been printed.
- * This can happen because get_revision() doesn't return the
- * boundary commits in topological order, even when
- * revs->topo_order is set.
*/
if (graph->revs && graph->revs->boundary) {
- if ((commit->object.flags & (SHOWN | CHILD_SHOWN)) ==
- CHILD_SHOWN)
+ if (commit->object.flags & CHILD_SHOWN)
return 1;
}
diff --git a/revision.c b/revision.c
index 181fb0b..fb9924e 100644
--- a/revision.c
+++ b/revision.c
@@ -1612,28 +1612,62 @@ static void gc_boundary(struct object_array *array)
}
}
+static void create_boundary_commit_list(struct rev_info *revs)
+{
+ unsigned i;
+ struct commit *c;
+ struct object_array *array = &revs->boundary_commits;
+ struct object_array_entry *objects = array->objects;
+
+ /*
+ * If revs->commits is non-NULL at this point, an error occurred in
+ * get_revision_1(). Ignore the error and continue printing the
+ * boundary commits anyway. (This is what the code has always
+ * done.)
+ */
+ if (revs->commits) {
+ free_commit_list(revs->commits);
+ revs->commits = NULL;
+ }
+
+ /*
+ * Put all of the actual boundary commits from revs->boundary_commits
+ * into revs->commits
+ */
+ for (i = 0; i < array->nr; i++) {
+ c = (struct commit *)(objects[i].item);
+ if (!c)
+ continue;
+ if (!(c->object.flags & CHILD_SHOWN))
+ continue;
+ if (c->object.flags & (SHOWN | BOUNDARY))
+ continue;
+ c->object.flags |= BOUNDARY;
+ commit_list_insert(c, &revs->commits);
+ }
+
+ /*
+ * If revs->topo_order is set, sort the boundary commits
+ * in topological order
+ */
+ sort_in_topological_order(&revs->commits, revs->lifo);
+}
+
static struct commit *get_revision_internal(struct rev_info *revs)
{
struct commit *c = NULL;
struct commit_list *l;
if (revs->boundary == 2) {
- unsigned i;
- struct object_array *array = &revs->boundary_commits;
- struct object_array_entry *objects = array->objects;
- for (i = 0; i < array->nr; i++) {
- c = (struct commit *)(objects[i].item);
- if (!c)
- continue;
- if (!(c->object.flags & CHILD_SHOWN))
- continue;
- if (!(c->object.flags & SHOWN))
- break;
- }
- if (array->nr <= i)
- return NULL;
-
- c->object.flags |= SHOWN | BOUNDARY;
+ /*
+ * All of the normal commits have already been returned,
+ * and we are now returning boundary commits.
+ * create_boundary_commit_list() has populated
+ * revs->commits with the remaining commits to return.
+ */
+ c = pop_commit(&revs->commits);
+ if (c)
+ c->object.flags |= SHOWN;
return c;
}
@@ -1697,6 +1731,13 @@ static struct commit *get_revision_internal(struct rev_info *revs)
* switch to boundary commits output mode.
*/
revs->boundary = 2;
+
+ /*
+ * Update revs->commits to contain the list of
+ * boundary commits.
+ */
+ create_boundary_commit_list(revs);
+
return get_revision_internal(revs);
}
--
1.5.5.1.389.g35a9d
next prev parent reply other threads:[~2008-05-24 23:03 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-05-24 23:02 [PATCH 0/2] Fix output of "git log --graph --boundary" Adam Simpkins
2008-05-24 23:02 ` [PATCH 1/2] " Adam Simpkins
2008-05-24 23:02 ` Adam Simpkins [this message]
2008-05-25 19:20 ` Junio C Hamano
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=1211670125-10215-3-git-send-email-adam@adamsimpkins.net \
--to=adam@adamsimpkins.net \
--cc=git@vger.kernel.org \
/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 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).