Skip to content

Commit

Permalink
Merge branch 'jc/pass-repo-to-builtins'
Browse files Browse the repository at this point in the history
The convention to calling into built-in command implementation has
been updated to pass the repository, if known, together with the
prefix value.

* jc/pass-repo-to-builtins:
  add: pass in repo variable instead of global the_repository
  builtin: remove USE_THE_REPOSITORY for those without the_repository
  builtin: remove USE_THE_REPOSITORY_VARIABLE from builtin.h
  builtin: add a repository parameter for builtin functions
  • Loading branch information
gitster committed Sep 23, 2024
2 parents 0f41fd2 + 8364745 commit b8e318e
Show file tree
Hide file tree
Showing 128 changed files with 903 additions and 437 deletions.
285 changes: 139 additions & 146 deletions builtin.h

Large diffs are not rendered by default.

119 changes: 67 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
*/

#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 "repository.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 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 @@ -64,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 @@ -100,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 @@ -119,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 @@ -147,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 @@ -159,28 +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, const char **argv, const char *prefix)
static int edit_patch(struct repository *repo,
int argc,
const char **argv,
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 @@ -318,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 @@ -334,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 @@ -358,7 +370,10 @@ static int add_files(struct dir_struct *dir, int flags)
return exit_status;
}

int cmd_add(int argc, const char **argv, const char *prefix)
int cmd_add(int argc,
const char **argv,
const char *prefix,
struct repository *repo)
{
int exit_status = 0;
struct pathspec pathspec;
Expand All @@ -370,7 +385,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)
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 @@ -381,13 +396,13 @@ int cmd_add(int argc, const char **argv, const char *prefix)
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));
return(edit_patch(repo, argc, argv, prefix));
}
argc--;
argv++;
Expand All @@ -410,10 +425,10 @@ int cmd_add(int argc, const char **argv, const char *prefix)
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 @@ -454,11 +469,11 @@ int cmd_add(int argc, const char **argv, const char *prefix)
(!(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 @@ -470,13 +485,13 @@ int cmd_add(int argc, const char **argv, const char *prefix)
}

/* 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 @@ -487,7 +502,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)

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 @@ -523,8 +538,8 @@ int cmd_add(int argc, const char **argv, const char *prefix)
!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 @@ -547,9 +562,9 @@ int cmd_add(int argc, const char **argv, const char *prefix)

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 @@ -558,14 +573,14 @@ int cmd_add(int argc, const char **argv, const char *prefix)
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
7 changes: 5 additions & 2 deletions builtin/am.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
* Based on git-am.sh by Junio C Hamano.
*/

#define USE_THE_REPOSITORY_VARIABLE
#include "builtin.h"
#include "abspath.h"
#include "advice.h"
Expand Down Expand Up @@ -38,7 +39,6 @@
#include "string-list.h"
#include "pager.h"
#include "path.h"
#include "repository.h"
#include "pretty.h"

/**
Expand Down Expand Up @@ -2303,7 +2303,10 @@ static int parse_opt_show_current_patch(const struct option *opt, const char *ar
return 0;
}

int cmd_am(int argc, const char **argv, const char *prefix)
int cmd_am(int argc,
const char **argv,
const char *prefix,
struct repository *repo UNUSED)
{
struct am_state state;
int binary = -1;
Expand Down
9 changes: 7 additions & 2 deletions builtin/annotate.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,16 @@
*
* Copyright (C) 2006 Ryan Anderson
*/

#define USE_THE_REPOSITORY_VARIABLE
#include "git-compat-util.h"
#include "builtin.h"
#include "strvec.h"

int cmd_annotate(int argc, const char **argv, const char *prefix)
int cmd_annotate(int argc,
const char **argv,
const char *prefix,
struct repository *repo UNUSED)
{
struct strvec args = STRVEC_INIT;
int i;
Expand All @@ -18,5 +23,5 @@ int cmd_annotate(int argc, const char **argv, const char *prefix)
strvec_push(&args, argv[i]);
}

return cmd_blame(args.nr, args.v, prefix);
return cmd_blame(args.nr, args.v, prefix, the_repository);
}
Loading

0 comments on commit b8e318e

Please sign in to comment.