mirror of
https://github.com/git/git.git
synced 2025-12-12 20:36:24 +01:00
Merge branch 'nd/the-index'
More codepaths become aware of working with in-core repository instance other than the default "the_repository". * nd/the-index: (22 commits) rebase-interactive.c: remove the_repository references rerere.c: remove the_repository references pack-*.c: remove the_repository references pack-check.c: remove the_repository references notes-cache.c: remove the_repository references line-log.c: remove the_repository reference diff-lib.c: remove the_repository references delta-islands.c: remove the_repository references cache-tree.c: remove the_repository references bundle.c: remove the_repository references branch.c: remove the_repository reference bisect.c: remove the_repository reference blame.c: remove implicit dependency the_repository sequencer.c: remove implicit dependency on the_repository sequencer.c: remove implicit dependency on the_index transport.c: remove implicit dependency on the_index notes-merge.c: remove implicit dependency the_repository notes-merge.c: remove implicit dependency on the_index list-objects.c: reduce the_repository references list-objects-filter.c: remove implicit dependency on the_index ...
This commit is contained in:
94
wt-status.c
94
wt-status.c
@@ -119,9 +119,10 @@ static void status_printf_more(struct wt_status *s, const char *color,
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void wt_status_prepare(struct wt_status *s)
|
||||
void wt_status_prepare(struct repository *r, struct wt_status *s)
|
||||
{
|
||||
memset(s, 0, sizeof(*s));
|
||||
s->repo = r;
|
||||
memcpy(s->color_palette, default_wt_status_colors,
|
||||
sizeof(default_wt_status_colors));
|
||||
s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
|
||||
@@ -494,19 +495,19 @@ static void wt_status_collect_changed_cb(struct diff_queue_struct *q,
|
||||
}
|
||||
}
|
||||
|
||||
static int unmerged_mask(const char *path)
|
||||
static int unmerged_mask(struct index_state *istate, const char *path)
|
||||
{
|
||||
int pos, mask;
|
||||
const struct cache_entry *ce;
|
||||
|
||||
pos = cache_name_pos(path, strlen(path));
|
||||
pos = index_name_pos(istate, path, strlen(path));
|
||||
if (0 <= pos)
|
||||
return 0;
|
||||
|
||||
mask = 0;
|
||||
pos = -pos-1;
|
||||
while (pos < active_nr) {
|
||||
ce = active_cache[pos++];
|
||||
while (pos < istate->cache_nr) {
|
||||
ce = istate->cache[pos++];
|
||||
if (strcmp(ce->name, path) || !ce_stage(ce))
|
||||
break;
|
||||
mask |= (1 << (ce_stage(ce) - 1));
|
||||
@@ -566,7 +567,8 @@ static void wt_status_collect_updated_cb(struct diff_queue_struct *q,
|
||||
s->committable = 1;
|
||||
break;
|
||||
case DIFF_STATUS_UNMERGED:
|
||||
d->stagemask = unmerged_mask(p->two->path);
|
||||
d->stagemask = unmerged_mask(s->repo->index,
|
||||
p->two->path);
|
||||
/*
|
||||
* Don't bother setting {mode,oid}_{head,index} since the print
|
||||
* code will output the stage values directly and not use the
|
||||
@@ -585,7 +587,7 @@ static void wt_status_collect_changes_worktree(struct wt_status *s)
|
||||
{
|
||||
struct rev_info rev;
|
||||
|
||||
repo_init_revisions(the_repository, &rev, NULL);
|
||||
repo_init_revisions(s->repo, &rev, NULL);
|
||||
setup_revisions(0, NULL, &rev, NULL);
|
||||
rev.diffopt.output_format |= DIFF_FORMAT_CALLBACK;
|
||||
rev.diffopt.flags.dirty_submodules = 1;
|
||||
@@ -610,7 +612,7 @@ static void wt_status_collect_changes_index(struct wt_status *s)
|
||||
struct rev_info rev;
|
||||
struct setup_revision_opt opt;
|
||||
|
||||
repo_init_revisions(the_repository, &rev, NULL);
|
||||
repo_init_revisions(s->repo, &rev, NULL);
|
||||
memset(&opt, 0, sizeof(opt));
|
||||
opt.def = s->is_initial ? empty_tree_oid_hex() : s->reference;
|
||||
setup_revisions(0, NULL, &rev, &opt);
|
||||
@@ -643,14 +645,15 @@ static void wt_status_collect_changes_index(struct wt_status *s)
|
||||
|
||||
static void wt_status_collect_changes_initial(struct wt_status *s)
|
||||
{
|
||||
struct index_state *istate = s->repo->index;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < active_nr; i++) {
|
||||
for (i = 0; i < istate->cache_nr; i++) {
|
||||
struct string_list_item *it;
|
||||
struct wt_status_change_data *d;
|
||||
const struct cache_entry *ce = active_cache[i];
|
||||
const struct cache_entry *ce = istate->cache[i];
|
||||
|
||||
if (!ce_path_match(&the_index, ce, &s->pathspec, NULL))
|
||||
if (!ce_path_match(istate, ce, &s->pathspec, NULL))
|
||||
continue;
|
||||
if (ce_intent_to_add(ce))
|
||||
continue;
|
||||
@@ -684,6 +687,7 @@ static void wt_status_collect_untracked(struct wt_status *s)
|
||||
int i;
|
||||
struct dir_struct dir;
|
||||
uint64_t t_begin = getnanotime();
|
||||
struct index_state *istate = s->repo->index;
|
||||
|
||||
if (!s->show_untracked_files)
|
||||
return;
|
||||
@@ -698,25 +702,25 @@ static void wt_status_collect_untracked(struct wt_status *s)
|
||||
if (s->show_ignored_mode == SHOW_MATCHING_IGNORED)
|
||||
dir.flags |= DIR_SHOW_IGNORED_TOO_MODE_MATCHING;
|
||||
} else {
|
||||
dir.untracked = the_index.untracked;
|
||||
dir.untracked = istate->untracked;
|
||||
}
|
||||
|
||||
setup_standard_excludes(&dir);
|
||||
|
||||
fill_directory(&dir, &the_index, &s->pathspec);
|
||||
fill_directory(&dir, istate, &s->pathspec);
|
||||
|
||||
for (i = 0; i < dir.nr; i++) {
|
||||
struct dir_entry *ent = dir.entries[i];
|
||||
if (cache_name_is_other(ent->name, ent->len) &&
|
||||
dir_path_match(&the_index, ent, &s->pathspec, 0, NULL))
|
||||
if (index_name_is_other(istate, ent->name, ent->len) &&
|
||||
dir_path_match(istate, ent, &s->pathspec, 0, NULL))
|
||||
string_list_insert(&s->untracked, ent->name);
|
||||
free(ent);
|
||||
}
|
||||
|
||||
for (i = 0; i < dir.ignored_nr; i++) {
|
||||
struct dir_entry *ent = dir.ignored[i];
|
||||
if (cache_name_is_other(ent->name, ent->len) &&
|
||||
dir_path_match(&the_index, ent, &s->pathspec, 0, NULL))
|
||||
if (index_name_is_other(istate, ent->name, ent->len) &&
|
||||
dir_path_match(istate, ent, &s->pathspec, 0, NULL))
|
||||
string_list_insert(&s->ignored, ent->name);
|
||||
free(ent);
|
||||
}
|
||||
@@ -751,7 +755,7 @@ void wt_status_collect(struct wt_status *s)
|
||||
wt_status_collect_changes_index(s);
|
||||
wt_status_collect_untracked(s);
|
||||
|
||||
wt_status_get_state(&s->state, s->branch && !strcmp(s->branch, "HEAD"));
|
||||
wt_status_get_state(s->repo, &s->state, s->branch && !strcmp(s->branch, "HEAD"));
|
||||
if (s->state.merge_in_progress && !has_unmerged(s))
|
||||
s->committable = 1;
|
||||
}
|
||||
@@ -1009,7 +1013,7 @@ static void wt_longstatus_print_verbose(struct wt_status *s)
|
||||
int dirty_submodules;
|
||||
const char *c = color(WT_STATUS_HEADER, s);
|
||||
|
||||
repo_init_revisions(the_repository, &rev, NULL);
|
||||
repo_init_revisions(s->repo, &rev, NULL);
|
||||
rev.diffopt.flags.allow_textconv = 1;
|
||||
rev.diffopt.ita_invisible_in_index = 1;
|
||||
|
||||
@@ -1326,7 +1330,7 @@ static void show_rebase_in_progress(struct wt_status *s,
|
||||
_(" (use \"git rebase --abort\" to check out the original branch)"));
|
||||
}
|
||||
} else if (s->state.rebase_in_progress ||
|
||||
!stat(git_path_merge_msg(the_repository), &st)) {
|
||||
!stat(git_path_merge_msg(s->repo), &st)) {
|
||||
print_rebase_state(s, color);
|
||||
if (s->hints)
|
||||
status_printf_ln(s, color,
|
||||
@@ -1478,7 +1482,8 @@ static int grab_1st_switch(struct object_id *ooid, struct object_id *noid,
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void wt_status_get_detached_from(struct wt_status_state *state)
|
||||
static void wt_status_get_detached_from(struct repository *r,
|
||||
struct wt_status_state *state)
|
||||
{
|
||||
struct grab_1st_switch_cbdata cb;
|
||||
struct commit *commit;
|
||||
@@ -1495,7 +1500,7 @@ static void wt_status_get_detached_from(struct wt_status_state *state)
|
||||
/* sha1 is a commit? match without further lookup */
|
||||
(oideq(&cb.noid, &oid) ||
|
||||
/* perhaps sha1 is a tag, try to dereference to a commit */
|
||||
((commit = lookup_commit_reference_gently(the_repository, &oid, 1)) != NULL &&
|
||||
((commit = lookup_commit_reference_gently(r, &oid, 1)) != NULL &&
|
||||
oideq(&cb.noid, &commit->object.oid)))) {
|
||||
const char *from = ref;
|
||||
if (!skip_prefix(from, "refs/tags/", &from))
|
||||
@@ -1552,31 +1557,32 @@ int wt_status_check_bisect(const struct worktree *wt,
|
||||
return 0;
|
||||
}
|
||||
|
||||
void wt_status_get_state(struct wt_status_state *state,
|
||||
void wt_status_get_state(struct repository *r,
|
||||
struct wt_status_state *state,
|
||||
int get_detached_from)
|
||||
{
|
||||
struct stat st;
|
||||
struct object_id oid;
|
||||
|
||||
if (!stat(git_path_merge_head(the_repository), &st)) {
|
||||
if (!stat(git_path_merge_head(r), &st)) {
|
||||
wt_status_check_rebase(NULL, state);
|
||||
state->merge_in_progress = 1;
|
||||
} else if (wt_status_check_rebase(NULL, state)) {
|
||||
; /* all set */
|
||||
} else if (!stat(git_path_cherry_pick_head(the_repository), &st) &&
|
||||
} else if (!stat(git_path_cherry_pick_head(r), &st) &&
|
||||
!get_oid("CHERRY_PICK_HEAD", &oid)) {
|
||||
state->cherry_pick_in_progress = 1;
|
||||
oidcpy(&state->cherry_pick_head_oid, &oid);
|
||||
}
|
||||
wt_status_check_bisect(NULL, state);
|
||||
if (!stat(git_path_revert_head(the_repository), &st) &&
|
||||
if (!stat(git_path_revert_head(r), &st) &&
|
||||
!get_oid("REVERT_HEAD", &oid)) {
|
||||
state->revert_in_progress = 1;
|
||||
oidcpy(&state->revert_head_oid, &oid);
|
||||
}
|
||||
|
||||
if (get_detached_from)
|
||||
wt_status_get_detached_from(state);
|
||||
wt_status_get_detached_from(r, state);
|
||||
}
|
||||
|
||||
static void wt_longstatus_print_state(struct wt_status *s)
|
||||
@@ -2140,6 +2146,7 @@ static void wt_porcelain_v2_print_unmerged_entry(
|
||||
struct wt_status *s)
|
||||
{
|
||||
struct wt_status_change_data *d = it->util;
|
||||
struct index_state *istate = s->repo->index;
|
||||
const struct cache_entry *ce;
|
||||
struct strbuf buf_index = STRBUF_INIT;
|
||||
const char *path_index = NULL;
|
||||
@@ -2178,11 +2185,11 @@ static void wt_porcelain_v2_print_unmerged_entry(
|
||||
*/
|
||||
memset(stages, 0, sizeof(stages));
|
||||
sum = 0;
|
||||
pos = cache_name_pos(it->string, strlen(it->string));
|
||||
pos = index_name_pos(istate, it->string, strlen(it->string));
|
||||
assert(pos < 0);
|
||||
pos = -pos-1;
|
||||
while (pos < active_nr) {
|
||||
ce = active_cache[pos++];
|
||||
while (pos < istate->cache_nr) {
|
||||
ce = istate->cache[pos++];
|
||||
stage = ce_stage(ce);
|
||||
if (strcmp(ce->name, it->string) || !stage)
|
||||
break;
|
||||
@@ -2307,12 +2314,12 @@ void wt_status_print(struct wt_status *s)
|
||||
/**
|
||||
* Returns 1 if there are unstaged changes, 0 otherwise.
|
||||
*/
|
||||
int has_unstaged_changes(int ignore_submodules)
|
||||
int has_unstaged_changes(struct repository *r, int ignore_submodules)
|
||||
{
|
||||
struct rev_info rev_info;
|
||||
int result;
|
||||
|
||||
repo_init_revisions(the_repository, &rev_info, NULL);
|
||||
repo_init_revisions(r, &rev_info, NULL);
|
||||
if (ignore_submodules) {
|
||||
rev_info.diffopt.flags.ignore_submodules = 1;
|
||||
rev_info.diffopt.flags.override_submodule_config = 1;
|
||||
@@ -2326,15 +2333,16 @@ int has_unstaged_changes(int ignore_submodules)
|
||||
/**
|
||||
* Returns 1 if there are uncommitted changes, 0 otherwise.
|
||||
*/
|
||||
int has_uncommitted_changes(int ignore_submodules)
|
||||
int has_uncommitted_changes(struct repository *r,
|
||||
int ignore_submodules)
|
||||
{
|
||||
struct rev_info rev_info;
|
||||
int result;
|
||||
|
||||
if (is_cache_unborn())
|
||||
if (is_index_unborn(r->index))
|
||||
return 0;
|
||||
|
||||
repo_init_revisions(the_repository, &rev_info, NULL);
|
||||
repo_init_revisions(r, &rev_info, NULL);
|
||||
if (ignore_submodules)
|
||||
rev_info.diffopt.flags.ignore_submodules = 1;
|
||||
rev_info.diffopt.flags.quick = 1;
|
||||
@@ -2345,7 +2353,7 @@ int has_uncommitted_changes(int ignore_submodules)
|
||||
* We have no head (or it's corrupt); use the empty tree,
|
||||
* which will complain if the index is non-empty.
|
||||
*/
|
||||
struct tree *tree = lookup_tree(the_repository, the_hash_algo->empty_tree);
|
||||
struct tree *tree = lookup_tree(r, the_hash_algo->empty_tree);
|
||||
add_pending_object(&rev_info, &tree->object, "");
|
||||
}
|
||||
|
||||
@@ -2358,24 +2366,28 @@ int has_uncommitted_changes(int ignore_submodules)
|
||||
* If the work tree has unstaged or uncommitted changes, dies with the
|
||||
* appropriate message.
|
||||
*/
|
||||
int require_clean_work_tree(const char *action, const char *hint, int ignore_submodules, int gently)
|
||||
int require_clean_work_tree(struct repository *r,
|
||||
const char *action,
|
||||
const char *hint,
|
||||
int ignore_submodules,
|
||||
int gently)
|
||||
{
|
||||
struct lock_file lock_file = LOCK_INIT;
|
||||
int err = 0, fd;
|
||||
|
||||
fd = hold_locked_index(&lock_file, 0);
|
||||
refresh_cache(REFRESH_QUIET);
|
||||
refresh_index(r->index, REFRESH_QUIET, NULL, NULL, NULL);
|
||||
if (0 <= fd)
|
||||
update_index_if_able(&the_index, &lock_file);
|
||||
update_index_if_able(r->index, &lock_file);
|
||||
rollback_lock_file(&lock_file);
|
||||
|
||||
if (has_unstaged_changes(ignore_submodules)) {
|
||||
if (has_unstaged_changes(r, ignore_submodules)) {
|
||||
/* TRANSLATORS: the action is e.g. "pull with rebase" */
|
||||
error(_("cannot %s: You have unstaged changes."), _(action));
|
||||
err = 1;
|
||||
}
|
||||
|
||||
if (has_uncommitted_changes(ignore_submodules)) {
|
||||
if (has_uncommitted_changes(r, ignore_submodules)) {
|
||||
if (err)
|
||||
error(_("additionally, your index contains uncommitted changes."));
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user