diff options
| author | Sam James <sam@gentoo.org> | 2025-06-08 01:48:42 +0100 |
|---|---|---|
| committer | Sam James <sam@gentoo.org> | 2025-06-08 01:48:42 +0100 |
| commit | a93a1343364d4af192b48964c004b07b4662b423 (patch) | |
| tree | f99c74ee99feeff1704e8d4d8842e59f3d92a5ed /dev-vcs/git/files/git-2.50.0-diff-implement-config.diff.renames-copies-harder.patch | |
| parent | a5793528843d558d1acb343e315bb8430ac6c219 (diff) | |
| download | gentoo-a93a1343364d4af192b48964c004b07b4662b423.tar.gz gentoo-a93a1343364d4af192b48964c004b07b4662b423.tar.bz2 gentoo-a93a1343364d4af192b48964c004b07b4662b423.zip | |
dev-vcs/git: rebase copies-harder patch for upcoming 2.50
Signed-off-by: Sam James <sam@gentoo.org>
Diffstat (limited to 'dev-vcs/git/files/git-2.50.0-diff-implement-config.diff.renames-copies-harder.patch')
| -rw-r--r-- | dev-vcs/git/files/git-2.50.0-diff-implement-config.diff.renames-copies-harder.patch | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/dev-vcs/git/files/git-2.50.0-diff-implement-config.diff.renames-copies-harder.patch b/dev-vcs/git/files/git-2.50.0-diff-implement-config.diff.renames-copies-harder.patch new file mode 100644 index 000000000000..f815ff7bedc5 --- /dev/null +++ b/dev-vcs/git/files/git-2.50.0-diff-implement-config.diff.renames-copies-harder.patch @@ -0,0 +1,163 @@ +https://lore.kernel.org/git/20240311213928.1872437-1-sam@gentoo.org/ + +From afe0cc87d790d7dbf33b83cf3e1ae23d5646e8e9 Mon Sep 17 00:00:00 2001 +Message-ID: <afe0cc87d790d7dbf33b83cf3e1ae23d5646e8e9.1749343442.git.sam@gentoo.org> +From: Sam James <sam@gentoo.org> +Date: Fri, 16 Feb 2024 22:07:54 +0000 +Subject: [PATCH] diff: implement config.diff.renames=copies-harder + +This patch adds a config value for 'diff.renames' called 'copies-harder' +which make it so '-C -C' is in effect always passed for 'git log -p', +'git diff', etc. + +This allows specifying that 'git log -p', 'git diff', etc should always act +as if '-C --find-copies-harder' was passed. + +It has proven this especially useful for certain types of repository (like +Gentoo's ebuild repositories) because files are often copies of a previous +version: + +Suppose a directory 'sys-devel/gcc' contains recipes for building +GCC, with one file for each supported upstream branch: + gcc-13.x.build.recipe + gcc-12.x.build.recipe + gcc-11.x.build.recipe + gcc-10.x.build.recipe + +gcc-13.x.build.recipe was started as a copy of gcc-12.x.build.recipe +(which was started as a copy of gcc-11.x.build.recipe, etc.). Previous versions +are kept around to support parallel installation of multiple versions. + +Being able to easily observe the diff relative to other recipes within the +directory has been a quality of life improvement for such repo layouts. + +Signed-off-by: Sam James <sam@gentoo.org> +--- + Documentation/config/diff.adoc | 6 +++--- + Documentation/config/status.adoc | 4 +++- + diff.c | 11 +++++++++-- + diff.h | 1 + + diffcore-rename.c | 6 ++++-- + merge-ort.c | 2 +- + 6 files changed, 21 insertions(+), 9 deletions(-) + +diff --git a/Documentation/config/diff.adoc b/Documentation/config/diff.adoc +index 1135a62a0a..5362d8091e 100644 +--- a/Documentation/config/diff.adoc ++++ b/Documentation/config/diff.adoc +@@ -158,9 +158,9 @@ endif::git-diff[] + Whether and how Git detects renames. If set to `false`, + rename detection is disabled. If set to `true`, basic rename + detection is enabled. If set to `copies` or `copy`, Git will +- detect copies, as well. Defaults to `true`. Note that this +- affects only `git diff` Porcelain like linkgit:git-diff[1] and +- linkgit:git-log[1], and not lower level commands such as ++ detect copies, as well. Defaults to `true`. ++ Note that this affects only 'git diff' Porcelain like linkgit:git-diff[1] ++ and linkgit:git-log[1], and not lower level commands such as + linkgit:git-diff-files[1]. + + `diff.suppressBlankEmpty`:: +diff --git a/Documentation/config/status.adoc b/Documentation/config/status.adoc +index 8caf90f51c..e15add32a3 100644 +--- a/Documentation/config/status.adoc ++++ b/Documentation/config/status.adoc +@@ -33,7 +33,9 @@ status.renames:: + Whether and how Git detects renames in linkgit:git-status[1] and + linkgit:git-commit[1] . If set to "false", rename detection is + disabled. If set to "true", basic rename detection is enabled. +- If set to "copies" or "copy", Git will detect copies, as well. ++ If set to "copies" or "copy", Git will detect copies, as well. If set ++ to "copies-harder", Git will spend extra cycles to find more copies even ++ in unmodified paths, see '--find-copies-harder' in linkgit:git-diff[1]. + Defaults to the value of diff.renames. + + status.showStash:: +diff --git a/diff.c b/diff.c +index 90e8003dd1..f0ca884280 100644 +--- a/diff.c ++++ b/diff.c +@@ -212,6 +212,8 @@ int git_config_rename(const char *var, const char *value) + { + if (!value) + return DIFF_DETECT_RENAME; ++ if (!strcasecmp(value, "copies-harder")) ++ return DIFF_DETECT_COPY_HARDER; + if (!strcasecmp(value, "copies") || !strcasecmp(value, "copy")) + return DIFF_DETECT_COPY; + return git_config_bool(var,value) ? DIFF_DETECT_RENAME : 0; +@@ -4902,8 +4904,12 @@ void diff_setup_done(struct diff_options *options) + else + options->flags.diff_from_contents = 0; + +- if (options->flags.find_copies_harder) ++ /* Just fold this in as it makes the patch-to-git smaller */ ++ if (options->flags.find_copies_harder || ++ options->detect_rename == DIFF_DETECT_COPY_HARDER) { ++ options->flags.find_copies_harder = 1; + options->detect_rename = DIFF_DETECT_COPY; ++ } + + if (!options->flags.relative_name) + options->prefix = NULL; +@@ -5342,7 +5348,8 @@ static int diff_opt_find_copies(const struct option *opt, + if (*arg != 0) + return error(_("invalid argument to %s"), opt->long_name); + +- if (options->detect_rename == DIFF_DETECT_COPY) ++ if (options->detect_rename == DIFF_DETECT_COPY || ++ options->detect_rename == DIFF_DETECT_COPY_HARDER) + options->flags.find_copies_harder = 1; + else + options->detect_rename = DIFF_DETECT_COPY; +diff --git a/diff.h b/diff.h +index 62e5768a9a..8c8aa6cbb6 100644 +--- a/diff.h ++++ b/diff.h +@@ -594,6 +594,7 @@ int git_config_rename(const char *var, const char *value); + + #define DIFF_DETECT_RENAME 1 + #define DIFF_DETECT_COPY 2 ++#define DIFF_DETECT_COPY_HARDER 3 + + #define DIFF_PICKAXE_ALL 1 + #define DIFF_PICKAXE_REGEX 2 +diff --git a/diffcore-rename.c b/diffcore-rename.c +index 7723bc3334..34a883a55d 100644 +--- a/diffcore-rename.c ++++ b/diffcore-rename.c +@@ -302,7 +302,8 @@ static int find_identical_files(struct hashmap *srcs, + } + /* Give higher scores to sources that haven't been used already */ + score = !source->rename_used; +- if (source->rename_used && options->detect_rename != DIFF_DETECT_COPY) ++ if (source->rename_used && options->detect_rename != DIFF_DETECT_COPY && ++ options->detect_rename != DIFF_DETECT_COPY_HARDER) + continue; + score += basename_same(source, target); + if (score > best_score) { +@@ -1407,7 +1408,8 @@ void diffcore_rename_extended(struct diff_options *options, + trace2_region_enter("diff", "setup", options->repo); + info.setup = 0; + ASSERT(!dir_rename_count || strmap_empty(dir_rename_count)); +- want_copies = (detect_rename == DIFF_DETECT_COPY); ++ want_copies = (detect_rename == DIFF_DETECT_COPY || ++ detect_rename == DIFF_DETECT_COPY_HARDER); + if (dirs_removed && (break_idx || want_copies)) + BUG("dirs_removed incompatible with break/copy detection"); + if (break_idx && relevant_sources) +diff --git a/merge-ort.c b/merge-ort.c +index 47b3d1730e..cb090c7af5 100644 +--- a/merge-ort.c ++++ b/merge-ort.c +@@ -4957,7 +4957,7 @@ static void merge_start(struct merge_options *opt, struct merge_result *result) + * sanity check them anyway. + */ + assert(opt->detect_renames >= -1 && +- opt->detect_renames <= DIFF_DETECT_COPY); ++ opt->detect_renames <= DIFF_DETECT_COPY_HARDER); + assert(opt->verbosity >= 0 && opt->verbosity <= 5); + assert(opt->buffer_output <= 2); + assert(opt->obuf.len == 0); +-- +2.49.0 |
