diff options
Diffstat (limited to 'cmd/serv.go')
-rw-r--r-- | cmd/serv.go | 161 |
1 files changed, 55 insertions, 106 deletions
diff --git a/cmd/serv.go b/cmd/serv.go index b15f4e41..57a674e5 100644 --- a/cmd/serv.go +++ b/cmd/serv.go @@ -5,7 +5,6 @@ package cmd import ( - "crypto/tls" "fmt" "os" "os/exec" @@ -14,21 +13,16 @@ import ( "time" "github.com/Unknwon/com" - "github.com/gogits/git-module" - gouuid "github.com/satori/go.uuid" "github.com/urfave/cli" log "gopkg.in/clog.v1" "github.com/gogits/gogs/models" - "github.com/gogits/gogs/modules/base" - "github.com/gogits/gogs/modules/httplib" "github.com/gogits/gogs/modules/setting" + http "github.com/gogits/gogs/routers/repo" ) const ( - _ACCESS_DENIED_MESSAGE = "Repository does not exist or you do not have access" - _ENV_UPDATE_TASK_UUID = "UPDATE_TASK_UUID" - _ENV_REPO_CUSTOM_HOOKS_PATH = "REPO_CUSTOM_HOOKS_PATH" + _ACCESS_DENIED_MESSAGE = "Repository does not exist or you do not have access" ) var Serv = cli.Command{ @@ -41,7 +35,20 @@ var Serv = cli.Command{ }, } -func setup(c *cli.Context, logPath string) { +func fail(userMessage, logMessage string, args ...interface{}) { + fmt.Fprintln(os.Stderr, "Gogs:", userMessage) + + if len(logMessage) > 0 { + if !setting.ProdMode { + fmt.Fprintf(os.Stderr, logMessage+"\n", args...) + } + log.Fatal(3, logMessage, args...) + } + + os.Exit(1) +} + +func setup(c *cli.Context, logPath string, connectDB bool) { if c.IsSet("config") { setting.CustomConf = c.String("config") } else if c.GlobalIsSet("config") { @@ -49,8 +56,13 @@ func setup(c *cli.Context, logPath string) { } setting.NewContext() - setting.NewService() + + level := log.TRACE + if setting.ProdMode { + level = log.ERROR + } log.New(log.FILE, log.FileConfig{ + Level: level, Filename: filepath.Join(setting.LogRootPath, logPath), FileRotationConfig: log.FileRotationConfig{ Rotate: true, @@ -60,6 +72,10 @@ func setup(c *cli.Context, logPath string) { }) log.Delete(log.CONSOLE) // Remove primary logger + if !connectDB { + return + } + models.LoadConfigs() if setting.UseSQLite3 { @@ -67,7 +83,9 @@ func setup(c *cli.Context, logPath string) { os.Chdir(workDir) } - models.SetEngine() + if err := models.SetEngine(); err != nil { + fail("Internal error", "SetEngine: %v", err) + } } func parseSSHCmd(cmd string) (string, string) { @@ -104,68 +122,8 @@ var ( } ) -func fail(userMessage, logMessage string, args ...interface{}) { - fmt.Fprintln(os.Stderr, "Gogs:", userMessage) - - if len(logMessage) > 0 { - if !setting.ProdMode { - fmt.Fprintf(os.Stderr, logMessage+"\n", args...) - } - log.Fatal(3, logMessage, args...) - } - - log.Shutdown() - os.Exit(1) -} - -func handleUpdateTask(uuid string, user, repoUser *models.User, reponame string, isWiki bool) { - task, err := models.GetUpdateTaskByUUID(uuid) - if err != nil { - if models.IsErrUpdateTaskNotExist(err) { - log.Trace("No update task is presented: %s", uuid) - return - } - log.Fatal(2, "GetUpdateTaskByUUID: %v", err) - } else if err = models.DeleteUpdateTaskByUUID(uuid); err != nil { - log.Fatal(2, "DeleteUpdateTaskByUUID: %v", err) - } - - if isWiki { - return - } - - if err = models.PushUpdate(models.PushUpdateOptions{ - RefFullName: task.RefName, - OldCommitID: task.OldCommitID, - NewCommitID: task.NewCommitID, - PusherID: user.ID, - PusherName: user.Name, - RepoUserName: repoUser.Name, - RepoName: reponame, - }); err != nil { - log.Error(2, "Update: %v", err) - } - - // Ask for running deliver hook and test pull request tasks. - reqURL := setting.LocalURL + repoUser.Name + "/" + reponame + "/tasks/trigger?branch=" + - strings.TrimPrefix(task.RefName, git.BRANCH_PREFIX) + "&secret=" + base.EncodeMD5(repoUser.Salt) + "&pusher=" + com.ToStr(user.ID) - log.Trace("Trigger task: %s", reqURL) - - resp, err := httplib.Head(reqURL).SetTLSClientConfig(&tls.Config{ - InsecureSkipVerify: true, - }).Response() - if err == nil { - resp.Body.Close() - if resp.StatusCode/100 != 2 { - log.Error(2, "Fail to trigger task: not 2xx response code") - } - } else { - log.Error(2, "Fail to trigger task: %v", err) - } -} - func runServ(c *cli.Context) error { - setup(c, "serv.log") + setup(c, "serv.log", true) if setting.SSH.Disabled { println("Gogs: SSH has been disabled") @@ -189,31 +147,26 @@ func runServ(c *cli.Context) error { if len(repoFields) != 2 { fail("Invalid repository path", "Invalid repository path: %v", args) } - username := strings.ToLower(repoFields[0]) - reponame := strings.ToLower(strings.TrimSuffix(repoFields[1], ".git")) + ownerName := strings.ToLower(repoFields[0]) + repoName := strings.TrimSuffix(strings.ToLower(repoFields[1]), ".git") + repoName = strings.TrimSuffix(repoName, ".wiki") - isWiki := false - if strings.HasSuffix(reponame, ".wiki") { - isWiki = true - reponame = reponame[:len(reponame)-5] - } - - repoOwner, err := models.GetUserByName(username) + owner, err := models.GetUserByName(ownerName) if err != nil { if models.IsErrUserNotExist(err) { - fail("Repository owner does not exist", "Unregistered owner: %s", username) + fail("Repository owner does not exist", "Unregistered owner: %s", ownerName) } - fail("Internal error", "Fail to get repository owner '%s': %v", username, err) + fail("Internal error", "Fail to get repository owner '%s': %v", ownerName, err) } - repo, err := models.GetRepositoryByName(repoOwner.ID, reponame) + repo, err := models.GetRepositoryByName(owner.ID, repoName) if err != nil { if models.IsErrRepoNotExist(err) { - fail(_ACCESS_DENIED_MESSAGE, "Repository does not exist: %s/%s", repoOwner.Name, reponame) + fail(_ACCESS_DENIED_MESSAGE, "Repository does not exist: %s/%s", owner.Name, repoName) } fail("Internal error", "Fail to get repository: %v", err) } - repo.Owner = repoOwner + repo.Owner = owner requestMode, ok := allowedCommands[verb] if !ok { @@ -262,6 +215,7 @@ func runServ(c *cli.Context) error { } } } else { + setting.NewService() // Check if the key can access to the repository in case of it is a deploy key (a deploy keys != user key). // A deploy key doesn't represent a signed in user, so in a site with Service.RequireSignInView activated // we should give read access only in repositories where this deploy key is in use. In other case, a server @@ -271,9 +225,18 @@ func runServ(c *cli.Context) error { } } - uuid := gouuid.NewV4().String() - os.Setenv(_ENV_UPDATE_TASK_UUID, uuid) - os.Setenv(_ENV_REPO_CUSTOM_HOOKS_PATH, filepath.Join(repo.RepoPath(), "custom_hooks")) + // Update user key activity. + if key.ID > 0 { + key, err := models.GetPublicKeyByID(key.ID) + if err != nil { + fail("Internal error", "GetPublicKeyByID: %v", err) + } + + key.Updated = time.Now() + if err = models.UpdatePublicKey(key); err != nil { + fail("Internal error", "UpdatePublicKey: %v", err) + } + } // Special handle for Windows. if setting.IsWindows { @@ -287,6 +250,9 @@ func runServ(c *cli.Context) error { } else { gitCmd = exec.Command(verb, repoFullName) } + if requestMode == models.ACCESS_MODE_WRITE { + gitCmd.Env = append(os.Environ(), http.ComposeHookEnvs(repo.RepoPath(), owner.Name, owner.Salt, repo.Name, user)...) + } gitCmd.Dir = setting.RepoRootPath gitCmd.Stdout = os.Stdout gitCmd.Stdin = os.Stdin @@ -295,22 +261,5 @@ func runServ(c *cli.Context) error { fail("Internal error", "Fail to execute git command: %v", err) } - if requestMode == models.ACCESS_MODE_WRITE { - handleUpdateTask(uuid, user, repoOwner, reponame, isWiki) - } - - // Update user key activity. - if key.ID > 0 { - key, err := models.GetPublicKeyByID(key.ID) - if err != nil { - fail("Internal error", "GetPublicKeyByID: %v", err) - } - - key.Updated = time.Now() - if err = models.UpdatePublicKey(key); err != nil { - fail("Internal error", "UpdatePublicKey: %v", err) - } - } - return nil } |