Git fork
at 3da4413dbcdb8df021739ca6f20fe4f0bcd1fd3c 105 lines 2.6 kB view raw
1#define USE_THE_REPOSITORY_VARIABLE 2 3#include "git-compat-util.h" 4#include "notes-cache.h" 5#include "object-file.h" 6#include "odb.h" 7#include "pretty.h" 8#include "repository.h" 9#include "commit.h" 10#include "refs.h" 11#include "strbuf.h" 12 13static int notes_cache_match_validity(struct repository *r, 14 const char *ref, 15 const char *validity) 16{ 17 struct object_id oid; 18 struct commit *commit; 19 struct pretty_print_context pretty_ctx; 20 struct strbuf msg = STRBUF_INIT; 21 int ret; 22 23 if (refs_read_ref(get_main_ref_store(the_repository), ref, &oid) < 0) 24 return 0; 25 26 commit = lookup_commit_reference_gently(r, &oid, 1); 27 if (!commit) 28 return 0; 29 30 memset(&pretty_ctx, 0, sizeof(pretty_ctx)); 31 repo_format_commit_message(r, commit, "%s", &msg, 32 &pretty_ctx); 33 strbuf_trim(&msg); 34 35 ret = !strcmp(msg.buf, validity); 36 strbuf_release(&msg); 37 38 return ret; 39} 40 41void notes_cache_init(struct repository *r, struct notes_cache *c, 42 const char *name, const char *validity) 43{ 44 struct strbuf ref = STRBUF_INIT; 45 int flags = NOTES_INIT_WRITABLE; 46 47 memset(c, 0, sizeof(*c)); 48 c->validity = xstrdup(validity); 49 50 strbuf_addf(&ref, "refs/notes/%s", name); 51 if (!notes_cache_match_validity(r, ref.buf, validity)) 52 flags |= NOTES_INIT_EMPTY; 53 init_notes(&c->tree, ref.buf, combine_notes_overwrite, flags); 54 strbuf_release(&ref); 55} 56 57int notes_cache_write(struct notes_cache *c) 58{ 59 struct object_id tree_oid, commit_oid; 60 61 if (!c || !c->tree.initialized || !c->tree.update_ref || 62 !*c->tree.update_ref) 63 return -1; 64 if (!c->tree.dirty) 65 return 0; 66 67 if (write_notes_tree(&c->tree, &tree_oid)) 68 return -1; 69 if (commit_tree(c->validity, strlen(c->validity), &tree_oid, NULL, 70 &commit_oid, NULL, NULL) < 0) 71 return -1; 72 if (refs_update_ref(get_main_ref_store(the_repository), "update notes cache", c->tree.update_ref, &commit_oid, 73 NULL, 0, UPDATE_REFS_QUIET_ON_ERR) < 0) 74 return -1; 75 76 return 0; 77} 78 79char *notes_cache_get(struct notes_cache *c, struct object_id *key_oid, 80 size_t *outsize) 81{ 82 const struct object_id *value_oid; 83 enum object_type type; 84 char *value; 85 unsigned long size; 86 87 value_oid = get_note(&c->tree, key_oid); 88 if (!value_oid) 89 return NULL; 90 value = odb_read_object(the_repository->objects, value_oid, &type, &size); 91 92 *outsize = size; 93 return value; 94} 95 96int notes_cache_put(struct notes_cache *c, struct object_id *key_oid, 97 const char *data, size_t size) 98{ 99 struct object_id value_oid; 100 101 if (odb_write_object(the_repository->objects, data, 102 size, OBJ_BLOB, &value_oid) < 0) 103 return -1; 104 return add_note(&c->tree, key_oid, &value_oid, NULL); 105}