git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jeff King <peff@peff.net>
To: Mark Plaksin <happy@usg.edu>
Cc: git@vger.kernel.org
Subject: Re: Syntax check via update hook?
Date: Thu, 14 May 2009 02:55:44 -0400	[thread overview]
Message-ID: <20090514065544.GC10411@coredump.intra.peff.net> (raw)
In-Reply-To: <wsd4aem8rh.fsf@usg.edu>

On Tue, May 12, 2009 at 03:16:50PM -0400, Mark Plaksin wrote:

> >         $ cat <<EOF >.git/hooks/update
> >         #!/bin/sh
> >         GIT_INDEX_FILE=/path/to/tempdir/index; export GIT_INDEX_FILE
> >         cd /path/to/tempdir/tree &&
> >         mkdir -p tree &&
> >         git read-tree "$3" &&
> >         git checkout-index &&
> >         your_syntax_check
> >         EOF
> >         $ chmod +x .git/hooks/update
> 
> Thanks for helping! :)
> 
> Unfortunately we don't quite get it.  Can you flesh out your example a
> bit and explain the concepts involved?  We're relative git newbies.  We
> tried reading the man pages to the commands you use to no avail.  One
> big stumbling block seems to be how we create/set-up tempdir.  Is that
> supposed to be a pre-created git checkout, or created via git-archive,
> or .. ?

What I was trying to say earlier is that you have two choices based on
how efficient you want to make it. The simple way is to use git-archive:

  $ cat <<EOF >.git/hooks/update
  #!/bin/sh
  tempdir=`mktemp -d`
  trap 'rm -rf "$tempdir"' 0
  git archive --format=tar "$3" | tar -C "$tempdir" -xf -
  cd "$tempdir" && do_your_syntax_check || exit 1
  EOF

which will create the temp directory from scratch each time. If you have
a big tree, though, that can be quite inefficient to do on each push.

The other option is to ask git to update the temp directory with just
the changes. That was shown in my first example above: we load git's
concept of what the tree should look like (given by the commit id, which
in turn points to a tree id) into an index, which is git's mechanism for
interfacing between committed storage and the filesystem. Then we ask it
to sync what's in the filesystem with what's in the index. So it should
be much more efficient, but as you can see, less obvious (and I didn't
actually test that what I wrote works at all; it was just meant to point
you in the right direction).

However, all of that being said, if you just want:

> Also, we actually just want to check the syntax of the files that were
> changed in the commit, not the whole tree.  Will your method give us
> access to the path names of the files that changed?

That is simpler, especially if you can feed the files to your
syntax-checker over stdin. You just need to enumerate the files, and
then ask git to dump each one:

  #!/bin/sh
  git diff-tree -r "$3" |
  while read old_mode new_mode old_sha1 new_sha1 status name; do
    # skip lines showing parent commit
    test -z "$new_sha1" && continue;
    if ! git cat-file blob $new_sha1 | your_syntax_checker; then
      echo >&2 "syntax check failed: $name ($new_sha1)"
      exit 1
    fi
  done

Make sense?

-Peff

  reply	other threads:[~2009-05-14  6:55 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-05-08 19:43 Syntax check via update hook? Mark Plaksin
2009-05-09 14:47 ` Jeff King
2009-05-12 19:16   ` Mark Plaksin
2009-05-14  6:55     ` Jeff King [this message]
2009-05-14 19:52       ` Mark Plaksin
2009-05-20 15:13         ` Mark Plaksin
2009-05-20 15:22           ` Jeff King
2009-05-20 20:57             ` Mark Plaksin

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=20090514065544.GC10411@coredump.intra.peff.net \
    --to=peff@peff.net \
    --cc=git@vger.kernel.org \
    --cc=happy@usg.edu \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).