* [PATCH] merge: ignore whitespace changes when detecting renames
@ 2023-10-25 12:14 Stefan Muenzel via GitGitGadget
0 siblings, 0 replies; only message in thread
From: Stefan Muenzel via GitGitGadget @ 2023-10-25 12:14 UTC (permalink / raw)
To: git; +Cc: Stefan Muenzel, Stefan Muenzel
From: Stefan Muenzel <source@s.muenzel.net>
The options ignore-space-changes and ignore-all-space for
merge strategies based on "ort" are now propagated
to the computation of file renames, by normalizing spacing
changes when computing file hashes.
Signed-off-by: Stefan Muenzel <source@s.muenzel.net>
---
merge: ignore whitespace changes when detecting renames
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1600%2Fsmuenzel%2Frenames-ignore-whitespace-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1600/smuenzel/renames-ignore-whitespace-v1
Pull-Request: https://github.com/git/git/pull/1600
diff.c | 4 ++++
diffcore-delta.c | 14 ++++++++++++++
diffcore-rename.c | 9 +++++++++
diffcore.h | 2 ++
merge-recursive.c | 1 +
5 files changed, 30 insertions(+)
diff --git a/diff.c b/diff.c
index 2c602df10a3..916cc38f57c 100644
--- a/diff.c
+++ b/diff.c
@@ -4081,6 +4081,7 @@ int diff_populate_filespec(struct repository *r,
{
int size_only = options ? options->check_size_only : 0;
int check_binary = options ? options->check_binary : 0;
+ int ignore_whitespace = options ? options->ignore_whitespace : 0;
int err = 0;
int conv_flags = global_conv_flags_eol;
/*
@@ -4090,6 +4091,9 @@ int diff_populate_filespec(struct repository *r,
if (conv_flags & CONV_EOL_RNDTRP_DIE)
conv_flags = CONV_EOL_RNDTRP_WARN;
+ if (ignore_whitespace)
+ s->ignore_whitespace = 1;
+
if (!DIFF_FILE_VALID(s))
die("internal error: asking to populate invalid file.");
if (S_ISDIR(s->mode))
diff --git a/diffcore-delta.c b/diffcore-delta.c
index c30b56e983b..e2bb5f9133a 100644
--- a/diffcore-delta.c
+++ b/diffcore-delta.c
@@ -130,6 +130,7 @@ static struct spanhash_top *hash_chars(struct repository *r,
unsigned char *buf = one->data;
unsigned int sz = one->size;
int is_text = !diff_filespec_is_binary(r, one);
+ int ignore_whitespace = one->ignore_whitespace;
i = INITIAL_HASH_SIZE;
hash = xmalloc(st_add(sizeof(*hash),
@@ -149,6 +150,19 @@ static struct spanhash_top *hash_chars(struct repository *r,
if (is_text && c == '\r' && sz && *buf == '\n')
continue;
+ if (is_text && ignore_whitespace && isspace(c)) {
+ if (sz) {
+ char next = *buf;
+ if ( c == '\n' && next == '\n')
+ continue;
+ else if ( c != '\n' && isspace(next))
+ continue;
+ }
+ if ( c != '\n')
+ /* Normalize whitespace to space*/
+ c = ' ';
+ }
+
accum1 = (accum1 << 7) ^ (accum2 >> 25);
accum2 = (accum2 << 7) ^ (old_1 >> 25);
accum1 += c;
diff --git a/diffcore-rename.c b/diffcore-rename.c
index 5a6e2bcac71..ee68442afc3 100644
--- a/diffcore-rename.c
+++ b/diffcore-rename.c
@@ -14,6 +14,7 @@
#include "string-list.h"
#include "strmap.h"
#include "trace2.h"
+#include "xdiff-interface.h"
/* Table of rename/copy destinations */
@@ -950,6 +951,10 @@ static int find_basename_matches(struct diff_options *options,
.info = info
};
+ dpf_options.ignore_whitespace =
+ DIFF_XDL_TST(options, IGNORE_WHITESPACE_CHANGE)
+ || DIFF_XDL_TST(options, IGNORE_WHITESPACE);
+
/*
* Create maps of basename -> fullname(s) for remaining sources and
* dests.
@@ -1402,6 +1407,10 @@ void diffcore_rename_extended(struct diff_options *options,
.repo = options->repo
};
+ dpf_options.ignore_whitespace =
+ DIFF_XDL_TST(options, IGNORE_WHITESPACE_CHANGE)
+ || DIFF_XDL_TST(options, IGNORE_WHITESPACE);
+
trace2_region_enter("diff", "setup", options->repo);
info.setup = 0;
assert(!dir_rename_count || strmap_empty(dir_rename_count));
diff --git a/diffcore.h b/diffcore.h
index 5ffe4ec788f..d6bee67e646 100644
--- a/diffcore.h
+++ b/diffcore.h
@@ -61,6 +61,7 @@ struct diff_filespec {
unsigned has_more_entries : 1; /* only appear in combined diff */
/* data should be considered "binary"; -1 means "don't know yet" */
signed int is_binary : 2;
+ unsigned ignore_whitespace : 1;
struct userdiff_driver *driver;
};
@@ -78,6 +79,7 @@ void diff_queued_diff_prefetch(void *repository);
struct diff_populate_filespec_options {
unsigned check_size_only : 1;
unsigned check_binary : 1;
+ unsigned ignore_whitespace : 1;
/*
* If an object is missing, diff_populate_filespec() will invoke this
diff --git a/merge-recursive.c b/merge-recursive.c
index e3beb0801b1..0e52c45158a 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -1894,6 +1894,7 @@ static struct diff_queue_struct *get_diffpairs(struct merge_options *opt,
repo_diff_setup(opt->repo, &opts);
opts.flags.recursive = 1;
opts.flags.rename_empty = 0;
+ opts.xdl_opts = opt->xdl_opts;
opts.detect_rename = merge_detect_rename(opt);
/*
* We do not have logic to handle the detection of copies. In
base-commit: 2e8e77cbac8ac17f94eee2087187fa1718e38b14
--
gitgitgadget
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2023-10-25 12:14 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-10-25 12:14 [PATCH] merge: ignore whitespace changes when detecting renames Stefan Muenzel via GitGitGadget
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).