Skip to content

Commit

Permalink
add: pass in repo variable instead of global the_repository
Browse files Browse the repository at this point in the history
With the repository variable available in the builtin function as an
argument, pass this down into helper functions instead of using the
global the_repository.

Signed-off-by: John Cai <[email protected]>
  • Loading branch information
john-cai committed Sep 13, 2024
1 parent 7593dd2 commit 0841729
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 55 deletions.
116 changes: 63 additions & 53 deletions builtin/add.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
*
* Copyright (C) 2006 Linus Torvalds
*/
#define USE_THE_REPOSITORY_VARIABLE
#include "builtin.h"
#include "advice.h"
#include "config.h"
Expand Down Expand Up @@ -35,24 +34,27 @@ static int pathspec_file_nul;
static int include_sparse;
static const char *pathspec_from_file;

static int chmod_pathspec(struct pathspec *pathspec, char flip, int show_only)
static int chmod_pathspec(struct repository *repo,
struct pathspec *pathspec,
char flip,
int show_only)
{
int i, ret = 0;

for (i = 0; i < the_repository->index->cache_nr; i++) {
struct cache_entry *ce = the_repository->index->cache[i];
for (i = 0; i < repo->index->cache_nr; i++) {
struct cache_entry *ce = repo->index->cache[i];
int err;

if (!include_sparse &&
(ce_skip_worktree(ce) ||
!path_in_sparse_checkout(ce->name, the_repository->index)))
!path_in_sparse_checkout(ce->name, repo->index)))
continue;

if (pathspec && !ce_path_match(the_repository->index, ce, pathspec, NULL))
if (pathspec && !ce_path_match(repo->index, ce, pathspec, NULL))
continue;

if (!show_only)
err = chmod_index_entry(the_repository->index, ce, flip);
err = chmod_index_entry(repo->index, ce, flip);
else
err = S_ISREG(ce->ce_mode) ? 0 : -1;

Expand All @@ -63,31 +65,36 @@ static int chmod_pathspec(struct pathspec *pathspec, char flip, int show_only)
return ret;
}

static int renormalize_tracked_files(const struct pathspec *pathspec, int flags)
static int renormalize_tracked_files(struct repository *repo,
const struct pathspec *pathspec,
int flags)
{
int i, retval = 0;

for (i = 0; i < the_repository->index->cache_nr; i++) {
struct cache_entry *ce = the_repository->index->cache[i];
for (i = 0; i < repo->index->cache_nr; i++) {
struct cache_entry *ce = repo->index->cache[i];

if (!include_sparse &&
(ce_skip_worktree(ce) ||
!path_in_sparse_checkout(ce->name, the_repository->index)))
!path_in_sparse_checkout(ce->name, repo->index)))
continue;
if (ce_stage(ce))
continue; /* do not touch unmerged paths */
if (!S_ISREG(ce->ce_mode) && !S_ISLNK(ce->ce_mode))
continue; /* do not touch non blobs */
if (pathspec && !ce_path_match(the_repository->index, ce, pathspec, NULL))
if (pathspec && !ce_path_match(repo->index, ce, pathspec, NULL))
continue;
retval |= add_file_to_index(the_repository->index, ce->name,
retval |= add_file_to_index(repo->index, ce->name,
flags | ADD_CACHE_RENORMALIZE);
}

return retval;
}

static char *prune_directory(struct dir_struct *dir, struct pathspec *pathspec, int prefix)
static char *prune_directory(struct repository *repo,
struct dir_struct *dir,
struct pathspec *pathspec,
int prefix)
{
char *seen;
int i;
Expand All @@ -99,16 +106,16 @@ static char *prune_directory(struct dir_struct *dir, struct pathspec *pathspec,
i = dir->nr;
while (--i >= 0) {
struct dir_entry *entry = *src++;
if (dir_path_match(the_repository->index, entry, pathspec, prefix, seen))
if (dir_path_match(repo->index, entry, pathspec, prefix, seen))
*dst++ = entry;
}
dir->nr = dst - dir->entries;
add_pathspec_matches_against_index(pathspec, the_repository->index, seen,
add_pathspec_matches_against_index(pathspec, repo->index, seen,
PS_IGNORE_SKIP_WORKTREE);
return seen;
}

static int refresh(int verbose, const struct pathspec *pathspec)
static int refresh(struct repository *repo, int verbose, const struct pathspec *pathspec)
{
char *seen;
int i, ret = 0;
Expand All @@ -118,14 +125,14 @@ static int refresh(int verbose, const struct pathspec *pathspec)
(verbose ? REFRESH_IN_PORCELAIN : REFRESH_QUIET);

seen = xcalloc(pathspec->nr, 1);
refresh_index(the_repository->index, flags, pathspec, seen,
refresh_index(repo->index, flags, pathspec, seen,
_("Unstaged changes after refreshing the index:"));
for (i = 0; i < pathspec->nr; i++) {
if (!seen[i]) {
const char *path = pathspec->items[i].original;

if (matches_skip_worktree(pathspec, i, &skip_worktree_seen) ||
!path_in_sparse_checkout(path, the_repository->index)) {
!path_in_sparse_checkout(path, repo->index)) {
string_list_append(&only_match_skip_worktree,
pathspec->items[i].original);
} else {
Expand All @@ -146,7 +153,10 @@ static int refresh(int verbose, const struct pathspec *pathspec)
return ret;
}

int interactive_add(const char **argv, const char *prefix, int patch)
int interactive_add(struct repository *repo,
const char **argv,
const char *prefix,
int patch)
{
struct pathspec pathspec;
int ret;
Expand All @@ -158,31 +168,31 @@ int interactive_add(const char **argv, const char *prefix, int patch)
prefix, argv);

if (patch)
ret = !!run_add_p(the_repository, ADD_P_ADD, NULL, &pathspec);
ret = !!run_add_p(repo, ADD_P_ADD, NULL, &pathspec);
else
ret = !!run_add_i(the_repository, &pathspec);
ret = !!run_add_i(repo, &pathspec);

clear_pathspec(&pathspec);
return ret;
}

static int edit_patch(int argc,
static int edit_patch(struct repository *repo,
int argc,
const char **argv,
const char *prefix,
struct repository *repo UNUSED)
const char *prefix)
{
char *file = git_pathdup("ADD_EDIT.patch");
char *file = repo_git_path(repo, "ADD_EDIT.patch");
struct child_process child = CHILD_PROCESS_INIT;
struct rev_info rev;
int out;
struct stat st;

git_config(git_diff_basic_config, NULL); /* no "diff" UI options */
repo_config(repo, git_diff_basic_config, NULL);

if (repo_read_index(the_repository) < 0)
if (repo_read_index(repo) < 0)
die(_("could not read the index"));

repo_init_revisions(the_repository, &rev, prefix);
repo_init_revisions(repo, &rev, prefix);
rev.diffopt.context = 7;

argc = setup_revisions(argc, argv, &rev, NULL);
Expand Down Expand Up @@ -320,7 +330,7 @@ static void check_embedded_repo(const char *path)
strbuf_release(&name);
}

static int add_files(struct dir_struct *dir, int flags)
static int add_files(struct repository *repo, struct dir_struct *dir, int flags)
{
int i, exit_status = 0;
struct string_list matched_sparse_paths = STRING_LIST_INIT_NODUP;
Expand All @@ -336,12 +346,12 @@ static int add_files(struct dir_struct *dir, int flags)

for (i = 0; i < dir->nr; i++) {
if (!include_sparse &&
!path_in_sparse_checkout(dir->entries[i]->name, the_repository->index)) {
!path_in_sparse_checkout(dir->entries[i]->name, repo->index)) {
string_list_append(&matched_sparse_paths,
dir->entries[i]->name);
continue;
}
if (add_file_to_index(the_repository->index, dir->entries[i]->name, flags)) {
if (add_file_to_index(repo->index, dir->entries[i]->name, flags)) {
if (!ignore_add_errors)
die(_("adding files failed"));
exit_status = 1;
Expand All @@ -363,7 +373,7 @@ static int add_files(struct dir_struct *dir, int flags)
int cmd_add(int argc,
const char **argv,
const char *prefix,
struct repository *repo UNUSED)
struct repository *repo)
{
int exit_status = 0;
struct pathspec pathspec;
Expand All @@ -375,7 +385,7 @@ int cmd_add(int argc,
char *ps_matched = NULL;
struct lock_file lock_file = LOCK_INIT;

git_config(add_config, NULL);
repo_config(repo, add_config, NULL);

argc = parse_options(argc, argv, prefix, builtin_add_options,
builtin_add_usage, PARSE_OPT_KEEP_ARGV0);
Expand All @@ -386,13 +396,13 @@ int cmd_add(int argc,
die(_("options '%s' and '%s' cannot be used together"), "--dry-run", "--interactive/--patch");
if (pathspec_from_file)
die(_("options '%s' and '%s' cannot be used together"), "--pathspec-from-file", "--interactive/--patch");
exit(interactive_add(argv + 1, prefix, patch_interactive));
exit(interactive_add(repo, argv + 1, prefix, patch_interactive));
}

if (edit_interactive) {
if (pathspec_from_file)
die(_("options '%s' and '%s' cannot be used together"), "--pathspec-from-file", "--edit");
return(edit_patch(argc, argv, prefix, the_repository));
return(edit_patch(repo, argc, argv, prefix));
}
argc--;
argv++;
Expand All @@ -415,10 +425,10 @@ int cmd_add(int argc,
add_new_files = !take_worktree_changes && !refresh_only && !add_renormalize;
require_pathspec = !(take_worktree_changes || (0 < addremove_explicit));

prepare_repo_settings(the_repository);
the_repository->settings.command_requires_full_index = 0;
prepare_repo_settings(repo);
repo->settings.command_requires_full_index = 0;

repo_hold_locked_index(the_repository, &lock_file, LOCK_DIE_ON_ERROR);
repo_hold_locked_index(repo, &lock_file, LOCK_DIE_ON_ERROR);

/*
* Check the "pathspec '%s' did not match any files" block
Expand Down Expand Up @@ -459,11 +469,11 @@ int cmd_add(int argc,
(!(addremove || take_worktree_changes)
? ADD_CACHE_IGNORE_REMOVAL : 0));

if (repo_read_index_preload(the_repository, &pathspec, 0) < 0)
if (repo_read_index_preload(repo, &pathspec, 0) < 0)
die(_("index file corrupt"));

die_in_unpopulated_submodule(the_repository->index, prefix);
die_path_inside_submodule(the_repository->index, &pathspec);
die_in_unpopulated_submodule(repo->index, prefix);
die_path_inside_submodule(repo->index, &pathspec);

if (add_new_files) {
int baselen;
Expand All @@ -475,13 +485,13 @@ int cmd_add(int argc,
}

/* This picks up the paths that are not tracked */
baselen = fill_directory(&dir, the_repository->index, &pathspec);
baselen = fill_directory(&dir, repo->index, &pathspec);
if (pathspec.nr)
seen = prune_directory(&dir, &pathspec, baselen);
seen = prune_directory(repo, &dir, &pathspec, baselen);
}

if (refresh_only) {
exit_status |= refresh(verbose, &pathspec);
exit_status |= refresh(repo, verbose, &pathspec);
goto finish;
}

Expand All @@ -492,7 +502,7 @@ int cmd_add(int argc,

if (!seen)
seen = find_pathspecs_matching_against_index(&pathspec,
the_repository->index, PS_IGNORE_SKIP_WORKTREE);
repo->index, PS_IGNORE_SKIP_WORKTREE);

/*
* file_exists() assumes exact match
Expand Down Expand Up @@ -528,8 +538,8 @@ int cmd_add(int argc,
!file_exists(path)) {
if (ignore_missing) {
int dtype = DT_UNKNOWN;
if (is_excluded(&dir, the_repository->index, path, &dtype))
dir_add_ignored(&dir, the_repository->index,
if (is_excluded(&dir, repo->index, path, &dtype))
dir_add_ignored(&dir, repo->index,
path, pathspec.items[i].len);
} else
die(_("pathspec '%s' did not match any files"),
Expand All @@ -552,9 +562,9 @@ int cmd_add(int argc,

ps_matched = xcalloc(pathspec.nr, 1);
if (add_renormalize)
exit_status |= renormalize_tracked_files(&pathspec, flags);
exit_status |= renormalize_tracked_files(repo, &pathspec, flags);
else
exit_status |= add_files_to_cache(the_repository, prefix,
exit_status |= add_files_to_cache(repo, prefix,
&pathspec, ps_matched,
include_sparse, flags);

Expand All @@ -563,14 +573,14 @@ int cmd_add(int argc,
exit(128);

if (add_new_files)
exit_status |= add_files(&dir, flags);
exit_status |= add_files(repo, &dir, flags);

if (chmod_arg && pathspec.nr)
exit_status |= chmod_pathspec(&pathspec, chmod_arg[0], show_only);
exit_status |= chmod_pathspec(repo, &pathspec, chmod_arg[0], show_only);
end_odb_transaction();

finish:
if (write_locked_index(the_repository->index, &lock_file,
if (write_locked_index(repo->index, &lock_file,
COMMIT_LOCK | SKIP_IF_UNCHANGED))
die(_("unable to write new index file"));

Expand Down
2 changes: 1 addition & 1 deletion builtin/commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -395,7 +395,7 @@ static const char *prepare_index(const char **argv, const char *prefix,
old_index_env = xstrdup_or_null(getenv(INDEX_ENVIRONMENT));
setenv(INDEX_ENVIRONMENT, the_repository->index_file, 1);

if (interactive_add(argv, prefix, patch_interactive) != 0)
if (interactive_add(the_repository, argv, prefix, patch_interactive) != 0)
die(_("interactive add failed"));

the_repository->index_file = old_repo_index_file;
Expand Down
5 changes: 4 additions & 1 deletion commit.h
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,10 @@ struct oid_array;
struct ref;
int for_each_commit_graft(each_commit_graft_fn, void *);

int interactive_add(const char **argv, const char *prefix, int patch);
int interactive_add(struct repository *repo,
const char **argv,
const char *prefix,
int patch);

struct commit_extra_header {
struct commit_extra_header *next;
Expand Down

0 comments on commit 0841729

Please sign in to comment.