mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	fix #706 and other mirror improve
This commit is contained in:
		@@ -26,6 +26,7 @@ The goal of this project is to make the easiest, fastest and most painless way t
 | 
				
			|||||||
- See [Trello Board](https://trello.com/b/uxAoeLUl/gogs-go-git-service) to follow the develop team.
 | 
					- See [Trello Board](https://trello.com/b/uxAoeLUl/gogs-go-git-service) to follow the develop team.
 | 
				
			||||||
- Try it before anything? Do it [online](https://try.gogs.io/Unknown/gogs) or go down to **Installation -> Install from binary** section!
 | 
					- Try it before anything? Do it [online](https://try.gogs.io/Unknown/gogs) or go down to **Installation -> Install from binary** section!
 | 
				
			||||||
- Having troubles? Get help from [Troubleshooting](http://gogs.io/docs/intro/troubleshooting.md).
 | 
					- Having troubles? Get help from [Troubleshooting](http://gogs.io/docs/intro/troubleshooting.md).
 | 
				
			||||||
 | 
					- Want to help on localization? Check out [Crowdin](https://crowdin.com/project/gogs)!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Features
 | 
					## Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,6 +17,7 @@ Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自
 | 
				
			|||||||
- 您可以到 [Trello Board](https://trello.com/b/uxAoeLUl/gogs-go-git-service) 跟随开发团队的脚步。
 | 
					- 您可以到 [Trello Board](https://trello.com/b/uxAoeLUl/gogs-go-git-service) 跟随开发团队的脚步。
 | 
				
			||||||
- 想要先睹为快?通过 [在线体验](https://try.gogs.io/Unknown/gogs) 或查看 **安装部署 -> 二进制安装** 小节。
 | 
					- 想要先睹为快?通过 [在线体验](https://try.gogs.io/Unknown/gogs) 或查看 **安装部署 -> 二进制安装** 小节。
 | 
				
			||||||
- 使用过程中遇到问题?尝试从 [故障排查](http://gogs.io/docs/intro/troubleshooting.md) 页面获取帮助。
 | 
					- 使用过程中遇到问题?尝试从 [故障排查](http://gogs.io/docs/intro/troubleshooting.md) 页面获取帮助。
 | 
				
			||||||
 | 
					- 希望帮助多国语言界面的翻译吗?请立即访问 [Crowdin](https://crowdin.com/project/gogs)!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 功能特性
 | 
					## 功能特性
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -308,28 +308,6 @@ func MirrorRepository(repoId int64, userName, repoName, repoPath, url string) er
 | 
				
			|||||||
	return nil
 | 
						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.
 | 
					// MigrateRepository migrates a existing repository from other project hosting.
 | 
				
			||||||
func MigrateRepository(u *User, name, desc string, private, mirror bool, url string) (*Repository, error) {
 | 
					func MigrateRepository(u *User, name, desc string, private, mirror bool, url string) (*Repository, error) {
 | 
				
			||||||
	repo, err := CreateRepository(u, name, desc, "", "", private, mirror, false)
 | 
						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.
 | 
					// GitFsck calls 'git fsck' to check repository health.
 | 
				
			||||||
func GitFsck() {
 | 
					func GitFsck() {
 | 
				
			||||||
 | 
						if isGitFscking {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						isGitFscking = true
 | 
				
			||||||
 | 
						defer func() { isGitFscking = false }()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	args := append([]string{"fsck"}, setting.GitFsckArgs...)
 | 
						args := append([]string{"fsck"}, setting.GitFsckArgs...)
 | 
				
			||||||
	if err := x.Where("id > 0").Iterate(new(Repository),
 | 
						if err := x.Where("id > 0").Iterate(new(Repository),
 | 
				
			||||||
		func(idx int, bean interface{}) error {
 | 
							func(idx int, bean interface{}) error {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user