Commit 49bb3f13 authored by Matthew Holt's avatar Matthew Holt

git: Service routine, customizable logger, no more HTTP handler

parent 53a89c95
...@@ -2,29 +2,19 @@ package git ...@@ -2,29 +2,19 @@ package git
import ( import (
"fmt" "fmt"
"github.com/mholt/caddy/middleware" "log"
"net/http"
"net/url" "net/url"
"path/filepath" "path/filepath"
"runtime" "runtime"
"strconv" "strconv"
"strings" "strings"
"time" "time"
)
// Git represents a middleware instance that pulls git repository. "github.com/mholt/caddy/middleware"
type Git struct { )
Next middleware.Handler
Repo *Repo
}
// ServeHTTP satisfies the middleware.Handler interface. // Logger is used to log errors; if nil, the default log.Logger is used.
func (g Git) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { var Logger *log.Logger
if err := g.Repo.Pull(); err != nil {
return 500, err
}
return g.Next.ServeHTTP(w, r)
}
// New creates a new instance of git middleware. // New creates a new instance of git middleware.
func New(c middleware.Controller) (middleware.Middleware, error) { func New(c middleware.Controller) (middleware.Middleware, error) {
...@@ -32,10 +22,30 @@ func New(c middleware.Controller) (middleware.Middleware, error) { ...@@ -32,10 +22,30 @@ func New(c middleware.Controller) (middleware.Middleware, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
err = repo.Pull()
return func(next middleware.Handler) middleware.Handler { c.Startup(func() error {
return Git{Next: next, Repo: repo} // Startup functions are blocking; start
}, err // service routine in background
go func() {
for {
time.Sleep(repo.Interval)
err := repo.Pull()
if err != nil {
if Logger == nil {
log.Println(err)
} else {
Logger.Println(err)
}
}
}
}()
// Do a pull right away to return error
return repo.Pull()
})
return nil, err
} }
func parse(c middleware.Controller) (*Repo, error) { func parse(c middleware.Controller) (*Repo, error) {
......
...@@ -31,28 +31,13 @@ type Repo struct { ...@@ -31,28 +31,13 @@ type Repo struct {
Branch string // Git branch Branch string // Git branch
KeyPath string // Path to private ssh key KeyPath string // Path to private ssh key
Interval time.Duration // Interval between pulls Interval time.Duration // Interval between pulls
pulled bool // true if there is a successful pull pulled bool // true if there was a successful pull
lastPull time.Time // time of the last successful pull lastPull time.Time // time of the last successful pull
sync.Mutex sync.Mutex
} }
// Pull requests a repository pull. // Pull performs git clone, or git pull if repository exists
// If it has been performed previously, it returns
// and requests another pull in background.
// Otherwise it waits until the pull is done.
func (r *Repo) Pull() error { func (r *Repo) Pull() error {
// if site is not pulled, pull
if !r.pulled {
return pull(r)
}
// request pull in background
go pull(r)
return nil
}
// pull performs git clone, or git pull if repository exists
func pull(r *Repo) error {
r.Lock() r.Lock()
defer r.Unlock() defer r.Unlock()
// if it is less than interval since last pull, return // if it is less than interval since last pull, return
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment