Stefan Beller | d88f9fd | 2018-04-11 17:21:05 -0700 | [diff] [blame] | 1 | #ifndef REPLACE_OBJECT_H |
| 2 | #define REPLACE_OBJECT_H |
| 3 | |
Stefan Beller | 47f351e | 2018-04-11 17:21:06 -0700 | [diff] [blame] | 4 | #include "oidmap.h" |
| 5 | #include "repository.h" |
Stefan Beller | c3c36d7 | 2018-04-11 17:21:08 -0700 | [diff] [blame] | 6 | #include "object-store.h" |
Stefan Beller | 47f351e | 2018-04-11 17:21:06 -0700 | [diff] [blame] | 7 | |
Stefan Beller | d88f9fd | 2018-04-11 17:21:05 -0700 | [diff] [blame] | 8 | struct replace_object { |
| 9 | struct oidmap_entry original; |
| 10 | struct object_id replacement; |
| 11 | }; |
| 12 | |
Derrick Stolee | d653824 | 2018-08-20 18:24:27 +0000 | [diff] [blame] | 13 | void prepare_replace_object(struct repository *r); |
| 14 | |
Stefan Beller | 47f351e | 2018-04-11 17:21:06 -0700 | [diff] [blame] | 15 | /* |
| 16 | * This internal function is only declared here for the benefit of |
| 17 | * lookup_replace_object(). Please do not call it directly. |
| 18 | */ |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 19 | const struct object_id *do_lookup_replace_object(struct repository *r, |
Denton Liu | ad6dad0 | 2019-04-29 04:28:23 -0400 | [diff] [blame] | 20 | const struct object_id *oid); |
Stefan Beller | 47f351e | 2018-04-11 17:21:06 -0700 | [diff] [blame] | 21 | |
| 22 | /* |
Derrick Stolee | f117838 | 2023-06-06 13:24:36 +0000 | [diff] [blame] | 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 | */ |
| 32 | int replace_refs_enabled(struct repository *r); |
| 33 | |
| 34 | /* |
Stefan Beller | 47f351e | 2018-04-11 17:21:06 -0700 | [diff] [blame] | 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. |
Matheus Tavares | b1fc9da | 2020-01-15 23:39:52 -0300 | [diff] [blame] | 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). |
Stefan Beller | 47f351e | 2018-04-11 17:21:06 -0700 | [diff] [blame] | 44 | */ |
Stefan Beller | 90e777f | 2018-04-11 17:21:18 -0700 | [diff] [blame] | 45 | static inline const struct object_id *lookup_replace_object(struct repository *r, |
| 46 | const struct object_id *oid) |
Stefan Beller | 47f351e | 2018-04-11 17:21:06 -0700 | [diff] [blame] | 47 | { |
Derrick Stolee | f117838 | 2023-06-06 13:24:36 +0000 | [diff] [blame] | 48 | if (!replace_refs_enabled(r) || |
Matheus Tavares | b1fc9da | 2020-01-15 23:39:52 -0300 | [diff] [blame] | 49 | (r->objects->replace_map_initialized && |
Stefan Beller | 90e777f | 2018-04-11 17:21:18 -0700 | [diff] [blame] | 50 | r->objects->replace_map->map.tablesize == 0)) |
Stefan Beller | 47f351e | 2018-04-11 17:21:06 -0700 | [diff] [blame] | 51 | return oid; |
Stefan Beller | 90e777f | 2018-04-11 17:21:18 -0700 | [diff] [blame] | 52 | return do_lookup_replace_object(r, oid); |
Stefan Beller | 47f351e | 2018-04-11 17:21:06 -0700 | [diff] [blame] | 53 | } |
| 54 | |
Derrick Stolee | d24eda4 | 2023-06-06 13:24:35 +0000 | [diff] [blame] | 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 | */ |
| 61 | void disable_replace_refs(void); |
| 62 | |
Stefan Beller | d88f9fd | 2018-04-11 17:21:05 -0700 | [diff] [blame] | 63 | #endif /* REPLACE_OBJECT_H */ |