49 lines
1.6 KiB
Racket
49 lines
1.6 KiB
Racket
#lang racket
|
|
(require "../lib/pqueue.rkt"
|
|
"../lib/db.rkt"
|
|
"scm.rkt")
|
|
|
|
(define-syntax-rule (atomic e ...)
|
|
(begin e ...))
|
|
|
|
(define (main . argv)
|
|
(define push-queue (make-parameter #f))
|
|
(define the-db (make-parameter #f))
|
|
(define repo (make-parameter #f))
|
|
(define monitoring-interval (make-parameter 60))
|
|
(command-line
|
|
#:program "monitor"
|
|
#:argv argv
|
|
#:once-each
|
|
[("--interval") num "Monitoring interval" (monitoring-interval (string->number num))]
|
|
[("--repo") dir "Local Git repository" (repo (string->path dir))]
|
|
[("--pushes") dir "Persistent queue of pushes" (push-queue dir)]
|
|
[("--db") spec "Specification of database" (the-db spec)])
|
|
; Setup the queue to receive push information
|
|
(define pushes (pqueue (push-queue)))
|
|
(pqueue-init! pushes)
|
|
|
|
(define db (db-connect (the-db)))
|
|
; While true
|
|
(let loop ()
|
|
; Read the short term database to find out what push we're at
|
|
(define current (db-ref db "monitor" "last-push"))
|
|
; Update the git repository
|
|
(git-update (repo))
|
|
; Check the online push counter
|
|
(for ([new (in-list (git-pushes-after current))])
|
|
; Get the information about a push
|
|
(define push-info (get-git-push (repo) new))
|
|
(atomic
|
|
; Add it to the queue
|
|
(pqueue-enqueue! pushes push-info)
|
|
; Add it to the long term database
|
|
(db-set! db push-info "push-info" new)
|
|
; Update the latest push in the short term database
|
|
(db-set! db new "monitor" "last-push")))
|
|
; Wait
|
|
(sleep (monitoring-interval))
|
|
(loop))
|
|
(db-close! db))
|
|
|
|
(provide main) |