You are looking at historical revision 3316 of this page. It may differ significantly from its current revision.

Introduction

The svn-post-commit-hooks egg uses the svn-client egg to provide high-level functions useful for the creation of programs meant to run as post-commit hooks for Subversion repositories (such as svnwiki or svnblog).

Examples

Detecting changes

The post-commit-update function checks out a copy of the repository to a local directory and checks to see if there are new unprocessed commits. The proposed model for post-commit hooks is to store the last revision that the post-commit application has been able to process in a file; when executed, the first thing the application should do is call post-commit-update to check what is the last revision it has processed and process any new.

(use svn-post-commit-hooks)

(post-commit-update
  ; URL of the repository
  "https://svn.afc.no-ip.info/svn/chicken-eggs/wiki"
  ; Login to authenticate
  "anonymous"
  ; Password
  ""
  ; Local path where a copy should be checked-out/updated
  "/tmp/repository-wiki"
  ; Data file where the post-commit program stores the last commit it has
  ; successfully processed
  "/tmp/data-wiki/last-revision.txt"
  ; Function to call if the repository has indeed changed.  It receives
  ; two parameters, the last processed revision and the current revision.
  (lambda (old-revision new-revision)
    ...))

List all commits after a certain one

post-commit-get-log returns the log with all changes after a given revision (which will usually correspond to the last revision that the post-commit hook has processed).

(use stream-ext svn-post-commit-hooks)

(stream->list
  (post-commit-get-log
    ; Directory with the copy (check-out) of the repository:
    "/tmp/repository-wiki"
    ; Initial revision (return the log *after* the revision number specified):
    0
    ; Login to authenticate as:
    "anonymous"
    ; Password:
    ""))

List files that changed after a revision

The post-commit-changed-files function returns an entry with the files that have changed after a certain revision.

This is similar to post-commit-get-log (indeed it is implemented on top of it), but provides a more convenient interface (it tends to be more interesting for post-commit hooks to detect what files have changed rather than just getting a raw list with all commits).

(use svn-post-commit-hooks format-modular)

; Function to process the entry objects returned by list-changed files.  Each
; object is an entry record corresponding to a position in the file system (a
; file or a directory).  Entry records have a changes field with a list of the
; commits that affected them and a subs record with a hash-table for files in
; the current directory.

(define (process-entry entry name)
  (format #t "Location: ~A~%" name)
  (format #t "  Changes:~%")
  (for-each show-change (entry-changes entry))
  ; Recursively process sub-entries (for directories):
  (hash-table-walk
    (entry-subs entry)
    (lambda (sub-name sub-entry)
      (process-entry sub-entry (string-append name "/" sub-name)))))

; Function to show one specific change, as returned by list-changed-files in
; the subs field of the entry record.

(define (show-change change)
  (format #t "    Revision: ~A~%" (change-rev change))
  (format #t "      Seconds (date): ~A~%" (change-seconds change))
  (format #t "      Data: ~A~%" (change-data change)))

; And now lets get the entry for all changes to a repository:

(process-entry
  (post-commit-changed-files
    ; The URL of the repository or a directory with a local copy:
    "/tmp/repository-wiki"
    ; A subdirectory from the repository if we only want reports for commits
    ; affecting that directory:
    ""
    ; Login to authenticate with:
    "anonymous"
    ; Password:
    ""
    ; Initial revision (post-commit-changed-files will only return
    ; reports for commits after the one we specify).  Usually, in
    ; programs meant to run as post-commit hooks, instead of a 0,
    ; you'll pass the number of the last revision your post-commit
    ; hook processed.
    0)
  "")

Authors

This egg is made by Alejandro Forero Cuervo <azul@freaks-unidos.net>.

License

Copyright (C) 2006 Alejandro Forero Cuervo <azul@freaks-unidos.net>

The svn-post-commit-hooks egg is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

The svn-post-commit-hooks egg is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with the svn-post-commit-hooks egg; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

Version History

1.0
First release.