41 lines
1.3 KiB
Scheme
41 lines
1.3 KiB
Scheme
#lang scheme
|
|
(require "svn.ss"
|
|
"retry.ss")
|
|
|
|
(define current-monitoring-interval-seconds
|
|
(make-parameter 60))
|
|
|
|
(define (monitor-svn repos start-rev notify-newer! notify-user!)
|
|
(define (monitor-w/o-wait prev-rev)
|
|
(define all-logs
|
|
(svn-revision-logs-after prev-rev repos))
|
|
(define new-logs
|
|
(filter-not
|
|
(lambda (l) (= (svn-rev-log-num l) prev-rev))
|
|
all-logs))
|
|
(match new-logs
|
|
[(list)
|
|
; There has not yet been more revisions
|
|
(monitor prev-rev)]
|
|
[(cons log newer)
|
|
(define new-rev (svn-rev-log-num log))
|
|
; Notify of newer ones
|
|
(notify-newer! newer)
|
|
; There was a commit that we care about. Notify, then recur
|
|
(retry-until-success
|
|
(format "Notifying of revision ~a" new-rev)
|
|
(notify-user! prev-rev new-rev log))
|
|
(monitor new-rev)]))
|
|
(define (monitor prev-rev)
|
|
(sleep (current-monitoring-interval-seconds))
|
|
(monitor-w/o-wait prev-rev))
|
|
(monitor-w/o-wait start-rev))
|
|
|
|
(provide/contract
|
|
[current-monitoring-interval-seconds
|
|
(parameter/c exact-nonnegative-integer?)]
|
|
[monitor-svn
|
|
(string? exact-nonnegative-integer?
|
|
((listof svn-rev-log?) . -> . void)
|
|
(exact-nonnegative-integer? exact-nonnegative-integer? svn-rev-log? . -> . void)
|
|
. -> . any)]) |