From 29fb37b272debaf4f5f6eb7cf476de9274492930 Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Sat, 13 Apr 2013 15:28:30 +0200 Subject: [PATCH 1/3] attr.c: extract read_index_data() as read_blob_data_from_index() Extract the read_index_data() function from attr.c and move it to read-cache.c; rename it to read_blob_data_from_index() and update the function signature of it to align better with index/cache API functions. This allows for reusing the function in convert.c later. Signed-off-by: Lukas Fleischer Signed-off-by: Junio C Hamano --- attr.c | 35 +---------------------------------- cache.h | 2 ++ read-cache.c | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 34 deletions(-) diff --git a/attr.c b/attr.c index 23be4abf44..243d60ffa9 100644 --- a/attr.c +++ b/attr.c @@ -381,46 +381,13 @@ static struct attr_stack *read_attr_from_file(const char *path, int macro_ok) return res; } -static void *read_index_data(const char *path) -{ - int pos, len; - unsigned long sz; - enum object_type type; - void *data; - struct index_state *istate = use_index ? use_index : &the_index; - - len = strlen(path); - pos = index_name_pos(istate, path, len); - if (pos < 0) { - /* - * We might be in the middle of a merge, in which - * case we would read stage #2 (ours). - */ - int i; - for (i = -pos - 1; - (pos < 0 && i < istate->cache_nr && - !strcmp(istate->cache[i]->name, path)); - i++) - if (ce_stage(istate->cache[i]) == 2) - pos = i; - } - if (pos < 0) - return NULL; - data = read_sha1_file(istate->cache[pos]->sha1, &type, &sz); - if (!data || type != OBJ_BLOB) { - free(data); - return NULL; - } - return data; -} - static struct attr_stack *read_attr_from_index(const char *path, int macro_ok) { struct attr_stack *res; char *buf, *sp; int lineno = 0; - buf = read_index_data(path); + buf = read_blob_data_from_index(use_index ? use_index : &the_index, path); if (!buf) return NULL; diff --git a/cache.h b/cache.h index 3622e18415..5d66c74f6a 100644 --- a/cache.h +++ b/cache.h @@ -307,6 +307,7 @@ extern void free_name_hash(struct index_state *istate); #define resolve_undo_clear() resolve_undo_clear_index(&the_index) #define unmerge_cache_entry_at(at) unmerge_index_entry_at(&the_index, at) #define unmerge_cache(pathspec) unmerge_index(&the_index, pathspec) +#define read_blob_data_from_cache(path) read_blob_data_from_index(&the_index, (path)) #endif enum object_type { @@ -452,6 +453,7 @@ extern int add_file_to_index(struct index_state *, const char *path, int flags); extern struct cache_entry *make_cache_entry(unsigned int mode, const unsigned char *sha1, const char *path, int stage, int refresh); extern int ce_same_name(struct cache_entry *a, struct cache_entry *b); extern int index_name_is_other(const struct index_state *, const char *, int); +extern void *read_blob_data_from_index(struct index_state *, const char *); /* do stat comparison even if CE_VALID is true */ #define CE_MATCH_IGNORE_VALID 01 diff --git a/read-cache.c b/read-cache.c index b4d08254d6..48d87e83ed 100644 --- a/read-cache.c +++ b/read-cache.c @@ -1895,3 +1895,35 @@ int index_name_is_other(const struct index_state *istate, const char *name, } return 1; } + +void *read_blob_data_from_index(struct index_state *istate, const char *path) +{ + int pos, len; + unsigned long sz; + enum object_type type; + void *data; + + len = strlen(path); + pos = index_name_pos(istate, path, len); + if (pos < 0) { + /* + * We might be in the middle of a merge, in which + * case we would read stage #2 (ours). + */ + int i; + for (i = -pos - 1; + (pos < 0 && i < istate->cache_nr && + !strcmp(istate->cache[i]->name, path)); + i++) + if (ce_stage(istate->cache[i]) == 2) + pos = i; + } + if (pos < 0) + return NULL; + data = read_sha1_file(istate->cache[pos]->sha1, &type, &sz); + if (!data || type != OBJ_BLOB) { + free(data); + return NULL; + } + return data; +} From ff36682505dfb580172306fe1b265b860f89bcea Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Sat, 13 Apr 2013 15:28:31 +0200 Subject: [PATCH 2/3] read_blob_data_from_index(): optionally return the size of blob data This allows for optionally getting the size of the returned data and will be used in a follow-up patch. Signed-off-by: Lukas Fleischer Signed-off-by: Junio C Hamano --- attr.c | 2 +- cache.h | 4 ++-- read-cache.c | 4 +++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/attr.c b/attr.c index 243d60ffa9..09e7e50d3e 100644 --- a/attr.c +++ b/attr.c @@ -387,7 +387,7 @@ static struct attr_stack *read_attr_from_index(const char *path, int macro_ok) char *buf, *sp; int lineno = 0; - buf = read_blob_data_from_index(use_index ? use_index : &the_index, path); + buf = read_blob_data_from_index(use_index ? use_index : &the_index, path, NULL); if (!buf) return NULL; diff --git a/cache.h b/cache.h index 5d66c74f6a..627776b5e6 100644 --- a/cache.h +++ b/cache.h @@ -307,7 +307,7 @@ extern void free_name_hash(struct index_state *istate); #define resolve_undo_clear() resolve_undo_clear_index(&the_index) #define unmerge_cache_entry_at(at) unmerge_index_entry_at(&the_index, at) #define unmerge_cache(pathspec) unmerge_index(&the_index, pathspec) -#define read_blob_data_from_cache(path) read_blob_data_from_index(&the_index, (path)) +#define read_blob_data_from_cache(path, sz) read_blob_data_from_index(&the_index, (path), (sz)) #endif enum object_type { @@ -453,7 +453,7 @@ extern int add_file_to_index(struct index_state *, const char *path, int flags); extern struct cache_entry *make_cache_entry(unsigned int mode, const unsigned char *sha1, const char *path, int stage, int refresh); extern int ce_same_name(struct cache_entry *a, struct cache_entry *b); extern int index_name_is_other(const struct index_state *, const char *, int); -extern void *read_blob_data_from_index(struct index_state *, const char *); +extern void *read_blob_data_from_index(struct index_state *, const char *, unsigned long *); /* do stat comparison even if CE_VALID is true */ #define CE_MATCH_IGNORE_VALID 01 diff --git a/read-cache.c b/read-cache.c index 48d87e83ed..8c27ed2c66 100644 --- a/read-cache.c +++ b/read-cache.c @@ -1896,7 +1896,7 @@ int index_name_is_other(const struct index_state *istate, const char *name, return 1; } -void *read_blob_data_from_index(struct index_state *istate, const char *path) +void *read_blob_data_from_index(struct index_state *istate, const char *path, unsigned long *size) { int pos, len; unsigned long sz; @@ -1925,5 +1925,7 @@ void *read_blob_data_from_index(struct index_state *istate, const char *path) free(data); return NULL; } + if (size) + *size = sz; return data; } From 4982fd78f61db69504f91151f94fce9914d610b6 Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Sat, 13 Apr 2013 15:28:32 +0200 Subject: [PATCH 3/3] convert.c: remove duplicate code The has_cr_in_index() function is an almost 1:1 copy of read_blob_data_from_index() with some additions. Use the latter instead of using copy-pasted code. Signed-off-by: Lukas Fleischer Signed-off-by: Junio C Hamano --- convert.c | 27 ++------------------------- 1 file changed, 2 insertions(+), 25 deletions(-) diff --git a/convert.c b/convert.c index 66021550c3..5b164baf24 100644 --- a/convert.c +++ b/convert.c @@ -153,36 +153,13 @@ static void check_safe_crlf(const char *path, enum crlf_action crlf_action, static int has_cr_in_index(const char *path) { - int pos, len; unsigned long sz; - enum object_type type; void *data; int has_cr; - struct index_state *istate = &the_index; - len = strlen(path); - pos = index_name_pos(istate, path, len); - if (pos < 0) { - /* - * We might be in the middle of a merge, in which - * case we would read stage #2 (ours). - */ - int i; - for (i = -pos - 1; - (pos < 0 && i < istate->cache_nr && - !strcmp(istate->cache[i]->name, path)); - i++) - if (ce_stage(istate->cache[i]) == 2) - pos = i; - } - if (pos < 0) + data = read_blob_data_from_cache(path, &sz); + if (!data) return 0; - data = read_sha1_file(istate->cache[pos]->sha1, &type, &sz); - if (!data || type != OBJ_BLOB) { - free(data); - return 0; - } - has_cr = memchr(data, '\r', sz) != NULL; free(data); return has_cr;