All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
To: git@vger.kernel.org
Cc: demerphq@gmail.com, dak@gnu.org, vfr@lyx.org,
	francisstephens@gmail.com,
	"Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Subject: [PATCH] log: add --show-linear-break to help see non-linear history
Date: Sat,  8 Feb 2014 20:50:17 +0700	[thread overview]
Message-ID: <1391867417-979-1-git-send-email-pclouds@gmail.com> (raw)
In-Reply-To: <CANgJU+UcONQYAQ7K-_W7H_12JhfG+iuqYAU81xYMc5kLPXwn_Q@mail.gmail.com>

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 This is a more serious attempt to make non-linear history more
 visible without --graph. It looks like this

    commit e4ddb05720710213108cd13ddd5a115e12a6211d
    Author: Andy Spencer <andy753421@gmail.com>
    
        tree_entry_interesting: match against all pathspecs
    
                        ..........
    
    commit a0332337be53f266682279c72a5e553986638c87
    Author: Jeff King <peff@peff.net>
    
        t7700: do not use "touch" unnecessarily
    
    commit 088304bf73b9b4149e04d2246fe08a06eef6e795
    Author: Jeff King <peff@peff.net>
    
        t7501: fix "empty commit" test with NO_PERL
    
                        ..........
    
    commit 74b4f7f27736f3e196a4eb3db41c68e37a6e2160
    Author: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
    
        tree-walk.c: ignore trailing slash on submodule in tree_entry_interesting()

 You can use fancier break bars from [1] instead of plain dots. I'm
 not sure it works with all combinations of rev-list. But at least
 log (with/out pathspec) and log --reverse work.
 
 [1] http://www.ascii-art.de/ascii/ab/border.txt

 Documentation/rev-list-options.txt |  7 +++++
 log-tree.c                         |  4 +++
 revision.c                         | 52 +++++++++++++++++++++++++++++++++++---
 revision.h                         |  6 +++++
 4 files changed, 66 insertions(+), 3 deletions(-)

diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt
index 03533af..a0780be 100644
--- a/Documentation/rev-list-options.txt
+++ b/Documentation/rev-list-options.txt
@@ -750,6 +750,13 @@ This enables parent rewriting, see 'History Simplification' below.
 This implies the `--topo-order` option by default, but the
 `--date-order` option may also be specified.
 
+--show-linear-break[=<break bar>]::
+	When --graph is not used, all history branches are flatten and
+	could be hard to see that the two consecutive commits do not
+	belong to a linear branch. This option puts a break bar in
+	between them in that case. If `<break bar>` is specified, it
+	is the string that will be shown instead of the default one.
+
 ifdef::git-rev-list[]
 --count::
 	Print a number stating how many commits would have been
diff --git a/log-tree.c b/log-tree.c
index 08970bf..17862f6 100644
--- a/log-tree.c
+++ b/log-tree.c
@@ -805,12 +805,16 @@ int log_tree_commit(struct rev_info *opt, struct commit *commit)
 	if (opt->line_level_traverse)
 		return line_log_print(opt, commit);
 
+	if (opt->track_linear && !opt->linear && !opt->reverse_output_stage)
+		printf("\n%s\n", opt->break_bar);
 	shown = log_tree_diff(opt, commit, &log);
 	if (!shown && opt->loginfo && opt->always_show_header) {
 		log.parent = NULL;
 		show_log(opt);
 		shown = 1;
 	}
+	if (opt->track_linear && !opt->linear && opt->reverse_output_stage)
+		printf("\n%s\n", opt->break_bar);
 	opt->loginfo = NULL;
 	maybe_flush_or_die(stdout, "stdout");
 	return shown;
diff --git a/revision.c b/revision.c
index a0df72f..ff3107f 100644
--- a/revision.c
+++ b/revision.c
@@ -1836,6 +1836,12 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
 		revs->notes_opt.use_default_notes = 1;
 	} else if (!strcmp(arg, "--show-signature")) {
 		revs->show_signature = 1;
+	} else if (!strcmp(arg, "--show-linear-break")) {
+		revs->track_linear = 1;
+		revs->break_bar = "                    ..........";
+	} else if (starts_with(arg, "--show-linear-break=")) {
+		revs->track_linear = 1;
+		revs->break_bar = xstrdup(arg + 20);
 	} else if (starts_with(arg, "--show-notes=") ||
 		   starts_with(arg, "--notes=")) {
 		struct strbuf buf = STRBUF_INIT;
@@ -2901,6 +2907,32 @@ enum commit_action simplify_commit(struct rev_info *revs, struct commit *commit)
 	return action;
 }
 
+define_commit_slab(saved_linear, int);
+
+static void track_linear(struct rev_info *revs, struct commit *commit)
+{
+	struct commit_list *p = revs->previous_parents;
+
+	if (p) {
+		int got_parent = 0;
+		for (; p && !got_parent; p = p->next)
+			got_parent = !hashcmp(p->item->object.sha1,
+					      commit->object.sha1);
+		revs->linear = got_parent;
+		free_commit_list(revs->previous_parents);
+	} else
+		revs->linear = 1;
+	if (revs->reverse) {
+		if (!revs->saved_linear_slab) {
+			revs->saved_linear_slab = xmalloc(sizeof(struct saved_linear));
+			init_saved_linear(revs->saved_linear_slab);
+		}
+
+		*saved_linear_at(revs->saved_linear_slab, commit) = revs->linear;
+	}
+	revs->previous_parents = copy_commit_list(commit->parents);
+}
+
 static struct commit *get_revision_1(struct rev_info *revs)
 {
 	if (!revs->commits)
@@ -2933,6 +2965,9 @@ static struct commit *get_revision_1(struct rev_info *revs)
 				    sha1_to_hex(commit->object.sha1));
 		}
 
+		if (revs->track_linear)
+			track_linear(revs, commit);
+
 		switch (simplify_commit(revs, commit)) {
 		case commit_ignore:
 			continue;
@@ -3106,14 +3141,25 @@ struct commit *get_revision(struct rev_info *revs)
 		revs->reverse_output_stage = 1;
 	}
 
-	if (revs->reverse_output_stage)
-		return pop_commit(&revs->commits);
+	if (revs->reverse_output_stage) {
+		c = pop_commit(&revs->commits);
+		if (revs->track_linear)
+			revs->linear = *saved_linear_at(revs->saved_linear_slab, c);
+		return c;
+	}
 
 	c = get_revision_internal(revs);
 	if (c && revs->graph)
 		graph_update(revs->graph, c);
-	if (!c)
+	if (!c) {
 		free_saved_parents(revs);
+		if (revs->saved_linear_slab)
+			clear_saved_linear(revs->saved_linear_slab);
+		if (revs->previous_parents) {
+			free_commit_list(revs->previous_parents);
+			revs->previous_parents = NULL;
+		}
+	}
 	return c;
 }
 
diff --git a/revision.h b/revision.h
index 88967d6..bffdc15 100644
--- a/revision.h
+++ b/revision.h
@@ -134,6 +134,7 @@ struct rev_info {
 			use_terminator:1,
 			missing_newline:1,
 			date_mode_explicit:1,
+			track_linear:1,
 			preserve_subject:1;
 	unsigned int	disable_stdin:1;
 	unsigned int	leak_pending:1;
@@ -195,6 +196,11 @@ struct rev_info {
 
 	/* copies of the parent lists, for --full-diff display */
 	struct saved_parents *saved_parents_slab;
+
+	struct commit_list *previous_parents;
+	struct saved_linear *saved_linear_slab;
+	char *break_bar;
+	unsigned int linear;
 };
 
 extern int ref_excluded(struct string_list *, const char *path);
-- 
1.8.5.2.240.g8478abd

  reply	other threads:[~2014-02-08 13:50 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-06 14:02 Confusing git log --- First time bug submission please advise on best practices Francis Stephens
2014-02-06 16:08 ` Vincent van Ravesteijn
2014-02-06 16:10   ` David Kastrup
2014-02-07  9:43     ` Francis Stephens
2014-02-07 10:26       ` Duy Nguyen
2014-02-07 11:37         ` demerphq
2014-02-08 13:50           ` Nguyễn Thái Ngọc Duy [this message]
2014-03-17 12:51             ` [PATCH v2] log: add --nonlinear-barrier to help see non-linear history Nguyễn Thái Ngọc Duy
2014-03-17 19:09               ` Eric Sunshine
2014-03-17 20:32               ` Junio C Hamano
2014-03-18 11:46                 ` Duy Nguyen
2014-03-18 19:08                   ` Junio C Hamano
2014-03-20  5:44               ` [PATCH v3 1/2] object.h: centralize object flag allocation Nguyễn Thái Ngọc Duy
2014-03-20  5:44                 ` [PATCH v3 2/2] log: add --show-linear-break to help see non-linear history Nguyễn Thái Ngọc Duy
2014-03-20 19:15                   ` Junio C Hamano
2014-03-21  1:02                     ` Duy Nguyen
2014-03-25 13:23                 ` [PATCH v4 1/2] object.h: centralize object flag allocation Nguyễn Thái Ngọc Duy
2014-03-25 13:23                   ` [PATCH v4 2/2] log: add --show-linear-break to help see non-linear history Nguyễn Thái Ngọc Duy
2014-03-25 22:30                     ` 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=1391867417-979-1-git-send-email-pclouds@gmail.com \
    --to=pclouds@gmail.com \
    --cc=dak@gnu.org \
    --cc=demerphq@gmail.com \
    --cc=francisstephens@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=vfr@lyx.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 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.