|
@@ -308,28 +308,6 @@ func MirrorRepository(repoId int64, userName, repoName, repoPath, url string) er
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
-// MirrorUpdate checks and updates mirror repositories.
|
|
|
-func MirrorUpdate() {
|
|
|
- if err := x.Iterate(new(Mirror), func(idx int, bean interface{}) error {
|
|
|
- m := bean.(*Mirror)
|
|
|
- if m.NextUpdate.After(time.Now()) {
|
|
|
- return nil
|
|
|
- }
|
|
|
-
|
|
|
- repoPath := filepath.Join(setting.RepoRootPath, m.RepoName+".git")
|
|
|
- if _, stderr, err := process.ExecDir(10*time.Minute,
|
|
|
- repoPath, fmt.Sprintf("MirrorUpdate: %s", repoPath),
|
|
|
- "git", "remote", "update"); err != nil {
|
|
|
- return errors.New("git remote update: " + stderr)
|
|
|
- }
|
|
|
-
|
|
|
- m.NextUpdate = time.Now().Add(time.Duration(m.Interval) * time.Hour)
|
|
|
- return UpdateMirror(m)
|
|
|
- }); err != nil {
|
|
|
- log.Error(4, "repo.MirrorUpdate: %v", err)
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
// MigrateRepository migrates a existing repository from other project hosting.
|
|
|
func MigrateRepository(u *User, name, desc string, private, mirror bool, url string) (*Repository, error) {
|
|
|
repo, err := CreateRepository(u, name, desc, "", "", private, mirror, false)
|
|
@@ -1173,8 +1151,48 @@ func DeleteRepositoryArchives() error {
|
|
|
})
|
|
|
}
|
|
|
|
|
|
+var (
|
|
|
+ // Prevent duplicate tasks.
|
|
|
+ isMirrorUpdating = false
|
|
|
+ isGitFscking = false
|
|
|
+)
|
|
|
+
|
|
|
+// MirrorUpdate checks and updates mirror repositories.
|
|
|
+func MirrorUpdate() {
|
|
|
+ if isMirrorUpdating {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ isMirrorUpdating = true
|
|
|
+ defer func() { isMirrorUpdating = false }()
|
|
|
+
|
|
|
+ if err := x.Iterate(new(Mirror), func(idx int, bean interface{}) error {
|
|
|
+ m := bean.(*Mirror)
|
|
|
+ if m.NextUpdate.After(time.Now()) {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+ repoPath := filepath.Join(setting.RepoRootPath, m.RepoName+".git")
|
|
|
+ if _, stderr, err := process.ExecDir(10*time.Minute,
|
|
|
+ repoPath, fmt.Sprintf("MirrorUpdate: %s", repoPath),
|
|
|
+ "git", "remote", "update"); err != nil {
|
|
|
+ return errors.New("git remote update: " + stderr)
|
|
|
+ }
|
|
|
+
|
|
|
+ m.NextUpdate = time.Now().Add(time.Duration(m.Interval) * time.Hour)
|
|
|
+ return UpdateMirror(m)
|
|
|
+ }); err != nil {
|
|
|
+ log.Error(4, "repo.MirrorUpdate: %v", err)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
// GitFsck calls 'git fsck' to check repository health.
|
|
|
func GitFsck() {
|
|
|
+ if isGitFscking {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ isGitFscking = true
|
|
|
+ defer func() { isGitFscking = false }()
|
|
|
+
|
|
|
args := append([]string{"fsck"}, setting.GitFsckArgs...)
|
|
|
if err := x.Where("id > 0").Iterate(new(Repository),
|
|
|
func(idx int, bean interface{}) error {
|