From: Petr Onderka <gsvick@gmail.com>
To: git@vger.kernel.org
Cc: Junio C Hamano <gitster@pobox.com>,
Henrik Grubbstrm <grubba@grubba.org>,
Matthieu Moy <Matthieu.Moy@grenoble-inp.fr>,
Petr Onderka <gsvick@gmail.com>
Subject: [PATCH v2] Add global and system-wide gitattributes
Date: Mon, 16 Aug 2010 16:56:53 +0000 [thread overview]
Message-ID: <1281977813-6528-1-git-send-email-gsvick@gmail.com> (raw)
In-Reply-To: <AANLkTi=2tRjGicxJxnJ3xccCGxcP3bLUy8u0O7q85D=R@mail.gmail.com>
Allow gitattributes to be set globally and system wide. This way, settings
for particular file types can be set in one place and apply for all user's
repositories.
The location of system-wide attributes file is $(prefix)/etc/gitattributes.
The location of the global file can be configured by setting
core.attributesfile.
Some parts of the code were copied from the implementation of the same
functionality in config.c.
Signed-off-by: Petr Onderka <gsvick@gmail.com>
---
This version has the correct precedence for global and system-wide attributes.
I decided not to implement having user config files in a directory (at least
for now). The location of the global attributes file can be set using
core.attributesfile. This setting has no default, as Matthieu suggested.
Documentation/config.txt | 6 +++++
Documentation/gitattributes.txt | 13 ++++++++--
Makefile | 6 +++++
attr.c | 44 ++++++++++++++++++++++++++++++++++++++-
cache.h | 1 +
config.c | 3 ++
configure.ac | 10 ++++++++-
environment.c | 1 +
8 files changed, 79 insertions(+), 5 deletions(-)
diff --git a/Documentation/config.txt b/Documentation/config.txt
index f81fb91..e5034f4 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -450,6 +450,12 @@ core.excludesfile::
to the value of `$HOME` and "{tilde}user/" to the specified user's
home directory. See linkgit:gitignore[5].
+core.attributesfile::
+ In addition to '.gitattributes' (per-directory) and
+ '.git/info/attributes', git looks into this file for attributes
+ (see linkgit:gitattributes[5]). Path expansions are made the same
+ way as for `core.excludesfile`.
+
core.editor::
Commands such as `commit` and `tag` that lets you edit
messages by launching an editor uses the value of this
diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt
index 564586b..c6bdeae 100644
--- a/Documentation/gitattributes.txt
+++ b/Documentation/gitattributes.txt
@@ -62,14 +62,21 @@ consults `$GIT_DIR/info/attributes` file (which has the highest
precedence), `.gitattributes` file in the same directory as the
path in question, and its parent directories up to the toplevel of the
work tree (the further the directory that contains `.gitattributes`
-is from the path in question, the lower its precedence).
+is from the path in question, the lower its precedence). Finally
+global and system-wide files are considered (they have the lowest
+precedence).
If you wish to affect only a single repository (i.e., to assign
-attributes to files that are particular to one user's workflow), then
+attributes to files that are particular to
+one user's workflow for that repository), then
attributes should be placed in the `$GIT_DIR/info/attributes` file.
Attributes which should be version-controlled and distributed to other
repositories (i.e., attributes of interest to all users) should go into
-`.gitattributes` files.
+`.gitattributes` files. Attributes that should affect all repositories
+for a single user should be placed in a file specified by the
+`core.attributesfile` configuration option (see linkgit:git-config[1]).
+Attributes for all users on a system should be placed in the
+`$(prefix)/etc/gitattributes` file.
Sometimes you would need to override an setting of an attribute
for a path to `unspecified` state. This can be done by listing
diff --git a/Makefile b/Makefile
index f33648d..3bfc483 100644
--- a/Makefile
+++ b/Makefile
@@ -268,6 +268,7 @@ STRIP ?= strip
# infodir
# htmldir
# ETC_GITCONFIG (but not sysconfdir)
+# ETC_GITATTRIBUTES
# can be specified as a relative path some/where/else;
# this is interpreted as relative to $(prefix) and "git" at
# runtime figures out where they are based on the path to the executable.
@@ -286,9 +287,11 @@ htmldir = share/doc/git-doc
ifeq ($(prefix),/usr)
sysconfdir = /etc
ETC_GITCONFIG = $(sysconfdir)/gitconfig
+ETC_GITATTRIBUTES = $(sysconfdir)/gitattributes
else
sysconfdir = $(prefix)/etc
ETC_GITCONFIG = etc/gitconfig
+ETC_GITATTRIBUTES = etc/gitattributes
endif
lib = lib
# DESTDIR=
@@ -1502,6 +1505,7 @@ endif
SHA1_HEADER_SQ = $(subst ','\'',$(SHA1_HEADER))
ETC_GITCONFIG_SQ = $(subst ','\'',$(ETC_GITCONFIG))
+ETC_GITATTRIBUTES_SQ = $(subst ','\'',$(ETC_GITATTRIBUTES))
DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
bindir_SQ = $(subst ','\'',$(bindir))
@@ -1872,6 +1876,8 @@ builtin/init-db.s builtin/init-db.o: EXTRA_CPPFLAGS = \
config.s config.o: EXTRA_CPPFLAGS = -DETC_GITCONFIG='"$(ETC_GITCONFIG_SQ)"'
+attr.s attr.o: EXTRA_CPPFLAGS = -DETC_GITATTRIBUTES='"$(ETC_GITATTRIBUTES_SQ)"'
+
http.s http.o: EXTRA_CPPFLAGS = -DGIT_USER_AGENT='"git/$(GIT_VERSION)"'
ifdef NO_EXPAT
diff --git a/attr.c b/attr.c
index 8ba606c..068e13b 100644
--- a/attr.c
+++ b/attr.c
@@ -1,5 +1,6 @@
#define NO_THE_INDEX_COMPATIBILITY_MACROS
#include "cache.h"
+#include "exec_cmd.h"
#include "attr.h"
const char git_attr__true[] = "(builtin)true";
@@ -462,6 +463,24 @@ static void drop_attr_stack(void)
}
}
+const char *git_etc_gitattributes(void)
+{
+ static const char *system_wide;
+ if (!system_wide)
+ system_wide = system_path(ETC_GITATTRIBUTES);
+ return system_wide;
+}
+
+int git_attr_system(void)
+{
+ return !git_env_bool("GIT_ATTR_NOSYSTEM", 0);
+}
+
+int git_attr_global(void)
+{
+ return !git_env_bool("GIT_ATTR_NOGLOBAL", 0);
+}
+
static void bootstrap_attr_stack(void)
{
if (!attr_stack) {
@@ -472,6 +491,27 @@ static void bootstrap_attr_stack(void)
elem->prev = attr_stack;
attr_stack = elem;
+ if (git_attr_system()) {
+ elem = read_attr_from_file(git_etc_gitattributes(), 1);
+ if (elem) {
+ elem->origin = NULL;
+ elem->prev = attr_stack;
+ attr_stack = elem;
+ }
+ }
+
+ if (git_attr_global() && attributes_file) {
+ char *user_attr = xstrdup(attributes_file);
+
+ elem = read_attr_from_file(user_attr, 1);
+ free(user_attr);
+ if (elem) {
+ elem->origin = NULL;
+ elem->prev = attr_stack;
+ attr_stack = elem;
+ }
+ }
+
if (!is_bare_repository() || direction == GIT_ATTR_INDEX) {
elem = read_attr(GITATTRIBUTES_FILE, 1);
elem->origin = strdup("");
@@ -499,7 +539,9 @@ static void prepare_attr_stack(const char *path, int dirlen)
/*
* At the bottom of the attribute stack is the built-in
- * set of attribute definitions. Then, contents from
+ * set of attribute definitions, followed by the contents
+ * of $(prefix)/etc/gitattributes and a file specified by
+ * core.attributesfile. Then, contents from
* .gitattribute files from directories closer to the
* root to the ones in deeper directories are pushed
* to the stack. Finally, at the very top of the stack
diff --git a/cache.h b/cache.h
index c9fa3df..cd95801 100644
--- a/cache.h
+++ b/cache.h
@@ -1030,6 +1030,7 @@ extern int pager_use_color;
extern const char *editor_program;
extern const char *excludes_file;
+extern const char *attributes_file;
/* base85 */
int decode_85(char *dst, const char *line, int linelen);
diff --git a/config.c b/config.c
index cdcf583..f602cd4 100644
--- a/config.c
+++ b/config.c
@@ -563,6 +563,9 @@ static int git_default_core_config(const char *var, const char *value)
if (!strcmp(var, "core.excludesfile"))
return git_config_pathname(&excludes_file, var, value);
+ if (!strcmp(var, "core.attributesfile"))
+ return git_config_pathname(&attributes_file, var, value);
+
if (!strcmp(var, "core.whitespace")) {
if (!value)
return config_error_nonbool(var);
diff --git a/configure.ac b/configure.ac
index 5601e8b..c5b3a41 100644
--- a/configure.ac
+++ b/configure.ac
@@ -282,7 +282,15 @@ GIT_PARSE_WITH(iconv))
GIT_PARSE_WITH_SET_MAKE_VAR(gitconfig, ETC_GITCONFIG,
Use VALUE instead of /etc/gitconfig as the
global git configuration file.
- If VALUE is not fully qualified it will be interpretted
+ If VALUE is not fully qualified it will be interpreted
+ as a path relative to the computed prefix at runtime.)
+
+#
+# Allow user to set ETC_GITATTRIBUTES variable
+GIT_PARSE_WITH_SET_MAKE_VAR(gitattributes, ETC_GITATTRIBUTES,
+ Use VALUE instead of /etc/gitattributes as the
+ global git attributes file.
+ If VALUE is not fully qualified it will be interpreted
as a path relative to the computed prefix at runtime.)
#
diff --git a/environment.c b/environment.c
index 83d38d3..58f719a 100644
--- a/environment.c
+++ b/environment.c
@@ -38,6 +38,7 @@ const char *pager_program;
int pager_use_color = 1;
const char *editor_program;
const char *excludes_file;
+const char *attributes_file;
enum auto_crlf auto_crlf = AUTO_CRLF_FALSE;
int read_replace_refs = 1;
enum eol eol = EOL_UNSET;
--
1.7.2.1.2361.g5f8e3
next prev parent reply other threads:[~2010-08-16 16:58 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-08-11 1:04 [PATCH/RFC] Add global and system-wide gitattributes Petr Onderka
2010-08-11 9:20 ` Henrik Grubbström
2010-08-11 10:50 ` Petr Onderka
2010-08-11 12:31 ` Matthieu Moy
2010-08-11 22:19 ` Junio C Hamano
2010-08-16 16:51 ` Petr Onderka
2010-08-16 16:56 ` Petr Onderka [this message]
2010-08-25 9:55 ` [PATCH v2] " Štěpán Němec
2010-08-28 17:33 ` Matthieu Moy
2010-08-30 5:34 ` Junio C Hamano
2010-08-30 9:09 ` Štěpán Němec
2010-08-28 18:35 ` Matthieu Moy
2010-08-28 18:41 ` [PATCH] core.attributesfile: a fix, a simplification, and a test Matthieu Moy
2010-08-29 10:32 ` [PATCH v3?] Add global and system-wide gitattributes Štěpán Němec
2010-08-30 8:04 ` Junio C Hamano
2010-08-30 8:26 ` Matthieu Moy
2010-08-30 20:47 ` Junio C Hamano
2010-08-30 21:11 ` Junio C Hamano
2010-08-30 22:55 ` Matthieu Moy
2010-08-30 23:15 ` [PATCH 1/3 v2] tests: factor HOME=$(pwd) in test-lib.sh Matthieu Moy
2010-08-31 7:42 ` Ævar Arnfjörð Bjarmason
2010-09-01 7:56 ` Ævar Arnfjörð Bjarmason
2010-09-01 15:24 ` Junio C Hamano
2010-09-01 15:40 ` Ævar Arnfjörð Bjarmason
2010-09-01 16:57 ` Matthieu Moy
2010-08-30 23:15 ` [PATCH 2/3] don't write to git_log_output_encoding outside git_config() Matthieu Moy
2010-09-02 8:56 ` Matthieu Moy
2010-09-02 15:49 ` Junio C Hamano
2010-08-30 23:15 ` [PATCH 3/3 v4] Add global and system-wide gitattributes Matthieu Moy
2010-08-31 22:41 ` Matthieu Moy
2010-08-31 22:42 ` [PATCH] " Matthieu Moy
2010-08-31 23:56 ` [PATCH 3/3 v4] " Junio C Hamano
2010-08-30 9:50 ` [PATCH] tests: factor HOME=$(pwd) in test-lib.sh Matthieu Moy
2010-08-30 10:22 ` Ævar Arnfjörð Bjarmason
2010-08-30 10:54 ` Matthieu Moy
2010-08-30 11:08 ` Ævar Arnfjörð Bjarmason
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1281977813-6528-1-git-send-email-gsvick@gmail.com \
--to=gsvick@gmail.com \
--cc=Matthieu.Moy@grenoble-inp.fr \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=grubba@grubba.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.