]> source.dussan.org Git - gitea.git/commitdiff
Add command dump and move to cmd did
authorUnknown <joe2010xtmf@163.com>
Fri, 2 May 2014 01:21:46 +0000 (21:21 -0400)
committerUnknown <joe2010xtmf@163.com>
Fri, 2 May 2014 01:21:46 +0000 (21:21 -0400)
cmd/dump.go [new file with mode: 0644]
cmd/fix.go [new file with mode: 0644]
cmd/serve.go [new file with mode: 0644]
cmd/update.go [new file with mode: 0644]
cmd/web.go [new file with mode: 0644]
fix.go [deleted file]
gogs.go
modules/base/conf.go
serve.go [deleted file]
update.go [deleted file]
web.go [deleted file]

diff --git a/cmd/dump.go b/cmd/dump.go
new file mode 100644 (file)
index 0000000..c385d58
--- /dev/null
@@ -0,0 +1,52 @@
+// Copyright 2014 The Gogs Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package cmd
+
+import (
+       "log"
+       "os"
+       "path"
+
+       "github.com/Unknwon/cae/zip"
+       "github.com/codegangsta/cli"
+
+       "github.com/gogits/gogs/modules/base"
+)
+
+var CmdDump = cli.Command{
+       Name:  "dump",
+       Usage: "Dump Gogs files except database",
+       Description: `
+Dump compresses all related files into zip file except database,
+it can be used for backup and capture Gogs server image to send
+to maintainer`,
+       Action: runDump,
+       Flags:  []cli.Flag{},
+}
+
+func runDump(*cli.Context) {
+       base.NewConfigContext()
+
+       log.Printf("Dumping local repositories...%s", base.RepoRootPath)
+       zip.Verbose = false
+       defer os.Remove("gogs-repo.zip")
+       if err := zip.PackTo(base.RepoRootPath, "gogs-repo.zip", true); err != nil {
+               log.Fatalf("Fail to dump local repositories: %v", err)
+       }
+
+       z, err := zip.Create("gogs-dump.zip")
+       if err != nil {
+               os.Remove("gogs-dump.zip")
+               log.Fatalf("Fail to create gogs-dump.zip: %v", err)
+       }
+
+       execDir, _ := base.ExecDir()
+       z.AddFile("gogs-repo.zip", path.Join(execDir, "gogs-repo.zip"))
+       z.AddFile("custom/conf/app.ini", path.Join(execDir, "custom/conf/app.ini"))
+       z.AddDir("log", path.Join(execDir, "log"))
+       z.Close()
+
+       log.Println("Finish dumping!")
+}
diff --git a/cmd/fix.go b/cmd/fix.go
new file mode 100644 (file)
index 0000000..47134cd
--- /dev/null
@@ -0,0 +1,44 @@
+// Copyright 2014 The Gogs Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package cmd
+
+import (
+       "fmt"
+       "os"
+
+       "github.com/codegangsta/cli"
+       "github.com/gogits/gogs/models"
+       "github.com/gogits/gogs/modules/base"
+)
+
+var CmdFix = cli.Command{
+       Name:  "fix",
+       Usage: "This command for upgrade from old version",
+       Description: `
+gogs fix provide upgrade from old version`,
+       Action: runFix,
+       Flags:  []cli.Flag{},
+}
+
+func runFix(k *cli.Context) {
+       execDir, _ := base.ExecDir()
+       newLogger(execDir)
+
+       base.NewConfigContext()
+       models.LoadModelsConfig()
+
+       if models.UseSQLite3 {
+               os.Chdir(execDir)
+       }
+
+       models.SetEngine()
+
+       err := models.Fix()
+       if err != nil {
+               fmt.Println(err)
+       } else {
+               fmt.Println("Fix successfully!")
+       }
+}
diff --git a/cmd/serve.go b/cmd/serve.go
new file mode 100644 (file)
index 0000000..73dea92
--- /dev/null
@@ -0,0 +1,199 @@
+// Copyright 2014 The Gogs Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package cmd
+
+import (
+       //"container/list"
+       "fmt"
+       "os"
+       "os/exec"
+       "path"
+       "strconv"
+       "strings"
+
+       "github.com/codegangsta/cli"
+       qlog "github.com/qiniu/log"
+
+       //"github.com/gogits/git"
+       "github.com/gogits/gogs/models"
+       "github.com/gogits/gogs/modules/base"
+)
+
+var (
+       COMMANDS_READONLY = map[string]int{
+               "git-upload-pack":    models.AU_WRITABLE,
+               "git upload-pack":    models.AU_WRITABLE,
+               "git-upload-archive": models.AU_WRITABLE,
+       }
+
+       COMMANDS_WRITE = map[string]int{
+               "git-receive-pack": models.AU_READABLE,
+               "git receive-pack": models.AU_READABLE,
+       }
+)
+
+var CmdServ = cli.Command{
+       Name:  "serv",
+       Usage: "This command should only be called by SSH shell",
+       Description: `
+Serv provide access auth for repositories`,
+       Action: runServ,
+       Flags:  []cli.Flag{},
+}
+
+func newLogger(execDir string) {
+       logPath := execDir + "/log/serv.log"
+       os.MkdirAll(path.Dir(logPath), os.ModePerm)
+
+       f, err := os.OpenFile(logPath, os.O_WRONLY|os.O_APPEND|os.O_CREATE, os.ModePerm)
+       if err != nil {
+               qlog.Fatal(err)
+       }
+
+       qlog.SetOutput(f)
+       //qlog.SetOutputLevel(qlog.Ldebug)
+       qlog.Info("Start logging serv...")
+}
+
+func parseCmd(cmd string) (string, string) {
+       ss := strings.SplitN(cmd, " ", 2)
+       if len(ss) != 2 {
+               return "", ""
+       }
+
+       verb, args := ss[0], ss[1]
+       if verb == "git" {
+               ss = strings.SplitN(args, " ", 2)
+               args = ss[1]
+               verb = fmt.Sprintf("%s %s", verb, ss[0])
+       }
+       return verb, args
+}
+
+func In(b string, sl map[string]int) bool {
+       _, e := sl[b]
+       return e
+}
+
+func runServ(k *cli.Context) {
+       execDir, _ := base.ExecDir()
+       newLogger(execDir)
+
+       base.NewConfigContext()
+       models.LoadModelsConfig()
+
+       if models.UseSQLite3 {
+               os.Chdir(execDir)
+       }
+
+       models.SetEngine()
+
+       keys := strings.Split(os.Args[2], "-")
+       if len(keys) != 2 {
+               println("auth file format error")
+               qlog.Fatal("auth file format error")
+       }
+
+       keyId, err := strconv.ParseInt(keys[1], 10, 64)
+       if err != nil {
+               println("auth file format error")
+               qlog.Fatal("auth file format error", err)
+       }
+       user, err := models.GetUserByKeyId(keyId)
+       if err != nil {
+               println("You have no right to access")
+               qlog.Fatalf("SSH visit error: %v", err)
+       }
+
+       cmd := os.Getenv("SSH_ORIGINAL_COMMAND")
+       if cmd == "" {
+               println("Hi", user.Name, "! You've successfully authenticated, but Gogs does not provide shell access.")
+               return
+       }
+
+       verb, args := parseCmd(cmd)
+       repoPath := strings.Trim(args, "'")
+       rr := strings.SplitN(repoPath, "/", 2)
+       if len(rr) != 2 {
+               println("Unavailable repository", args)
+               qlog.Fatalf("Unavailable repository %v", args)
+       }
+       repoUserName := rr[0]
+       repoName := strings.TrimSuffix(rr[1], ".git")
+
+       isWrite := In(verb, COMMANDS_WRITE)
+       isRead := In(verb, COMMANDS_READONLY)
+
+       repoUser, err := models.GetUserByName(repoUserName)
+       if err != nil {
+               println("You have no right to access")
+               qlog.Fatal("Get user failed", err)
+       }
+
+       // access check
+       switch {
+       case isWrite:
+               has, err := models.HasAccess(user.LowerName, path.Join(repoUserName, repoName), models.AU_WRITABLE)
+               if err != nil {
+                       println("Internal error:", err)
+                       qlog.Fatal(err)
+               } else if !has {
+                       println("You have no right to write this repository")
+                       qlog.Fatalf("User %s has no right to write repository %s", user.Name, repoPath)
+               }
+       case isRead:
+               repo, err := models.GetRepositoryByName(repoUser.Id, repoName)
+               if err != nil {
+                       println("Get repository error:", err)
+                       qlog.Fatal("Get repository error: " + err.Error())
+               }
+
+               if !repo.IsPrivate {
+                       break
+               }
+
+               has, err := models.HasAccess(user.Name, path.Join(repoUserName, repoName), models.AU_READABLE)
+               if err != nil {
+                       println("Internal error")
+                       qlog.Fatal(err)
+               }
+               if !has {
+                       has, err = models.HasAccess(user.Name, path.Join(repoUserName, repoName), models.AU_WRITABLE)
+                       if err != nil {
+                               println("Internal error")
+                               qlog.Fatal(err)
+                       }
+               }
+               if !has {
+                       println("You have no right to access this repository")
+                       qlog.Fatal("You have no right to access this repository")
+               }
+       default:
+               println("Unknown command")
+               qlog.Fatal("Unknown command")
+       }
+
+       models.SetRepoEnvs(user.Id, user.Name, repoName)
+
+       gitcmd := exec.Command(verb, repoPath)
+       gitcmd.Dir = base.RepoRootPath
+       gitcmd.Stdout = os.Stdout
+       gitcmd.Stdin = os.Stdin
+       gitcmd.Stderr = os.Stderr
+
+       if err = gitcmd.Run(); err != nil {
+               println("execute command error:", err.Error())
+               qlog.Fatal("execute command error: " + err.Error())
+       }
+
+       //refName := os.Getenv("refName")
+       //oldCommitId := os.Getenv("oldCommitId")
+       //newCommitId := os.Getenv("newCommitId")
+
+       //qlog.Error("get envs:", refName, oldCommitId, newCommitId)
+
+       // update
+       //models.Update(refName, oldCommitId, newCommitId, repoUserName, repoName, user.Id)
+}
diff --git a/cmd/update.go b/cmd/update.go
new file mode 100644 (file)
index 0000000..b2c73f9
--- /dev/null
@@ -0,0 +1,85 @@
+// Copyright 2014 The Gogs Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package cmd
+
+import (
+       "os"
+       "path"
+       "strconv"
+
+       "github.com/codegangsta/cli"
+       qlog "github.com/qiniu/log"
+
+       "github.com/gogits/gogs/models"
+       "github.com/gogits/gogs/modules/base"
+)
+
+var CmdUpdate = cli.Command{
+       Name:  "update",
+       Usage: "This command should only be called by SSH shell",
+       Description: `
+Update get pushed info and insert into database`,
+       Action: runUpdate,
+       Flags:  []cli.Flag{},
+}
+
+func newUpdateLogger(execDir string) {
+       logPath := execDir + "/log/update.log"
+       os.MkdirAll(path.Dir(logPath), os.ModePerm)
+
+       f, err := os.OpenFile(logPath, os.O_WRONLY|os.O_APPEND|os.O_CREATE, os.ModePerm)
+       if err != nil {
+               qlog.Fatal(err)
+       }
+
+       qlog.SetOutput(f)
+       qlog.Info("Start logging update...")
+}
+
+func updateEnv(refName, oldCommitId, newCommitId string) {
+       os.Setenv("refName", refName)
+       os.Setenv("oldCommitId", oldCommitId)
+       os.Setenv("newCommitId", newCommitId)
+       qlog.Error("set envs:", refName, oldCommitId, newCommitId)
+}
+
+// for command: ./gogs update
+func runUpdate(c *cli.Context) {
+       cmd := os.Getenv("SSH_ORIGINAL_COMMAND")
+       if cmd == "" {
+               return
+       }
+
+       execDir, _ := base.ExecDir()
+       newUpdateLogger(execDir)
+
+       base.NewConfigContext()
+       models.LoadModelsConfig()
+
+       if models.UseSQLite3 {
+               os.Chdir(execDir)
+       }
+
+       models.SetEngine()
+
+       args := c.Args()
+       if len(args) != 3 {
+               qlog.Fatal("received less 3 parameters")
+       }
+
+       if args[0] == "" {
+               qlog.Fatal("refName is empty, shouldn't use")
+       }
+
+       //updateEnv(args[0], args[1], args[2])
+
+       userName := os.Getenv("userName")
+       userId := os.Getenv("userId")
+       iUserId, _ := strconv.ParseInt(userId, 10, 64)
+       //repoId := os.Getenv("repoId")
+       repoName := os.Getenv("repoName")
+
+       models.Update(args[0], args[1], args[2], userName, repoName, iUserId)
+}
diff --git a/cmd/web.go b/cmd/web.go
new file mode 100644 (file)
index 0000000..af5d507
--- /dev/null
@@ -0,0 +1,212 @@
+// Copyright 2014 The Gogs Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package cmd
+
+import (
+       "fmt"
+       "html/template"
+       "net/http"
+       "os"
+
+       "github.com/codegangsta/cli"
+       "github.com/go-martini/martini"
+       qlog "github.com/qiniu/log"
+
+       "github.com/gogits/gogs/modules/auth"
+       "github.com/gogits/gogs/modules/avatar"
+       "github.com/gogits/gogs/modules/base"
+       "github.com/gogits/gogs/modules/log"
+       "github.com/gogits/gogs/modules/middleware"
+       "github.com/gogits/gogs/routers"
+       "github.com/gogits/gogs/routers/admin"
+       "github.com/gogits/gogs/routers/api/v1"
+       "github.com/gogits/gogs/routers/dev"
+       "github.com/gogits/gogs/routers/repo"
+       "github.com/gogits/gogs/routers/user"
+)
+
+var CmdWeb = cli.Command{
+       Name:  "web",
+       Usage: "Start Gogs web server",
+       Description: `
+Gogs web server is the only thing you need to run, 
+and it takes care of all the other things for you`,
+       Action: runWeb,
+       Flags:  []cli.Flag{},
+}
+
+func newMartini() *martini.ClassicMartini {
+       r := martini.NewRouter()
+       m := martini.New()
+       m.Use(middleware.Logger())
+       m.Use(martini.Recovery())
+       m.Use(martini.Static("public", martini.StaticOptions{SkipLogging: !base.RouterLog}))
+       m.MapTo(r, (*martini.Routes)(nil))
+       m.Action(r.Handle)
+       return &martini.ClassicMartini{m, r}
+}
+
+func runWeb(*cli.Context) {
+       routers.GlobalInit()
+
+       m := newMartini()
+
+       // Middlewares.
+       m.Use(middleware.Renderer(middleware.RenderOptions{Funcs: []template.FuncMap{base.TemplateFuncs}}))
+       m.Use(middleware.InitContext())
+
+       reqSignIn := middleware.Toggle(&middleware.ToggleOptions{SignInRequire: true})
+       ignSignIn := middleware.Toggle(&middleware.ToggleOptions{SignInRequire: base.Service.RequireSignInView})
+       ignSignInAndCsrf := middleware.Toggle(&middleware.ToggleOptions{DisableCsrf: true})
+
+       reqSignOut := middleware.Toggle(&middleware.ToggleOptions{SignOutRequire: true})
+
+       bindIgnErr := middleware.BindIgnErr
+
+       // Routers.
+       m.Get("/", ignSignIn, routers.Home)
+       m.Get("/install", bindIgnErr(auth.InstallForm{}), routers.Install)
+       m.Post("/install", bindIgnErr(auth.InstallForm{}), routers.InstallPost)
+       m.Get("/issues", reqSignIn, user.Issues)
+       m.Get("/pulls", reqSignIn, user.Pulls)
+       m.Get("/stars", reqSignIn, user.Stars)
+       m.Get("/help", routers.Help)
+
+       m.Group("/api/v1", func(r martini.Router) {
+               // Miscellaneous.
+               r.Post("/markdown", v1.Markdown)
+
+               // Users.
+               r.Get("/users/search", v1.SearchUser)
+       })
+
+       avt := avatar.CacheServer("public/img/avatar/", "public/img/avatar_default.jpg")
+       os.MkdirAll("public/img/avatar/", os.ModePerm)
+       m.Get("/avatar/:hash", avt.ServeHTTP)
+
+       m.Group("/user", func(r martini.Router) {
+               r.Get("/login", user.SignIn)
+               r.Post("/login", bindIgnErr(auth.LogInForm{}), user.SignInPost)
+               r.Get("/login/:name", user.SocialSignIn)
+               r.Get("/sign_up", user.SignUp)
+               r.Post("/sign_up", bindIgnErr(auth.RegisterForm{}), user.SignUpPost)
+               r.Get("/reset_password", user.ResetPasswd)
+               r.Post("/reset_password", user.ResetPasswdPost)
+       }, reqSignOut)
+       m.Group("/user", func(r martini.Router) {
+               r.Get("/delete", user.Delete)
+               r.Post("/delete", user.DeletePost)
+               r.Get("/settings", user.Setting)
+               r.Post("/settings", bindIgnErr(auth.UpdateProfileForm{}), user.SettingPost)
+       }, reqSignIn)
+       m.Group("/user", func(r martini.Router) {
+               r.Get("/feeds", middleware.Bind(auth.FeedsForm{}), user.Feeds)
+               r.Any("/activate", user.Activate)
+               r.Get("/email2user", user.Email2User)
+               r.Get("/forget_password", user.ForgotPasswd)
+               r.Post("/forget_password", user.ForgotPasswdPost)
+               r.Get("/logout", user.SignOut)
+       })
+       m.Group("/user/settings", func(r martini.Router) {
+               r.Get("/social", user.SettingSocial)
+               r.Get("/password", user.SettingPassword)
+               r.Post("/password", bindIgnErr(auth.UpdatePasswdForm{}), user.SettingPasswordPost)
+               r.Any("/ssh", bindIgnErr(auth.AddSSHKeyForm{}), user.SettingSSHKeys)
+               r.Get("/notification", user.SettingNotification)
+               r.Get("/security", user.SettingSecurity)
+       }, reqSignIn)
+
+       m.Get("/user/:username", ignSignIn, user.Profile)
+
+       m.Group("/repo", func(r martini.Router) {
+               r.Get("/create", repo.Create)
+               r.Post("/create", bindIgnErr(auth.CreateRepoForm{}), repo.CreatePost)
+               r.Get("/migrate", repo.Migrate)
+               r.Post("/migrate", bindIgnErr(auth.MigrateRepoForm{}), repo.MigratePost)
+       }, reqSignIn)
+
+       adminReq := middleware.Toggle(&middleware.ToggleOptions{SignInRequire: true, AdminRequire: true})
+
+       m.Get("/admin", adminReq, admin.Dashboard)
+       m.Group("/admin", func(r martini.Router) {
+               r.Get("/users", admin.Users)
+               r.Get("/repos", admin.Repositories)
+               r.Get("/config", admin.Config)
+       }, adminReq)
+       m.Group("/admin/users", func(r martini.Router) {
+               r.Get("/new", admin.NewUser)
+               r.Post("/new", bindIgnErr(auth.RegisterForm{}), admin.NewUserPost)
+               r.Get("/:userid", admin.EditUser)
+               r.Post("/:userid", bindIgnErr(auth.AdminEditUserForm{}), admin.EditUserPost)
+               r.Get("/:userid/delete", admin.DeleteUser)
+       }, adminReq)
+
+       if martini.Env == martini.Dev {
+               m.Get("/template/**", dev.TemplatePreview)
+       }
+
+       m.Group("/:username/:reponame", func(r martini.Router) {
+               r.Get("/settings", repo.Setting)
+               r.Post("/settings", repo.SettingPost)
+               r.Get("/settings/collaboration", repo.Collaboration)
+               r.Post("/settings/collaboration", repo.CollaborationPost)
+               r.Get("/action/:action", repo.Action)
+               r.Get("/issues/new", repo.CreateIssue)
+               r.Post("/issues/new", bindIgnErr(auth.CreateIssueForm{}), repo.CreateIssuePost)
+               r.Post("/issues/:index", bindIgnErr(auth.CreateIssueForm{}), repo.UpdateIssue)
+               r.Post("/comment/:action", repo.Comment)
+               r.Get("/releases/new", repo.ReleasesNew)
+       }, reqSignIn, middleware.RepoAssignment(true))
+
+       m.Group("/:username/:reponame", func(r martini.Router) {
+               r.Post("/releases/new", bindIgnErr(auth.NewReleaseForm{}), repo.ReleasesNewPost)
+       }, reqSignIn, middleware.RepoAssignment(true, true))
+
+       m.Group("/:username/:reponame", func(r martini.Router) {
+               r.Get("/issues", repo.Issues)
+               r.Get("/issues/:index", repo.ViewIssue)
+               r.Get("/pulls", repo.Pulls)
+               r.Get("/branches", repo.Branches)
+       }, ignSignIn, middleware.RepoAssignment(true))
+
+       m.Group("/:username/:reponame", func(r martini.Router) {
+               r.Get("/src/:branchname", repo.Single)
+               r.Get("/src/:branchname/**", repo.Single)
+               r.Get("/raw/:branchname/**", repo.SingleDownload)
+               r.Get("/commits/:branchname", repo.Commits)
+               r.Get("/commits/:branchname/search", repo.SearchCommits)
+               r.Get("/commit/:branchname", repo.Diff)
+               r.Get("/commit/:branchname/**", repo.Diff)
+               r.Get("/releases", repo.Releases)
+               r.Get("/archive/:branchname/:reponame.zip", repo.ZipDownload)
+       }, ignSignIn, middleware.RepoAssignment(true, true))
+
+       m.Group("/:username", func(r martini.Router) {
+               r.Get("/:reponame", middleware.RepoAssignment(true, true, true), repo.Single)
+               r.Any("/:reponame/**", repo.Http)
+       }, ignSignInAndCsrf)
+
+       // Not found handler.
+       m.NotFound(routers.NotFound)
+
+       protocol := base.Cfg.MustValue("server", "PROTOCOL", "http")
+       listenAddr := fmt.Sprintf("%s:%s",
+               base.Cfg.MustValue("server", "HTTP_ADDR"),
+               base.Cfg.MustValue("server", "HTTP_PORT", "3000"))
+
+       if protocol == "http" {
+               log.Info("Listen: http://%s", listenAddr)
+               if err := http.ListenAndServe(listenAddr, m); err != nil {
+                       qlog.Error(err.Error())
+               }
+       } else if protocol == "https" {
+               log.Info("Listen: https://%s", listenAddr)
+               if err := http.ListenAndServeTLS(listenAddr, base.Cfg.MustValue("server", "CERT_FILE"),
+                       base.Cfg.MustValue("server", "KEY_FILE"), m); err != nil {
+                       qlog.Error(err.Error())
+               }
+       }
+       qlog.Fatalf("Invalid protocol: %s", protocol)
+}
diff --git a/fix.go b/fix.go
deleted file mode 100644 (file)
index afc1ea6..0000000
--- a/fix.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2014 The Gogs Authors. All rights reserved.
-// Use of this source code is governed by a MIT-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-       "fmt"
-       "os"
-
-       "github.com/codegangsta/cli"
-       "github.com/gogits/gogs/models"
-       "github.com/gogits/gogs/modules/base"
-)
-
-var CmdFix = cli.Command{
-       Name:  "fix",
-       Usage: "This command for upgrade from old version",
-       Description: `
-gogs fix provide upgrade from old version`,
-       Action: runFix,
-       Flags:  []cli.Flag{},
-}
-
-func runFix(k *cli.Context) {
-       execDir, _ := base.ExecDir()
-       newLogger(execDir)
-
-       base.NewConfigContext()
-       models.LoadModelsConfig()
-
-       if models.UseSQLite3 {
-               os.Chdir(execDir)
-       }
-
-       models.SetEngine()
-
-       err := models.Fix()
-       if err != nil {
-               fmt.Println(err)
-       } else {
-               fmt.Println("Fix successfully!")
-       }
-}
diff --git a/gogs.go b/gogs.go
index 5d44632773b89a1a63d842e7ae7fc4edf846bba8..a48d0a555579271ea8a06995ed6271ecb931bdbe 100644 (file)
--- a/gogs.go
+++ b/gogs.go
@@ -13,6 +13,7 @@ import (
 
        "github.com/codegangsta/cli"
 
+       "github.com/gogits/gogs/cmd"
        "github.com/gogits/gogs/modules/base"
 )
 
@@ -32,10 +33,11 @@ func main() {
        app.Usage = "Go Git Service"
        app.Version = APP_VER
        app.Commands = []cli.Command{
-               CmdWeb,
-               CmdServ,
-               CmdUpdate,
-               // CmdFix,
+               cmd.CmdWeb,
+               // cmd.CmdFix,
+               cmd.CmdDump,
+               cmd.CmdServ,
+               cmd.CmdUpdate,
        }
        app.Flags = append(app.Flags, []cli.Flag{}...)
        app.Run(os.Args)
index 23c7276bf1f68721cb11094a24b79604ec54685e..eab83d20af3af1351095c6a135b27a6df7500c96 100644 (file)
@@ -303,7 +303,6 @@ func newNotifyMailService() {
 }
 
 func NewConfigContext() {
-       //var err error
        workDir, err := ExecDir()
        if err != nil {
                qlog.Fatalf("Fail to get work directory: %s\n", err)
diff --git a/serve.go b/serve.go
deleted file mode 100644 (file)
index e3197a2..0000000
--- a/serve.go
+++ /dev/null
@@ -1,199 +0,0 @@
-// Copyright 2014 The Gogs Authors. All rights reserved.
-// Use of this source code is governed by a MIT-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-       //"container/list"
-       "fmt"
-       "os"
-       "os/exec"
-       "path"
-       "strconv"
-       "strings"
-
-       "github.com/codegangsta/cli"
-       qlog "github.com/qiniu/log"
-
-       //"github.com/gogits/git"
-       "github.com/gogits/gogs/models"
-       "github.com/gogits/gogs/modules/base"
-)
-
-var (
-       COMMANDS_READONLY = map[string]int{
-               "git-upload-pack":    models.AU_WRITABLE,
-               "git upload-pack":    models.AU_WRITABLE,
-               "git-upload-archive": models.AU_WRITABLE,
-       }
-
-       COMMANDS_WRITE = map[string]int{
-               "git-receive-pack": models.AU_READABLE,
-               "git receive-pack": models.AU_READABLE,
-       }
-)
-
-var CmdServ = cli.Command{
-       Name:  "serv",
-       Usage: "This command just should be called by ssh shell",
-       Description: `
-gogs serv provide access auth for repositories`,
-       Action: runServ,
-       Flags:  []cli.Flag{},
-}
-
-func newLogger(execDir string) {
-       logPath := execDir + "/log/serv.log"
-       os.MkdirAll(path.Dir(logPath), os.ModePerm)
-
-       f, err := os.OpenFile(logPath, os.O_WRONLY|os.O_APPEND|os.O_CREATE, os.ModePerm)
-       if err != nil {
-               qlog.Fatal(err)
-       }
-
-       qlog.SetOutput(f)
-       //qlog.SetOutputLevel(qlog.Ldebug)
-       qlog.Info("Start logging serv...")
-}
-
-func parseCmd(cmd string) (string, string) {
-       ss := strings.SplitN(cmd, " ", 2)
-       if len(ss) != 2 {
-               return "", ""
-       }
-
-       verb, args := ss[0], ss[1]
-       if verb == "git" {
-               ss = strings.SplitN(args, " ", 2)
-               args = ss[1]
-               verb = fmt.Sprintf("%s %s", verb, ss[0])
-       }
-       return verb, args
-}
-
-func In(b string, sl map[string]int) bool {
-       _, e := sl[b]
-       return e
-}
-
-func runServ(k *cli.Context) {
-       execDir, _ := base.ExecDir()
-       newLogger(execDir)
-
-       base.NewConfigContext()
-       models.LoadModelsConfig()
-
-       if models.UseSQLite3 {
-               os.Chdir(execDir)
-       }
-
-       models.SetEngine()
-
-       keys := strings.Split(os.Args[2], "-")
-       if len(keys) != 2 {
-               println("auth file format error")
-               qlog.Fatal("auth file format error")
-       }
-
-       keyId, err := strconv.ParseInt(keys[1], 10, 64)
-       if err != nil {
-               println("auth file format error")
-               qlog.Fatal("auth file format error", err)
-       }
-       user, err := models.GetUserByKeyId(keyId)
-       if err != nil {
-               println("You have no right to access")
-               qlog.Fatalf("SSH visit error: %v", err)
-       }
-
-       cmd := os.Getenv("SSH_ORIGINAL_COMMAND")
-       if cmd == "" {
-               println("Hi", user.Name, "! You've successfully authenticated, but Gogs does not provide shell access.")
-               return
-       }
-
-       verb, args := parseCmd(cmd)
-       repoPath := strings.Trim(args, "'")
-       rr := strings.SplitN(repoPath, "/", 2)
-       if len(rr) != 2 {
-               println("Unavailable repository", args)
-               qlog.Fatalf("Unavailable repository %v", args)
-       }
-       repoUserName := rr[0]
-       repoName := strings.TrimSuffix(rr[1], ".git")
-
-       isWrite := In(verb, COMMANDS_WRITE)
-       isRead := In(verb, COMMANDS_READONLY)
-
-       repoUser, err := models.GetUserByName(repoUserName)
-       if err != nil {
-               println("You have no right to access")
-               qlog.Fatal("Get user failed", err)
-       }
-
-       // access check
-       switch {
-       case isWrite:
-               has, err := models.HasAccess(user.LowerName, path.Join(repoUserName, repoName), models.AU_WRITABLE)
-               if err != nil {
-                       println("Internal error:", err)
-                       qlog.Fatal(err)
-               } else if !has {
-                       println("You have no right to write this repository")
-                       qlog.Fatalf("User %s has no right to write repository %s", user.Name, repoPath)
-               }
-       case isRead:
-               repo, err := models.GetRepositoryByName(repoUser.Id, repoName)
-               if err != nil {
-                       println("Get repository error:", err)
-                       qlog.Fatal("Get repository error: " + err.Error())
-               }
-
-               if !repo.IsPrivate {
-                       break
-               }
-
-               has, err := models.HasAccess(user.Name, path.Join(repoUserName, repoName), models.AU_READABLE)
-               if err != nil {
-                       println("Internal error")
-                       qlog.Fatal(err)
-               }
-               if !has {
-                       has, err = models.HasAccess(user.Name, path.Join(repoUserName, repoName), models.AU_WRITABLE)
-                       if err != nil {
-                               println("Internal error")
-                               qlog.Fatal(err)
-                       }
-               }
-               if !has {
-                       println("You have no right to access this repository")
-                       qlog.Fatal("You have no right to access this repository")
-               }
-       default:
-               println("Unknown command")
-               qlog.Fatal("Unknown command")
-       }
-
-       models.SetRepoEnvs(user.Id, user.Name, repoName)
-
-       gitcmd := exec.Command(verb, repoPath)
-       gitcmd.Dir = base.RepoRootPath
-       gitcmd.Stdout = os.Stdout
-       gitcmd.Stdin = os.Stdin
-       gitcmd.Stderr = os.Stderr
-
-       if err = gitcmd.Run(); err != nil {
-               println("execute command error:", err.Error())
-               qlog.Fatal("execute command error: " + err.Error())
-       }
-
-       //refName := os.Getenv("refName")
-       //oldCommitId := os.Getenv("oldCommitId")
-       //newCommitId := os.Getenv("newCommitId")
-
-       //qlog.Error("get envs:", refName, oldCommitId, newCommitId)
-
-       // update
-       //models.Update(refName, oldCommitId, newCommitId, repoUserName, repoName, user.Id)
-}
diff --git a/update.go b/update.go
deleted file mode 100644 (file)
index b8f5958..0000000
--- a/update.go
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2014 The Gogs Authors. All rights reserved.
-// Use of this source code is governed by a MIT-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-       "os"
-       "path"
-       "strconv"
-
-       "github.com/codegangsta/cli"
-       qlog "github.com/qiniu/log"
-
-       "github.com/gogits/gogs/models"
-       "github.com/gogits/gogs/modules/base"
-)
-
-var CmdUpdate = cli.Command{
-       Name:  "update",
-       Usage: "This command just should be called by ssh shell",
-       Description: `
-gogs update get pushed info and insert into database`,
-       Action: runUpdate,
-       Flags:  []cli.Flag{},
-}
-
-func newUpdateLogger(execDir string) {
-       logPath := execDir + "/log/update.log"
-       os.MkdirAll(path.Dir(logPath), os.ModePerm)
-
-       f, err := os.OpenFile(logPath, os.O_WRONLY|os.O_APPEND|os.O_CREATE, os.ModePerm)
-       if err != nil {
-               qlog.Fatal(err)
-       }
-
-       qlog.SetOutput(f)
-       qlog.Info("Start logging update...")
-}
-
-func updateEnv(refName, oldCommitId, newCommitId string) {
-       os.Setenv("refName", refName)
-       os.Setenv("oldCommitId", oldCommitId)
-       os.Setenv("newCommitId", newCommitId)
-       qlog.Error("set envs:", refName, oldCommitId, newCommitId)
-}
-
-// for command: ./gogs update
-func runUpdate(c *cli.Context) {
-       cmd := os.Getenv("SSH_ORIGINAL_COMMAND")
-       if cmd == "" {
-               return
-       }
-
-       execDir, _ := base.ExecDir()
-       newUpdateLogger(execDir)
-
-       base.NewConfigContext()
-       models.LoadModelsConfig()
-
-       if models.UseSQLite3 {
-               os.Chdir(execDir)
-       }
-
-       models.SetEngine()
-
-       args := c.Args()
-       if len(args) != 3 {
-               qlog.Fatal("received less 3 parameters")
-       }
-
-       if args[0] == "" {
-               qlog.Fatal("refName is empty, shouldn't use")
-       }
-
-       //updateEnv(args[0], args[1], args[2])
-
-       userName := os.Getenv("userName")
-       userId := os.Getenv("userId")
-       iUserId, _ := strconv.ParseInt(userId, 10, 64)
-       //repoId := os.Getenv("repoId")
-       repoName := os.Getenv("repoName")
-
-       models.Update(args[0], args[1], args[2], userName, repoName, iUserId)
-}
diff --git a/web.go b/web.go
deleted file mode 100644 (file)
index 9fa43d1..0000000
--- a/web.go
+++ /dev/null
@@ -1,212 +0,0 @@
-// Copyright 2014 The Gogs Authors. All rights reserved.
-// Use of this source code is governed by a MIT-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-       "fmt"
-       "html/template"
-       "net/http"
-       "os"
-
-       "github.com/codegangsta/cli"
-       "github.com/go-martini/martini"
-       qlog "github.com/qiniu/log"
-
-       "github.com/gogits/gogs/modules/auth"
-       "github.com/gogits/gogs/modules/avatar"
-       "github.com/gogits/gogs/modules/base"
-       "github.com/gogits/gogs/modules/log"
-       "github.com/gogits/gogs/modules/middleware"
-       "github.com/gogits/gogs/routers"
-       "github.com/gogits/gogs/routers/admin"
-       "github.com/gogits/gogs/routers/api/v1"
-       "github.com/gogits/gogs/routers/dev"
-       "github.com/gogits/gogs/routers/repo"
-       "github.com/gogits/gogs/routers/user"
-)
-
-var CmdWeb = cli.Command{
-       Name:  "web",
-       Usage: "Gogs web server",
-       Description: `
-gogs web server is the only thing you need to run, 
-and it takes care of all the other things for you`,
-       Action: runWeb,
-       Flags:  []cli.Flag{},
-}
-
-func newMartini() *martini.ClassicMartini {
-       r := martini.NewRouter()
-       m := martini.New()
-       m.Use(middleware.Logger())
-       m.Use(martini.Recovery())
-       m.Use(martini.Static("public", martini.StaticOptions{SkipLogging: !base.RouterLog}))
-       m.MapTo(r, (*martini.Routes)(nil))
-       m.Action(r.Handle)
-       return &martini.ClassicMartini{m, r}
-}
-
-func runWeb(*cli.Context) {
-       routers.GlobalInit()
-
-       m := newMartini()
-
-       // Middlewares.
-       m.Use(middleware.Renderer(middleware.RenderOptions{Funcs: []template.FuncMap{base.TemplateFuncs}}))
-       m.Use(middleware.InitContext())
-
-       reqSignIn := middleware.Toggle(&middleware.ToggleOptions{SignInRequire: true})
-       ignSignIn := middleware.Toggle(&middleware.ToggleOptions{SignInRequire: base.Service.RequireSignInView})
-       ignSignInAndCsrf := middleware.Toggle(&middleware.ToggleOptions{DisableCsrf: true})
-
-       reqSignOut := middleware.Toggle(&middleware.ToggleOptions{SignOutRequire: true})
-
-       bindIgnErr := middleware.BindIgnErr
-
-       // Routers.
-       m.Get("/", ignSignIn, routers.Home)
-       m.Get("/install", bindIgnErr(auth.InstallForm{}), routers.Install)
-       m.Post("/install", bindIgnErr(auth.InstallForm{}), routers.InstallPost)
-       m.Get("/issues", reqSignIn, user.Issues)
-       m.Get("/pulls", reqSignIn, user.Pulls)
-       m.Get("/stars", reqSignIn, user.Stars)
-       m.Get("/help", routers.Help)
-
-       m.Group("/api/v1", func(r martini.Router) {
-               // Miscellaneous.
-               r.Post("/markdown", v1.Markdown)
-
-               // Users.
-               r.Get("/users/search", v1.SearchUser)
-       })
-
-       avt := avatar.CacheServer("public/img/avatar/", "public/img/avatar_default.jpg")
-       os.MkdirAll("public/img/avatar/", os.ModePerm)
-       m.Get("/avatar/:hash", avt.ServeHTTP)
-
-       m.Group("/user", func(r martini.Router) {
-               r.Get("/login", user.SignIn)
-               r.Post("/login", bindIgnErr(auth.LogInForm{}), user.SignInPost)
-               r.Get("/login/:name", user.SocialSignIn)
-               r.Get("/sign_up", user.SignUp)
-               r.Post("/sign_up", bindIgnErr(auth.RegisterForm{}), user.SignUpPost)
-               r.Get("/reset_password", user.ResetPasswd)
-               r.Post("/reset_password", user.ResetPasswdPost)
-       }, reqSignOut)
-       m.Group("/user", func(r martini.Router) {
-               r.Get("/delete", user.Delete)
-               r.Post("/delete", user.DeletePost)
-               r.Get("/settings", user.Setting)
-               r.Post("/settings", bindIgnErr(auth.UpdateProfileForm{}), user.SettingPost)
-       }, reqSignIn)
-       m.Group("/user", func(r martini.Router) {
-               r.Get("/feeds", middleware.Bind(auth.FeedsForm{}), user.Feeds)
-               r.Any("/activate", user.Activate)
-               r.Get("/email2user", user.Email2User)
-               r.Get("/forget_password", user.ForgotPasswd)
-               r.Post("/forget_password", user.ForgotPasswdPost)
-               r.Get("/logout", user.SignOut)
-       })
-       m.Group("/user/settings", func(r martini.Router) {
-               r.Get("/social", user.SettingSocial)
-               r.Get("/password", user.SettingPassword)
-               r.Post("/password", bindIgnErr(auth.UpdatePasswdForm{}), user.SettingPasswordPost)
-               r.Any("/ssh", bindIgnErr(auth.AddSSHKeyForm{}), user.SettingSSHKeys)
-               r.Get("/notification", user.SettingNotification)
-               r.Get("/security", user.SettingSecurity)
-       }, reqSignIn)
-
-       m.Get("/user/:username", ignSignIn, user.Profile)
-
-       m.Group("/repo", func(r martini.Router) {
-               r.Get("/create", repo.Create)
-               r.Post("/create", bindIgnErr(auth.CreateRepoForm{}), repo.CreatePost)
-               r.Get("/migrate", repo.Migrate)
-               r.Post("/migrate", bindIgnErr(auth.MigrateRepoForm{}), repo.MigratePost)
-       }, reqSignIn)
-
-       adminReq := middleware.Toggle(&middleware.ToggleOptions{SignInRequire: true, AdminRequire: true})
-
-       m.Get("/admin", adminReq, admin.Dashboard)
-       m.Group("/admin", func(r martini.Router) {
-               r.Get("/users", admin.Users)
-               r.Get("/repos", admin.Repositories)
-               r.Get("/config", admin.Config)
-       }, adminReq)
-       m.Group("/admin/users", func(r martini.Router) {
-               r.Get("/new", admin.NewUser)
-               r.Post("/new", bindIgnErr(auth.RegisterForm{}), admin.NewUserPost)
-               r.Get("/:userid", admin.EditUser)
-               r.Post("/:userid", bindIgnErr(auth.AdminEditUserForm{}), admin.EditUserPost)
-               r.Get("/:userid/delete", admin.DeleteUser)
-       }, adminReq)
-
-       if martini.Env == martini.Dev {
-               m.Get("/template/**", dev.TemplatePreview)
-       }
-
-       m.Group("/:username/:reponame", func(r martini.Router) {
-               r.Get("/settings", repo.Setting)
-               r.Post("/settings", repo.SettingPost)
-               r.Get("/settings/collaboration", repo.Collaboration)
-               r.Post("/settings/collaboration", repo.CollaborationPost)
-               r.Get("/action/:action", repo.Action)
-               r.Get("/issues/new", repo.CreateIssue)
-               r.Post("/issues/new", bindIgnErr(auth.CreateIssueForm{}), repo.CreateIssuePost)
-               r.Post("/issues/:index", bindIgnErr(auth.CreateIssueForm{}), repo.UpdateIssue)
-               r.Post("/comment/:action", repo.Comment)
-               r.Get("/releases/new", repo.ReleasesNew)
-       }, reqSignIn, middleware.RepoAssignment(true))
-
-       m.Group("/:username/:reponame", func(r martini.Router) {
-               r.Post("/releases/new", bindIgnErr(auth.NewReleaseForm{}), repo.ReleasesNewPost)
-       }, reqSignIn, middleware.RepoAssignment(true, true))
-
-       m.Group("/:username/:reponame", func(r martini.Router) {
-               r.Get("/issues", repo.Issues)
-               r.Get("/issues/:index", repo.ViewIssue)
-               r.Get("/pulls", repo.Pulls)
-               r.Get("/branches", repo.Branches)
-       }, ignSignIn, middleware.RepoAssignment(true))
-
-       m.Group("/:username/:reponame", func(r martini.Router) {
-               r.Get("/src/:branchname", repo.Single)
-               r.Get("/src/:branchname/**", repo.Single)
-               r.Get("/raw/:branchname/**", repo.SingleDownload)
-               r.Get("/commits/:branchname", repo.Commits)
-               r.Get("/commits/:branchname/search", repo.SearchCommits)
-               r.Get("/commit/:branchname", repo.Diff)
-               r.Get("/commit/:branchname/**", repo.Diff)
-               r.Get("/releases", repo.Releases)
-               r.Get("/archive/:branchname/:reponame.zip", repo.ZipDownload)
-       }, ignSignIn, middleware.RepoAssignment(true, true))
-
-       m.Group("/:username", func(r martini.Router) {
-               r.Get("/:reponame", middleware.RepoAssignment(true, true, true), repo.Single)
-               r.Any("/:reponame/**", repo.Http)
-       }, ignSignInAndCsrf)
-
-       // Not found handler.
-       m.NotFound(routers.NotFound)
-
-       protocol := base.Cfg.MustValue("server", "PROTOCOL", "http")
-       listenAddr := fmt.Sprintf("%s:%s",
-               base.Cfg.MustValue("server", "HTTP_ADDR"),
-               base.Cfg.MustValue("server", "HTTP_PORT", "3000"))
-
-       if protocol == "http" {
-               log.Info("Listen: http://%s", listenAddr)
-               if err := http.ListenAndServe(listenAddr, m); err != nil {
-                       qlog.Error(err.Error())
-               }
-       } else if protocol == "https" {
-               log.Info("Listen: https://%s", listenAddr)
-               if err := http.ListenAndServeTLS(listenAddr, base.Cfg.MustValue("server", "CERT_FILE"),
-                       base.Cfg.MustValue("server", "KEY_FILE"), m); err != nil {
-                       qlog.Error(err.Error())
-               }
-       }
-       qlog.Fatalf("Invalid protocol: %s", protocol)
-}