summaryrefslogtreecommitdiff
path: root/convert.c
diff options
context:
space:
mode:
Diffstat (limited to 'convert.c')
-rw-r--r--convert.c89
1 files changed, 51 insertions, 38 deletions
diff --git a/convert.c b/convert.c
index e0848226d2..5ead3ce678 100644
--- a/convert.c
+++ b/convert.c
@@ -1,4 +1,3 @@
-#define NO_THE_INDEX_COMPATIBILITY_MACROS
#include "cache.h"
#include "config.h"
#include "object-store.h"
@@ -9,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.
@@ -92,7 +92,7 @@ static void gather_stats(const char *buf, unsigned long size, struct text_stat *
* The same heuristics as diff.c::mmfile_is_binary()
* We treat files with bare CR as binary
*/
-static int convert_is_binary(unsigned long size, const struct text_stat *stats)
+static int convert_is_binary(const struct text_stat *stats)
{
if (stats->lonecr)
return 1;
@@ -110,7 +110,7 @@ static unsigned int gather_convert_stats(const char *data, unsigned long size)
if (!data || !size)
return 0;
gather_stats(data, size, &stats);
- if (convert_is_binary(size, &stats))
+ if (convert_is_binary(&stats))
ret |= CONVERT_STAT_BITS_BIN;
if (stats.crlf)
ret |= CONVERT_STAT_BITS_TXT_CRLF;
@@ -245,7 +245,7 @@ static int has_crlf_in_index(const struct index_state *istate, const char *path)
return has_crlf;
}
-static int will_convert_lf_to_crlf(size_t len, struct text_stat *stats,
+static int will_convert_lf_to_crlf(struct text_stat *stats,
enum crlf_action crlf_action)
{
if (output_eol(crlf_action) != EOL_CRLF)
@@ -260,7 +260,7 @@ static int will_convert_lf_to_crlf(size_t len, struct text_stat *stats,
if (stats->lonecr || stats->crlf)
return 0;
- if (convert_is_binary(len, stats))
+ if (convert_is_binary(stats))
return 0;
}
return 1;
@@ -270,8 +270,12 @@ static int will_convert_lf_to_crlf(size_t len, 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
*/
@@ -285,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 {
@@ -308,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 {
@@ -418,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.
*/
@@ -527,7 +521,7 @@ static int crlf_to_git(const struct index_state *istate,
convert_crlf_into_lf = !!stats.crlf;
if (crlf_action == CRLF_AUTO || crlf_action == CRLF_AUTO_INPUT || crlf_action == CRLF_AUTO_CRLF) {
- if (convert_is_binary(len, &stats))
+ if (convert_is_binary(&stats))
return 0;
/*
* If the file in the index has any CR in it, do not
@@ -549,7 +543,7 @@ static int crlf_to_git(const struct index_state *istate,
new_stats.crlf = 0;
}
/* simulate "git checkout" */
- if (will_convert_lf_to_crlf(len, &new_stats, crlf_action)) {
+ if (will_convert_lf_to_crlf(&new_stats, crlf_action)) {
new_stats.crlf += new_stats.lonelf;
new_stats.lonelf = 0;
}
@@ -591,7 +585,7 @@ static int crlf_to_git(const struct index_state *istate,
return 1;
}
-static int crlf_to_worktree(const char *path, const char *src, size_t len,
+static int crlf_to_worktree(const char *src, size_t len,
struct strbuf *buf, enum crlf_action crlf_action)
{
char *to_free = NULL;
@@ -601,7 +595,7 @@ static int crlf_to_worktree(const char *path, const char *src, size_t len,
return 0;
gather_stats(src, len, &stats);
- if (!will_convert_lf_to_crlf(len, &stats, crlf_action))
+ if (!will_convert_lf_to_crlf(&stats, crlf_action))
return 0;
/* are we "faking" in place editing ? */
@@ -705,7 +699,7 @@ static int filter_buffer_or_fd(int in, int out, void *data)
}
static int apply_single_file_filter(const char *path, const char *src, size_t len, int fd,
- struct strbuf *dst, const char *cmd)
+ struct strbuf *dst, const char *cmd)
{
/*
* Create a pipeline to have the command filter the buffer's
@@ -732,7 +726,7 @@ static int apply_single_file_filter(const char *path, const char *src, size_t le
if (start_async(&async))
return 0; /* error was already reported */
- if (strbuf_read(&nbuf, async.out, len) < 0) {
+ if (strbuf_read(&nbuf, async.out, 0) < 0) {
err = error(_("read from external filter '%s' failed"), cmd);
}
if (close(async.out)) {
@@ -778,7 +772,8 @@ static int start_multi_file_filter_fn(struct subprocess_entry *subprocess)
static void handle_filter_error(const struct strbuf *filter_status,
struct cmd2process *entry,
- const unsigned int wanted_capability) {
+ const unsigned int wanted_capability)
+{
if (!strcmp(filter_status->buf, "error"))
; /* The filter signaled a problem with the file. */
else if (!strcmp(filter_status->buf, "abort") && wanted_capability) {
@@ -1090,8 +1085,8 @@ static int count_ident(const char *cp, unsigned long size)
return cnt;
}
-static int ident_to_git(const char *path, const char *src, size_t len,
- struct strbuf *buf, int ident)
+static int ident_to_git(const char *src, size_t len,
+ struct strbuf *buf, int ident)
{
char *dst, *dollar;
@@ -1134,8 +1129,8 @@ static int ident_to_git(const char *path, const char *src, size_t len,
return 1;
}
-static int ident_to_worktree(const char *path, const char *src, size_t len,
- struct strbuf *buf, int ident)
+static int ident_to_worktree(const char *src, size_t len,
+ struct strbuf *buf, int ident)
{
struct object_id oid;
char *to_free = NULL, *dollar, *spc;
@@ -1151,7 +1146,7 @@ static int ident_to_worktree(const char *path, 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;
@@ -1415,7 +1428,7 @@ int convert_to_git(const struct index_state *istate,
len = dst->len;
}
}
- return ret | ident_to_git(path, src, len, dst, ca.ident);
+ return ret | ident_to_git(src, len, dst, ca.ident);
}
void convert_to_git_filter_fd(const struct index_state *istate,
@@ -1433,7 +1446,7 @@ void convert_to_git_filter_fd(const struct index_state *istate,
encode_to_git(path, dst->buf, dst->len, dst, ca.working_tree_encoding, conv_flags);
crlf_to_git(istate, path, dst->buf, dst->len, dst, ca.crlf_action, conv_flags);
- ident_to_git(path, dst->buf, dst->len, dst, ca.ident);
+ ident_to_git(dst->buf, dst->len, dst, ca.ident);
}
static int convert_to_working_tree_internal(const struct index_state *istate,
@@ -1446,7 +1459,7 @@ static int convert_to_working_tree_internal(const struct index_state *istate,
convert_attrs(istate, &ca, path);
- ret |= ident_to_worktree(path, src, len, dst, ca.ident);
+ ret |= ident_to_worktree(src, len, dst, ca.ident);
if (ret) {
src = dst->buf;
len = dst->len;
@@ -1457,7 +1470,7 @@ static int convert_to_working_tree_internal(const struct index_state *istate,
* support smudge). The filters might expect CRLFs.
*/
if ((ca.drv && (ca.drv->smudge || ca.drv->process)) || !normalizing) {
- ret |= crlf_to_worktree(path, src, len, dst, ca.crlf_action);
+ ret |= crlf_to_worktree(src, len, dst, ca.crlf_action);
if (ret) {
src = dst->buf;
len = dst->len;
@@ -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,