add: use separate ADD_CACHE_RENORMALIZE flag

Commit 9472935d81 (add: introduce "--renormalize", 2017-11-16) taught
git-add to pass HASH_RENORMALIZE to add_to_index(), which then passes
the flag along to index_path(). However, the flags taken by
add_to_index() and the ones taken by index_path() are distinct
namespaces. We cannot take HASH_* flags in add_to_index(), because they
overlap with the ADD_CACHE_* flags we already take (in this case,
HASH_RENORMALIZE conflicts with ADD_CACHE_IGNORE_ERRORS).

We can solve this by adding a new ADD_CACHE_RENORMALIZE flag, and using
it to set HASH_RENORMALIZE within add_to_index(). In order to make it
clear that these two flags come from distinct sets, let's also change
the name "newflags" in the function to "hash_flags".

Reported-by: Dmitriy Smirnov <dmitriy.smirnov@jetbrains.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2019-01-17 11:27:11 -05:00 committed by Junio C Hamano
parent 98cdfbb84a
commit 9e5da3d055
4 changed files with 15 additions and 5 deletions

View File

@ -137,7 +137,7 @@ static int renormalize_tracked_files(const struct pathspec *pathspec, int flags)
continue; /* do not touch non blobs */ continue; /* do not touch non blobs */
if (pathspec && !ce_path_match(&the_index, ce, pathspec, NULL)) if (pathspec && !ce_path_match(&the_index, ce, pathspec, NULL))
continue; continue;
retval |= add_file_to_cache(ce->name, flags | HASH_RENORMALIZE); retval |= add_file_to_cache(ce->name, flags | ADD_CACHE_RENORMALIZE);
} }
return retval; return retval;

View File

@ -738,6 +738,7 @@ extern int index_name_pos(const struct index_state *, const char *name, int name
#define ADD_CACHE_JUST_APPEND 8 /* Append only; tree.c::read_tree() */ #define ADD_CACHE_JUST_APPEND 8 /* Append only; tree.c::read_tree() */
#define ADD_CACHE_NEW_ONLY 16 /* Do not replace existing ones */ #define ADD_CACHE_NEW_ONLY 16 /* Do not replace existing ones */
#define ADD_CACHE_KEEP_CACHE_TREE 32 /* Do not invalidate cache-tree */ #define ADD_CACHE_KEEP_CACHE_TREE 32 /* Do not invalidate cache-tree */
#define ADD_CACHE_RENORMALIZE 64 /* Pass along HASH_RENORMALIZE */
extern int add_index_entry(struct index_state *, struct cache_entry *ce, int option); extern int add_index_entry(struct index_state *, struct cache_entry *ce, int option);
extern void rename_index_entry_at(struct index_state *, int pos, const char *new_name); extern void rename_index_entry_at(struct index_state *, int pos, const char *new_name);

View File

@ -694,10 +694,10 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st,
int intent_only = flags & ADD_CACHE_INTENT; int intent_only = flags & ADD_CACHE_INTENT;
int add_option = (ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE| int add_option = (ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE|
(intent_only ? ADD_CACHE_NEW_ONLY : 0)); (intent_only ? ADD_CACHE_NEW_ONLY : 0));
int newflags = HASH_WRITE_OBJECT; int hash_flags = HASH_WRITE_OBJECT;
if (flags & HASH_RENORMALIZE) if (flags & ADD_CACHE_RENORMALIZE)
newflags |= HASH_RENORMALIZE; hash_flags |= HASH_RENORMALIZE;
if (!S_ISREG(st_mode) && !S_ISLNK(st_mode) && !S_ISDIR(st_mode)) if (!S_ISREG(st_mode) && !S_ISLNK(st_mode) && !S_ISDIR(st_mode))
return error("%s: can only add regular files, symbolic links or git-directories", path); return error("%s: can only add regular files, symbolic links or git-directories", path);
@ -753,7 +753,7 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st,
} }
} }
if (!intent_only) { if (!intent_only) {
if (index_path(&ce->oid, path, st, newflags)) { if (index_path(&ce->oid, path, st, hash_flags)) {
discard_cache_entry(ce); discard_cache_entry(ce);
return error("unable to index file %s", path); return error("unable to index file %s", path);
} }

View File

@ -27,4 +27,13 @@ test_expect_success 'renormalize CRLF in repo' '
test_cmp expect actual test_cmp expect actual
' '
test_expect_success 'ignore-errors not mistaken for renormalize' '
git reset --hard &&
echo "*.txt text=auto" >.gitattributes &&
git ls-files --eol >expect &&
git add --ignore-errors "*.txt" &&
git ls-files --eol >actual &&
test_cmp expect actual
'
test_done test_done