# Svn pre-commit hook

**URL:** <https://www.ruby-forum.com/t/svn-pre-commit-hook/79707>\
**Category:** Ruby\
**Created:** [March 10, 2006, 10:29pm UTC](https://www.ruby-forum.com/t/svn-pre-commit-hook/79707 "2006-03-10T22:29:46Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Bil\_K](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/848f3c/32.png) [@Bil\_K](https://www.ruby-forum.com/u/Bil_K)\
**Post date:** [March 10, 2006, 10:29pm UTC](https://www.ruby-forum.com/t/svn-pre-commit-hook/79707/1 "2006-03-10T22:29:46Z")

</div>

OK, I give up.

Can someone (Kou?) please sketch out how to intercept  
a Subversion transaction with a pre-commit hook and  
throw each file matching, say, /.rb$/ to some StyleChecker?

Based on Kou’s svnlook,

[https://svn.collab.net/repos/svn/trunk/tools/examples/svnlook.rb](https://svn.collab.net/repos/svn/trunk/tools/examples/svnlook.rb)

and the bindings,

[http://svn.collab.net/repos/svn/trunk/subversion/bindings/swig/ruby/svn/](http://svn.collab.net/repos/svn/trunk/subversion/bindings/swig/ruby/svn/)

it seems that Svn:Fs might be the answer, but I’m having  
trouble figuring out SVN transactions – the manual says  
very little about these creatures.

Thanks,

---

<div class="post-metadata">

**Author:** ![Bil\_K](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/848f3c/32.png) [@Bil\_K](https://www.ruby-forum.com/u/Bil_K)\
**Post date:** [March 10, 2006, 10:44pm UTC](https://www.ruby-forum.com/t/svn-pre-commit-hook/79707/2 "2006-03-10T22:44:54Z")

</div>

Bil K. wrote:

> and the bindings,  
> [http://fun3d.larc.nasa.gov](http://fun3d.larc.nasa.gov)

I don’t know about pre-commit hooks, but here’s a post-commit hook I  
wrote the other day. Not fancy or anything, but will maybe give you an  
idea?  
I just used the normal ‘svnlook’.

> deleted = Array.new  
> modified \<\< changed[1…-1]
> 
> end  
> repository = ARGV[0]  
> From: SVN [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)
> 
> ```
> smtp.send_message(message, 'removed_email_address@domain.invalid', recipients)
> 
> ```
> 
> }

-Justin

---

<div class="post-metadata">

**Author:** ![Bil\_K](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/848f3c/32.png) [@Bil\_K](https://www.ruby-forum.com/u/Bil_K)\
**Post date:** [March 10, 2006, 11:06pm UTC](https://www.ruby-forum.com/t/svn-pre-commit-hook/79707/3 "2006-03-10T23:06:24Z")

</div>

Justin C. wrote:

> I don’t know about pre-commit hooks, but here’s a post-commit hook I  
> wrote the other day. Not fancy or anything, but will maybe give you an  
> idea?

Thanks.

> I just used the normal ‘svnlook’.

If you have the SVN Ruby bindings compiled, you could use Kouhei’s  
commit-email.rb for post-hook mailings (and RSS feed):

[https://svn.collab.net/repos/svn/trunk/tools/hook-scripts/commit-email.rb](https://svn.collab.net/repos/svn/trunk/tools/hook-scripts/commit-email.rb)

If you want HTML output also, see

[https://svn.collab.net/repos/svn/trunk/tools/examples/svnlog2html.rb](https://svn.collab.net/repos/svn/trunk/tools/examples/svnlog2html.rb)

Regards,

---

<div class="post-metadata">

**Author:** ![Bil\_K](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/848f3c/32.png) [@Bil\_K](https://www.ruby-forum.com/u/Bil_K)\
**Post date:** [March 13, 2006, 4:00pm UTC](https://www.ruby-forum.com/t/svn-pre-commit-hook/79707/4 "2006-03-13T16:00:43Z")

</div>

Hi,

In [dusqov$mbv$removed\_email\_address@domain.invalid](mailto:dusqov$mbv$removed_email_address@domain.invalid)  
“svn pre-commit hook” on Sat, 11 Mar 2006 06:28:43 +0900,  
Bil K. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Can someone (Kou?) please sketch out how to intercept  
> a Subversion transaction with a pre-commit hook and  
> throw each file matching, say, /.rb$/ to some StyleChecker?

What about attached script?

You can use the attached script with the following  
pre-commit script:

#!/bin/sh

REPOS=“$1”  
TXN=“$2”

/…/ruby   
/…/pre-check-file.rb “$REPOS” “$TXN”   
-p PATTERN1 -c CHECK\_COMMAND1   
-p PATTERN2 -c CHECK\_COMMAND2   
…   
|| exit 1

exit 0

For example (reject space indented Ruby scripts and C programs):

#!/bin/sh

REPOS=“$1”  
TXN=“$2”

/usr/bin/ruby   
~/work/ruby/pre-check-file.rb “$REPOS” “$TXN”   
-p .rb$ -c 'grep -v ^ ’   
-p .c$ -c 'grep -v ^ ’   
|| exit 1

exit 0

Thanks,

---

<div class="post-metadata">

**Author:** ![Bil\_K](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/848f3c/32.png) [@Bil\_K](https://www.ruby-forum.com/u/Bil_K)\
**Post date:** [March 13, 2006, 4:16pm UTC](https://www.ruby-forum.com/t/svn-pre-commit-hook/79707/5 "2006-03-13T16:16:04Z")

</div>

Kouhei S. wrote:

> Hi,

Hello.

> What about attached script?

Excellent, Thanks!

This is the nugget I most craved:

> def changed\_paths(base\_rev=nil)  
> base\_rev ||= @txn.base\_revision  
> base\_root = @fs.root(base\_rev)  
> editor = Svn::Delta::ChangedEditor.new(@root, base\_root)  
> base\_root.dir\_delta(’’, ‘’, @root, ‘’, editor)  
> (editor.added\_files + editor.updated\_files).uniq.sort  
> end

Thanks again,
