From 710245e81e0d65c72231dbb3b5c9f860cdc71899 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 15 May 2019 09:57:00 +0800 Subject: [PATCH] Refactor models.NewRepoContext to extract git related codes to modules/git (#6941) * refactor models.NewRepoContext to extract git related codes to modules/git * fix imports * refactor --- models/repo.go | 47 +++----------------------------------- modules/git/git.go | 26 +++++++++++++++++++-- modules/setting/git.go | 3 ++- modules/setting/setting.go | 3 +++ routers/admin/admin.go | 3 ++- routers/init.go | 1 - 6 files changed, 34 insertions(+), 49 deletions(-) diff --git a/models/repo.go b/models/repo.go index 2f87e2f514..b37120236f 100644 --- a/models/repo.go +++ b/models/repo.go @@ -13,7 +13,6 @@ import ( "io/ioutil" "net/url" "os" - "os/exec" "path" "path/filepath" "regexp" @@ -32,11 +31,9 @@ import ( "code.gitea.io/gitea/modules/sync" "code.gitea.io/gitea/modules/util" - "github.com/Unknwon/cae/zip" "github.com/Unknwon/com" "github.com/go-xorm/builder" "github.com/go-xorm/xorm" - version "github.com/mcuadros/go-version" ini "gopkg.in/ini.v1" ) @@ -67,8 +64,8 @@ var ( ItemsPerPage = 40 ) -// LoadRepoConfig loads the repository config -func LoadRepoConfig() { +// loadRepoConfig loads the repository config +func loadRepoConfig() { // Load .gitignore and license files and readme templates. types := []string{"gitignore", "license", "readme", "label"} typeFiles := make([][]string, 4) @@ -119,45 +116,7 @@ func LoadRepoConfig() { // NewRepoContext creates a new repository context func NewRepoContext() { - zip.Verbose = false - - // Check Git installation. - if _, err := exec.LookPath("git"); err != nil { - log.Fatal("Failed to test 'git' command: %v (forgotten install?)", err) - } - - // Check Git version. - var err error - setting.Git.Version, err = git.BinVersion() - if err != nil { - log.Fatal("Failed to get Git version: %v", err) - } - - log.Info("Git Version: %s", setting.Git.Version) - if version.Compare("1.7.1", setting.Git.Version, ">") { - log.Fatal("Gitea requires Git version greater or equal to 1.7.1") - } - - // Git requires setting user.name and user.email in order to commit changes. - for configKey, defaultValue := range map[string]string{"user.name": "Gitea", "user.email": "gitea@fake.local"} { - if stdout, stderr, err := process.GetManager().Exec("NewRepoContext(get setting)", "git", "config", "--get", configKey); err != nil || strings.TrimSpace(stdout) == "" { - // ExitError indicates this config is not set - if _, ok := err.(*exec.ExitError); ok || strings.TrimSpace(stdout) == "" { - if _, stderr, gerr := process.GetManager().Exec("NewRepoContext(set "+configKey+")", "git", "config", "--global", configKey, defaultValue); gerr != nil { - log.Fatal("Failed to set git %s(%s): %s", configKey, gerr, stderr) - } - log.Info("Git config %s set to %s", configKey, defaultValue) - } else { - log.Fatal("Failed to get git %s(%s): %s", configKey, err, stderr) - } - } - } - - // Set git some configurations. - if _, stderr, err := process.GetManager().Exec("NewRepoContext(git config --global core.quotepath false)", - "git", "config", "--global", "core.quotepath", "false"); err != nil { - log.Fatal("Failed to execute 'git config --global core.quotepath false': %s", stderr) - } + loadRepoConfig() RemoveAllWithNotice("Clean up repository temporary data", filepath.Join(setting.AppDataPath, "tmp")) } diff --git a/modules/git/git.go b/modules/git/git.go index abae0423c2..632af539cc 100644 --- a/modules/git/git.go +++ b/modules/git/git.go @@ -11,6 +11,8 @@ import ( "strings" "time" + "code.gitea.io/gitea/modules/process" + "github.com/mcuadros/go-version" ) @@ -31,6 +33,8 @@ var ( // GitExecutable is the command name of git // Could be updated to an absolute path while initialization GitExecutable = "git" + + gitVersion string ) func log(format string, args ...interface{}) { @@ -46,8 +50,6 @@ func log(format string, args ...interface{}) { } } -var gitVersion string - // BinVersion returns current Git version from shell. func BinVersion() (string, error) { if len(gitVersion) > 0 { @@ -89,6 +91,26 @@ func init() { if version.Compare(gitVersion, GitVersionRequired, "<") { panic(fmt.Sprintf("Git version not supported. Requires version > %v", GitVersionRequired)) } + + // Git requires setting user.name and user.email in order to commit changes. + for configKey, defaultValue := range map[string]string{"user.name": "Gitea", "user.email": "gitea@fake.local"} { + if stdout, stderr, err := process.GetManager().Exec("git.Init(get setting)", GitExecutable, "config", "--get", configKey); err != nil || strings.TrimSpace(stdout) == "" { + // ExitError indicates this config is not set + if _, ok := err.(*exec.ExitError); ok || strings.TrimSpace(stdout) == "" { + if _, stderr, gerr := process.GetManager().Exec("git.Init(set "+configKey+")", "git", "config", "--global", configKey, defaultValue); gerr != nil { + panic(fmt.Sprintf("Failed to set git %s(%s): %s", configKey, gerr, stderr)) + } + } else { + panic(fmt.Sprintf("Failed to get git %s(%s): %s", configKey, err, stderr)) + } + } + } + + // Set git some configurations. + if _, stderr, err := process.GetManager().Exec("git.Init(git config --global core.quotepath false)", + GitExecutable, "config", "--global", "core.quotepath", "false"); err != nil { + panic(fmt.Sprintf("Failed to execute 'git config --global core.quotepath false': %s", stderr)) + } } // Fsck verifies the connectivity and validity of the objects in the database diff --git a/modules/setting/git.go b/modules/setting/git.go index 0ad16fc81e..8625c0e780 100644 --- a/modules/setting/git.go +++ b/modules/setting/git.go @@ -16,7 +16,6 @@ import ( var ( // Git settings Git = struct { - Version string `ini:"-"` DisableDiffHighlight bool MaxGitDiffLines int MaxGitDiffLineCharacters int @@ -65,6 +64,8 @@ func newGit() { log.Fatal("Error retrieving git version: %v", err) } + log.Info("Git Version: %s", binVersion) + if version.Compare(binVersion, "2.9", ">=") { // Explicitly disable credential helper, otherwise Git credentials might leak git.GlobalCommandArgs = append(git.GlobalCommandArgs, "-c", "credential.helper=") diff --git a/modules/setting/setting.go b/modules/setting/setting.go index 461e394a62..de89c67d04 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -27,6 +27,7 @@ import ( _ "code.gitea.io/gitea/modules/minwinsvc" // import minwinsvc for windows services "code.gitea.io/gitea/modules/user" + "github.com/Unknwon/cae/zip" "github.com/Unknwon/com" _ "github.com/go-macaron/cache/memcache" // memcache plugin for cache _ "github.com/go-macaron/cache/redis" @@ -931,6 +932,8 @@ func NewContext() { sec = Cfg.Section("U2F") U2F.TrustedFacets, _ = shellquote.Split(sec.Key("TRUSTED_FACETS").MustString(strings.TrimRight(AppURL, "/"))) U2F.AppID = sec.Key("APP_ID").MustString(strings.TrimRight(AppURL, "/")) + + zip.Verbose = false } func loadInternalToken(sec *ini.Section) string { diff --git a/routers/admin/admin.go b/routers/admin/admin.go index 7b8422fc61..0e6fa2c242 100644 --- a/routers/admin/admin.go +++ b/routers/admin/admin.go @@ -18,6 +18,7 @@ import ( "code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/cron" + "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/process" "code.gitea.io/gitea/modules/setting" ) @@ -210,7 +211,7 @@ func Config(ctx *context.Context) { ctx.Data["DisableRouterLog"] = setting.DisableRouterLog ctx.Data["RunUser"] = setting.RunUser ctx.Data["RunMode"] = strings.Title(macaron.Env) - ctx.Data["GitVersion"] = setting.Git.Version + ctx.Data["GitVersion"], _ = git.BinVersion() ctx.Data["RepoRootPath"] = setting.RepoRootPath ctx.Data["CustomRootPath"] = setting.CustomPath ctx.Data["StaticRootPath"] = setting.StaticRootPath diff --git a/routers/init.go b/routers/init.go index 47f837c523..88422cc6ed 100644 --- a/routers/init.go +++ b/routers/init.go @@ -86,7 +86,6 @@ func GlobalInit() { log.Fatal("Failed to initialize OAuth2 support: %v", err) } - models.LoadRepoConfig() models.NewRepoContext() // Booting long running goroutines.