Skip to content
/ git Public
forked from git/git

Commit

Permalink
Sync with maint
Browse files Browse the repository at this point in the history
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
gitster committed Jan 10, 2012
2 parents beecc7a + be4d292 commit e04dc49
Show file tree
Hide file tree
Showing 6 changed files with 91 additions and 33 deletions.
11 changes: 11 additions & 0 deletions Documentation/RelNotes/1.7.6.6.txt
Original file line number Diff line number Diff line change
@@ -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 changes: 11 additions & 0 deletions Documentation/RelNotes/1.7.7.6.txt
Original file line number Diff line number Diff line change
@@ -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.
14 changes: 14 additions & 0 deletions Documentation/RelNotes/1.7.8.4.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
Git v1.7.8.4 Release Notes
==========================

Fixes since v1.7.8.3
--------------------

* 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.

* "git send-email" did not properly treat sendemail.multiedit as a
boolean (e.g. setting it to "false" did not turn it off).

Also contains minor fixes and documentation updates.
3 changes: 2 additions & 1 deletion Documentation/config.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1786,7 +1786,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
Expand Down
75 changes: 43 additions & 32 deletions attr.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 (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 (!is_bare_repository() || direction == GIT_ATTR_INDEX) {
elem = read_attr(GITATTRIBUTES_FILE, 1);
elem->origin = xstrdup("");
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;
debug_push(elem);
}
}

elem = read_attr_from_file(git_path(INFOATTRIBUTES_FILE), 1);
if (!elem)
elem = xcalloc(1, sizeof(*elem));
elem->origin = NULL;
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)
Expand Down Expand Up @@ -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);
Expand All @@ -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)
Expand Down
10 changes: 10 additions & 0 deletions t/t0003-attributes.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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" &&
Expand Down

0 comments on commit e04dc49

Please sign in to comment.