Merge branch 'nd/tree-walk-with-repo'
The tree-walk API learned to pass an in-core repository instance throughout more codepaths. * nd/tree-walk-with-repo: t7814: do not generate same commits in different repos Use the right 'struct repository' instead of the_repository match-trees.c: remove the_repo from shift_tree*() tree-walk.c: remove the_repo from get_tree_entry_follow_symlinks() tree-walk.c: remove the_repo from get_tree_entry() tree-walk.c: remove the_repo from fill_tree_descriptor() sha1-file.c: remove the_repo from read_object_with_reference()
This commit is contained in:
@ -418,7 +418,9 @@ static void parse_treeish_arg(const char **argv,
|
|||||||
unsigned short mode;
|
unsigned short mode;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = get_tree_entry(&tree->object.oid, prefix, &tree_oid,
|
err = get_tree_entry(ar_args->repo,
|
||||||
|
&tree->object.oid,
|
||||||
|
prefix, &tree_oid,
|
||||||
&mode);
|
&mode);
|
||||||
if (err || !S_ISDIR(mode))
|
if (err || !S_ISDIR(mode))
|
||||||
die(_("current working directory is untracked"));
|
die(_("current working directory is untracked"));
|
||||||
|
4
blame.c
4
blame.c
@ -101,7 +101,7 @@ static void verify_working_tree_path(struct repository *r,
|
|||||||
struct object_id blob_oid;
|
struct object_id blob_oid;
|
||||||
unsigned short mode;
|
unsigned short mode;
|
||||||
|
|
||||||
if (!get_tree_entry(commit_oid, path, &blob_oid, &mode) &&
|
if (!get_tree_entry(r, commit_oid, path, &blob_oid, &mode) &&
|
||||||
oid_object_info(r, &blob_oid, NULL) == OBJ_BLOB)
|
oid_object_info(r, &blob_oid, NULL) == OBJ_BLOB)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1232,7 +1232,7 @@ static int fill_blob_sha1_and_mode(struct repository *r,
|
|||||||
{
|
{
|
||||||
if (!is_null_oid(&origin->blob_oid))
|
if (!is_null_oid(&origin->blob_oid))
|
||||||
return 0;
|
return 0;
|
||||||
if (get_tree_entry(&origin->commit->object.oid, origin->path, &origin->blob_oid, &origin->mode))
|
if (get_tree_entry(r, &origin->commit->object.oid, origin->path, &origin->blob_oid, &origin->mode))
|
||||||
goto error_out;
|
goto error_out;
|
||||||
if (oid_object_info(r, &origin->blob_oid, NULL) != OBJ_BLOB)
|
if (oid_object_info(r, &origin->blob_oid, NULL) != OBJ_BLOB)
|
||||||
goto error_out;
|
goto error_out;
|
||||||
|
@ -172,7 +172,8 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
|
|||||||
* fall-back to the usual case.
|
* fall-back to the usual case.
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
buf = read_object_with_reference(&oid, exp_type, &size, NULL);
|
buf = read_object_with_reference(the_repository,
|
||||||
|
&oid, exp_type, &size, NULL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -458,7 +458,8 @@ static int grep_submodule(struct grep_opt *opt,
|
|||||||
object = parse_object_or_die(oid, oid_to_hex(oid));
|
object = parse_object_or_die(oid, oid_to_hex(oid));
|
||||||
|
|
||||||
grep_read_lock();
|
grep_read_lock();
|
||||||
data = read_object_with_reference(&object->oid, tree_type,
|
data = read_object_with_reference(&subrepo,
|
||||||
|
&object->oid, tree_type,
|
||||||
&size, NULL);
|
&size, NULL);
|
||||||
grep_read_unlock();
|
grep_read_unlock();
|
||||||
|
|
||||||
@ -623,7 +624,8 @@ static int grep_object(struct grep_opt *opt, const struct pathspec *pathspec,
|
|||||||
int hit, len;
|
int hit, len;
|
||||||
|
|
||||||
grep_read_lock();
|
grep_read_lock();
|
||||||
data = read_object_with_reference(&obj->oid, tree_type,
|
data = read_object_with_reference(opt->repo,
|
||||||
|
&obj->oid, tree_type,
|
||||||
&size, NULL);
|
&size, NULL);
|
||||||
grep_read_unlock();
|
grep_read_unlock();
|
||||||
|
|
||||||
|
@ -205,6 +205,7 @@ static void resolve(const struct traverse_info *info, struct name_entry *ours, s
|
|||||||
static void unresolved_directory(const struct traverse_info *info,
|
static void unresolved_directory(const struct traverse_info *info,
|
||||||
struct name_entry n[3])
|
struct name_entry n[3])
|
||||||
{
|
{
|
||||||
|
struct repository *r = the_repository;
|
||||||
char *newbase;
|
char *newbase;
|
||||||
struct name_entry *p;
|
struct name_entry *p;
|
||||||
struct tree_desc t[3];
|
struct tree_desc t[3];
|
||||||
@ -220,9 +221,9 @@ static void unresolved_directory(const struct traverse_info *info,
|
|||||||
newbase = traverse_path(info, p);
|
newbase = traverse_path(info, p);
|
||||||
|
|
||||||
#define ENTRY_OID(e) (((e)->mode && S_ISDIR((e)->mode)) ? &(e)->oid : NULL)
|
#define ENTRY_OID(e) (((e)->mode && S_ISDIR((e)->mode)) ? &(e)->oid : NULL)
|
||||||
buf0 = fill_tree_descriptor(t + 0, ENTRY_OID(n + 0));
|
buf0 = fill_tree_descriptor(r, t + 0, ENTRY_OID(n + 0));
|
||||||
buf1 = fill_tree_descriptor(t + 1, ENTRY_OID(n + 1));
|
buf1 = fill_tree_descriptor(r, t + 1, ENTRY_OID(n + 1));
|
||||||
buf2 = fill_tree_descriptor(t + 2, ENTRY_OID(n + 2));
|
buf2 = fill_tree_descriptor(r, t + 2, ENTRY_OID(n + 2));
|
||||||
#undef ENTRY_OID
|
#undef ENTRY_OID
|
||||||
|
|
||||||
merge_trees(t, newbase);
|
merge_trees(t, newbase);
|
||||||
@ -351,14 +352,16 @@ static void merge_trees(struct tree_desc t[3], const char *base)
|
|||||||
traverse_trees(&the_index, 3, t, &info);
|
traverse_trees(&the_index, 3, t, &info);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *get_tree_descriptor(struct tree_desc *desc, const char *rev)
|
static void *get_tree_descriptor(struct repository *r,
|
||||||
|
struct tree_desc *desc,
|
||||||
|
const char *rev)
|
||||||
{
|
{
|
||||||
struct object_id oid;
|
struct object_id oid;
|
||||||
void *buf;
|
void *buf;
|
||||||
|
|
||||||
if (get_oid(rev, &oid))
|
if (repo_get_oid(r, rev, &oid))
|
||||||
die("unknown rev %s", rev);
|
die("unknown rev %s", rev);
|
||||||
buf = fill_tree_descriptor(desc, &oid);
|
buf = fill_tree_descriptor(r, desc, &oid);
|
||||||
if (!buf)
|
if (!buf)
|
||||||
die("%s is not a tree", rev);
|
die("%s is not a tree", rev);
|
||||||
return buf;
|
return buf;
|
||||||
@ -366,15 +369,16 @@ static void *get_tree_descriptor(struct tree_desc *desc, const char *rev)
|
|||||||
|
|
||||||
int cmd_merge_tree(int argc, const char **argv, const char *prefix)
|
int cmd_merge_tree(int argc, const char **argv, const char *prefix)
|
||||||
{
|
{
|
||||||
|
struct repository *r = the_repository;
|
||||||
struct tree_desc t[3];
|
struct tree_desc t[3];
|
||||||
void *buf1, *buf2, *buf3;
|
void *buf1, *buf2, *buf3;
|
||||||
|
|
||||||
if (argc != 4)
|
if (argc != 4)
|
||||||
usage(merge_tree_usage);
|
usage(merge_tree_usage);
|
||||||
|
|
||||||
buf1 = get_tree_descriptor(t+0, argv[1]);
|
buf1 = get_tree_descriptor(r, t+0, argv[1]);
|
||||||
buf2 = get_tree_descriptor(t+1, argv[2]);
|
buf2 = get_tree_descriptor(r, t+1, argv[2]);
|
||||||
buf3 = get_tree_descriptor(t+2, argv[3]);
|
buf3 = get_tree_descriptor(r, t+2, argv[3]);
|
||||||
merge_trees(t, "");
|
merge_trees(t, "");
|
||||||
free(buf1);
|
free(buf1);
|
||||||
free(buf2);
|
free(buf2);
|
||||||
|
@ -1428,7 +1428,8 @@ static void add_preferred_base(struct object_id *oid)
|
|||||||
if (window <= num_preferred_base++)
|
if (window <= num_preferred_base++)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
data = read_object_with_reference(oid, tree_type, &size, &tree_oid);
|
data = read_object_with_reference(the_repository, oid,
|
||||||
|
tree_type, &size, &tree_oid);
|
||||||
if (!data)
|
if (!data)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -850,13 +850,13 @@ static int reset_head(struct object_id *oid, const char *action,
|
|||||||
goto leave_reset_head;
|
goto leave_reset_head;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!reset_hard && !fill_tree_descriptor(&desc[nr++], &head_oid)) {
|
if (!reset_hard && !fill_tree_descriptor(the_repository, &desc[nr++], &head_oid)) {
|
||||||
ret = error(_("failed to find tree of %s"),
|
ret = error(_("failed to find tree of %s"),
|
||||||
oid_to_hex(&head_oid));
|
oid_to_hex(&head_oid));
|
||||||
goto leave_reset_head;
|
goto leave_reset_head;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fill_tree_descriptor(&desc[nr++], oid)) {
|
if (!fill_tree_descriptor(the_repository, &desc[nr++], oid)) {
|
||||||
ret = error(_("failed to find tree of %s"), oid_to_hex(oid));
|
ret = error(_("failed to find tree of %s"), oid_to_hex(oid));
|
||||||
goto leave_reset_head;
|
goto leave_reset_head;
|
||||||
}
|
}
|
||||||
|
@ -79,13 +79,13 @@ static int reset_index(const struct object_id *oid, int reset_type, int quiet)
|
|||||||
struct object_id head_oid;
|
struct object_id head_oid;
|
||||||
if (get_oid("HEAD", &head_oid))
|
if (get_oid("HEAD", &head_oid))
|
||||||
return error(_("You do not have a valid HEAD."));
|
return error(_("You do not have a valid HEAD."));
|
||||||
if (!fill_tree_descriptor(desc + nr, &head_oid))
|
if (!fill_tree_descriptor(the_repository, desc + nr, &head_oid))
|
||||||
return error(_("Failed to find tree of HEAD."));
|
return error(_("Failed to find tree of HEAD."));
|
||||||
nr++;
|
nr++;
|
||||||
opts.fn = twoway_merge;
|
opts.fn = twoway_merge;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fill_tree_descriptor(desc + nr, oid)) {
|
if (!fill_tree_descriptor(the_repository, desc + nr, oid)) {
|
||||||
error(_("Failed to find tree of %s."), oid_to_hex(oid));
|
error(_("Failed to find tree of %s."), oid_to_hex(oid));
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -179,7 +179,7 @@ static int check_local_mod(struct object_id *head, int index_only)
|
|||||||
* way as changed from the HEAD.
|
* way as changed from the HEAD.
|
||||||
*/
|
*/
|
||||||
if (no_head
|
if (no_head
|
||||||
|| get_tree_entry(head, name, &oid, &mode)
|
|| get_tree_entry(the_repository, head, name, &oid, &mode)
|
||||||
|| ce->ce_mode != create_ce_mode(mode)
|
|| ce->ce_mode != create_ce_mode(mode)
|
||||||
|| !oideq(&ce->oid, &oid))
|
|| !oideq(&ce->oid, &oid))
|
||||||
staged_changes = 1;
|
staged_changes = 1;
|
||||||
|
@ -601,7 +601,7 @@ static struct cache_entry *read_one_ent(const char *which,
|
|||||||
struct object_id oid;
|
struct object_id oid;
|
||||||
struct cache_entry *ce;
|
struct cache_entry *ce;
|
||||||
|
|
||||||
if (get_tree_entry(ent, path, &oid, &mode)) {
|
if (get_tree_entry(the_repository, ent, path, &oid, &mode)) {
|
||||||
if (which)
|
if (which)
|
||||||
error("%s: not in %s branch.", path, which);
|
error("%s: not in %s branch.", path, which);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
7
cache.h
7
cache.h
@ -1476,7 +1476,8 @@ int df_name_compare(const char *name1, int len1, int mode1, const char *name2, i
|
|||||||
int name_compare(const char *name1, size_t len1, const char *name2, size_t len2);
|
int name_compare(const char *name1, size_t len1, const char *name2, size_t len2);
|
||||||
int cache_name_stage_compare(const char *name1, int len1, int stage1, const char *name2, int len2, int stage2);
|
int cache_name_stage_compare(const char *name1, int len1, int stage1, const char *name2, int len2, int stage2);
|
||||||
|
|
||||||
void *read_object_with_reference(const struct object_id *oid,
|
void *read_object_with_reference(struct repository *r,
|
||||||
|
const struct object_id *oid,
|
||||||
const char *required_type,
|
const char *required_type,
|
||||||
unsigned long *size,
|
unsigned long *size,
|
||||||
struct object_id *oid_ret);
|
struct object_id *oid_ret);
|
||||||
@ -1762,8 +1763,8 @@ int add_files_to_cache(const char *prefix, const struct pathspec *pathspec, int
|
|||||||
extern int diff_auto_refresh_index;
|
extern int diff_auto_refresh_index;
|
||||||
|
|
||||||
/* match-trees.c */
|
/* match-trees.c */
|
||||||
void shift_tree(const struct object_id *, const struct object_id *, struct object_id *, int);
|
void shift_tree(struct repository *, const struct object_id *, const struct object_id *, struct object_id *, int);
|
||||||
void shift_tree_by(const struct object_id *, const struct object_id *, struct object_id *, const char *);
|
void shift_tree_by(struct repository *, const struct object_id *, const struct object_id *, struct object_id *, const char *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* whitespace rules.
|
* whitespace rules.
|
||||||
|
@ -2410,7 +2410,8 @@ static void note_change_n(const char *p, struct branch *b, unsigned char *old_fa
|
|||||||
oidcpy(&commit_oid, &commit_oe->idx.oid);
|
oidcpy(&commit_oid, &commit_oe->idx.oid);
|
||||||
} else if (!get_oid(p, &commit_oid)) {
|
} else if (!get_oid(p, &commit_oid)) {
|
||||||
unsigned long size;
|
unsigned long size;
|
||||||
char *buf = read_object_with_reference(&commit_oid,
|
char *buf = read_object_with_reference(the_repository,
|
||||||
|
&commit_oid,
|
||||||
commit_type, &size,
|
commit_type, &size,
|
||||||
&commit_oid);
|
&commit_oid);
|
||||||
if (!buf || size < the_hash_algo->hexsz + 6)
|
if (!buf || size < the_hash_algo->hexsz + 6)
|
||||||
@ -2482,7 +2483,8 @@ static void parse_from_existing(struct branch *b)
|
|||||||
unsigned long size;
|
unsigned long size;
|
||||||
char *buf;
|
char *buf;
|
||||||
|
|
||||||
buf = read_object_with_reference(&b->oid, commit_type, &size,
|
buf = read_object_with_reference(the_repository,
|
||||||
|
&b->oid, commit_type, &size,
|
||||||
&b->oid);
|
&b->oid);
|
||||||
parse_from_commit(b, buf, size);
|
parse_from_commit(b, buf, size);
|
||||||
free(buf);
|
free(buf);
|
||||||
@ -2560,7 +2562,8 @@ static struct hash_list *parse_merge(unsigned int *count)
|
|||||||
oidcpy(&n->oid, &oe->idx.oid);
|
oidcpy(&n->oid, &oe->idx.oid);
|
||||||
} else if (!get_oid(from, &n->oid)) {
|
} else if (!get_oid(from, &n->oid)) {
|
||||||
unsigned long size;
|
unsigned long size;
|
||||||
char *buf = read_object_with_reference(&n->oid,
|
char *buf = read_object_with_reference(the_repository,
|
||||||
|
&n->oid,
|
||||||
commit_type,
|
commit_type,
|
||||||
&size, &n->oid);
|
&size, &n->oid);
|
||||||
if (!buf || size < the_hash_algo->hexsz + 6)
|
if (!buf || size < the_hash_algo->hexsz + 6)
|
||||||
|
@ -496,12 +496,13 @@ static struct commit *check_single_commit(struct rev_info *revs)
|
|||||||
return (struct commit *) commit;
|
return (struct commit *) commit;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fill_blob_sha1(struct commit *commit, struct diff_filespec *spec)
|
static void fill_blob_sha1(struct repository *r, struct commit *commit,
|
||||||
|
struct diff_filespec *spec)
|
||||||
{
|
{
|
||||||
unsigned short mode;
|
unsigned short mode;
|
||||||
struct object_id oid;
|
struct object_id oid;
|
||||||
|
|
||||||
if (get_tree_entry(&commit->object.oid, spec->path, &oid, &mode))
|
if (get_tree_entry(r, &commit->object.oid, spec->path, &oid, &mode))
|
||||||
die("There is no path %s in the commit", spec->path);
|
die("There is no path %s in the commit", spec->path);
|
||||||
fill_filespec(spec, &oid, 1, mode);
|
fill_filespec(spec, &oid, 1, mode);
|
||||||
|
|
||||||
@ -585,7 +586,7 @@ parse_lines(struct repository *r, struct commit *commit,
|
|||||||
name_part);
|
name_part);
|
||||||
|
|
||||||
spec = alloc_filespec(full_name);
|
spec = alloc_filespec(full_name);
|
||||||
fill_blob_sha1(commit, spec);
|
fill_blob_sha1(r, commit, spec);
|
||||||
fill_line_ends(r, spec, &lines, &ends);
|
fill_line_ends(r, spec, &lines, &ends);
|
||||||
cb_data.spec = spec;
|
cb_data.spec = spec;
|
||||||
cb_data.lines = lines;
|
cb_data.lines = lines;
|
||||||
|
@ -248,7 +248,8 @@ static int splice_tree(const struct object_id *oid1, const char *prefix,
|
|||||||
* other hand, it could cover tree one and we might need to pick a
|
* other hand, it could cover tree one and we might need to pick a
|
||||||
* subtree of it.
|
* subtree of it.
|
||||||
*/
|
*/
|
||||||
void shift_tree(const struct object_id *hash1,
|
void shift_tree(struct repository *r,
|
||||||
|
const struct object_id *hash1,
|
||||||
const struct object_id *hash2,
|
const struct object_id *hash2,
|
||||||
struct object_id *shifted,
|
struct object_id *shifted,
|
||||||
int depth_limit)
|
int depth_limit)
|
||||||
@ -290,7 +291,7 @@ void shift_tree(const struct object_id *hash1,
|
|||||||
if (!*del_prefix)
|
if (!*del_prefix)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (get_tree_entry(hash2, del_prefix, shifted, &mode))
|
if (get_tree_entry(r, hash2, del_prefix, shifted, &mode))
|
||||||
die("cannot find path %s in tree %s",
|
die("cannot find path %s in tree %s",
|
||||||
del_prefix, oid_to_hex(hash2));
|
del_prefix, oid_to_hex(hash2));
|
||||||
return;
|
return;
|
||||||
@ -307,7 +308,8 @@ void shift_tree(const struct object_id *hash1,
|
|||||||
* Unfortunately we cannot fundamentally tell which one to
|
* Unfortunately we cannot fundamentally tell which one to
|
||||||
* be prefixed, as recursive merge can work in either direction.
|
* be prefixed, as recursive merge can work in either direction.
|
||||||
*/
|
*/
|
||||||
void shift_tree_by(const struct object_id *hash1,
|
void shift_tree_by(struct repository *r,
|
||||||
|
const struct object_id *hash1,
|
||||||
const struct object_id *hash2,
|
const struct object_id *hash2,
|
||||||
struct object_id *shifted,
|
struct object_id *shifted,
|
||||||
const char *shift_prefix)
|
const char *shift_prefix)
|
||||||
@ -317,12 +319,12 @@ void shift_tree_by(const struct object_id *hash1,
|
|||||||
unsigned candidate = 0;
|
unsigned candidate = 0;
|
||||||
|
|
||||||
/* Can hash2 be a tree at shift_prefix in tree hash1? */
|
/* Can hash2 be a tree at shift_prefix in tree hash1? */
|
||||||
if (!get_tree_entry(hash1, shift_prefix, &sub1, &mode1) &&
|
if (!get_tree_entry(r, hash1, shift_prefix, &sub1, &mode1) &&
|
||||||
S_ISDIR(mode1))
|
S_ISDIR(mode1))
|
||||||
candidate |= 1;
|
candidate |= 1;
|
||||||
|
|
||||||
/* Can hash1 be a tree at shift_prefix in tree hash2? */
|
/* Can hash1 be a tree at shift_prefix in tree hash2? */
|
||||||
if (!get_tree_entry(hash2, shift_prefix, &sub2, &mode2) &&
|
if (!get_tree_entry(r, hash2, shift_prefix, &sub2, &mode2) &&
|
||||||
S_ISDIR(mode2))
|
S_ISDIR(mode2))
|
||||||
candidate |= 2;
|
candidate |= 2;
|
||||||
|
|
||||||
|
@ -153,9 +153,9 @@ static struct tree *shift_tree_object(struct repository *repo,
|
|||||||
struct object_id shifted;
|
struct object_id shifted;
|
||||||
|
|
||||||
if (!*subtree_shift) {
|
if (!*subtree_shift) {
|
||||||
shift_tree(&one->object.oid, &two->object.oid, &shifted, 0);
|
shift_tree(repo, &one->object.oid, &two->object.oid, &shifted, 0);
|
||||||
} else {
|
} else {
|
||||||
shift_tree_by(&one->object.oid, &two->object.oid, &shifted,
|
shift_tree_by(repo, &one->object.oid, &two->object.oid, &shifted,
|
||||||
subtree_shift);
|
subtree_shift);
|
||||||
}
|
}
|
||||||
if (oideq(&two->object.oid, &shifted))
|
if (oideq(&two->object.oid, &shifted))
|
||||||
@ -465,17 +465,18 @@ static void get_files_dirs(struct merge_options *opt, struct tree *tree)
|
|||||||
{
|
{
|
||||||
struct pathspec match_all;
|
struct pathspec match_all;
|
||||||
memset(&match_all, 0, sizeof(match_all));
|
memset(&match_all, 0, sizeof(match_all));
|
||||||
read_tree_recursive(the_repository, tree, "", 0, 0,
|
read_tree_recursive(opt->repo, tree, "", 0, 0,
|
||||||
&match_all, save_files_dirs, opt);
|
&match_all, save_files_dirs, opt);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_tree_entry_if_blob(const struct object_id *tree,
|
static int get_tree_entry_if_blob(struct repository *r,
|
||||||
|
const struct object_id *tree,
|
||||||
const char *path,
|
const char *path,
|
||||||
struct diff_filespec *dfs)
|
struct diff_filespec *dfs)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = get_tree_entry(tree, path, &dfs->oid, &dfs->mode);
|
ret = get_tree_entry(r, tree, path, &dfs->oid, &dfs->mode);
|
||||||
if (S_ISDIR(dfs->mode)) {
|
if (S_ISDIR(dfs->mode)) {
|
||||||
oidcpy(&dfs->oid, &null_oid);
|
oidcpy(&dfs->oid, &null_oid);
|
||||||
dfs->mode = 0;
|
dfs->mode = 0;
|
||||||
@ -487,15 +488,16 @@ static int get_tree_entry_if_blob(const struct object_id *tree,
|
|||||||
* Returns an index_entry instance which doesn't have to correspond to
|
* Returns an index_entry instance which doesn't have to correspond to
|
||||||
* a real cache entry in Git's index.
|
* a real cache entry in Git's index.
|
||||||
*/
|
*/
|
||||||
static struct stage_data *insert_stage_data(const char *path,
|
static struct stage_data *insert_stage_data(struct repository *r,
|
||||||
|
const char *path,
|
||||||
struct tree *o, struct tree *a, struct tree *b,
|
struct tree *o, struct tree *a, struct tree *b,
|
||||||
struct string_list *entries)
|
struct string_list *entries)
|
||||||
{
|
{
|
||||||
struct string_list_item *item;
|
struct string_list_item *item;
|
||||||
struct stage_data *e = xcalloc(1, sizeof(struct stage_data));
|
struct stage_data *e = xcalloc(1, sizeof(struct stage_data));
|
||||||
get_tree_entry_if_blob(&o->object.oid, path, &e->stages[1]);
|
get_tree_entry_if_blob(r, &o->object.oid, path, &e->stages[1]);
|
||||||
get_tree_entry_if_blob(&a->object.oid, path, &e->stages[2]);
|
get_tree_entry_if_blob(r, &a->object.oid, path, &e->stages[2]);
|
||||||
get_tree_entry_if_blob(&b->object.oid, path, &e->stages[3]);
|
get_tree_entry_if_blob(r, &b->object.oid, path, &e->stages[3]);
|
||||||
item = string_list_insert(entries, path);
|
item = string_list_insert(entries, path);
|
||||||
item->util = e;
|
item->util = e;
|
||||||
return e;
|
return e;
|
||||||
@ -1900,12 +1902,14 @@ static struct diff_queue_struct *get_diffpairs(struct merge_options *opt,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tree_has_path(struct tree *tree, const char *path)
|
static int tree_has_path(struct repository *r, struct tree *tree,
|
||||||
|
const char *path)
|
||||||
{
|
{
|
||||||
struct object_id hashy;
|
struct object_id hashy;
|
||||||
unsigned short mode_o;
|
unsigned short mode_o;
|
||||||
|
|
||||||
return !get_tree_entry(&tree->object.oid, path,
|
return !get_tree_entry(r,
|
||||||
|
&tree->object.oid, path,
|
||||||
&hashy, &mode_o);
|
&hashy, &mode_o);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2056,7 +2060,7 @@ static char *handle_path_level_conflicts(struct merge_options *opt,
|
|||||||
*/
|
*/
|
||||||
if (collision_ent->reported_already) {
|
if (collision_ent->reported_already) {
|
||||||
clean = 0;
|
clean = 0;
|
||||||
} else if (tree_has_path(tree, new_path)) {
|
} else if (tree_has_path(opt->repo, tree, new_path)) {
|
||||||
collision_ent->reported_already = 1;
|
collision_ent->reported_already = 1;
|
||||||
strbuf_add_separated_string_list(&collision_paths, ", ",
|
strbuf_add_separated_string_list(&collision_paths, ", ",
|
||||||
&collision_ent->source_files);
|
&collision_ent->source_files);
|
||||||
@ -2134,7 +2138,7 @@ static void handle_directory_level_conflicts(struct merge_options *opt,
|
|||||||
string_list_append(&remove_from_merge,
|
string_list_append(&remove_from_merge,
|
||||||
merge_ent->dir)->util = merge_ent;
|
merge_ent->dir)->util = merge_ent;
|
||||||
strbuf_release(&merge_ent->new_dir);
|
strbuf_release(&merge_ent->new_dir);
|
||||||
} else if (tree_has_path(head, head_ent->dir)) {
|
} else if (tree_has_path(opt->repo, head, head_ent->dir)) {
|
||||||
/* 2. This wasn't a directory rename after all */
|
/* 2. This wasn't a directory rename after all */
|
||||||
string_list_append(&remove_from_head,
|
string_list_append(&remove_from_head,
|
||||||
head_ent->dir)->util = head_ent;
|
head_ent->dir)->util = head_ent;
|
||||||
@ -2148,7 +2152,7 @@ static void handle_directory_level_conflicts(struct merge_options *opt,
|
|||||||
hashmap_iter_init(dir_re_merge, &iter);
|
hashmap_iter_init(dir_re_merge, &iter);
|
||||||
while ((merge_ent = hashmap_iter_next(&iter))) {
|
while ((merge_ent = hashmap_iter_next(&iter))) {
|
||||||
head_ent = dir_rename_find_entry(dir_re_head, merge_ent->dir);
|
head_ent = dir_rename_find_entry(dir_re_head, merge_ent->dir);
|
||||||
if (tree_has_path(merge, merge_ent->dir)) {
|
if (tree_has_path(opt->repo, merge, merge_ent->dir)) {
|
||||||
/* 2. This wasn't a directory rename after all */
|
/* 2. This wasn't a directory rename after all */
|
||||||
string_list_append(&remove_from_merge,
|
string_list_append(&remove_from_merge,
|
||||||
merge_ent->dir)->util = merge_ent;
|
merge_ent->dir)->util = merge_ent;
|
||||||
@ -2477,7 +2481,7 @@ static void apply_directory_rename_modifications(struct merge_options *opt,
|
|||||||
if (pair->status == 'R')
|
if (pair->status == 'R')
|
||||||
re->dst_entry->processed = 1;
|
re->dst_entry->processed = 1;
|
||||||
|
|
||||||
re->dst_entry = insert_stage_data(new_path,
|
re->dst_entry = insert_stage_data(opt->repo, new_path,
|
||||||
o_tree, a_tree, b_tree,
|
o_tree, a_tree, b_tree,
|
||||||
entries);
|
entries);
|
||||||
item = string_list_insert(entries, new_path);
|
item = string_list_insert(entries, new_path);
|
||||||
@ -2500,7 +2504,8 @@ static void apply_directory_rename_modifications(struct merge_options *opt,
|
|||||||
* the various handle_rename_*() functions update the index
|
* the various handle_rename_*() functions update the index
|
||||||
* explicitly rather than relying on unpack_trees() to have done it.
|
* explicitly rather than relying on unpack_trees() to have done it.
|
||||||
*/
|
*/
|
||||||
get_tree_entry(&tree->object.oid,
|
get_tree_entry(opt->repo,
|
||||||
|
&tree->object.oid,
|
||||||
pair->two->path,
|
pair->two->path,
|
||||||
&re->dst_entry->stages[stage].oid,
|
&re->dst_entry->stages[stage].oid,
|
||||||
&re->dst_entry->stages[stage].mode);
|
&re->dst_entry->stages[stage].mode);
|
||||||
@ -2585,14 +2590,16 @@ static struct string_list *get_renames(struct merge_options *opt,
|
|||||||
re->dir_rename_original_dest = NULL;
|
re->dir_rename_original_dest = NULL;
|
||||||
item = string_list_lookup(entries, re->pair->one->path);
|
item = string_list_lookup(entries, re->pair->one->path);
|
||||||
if (!item)
|
if (!item)
|
||||||
re->src_entry = insert_stage_data(re->pair->one->path,
|
re->src_entry = insert_stage_data(opt->repo,
|
||||||
|
re->pair->one->path,
|
||||||
o_tree, a_tree, b_tree, entries);
|
o_tree, a_tree, b_tree, entries);
|
||||||
else
|
else
|
||||||
re->src_entry = item->util;
|
re->src_entry = item->util;
|
||||||
|
|
||||||
item = string_list_lookup(entries, re->pair->two->path);
|
item = string_list_lookup(entries, re->pair->two->path);
|
||||||
if (!item)
|
if (!item)
|
||||||
re->dst_entry = insert_stage_data(re->pair->two->path,
|
re->dst_entry = insert_stage_data(opt->repo,
|
||||||
|
re->pair->two->path,
|
||||||
o_tree, a_tree, b_tree, entries);
|
o_tree, a_tree, b_tree, entries);
|
||||||
else
|
else
|
||||||
re->dst_entry = item->util;
|
re->dst_entry = item->util;
|
||||||
|
4
notes.c
4
notes.c
@ -397,7 +397,7 @@ static void load_subtree(struct notes_tree *t, struct leaf_node *subtree,
|
|||||||
struct name_entry entry;
|
struct name_entry entry;
|
||||||
const unsigned hashsz = the_hash_algo->rawsz;
|
const unsigned hashsz = the_hash_algo->rawsz;
|
||||||
|
|
||||||
buf = fill_tree_descriptor(&desc, &subtree->val_oid);
|
buf = fill_tree_descriptor(the_repository, &desc, &subtree->val_oid);
|
||||||
if (!buf)
|
if (!buf)
|
||||||
die("Could not read %s for notes-index",
|
die("Could not read %s for notes-index",
|
||||||
oid_to_hex(&subtree->val_oid));
|
oid_to_hex(&subtree->val_oid));
|
||||||
@ -1015,7 +1015,7 @@ void init_notes(struct notes_tree *t, const char *notes_ref,
|
|||||||
return;
|
return;
|
||||||
if (flags & NOTES_INIT_WRITABLE && read_ref(notes_ref, &object_oid))
|
if (flags & NOTES_INIT_WRITABLE && read_ref(notes_ref, &object_oid))
|
||||||
die("Cannot use notes ref %s", notes_ref);
|
die("Cannot use notes ref %s", notes_ref);
|
||||||
if (get_tree_entry(&object_oid, "", &oid, &mode))
|
if (get_tree_entry(the_repository, &object_oid, "", &oid, &mode))
|
||||||
die("Failed to read notes tree referenced by %s (%s)",
|
die("Failed to read notes tree referenced by %s (%s)",
|
||||||
notes_ref, oid_to_hex(&object_oid));
|
notes_ref, oid_to_hex(&object_oid));
|
||||||
|
|
||||||
|
@ -3302,7 +3302,7 @@ static int do_reset(struct repository *r,
|
|||||||
return error_resolve_conflict(_(action_name(opts)));
|
return error_resolve_conflict(_(action_name(opts)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fill_tree_descriptor(&desc, &oid)) {
|
if (!fill_tree_descriptor(r, &desc, &oid)) {
|
||||||
error(_("failed to find tree of %s"), oid_to_hex(&oid));
|
error(_("failed to find tree of %s"), oid_to_hex(&oid));
|
||||||
rollback_lock_file(&lock);
|
rollback_lock_file(&lock);
|
||||||
free((void *)desc.buffer);
|
free((void *)desc.buffer);
|
||||||
@ -3841,7 +3841,7 @@ static int pick_commits(struct repository *r,
|
|||||||
unlink(rebase_path_author_script());
|
unlink(rebase_path_author_script());
|
||||||
unlink(rebase_path_stopped_sha());
|
unlink(rebase_path_stopped_sha());
|
||||||
unlink(rebase_path_amend());
|
unlink(rebase_path_amend());
|
||||||
unlink(git_path_merge_head(the_repository));
|
unlink(git_path_merge_head(r));
|
||||||
delete_ref(NULL, "REBASE_HEAD", NULL, REF_NO_DEREF);
|
delete_ref(NULL, "REBASE_HEAD", NULL, REF_NO_DEREF);
|
||||||
|
|
||||||
if (item->command == TODO_BREAK) {
|
if (item->command == TODO_BREAK) {
|
||||||
@ -4226,7 +4226,7 @@ static int commit_staged_changes(struct repository *r,
|
|||||||
opts, flags))
|
opts, flags))
|
||||||
return error(_("could not commit staged changes."));
|
return error(_("could not commit staged changes."));
|
||||||
unlink(rebase_path_amend());
|
unlink(rebase_path_amend());
|
||||||
unlink(git_path_merge_head(the_repository));
|
unlink(git_path_merge_head(r));
|
||||||
if (final_fixup) {
|
if (final_fixup) {
|
||||||
unlink(rebase_path_fixup_msg());
|
unlink(rebase_path_fixup_msg());
|
||||||
unlink(rebase_path_squash_msg());
|
unlink(rebase_path_squash_msg());
|
||||||
|
@ -1505,7 +1505,8 @@ void *read_object_file_extended(struct repository *r,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *read_object_with_reference(const struct object_id *oid,
|
void *read_object_with_reference(struct repository *r,
|
||||||
|
const struct object_id *oid,
|
||||||
const char *required_type_name,
|
const char *required_type_name,
|
||||||
unsigned long *size,
|
unsigned long *size,
|
||||||
struct object_id *actual_oid_return)
|
struct object_id *actual_oid_return)
|
||||||
@ -1521,7 +1522,7 @@ void *read_object_with_reference(const struct object_id *oid,
|
|||||||
int ref_length = -1;
|
int ref_length = -1;
|
||||||
const char *ref_type = NULL;
|
const char *ref_type = NULL;
|
||||||
|
|
||||||
buffer = read_object_file(&actual_oid, &type, &isize);
|
buffer = repo_read_object_file(r, &actual_oid, &type, &isize);
|
||||||
if (!buffer)
|
if (!buffer)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (type == required_type) {
|
if (type == required_type) {
|
||||||
|
25
sha1-name.c
25
sha1-name.c
@ -478,7 +478,7 @@ static enum get_oid_result get_short_oid(struct repository *r,
|
|||||||
* or migrated from loose to packed.
|
* or migrated from loose to packed.
|
||||||
*/
|
*/
|
||||||
if (status == MISSING_OBJECT) {
|
if (status == MISSING_OBJECT) {
|
||||||
reprepare_packed_git(the_repository);
|
reprepare_packed_git(r);
|
||||||
find_short_object_filename(&ds);
|
find_short_object_filename(&ds);
|
||||||
find_short_packed_object(&ds);
|
find_short_packed_object(&ds);
|
||||||
status = finish_object_disambiguation(&ds, oid);
|
status = finish_object_disambiguation(&ds, oid);
|
||||||
@ -1389,9 +1389,7 @@ int repo_get_oid_mb(struct repository *r,
|
|||||||
two = lookup_commit_reference_gently(r, &oid_tmp, 0);
|
two = lookup_commit_reference_gently(r, &oid_tmp, 0);
|
||||||
if (!two)
|
if (!two)
|
||||||
return -1;
|
return -1;
|
||||||
if (r != the_repository)
|
mbs = repo_get_merge_bases(r, one, two);
|
||||||
BUG("sorry get_merge_bases() can't take struct repository yet");
|
|
||||||
mbs = get_merge_bases(one, two);
|
|
||||||
if (!mbs || mbs->next)
|
if (!mbs || mbs->next)
|
||||||
st = -1;
|
st = -1;
|
||||||
else {
|
else {
|
||||||
@ -1677,7 +1675,8 @@ int repo_get_oid_blob(struct repository *r,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Must be called only when object_name:filename doesn't exist. */
|
/* Must be called only when object_name:filename doesn't exist. */
|
||||||
static void diagnose_invalid_oid_path(const char *prefix,
|
static void diagnose_invalid_oid_path(struct repository *r,
|
||||||
|
const char *prefix,
|
||||||
const char *filename,
|
const char *filename,
|
||||||
const struct object_id *tree_oid,
|
const struct object_id *tree_oid,
|
||||||
const char *object_name,
|
const char *object_name,
|
||||||
@ -1695,7 +1694,7 @@ static void diagnose_invalid_oid_path(const char *prefix,
|
|||||||
if (is_missing_file_error(errno)) {
|
if (is_missing_file_error(errno)) {
|
||||||
char *fullname = xstrfmt("%s%s", prefix, filename);
|
char *fullname = xstrfmt("%s%s", prefix, filename);
|
||||||
|
|
||||||
if (!get_tree_entry(tree_oid, fullname, &oid, &mode)) {
|
if (!get_tree_entry(r, tree_oid, fullname, &oid, &mode)) {
|
||||||
die("Path '%s' exists, but not '%s'.\n"
|
die("Path '%s' exists, but not '%s'.\n"
|
||||||
"Did you mean '%.*s:%s' aka '%.*s:./%s'?",
|
"Did you mean '%.*s:%s' aka '%.*s:./%s'?",
|
||||||
fullname,
|
fullname,
|
||||||
@ -1889,23 +1888,15 @@ static enum get_oid_result get_oid_with_context_1(struct repository *repo,
|
|||||||
new_filename = resolve_relative_path(repo, filename);
|
new_filename = resolve_relative_path(repo, filename);
|
||||||
if (new_filename)
|
if (new_filename)
|
||||||
filename = new_filename;
|
filename = new_filename;
|
||||||
/*
|
|
||||||
* NEEDSWORK: Eventually get_tree_entry*() should
|
|
||||||
* learn to take struct repository directly and we
|
|
||||||
* would not need to inject submodule odb to the
|
|
||||||
* in-core odb.
|
|
||||||
*/
|
|
||||||
if (repo != the_repository)
|
|
||||||
add_to_alternates_memory(repo->objects->odb->path);
|
|
||||||
if (flags & GET_OID_FOLLOW_SYMLINKS) {
|
if (flags & GET_OID_FOLLOW_SYMLINKS) {
|
||||||
ret = get_tree_entry_follow_symlinks(&tree_oid,
|
ret = get_tree_entry_follow_symlinks(repo, &tree_oid,
|
||||||
filename, oid, &oc->symlink_path,
|
filename, oid, &oc->symlink_path,
|
||||||
&oc->mode);
|
&oc->mode);
|
||||||
} else {
|
} else {
|
||||||
ret = get_tree_entry(&tree_oid, filename, oid,
|
ret = get_tree_entry(repo, &tree_oid, filename, oid,
|
||||||
&oc->mode);
|
&oc->mode);
|
||||||
if (ret && only_to_die) {
|
if (ret && only_to_die) {
|
||||||
diagnose_invalid_oid_path(prefix,
|
diagnose_invalid_oid_path(repo, prefix,
|
||||||
filename,
|
filename,
|
||||||
&tree_oid,
|
&tree_oid,
|
||||||
name, len);
|
name, len);
|
||||||
|
@ -248,7 +248,8 @@ static void check_shallow_file_for_update(struct repository *r)
|
|||||||
if (r->parsed_objects->is_shallow == -1)
|
if (r->parsed_objects->is_shallow == -1)
|
||||||
BUG("shallow must be initialized by now");
|
BUG("shallow must be initialized by now");
|
||||||
|
|
||||||
if (!stat_validity_check(r->parsed_objects->shallow_stat, git_path_shallow(the_repository)))
|
if (!stat_validity_check(r->parsed_objects->shallow_stat,
|
||||||
|
git_path_shallow(r)))
|
||||||
die("shallow file has changed since we read it");
|
die("shallow file has changed since we read it");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ int cmd__match_trees(int ac, const char **av)
|
|||||||
if (!two)
|
if (!two)
|
||||||
die("not a tree-ish %s", av[2]);
|
die("not a tree-ish %s", av[2]);
|
||||||
|
|
||||||
shift_tree(&one->object.oid, &two->object.oid, &shifted, -1);
|
shift_tree(the_repository, &one->object.oid, &two->object.oid, &shifted, -1);
|
||||||
printf("shifted: %s\n", oid_to_hex(&shifted));
|
printf("shifted: %s\n", oid_to_hex(&shifted));
|
||||||
|
|
||||||
exit(0);
|
exit(0);
|
||||||
|
@ -14,12 +14,14 @@ test_expect_success 'setup directory structure and submodule' '
|
|||||||
echo "(3|4)" >b/b &&
|
echo "(3|4)" >b/b &&
|
||||||
git add a b &&
|
git add a b &&
|
||||||
git commit -m "add a and b" &&
|
git commit -m "add a and b" &&
|
||||||
|
test_tick &&
|
||||||
git init submodule &&
|
git init submodule &&
|
||||||
echo "(1|2)d(3|4)" >submodule/a &&
|
echo "(1|2)d(3|4)" >submodule/a &&
|
||||||
git -C submodule add a &&
|
git -C submodule add a &&
|
||||||
git -C submodule commit -m "add a" &&
|
git -C submodule commit -m "add a" &&
|
||||||
git submodule add ./submodule &&
|
git submodule add ./submodule &&
|
||||||
git commit -m "added submodule"
|
git commit -m "added submodule" &&
|
||||||
|
test_tick
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'grep correctly finds patterns in a submodule' '
|
test_expect_success 'grep correctly finds patterns in a submodule' '
|
||||||
@ -65,11 +67,14 @@ test_expect_success 'grep and nested submodules' '
|
|||||||
echo "(1|2)d(3|4)" >submodule/sub/a &&
|
echo "(1|2)d(3|4)" >submodule/sub/a &&
|
||||||
git -C submodule/sub add a &&
|
git -C submodule/sub add a &&
|
||||||
git -C submodule/sub commit -m "add a" &&
|
git -C submodule/sub commit -m "add a" &&
|
||||||
|
test_tick &&
|
||||||
git -C submodule submodule add ./sub &&
|
git -C submodule submodule add ./sub &&
|
||||||
git -C submodule add sub &&
|
git -C submodule add sub &&
|
||||||
git -C submodule commit -m "added sub" &&
|
git -C submodule commit -m "added sub" &&
|
||||||
|
test_tick &&
|
||||||
git add submodule &&
|
git add submodule &&
|
||||||
git commit -m "updated submodule" &&
|
git commit -m "updated submodule" &&
|
||||||
|
test_tick &&
|
||||||
|
|
||||||
cat >expect <<-\EOF &&
|
cat >expect <<-\EOF &&
|
||||||
a:(1|2)d(3|4)
|
a:(1|2)d(3|4)
|
||||||
@ -179,15 +184,18 @@ test_expect_success !MINGW 'grep recurse submodule colon in name' '
|
|||||||
echo "(1|2)d(3|4)" >"parent/fi:le" &&
|
echo "(1|2)d(3|4)" >"parent/fi:le" &&
|
||||||
git -C parent add "fi:le" &&
|
git -C parent add "fi:le" &&
|
||||||
git -C parent commit -m "add fi:le" &&
|
git -C parent commit -m "add fi:le" &&
|
||||||
|
test_tick &&
|
||||||
|
|
||||||
git init "su:b" &&
|
git init "su:b" &&
|
||||||
test_when_finished "rm -rf su:b" &&
|
test_when_finished "rm -rf su:b" &&
|
||||||
echo "(1|2)d(3|4)" >"su:b/fi:le" &&
|
echo "(1|2)d(3|4)" >"su:b/fi:le" &&
|
||||||
git -C "su:b" add "fi:le" &&
|
git -C "su:b" add "fi:le" &&
|
||||||
git -C "su:b" commit -m "add fi:le" &&
|
git -C "su:b" commit -m "add fi:le" &&
|
||||||
|
test_tick &&
|
||||||
|
|
||||||
git -C parent submodule add "../su:b" "su:b" &&
|
git -C parent submodule add "../su:b" "su:b" &&
|
||||||
git -C parent commit -m "add submodule" &&
|
git -C parent commit -m "add submodule" &&
|
||||||
|
test_tick &&
|
||||||
|
|
||||||
cat >expect <<-\EOF &&
|
cat >expect <<-\EOF &&
|
||||||
fi:le:(1|2)d(3|4)
|
fi:le:(1|2)d(3|4)
|
||||||
@ -210,15 +218,18 @@ test_expect_success 'grep history with moved submoules' '
|
|||||||
echo "(1|2)d(3|4)" >parent/file &&
|
echo "(1|2)d(3|4)" >parent/file &&
|
||||||
git -C parent add file &&
|
git -C parent add file &&
|
||||||
git -C parent commit -m "add file" &&
|
git -C parent commit -m "add file" &&
|
||||||
|
test_tick &&
|
||||||
|
|
||||||
git init sub &&
|
git init sub &&
|
||||||
test_when_finished "rm -rf sub" &&
|
test_when_finished "rm -rf sub" &&
|
||||||
echo "(1|2)d(3|4)" >sub/file &&
|
echo "(1|2)d(3|4)" >sub/file &&
|
||||||
git -C sub add file &&
|
git -C sub add file &&
|
||||||
git -C sub commit -m "add file" &&
|
git -C sub commit -m "add file" &&
|
||||||
|
test_tick &&
|
||||||
|
|
||||||
git -C parent submodule add ../sub dir/sub &&
|
git -C parent submodule add ../sub dir/sub &&
|
||||||
git -C parent commit -m "add submodule" &&
|
git -C parent commit -m "add submodule" &&
|
||||||
|
test_tick &&
|
||||||
|
|
||||||
cat >expect <<-\EOF &&
|
cat >expect <<-\EOF &&
|
||||||
dir/sub/file:(1|2)d(3|4)
|
dir/sub/file:(1|2)d(3|4)
|
||||||
@ -229,6 +240,7 @@ test_expect_success 'grep history with moved submoules' '
|
|||||||
|
|
||||||
git -C parent mv dir/sub sub-moved &&
|
git -C parent mv dir/sub sub-moved &&
|
||||||
git -C parent commit -m "moved submodule" &&
|
git -C parent commit -m "moved submodule" &&
|
||||||
|
test_tick &&
|
||||||
|
|
||||||
cat >expect <<-\EOF &&
|
cat >expect <<-\EOF &&
|
||||||
file:(1|2)d(3|4)
|
file:(1|2)d(3|4)
|
||||||
@ -251,6 +263,7 @@ test_expect_success 'grep using relative path' '
|
|||||||
echo "(1|2)d(3|4)" >sub/file &&
|
echo "(1|2)d(3|4)" >sub/file &&
|
||||||
git -C sub add file &&
|
git -C sub add file &&
|
||||||
git -C sub commit -m "add file" &&
|
git -C sub commit -m "add file" &&
|
||||||
|
test_tick &&
|
||||||
|
|
||||||
git init parent &&
|
git init parent &&
|
||||||
echo "(1|2)d(3|4)" >parent/file &&
|
echo "(1|2)d(3|4)" >parent/file &&
|
||||||
@ -260,6 +273,7 @@ test_expect_success 'grep using relative path' '
|
|||||||
git -C parent add src/file2 &&
|
git -C parent add src/file2 &&
|
||||||
git -C parent submodule add ../sub &&
|
git -C parent submodule add ../sub &&
|
||||||
git -C parent commit -m "add files and submodule" &&
|
git -C parent commit -m "add files and submodule" &&
|
||||||
|
test_tick &&
|
||||||
|
|
||||||
# From top works
|
# From top works
|
||||||
cat >expect <<-\EOF &&
|
cat >expect <<-\EOF &&
|
||||||
@ -293,6 +307,7 @@ test_expect_success 'grep from a subdir' '
|
|||||||
echo "(1|2)d(3|4)" >sub/file &&
|
echo "(1|2)d(3|4)" >sub/file &&
|
||||||
git -C sub add file &&
|
git -C sub add file &&
|
||||||
git -C sub commit -m "add file" &&
|
git -C sub commit -m "add file" &&
|
||||||
|
test_tick &&
|
||||||
|
|
||||||
git init parent &&
|
git init parent &&
|
||||||
mkdir parent/src &&
|
mkdir parent/src &&
|
||||||
@ -301,6 +316,7 @@ test_expect_success 'grep from a subdir' '
|
|||||||
git -C parent submodule add ../sub src/sub &&
|
git -C parent submodule add ../sub src/sub &&
|
||||||
git -C parent submodule add ../sub sub &&
|
git -C parent submodule add ../sub sub &&
|
||||||
git -C parent commit -m "add files and submodules" &&
|
git -C parent commit -m "add files and submodules" &&
|
||||||
|
test_tick &&
|
||||||
|
|
||||||
# Verify grep from root works
|
# Verify grep from root works
|
||||||
cat >expect <<-\EOF &&
|
cat >expect <<-\EOF &&
|
||||||
|
@ -422,8 +422,8 @@ static struct combine_diff_path *ll_diff_tree_paths(
|
|||||||
* diff_tree_oid(parent, commit) )
|
* diff_tree_oid(parent, commit) )
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < nparent; ++i)
|
for (i = 0; i < nparent; ++i)
|
||||||
tptree[i] = fill_tree_descriptor(&tp[i], parents_oid[i]);
|
tptree[i] = fill_tree_descriptor(opt->repo, &tp[i], parents_oid[i]);
|
||||||
ttree = fill_tree_descriptor(&t, oid);
|
ttree = fill_tree_descriptor(opt->repo, &t, oid);
|
||||||
|
|
||||||
/* Enable recursion indefinitely */
|
/* Enable recursion indefinitely */
|
||||||
opt->pathspec.recursive = opt->flags.recursive;
|
opt->pathspec.recursive = opt->flags.recursive;
|
||||||
|
35
tree-walk.c
35
tree-walk.c
@ -81,13 +81,15 @@ int init_tree_desc_gently(struct tree_desc *desc, const void *buffer, unsigned l
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *fill_tree_descriptor(struct tree_desc *desc, const struct object_id *oid)
|
void *fill_tree_descriptor(struct repository *r,
|
||||||
|
struct tree_desc *desc,
|
||||||
|
const struct object_id *oid)
|
||||||
{
|
{
|
||||||
unsigned long size = 0;
|
unsigned long size = 0;
|
||||||
void *buf = NULL;
|
void *buf = NULL;
|
||||||
|
|
||||||
if (oid) {
|
if (oid) {
|
||||||
buf = read_object_with_reference(oid, tree_type, &size, NULL);
|
buf = read_object_with_reference(r, oid, tree_type, &size, NULL);
|
||||||
if (!buf)
|
if (!buf)
|
||||||
die("unable to read tree %s", oid_to_hex(oid));
|
die("unable to read tree %s", oid_to_hex(oid));
|
||||||
}
|
}
|
||||||
@ -500,7 +502,9 @@ struct dir_state {
|
|||||||
struct object_id oid;
|
struct object_id oid;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int find_tree_entry(struct tree_desc *t, const char *name, struct object_id *result, unsigned short *mode)
|
static int find_tree_entry(struct repository *r, struct tree_desc *t,
|
||||||
|
const char *name, struct object_id *result,
|
||||||
|
unsigned short *mode)
|
||||||
{
|
{
|
||||||
int namelen = strlen(name);
|
int namelen = strlen(name);
|
||||||
while (t->size) {
|
while (t->size) {
|
||||||
@ -530,19 +534,23 @@ static int find_tree_entry(struct tree_desc *t, const char *name, struct object_
|
|||||||
oidcpy(result, &oid);
|
oidcpy(result, &oid);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return get_tree_entry(&oid, name + entrylen, result, mode);
|
return get_tree_entry(r, &oid, name + entrylen, result, mode);
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_tree_entry(const struct object_id *tree_oid, const char *name, struct object_id *oid, unsigned short *mode)
|
int get_tree_entry(struct repository *r,
|
||||||
|
const struct object_id *tree_oid,
|
||||||
|
const char *name,
|
||||||
|
struct object_id *oid,
|
||||||
|
unsigned short *mode)
|
||||||
{
|
{
|
||||||
int retval;
|
int retval;
|
||||||
void *tree;
|
void *tree;
|
||||||
unsigned long size;
|
unsigned long size;
|
||||||
struct object_id root;
|
struct object_id root;
|
||||||
|
|
||||||
tree = read_object_with_reference(tree_oid, tree_type, &size, &root);
|
tree = read_object_with_reference(r, tree_oid, tree_type, &size, &root);
|
||||||
if (!tree)
|
if (!tree)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@ -557,7 +565,7 @@ int get_tree_entry(const struct object_id *tree_oid, const char *name, struct ob
|
|||||||
} else {
|
} else {
|
||||||
struct tree_desc t;
|
struct tree_desc t;
|
||||||
init_tree_desc(&t, tree, size);
|
init_tree_desc(&t, tree, size);
|
||||||
retval = find_tree_entry(&t, name, oid, mode);
|
retval = find_tree_entry(r, &t, name, oid, mode);
|
||||||
}
|
}
|
||||||
free(tree);
|
free(tree);
|
||||||
return retval;
|
return retval;
|
||||||
@ -585,7 +593,10 @@ int get_tree_entry(const struct object_id *tree_oid, const char *name, struct ob
|
|||||||
* See the code for enum get_oid_result for a description of
|
* See the code for enum get_oid_result for a description of
|
||||||
* the return values.
|
* the return values.
|
||||||
*/
|
*/
|
||||||
enum get_oid_result get_tree_entry_follow_symlinks(struct object_id *tree_oid, const char *name, struct object_id *result, struct strbuf *result_path, unsigned short *mode)
|
enum get_oid_result get_tree_entry_follow_symlinks(struct repository *r,
|
||||||
|
struct object_id *tree_oid, const char *name,
|
||||||
|
struct object_id *result, struct strbuf *result_path,
|
||||||
|
unsigned short *mode)
|
||||||
{
|
{
|
||||||
int retval = MISSING_OBJECT;
|
int retval = MISSING_OBJECT;
|
||||||
struct dir_state *parents = NULL;
|
struct dir_state *parents = NULL;
|
||||||
@ -609,7 +620,8 @@ enum get_oid_result get_tree_entry_follow_symlinks(struct object_id *tree_oid, c
|
|||||||
void *tree;
|
void *tree;
|
||||||
struct object_id root;
|
struct object_id root;
|
||||||
unsigned long size;
|
unsigned long size;
|
||||||
tree = read_object_with_reference(¤t_tree_oid,
|
tree = read_object_with_reference(r,
|
||||||
|
¤t_tree_oid,
|
||||||
tree_type, &size,
|
tree_type, &size,
|
||||||
&root);
|
&root);
|
||||||
if (!tree)
|
if (!tree)
|
||||||
@ -678,7 +690,7 @@ enum get_oid_result get_tree_entry_follow_symlinks(struct object_id *tree_oid, c
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Look up the first (or only) path component in the tree. */
|
/* Look up the first (or only) path component in the tree. */
|
||||||
find_result = find_tree_entry(&t, namebuf.buf,
|
find_result = find_tree_entry(r, &t, namebuf.buf,
|
||||||
¤t_tree_oid, mode);
|
¤t_tree_oid, mode);
|
||||||
if (find_result) {
|
if (find_result) {
|
||||||
goto done;
|
goto done;
|
||||||
@ -722,7 +734,8 @@ enum get_oid_result get_tree_entry_follow_symlinks(struct object_id *tree_oid, c
|
|||||||
*/
|
*/
|
||||||
retval = DANGLING_SYMLINK;
|
retval = DANGLING_SYMLINK;
|
||||||
|
|
||||||
contents = read_object_file(¤t_tree_oid, &type,
|
contents = repo_read_object_file(r,
|
||||||
|
¤t_tree_oid, &type,
|
||||||
&link_len);
|
&link_len);
|
||||||
|
|
||||||
if (!contents)
|
if (!contents)
|
||||||
|
@ -45,13 +45,15 @@ int init_tree_desc_gently(struct tree_desc *desc, const void *buf, unsigned long
|
|||||||
int tree_entry(struct tree_desc *, struct name_entry *);
|
int tree_entry(struct tree_desc *, struct name_entry *);
|
||||||
int tree_entry_gently(struct tree_desc *, struct name_entry *);
|
int tree_entry_gently(struct tree_desc *, struct name_entry *);
|
||||||
|
|
||||||
void *fill_tree_descriptor(struct tree_desc *desc, const struct object_id *oid);
|
void *fill_tree_descriptor(struct repository *r,
|
||||||
|
struct tree_desc *desc,
|
||||||
|
const struct object_id *oid);
|
||||||
|
|
||||||
struct traverse_info;
|
struct traverse_info;
|
||||||
typedef int (*traverse_callback_t)(int n, unsigned long mask, unsigned long dirmask, struct name_entry *entry, struct traverse_info *);
|
typedef int (*traverse_callback_t)(int n, unsigned long mask, unsigned long dirmask, struct name_entry *entry, struct traverse_info *);
|
||||||
int traverse_trees(struct index_state *istate, int n, struct tree_desc *t, struct traverse_info *info);
|
int traverse_trees(struct index_state *istate, int n, struct tree_desc *t, struct traverse_info *info);
|
||||||
|
|
||||||
enum get_oid_result get_tree_entry_follow_symlinks(struct object_id *tree_oid, const char *name, struct object_id *result, struct strbuf *result_path, unsigned short *mode);
|
enum get_oid_result get_tree_entry_follow_symlinks(struct repository *r, struct object_id *tree_oid, const char *name, struct object_id *result, struct strbuf *result_path, unsigned short *mode);
|
||||||
|
|
||||||
struct traverse_info {
|
struct traverse_info {
|
||||||
const char *traverse_path;
|
const char *traverse_path;
|
||||||
@ -66,7 +68,7 @@ struct traverse_info {
|
|||||||
int show_all_errors;
|
int show_all_errors;
|
||||||
};
|
};
|
||||||
|
|
||||||
int get_tree_entry(const struct object_id *, const char *, struct object_id *, unsigned short *);
|
int get_tree_entry(struct repository *, const struct object_id *, const char *, struct object_id *, unsigned short *);
|
||||||
char *make_traverse_path(char *path, const struct traverse_info *info, const struct name_entry *n);
|
char *make_traverse_path(char *path, const struct traverse_info *info, const struct name_entry *n);
|
||||||
void setup_traverse_info(struct traverse_info *info, const char *base);
|
void setup_traverse_info(struct traverse_info *info, const char *base);
|
||||||
|
|
||||||
|
@ -840,7 +840,7 @@ static int traverse_trees_recursive(int n, unsigned long dirmask,
|
|||||||
const struct object_id *oid = NULL;
|
const struct object_id *oid = NULL;
|
||||||
if (dirmask & 1)
|
if (dirmask & 1)
|
||||||
oid = &names[i].oid;
|
oid = &names[i].oid;
|
||||||
buf[nr_buf++] = fill_tree_descriptor(t + i, oid);
|
buf[nr_buf++] = fill_tree_descriptor(the_repository, t + i, oid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user