diff options
Diffstat (limited to 'third_party/git/convert.c')
-rw-r--r-- | third_party/git/convert.c | 49 |
1 files changed, 31 insertions, 18 deletions
diff --git a/third_party/git/convert.c b/third_party/git/convert.c index 94ff83764922..5ead3ce678bb 100644 --- a/third_party/git/convert.c +++ b/third_party/git/convert.c @@ -8,6 +8,7 @@ #include "pkt-line.h" #include "sub-process.h" #include "utf8.h" +#include "ll-merge.h" /* * convert.c - convert a file when checking it out and checking it in. @@ -269,8 +270,12 @@ static int will_convert_lf_to_crlf(struct text_stat *stats, static int validate_encoding(const char *path, const char *enc, const char *data, size_t len, int die_on_error) { + const char *stripped; + /* We only check for UTF here as UTF?? can be an alias for UTF-?? */ - if (istarts_with(enc, "UTF")) { + if (skip_iprefix(enc, "UTF", &stripped)) { + skip_prefix(stripped, "-", &stripped); + /* * Check for detectable errors in UTF encodings */ @@ -284,15 +289,10 @@ static int validate_encoding(const char *path, const char *enc, */ const char *advise_msg = _( "The file '%s' contains a byte order " - "mark (BOM). Please use UTF-%s as " + "mark (BOM). Please use UTF-%.*s as " "working-tree-encoding."); - const char *stripped = NULL; - char *upper = xstrdup_toupper(enc); - upper[strlen(upper)-2] = '\0'; - if (!skip_prefix(upper, "UTF-", &stripped)) - skip_prefix(stripped, "UTF", &stripped); - advise(advise_msg, path, stripped); - free(upper); + int stripped_len = strlen(stripped) - strlen("BE"); + advise(advise_msg, path, stripped_len, stripped); if (die_on_error) die(error_msg, path, enc); else { @@ -307,12 +307,7 @@ static int validate_encoding(const char *path, const char *enc, "mark (BOM). Please use UTF-%sBE or UTF-%sLE " "(depending on the byte order) as " "working-tree-encoding."); - const char *stripped = NULL; - char *upper = xstrdup_toupper(enc); - if (!skip_prefix(upper, "UTF-", &stripped)) - skip_prefix(stripped, "UTF", &stripped); advise(advise_msg, path, stripped, stripped); - free(upper); if (die_on_error) die(error_msg, path, enc); else { @@ -417,7 +412,7 @@ static int encode_to_git(const char *path, const char *src, size_t src_len, if (!dst) { /* * We could add the blob "as-is" to Git. However, on checkout - * we would try to reencode to the original encoding. This + * we would try to re-encode to the original encoding. This * would fail and we would leave the user with a messed-up * working tree. Let's try to avoid this by screaming loud. */ @@ -1151,7 +1146,7 @@ static int ident_to_worktree(const char *src, size_t len, /* are we "faking" in place editing ? */ if (src == buf->buf) to_free = strbuf_detach(buf, NULL); - hash_object_file(src, len, "blob", &oid); + hash_object_file(the_hash_algo, src, len, "blob", &oid); strbuf_grow(buf, len + cnt * (the_hash_algo->hexsz + 3)); for (;;) { @@ -1293,10 +1288,11 @@ struct conv_attrs { const char *working_tree_encoding; /* Supported encoding or default encoding if NULL */ }; +static struct attr_check *check; + static void convert_attrs(const struct index_state *istate, struct conv_attrs *ca, const char *path) { - static struct attr_check *check; struct attr_check_item *ccheck = NULL; if (!check) { @@ -1339,6 +1335,23 @@ static void convert_attrs(const struct index_state *istate, ca->crlf_action = CRLF_AUTO_INPUT; } +void reset_parsed_attributes(void) +{ + struct convert_driver *drv, *next; + + attr_check_free(check); + check = NULL; + reset_merge_attributes(); + + for (drv = user_convert; drv; drv = next) { + next = drv->next; + free((void *)drv->name); + free(drv); + } + user_convert = NULL; + user_convert_tail = NULL; +} + int would_convert_to_git_filter_fd(const struct index_state *istate, const char *path) { struct conv_attrs ca; @@ -1927,7 +1940,7 @@ static struct stream_filter *ident_filter(const struct object_id *oid) * the contents cannot be filtered without reading the whole thing * in-core. * - * Note that you would be crazy to set CRLF, smuge/clean or ident to a + * Note that you would be crazy to set CRLF, smudge/clean or ident to a * large binary blob you would want us not to slurp into the memory! */ struct stream_filter *get_stream_filter(const struct index_state *istate, |