Re: How to use git attributes to configure server-side checks?
- From
Michael Haggerty <mhagger@alum.mit.edu>
- Date
- Feb 17, 2012, 18:42 UTC
- Message-ID
- <4F3E9F86.3070802@alum.mit.edu>
- In-Reply-To
- <7vy5xh1whq.fsf@alter.siamese.dyndns.org>
On 09/21/2011 10:17 PM, Junio C Hamano wrote:
Show 14 quoted lines
> Michael Haggerty <mhagger@alum.mit.edu> writes: >> I was thinking of using git attributes to configure a server-side >> "update" hook that does some basic sanity checking before accepting a >> push. I thought I could do something like >> [...] >> I see that there is an (undocumented) API involving >> git_attr_set_direction() that seems to let gitattributes to be read out >> of the index instead of the working tree. But I am still confused: > > The words "server side" automatically mean that there should be no working > tree, and where there is no working tree there should be no index, so the > direction should not make any difference. The attributes that are used to > help whitespace checks should come from project.git/info/attributes in > such a case [*...*].
I was just alerted by Scott Chacon's blog [1] to the fact that one can set GIT_INDEX_FILE to an arbitrary filename, thereby causing the index to be read/written from that file instead of $GIT_DIR/index. It occurred to me that this feature, along with the addition of "git check-attr --cached" in 1.7.8, can be used to give server-side access to the gitattributes for an arbitrary commit:
GIT_INDEX_FILE="$(tempfile)"
export GIT_INDEX_FILE
git read-tree $COMMIT
git check-attr --cached attr -- pathname
...
rm "$GIT_INDEX_FILE"Empirically it seems to work (and it is surprisingly fast). The use of a temporary file prevents simultaneous accesses to the repository from stepping on each other. This looks like a clean solution to my problem. Or is there some hidden pitfall in this approach?
Michael
[1] http://progit.org/2010/04/11/environment.html
-- Michael Haggerty mhagger@alum.mit.edu http://softwareswirl.blogspot.com/