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 9, 2024
1 parent ffadb16 commit c776929
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 54 deletions.
105 changes: 53 additions & 52 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 All @@ -18,7 +17,6 @@
#include "preload-index.h"
#include "diff.h"
#include "read-cache.h"

#include "revision.h"
#include "bulk-checkin.h"
#include "strvec.h"
Expand All @@ -36,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 pathspec *pathspec,
char flip,
int show_only,
struct repository *repo)
{
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 @@ -64,31 +65,31 @@ 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(const struct pathspec *pathspec, int flags, struct repository *repo)
{
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 dir_struct *dir, struct pathspec *pathspec, int prefix, struct repository *repo)
{
char *seen;
int i;
Expand All @@ -100,16 +101,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(int verbose, const struct pathspec *pathspec, struct repository *repo)
{
char *seen;
int i, ret = 0;
Expand All @@ -119,14 +120,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 @@ -147,7 +148,7 @@ 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(const char **argv, const char *prefix, int patch, struct repository *repo)
{
struct pathspec pathspec;
int ret;
Expand All @@ -159,9 +160,9 @@ 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;
Expand All @@ -170,20 +171,20 @@ int interactive_add(const char **argv, const char *prefix, int patch)
static int edit_patch(int argc,
const char **argv,
const char *prefix,
struct repository *repo UNUSED)
struct repository *repo)
{
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 @@ -321,7 +322,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 dir_struct *dir, int flags, struct repository *repo)
{
int i, exit_status = 0;
struct string_list matched_sparse_paths = STRING_LIST_INIT_NODUP;
Expand All @@ -337,12 +338,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 @@ -364,7 +365,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 @@ -376,7 +377,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 @@ -387,13 +388,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(argv + 1, prefix, patch_interactive, repo));
}

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(argc, argv, prefix, repo));
}
argc--;
argv++;
Expand All @@ -416,10 +417,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 @@ -460,11 +461,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 @@ -476,13 +477,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(&dir, &pathspec, baselen, repo);
}

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

Expand All @@ -493,7 +494,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 @@ -529,8 +530,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 @@ -553,9 +554,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(&pathspec, flags, repo);
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 @@ -564,14 +565,14 @@ int cmd_add(int argc,
exit(128);

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

if (chmod_arg && pathspec.nr)
exit_status |= chmod_pathspec(&pathspec, chmod_arg[0], show_only);
exit_status |= chmod_pathspec(&pathspec, chmod_arg[0], show_only, repo);
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 @@ -396,7 +396,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(argv, prefix, patch_interactive, the_repository) != 0)
die(_("interactive add failed"));

the_repository->index_file = old_repo_index_file;
Expand Down
3 changes: 2 additions & 1 deletion commit.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#define COMMIT_H

#include "object.h"
#include "repository.h"

struct signature_check;
struct strbuf;
Expand Down Expand Up @@ -253,7 +254,7 @@ 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(const char **argv, const char *prefix, int patch, struct repository *repo);

struct commit_extra_header {
struct commit_extra_header *next;
Expand Down

0 comments on commit c776929

Please sign in to comment.