提交 eee4502b 编写于 作者: S Stefan Beller 提交者: Junio C Hamano

shallow: migrate shallow information into the object parser

We need to convert the shallow functions all at the same time
as we move the data structures they operate on into the repository.
Signed-off-by: NStefan Beller <sbeller@google.com>
Signed-off-by: NJunio C Hamano <gitster@pobox.com>
上级 102de880
......@@ -190,18 +190,15 @@ extern struct commit_list *get_merge_bases_many_dirty(struct commit *one, int n,
struct oid_array;
struct ref;
#define register_shallow(r, o) register_shallow_##r(o);
extern int register_shallow_the_repository(const struct object_id *oid);
extern int register_shallow(struct repository *r, const struct object_id *oid);
extern int unregister_shallow(const struct object_id *oid);
extern int for_each_commit_graft(each_commit_graft_fn, void *);
#define is_repository_shallow(r) is_repository_shallow_##r()
extern int is_repository_shallow_the_repository(void);
extern int is_repository_shallow(struct repository *r);
extern struct commit_list *get_shallow_commits(struct object_array *heads,
int depth, int shallow_flag, int not_shallow_flag);
extern struct commit_list *get_shallow_commits_by_rev_list(
int ac, const char **av, int shallow_flag, int not_shallow_flag);
#define set_alternate_shallow_file(r, p, o) set_alternate_shallow_file_##r(p, o)
extern void set_alternate_shallow_file_the_repository(const char *path, int override);
extern void set_alternate_shallow_file(struct repository *r, const char *path, int override);
extern int write_shallow_commits(struct strbuf *out, int use_pack_protocol,
const struct oid_array *extra);
extern void setup_alternate_shallow(struct lock_file *shallow_lock,
......
......@@ -464,6 +464,9 @@ struct parsed_object_pool *parsed_object_pool_new(void)
o->tag_state = allocate_alloc_state();
o->object_state = allocate_alloc_state();
o->is_shallow = -1;
o->shallow_stat = xcalloc(1, sizeof(*o->shallow_stat));
return o;
}
......
......@@ -16,6 +16,10 @@ struct parsed_object_pool {
/* parent substitutions from .git/info/grafts and .git/shallow */
struct commit_graft **grafts;
int grafts_alloc, grafts_nr;
int is_shallow;
struct stat_validity *shallow_stat;
char *alternate_shallow_file;
};
struct parsed_object_pool *parsed_object_pool_new(void);
......
......@@ -14,22 +14,19 @@
#include "commit-slab.h"
#include "revision.h"
#include "list-objects.h"
#include "repository.h"
static int is_shallow = -1;
static struct stat_validity shallow_stat;
static char *alternate_shallow_file;
void set_alternate_shallow_file_the_repository(const char *path, int override)
void set_alternate_shallow_file(struct repository *r, const char *path, int override)
{
if (is_shallow != -1)
if (r->parsed_objects->is_shallow != -1)
die("BUG: is_repository_shallow must not be called before set_alternate_shallow_file");
if (alternate_shallow_file && !override)
if (r->parsed_objects->alternate_shallow_file && !override)
return;
free(alternate_shallow_file);
alternate_shallow_file = xstrdup_or_null(path);
free(r->parsed_objects->alternate_shallow_file);
r->parsed_objects->alternate_shallow_file = xstrdup_or_null(path);
}
int register_shallow_the_repository(const struct object_id *oid)
int register_shallow(struct repository *r, const struct object_id *oid)
{
struct commit_graft *graft =
xmalloc(sizeof(struct commit_graft));
......@@ -39,41 +36,41 @@ int register_shallow_the_repository(const struct object_id *oid)
graft->nr_parent = -1;
if (commit && commit->object.parsed)
commit->parents = NULL;
return register_commit_graft(the_repository, graft, 0);
return register_commit_graft(r, graft, 0);
}
int is_repository_shallow_the_repository(void)
int is_repository_shallow(struct repository *r)
{
FILE *fp;
char buf[1024];
const char *path = alternate_shallow_file;
const char *path = r->parsed_objects->alternate_shallow_file;
if (is_shallow >= 0)
return is_shallow;
if (r->parsed_objects->is_shallow >= 0)
return r->parsed_objects->is_shallow;
if (!path)
path = git_path_shallow(the_repository);
path = git_path_shallow(r);
/*
* fetch-pack sets '--shallow-file ""' as an indicator that no
* shallow file should be used. We could just open it and it
* will likely fail. But let's do an explicit check instead.
*/
if (!*path || (fp = fopen(path, "r")) == NULL) {
stat_validity_clear(&shallow_stat);
is_shallow = 0;
return is_shallow;
stat_validity_clear(r->parsed_objects->shallow_stat);
r->parsed_objects->is_shallow = 0;
return r->parsed_objects->is_shallow;
}
stat_validity_update(&shallow_stat, fileno(fp));
is_shallow = 1;
stat_validity_update(r->parsed_objects->shallow_stat, fileno(fp));
r->parsed_objects->is_shallow = 1;
while (fgets(buf, sizeof(buf), fp)) {
struct object_id oid;
if (get_oid_hex(buf, &oid))
die("bad shallow line: %s", buf);
register_shallow(the_repository, &oid);
register_shallow(r, &oid);
}
fclose(fp);
return is_shallow;
return r->parsed_objects->is_shallow;
}
struct commit_list *get_shallow_commits(struct object_array *heads, int depth,
......@@ -217,13 +214,12 @@ struct commit_list *get_shallow_commits_by_rev_list(int ac, const char **av,
return result;
}
#define check_shallow_file_for_update(r) check_shallow_file_for_update_##r()
static void check_shallow_file_for_update_the_repository(void)
static void check_shallow_file_for_update(struct repository *r)
{
if (is_shallow == -1)
if (r->parsed_objects->is_shallow == -1)
die("BUG: shallow must be initialized by now");
if (!stat_validity_check(&shallow_stat, git_path_shallow(the_repository)))
if (!stat_validity_check(r->parsed_objects->shallow_stat, git_path_shallow(the_repository)))
die("shallow file has changed since we read it");
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册