summaryrefslogtreecommitdiff
path: root/read-cache.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2013-04-21 18:39:45 -0700
committerJunio C Hamano <gitster@pobox.com>2013-04-21 18:39:45 -0700
commit4b35b007a6bd8b76bd37589fa397c12265935029 (patch)
tree23b3c8432d49afea63efdedeab721b753a5e1eda /read-cache.c
parentd2949c7b3c8a2f0d2cb5c61d99017a1a85a46264 (diff)
parent4982fd78f61db69504f91151f94fce9914d610b6 (diff)
downloadgit-4b35b007a6bd8b76bd37589fa397c12265935029.tar.gz
Merge branch 'lf/read-blob-data-from-index'
Reduce duplicated code between convert.c and attr.c. * lf/read-blob-data-from-index: convert.c: remove duplicate code read_blob_data_from_index(): optionally return the size of blob data attr.c: extract read_index_data() as read_blob_data_from_index()
Diffstat (limited to 'read-cache.c')
-rw-r--r--read-cache.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/read-cache.c b/read-cache.c
index 5a9704f4e5..04ed561bfe 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -1899,3 +1899,37 @@ 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, unsigned long *size)
+{
+ 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;
+ }
+ if (size)
+ *size = sz;
+ return data;
+}