diff options
author | Unknwon <u@gogs.io> | 2017-01-31 18:40:38 -0500 |
---|---|---|
committer | Unknwon <u@gogs.io> | 2017-01-31 18:40:38 -0500 |
commit | d293aa9ced0108b3342053c34ed9147de1c8f2af (patch) | |
tree | 5fb13ee3d4851703ae67c5fa58b4cb0fb66f0b90 /models/repo_mirror.go | |
parent | 0cfcaca351b78e3e2affd030d110662c537d6328 (diff) |
Do a fast-fail testing on repository URL before mirroring
To ensure the URL is accessible under good condition to prevent
long blocking on URL resolution without syncing anything.
Diffstat (limited to 'models/repo_mirror.go')
-rw-r--r-- | models/repo_mirror.go | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/models/repo_mirror.go b/models/repo_mirror.go index 1ab095ea..c20397c2 100644 --- a/models/repo_mirror.go +++ b/models/repo_mirror.go @@ -13,6 +13,8 @@ import ( "github.com/go-xorm/xorm" "gopkg.in/ini.v1" + "github.com/gogits/git-module" + "github.com/gogits/gogs/modules/log" "github.com/gogits/gogs/modules/process" "github.com/gogits/gogs/modules/setting" @@ -104,6 +106,12 @@ func (m *Mirror) Address() string { return HandleCloneUserCredentials(m.address, false) } +// MosaicsAddress returns mirror address from Git repository config with credentials under mosaics. +func (m *Mirror) MosaicsAddress() string { + m.readAddress() + return HandleCloneUserCredentials(m.address, true) +} + // FullAddress returns mirror address from Git repository config. func (m *Mirror) FullAddress() string { m.readAddress() @@ -128,11 +136,23 @@ func (m *Mirror) runSync() bool { wikiPath := m.Repo.WikiPath() timeout := time.Duration(setting.Git.Timeout.Mirror) * time.Second + // Do a fast-fail testing against on repository URL to ensure it is accessible under + // good condition to prevent long blocking on URL resolution without syncing anything. + if !git.IsRepoURLAccessible(git.NetworkOptions{ + URL: m.FullAddress(), + Timeout: 10 * time.Second, + }) { + desc := fmt.Sprintf("Mirror repository URL is not accessible: %s", m.MosaicsAddress()) + if err := CreateRepositoryNotice(desc); err != nil { + log.Error(4, "CreateRepositoryNotice: %v", err) + } + return false + } + gitArgs := []string{"remote", "update"} if m.EnablePrune { gitArgs = append(gitArgs, "--prune") } - if _, stderr, err := process.ExecDir( timeout, repoPath, fmt.Sprintf("Mirror.runSync: %s", repoPath), "git", gitArgs...); err != nil { |