Browse Source

finish mirror fix #63

Unknown 11 years ago
parent
commit
9ffa8a4083
4 changed files with 49 additions and 4 deletions
  1. 4 4
      .gopmfile
  2. 26 0
      models/repo.go
  3. 17 0
      modules/cron/cron.go
  4. 2 0
      routers/install.go

+ 4 - 4
.gopmfile

@@ -4,22 +4,22 @@ path = github.com/gogits/gogs
 [deps]
 github.com/codegangsta/cli = 
 github.com/go-martini/martini = 
-github.com/Unknwon/com = 
-github.com/Unknwon/cae = 
-github.com/Unknwon/goconfig = 
 github.com/nfnt/resize = 
 github.com/lunny/xorm = 
 github.com/go-sql-driver/mysql = 
 github.com/lib/pq = 
 github.com/qiniu/log = 
+github.com/robfig/cron = 
 code.google.com/p/goauth2 = 
+github.com/Unknwon/com = 
+github.com/Unknwon/cae = 
+github.com/Unknwon/goconfig = 
 github.com/gogits/logs = 
 github.com/gogits/binding = 
 github.com/gogits/git = 
 github.com/gogits/gfm = 
 github.com/gogits/cache = 
 github.com/gogits/session = 
-github.com/gogits/webdav = 
 
 [res]
 include = templates|public|conf

+ 26 - 0
models/repo.go

@@ -130,6 +130,32 @@ type Mirror struct {
 	NextUpdate time.Time
 }
 
+// MirrorUpdate checks and updates mirror repositories.
+func MirrorUpdate() {
+	if err := orm.Iterate(new(Mirror), func(idx int, bean interface{}) error {
+		m := bean.(*Mirror)
+		if m.NextUpdate.After(time.Now()) {
+			return nil
+		}
+
+		repoPath := filepath.Join(base.RepoRootPath, m.RepoName+".git")
+		_, stderr, err := com.ExecCmdDir(repoPath, "git", "remote", "update")
+		if err != nil {
+			return err
+		} else if strings.Contains(stderr, "fatal:") {
+			return errors.New(stderr)
+		} else if err = git.UnpackRefs(repoPath); err != nil {
+			return err
+		}
+
+		m.NextUpdate = time.Now().Add(time.Duration(m.Interval) * time.Hour)
+		_, err = orm.Id(m.Id).Update(m)
+		return err
+	}); err != nil {
+		log.Error("repo.MirrorUpdate: %v", err)
+	}
+}
+
 // MirrorRepository creates a mirror repository from source.
 func MirrorRepository(repoId int64, userName, repoName, repoPath, url string) error {
 	_, stderr, err := com.ExecCmd("git", "clone", "--mirror", url, repoPath)

+ 17 - 0
modules/cron/cron.go

@@ -0,0 +1,17 @@
+// Copyright 2014 The Gogs Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package cron
+
+import (
+	"github.com/robfig/cron"
+
+	"github.com/gogits/gogs/models"
+)
+
+func NewCronContext() {
+	c := cron.New()
+	c.AddFunc("@every 1h", models.MirrorUpdate)
+	c.Start()
+}

+ 2 - 0
routers/install.go

@@ -18,6 +18,7 @@ import (
 	"github.com/gogits/gogs/models"
 	"github.com/gogits/gogs/modules/auth"
 	"github.com/gogits/gogs/modules/base"
+	"github.com/gogits/gogs/modules/cron"
 	"github.com/gogits/gogs/modules/log"
 	"github.com/gogits/gogs/modules/mailer"
 	"github.com/gogits/gogs/modules/middleware"
@@ -49,6 +50,7 @@ func GlobalInit() {
 		}
 
 		models.HasEngine = true
+		cron.NewCronContext()
 	}
 	base.NewServices()
 	checkRunMode()