diff --git a/middleware/git/git.go b/middleware/git/git.go index 3a5fda59c..60ab0c80a 100644 --- a/middleware/git/git.go +++ b/middleware/git/git.go @@ -2,29 +2,19 @@ package git import ( "fmt" - "github.com/mholt/caddy/middleware" - "net/http" + "log" "net/url" "path/filepath" "runtime" "strconv" "strings" "time" + + "github.com/mholt/caddy/middleware" ) -// Git represents a middleware instance that pulls git repository. -type Git struct { - Next middleware.Handler - Repo *Repo -} - -// ServeHTTP satisfies the middleware.Handler interface. -func (g Git) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { - if err := g.Repo.Pull(); err != nil { - return 500, err - } - return g.Next.ServeHTTP(w, r) -} +// Logger is used to log errors; if nil, the default log.Logger is used. +var Logger *log.Logger // New creates a new instance of git middleware. func New(c middleware.Controller) (middleware.Middleware, error) { @@ -32,10 +22,30 @@ func New(c middleware.Controller) (middleware.Middleware, error) { if err != nil { return nil, err } - err = repo.Pull() - return func(next middleware.Handler) middleware.Handler { - return Git{Next: next, Repo: repo} - }, err + + c.Startup(func() error { + // Startup functions are blocking; start + // 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) { diff --git a/middleware/git/gitclient.go b/middleware/git/gitclient.go index b62069f3f..80c78e18f 100644 --- a/middleware/git/gitclient.go +++ b/middleware/git/gitclient.go @@ -31,28 +31,13 @@ type Repo struct { Branch string // Git branch KeyPath string // Path to private ssh key 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 sync.Mutex } -// Pull requests a repository pull. -// If it has been performed previously, it returns -// and requests another pull in background. -// Otherwise it waits until the pull is done. +// Pull performs git clone, or git pull if repository exists 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() defer r.Unlock() // if it is less than interval since last pull, return