git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jens Lehmann <Jens.Lehmann@web.de>
To: Jonathan Nieder <jrnieder@gmail.com>
Cc: git@vger.kernel.org, Junio C Hamano <gitster@pobox.com>,
	Johannes Schindelin <johannes.schindelin@gmx.de>
Subject: Re: [PATCH 8/8] diff --submodule: split into bite-sized pieces
Date: Wed, 16 Mar 2011 19:43:40 +0100	[thread overview]
Message-ID: <4D8104DC.2010700@web.de> (raw)
In-Reply-To: <20110316071411.GI5988@elie>

Am 16.03.2011 08:14, schrieb Jonathan Nieder:
> Introduce two functions:
> 
>  - prepare_submodule_summary prepares the revision walker
>    to list changes in a submodule.  That is, it:
> 
>    * finds merge bases between the commits pointed to this
>      path from before ("left") and after ("right") the change;
>    * checks whether this is a fast-forward or fast-backward;
>    * prepares a revision walk to list commits in the symmetric
>      difference between the commits at each endpoint.
> 
>    It returns nonzero on error.
> 
>  - print_submodule_summary runs the revision walk and saves
>    the result to a strbuf in --left-right format.
> 
> The goal is just readability.  No functional change intended.

Ack, looks good and makes sense to me.


> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
> ---
>  submodule.c |  103 +++++++++++++++++++++++++++++++++++------------------------
>  1 files changed, 61 insertions(+), 42 deletions(-)
> 
> diff --git a/submodule.c b/submodule.c
> index 6f1c107..e9f2b19 100644
> --- a/submodule.c
> +++ b/submodule.c
> @@ -152,17 +152,69 @@ void handle_ignore_submodules_arg(struct diff_options *diffopt,
>  		die("bad --ignore-submodules argument: %s", arg);
>  }
>  
> +static int prepare_submodule_summary(struct rev_info *rev, const char *path,
> +		struct commit *left, struct commit *right,
> +		int *fast_forward, int *fast_backward)
> +{
> +	struct commit_list *merge_bases, *list;
> +
> +	init_revisions(rev, NULL);
> +	setup_revisions(0, NULL, rev, NULL);
> +	rev->left_right = 1;
> +	rev->first_parent_only = 1;
> +	left->object.flags |= SYMMETRIC_LEFT;
> +	add_pending_object(rev, &left->object, path);
> +	add_pending_object(rev, &right->object, path);
> +	merge_bases = get_merge_bases(left, right, 1);
> +	if (merge_bases) {
> +		if (merge_bases->item == left)
> +			*fast_forward = 1;
> +		else if (merge_bases->item == right)
> +			*fast_backward = 1;
> +	}
> +	for (list = merge_bases; list; list = list->next) {
> +		list->item->object.flags |= UNINTERESTING;
> +		add_pending_object(rev, &list->item->object,
> +			sha1_to_hex(list->item->object.sha1));
> +	}
> +	return prepare_revision_walk(rev);
> +}
> +
> +static void print_submodule_summary(struct rev_info *rev, FILE *f,
> +		const char *del, const char *add, const char *reset)
> +{
> +	static const char format[] = "  %m %s";
> +	struct strbuf sb = STRBUF_INIT;
> +	struct commit *commit;
> +
> +	while ((commit = get_revision(rev))) {
> +		struct pretty_print_context ctx = {0};
> +		ctx.date_mode = rev->date_mode;
> +		strbuf_setlen(&sb, 0);
> +		if (commit->object.flags & SYMMETRIC_LEFT) {
> +			if (del)
> +				strbuf_addstr(&sb, del);
> +		}
> +		else if (add)
> +			strbuf_addstr(&sb, add);
> +		format_commit_message(commit, format, &sb, &ctx);
> +		if (reset)
> +			strbuf_addstr(&sb, reset);
> +		strbuf_addch(&sb, '\n');
> +		fprintf(f, "%s", sb.buf);
> +	}
> +	strbuf_release(&sb);
> +}
> +
>  void show_submodule_summary(FILE *f, const char *path,
>  		unsigned char one[20], unsigned char two[20],
>  		unsigned dirty_submodule,
>  		const char *del, const char *add, const char *reset)
>  {
>  	struct rev_info rev;
> -	struct commit *commit, *left = left, *right = right;
> -	struct commit_list *merge_bases, *list;
> +	struct commit *left = left, *right = right;
>  	const char *message = NULL;
>  	struct strbuf sb = STRBUF_INIT;
> -	static const char *format = "  %m %s";
>  	int fast_forward = 0, fast_backward = 0;
>  
>  	if (is_null_sha1(two))
> @@ -175,29 +227,10 @@ void show_submodule_summary(FILE *f, const char *path,
>  		 !(right = lookup_commit_reference(two)))
>  		message = "(commits not present)";
>  
> -	if (!message) {
> -		init_revisions(&rev, NULL);
> -		setup_revisions(0, NULL, &rev, NULL);
> -		rev.left_right = 1;
> -		rev.first_parent_only = 1;
> -		left->object.flags |= SYMMETRIC_LEFT;
> -		add_pending_object(&rev, &left->object, path);
> -		add_pending_object(&rev, &right->object, path);
> -		merge_bases = get_merge_bases(left, right, 1);
> -		if (merge_bases) {
> -			if (merge_bases->item == left)
> -				fast_forward = 1;
> -			else if (merge_bases->item == right)
> -				fast_backward = 1;
> -		}
> -		for (list = merge_bases; list; list = list->next) {
> -			list->item->object.flags |= UNINTERESTING;
> -			add_pending_object(&rev, &list->item->object,
> -				sha1_to_hex(list->item->object.sha1));
> -		}
> -		if (prepare_revision_walk(&rev))
> -			message = "(revision walker failed)";
> -	}
> +	if (!message &&
> +	    prepare_submodule_summary(&rev, path, left, right,
> +					&fast_forward, &fast_backward))
> +		message = "(revision walker failed)";
>  
>  	if (dirty_submodule & DIRTY_SUBMODULE_UNTRACKED)
>  		fprintf(f, "Submodule %s contains untracked content\n", path);
> @@ -221,25 +254,11 @@ void show_submodule_summary(FILE *f, const char *path,
>  	fwrite(sb.buf, sb.len, 1, f);
>  
>  	if (!message) {
> -		while ((commit = get_revision(&rev))) {
> -			struct pretty_print_context ctx = {0};
> -			ctx.date_mode = rev.date_mode;
> -			strbuf_setlen(&sb, 0);
> -			if (commit->object.flags & SYMMETRIC_LEFT) {
> -				if (del)
> -					strbuf_addstr(&sb, del);
> -			}
> -			else if (add)
> -				strbuf_addstr(&sb, add);
> -			format_commit_message(commit, format, &sb, &ctx);
> -			if (reset)
> -				strbuf_addstr(&sb, reset);
> -			strbuf_addch(&sb, '\n');
> -			fprintf(f, "%s", sb.buf);
> -		}
> +		print_submodule_summary(&rev, f, del, add, reset);
>  		clear_commit_marks(left, ~0);
>  		clear_commit_marks(right, ~0);
>  	}
> +
>  	strbuf_release(&sb);
>  }
>  

  reply	other threads:[~2011-03-16 18:43 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-03-16  2:49 [PATCH/RFC] reflog: silence -O3 -Wuninitialized warning Jonathan Nieder
2011-03-16  3:42 ` [PATCH nd/struct-pathspec] declare 1-bit bitfields to be unsigned Jonathan Nieder
2011-03-16  5:38   ` Junio C Hamano
2011-03-16 14:20   ` Nguyen Thai Ngoc Duy
2011-03-16  5:22 ` [PATCH/RFC] reflog: silence -O3 -Wuninitialized warning Junio C Hamano
2011-03-16  6:28   ` Jonathan Nieder
2011-03-16  9:09   ` Johannes Sixt
2011-03-16  9:47     ` Jonathan Nieder
2011-03-16  9:54       ` Johannes Sixt
2011-03-16 10:57         ` Jonathan Nieder
2011-03-16 11:35           ` [RFC/PATCH 0/6] silence -Wuninitialized warnings that previously used the a = a trick Jonathan Nieder
2011-03-16 11:36             ` [PATCH 1/6] match-trees: kill off remaining -Wuninitialized warning Jonathan Nieder
2011-03-16 11:36             ` [PATCH 2/6] run-command: initialize failed_errno to 0 Jonathan Nieder
2011-03-16 11:37             ` [PATCH 3/6] diff --submodule: suppress -Wuninitialized warning by initializing to NULL Jonathan Nieder
2011-03-16 11:37             ` [PATCH 4/6] rsync transport: clarify insert_packed_refs Jonathan Nieder
2011-03-16 11:37             ` [PATCH 5/6] wt-status: protect against invalid change_type Jonathan Nieder
2011-03-16 11:38             ` [PATCH 6/6] fast-import: suppress -Wuninitialized warning by initializing to NULL Jonathan Nieder
2011-03-16  6:53 ` [PATCH 0/8] more warnings and cleanups Jonathan Nieder
2011-03-16  6:59   ` [PATCH 1/8] enums: omit trailing comma for portability Jonathan Nieder
2011-03-16  7:00   ` [PATCH 2/8] compat: make gcc bswap an inline function Jonathan Nieder
2011-03-16  9:21     ` Johannes Sixt
2011-03-16  9:31       ` Jonathan Nieder
2011-03-16 19:44         ` Junio C Hamano
2011-03-16  7:01   ` [PATCH 3/8] svn-fe: do not use "return" for tail call returning void Jonathan Nieder
2011-03-16  7:02   ` [PATCH 4/8] vcs-svn: remove spurious semicolons Jonathan Nieder
2011-03-16 19:47     ` Junio C Hamano
2011-03-16 20:03       ` Jonathan Nieder
2011-03-16  7:08   ` [PATCH 5/8] standardize brace placement in struct definitions Jonathan Nieder
2011-03-18  7:25     ` Junio C Hamano
2011-03-16  7:10   ` [PATCH 6/8] branch: split off function that writes tracking info and commit subject Jonathan Nieder
2011-03-16  7:12   ` [PATCH 7/8] cherry: split off function to print output lines Jonathan Nieder
2011-03-16  7:14   ` [PATCH 8/8] diff --submodule: split into bite-sized pieces Jonathan Nieder
2011-03-16 18:43     ` Jens Lehmann [this message]
2011-03-16 19:33       ` Jonathan Nieder

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=4D8104DC.2010700@web.de \
    --to=jens.lehmann@web.de \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=johannes.schindelin@gmx.de \
    --cc=jrnieder@gmail.com \
    /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).