зеркало из https://github.com/microsoft/git.git
replace-object: move replace_map to object store
The relationship between an object X and another object Y that replaces the object X is defined only within the scope of a single repository. The exception in reachability rule around these replacement objects is also local to a repository (i.e. if traversal from refs reaches X, then both X and Y are reachable and need to be kept from gc). Signed-off-by: Stefan Beller <sbeller@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
f37b9bc00c
Коммит
d88f9fdf8b
|
@ -1,6 +1,8 @@
|
|||
#ifndef OBJECT_STORE_H
|
||||
#define OBJECT_STORE_H
|
||||
|
||||
#include "oidmap.h"
|
||||
|
||||
struct alternate_object_database {
|
||||
struct alternate_object_database *next;
|
||||
|
||||
|
@ -93,6 +95,12 @@ struct raw_object_store {
|
|||
struct alternate_object_database *alt_odb_list;
|
||||
struct alternate_object_database **alt_odb_tail;
|
||||
|
||||
/*
|
||||
* Objects that should be substituted by other objects
|
||||
* (see git-replace(1)).
|
||||
*/
|
||||
struct oidmap replace_map;
|
||||
|
||||
/*
|
||||
* private data
|
||||
*
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
#ifndef REPLACE_OBJECT_H
|
||||
#define REPLACE_OBJECT_H
|
||||
|
||||
struct replace_object {
|
||||
struct oidmap_entry original;
|
||||
struct object_id replacement;
|
||||
};
|
||||
|
||||
#endif /* REPLACE_OBJECT_H */
|
|
@ -1,15 +1,11 @@
|
|||
#include "cache.h"
|
||||
#include "oidmap.h"
|
||||
#include "object-store.h"
|
||||
#include "replace-object.h"
|
||||
#include "refs.h"
|
||||
#include "repository.h"
|
||||
#include "commit.h"
|
||||
|
||||
struct replace_object {
|
||||
struct oidmap_entry original;
|
||||
struct object_id replacement;
|
||||
};
|
||||
|
||||
static struct oidmap replace_map = OIDMAP_INIT;
|
||||
|
||||
static int register_replace_ref(const char *refname,
|
||||
const struct object_id *oid,
|
||||
int flag, void *cb_data)
|
||||
|
@ -29,7 +25,7 @@ static int register_replace_ref(const char *refname,
|
|||
oidcpy(&repl_obj->replacement, oid);
|
||||
|
||||
/* Register new object */
|
||||
if (oidmap_put(&replace_map, repl_obj))
|
||||
if (oidmap_put(&the_repository->objects->replace_map, repl_obj))
|
||||
die("duplicate replace ref: %s", refname);
|
||||
|
||||
return 0;
|
||||
|
@ -44,7 +40,7 @@ static void prepare_replace_object(void)
|
|||
|
||||
for_each_replace_ref(register_replace_ref, NULL);
|
||||
replace_object_prepared = 1;
|
||||
if (!replace_map.map.tablesize)
|
||||
if (!the_repository->objects->replace_map.map.tablesize)
|
||||
check_replace_refs = 0;
|
||||
}
|
||||
|
||||
|
@ -67,7 +63,8 @@ const struct object_id *do_lookup_replace_object(const struct object_id *oid)
|
|||
|
||||
/* Try to recursively replace the object */
|
||||
while (depth-- > 0) {
|
||||
struct replace_object *repl_obj = oidmap_get(&replace_map, cur);
|
||||
struct replace_object *repl_obj =
|
||||
oidmap_get(&the_repository->objects->replace_map, cur);
|
||||
if (!repl_obj)
|
||||
return cur;
|
||||
cur = &repl_obj->replacement;
|
||||
|
|
Загрузка…
Ссылка в новой задаче