mirror of
https://github.com/git/git.git
synced 2024-11-27 12:03:55 +08:00
673af418d0
In "environment.h" we have quite a lot of functions and variables that either explicitly or implicitly depend on `the_repository`. The implicit set of stateful declarations includes for example variables which get populated when parsing a repository's Git configuration. This set of variables is broken by design, as their state often depends on the last repository config that has been parsed. So they may or may not represent the state of `the_repository`. Fixing that is quite a big undertaking, and later patches in this series will demonstrate a solution for a first small set of those variables. So for now, let's guard these with `USE_THE_REPOSITORY_VARIABLE` so that callers are aware of the implicit dependency. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
240 lines
8.1 KiB
C
240 lines
8.1 KiB
C
#ifndef ENVIRONMENT_H
|
|
#define ENVIRONMENT_H
|
|
|
|
/* Double-check local_repo_env below if you add to this list. */
|
|
#define GIT_DIR_ENVIRONMENT "GIT_DIR"
|
|
#define GIT_COMMON_DIR_ENVIRONMENT "GIT_COMMON_DIR"
|
|
#define GIT_NAMESPACE_ENVIRONMENT "GIT_NAMESPACE"
|
|
#define GIT_WORK_TREE_ENVIRONMENT "GIT_WORK_TREE"
|
|
#define GIT_PREFIX_ENVIRONMENT "GIT_PREFIX"
|
|
#define DEFAULT_GIT_DIR_ENVIRONMENT ".git"
|
|
#define DB_ENVIRONMENT "GIT_OBJECT_DIRECTORY"
|
|
#define INDEX_ENVIRONMENT "GIT_INDEX_FILE"
|
|
#define GRAFT_ENVIRONMENT "GIT_GRAFT_FILE"
|
|
#define GIT_SHALLOW_FILE_ENVIRONMENT "GIT_SHALLOW_FILE"
|
|
#define TEMPLATE_DIR_ENVIRONMENT "GIT_TEMPLATE_DIR"
|
|
#define CONFIG_ENVIRONMENT "GIT_CONFIG"
|
|
#define CONFIG_DATA_ENVIRONMENT "GIT_CONFIG_PARAMETERS"
|
|
#define CONFIG_COUNT_ENVIRONMENT "GIT_CONFIG_COUNT"
|
|
#define EXEC_PATH_ENVIRONMENT "GIT_EXEC_PATH"
|
|
#define CEILING_DIRECTORIES_ENVIRONMENT "GIT_CEILING_DIRECTORIES"
|
|
#define NO_REPLACE_OBJECTS_ENVIRONMENT "GIT_NO_REPLACE_OBJECTS"
|
|
#define GIT_REPLACE_REF_BASE_ENVIRONMENT "GIT_REPLACE_REF_BASE"
|
|
#define NO_LAZY_FETCH_ENVIRONMENT "GIT_NO_LAZY_FETCH"
|
|
#define GITATTRIBUTES_FILE ".gitattributes"
|
|
#define INFOATTRIBUTES_FILE "info/attributes"
|
|
#define ATTRIBUTE_MACRO_PREFIX "[attr]"
|
|
#define GITMODULES_FILE ".gitmodules"
|
|
#define GITMODULES_INDEX ":.gitmodules"
|
|
#define GITMODULES_HEAD "HEAD:.gitmodules"
|
|
#define GIT_NOTES_REF_ENVIRONMENT "GIT_NOTES_REF"
|
|
#define GIT_NOTES_DEFAULT_REF "refs/notes/commits"
|
|
#define GIT_NOTES_DISPLAY_REF_ENVIRONMENT "GIT_NOTES_DISPLAY_REF"
|
|
#define GIT_NOTES_REWRITE_REF_ENVIRONMENT "GIT_NOTES_REWRITE_REF"
|
|
#define GIT_NOTES_REWRITE_MODE_ENVIRONMENT "GIT_NOTES_REWRITE_MODE"
|
|
#define GIT_LITERAL_PATHSPECS_ENVIRONMENT "GIT_LITERAL_PATHSPECS"
|
|
#define GIT_GLOB_PATHSPECS_ENVIRONMENT "GIT_GLOB_PATHSPECS"
|
|
#define GIT_NOGLOB_PATHSPECS_ENVIRONMENT "GIT_NOGLOB_PATHSPECS"
|
|
#define GIT_ICASE_PATHSPECS_ENVIRONMENT "GIT_ICASE_PATHSPECS"
|
|
#define GIT_QUARANTINE_ENVIRONMENT "GIT_QUARANTINE_PATH"
|
|
#define GIT_OPTIONAL_LOCKS_ENVIRONMENT "GIT_OPTIONAL_LOCKS"
|
|
#define GIT_TEXT_DOMAIN_DIR_ENVIRONMENT "GIT_TEXTDOMAINDIR"
|
|
#define GIT_ATTR_SOURCE_ENVIRONMENT "GIT_ATTR_SOURCE"
|
|
|
|
/*
|
|
* Environment variable used to propagate the --no-advice global option to the
|
|
* advice_enabled() helper, even when run in a subprocess.
|
|
* This is an internal variable that should not be set by the user.
|
|
*/
|
|
#define GIT_ADVICE_ENVIRONMENT "GIT_ADVICE"
|
|
|
|
/*
|
|
* Environment variable used in handshaking the wire protocol.
|
|
* Contains a colon ':' separated list of keys with optional values
|
|
* 'key[=value]'. Presence of unknown keys and values must be
|
|
* ignored.
|
|
*/
|
|
#define GIT_PROTOCOL_ENVIRONMENT "GIT_PROTOCOL"
|
|
/* HTTP header used to handshake the wire protocol */
|
|
#define GIT_PROTOCOL_HEADER "Git-Protocol"
|
|
|
|
/*
|
|
* This environment variable is expected to contain a boolean indicating
|
|
* whether we should or should not treat:
|
|
*
|
|
* GIT_DIR=foo.git git ...
|
|
*
|
|
* as if GIT_WORK_TREE=. was given. It's not expected that users will make use
|
|
* of this, but we use it internally to communicate to sub-processes that we
|
|
* are in a bare repo. If not set, defaults to true.
|
|
*/
|
|
#define GIT_IMPLICIT_WORK_TREE_ENVIRONMENT "GIT_IMPLICIT_WORK_TREE"
|
|
|
|
#define ALTERNATE_DB_ENVIRONMENT "GIT_ALTERNATE_OBJECT_DIRECTORIES"
|
|
|
|
/*
|
|
* Repository-local GIT_* environment variables; these will be cleared
|
|
* when git spawns a sub-process that runs inside another repository.
|
|
* The array is NULL-terminated, which makes it easy to pass in the "env"
|
|
* parameter of a run-command invocation, or to do a simple walk.
|
|
*/
|
|
extern const char * const local_repo_env[];
|
|
|
|
struct strvec;
|
|
|
|
/*
|
|
* Wrapper of getenv() that returns a strdup value. This value is kept
|
|
* in argv to be freed later.
|
|
*/
|
|
const char *getenv_safe(struct strvec *argv, const char *name);
|
|
|
|
/*
|
|
* Should we print an ellipsis after an abbreviated SHA-1 value
|
|
* when doing diff-raw output or indicating a detached HEAD?
|
|
*/
|
|
int print_sha1_ellipsis(void);
|
|
|
|
/*
|
|
* Returns the boolean value of $GIT_OPTIONAL_LOCKS (or the default value).
|
|
*/
|
|
int use_optional_locks(void);
|
|
|
|
const char *get_git_namespace(void);
|
|
const char *strip_namespace(const char *namespaced_ref);
|
|
|
|
/*
|
|
* TODO: All the below state either explicitly or implicitly relies on
|
|
* `the_repository`. We should eventually get rid of these and make the
|
|
* dependency on a repository explicit:
|
|
*
|
|
* - `setup_git_env()` ideally shouldn't exist as it modifies global state,
|
|
* namely the environment. The current process shouldn't ever access that
|
|
* state via envvars though, but should instead consult a `struct
|
|
* repository`. When spawning new processes, we would ideally also pass a
|
|
* `struct repository` and then set up the environment variables for the
|
|
* child process, only.
|
|
*
|
|
* - `have_git_dir()` should not have to exist at all. Instead, we should
|
|
* decide on whether or not we have a `struct repository`.
|
|
*
|
|
* - All the global config variables should become tied to a repository. Like
|
|
* this, we'd correctly honor repository-local configuration and be able to
|
|
* distinguish configuration values from different repositories.
|
|
*
|
|
* Please do not add new global config variables here.
|
|
*/
|
|
# ifdef USE_THE_REPOSITORY_VARIABLE
|
|
void setup_git_env(const char *git_dir);
|
|
|
|
/*
|
|
* Returns true iff we have a configured git repository (either via
|
|
* setup_git_directory, or in the environment via $GIT_DIR).
|
|
*/
|
|
int have_git_dir(void);
|
|
|
|
/*
|
|
* Accessors for the core.sharedrepository config which lazy-load the value
|
|
* from the config (if not already set). The "reset" function can be
|
|
* used to unset "set" or cached value, meaning that the value will be loaded
|
|
* fresh from the config file on the next call to get_shared_repository().
|
|
*/
|
|
void set_shared_repository(int value);
|
|
int get_shared_repository(void);
|
|
void reset_shared_repository(void);
|
|
|
|
extern int is_bare_repository_cfg;
|
|
int is_bare_repository(void);
|
|
extern char *git_work_tree_cfg;
|
|
|
|
/* Environment bits from configuration mechanism */
|
|
extern int trust_executable_bit;
|
|
extern int trust_ctime;
|
|
extern int check_stat;
|
|
extern int has_symlinks;
|
|
extern int minimum_abbrev, default_abbrev;
|
|
extern int ignore_case;
|
|
extern int assume_unchanged;
|
|
extern int prefer_symlink_refs;
|
|
extern int warn_ambiguous_refs;
|
|
extern int warn_on_object_refname_ambiguity;
|
|
extern char *apply_default_whitespace;
|
|
extern char *apply_default_ignorewhitespace;
|
|
extern char *git_attributes_file;
|
|
extern char *git_hooks_path;
|
|
extern int zlib_compression_level;
|
|
extern int pack_compression_level;
|
|
extern size_t packed_git_window_size;
|
|
extern size_t packed_git_limit;
|
|
extern size_t delta_base_cache_limit;
|
|
extern unsigned long big_file_threshold;
|
|
extern unsigned long pack_size_limit_cfg;
|
|
extern int max_allowed_tree_depth;
|
|
|
|
extern int core_preload_index;
|
|
extern int precomposed_unicode;
|
|
extern int protect_hfs;
|
|
extern int protect_ntfs;
|
|
|
|
extern int core_apply_sparse_checkout;
|
|
extern int core_sparse_checkout_cone;
|
|
extern int sparse_expect_files_outside_of_patterns;
|
|
|
|
enum log_refs_config {
|
|
LOG_REFS_UNSET = -1,
|
|
LOG_REFS_NONE = 0,
|
|
LOG_REFS_NORMAL,
|
|
LOG_REFS_ALWAYS
|
|
};
|
|
extern enum log_refs_config log_all_ref_updates;
|
|
|
|
enum rebase_setup_type {
|
|
AUTOREBASE_NEVER = 0,
|
|
AUTOREBASE_LOCAL,
|
|
AUTOREBASE_REMOTE,
|
|
AUTOREBASE_ALWAYS
|
|
};
|
|
extern enum rebase_setup_type autorebase;
|
|
|
|
enum push_default_type {
|
|
PUSH_DEFAULT_NOTHING = 0,
|
|
PUSH_DEFAULT_MATCHING,
|
|
PUSH_DEFAULT_SIMPLE,
|
|
PUSH_DEFAULT_UPSTREAM,
|
|
PUSH_DEFAULT_CURRENT,
|
|
PUSH_DEFAULT_UNSPECIFIED
|
|
};
|
|
extern enum push_default_type push_default;
|
|
|
|
enum object_creation_mode {
|
|
OBJECT_CREATION_USES_HARDLINKS = 0,
|
|
OBJECT_CREATION_USES_RENAMES = 1
|
|
};
|
|
extern enum object_creation_mode object_creation_mode;
|
|
|
|
extern char *notes_ref_name;
|
|
|
|
extern int grafts_keep_true_parents;
|
|
|
|
extern int repository_format_precious_objects;
|
|
|
|
const char *get_log_output_encoding(void);
|
|
const char *get_commit_output_encoding(void);
|
|
|
|
extern char *git_commit_encoding;
|
|
extern char *git_log_output_encoding;
|
|
|
|
extern char *editor_program;
|
|
extern char *askpass_program;
|
|
extern char *excludes_file;
|
|
|
|
/*
|
|
* The character that begins a commented line in user-editable file
|
|
* that is subject to stripspace.
|
|
*/
|
|
extern const char *comment_line_str;
|
|
extern char *comment_line_str_to_free;
|
|
extern int auto_comment_line_char;
|
|
|
|
# endif /* USE_THE_REPOSITORY_VARIABLE */
|
|
#endif /* ENVIRONMENT_H */
|