mirror of
https://github.com/git/git
synced 2024-08-24 18:26:02 +00:00
Merge the attributes fix in from maint-1.6.7 branch
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
commit
55dcc2ebad
11
Documentation/RelNotes/1.7.6.6.txt
Normal file
11
Documentation/RelNotes/1.7.6.6.txt
Normal file
|
@ -0,0 +1,11 @@
|
|||
Git v1.7.6.6 Release Notes
|
||||
==========================
|
||||
|
||||
Fixes since v1.7.6.5
|
||||
--------------------
|
||||
|
||||
* The code to look up attributes for paths reused entries from a wrong
|
||||
directory when two paths in question are in adjacent directories and
|
||||
the name of the one directory is a prefix of the other.
|
||||
|
||||
Also contains minor fixes and documentation updates.
|
11
Documentation/RelNotes/1.7.7.6.txt
Normal file
11
Documentation/RelNotes/1.7.7.6.txt
Normal file
|
@ -0,0 +1,11 @@
|
|||
Git v1.7.7.6 Release Notes
|
||||
==========================
|
||||
|
||||
Fixes since v1.7.7.5
|
||||
--------------------
|
||||
|
||||
* The code to look up attributes for paths reused entries from a wrong
|
||||
directory when two paths in question are in adjacent directories and
|
||||
the name of the one directory is a prefix of the other.
|
||||
|
||||
Also contains minor fixes and documentation updates.
|
|
@ -1740,7 +1740,8 @@ rerere.enabled::
|
|||
conflict hunks can be resolved automatically, should they be
|
||||
encountered again. By default, linkgit:git-rerere[1] is
|
||||
enabled if there is an `rr-cache` directory under the
|
||||
`$GIT_DIR`.
|
||||
`$GIT_DIR`, e.g. if "rerere" was previously used in the
|
||||
repository.
|
||||
|
||||
sendemail.identity::
|
||||
A configuration identity. When given, causes values in the
|
||||
|
|
79
attr.c
79
attr.c
|
@ -495,47 +495,48 @@ static int git_attr_system(void)
|
|||
|
||||
static void bootstrap_attr_stack(void)
|
||||
{
|
||||
if (!attr_stack) {
|
||||
struct attr_stack *elem;
|
||||
struct attr_stack *elem;
|
||||
|
||||
elem = read_attr_from_array(builtin_attr);
|
||||
elem->origin = NULL;
|
||||
elem->prev = attr_stack;
|
||||
attr_stack = elem;
|
||||
if (attr_stack)
|
||||
return;
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
elem = read_attr_from_array(builtin_attr);
|
||||
elem->origin = NULL;
|
||||
elem->prev = attr_stack;
|
||||
attr_stack = elem;
|
||||
|
||||
if (git_attributes_file) {
|
||||
elem = read_attr_from_file(git_attributes_file, 1);
|
||||
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 = xstrdup("");
|
||||
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;
|
||||
debug_push(elem);
|
||||
}
|
||||
}
|
||||
|
||||
elem = read_attr_from_file(git_path(INFOATTRIBUTES_FILE), 1);
|
||||
if (!elem)
|
||||
elem = xcalloc(1, sizeof(*elem));
|
||||
elem->origin = NULL;
|
||||
if (git_attributes_file) {
|
||||
elem = read_attr_from_file(git_attributes_file, 1);
|
||||
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 = xstrdup("");
|
||||
elem->prev = attr_stack;
|
||||
attr_stack = elem;
|
||||
debug_push(elem);
|
||||
}
|
||||
|
||||
elem = read_attr_from_file(git_path(INFOATTRIBUTES_FILE), 1);
|
||||
if (!elem)
|
||||
elem = xcalloc(1, sizeof(*elem));
|
||||
elem->origin = NULL;
|
||||
elem->prev = attr_stack;
|
||||
attr_stack = elem;
|
||||
}
|
||||
|
||||
static void prepare_attr_stack(const char *path)
|
||||
|
@ -575,14 +576,17 @@ static void prepare_attr_stack(const char *path)
|
|||
|
||||
/*
|
||||
* Pop the ones from directories that are not the prefix of
|
||||
* the path we are checking.
|
||||
* the path we are checking. Break out of the loop when we see
|
||||
* the root one (whose origin is an empty string "") or the builtin
|
||||
* one (whose origin is NULL) without popping it.
|
||||
*/
|
||||
while (attr_stack && attr_stack->origin) {
|
||||
while (attr_stack->origin) {
|
||||
int namelen = strlen(attr_stack->origin);
|
||||
|
||||
elem = attr_stack;
|
||||
if (namelen <= dirlen &&
|
||||
!strncmp(elem->origin, path, namelen))
|
||||
!strncmp(elem->origin, path, namelen) &&
|
||||
(!namelen || path[namelen] == '/'))
|
||||
break;
|
||||
|
||||
debug_pop(elem);
|
||||
|
@ -594,8 +598,15 @@ static void prepare_attr_stack(const char *path)
|
|||
* Read from parent directories and push them down
|
||||
*/
|
||||
if (!is_bare_repository() || direction == GIT_ATTR_INDEX) {
|
||||
/*
|
||||
* bootstrap_attr_stack() should have added, and the
|
||||
* above loop should have stopped before popping, the
|
||||
* root element whose attr_stack->origin is set to an
|
||||
* empty string.
|
||||
*/
|
||||
struct strbuf pathbuf = STRBUF_INIT;
|
||||
|
||||
assert(attr_stack->origin);
|
||||
while (1) {
|
||||
len = strlen(attr_stack->origin);
|
||||
if (dirlen <= len)
|
||||
|
|
|
@ -159,6 +159,16 @@ test_expect_success 'relative paths' '
|
|||
(cd b && attr_check ../a/b/g a/b/g)
|
||||
'
|
||||
|
||||
test_expect_success 'prefixes are not confused with leading directories' '
|
||||
attr_check a_plus/g unspecified &&
|
||||
cat >expect <<-\EOF &&
|
||||
a/g: test: a/g
|
||||
a_plus/g: test: unspecified
|
||||
EOF
|
||||
git check-attr test a/g a_plus/g >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'core.attributesfile' '
|
||||
attr_check global unspecified &&
|
||||
git config core.attributesfile "$HOME/global-gitattributes" &&
|
||||
|
|
Loading…
Reference in a new issue