From c5ccd8be43df4b916752a176512a9adaf3b94df9 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Sat, 15 Apr 2006 12:09:56 -0700 Subject: [PATCH] Tentative built-in "git show" This uses the "--no-walk" flag that I never actually implemented (but I'm sure I mentioned it) to make "git show" be essentially the same thing as "git whatchanged --no-walk". It just refuses to add more interesting parents to the revision walking history, so you don't actually get any history, you just get the commit you asked for. I was going to add "--no-walk" as a real argument flag to git-rev-list too, but I'm not sure anybody actually needs it. Although it might be useful for porcelain, so I left the door open. Signed-off-by: Linus Torvalds Signed-off-by: Junio C Hamano --- git.c | 15 +++++++++++++++ log-tree.c | 2 ++ revision.c | 5 +++++ revision.h | 1 + 4 files changed, 23 insertions(+) diff --git a/git.c b/git.c index 939a34caf9..c87accfa1a 100644 --- a/git.c +++ b/git.c @@ -363,6 +363,20 @@ static int cmd_whatchanged(int ac, const char **av, char **ep) return cmd_log_wc(ac, av, ep, &wcopt); } +static int cmd_show(int ac, const char **av, char **ep) +{ + struct whatchanged_opt wcopt; + + memset(&wcopt, 0, sizeof(wcopt)); + wcopt.do_diff = 1; + init_log_tree_opt(&wcopt.logopt); + wcopt.logopt.ignore_merges = 0; + wcopt.logopt.combine_merges = 1; + wcopt.logopt.dense_combined_merges = 1; + wcopt.logopt.diffopt.recursive = 1; + return cmd_log_wc(ac, av, ep, &wcopt); +} + static void handle_internal_command(int argc, const char **argv, char **envp) { const char *cmd = argv[0]; @@ -373,6 +387,7 @@ static void handle_internal_command(int argc, const char **argv, char **envp) { "version", cmd_version }, { "help", cmd_help }, { "log", cmd_log }, + { "show", cmd_show }, { "whatchanged", cmd_whatchanged }, }; int i; diff --git a/log-tree.c b/log-tree.c index cb0d0b15e7..17e976a637 100644 --- a/log-tree.c +++ b/log-tree.c @@ -182,6 +182,8 @@ int parse_whatchanged_opt(int ac, const char **av, struct whatchanged_opt *wcopt int left = 1; ac = setup_revisions(ac, av, rev, "HEAD"); + if (!strcmp(av[0], "show")) + rev->no_walk = 1; while (1 < ac) { const char *arg = av[1]; if (!strncmp(arg, "--pretty", 8)) { diff --git a/revision.c b/revision.c index 0505f3f455..0c3c392fde 100644 --- a/revision.c +++ b/revision.c @@ -375,6 +375,9 @@ static void add_parents_to_list(struct rev_info *revs, struct commit *commit, st if (revs->prune_fn) revs->prune_fn(revs, commit); + if (revs->no_walk) + return; + parent = commit->parents; while (parent) { struct commit *p = parent->item; @@ -714,6 +717,8 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch void prepare_revision_walk(struct rev_info *revs) { + if (revs->no_walk) + return; sort_by_date(&revs->commits); if (revs->limited) limit_list(revs); diff --git a/revision.h b/revision.h index 8970b57e3c..ff2a13ea87 100644 --- a/revision.h +++ b/revision.h @@ -26,6 +26,7 @@ struct rev_info { /* Traversal flags */ unsigned int dense:1, no_merges:1, + no_walk:1, remove_empty_trees:1, lifo:1, topo_order:1,