コード例 #1
0
ファイル: diff-lib.c プロジェクト: Provab-Solutions/git
/*
 * 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, DIFF_OPT_TST(diffopt, IGNORE_UNTRACKED_IN_SUBMODULES));
	}
	return changed;
}
コード例 #2
0
ファイル: diff-lib.c プロジェクト: jjuran/git
/*
 * 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)) {
        unsigned orig_flags = diffopt->flags;
        if (!DIFF_OPT_TST(diffopt, OVERRIDE_SUBMODULE_CONFIG))
            set_diffopt_flags_from_submodule_config(diffopt, ce->name);
        if (DIFF_OPT_TST(diffopt, IGNORE_SUBMODULES))
            changed = 0;
        else if (!DIFF_OPT_TST(diffopt, IGNORE_DIRTY_SUBMODULES)
                 && (!changed || DIFF_OPT_TST(diffopt, DIRTY_SUBMODULES)))
            *dirty_submodule = is_submodule_modified(ce->name, DIFF_OPT_TST(diffopt, IGNORE_UNTRACKED_IN_SUBMODULES));
        diffopt->flags = orig_flags;
    }
    return changed;
}
コード例 #3
0
ファイル: diff-lib.c プロジェクト: MichaelBlume/git
/*
 * 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,
				     const struct cache_entry *ce,
				     struct stat *st, unsigned ce_option,
				     unsigned *dirty_submodule)
{
	int changed = ie_match_stat(diffopt->repo->index, ce, st, ce_option);
	if (S_ISGITLINK(ce->ce_mode)) {
		struct diff_flags orig_flags = diffopt->flags;
		if (!diffopt->flags.override_submodule_config)
			set_diffopt_flags_from_submodule_config(diffopt, ce->name);
		if (diffopt->flags.ignore_submodules)
			changed = 0;
		else if (!diffopt->flags.ignore_dirty_submodules &&
			 (!changed || diffopt->flags.dirty_submodules))
			*dirty_submodule = is_submodule_modified(ce->name,
								 diffopt->flags.ignore_untracked_in_submodules);
		diffopt->flags = orig_flags;
	}
	return changed;
}
コード例 #4
0
ファイル: diff-lib.c プロジェクト: bartman/git
static int get_stat_data(struct cache_entry *ce,
                         const unsigned char **sha1p,
                         unsigned int *modep,
                         int cached, int match_missing,
                         unsigned *dirty_submodule, struct diff_options *diffopt)
{
    const unsigned char *sha1 = ce->sha1;
    unsigned int mode = ce->ce_mode;

    if (!cached && !ce_uptodate(ce)) {
        int changed;
        struct stat st;
        changed = check_removed(ce, &st);
        if (changed < 0)
            return -1;
        else if (changed) {
            if (match_missing) {
                *sha1p = sha1;
                *modep = mode;
                return 0;
            }
            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))
                && is_submodule_modified(ce->name)) {
            changed = 1;
            *dirty_submodule = 1;
        }
        if (changed) {
            mode = ce_mode_from_stat(ce, st.st_mode);
            sha1 = null_sha1;
        }
    }

    *sha1p = sha1;
    *modep = mode;
    return 0;
}
コード例 #5
0
ファイル: diff-lib.c プロジェクト: bartman/git
int run_diff_files(struct rev_info *revs, unsigned int option)
{
    int entries, i;
    int diff_unmerged_stage = revs->max_count;
    int silent_on_removed = option & DIFF_SILENT_ON_REMOVED;
    unsigned ce_option = ((option & DIFF_RACY_IS_MODIFIED)
                          ? CE_MATCH_RACY_IS_DIRTY : 0);

    diff_set_mnemonic_prefix(&revs->diffopt, "i/", "w/");

    if (diff_unmerged_stage < 0)
        diff_unmerged_stage = 2;
    entries = active_nr;
    for (i = 0; i < entries; i++) {
        struct stat st;
        unsigned int oldmode, newmode;
        struct cache_entry *ce = active_cache[i];
        int changed;
        unsigned dirty_submodule = 0;

        if (DIFF_OPT_TST(&revs->diffopt, QUICK) &&
                DIFF_OPT_TST(&revs->diffopt, HAS_CHANGES))
            break;

        if (!ce_path_match(ce, revs->prune_data))
            continue;

        if (ce_stage(ce)) {
            struct combine_diff_path *dpath;
            int num_compare_stages = 0;
            size_t path_len;

            path_len = ce_namelen(ce);

            dpath = xmalloc(combine_diff_path_size(5, path_len));
            dpath->path = (char *) &(dpath->parent[5]);

            dpath->next = NULL;
            dpath->len = path_len;
            memcpy(dpath->path, ce->name, path_len);
            dpath->path[path_len] = '\0';
            hashclr(dpath->sha1);
            memset(&(dpath->parent[0]), 0,
                   sizeof(struct combine_diff_parent)*5);

            changed = check_removed(ce, &st);
            if (!changed)
                dpath->mode = ce_mode_from_stat(ce, st.st_mode);
            else {
                if (changed < 0) {
                    perror(ce->name);
                    continue;
                }
                if (silent_on_removed)
                    continue;
            }

            while (i < entries) {
                struct cache_entry *nce = active_cache[i];
                int stage;

                if (strcmp(ce->name, nce->name))
                    break;

                /* Stage #2 (ours) is the first parent,
                 * stage #3 (theirs) is the second.
                 */
                stage = ce_stage(nce);
                if (2 <= stage) {
                    int mode = nce->ce_mode;
                    num_compare_stages++;
                    hashcpy(dpath->parent[stage-2].sha1, nce->sha1);
                    dpath->parent[stage-2].mode = ce_mode_from_stat(nce, mode);
                    dpath->parent[stage-2].status =
                        DIFF_STATUS_MODIFIED;
                }

                /* diff against the proper unmerged stage */
                if (stage == diff_unmerged_stage)
                    ce = nce;
                i++;
            }
            /*
             * Compensate for loop update
             */
            i--;

            if (revs->combine_merges && num_compare_stages == 2) {
                show_combined_diff(dpath, 2,
                                   revs->dense_combined_merges,
                                   revs);
                free(dpath);
                continue;
            }
            free(dpath);
            dpath = NULL;

            /*
             * Show the diff for the 'ce' if we found the one
             * from the desired stage.
             */
            diff_unmerge(&revs->diffopt, ce->name, 0, null_sha1);
            if (ce_stage(ce) != diff_unmerged_stage)
                continue;
        }

        if (ce_uptodate(ce) || ce_skip_worktree(ce))
            continue;

        /* If CE_VALID is set, don't look at workdir for file removal */
        changed = (ce->ce_flags & CE_VALID) ? 0 : check_removed(ce, &st);
        if (changed) {
            if (changed < 0) {
                perror(ce->name);
                continue;
            }
            if (silent_on_removed)
                continue;
            diff_addremove(&revs->diffopt, '-', ce->ce_mode,
                           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))
                && is_submodule_modified(ce->name)) {
            changed = 1;
            dirty_submodule = 1;
        }
        if (!changed) {
            ce_mark_uptodate(ce);
            if (!DIFF_OPT_TST(&revs->diffopt, FIND_COPIES_HARDER))
                continue;
        }
        oldmode = ce->ce_mode;
        newmode = ce_mode_from_stat(ce, st.st_mode);
        diff_change(&revs->diffopt, oldmode, newmode,
                    ce->sha1, (changed ? null_sha1 : ce->sha1),
                    ce->name, 0, dirty_submodule);

    }
    diffcore_std(&revs->diffopt);
    diff_flush(&revs->diffopt);
    return 0;
}