mirror of
https://github.com/git/git.git
synced 2024-11-23 01:46:13 +08:00
remerge-diff: clean up temporary objdir at a central place
After running a diff between two things, or a series of diffs while walking the history, the diff computation is concluded by a call to diff_result_code() to extract the exit status of the diff machinery. The function can work on "struct diffopt", but all the callers historically and currently pass "struct diffopt" that is embedded in the "struct rev_info" that is used to hold the remerge_diff bit and the remerge_objdir variable that points at the temporary object directory in use. Redefine diff_result_code() to take the whole "struct rev_info" to give it an access to these members related to remerge-diff, so that it can get rid of the temporary object directory for any and all callers that used the feature. We can lose the equivalent code to do so from the code paths for individual commands, diff-tree, diff, and log. Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
245cac5c33
commit
4460e052e0
@ -687,7 +687,7 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
|
||||
BUG("malformed internal diff-index command line");
|
||||
run_diff_index(&revs, 0);
|
||||
|
||||
if (!diff_result_code(&revs.diffopt))
|
||||
if (!diff_result_code(&revs))
|
||||
suffix = NULL;
|
||||
else
|
||||
suffix = dirty;
|
||||
|
@ -82,7 +82,7 @@ int cmd_diff_files(int argc, const char **argv, const char *prefix)
|
||||
if (repo_read_index_preload(the_repository, &rev.diffopt.pathspec, 0) < 0)
|
||||
die_errno("repo_read_index_preload");
|
||||
run_diff_files(&rev, options);
|
||||
result = diff_result_code(&rev.diffopt);
|
||||
result = diff_result_code(&rev);
|
||||
release_revisions(&rev);
|
||||
return result;
|
||||
}
|
||||
|
@ -71,7 +71,7 @@ int cmd_diff_index(int argc, const char **argv, const char *prefix)
|
||||
return -1;
|
||||
}
|
||||
run_diff_index(&rev, option);
|
||||
result = diff_result_code(&rev.diffopt);
|
||||
result = diff_result_code(&rev);
|
||||
release_revisions(&rev);
|
||||
return result;
|
||||
}
|
||||
|
@ -232,10 +232,5 @@ int cmd_diff_tree(int argc, const char **argv, const char *prefix)
|
||||
diff_free(&opt->diffopt);
|
||||
}
|
||||
|
||||
if (opt->remerge_diff) {
|
||||
tmp_objdir_destroy(opt->remerge_objdir);
|
||||
opt->remerge_objdir = NULL;
|
||||
}
|
||||
|
||||
return diff_result_code(&opt->diffopt);
|
||||
return diff_result_code(opt);
|
||||
}
|
||||
|
@ -605,7 +605,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
|
||||
builtin_diff_combined(&rev, argc, argv,
|
||||
ent.objects, ent.nr,
|
||||
first_non_parent);
|
||||
result = diff_result_code(&rev.diffopt);
|
||||
result = diff_result_code(&rev);
|
||||
if (1 < rev.diffopt.skip_stat_unmatch)
|
||||
refresh_index_quietly();
|
||||
release_revisions(&rev);
|
||||
|
@ -493,6 +493,7 @@ static int cmd_log_walk_no_free(struct rev_info *rev)
|
||||
struct commit *commit;
|
||||
int saved_nrl = 0;
|
||||
int saved_dcctc = 0;
|
||||
int result;
|
||||
|
||||
if (rev->early_output)
|
||||
setup_early_output();
|
||||
@ -533,16 +534,12 @@ static int cmd_log_walk_no_free(struct rev_info *rev)
|
||||
rev->diffopt.degraded_cc_to_c = saved_dcctc;
|
||||
rev->diffopt.needed_rename_limit = saved_nrl;
|
||||
|
||||
if (rev->remerge_diff) {
|
||||
tmp_objdir_destroy(rev->remerge_objdir);
|
||||
rev->remerge_objdir = NULL;
|
||||
}
|
||||
|
||||
result = diff_result_code(rev);
|
||||
if (rev->diffopt.output_format & DIFF_FORMAT_CHECKDIFF &&
|
||||
rev->diffopt.flags.check_failed) {
|
||||
return 02;
|
||||
result = 02;
|
||||
}
|
||||
return diff_result_code(&rev->diffopt);
|
||||
return result;
|
||||
}
|
||||
|
||||
static int cmd_log_walk(struct rev_info *rev)
|
||||
|
@ -972,7 +972,7 @@ static int show_stash(int argc, const char **argv, const char *prefix)
|
||||
}
|
||||
log_tree_diff_flush(&rev);
|
||||
|
||||
ret = diff_result_code(&rev.diffopt);
|
||||
ret = diff_result_code(&rev);
|
||||
cleanup:
|
||||
strvec_clear(&stash_args);
|
||||
free_stash_info(&info);
|
||||
@ -1116,13 +1116,13 @@ static int check_changes_tracked_files(const struct pathspec *ps)
|
||||
diff_setup_done(&rev.diffopt);
|
||||
|
||||
run_diff_index(&rev, DIFF_INDEX_CACHED);
|
||||
if (diff_result_code(&rev.diffopt)) {
|
||||
if (diff_result_code(&rev)) {
|
||||
ret = 1;
|
||||
goto done;
|
||||
}
|
||||
|
||||
run_diff_files(&rev, 0);
|
||||
if (diff_result_code(&rev.diffopt)) {
|
||||
if (diff_result_code(&rev)) {
|
||||
ret = 1;
|
||||
goto done;
|
||||
}
|
||||
|
@ -675,7 +675,7 @@ static void status_submodule(const char *path, const struct object_id *ce_oid,
|
||||
setup_revisions(diff_files_args.nr, diff_files_args.v, &rev, &opt);
|
||||
run_diff_files(&rev, 0);
|
||||
|
||||
if (!diff_result_code(&rev.diffopt)) {
|
||||
if (!diff_result_code(&rev)) {
|
||||
print_status(flags, ' ', path, ce_oid,
|
||||
displaypath);
|
||||
} else if (!(flags & OPT_CACHED)) {
|
||||
|
@ -362,7 +362,7 @@ int diff_no_index(struct rev_info *revs,
|
||||
* The return code for --no-index imitates diff(1):
|
||||
* 0 = no changes, 1 = changes, else error
|
||||
*/
|
||||
ret = diff_result_code(&revs->diffopt);
|
||||
ret = diff_result_code(revs);
|
||||
|
||||
out:
|
||||
for (i = 0; i < ARRAY_SIZE(to_free); i++)
|
||||
|
10
diff.c
10
diff.c
@ -9,6 +9,7 @@
|
||||
#include "environment.h"
|
||||
#include "gettext.h"
|
||||
#include "tempfile.h"
|
||||
#include "revision.h"
|
||||
#include "quote.h"
|
||||
#include "diff.h"
|
||||
#include "diffcore.h"
|
||||
@ -26,6 +27,7 @@
|
||||
#include "merge-ll.h"
|
||||
#include "string-list.h"
|
||||
#include "strvec.h"
|
||||
#include "tmp-objdir.h"
|
||||
#include "graph.h"
|
||||
#include "oid-array.h"
|
||||
#include "packfile.h"
|
||||
@ -7012,10 +7014,16 @@ void diffcore_std(struct diff_options *options)
|
||||
options->found_follow = 0;
|
||||
}
|
||||
|
||||
int diff_result_code(struct diff_options *opt)
|
||||
int diff_result_code(struct rev_info *revs)
|
||||
{
|
||||
struct diff_options *opt = &revs->diffopt;
|
||||
int result = 0;
|
||||
|
||||
if (revs->remerge_diff) {
|
||||
tmp_objdir_destroy(revs->remerge_objdir);
|
||||
revs->remerge_objdir = NULL;
|
||||
}
|
||||
|
||||
diff_warn_rename_limit("diff.renameLimit",
|
||||
opt->needed_rename_limit,
|
||||
opt->degraded_cc_to_c);
|
||||
|
2
diff.h
2
diff.h
@ -648,7 +648,7 @@ int do_diff_cache(const struct object_id *, struct diff_options *);
|
||||
int diff_flush_patch_id(struct diff_options *, struct object_id *, int);
|
||||
void flush_one_hunk(struct object_id *result, git_hash_ctx *ctx);
|
||||
|
||||
int diff_result_code(struct diff_options *);
|
||||
int diff_result_code(struct rev_info *);
|
||||
|
||||
int diff_no_index(struct rev_info *,
|
||||
int implicit_no_index, int, const char **);
|
||||
|
@ -2582,7 +2582,7 @@ int has_unstaged_changes(struct repository *r, int ignore_submodules)
|
||||
rev_info.diffopt.flags.quick = 1;
|
||||
diff_setup_done(&rev_info.diffopt);
|
||||
run_diff_files(&rev_info, 0);
|
||||
result = diff_result_code(&rev_info.diffopt);
|
||||
result = diff_result_code(&rev_info);
|
||||
release_revisions(&rev_info);
|
||||
return result;
|
||||
}
|
||||
@ -2616,7 +2616,7 @@ int has_uncommitted_changes(struct repository *r,
|
||||
|
||||
diff_setup_done(&rev_info.diffopt);
|
||||
run_diff_index(&rev_info, DIFF_INDEX_CACHED);
|
||||
result = diff_result_code(&rev_info.diffopt);
|
||||
result = diff_result_code(&rev_info);
|
||||
release_revisions(&rev_info);
|
||||
return result;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user