Git fork
at reftables-rust 63 lines 2.1 kB view raw
1#ifndef REPLACE_OBJECT_H 2#define REPLACE_OBJECT_H 3 4#include "oidmap.h" 5#include "repository.h" 6#include "odb.h" 7 8struct replace_object { 9 struct oidmap_entry original; 10 struct object_id replacement; 11}; 12 13void prepare_replace_object(struct repository *r); 14 15/* 16 * This internal function is only declared here for the benefit of 17 * lookup_replace_object(). Please do not call it directly. 18 */ 19const struct object_id *do_lookup_replace_object(struct repository *r, 20 const struct object_id *oid); 21 22/* 23 * Some commands disable replace-refs unconditionally, and otherwise each 24 * repository could alter the core.useReplaceRefs config value. 25 * 26 * Return 1 if and only if all of the following are true: 27 * 28 * a. disable_replace_refs() has not been called. 29 * b. GIT_NO_REPLACE_OBJECTS is unset or zero. 30 * c. the given repository does not have core.useReplaceRefs=false. 31 */ 32int replace_refs_enabled(struct repository *r); 33 34/* 35 * If object sha1 should be replaced, return the replacement object's 36 * name (replaced recursively, if necessary). The return value is 37 * either sha1 or a pointer to a permanently-allocated value. When 38 * object replacement is suppressed, always return sha1. 39 * 40 * Note: some thread debuggers might point a data race on the 41 * replace_map_initialized reading in this function. However, we know there's no 42 * problem in the value being updated by one thread right after another one read 43 * it here (and it should be written to only once, anyway). 44 */ 45static inline const struct object_id *lookup_replace_object(struct repository *r, 46 const struct object_id *oid) 47{ 48 if (!replace_refs_enabled(r) || 49 (r->objects->replace_map_initialized && 50 oidmap_get_size(&r->objects->replace_map) == 0)) 51 return oid; 52 return do_lookup_replace_object(r, oid); 53} 54 55/* 56 * Some commands override config and environment settings for using 57 * replace references. Use this method to disable the setting and ensure 58 * those other settings will not override this choice. This applies 59 * globally to all in-process repositories. 60 */ 61void disable_replace_refs(void); 62 63#endif /* REPLACE_OBJECT_H */