2005-10-12 09:47:34 +08:00
|
|
|
/*
|
|
|
|
* We put all the git config variables in this same object
|
|
|
|
* file, so that programs can link against the config parser
|
|
|
|
* without having to link against all the rest of git.
|
|
|
|
*
|
|
|
|
* In particular, no need to bring in libz etc unless needed,
|
|
|
|
* even if you might want to know where the git directory etc
|
|
|
|
* are.
|
|
|
|
*/
|
|
|
|
#include "cache.h"
|
|
|
|
|
|
|
|
char git_default_email[MAX_GITNAME];
|
|
|
|
char git_default_name[MAX_GITNAME];
|
2006-07-12 03:48:08 +08:00
|
|
|
int use_legacy_headers = 1;
|
2005-10-12 09:47:34 +08:00
|
|
|
int trust_executable_bit = 1;
|
2006-08-16 01:23:48 +08:00
|
|
|
int assume_unchanged;
|
|
|
|
int prefer_symlink_refs;
|
2007-01-07 18:00:28 +08:00
|
|
|
int is_bare_repository_cfg = -1; /* unspecified */
|
Move initialization of log_all_ref_updates
The patches to prevent Porcelainish that require working tree
from doing any damage in a bare repository make a lot of sense,
and I want to make the is_bare_git_dir() function more reliable.
In order to allow the repository owner override the heuristic
implemented in is_bare_git_dir() if/when it misidentifies a
particular repository, it would make sense to introduce a new
configuration variable "[core] bare = true/false", and make
is_bare_git_dir() notice it.
The scripts would do a 'repo-config --bool --get core.bare' and
iff the command fails (i.e. there is no such variable in the
configuration file), it would use the heuristic implemented at
the script level [*1*].
However, setup_git_env() which is called a lot earlier than we
even read from the repository configuration currently makes a
call to is_bare_git_dir(), in order to change the default
setting for log_all_ref_updates. It somehow feels that this is
a hack.
By the way, [*1*] is another thing I hate about the current
config mechanism. "git-repo-config --get" does not know what
the possible configuration variables are, let alone what the
default values for them are. It allows us not to maintain a
centralized configuration table, which makes it easy to
introduce ad-hoc variables and gives a warm fuzzy feeling of
being modular, but my feeling is that it is turning out to be a
rather high price to pay for scripts.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2007-01-07 17:35:34 +08:00
|
|
|
int log_all_ref_updates = -1; /* unspecified */
|
2006-03-24 15:42:40 +08:00
|
|
|
int warn_ambiguous_refs = 1;
|
2006-08-16 01:23:48 +08:00
|
|
|
int repository_format_version;
|
2006-12-28 08:41:33 +08:00
|
|
|
char *git_commit_encoding;
|
|
|
|
char *git_log_output_encoding;
|
2006-06-10 14:09:49 +08:00
|
|
|
int shared_repository = PERM_UMASK;
|
2006-08-16 01:23:48 +08:00
|
|
|
const char *apply_default_whitespace;
|
2006-07-04 04:11:47 +08:00
|
|
|
int zlib_compression_level = Z_DEFAULT_COMPRESSION;
|
2006-12-24 13:46:13 +08:00
|
|
|
size_t packed_git_window_size = DEFAULT_PACKED_GIT_WINDOW_SIZE;
|
|
|
|
size_t packed_git_limit = DEFAULT_PACKED_GIT_LIMIT;
|
2006-07-10 19:40:44 +08:00
|
|
|
int pager_in_use;
|
2006-07-30 06:27:43 +08:00
|
|
|
int pager_use_color = 1;
|
Lazy man's auto-CRLF
It currently does NOT know about file attributes, so it does its
conversion purely based on content. Maybe that is more in the "git
philosophy" anyway, since content is king, but I think we should try to do
the file attributes to turn it off on demand.
Anyway, BY DEFAULT it is off regardless, because it requires a
[core]
AutoCRLF = true
in your config file to be enabled. We could make that the default for
Windows, of course, the same way we do some other things (filemode etc).
But you can actually enable it on UNIX, and it will cause:
- "git update-index" will write blobs without CRLF
- "git diff" will diff working tree files without CRLF
- "git checkout" will write files to the working tree _with_ CRLF
and things work fine.
Funnily, it actually shows an odd file in git itself:
git clone -n git test-crlf
cd test-crlf
git config core.autocrlf true
git checkout
git diff
shows a diff for "Documentation/docbook-xsl.css". Why? Because we have
actually checked in that file *with* CRLF! So when "core.autocrlf" is
true, we'll always generate a *different* hash for it in the index,
because the index hash will be for the content _without_ CRLF.
Is this complete? I dunno. It seems to work for me. It doesn't use the
filename at all right now, and that's probably a deficiency (we could
certainly make the "is_binary()" heuristics also take standard filename
heuristics into account).
I don't pass in the filename at all for the "index_fd()" case
(git-update-index), so that would need to be passed around, but this
actually works fine.
NOTE NOTE NOTE! The "is_binary()" heuristics are totally made-up by yours
truly. I will not guarantee that they work at all reasonable. Caveat
emptor. But it _is_ simple, and it _is_ safe, since it's all off by
default.
The patch is pretty simple - the biggest part is the new "convert.c" file,
but even that is really just basic stuff that anybody can write in
"Teaching C 101" as a final project for their first class in programming.
Not to say that it's bug-free, of course - but at least we're not talking
about rocket surgery here.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2007-02-14 03:07:23 +08:00
|
|
|
int auto_crlf = 0;
|
2005-10-12 09:47:34 +08:00
|
|
|
|
2006-08-23 18:39:11 +08:00
|
|
|
static const char *git_dir;
|
|
|
|
static char *git_object_dir, *git_index_file, *git_refs_dir, *git_graft_file;
|
|
|
|
|
2005-10-12 09:47:34 +08:00
|
|
|
static void setup_git_env(void)
|
|
|
|
{
|
|
|
|
git_dir = getenv(GIT_DIR_ENVIRONMENT);
|
|
|
|
if (!git_dir)
|
|
|
|
git_dir = DEFAULT_GIT_DIR_ENVIRONMENT;
|
|
|
|
git_object_dir = getenv(DB_ENVIRONMENT);
|
|
|
|
if (!git_object_dir) {
|
|
|
|
git_object_dir = xmalloc(strlen(git_dir) + 9);
|
|
|
|
sprintf(git_object_dir, "%s/objects", git_dir);
|
|
|
|
}
|
|
|
|
git_refs_dir = xmalloc(strlen(git_dir) + 6);
|
|
|
|
sprintf(git_refs_dir, "%s/refs", git_dir);
|
|
|
|
git_index_file = getenv(INDEX_ENVIRONMENT);
|
|
|
|
if (!git_index_file) {
|
|
|
|
git_index_file = xmalloc(strlen(git_dir) + 7);
|
|
|
|
sprintf(git_index_file, "%s/index", git_dir);
|
|
|
|
}
|
|
|
|
git_graft_file = getenv(GRAFT_ENVIRONMENT);
|
|
|
|
if (!git_graft_file)
|
2006-09-02 12:16:31 +08:00
|
|
|
git_graft_file = xstrdup(git_path("info/grafts"));
|
2006-12-15 06:41:17 +08:00
|
|
|
}
|
|
|
|
|
2007-01-07 18:00:28 +08:00
|
|
|
int is_bare_repository(void)
|
2006-12-15 06:41:17 +08:00
|
|
|
{
|
2007-01-07 18:00:28 +08:00
|
|
|
const char *dir, *s;
|
|
|
|
if (0 <= is_bare_repository_cfg)
|
|
|
|
return is_bare_repository_cfg;
|
|
|
|
|
|
|
|
dir = get_git_dir();
|
2006-12-15 06:41:17 +08:00
|
|
|
if (!strcmp(dir, DEFAULT_GIT_DIR_ENVIRONMENT))
|
|
|
|
return 0;
|
|
|
|
s = strrchr(dir, '/');
|
|
|
|
return !s || strcmp(s + 1, DEFAULT_GIT_DIR_ENVIRONMENT);
|
2005-10-12 09:47:34 +08:00
|
|
|
}
|
|
|
|
|
2006-08-23 18:39:11 +08:00
|
|
|
const char *get_git_dir(void)
|
2005-10-12 09:47:34 +08:00
|
|
|
{
|
|
|
|
if (!git_dir)
|
|
|
|
setup_git_env();
|
|
|
|
return git_dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
char *get_object_directory(void)
|
|
|
|
{
|
|
|
|
if (!git_object_dir)
|
|
|
|
setup_git_env();
|
|
|
|
return git_object_dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
char *get_refs_directory(void)
|
|
|
|
{
|
|
|
|
if (!git_refs_dir)
|
|
|
|
setup_git_env();
|
|
|
|
return git_refs_dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
char *get_index_file(void)
|
|
|
|
{
|
|
|
|
if (!git_index_file)
|
|
|
|
setup_git_env();
|
|
|
|
return git_index_file;
|
|
|
|
}
|
|
|
|
|
|
|
|
char *get_graft_file(void)
|
|
|
|
{
|
|
|
|
if (!git_graft_file)
|
|
|
|
setup_git_env();
|
|
|
|
return git_graft_file;
|
|
|
|
}
|
|
|
|
|
|
|
|
|