diff options
| author | Jens Lehmann <Jens.Lehmann@web.de> | 2010-03-11 22:50:25 +0100 | 
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2010-03-12 22:17:17 -0800 | 
| commit | ae6d5c1b6f78ef48f606e5a267915fa31b37a679 (patch) | |
| tree | a996130e95e7b8406148b630b0ad6ba998b47ca4 /diff-lib.c | |
| parent | 9297f77e6d350f33de961e149dc33c77e7392db4 (diff) | |
| download | git-ae6d5c1b6f78ef48f606e5a267915fa31b37a679.tar.gz | |
Refactor dirty submodule detection in diff-lib.c
Moving duplicated code into the new function match_stat_with_submodule().
Replacing the implicit activation of detailed checks for the dirtiness of
submodules when DIFF_FORMAT_PATCH was selected with explicitly setting
the recently added DIFF_OPT_DIRTY_SUBMODULES option in diff_setup_done().
Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'diff-lib.c')
| -rw-r--r-- | diff-lib.c | 45 | 
1 files changed, 27 insertions, 18 deletions
diff --git a/diff-lib.c b/diff-lib.c index 1ab286a3ce..ea9cf561cd 100644 --- a/diff-lib.c +++ b/diff-lib.c @@ -55,6 +55,29 @@ static int check_removed(const struct cache_entry *ce, struct stat *st)  	return 0;  } +/* + * Has a file changed or has a submodule new commits or a dirty work tree? + * + * Return 1 when changes are detected, 0 otherwise. If the DIRTY_SUBMODULES + * option is set, the caller does not only want to know if a submodule is + * modified at all but wants to know all the conditions that are met (new + * commits, untracked content and/or modified content). + */ +static int match_stat_with_submodule(struct diff_options *diffopt, +				      struct cache_entry *ce, struct stat *st, +				      unsigned ce_option, unsigned *dirty_submodule) +{ +	int changed = ce_match_stat(ce, st, ce_option); +	if (S_ISGITLINK(ce->ce_mode) +	    && !DIFF_OPT_TST(diffopt, IGNORE_SUBMODULES) +	    && (!changed || DIFF_OPT_TST(diffopt, DIRTY_SUBMODULES))) { +		*dirty_submodule = is_submodule_modified(ce->name); +		if (*dirty_submodule) +			changed = 1; +	} +	return changed; +} +  int run_diff_files(struct rev_info *revs, unsigned int option)  {  	int entries, i; @@ -177,15 +200,8 @@ int run_diff_files(struct rev_info *revs, unsigned int option)  				       ce->sha1, ce->name, 0);  			continue;  		} -		changed = ce_match_stat(ce, &st, ce_option); -		if (S_ISGITLINK(ce->ce_mode) -		    && !DIFF_OPT_TST(&revs->diffopt, IGNORE_SUBMODULES) -		    && (!changed || (revs->diffopt.output_format & DIFF_FORMAT_PATCH) -			|| DIFF_OPT_TST(&revs->diffopt, DIRTY_SUBMODULES))) { -			dirty_submodule = is_submodule_modified(ce->name); -			if (dirty_submodule) -				changed = 1; -		} +		changed = match_stat_with_submodule(&revs->diffopt, ce, &st, +						    ce_option, &dirty_submodule);  		if (!changed) {  			ce_mark_uptodate(ce);  			if (!DIFF_OPT_TST(&revs->diffopt, FIND_COPIES_HARDER)) @@ -241,15 +257,8 @@ static int get_stat_data(struct cache_entry *ce,  			}  			return -1;  		} -		changed = ce_match_stat(ce, &st, 0); -		if (S_ISGITLINK(ce->ce_mode) -		    && !DIFF_OPT_TST(diffopt, IGNORE_SUBMODULES) -		    && (!changed || (diffopt->output_format & DIFF_FORMAT_PATCH) -			|| DIFF_OPT_TST(diffopt, DIRTY_SUBMODULES))) { -			*dirty_submodule = is_submodule_modified(ce->name); -			if (*dirty_submodule) -				changed = 1; -		} +		changed = match_stat_with_submodule(diffopt, ce, &st, +						    0, dirty_submodule);  		if (changed) {  			mode = ce_mode_from_stat(ce, st.st_mode);  			sha1 = null_sha1;  | 
