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:
parent
f37b9bc00c
commit
d88f9fdf8b
@ -1,6 +1,8 @@
|
|||||||
#ifndef OBJECT_STORE_H
|
#ifndef OBJECT_STORE_H
|
||||||
#define OBJECT_STORE_H
|
#define OBJECT_STORE_H
|
||||||
|
|
||||||
|
#include "oidmap.h"
|
||||||
|
|
||||||
struct alternate_object_database {
|
struct alternate_object_database {
|
||||||
struct alternate_object_database *next;
|
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_list;
|
||||||
struct alternate_object_database **alt_odb_tail;
|
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
|
* private data
|
||||||
*
|
*
|
||||||
|
9
replace-object.h
Normal file
9
replace-object.h
Normal file
@ -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 "cache.h"
|
||||||
#include "oidmap.h"
|
#include "oidmap.h"
|
||||||
|
#include "object-store.h"
|
||||||
|
#include "replace-object.h"
|
||||||
#include "refs.h"
|
#include "refs.h"
|
||||||
|
#include "repository.h"
|
||||||
#include "commit.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,
|
static int register_replace_ref(const char *refname,
|
||||||
const struct object_id *oid,
|
const struct object_id *oid,
|
||||||
int flag, void *cb_data)
|
int flag, void *cb_data)
|
||||||
@ -29,7 +25,7 @@ static int register_replace_ref(const char *refname,
|
|||||||
oidcpy(&repl_obj->replacement, oid);
|
oidcpy(&repl_obj->replacement, oid);
|
||||||
|
|
||||||
/* Register new object */
|
/* 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);
|
die("duplicate replace ref: %s", refname);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -44,7 +40,7 @@ static void prepare_replace_object(void)
|
|||||||
|
|
||||||
for_each_replace_ref(register_replace_ref, NULL);
|
for_each_replace_ref(register_replace_ref, NULL);
|
||||||
replace_object_prepared = 1;
|
replace_object_prepared = 1;
|
||||||
if (!replace_map.map.tablesize)
|
if (!the_repository->objects->replace_map.map.tablesize)
|
||||||
check_replace_refs = 0;
|
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 */
|
/* Try to recursively replace the object */
|
||||||
while (depth-- > 0) {
|
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)
|
if (!repl_obj)
|
||||||
return cur;
|
return cur;
|
||||||
cur = &repl_obj->replacement;
|
cur = &repl_obj->replacement;
|
||||||
|
Loading…
Reference in New Issue
Block a user