зеркало из https://github.com/microsoft/git.git
Merge branch 'sb/oid-object-info'
The codepath around object-info API has been taught to take the repository object (which in turn tells the API which object store the objects are to be located). * sb/oid-object-info: cache.h: allow oid_object_info to handle arbitrary repositories packfile: add repository argument to cache_or_unpack_entry packfile: add repository argument to unpack_entry packfile: add repository argument to read_object packfile: add repository argument to packed_object_info packfile: add repository argument to packed_to_object_type packfile: add repository argument to retry_bad_packed_offset cache.h: add repository argument to oid_object_info cache.h: add repository argument to oid_object_info_extended
This commit is contained in:
Коммит
fcb6df3254
|
@ -276,7 +276,7 @@ static int write_tar_entry(struct archiver_args *args,
|
|||
memcpy(header.name, path, pathlen);
|
||||
|
||||
if (S_ISREG(mode) && !args->convert &&
|
||||
oid_object_info(oid, &size) == OBJ_BLOB &&
|
||||
oid_object_info(the_repository, oid, &size) == OBJ_BLOB &&
|
||||
size > big_file_threshold)
|
||||
buffer = NULL;
|
||||
else if (S_ISLNK(mode) || S_ISREG(mode)) {
|
||||
|
|
|
@ -325,7 +325,8 @@ static int write_zip_entry(struct archiver_args *args,
|
|||
compressed_size = 0;
|
||||
buffer = NULL;
|
||||
} else if (S_ISREG(mode) || S_ISLNK(mode)) {
|
||||
enum object_type type = oid_object_info(oid, &size);
|
||||
enum object_type type = oid_object_info(the_repository, oid,
|
||||
&size);
|
||||
|
||||
method = 0;
|
||||
attr2 = S_ISLNK(mode) ? ((mode | 0777) << 16) :
|
||||
|
|
4
blame.c
4
blame.c
|
@ -81,7 +81,7 @@ static void verify_working_tree_path(struct commit *work_tree, const char *path)
|
|||
unsigned mode;
|
||||
|
||||
if (!get_tree_entry(commit_oid, path, &blob_oid, &mode) &&
|
||||
oid_object_info(&blob_oid, NULL) == OBJ_BLOB)
|
||||
oid_object_info(the_repository, &blob_oid, NULL) == OBJ_BLOB)
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -504,7 +504,7 @@ static int fill_blob_sha1_and_mode(struct blame_origin *origin)
|
|||
return 0;
|
||||
if (get_tree_entry(&origin->commit->object.oid, origin->path, &origin->blob_oid, &origin->mode))
|
||||
goto error_out;
|
||||
if (oid_object_info(&origin->blob_oid, NULL) != OBJ_BLOB)
|
||||
if (oid_object_info(the_repository, &origin->blob_oid, NULL) != OBJ_BLOB)
|
||||
goto error_out;
|
||||
return 0;
|
||||
error_out:
|
||||
|
|
|
@ -655,7 +655,7 @@ static int is_a_rev(const char *name)
|
|||
|
||||
if (get_oid(name, &oid))
|
||||
return 0;
|
||||
return OBJ_NONE < oid_object_info(&oid, NULL);
|
||||
return OBJ_NONE < oid_object_info(the_repository, &oid, NULL);
|
||||
}
|
||||
|
||||
int cmd_blame(int argc, const char **argv, const char *prefix)
|
||||
|
|
|
@ -77,7 +77,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
|
|||
switch (opt) {
|
||||
case 't':
|
||||
oi.type_name = &sb;
|
||||
if (oid_object_info_extended(&oid, &oi, flags) < 0)
|
||||
if (oid_object_info_extended(the_repository, &oid, &oi, flags) < 0)
|
||||
die("git cat-file: could not get object info");
|
||||
if (sb.len) {
|
||||
printf("%s\n", sb.buf);
|
||||
|
@ -88,7 +88,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
|
|||
|
||||
case 's':
|
||||
oi.sizep = &size;
|
||||
if (oid_object_info_extended(&oid, &oi, flags) < 0)
|
||||
if (oid_object_info_extended(the_repository, &oid, &oi, flags) < 0)
|
||||
die("git cat-file: could not get object info");
|
||||
printf("%lu\n", size);
|
||||
return 0;
|
||||
|
@ -116,7 +116,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
|
|||
/* else fallthrough */
|
||||
|
||||
case 'p':
|
||||
type = oid_object_info(&oid, NULL);
|
||||
type = oid_object_info(the_repository, &oid, NULL);
|
||||
if (type < 0)
|
||||
die("Not a valid object name %s", obj_name);
|
||||
|
||||
|
@ -140,7 +140,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
|
|||
case 0:
|
||||
if (type_from_string(exp_type) == OBJ_BLOB) {
|
||||
struct object_id blob_oid;
|
||||
if (oid_object_info(&oid, NULL) == OBJ_TAG) {
|
||||
if (oid_object_info(the_repository, &oid, NULL) == OBJ_TAG) {
|
||||
char *buffer = read_object_file(&oid, &type,
|
||||
&size);
|
||||
const char *target;
|
||||
|
@ -151,7 +151,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
|
|||
} else
|
||||
oidcpy(&blob_oid, &oid);
|
||||
|
||||
if (oid_object_info(&blob_oid, NULL) == OBJ_BLOB)
|
||||
if (oid_object_info(the_repository, &blob_oid, NULL) == OBJ_BLOB)
|
||||
return stream_blob_to_fd(1, &blob_oid, NULL, 0);
|
||||
/*
|
||||
* we attempted to dereference a tag to a blob
|
||||
|
@ -342,7 +342,7 @@ static void batch_object_write(const char *obj_name, struct batch_options *opt,
|
|||
struct strbuf buf = STRBUF_INIT;
|
||||
|
||||
if (!data->skip_object_info &&
|
||||
oid_object_info_extended(&data->oid, &data->info,
|
||||
oid_object_info_extended(the_repository, &data->oid, &data->info,
|
||||
OBJECT_INFO_LOOKUP_REPLACE) < 0) {
|
||||
printf("%s missing\n",
|
||||
obj_name ? obj_name : oid_to_hex(&data->oid));
|
||||
|
|
|
@ -502,7 +502,7 @@ static void describe(const char *arg, int last_one)
|
|||
|
||||
if (cmit)
|
||||
describe_commit(&oid, &sb);
|
||||
else if (oid_object_info(&oid, NULL) == OBJ_BLOB)
|
||||
else if (oid_object_info(the_repository, &oid, NULL) == OBJ_BLOB)
|
||||
describe_blob(oid, &sb);
|
||||
else
|
||||
die(_("%s is neither a commit nor blob"), arg);
|
||||
|
|
|
@ -950,7 +950,7 @@ static void import_marks(char *input_file)
|
|||
if (last_idnum < mark)
|
||||
last_idnum = mark;
|
||||
|
||||
type = oid_object_info(&oid, NULL);
|
||||
type = oid_object_info(the_repository, &oid, NULL);
|
||||
if (type < 0)
|
||||
die("object not found: %s", oid_to_hex(&oid));
|
||||
|
||||
|
|
|
@ -656,7 +656,7 @@ static int update_local_ref(struct ref *ref,
|
|||
struct branch *current_branch = branch_get(NULL);
|
||||
const char *pretty_ref = prettify_refname(ref->name);
|
||||
|
||||
type = oid_object_info(&ref->new_oid, NULL);
|
||||
type = oid_object_info(the_repository, &ref->new_oid, NULL);
|
||||
if (type < 0)
|
||||
die(_("object %s not found"), oid_to_hex(&ref->new_oid));
|
||||
|
||||
|
|
|
@ -67,7 +67,8 @@ static const char *printable_type(struct object *obj)
|
|||
const char *ret;
|
||||
|
||||
if (obj->type == OBJ_NONE) {
|
||||
enum object_type type = oid_object_info(&obj->oid, NULL);
|
||||
enum object_type type = oid_object_info(the_repository,
|
||||
&obj->oid, NULL);
|
||||
if (type > 0)
|
||||
object_as_type(obj, type, 0);
|
||||
}
|
||||
|
|
|
@ -223,7 +223,7 @@ static unsigned check_object(struct object *obj)
|
|||
|
||||
if (!(obj->flags & FLAG_CHECKED)) {
|
||||
unsigned long size;
|
||||
int type = oid_object_info(&obj->oid, &size);
|
||||
int type = oid_object_info(the_repository, &obj->oid, &size);
|
||||
if (type <= 0)
|
||||
die(_("did not receive expected object %s"),
|
||||
oid_to_hex(&obj->oid));
|
||||
|
@ -812,7 +812,7 @@ static void sha1_object(const void *data, struct object_entry *obj_entry,
|
|||
enum object_type has_type;
|
||||
unsigned long has_size;
|
||||
read_lock();
|
||||
has_type = oid_object_info(oid, &has_size);
|
||||
has_type = oid_object_info(the_repository, oid, &has_size);
|
||||
if (has_type < 0)
|
||||
die(_("cannot read existing object info %s"), oid_to_hex(oid));
|
||||
if (has_type != type || has_size != size)
|
||||
|
|
|
@ -94,7 +94,7 @@ static int show_tree(const struct object_id *oid, struct strbuf *base,
|
|||
char size_text[24];
|
||||
if (!strcmp(type, blob_type)) {
|
||||
unsigned long size;
|
||||
if (oid_object_info(oid, &size) == OBJ_BAD)
|
||||
if (oid_object_info(the_repository, oid, &size) == OBJ_BAD)
|
||||
xsnprintf(size_text, sizeof(size_text),
|
||||
"BAD");
|
||||
else
|
||||
|
|
|
@ -116,7 +116,7 @@ static void mktree_line(char *buf, size_t len, int nul_term_line, int allow_miss
|
|||
}
|
||||
|
||||
/* Check the type of object identified by sha1 */
|
||||
obj_type = oid_object_info(&oid, NULL);
|
||||
obj_type = oid_object_info(the_repository, &oid, NULL);
|
||||
if (obj_type < 0) {
|
||||
if (allow_missing) {
|
||||
; /* no problem - missing objects are presumed to be of the right type */
|
||||
|
|
|
@ -1521,7 +1521,8 @@ static void check_object(struct object_entry *entry)
|
|||
unuse_pack(&w_curs);
|
||||
}
|
||||
|
||||
entry->type = oid_object_info(&entry->idx.oid, &entry->size);
|
||||
entry->type = oid_object_info(the_repository, &entry->idx.oid,
|
||||
&entry->size);
|
||||
/*
|
||||
* The error condition is checked in prepare_pack(). This is
|
||||
* to permit a missing preferred base object to be ignored
|
||||
|
@ -1576,14 +1577,16 @@ static void drop_reused_delta(struct object_entry *entry)
|
|||
|
||||
oi.sizep = &entry->size;
|
||||
oi.typep = &entry->type;
|
||||
if (packed_object_info(entry->in_pack, entry->in_pack_offset, &oi) < 0) {
|
||||
if (packed_object_info(the_repository, entry->in_pack,
|
||||
entry->in_pack_offset, &oi) < 0) {
|
||||
/*
|
||||
* We failed to get the info from this pack for some reason;
|
||||
* fall back to sha1_object_info, which may find another copy.
|
||||
* And if that fails, the error will be recorded in entry->type
|
||||
* and dealt with in prepare_pack().
|
||||
*/
|
||||
entry->type = oid_object_info(&entry->idx.oid, &entry->size);
|
||||
entry->type = oid_object_info(the_repository, &entry->idx.oid,
|
||||
&entry->size);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2717,7 +2720,7 @@ static void add_objects_in_unpacked_packs(struct rev_info *revs)
|
|||
static int add_loose_object(const struct object_id *oid, const char *path,
|
||||
void *data)
|
||||
{
|
||||
enum object_type type = oid_object_info(oid, NULL);
|
||||
enum object_type type = oid_object_info(the_repository, oid, NULL);
|
||||
|
||||
if (type < 0) {
|
||||
warning("loose object at %s could not be examined", path);
|
||||
|
|
|
@ -50,7 +50,8 @@ static int prune_object(const struct object_id *oid, const char *fullpath,
|
|||
if (st.st_mtime > expire)
|
||||
return 0;
|
||||
if (show_only || verbose) {
|
||||
enum object_type type = oid_object_info(oid, NULL);
|
||||
enum object_type type = oid_object_info(the_repository, oid,
|
||||
NULL);
|
||||
printf("%s %s\n", oid_to_hex(oid),
|
||||
(type > 0) ? type_name(type) : "unknown");
|
||||
}
|
||||
|
|
|
@ -55,8 +55,9 @@ static int show_reference(const char *refname, const struct object_id *oid,
|
|||
if (get_oid(refname, &object))
|
||||
return error("Failed to resolve '%s' as a valid ref.", refname);
|
||||
|
||||
obj_type = oid_object_info(&object, NULL);
|
||||
repl_type = oid_object_info(oid, NULL);
|
||||
obj_type = oid_object_info(the_repository, &object,
|
||||
NULL);
|
||||
repl_type = oid_object_info(the_repository, oid, NULL);
|
||||
|
||||
printf("%s (%s) -> %s (%s)\n", refname, type_name(obj_type),
|
||||
oid_to_hex(oid), type_name(repl_type));
|
||||
|
@ -164,8 +165,8 @@ static int replace_object_oid(const char *object_ref,
|
|||
struct ref_transaction *transaction;
|
||||
struct strbuf err = STRBUF_INIT;
|
||||
|
||||
obj_type = oid_object_info(object, NULL);
|
||||
repl_type = oid_object_info(repl, NULL);
|
||||
obj_type = oid_object_info(the_repository, object, NULL);
|
||||
repl_type = oid_object_info(the_repository, repl, NULL);
|
||||
if (!force && obj_type != repl_type)
|
||||
die("Objects must be of the same type.\n"
|
||||
"'%s' points to a replaced object of type '%s'\n"
|
||||
|
@ -292,7 +293,7 @@ static int edit_and_replace(const char *object_ref, int force, int raw)
|
|||
if (get_oid(object_ref, &old_oid) < 0)
|
||||
die("Not a valid object name: '%s'", object_ref);
|
||||
|
||||
type = oid_object_info(&old_oid, NULL);
|
||||
type = oid_object_info(the_repository, &old_oid, NULL);
|
||||
if (type < 0)
|
||||
die("unable to get object type for %s", oid_to_hex(&old_oid));
|
||||
|
||||
|
|
|
@ -212,7 +212,7 @@ static void create_tag(const struct object_id *object, const char *tag,
|
|||
struct strbuf header = STRBUF_INIT;
|
||||
char *path = NULL;
|
||||
|
||||
type = oid_object_info(object, NULL);
|
||||
type = oid_object_info(the_repository, object, NULL);
|
||||
if (type <= OBJ_NONE)
|
||||
die(_("bad object type."));
|
||||
|
||||
|
@ -298,7 +298,7 @@ static void create_reflog_msg(const struct object_id *oid, struct strbuf *sb)
|
|||
}
|
||||
|
||||
strbuf_addstr(sb, " (");
|
||||
type = oid_object_info(oid, NULL);
|
||||
type = oid_object_info(the_repository, oid, NULL);
|
||||
switch (type) {
|
||||
default:
|
||||
strbuf_addstr(sb, "object of unknown type");
|
||||
|
|
|
@ -199,7 +199,7 @@ static int check_object(struct object *obj, int type, void *data, struct fsck_op
|
|||
|
||||
if (!(obj->flags & FLAG_OPEN)) {
|
||||
unsigned long size;
|
||||
int type = oid_object_info(&obj->oid, &size);
|
||||
int type = oid_object_info(the_repository, &obj->oid, &size);
|
||||
if (type != obj->type || type <= 0)
|
||||
die("object of unexpected type");
|
||||
obj->flags |= FLAG_WRITTEN;
|
||||
|
|
7
cache.h
7
cache.h
|
@ -1199,7 +1199,7 @@ static inline void *read_object_file(const struct object_id *oid, enum object_ty
|
|||
}
|
||||
|
||||
/* Read and unpack an object file into memory, write memory to an object file */
|
||||
extern int oid_object_info(const struct object_id *, unsigned long *);
|
||||
int oid_object_info(struct repository *r, const struct object_id *, unsigned long *);
|
||||
|
||||
extern int hash_object_file(const void *buf, unsigned long len,
|
||||
const char *type, struct object_id *oid);
|
||||
|
@ -1680,7 +1680,10 @@ struct object_info {
|
|||
#define OBJECT_INFO_QUICK 8
|
||||
/* Do not check loose object */
|
||||
#define OBJECT_INFO_IGNORE_LOOSE 16
|
||||
extern int oid_object_info_extended(const struct object_id *, struct object_info *, unsigned flags);
|
||||
|
||||
int oid_object_info_extended(struct repository *r,
|
||||
const struct object_id *,
|
||||
struct object_info *, unsigned flags);
|
||||
|
||||
/*
|
||||
* Set this to 0 to prevent sha1_object_info_extended() from fetching missing
|
||||
|
|
|
@ -515,7 +515,7 @@ static int add_packed_commits(const struct object_id *oid,
|
|||
struct object_info oi = OBJECT_INFO_INIT;
|
||||
|
||||
oi.typep = &type;
|
||||
if (packed_object_info(pack, offset, &oi) < 0)
|
||||
if (packed_object_info(the_repository, pack, offset, &oi) < 0)
|
||||
die("unable to get type of object %s", oid_to_hex(oid));
|
||||
|
||||
if (type != OBJ_COMMIT)
|
||||
|
|
3
diff.c
3
diff.c
|
@ -3638,7 +3638,8 @@ int diff_populate_filespec(struct diff_filespec *s, unsigned int flags)
|
|||
else {
|
||||
enum object_type type;
|
||||
if (size_only || (flags & CHECK_BINARY)) {
|
||||
type = oid_object_info(&s->oid, &s->size);
|
||||
type = oid_object_info(the_repository, &s->oid,
|
||||
&s->size);
|
||||
if (type < 0)
|
||||
die("unable to read %s",
|
||||
oid_to_hex(&s->oid));
|
||||
|
|
|
@ -1331,7 +1331,7 @@ static void *gfi_unpack_entry(
|
|||
*/
|
||||
p->pack_size = pack_size + the_hash_algo->rawsz;
|
||||
}
|
||||
return unpack_entry(p, oe->idx.offset, &type, sizep);
|
||||
return unpack_entry(the_repository, p, oe->idx.offset, &type, sizep);
|
||||
}
|
||||
|
||||
static const char *get_mode(const char *str, uint16_t *modep)
|
||||
|
@ -1872,7 +1872,8 @@ static void read_marks(void)
|
|||
die("corrupt mark line: %s", line);
|
||||
e = find_object(&oid);
|
||||
if (!e) {
|
||||
enum object_type type = oid_object_info(&oid, NULL);
|
||||
enum object_type type = oid_object_info(the_repository,
|
||||
&oid, NULL);
|
||||
if (type < 0)
|
||||
die("object not found: %s", oid_to_hex(&oid));
|
||||
e = insert_object(&oid);
|
||||
|
@ -2402,7 +2403,8 @@ static void file_change_m(const char *p, struct branch *b)
|
|||
enum object_type expected = S_ISDIR(mode) ?
|
||||
OBJ_TREE: OBJ_BLOB;
|
||||
enum object_type type = oe ? oe->type :
|
||||
oid_object_info(&oid, NULL);
|
||||
oid_object_info(the_repository, &oid,
|
||||
NULL);
|
||||
if (type < 0)
|
||||
die("%s not found: %s",
|
||||
S_ISDIR(mode) ? "Tree" : "Blob",
|
||||
|
@ -2563,7 +2565,8 @@ static void note_change_n(const char *p, struct branch *b, unsigned char *old_fa
|
|||
die("Not a blob (actually a %s): %s",
|
||||
type_name(oe->type), command_buf.buf);
|
||||
} else if (!is_null_oid(&oid)) {
|
||||
enum object_type type = oid_object_info(&oid, NULL);
|
||||
enum object_type type = oid_object_info(the_repository, &oid,
|
||||
NULL);
|
||||
if (type < 0)
|
||||
die("Blob not found: %s", command_buf.buf);
|
||||
if (type != OBJ_BLOB)
|
||||
|
@ -2850,7 +2853,7 @@ static void parse_new_tag(const char *arg)
|
|||
} else if (!get_oid(from, &oid)) {
|
||||
struct object_entry *oe = find_object(&oid);
|
||||
if (!oe) {
|
||||
type = oid_object_info(&oid, NULL);
|
||||
type = oid_object_info(the_repository, &oid, NULL);
|
||||
if (type < 0)
|
||||
die("Not a valid object: %s", from);
|
||||
} else
|
||||
|
@ -3008,7 +3011,8 @@ static struct object_entry *dereference(struct object_entry *oe,
|
|||
unsigned long size;
|
||||
char *buf = NULL;
|
||||
if (!oe) {
|
||||
enum object_type type = oid_object_info(oid, NULL);
|
||||
enum object_type type = oid_object_info(the_repository, oid,
|
||||
NULL);
|
||||
if (type < 0)
|
||||
die("object not found: %s", oid_to_hex(oid));
|
||||
/* cache it! */
|
||||
|
|
|
@ -117,7 +117,7 @@ static enum list_objects_filter_result filter_blobs_limit(
|
|||
assert(obj->type == OBJ_BLOB);
|
||||
assert((obj->flags & SEEN) == 0);
|
||||
|
||||
t = oid_object_info(&obj->oid, &object_length);
|
||||
t = oid_object_info(the_repository, &obj->oid, &object_length);
|
||||
if (t != OBJ_BLOB) { /* probably OBJ_NONE */
|
||||
/*
|
||||
* We DO NOT have the blob locally, so we cannot
|
||||
|
|
2
object.c
2
object.c
|
@ -257,7 +257,7 @@ struct object *parse_object(const struct object_id *oid)
|
|||
|
||||
if ((obj && obj->type == OBJ_BLOB && has_object_file(oid)) ||
|
||||
(!obj && has_object_file(oid) &&
|
||||
oid_object_info(oid, NULL) == OBJ_BLOB)) {
|
||||
oid_object_info(the_repository, oid, NULL) == OBJ_BLOB)) {
|
||||
if (check_object_signature(repl, NULL, 0, NULL) < 0) {
|
||||
error("sha1 mismatch %s", oid_to_hex(oid));
|
||||
return NULL;
|
||||
|
|
|
@ -73,7 +73,8 @@ void bitmap_writer_build_type_index(struct pack_idx_entry **index,
|
|||
break;
|
||||
|
||||
default:
|
||||
real_type = oid_object_info(&entry->idx.oid, NULL);
|
||||
real_type = oid_object_info(the_repository,
|
||||
&entry->idx.oid, NULL);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#include "cache.h"
|
||||
#include "repository.h"
|
||||
#include "pack.h"
|
||||
#include "pack-revindex.h"
|
||||
#include "progress.h"
|
||||
|
@ -134,7 +135,7 @@ static int verify_packfile(struct packed_git *p,
|
|||
data = NULL;
|
||||
data_valid = 0;
|
||||
} else {
|
||||
data = unpack_entry(p, entries[i].offset, &type, &size);
|
||||
data = unpack_entry(the_repository, p, entries[i].offset, &type, &size);
|
||||
data_valid = 1;
|
||||
}
|
||||
|
||||
|
|
40
packfile.c
40
packfile.c
|
@ -1104,7 +1104,9 @@ static const unsigned char *get_delta_base_sha1(struct packed_git *p,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static int retry_bad_packed_offset(struct packed_git *p, off_t obj_offset)
|
||||
static int retry_bad_packed_offset(struct repository *r,
|
||||
struct packed_git *p,
|
||||
off_t obj_offset)
|
||||
{
|
||||
int type;
|
||||
struct revindex_entry *revidx;
|
||||
|
@ -1114,7 +1116,7 @@ static int retry_bad_packed_offset(struct packed_git *p, off_t obj_offset)
|
|||
return OBJ_BAD;
|
||||
nth_packed_object_oid(&oid, p, revidx->nr);
|
||||
mark_bad_packed_object(p, oid.hash);
|
||||
type = oid_object_info(&oid, NULL);
|
||||
type = oid_object_info(r, &oid, NULL);
|
||||
if (type <= OBJ_NONE)
|
||||
return OBJ_BAD;
|
||||
return type;
|
||||
|
@ -1122,7 +1124,8 @@ static int retry_bad_packed_offset(struct packed_git *p, off_t obj_offset)
|
|||
|
||||
#define POI_STACK_PREALLOC 64
|
||||
|
||||
static enum object_type packed_to_object_type(struct packed_git *p,
|
||||
static enum object_type packed_to_object_type(struct repository *r,
|
||||
struct packed_git *p,
|
||||
off_t obj_offset,
|
||||
enum object_type type,
|
||||
struct pack_window **w_curs,
|
||||
|
@ -1153,7 +1156,7 @@ static enum object_type packed_to_object_type(struct packed_git *p,
|
|||
if (type <= OBJ_NONE) {
|
||||
/* If getting the base itself fails, we first
|
||||
* retry the base, otherwise unwind */
|
||||
type = retry_bad_packed_offset(p, base_offset);
|
||||
type = retry_bad_packed_offset(r, p, base_offset);
|
||||
if (type > OBJ_NONE)
|
||||
goto out;
|
||||
goto unwind;
|
||||
|
@ -1181,7 +1184,7 @@ out:
|
|||
unwind:
|
||||
while (poi_stack_nr) {
|
||||
obj_offset = poi_stack[--poi_stack_nr];
|
||||
type = retry_bad_packed_offset(p, obj_offset);
|
||||
type = retry_bad_packed_offset(r, p, obj_offset);
|
||||
if (type > OBJ_NONE)
|
||||
goto out;
|
||||
}
|
||||
|
@ -1268,14 +1271,15 @@ static void detach_delta_base_cache_entry(struct delta_base_cache_entry *ent)
|
|||
free(ent);
|
||||
}
|
||||
|
||||
static void *cache_or_unpack_entry(struct packed_git *p, off_t base_offset,
|
||||
unsigned long *base_size, enum object_type *type)
|
||||
static void *cache_or_unpack_entry(struct repository *r, struct packed_git *p,
|
||||
off_t base_offset, unsigned long *base_size,
|
||||
enum object_type *type)
|
||||
{
|
||||
struct delta_base_cache_entry *ent;
|
||||
|
||||
ent = get_delta_base_cache_entry(p, base_offset);
|
||||
if (!ent)
|
||||
return unpack_entry(p, base_offset, type, base_size);
|
||||
return unpack_entry(r, p, base_offset, type, base_size);
|
||||
|
||||
if (type)
|
||||
*type = ent->type;
|
||||
|
@ -1329,8 +1333,8 @@ static void add_delta_base_cache(struct packed_git *p, off_t base_offset,
|
|||
hashmap_add(&delta_base_cache, ent);
|
||||
}
|
||||
|
||||
int packed_object_info(struct packed_git *p, off_t obj_offset,
|
||||
struct object_info *oi)
|
||||
int packed_object_info(struct repository *r, struct packed_git *p,
|
||||
off_t obj_offset, struct object_info *oi)
|
||||
{
|
||||
struct pack_window *w_curs = NULL;
|
||||
unsigned long size;
|
||||
|
@ -1342,7 +1346,7 @@ int packed_object_info(struct packed_git *p, off_t obj_offset,
|
|||
* a "real" type later if the caller is interested.
|
||||
*/
|
||||
if (oi->contentp) {
|
||||
*oi->contentp = cache_or_unpack_entry(p, obj_offset, oi->sizep,
|
||||
*oi->contentp = cache_or_unpack_entry(r, p, obj_offset, oi->sizep,
|
||||
&type);
|
||||
if (!*oi->contentp)
|
||||
type = OBJ_BAD;
|
||||
|
@ -1376,8 +1380,8 @@ int packed_object_info(struct packed_git *p, off_t obj_offset,
|
|||
|
||||
if (oi->typep || oi->type_name) {
|
||||
enum object_type ptot;
|
||||
ptot = packed_to_object_type(p, obj_offset, type, &w_curs,
|
||||
curpos);
|
||||
ptot = packed_to_object_type(r, p, obj_offset,
|
||||
type, &w_curs, curpos);
|
||||
if (oi->typep)
|
||||
*oi->typep = ptot;
|
||||
if (oi->type_name) {
|
||||
|
@ -1465,7 +1469,9 @@ struct unpack_entry_stack_ent {
|
|||
unsigned long size;
|
||||
};
|
||||
|
||||
static void *read_object(const struct object_id *oid, enum object_type *type,
|
||||
static void *read_object(struct repository *r,
|
||||
const struct object_id *oid,
|
||||
enum object_type *type,
|
||||
unsigned long *size)
|
||||
{
|
||||
struct object_info oi = OBJECT_INFO_INIT;
|
||||
|
@ -1474,12 +1480,12 @@ static void *read_object(const struct object_id *oid, enum object_type *type,
|
|||
oi.sizep = size;
|
||||
oi.contentp = &content;
|
||||
|
||||
if (oid_object_info_extended(oid, &oi, 0) < 0)
|
||||
if (oid_object_info_extended(r, oid, &oi, 0) < 0)
|
||||
return NULL;
|
||||
return content;
|
||||
}
|
||||
|
||||
void *unpack_entry(struct packed_git *p, off_t obj_offset,
|
||||
void *unpack_entry(struct repository *r, struct packed_git *p, off_t obj_offset,
|
||||
enum object_type *final_type, unsigned long *final_size)
|
||||
{
|
||||
struct pack_window *w_curs = NULL;
|
||||
|
@ -1610,7 +1616,7 @@ void *unpack_entry(struct packed_git *p, off_t obj_offset,
|
|||
oid_to_hex(&base_oid), (uintmax_t)obj_offset,
|
||||
p->pack_name);
|
||||
mark_bad_packed_object(p, base_oid.hash);
|
||||
base = read_object(&base_oid, &type, &base_size);
|
||||
base = read_object(r, &base_oid, &type, &base_size);
|
||||
external_base = base;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -116,7 +116,7 @@ extern off_t nth_packed_object_offset(const struct packed_git *, uint32_t n);
|
|||
extern off_t find_pack_entry_one(const unsigned char *sha1, struct packed_git *);
|
||||
|
||||
extern int is_pack_valid(struct packed_git *);
|
||||
extern void *unpack_entry(struct packed_git *, off_t, enum object_type *, unsigned long *);
|
||||
extern void *unpack_entry(struct repository *r, struct packed_git *, off_t, enum object_type *, unsigned long *);
|
||||
extern unsigned long unpack_object_header_buffer(const unsigned char *buf, unsigned long len, enum object_type *type, unsigned long *sizep);
|
||||
extern unsigned long get_size_from_delta(struct packed_git *, struct pack_window **, off_t);
|
||||
extern int unpack_object_header(struct packed_git *, struct pack_window **, off_t *, unsigned long *);
|
||||
|
@ -126,7 +126,9 @@ extern void release_pack_memory(size_t);
|
|||
/* global flag to enable extra checks when accessing packed objects */
|
||||
extern int do_check_packed_object_crc;
|
||||
|
||||
extern int packed_object_info(struct packed_git *pack, off_t offset, struct object_info *);
|
||||
extern int packed_object_info(struct repository *r,
|
||||
struct packed_git *pack,
|
||||
off_t offset, struct object_info *);
|
||||
|
||||
extern void mark_bad_packed_object(struct packed_git *p, const unsigned char *sha1);
|
||||
extern const struct packed_git *has_packed_and_bad(const unsigned char *sha1);
|
||||
|
|
|
@ -78,7 +78,7 @@ static void add_recent_object(const struct object_id *oid,
|
|||
* later processing, and the revision machinery expects
|
||||
* commits and tags to have been parsed.
|
||||
*/
|
||||
type = oid_object_info(oid, NULL);
|
||||
type = oid_object_info(the_repository, oid, NULL);
|
||||
if (type < 0)
|
||||
die("unable to get object info for %s", oid_to_hex(oid));
|
||||
|
||||
|
|
2
refs.c
2
refs.c
|
@ -303,7 +303,7 @@ enum peel_status peel_object(const struct object_id *name, struct object_id *oid
|
|||
struct object *o = lookup_unknown_object(name->hash);
|
||||
|
||||
if (o->type == OBJ_NONE) {
|
||||
int type = oid_object_info(name, NULL);
|
||||
int type = oid_object_info(the_repository, name, NULL);
|
||||
if (type < 0 || !object_as_type(o, type, 0))
|
||||
return PEEL_INVALID;
|
||||
}
|
||||
|
|
2
remote.c
2
remote.c
|
@ -1376,7 +1376,7 @@ static void add_missing_tags(struct ref *src, struct ref **dst, struct ref ***ds
|
|||
continue; /* not a tag */
|
||||
if (string_list_has_string(&dst_tag, ref->name))
|
||||
continue; /* they already have it */
|
||||
if (oid_object_info(&ref->new_oid, NULL) != OBJ_TAG)
|
||||
if (oid_object_info(the_repository, &ref->new_oid, NULL) != OBJ_TAG)
|
||||
continue; /* be conservative */
|
||||
item = string_list_append(&src_tag, ref->name);
|
||||
item->util = ref;
|
||||
|
|
|
@ -2884,7 +2884,8 @@ int sequencer_pick_revisions(struct replay_opts *opts)
|
|||
|
||||
if (!get_oid(name, &oid)) {
|
||||
if (!lookup_commit_reference_gently(&oid, 1)) {
|
||||
enum object_type type = oid_object_info(&oid,
|
||||
enum object_type type = oid_object_info(the_repository,
|
||||
&oid,
|
||||
NULL);
|
||||
return error(_("%s: can't cherry-pick a %s"),
|
||||
name, type_name(type));
|
||||
|
|
37
sha1-file.c
37
sha1-file.c
|
@ -1231,7 +1231,8 @@ static int sha1_loose_object_info(struct repository *r,
|
|||
|
||||
int fetch_if_missing = 1;
|
||||
|
||||
int oid_object_info_extended(const struct object_id *oid, struct object_info *oi, unsigned flags)
|
||||
int oid_object_info_extended(struct repository *r, const struct object_id *oid,
|
||||
struct object_info *oi, unsigned flags)
|
||||
{
|
||||
static struct object_info blank_oi = OBJECT_INFO_INIT;
|
||||
struct pack_entry e;
|
||||
|
@ -1240,7 +1241,7 @@ int oid_object_info_extended(const struct object_id *oid, struct object_info *oi
|
|||
int already_retried = 0;
|
||||
|
||||
if (flags & OBJECT_INFO_LOOKUP_REPLACE)
|
||||
real = lookup_replace_object(the_repository, oid);
|
||||
real = lookup_replace_object(r, oid);
|
||||
|
||||
if (is_null_oid(real))
|
||||
return -1;
|
||||
|
@ -1269,29 +1270,31 @@ int oid_object_info_extended(const struct object_id *oid, struct object_info *oi
|
|||
}
|
||||
|
||||
while (1) {
|
||||
if (find_pack_entry(the_repository, real->hash, &e))
|
||||
if (find_pack_entry(r, real->hash, &e))
|
||||
break;
|
||||
|
||||
if (flags & OBJECT_INFO_IGNORE_LOOSE)
|
||||
return -1;
|
||||
|
||||
/* Most likely it's a loose object. */
|
||||
if (!sha1_loose_object_info(the_repository, real->hash, oi, flags))
|
||||
if (!sha1_loose_object_info(r, real->hash, oi, flags))
|
||||
return 0;
|
||||
|
||||
/* Not a loose object; someone else may have just packed it. */
|
||||
if (!(flags & OBJECT_INFO_QUICK)) {
|
||||
reprepare_packed_git(the_repository);
|
||||
if (find_pack_entry(the_repository, real->hash, &e))
|
||||
reprepare_packed_git(r);
|
||||
if (find_pack_entry(r, real->hash, &e))
|
||||
break;
|
||||
}
|
||||
|
||||
/* Check if it is a missing object */
|
||||
if (fetch_if_missing && repository_format_partial_clone &&
|
||||
!already_retried) {
|
||||
!already_retried && r == the_repository) {
|
||||
/*
|
||||
* TODO Investigate haveing fetch_object() return
|
||||
* TODO Investigate having fetch_object() return
|
||||
* TODO error/success and stopping the music here.
|
||||
* TODO Pass a repository struct through fetch_object,
|
||||
* such that arbitrary repositories work.
|
||||
*/
|
||||
fetch_object(repository_format_partial_clone, real->hash);
|
||||
already_retried = 1;
|
||||
|
@ -1307,10 +1310,10 @@ int oid_object_info_extended(const struct object_id *oid, struct object_info *oi
|
|||
* information below, so return early.
|
||||
*/
|
||||
return 0;
|
||||
rtype = packed_object_info(e.p, e.offset, oi);
|
||||
rtype = packed_object_info(r, e.p, e.offset, oi);
|
||||
if (rtype < 0) {
|
||||
mark_bad_packed_object(e.p, real->hash);
|
||||
return oid_object_info_extended(real, oi, 0);
|
||||
return oid_object_info_extended(r, real, oi, 0);
|
||||
} else if (oi->whence == OI_PACKED) {
|
||||
oi->u.packed.offset = e.offset;
|
||||
oi->u.packed.pack = e.p;
|
||||
|
@ -1322,15 +1325,17 @@ int oid_object_info_extended(const struct object_id *oid, struct object_info *oi
|
|||
}
|
||||
|
||||
/* returns enum object_type or negative */
|
||||
int oid_object_info(const struct object_id *oid, unsigned long *sizep)
|
||||
int oid_object_info(struct repository *r,
|
||||
const struct object_id *oid,
|
||||
unsigned long *sizep)
|
||||
{
|
||||
enum object_type type;
|
||||
struct object_info oi = OBJECT_INFO_INIT;
|
||||
|
||||
oi.typep = &type;
|
||||
oi.sizep = sizep;
|
||||
if (oid_object_info_extended(oid, &oi,
|
||||
OBJECT_INFO_LOOKUP_REPLACE) < 0)
|
||||
if (oid_object_info_extended(r, oid, &oi,
|
||||
OBJECT_INFO_LOOKUP_REPLACE) < 0)
|
||||
return -1;
|
||||
return type;
|
||||
}
|
||||
|
@ -1347,7 +1352,7 @@ static void *read_object(const unsigned char *sha1, enum object_type *type,
|
|||
|
||||
hashcpy(oid.hash, sha1);
|
||||
|
||||
if (oid_object_info_extended(&oid, &oi, 0) < 0)
|
||||
if (oid_object_info_extended(the_repository, &oid, &oi, 0) < 0)
|
||||
return NULL;
|
||||
return content;
|
||||
}
|
||||
|
@ -1745,7 +1750,7 @@ int has_sha1_file_with_flags(const unsigned char *sha1, int flags)
|
|||
if (!startup_info->have_repository)
|
||||
return 0;
|
||||
hashcpy(oid.hash, sha1);
|
||||
return oid_object_info_extended(&oid, NULL,
|
||||
return oid_object_info_extended(the_repository, &oid, NULL,
|
||||
flags | OBJECT_INFO_SKIP_CACHED) >= 0;
|
||||
}
|
||||
|
||||
|
@ -1988,7 +1993,7 @@ int read_pack_header(int fd, struct pack_header *header)
|
|||
|
||||
void assert_oid_type(const struct object_id *oid, enum object_type expect)
|
||||
{
|
||||
enum object_type type = oid_object_info(oid, NULL);
|
||||
enum object_type type = oid_object_info(the_repository, oid, NULL);
|
||||
if (type < 0)
|
||||
die("%s is not a valid object", oid_to_hex(oid));
|
||||
if (type != expect)
|
||||
|
|
12
sha1-name.c
12
sha1-name.c
|
@ -223,7 +223,7 @@ static int finish_object_disambiguation(struct disambiguate_state *ds,
|
|||
|
||||
static int disambiguate_commit_only(const struct object_id *oid, void *cb_data_unused)
|
||||
{
|
||||
int kind = oid_object_info(oid, NULL);
|
||||
int kind = oid_object_info(the_repository, oid, NULL);
|
||||
return kind == OBJ_COMMIT;
|
||||
}
|
||||
|
||||
|
@ -232,7 +232,7 @@ static int disambiguate_committish_only(const struct object_id *oid, void *cb_da
|
|||
struct object *obj;
|
||||
int kind;
|
||||
|
||||
kind = oid_object_info(oid, NULL);
|
||||
kind = oid_object_info(the_repository, oid, NULL);
|
||||
if (kind == OBJ_COMMIT)
|
||||
return 1;
|
||||
if (kind != OBJ_TAG)
|
||||
|
@ -247,7 +247,7 @@ static int disambiguate_committish_only(const struct object_id *oid, void *cb_da
|
|||
|
||||
static int disambiguate_tree_only(const struct object_id *oid, void *cb_data_unused)
|
||||
{
|
||||
int kind = oid_object_info(oid, NULL);
|
||||
int kind = oid_object_info(the_repository, oid, NULL);
|
||||
return kind == OBJ_TREE;
|
||||
}
|
||||
|
||||
|
@ -256,7 +256,7 @@ static int disambiguate_treeish_only(const struct object_id *oid, void *cb_data_
|
|||
struct object *obj;
|
||||
int kind;
|
||||
|
||||
kind = oid_object_info(oid, NULL);
|
||||
kind = oid_object_info(the_repository, oid, NULL);
|
||||
if (kind == OBJ_TREE || kind == OBJ_COMMIT)
|
||||
return 1;
|
||||
if (kind != OBJ_TAG)
|
||||
|
@ -271,7 +271,7 @@ static int disambiguate_treeish_only(const struct object_id *oid, void *cb_data_
|
|||
|
||||
static int disambiguate_blob_only(const struct object_id *oid, void *cb_data_unused)
|
||||
{
|
||||
int kind = oid_object_info(oid, NULL);
|
||||
int kind = oid_object_info(the_repository, oid, NULL);
|
||||
return kind == OBJ_BLOB;
|
||||
}
|
||||
|
||||
|
@ -350,7 +350,7 @@ static int show_ambiguous_object(const struct object_id *oid, void *data)
|
|||
if (ds->fn && !ds->fn(oid, ds->cb_data))
|
||||
return 0;
|
||||
|
||||
type = oid_object_info(oid, NULL);
|
||||
type = oid_object_info(the_repository, oid, NULL);
|
||||
if (type == OBJ_COMMIT) {
|
||||
struct commit *commit = lookup_commit(oid);
|
||||
if (commit) {
|
||||
|
|
|
@ -117,7 +117,7 @@ static enum input_source istream_source(const struct object_id *oid,
|
|||
|
||||
oi->typep = type;
|
||||
oi->sizep = &size;
|
||||
status = oid_object_info_extended(oid, oi, 0);
|
||||
status = oid_object_info_extended(the_repository, oid, oi, 0);
|
||||
if (status < 0)
|
||||
return stream_error;
|
||||
|
||||
|
|
|
@ -820,7 +820,7 @@ static int check_has_commit(const struct object_id *oid, void *data)
|
|||
{
|
||||
struct has_commit_data *cb = data;
|
||||
|
||||
enum object_type type = oid_object_info(oid, NULL);
|
||||
enum object_type type = oid_object_info(the_repository, oid, NULL);
|
||||
|
||||
switch (type) {
|
||||
case OBJ_COMMIT:
|
||||
|
|
2
tag.c
2
tag.c
|
@ -41,7 +41,7 @@ int gpg_verify_tag(const struct object_id *oid, const char *name_to_report,
|
|||
unsigned long size;
|
||||
int ret;
|
||||
|
||||
type = oid_object_info(oid, NULL);
|
||||
type = oid_object_info(the_repository, oid, NULL);
|
||||
if (type != OBJ_TAG)
|
||||
return error("%s: cannot verify a non-tag object of type %s.",
|
||||
name_to_report ?
|
||||
|
|
Загрузка…
Ссылка в новой задаче