mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Fixed #209
This commit is contained in:
		
							
								
								
									
										18
									
								
								cmd/dump.go
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								cmd/dump.go
									
									
									
									
									
								
							@@ -15,7 +15,7 @@ import (
 | 
				
			|||||||
	"github.com/codegangsta/cli"
 | 
						"github.com/codegangsta/cli"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/gogits/gogs/models"
 | 
						"github.com/gogits/gogs/models"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/base"
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var CmdDump = cli.Command{
 | 
					var CmdDump = cli.Command{
 | 
				
			||||||
@@ -28,14 +28,14 @@ It can be used for backup and capture Gogs server image to send to maintainer`,
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func runDump(*cli.Context) {
 | 
					func runDump(*cli.Context) {
 | 
				
			||||||
	base.NewConfigContext()
 | 
						setting.NewConfigContext()
 | 
				
			||||||
	models.LoadModelsConfig()
 | 
						models.LoadModelsConfig()
 | 
				
			||||||
	models.SetEngine()
 | 
						models.SetEngine()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	log.Printf("Dumping local repositories...%s", base.RepoRootPath)
 | 
						log.Printf("Dumping local repositories...%s", setting.RepoRootPath)
 | 
				
			||||||
	zip.Verbose = false
 | 
						zip.Verbose = false
 | 
				
			||||||
	defer os.Remove("gogs-repo.zip")
 | 
						defer os.Remove("gogs-repo.zip")
 | 
				
			||||||
	if err := zip.PackTo(base.RepoRootPath, "gogs-repo.zip", true); err != nil {
 | 
						if err := zip.PackTo(setting.RepoRootPath, "gogs-repo.zip", true); err != nil {
 | 
				
			||||||
		log.Fatalf("Fail to dump local repositories: %v", err)
 | 
							log.Fatalf("Fail to dump local repositories: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -53,11 +53,11 @@ func runDump(*cli.Context) {
 | 
				
			|||||||
		log.Fatalf("Fail to create %s: %v", fileName, err)
 | 
							log.Fatalf("Fail to create %s: %v", fileName, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	execDir, _ := base.ExecDir()
 | 
						workDir, _ := setting.WorkDir()
 | 
				
			||||||
	z.AddFile("gogs-repo.zip", path.Join(execDir, "gogs-repo.zip"))
 | 
						z.AddFile("gogs-repo.zip", path.Join(workDir, "gogs-repo.zip"))
 | 
				
			||||||
	z.AddFile("gogs-db.sql", path.Join(execDir, "gogs-db.sql"))
 | 
						z.AddFile("gogs-db.sql", path.Join(workDir, "gogs-db.sql"))
 | 
				
			||||||
	z.AddFile("custom/conf/app.ini", path.Join(execDir, "custom/conf/app.ini"))
 | 
						z.AddFile("custom/conf/app.ini", path.Join(workDir, "custom/conf/app.ini"))
 | 
				
			||||||
	z.AddDir("log", path.Join(execDir, "log"))
 | 
						z.AddDir("log", path.Join(workDir, "log"))
 | 
				
			||||||
	if err = z.Close(); err != nil {
 | 
						if err = z.Close(); err != nil {
 | 
				
			||||||
		os.Remove(fileName)
 | 
							os.Remove(fileName)
 | 
				
			||||||
		log.Fatalf("Fail to save %s: %v", fileName, err)
 | 
							log.Fatalf("Fail to save %s: %v", fileName, err)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										10
									
								
								cmd/fix.go
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								cmd/fix.go
									
									
									
									
									
								
							@@ -10,7 +10,7 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"github.com/codegangsta/cli"
 | 
						"github.com/codegangsta/cli"
 | 
				
			||||||
	"github.com/gogits/gogs/models"
 | 
						"github.com/gogits/gogs/models"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/base"
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var CmdFix = cli.Command{
 | 
					var CmdFix = cli.Command{
 | 
				
			||||||
@@ -22,14 +22,14 @@ var CmdFix = cli.Command{
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func runFix(k *cli.Context) {
 | 
					func runFix(k *cli.Context) {
 | 
				
			||||||
	execDir, _ := base.ExecDir()
 | 
						workDir, _ := setting.WorkDir()
 | 
				
			||||||
	newLogger(execDir)
 | 
						newLogger(workDir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	base.NewConfigContext()
 | 
						setting.NewConfigContext()
 | 
				
			||||||
	models.LoadModelsConfig()
 | 
						models.LoadModelsConfig()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if models.UseSQLite3 {
 | 
						if models.UseSQLite3 {
 | 
				
			||||||
		os.Chdir(execDir)
 | 
							os.Chdir(workDir)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	models.SetEngine()
 | 
						models.SetEngine()
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										12
									
								
								cmd/serve.go
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								cmd/serve.go
									
									
									
									
									
								
							@@ -16,7 +16,7 @@ import (
 | 
				
			|||||||
	qlog "github.com/qiniu/log"
 | 
						qlog "github.com/qiniu/log"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/gogits/gogs/models"
 | 
						"github.com/gogits/gogs/models"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/base"
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var CmdServ = cli.Command{
 | 
					var CmdServ = cli.Command{
 | 
				
			||||||
@@ -41,14 +41,14 @@ func newLogger(logPath string) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func setup(logPath string) {
 | 
					func setup(logPath string) {
 | 
				
			||||||
	execDir, _ := base.ExecDir()
 | 
						workDir, _ := setting.WorkDir()
 | 
				
			||||||
	newLogger(path.Join(execDir, logPath))
 | 
						newLogger(path.Join(workDir, logPath))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	base.NewConfigContext()
 | 
						setting.NewConfigContext()
 | 
				
			||||||
	models.LoadModelsConfig()
 | 
						models.LoadModelsConfig()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if models.UseSQLite3 {
 | 
						if models.UseSQLite3 {
 | 
				
			||||||
		os.Chdir(execDir)
 | 
							os.Chdir(workDir)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	models.SetEngine()
 | 
						models.SetEngine()
 | 
				
			||||||
@@ -182,7 +182,7 @@ func runServ(k *cli.Context) {
 | 
				
			|||||||
	models.SetRepoEnvs(user.Id, user.Name, repoName, repoUserName)
 | 
						models.SetRepoEnvs(user.Id, user.Name, repoName, repoUserName)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	gitcmd := exec.Command(verb, repoPath)
 | 
						gitcmd := exec.Command(verb, repoPath)
 | 
				
			||||||
	gitcmd.Dir = base.RepoRootPath
 | 
						gitcmd.Dir = setting.RepoRootPath
 | 
				
			||||||
	gitcmd.Stdout = os.Stdout
 | 
						gitcmd.Stdout = os.Stdout
 | 
				
			||||||
	gitcmd.Stdin = os.Stdin
 | 
						gitcmd.Stdin = os.Stdin
 | 
				
			||||||
	gitcmd.Stderr = os.Stderr
 | 
						gitcmd.Stderr = os.Stderr
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										38
									
								
								cmd/web.go
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								cmd/web.go
									
									
									
									
									
								
							@@ -9,10 +9,10 @@ import (
 | 
				
			|||||||
	"html/template"
 | 
						"html/template"
 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
 | 
						"path"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/codegangsta/cli"
 | 
						"github.com/codegangsta/cli"
 | 
				
			||||||
	"github.com/go-martini/martini"
 | 
						"github.com/go-martini/martini"
 | 
				
			||||||
	qlog "github.com/qiniu/log"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/gogits/gogs/modules/auth"
 | 
						"github.com/gogits/gogs/modules/auth"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/auth/apiv1"
 | 
						"github.com/gogits/gogs/modules/auth/apiv1"
 | 
				
			||||||
@@ -21,6 +21,7 @@ import (
 | 
				
			|||||||
	"github.com/gogits/gogs/modules/log"
 | 
						"github.com/gogits/gogs/modules/log"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/middleware"
 | 
						"github.com/gogits/gogs/modules/middleware"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/middleware/binding"
 | 
						"github.com/gogits/gogs/modules/middleware/binding"
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
	"github.com/gogits/gogs/routers"
 | 
						"github.com/gogits/gogs/routers"
 | 
				
			||||||
	"github.com/gogits/gogs/routers/admin"
 | 
						"github.com/gogits/gogs/routers/admin"
 | 
				
			||||||
	"github.com/gogits/gogs/routers/api/v1"
 | 
						"github.com/gogits/gogs/routers/api/v1"
 | 
				
			||||||
@@ -43,7 +44,8 @@ func newMartini() *martini.ClassicMartini {
 | 
				
			|||||||
	m := martini.New()
 | 
						m := martini.New()
 | 
				
			||||||
	m.Use(middleware.Logger())
 | 
						m.Use(middleware.Logger())
 | 
				
			||||||
	m.Use(martini.Recovery())
 | 
						m.Use(martini.Recovery())
 | 
				
			||||||
	m.Use(martini.Static("public", martini.StaticOptions{SkipLogging: !base.DisableRouterLog}))
 | 
						m.Use(martini.Static(path.Join(setting.StaticRootPath, "public"),
 | 
				
			||||||
 | 
							martini.StaticOptions{SkipLogging: !setting.DisableRouterLog}))
 | 
				
			||||||
	m.MapTo(r, (*martini.Routes)(nil))
 | 
						m.MapTo(r, (*martini.Routes)(nil))
 | 
				
			||||||
	m.Action(r.Handle)
 | 
						m.Action(r.Handle)
 | 
				
			||||||
	return &martini.ClassicMartini{m, r}
 | 
						return &martini.ClassicMartini{m, r}
 | 
				
			||||||
@@ -56,13 +58,14 @@ func runWeb(*cli.Context) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// Middlewares.
 | 
						// Middlewares.
 | 
				
			||||||
	m.Use(middleware.Renderer(middleware.RenderOptions{
 | 
						m.Use(middleware.Renderer(middleware.RenderOptions{
 | 
				
			||||||
 | 
							Directory:  path.Join(setting.StaticRootPath, "templates"),
 | 
				
			||||||
		Funcs:      []template.FuncMap{base.TemplateFuncs},
 | 
							Funcs:      []template.FuncMap{base.TemplateFuncs},
 | 
				
			||||||
		IndentJSON: true,
 | 
							IndentJSON: true,
 | 
				
			||||||
	}))
 | 
						}))
 | 
				
			||||||
	m.Use(middleware.InitContext())
 | 
						m.Use(middleware.InitContext())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	reqSignIn := middleware.Toggle(&middleware.ToggleOptions{SignInRequire: true})
 | 
						reqSignIn := middleware.Toggle(&middleware.ToggleOptions{SignInRequire: true})
 | 
				
			||||||
	ignSignIn := middleware.Toggle(&middleware.ToggleOptions{SignInRequire: base.Service.RequireSignInView})
 | 
						ignSignIn := middleware.Toggle(&middleware.ToggleOptions{SignInRequire: setting.Service.RequireSignInView})
 | 
				
			||||||
	ignSignInAndCsrf := middleware.Toggle(&middleware.ToggleOptions{DisableCsrf: true})
 | 
						ignSignInAndCsrf := middleware.Toggle(&middleware.ToggleOptions{DisableCsrf: true})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	reqSignOut := middleware.Toggle(&middleware.ToggleOptions{SignOutRequire: true})
 | 
						reqSignOut := middleware.Toggle(&middleware.ToggleOptions{SignOutRequire: true})
 | 
				
			||||||
@@ -241,22 +244,19 @@ func runWeb(*cli.Context) {
 | 
				
			|||||||
	// Not found handler.
 | 
						// Not found handler.
 | 
				
			||||||
	m.NotFound(routers.NotFound)
 | 
						m.NotFound(routers.NotFound)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	protocol := base.Cfg.MustValue("server", "PROTOCOL", "http")
 | 
						var err error
 | 
				
			||||||
	listenAddr := fmt.Sprintf("%s:%s",
 | 
						listenAddr := fmt.Sprintf("%s:%s", setting.HttpAddr, setting.HttpPort)
 | 
				
			||||||
		base.Cfg.MustValue("server", "HTTP_ADDR", "0.0.0.0"),
 | 
						log.Info("Listen: %v://%s", setting.Protocol, listenAddr)
 | 
				
			||||||
		base.Cfg.MustValue("server", "HTTP_PORT", "3000"))
 | 
						switch setting.Protocol {
 | 
				
			||||||
 | 
						case setting.HTTP:
 | 
				
			||||||
 | 
							err = http.ListenAndServe(listenAddr, m)
 | 
				
			||||||
 | 
						case setting.HTTPS:
 | 
				
			||||||
 | 
							err = http.ListenAndServeTLS(listenAddr, setting.CertFile, setting.KeyFile, m)
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							log.Fatal("Invalid protocol: %s", setting.Protocol)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if protocol == "http" {
 | 
						if err != nil {
 | 
				
			||||||
		log.Info("Listen: http://%s", listenAddr)
 | 
							log.Fatal("Fail to start server: %v", err)
 | 
				
			||||||
		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)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,6 +25,9 @@ DISABLE_ROUTER_LOG = false
 | 
				
			|||||||
; $ go run $GOROOT/src/pkg/crypto/tls/generate_cert.go -ca=true -duration=8760h0m0s -host=myhost.example.com
 | 
					; $ go run $GOROOT/src/pkg/crypto/tls/generate_cert.go -ca=true -duration=8760h0m0s -host=myhost.example.com
 | 
				
			||||||
CERT_FILE = custom/https/cert.pem
 | 
					CERT_FILE = custom/https/cert.pem
 | 
				
			||||||
KEY_FILE = custom/https/key.pem
 | 
					KEY_FILE = custom/https/key.pem
 | 
				
			||||||
 | 
					; Upper level of template and static file path
 | 
				
			||||||
 | 
					; default is the path where Gogs is executed
 | 
				
			||||||
 | 
					STATIC_ROOT_PATH = 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[database]
 | 
					[database]
 | 
				
			||||||
; Either "mysql", "postgres" or "sqlite3", it's your choice
 | 
					; Either "mysql", "postgres" or "sqlite3", it's your choice
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								gogs.go
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								gogs.go
									
									
									
									
									
								
							@@ -14,13 +14,13 @@ import (
 | 
				
			|||||||
	"github.com/codegangsta/cli"
 | 
						"github.com/codegangsta/cli"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/gogits/gogs/cmd"
 | 
						"github.com/gogits/gogs/cmd"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/base"
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const APP_VER = "0.3.5.0524 Alpha"
 | 
					const APP_VER = "0.3.5.0525 Alpha"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() {
 | 
					func init() {
 | 
				
			||||||
	base.AppVer = APP_VER
 | 
						setting.AppVer = APP_VER
 | 
				
			||||||
	runtime.GOMAXPROCS(runtime.NumCPU())
 | 
						runtime.GOMAXPROCS(runtime.NumCPU())
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,6 +17,7 @@ import (
 | 
				
			|||||||
	"github.com/gogits/gogs/modules/base"
 | 
						"github.com/gogits/gogs/modules/base"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/hooks"
 | 
						"github.com/gogits/gogs/modules/hooks"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/log"
 | 
						"github.com/gogits/gogs/modules/log"
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Operation types of user action.
 | 
					// Operation types of user action.
 | 
				
			||||||
@@ -129,7 +130,7 @@ func CommitRepoAction(userId, repoUserId int64, userName, actEmail string,
 | 
				
			|||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	repoLink := fmt.Sprintf("%s%s/%s", base.AppUrl, repoUserName, repoName)
 | 
						repoLink := fmt.Sprintf("%s%s/%s", setting.AppUrl, repoUserName, repoName)
 | 
				
			||||||
	commits := make([]*hooks.PayloadCommit, len(commit.Commits))
 | 
						commits := make([]*hooks.PayloadCommit, len(commit.Commits))
 | 
				
			||||||
	for i, cmt := range commit.Commits {
 | 
						for i, cmt := range commit.Commits {
 | 
				
			||||||
		commits[i] = &hooks.PayloadCommit{
 | 
							commits[i] = &hooks.PayloadCommit{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,7 @@ import (
 | 
				
			|||||||
	"github.com/go-xorm/xorm"
 | 
						"github.com/go-xorm/xorm"
 | 
				
			||||||
	_ "github.com/lib/pq"
 | 
						_ "github.com/lib/pq"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/gogits/gogs/modules/base"
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
@@ -39,16 +39,16 @@ func init() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func LoadModelsConfig() {
 | 
					func LoadModelsConfig() {
 | 
				
			||||||
	DbCfg.Type = base.Cfg.MustValue("database", "DB_TYPE")
 | 
						DbCfg.Type = setting.Cfg.MustValue("database", "DB_TYPE")
 | 
				
			||||||
	if DbCfg.Type == "sqlite3" {
 | 
						if DbCfg.Type == "sqlite3" {
 | 
				
			||||||
		UseSQLite3 = true
 | 
							UseSQLite3 = true
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	DbCfg.Host = base.Cfg.MustValue("database", "HOST")
 | 
						DbCfg.Host = setting.Cfg.MustValue("database", "HOST")
 | 
				
			||||||
	DbCfg.Name = base.Cfg.MustValue("database", "NAME")
 | 
						DbCfg.Name = setting.Cfg.MustValue("database", "NAME")
 | 
				
			||||||
	DbCfg.User = base.Cfg.MustValue("database", "USER")
 | 
						DbCfg.User = setting.Cfg.MustValue("database", "USER")
 | 
				
			||||||
	DbCfg.Pwd = base.Cfg.MustValue("database", "PASSWD")
 | 
						DbCfg.Pwd = setting.Cfg.MustValue("database", "PASSWD")
 | 
				
			||||||
	DbCfg.SslMode = base.Cfg.MustValue("database", "SSL_MODE")
 | 
						DbCfg.SslMode = setting.Cfg.MustValue("database", "SSL_MODE")
 | 
				
			||||||
	DbCfg.Path = base.Cfg.MustValue("database", "PATH", "data/gogs.db")
 | 
						DbCfg.Path = setting.Cfg.MustValue("database", "PATH", "data/gogs.db")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewTestEngine(x *xorm.Engine) (err error) {
 | 
					func NewTestEngine(x *xorm.Engine) (err error) {
 | 
				
			||||||
@@ -112,8 +112,8 @@ func SetEngine() (err error) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// WARNNING: for serv command, MUST remove the output to os.stdout,
 | 
						// WARNNING: for serv command, MUST remove the output to os.stdout,
 | 
				
			||||||
	// so use log file to instead print to stdout.
 | 
						// so use log file to instead print to stdout.
 | 
				
			||||||
	execDir, _ := base.ExecDir()
 | 
						workDir, _ := setting.WorkDir()
 | 
				
			||||||
	logPath := execDir + "/log/xorm.log"
 | 
						logPath := workDir + "/log/xorm.log"
 | 
				
			||||||
	os.MkdirAll(path.Dir(logPath), os.ModePerm)
 | 
						os.MkdirAll(path.Dir(logPath), os.ModePerm)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	f, err := os.Create(logPath)
 | 
						f, err := os.Create(logPath)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,7 +23,9 @@ import (
 | 
				
			|||||||
	"github.com/gogits/git"
 | 
						"github.com/gogits/git"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/gogits/gogs/modules/base"
 | 
						"github.com/gogits/gogs/modules/base"
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/bin"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/log"
 | 
						"github.com/gogits/gogs/modules/log"
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
@@ -39,26 +41,28 @@ var (
 | 
				
			|||||||
	LanguageIgns, Licenses []string
 | 
						LanguageIgns, Licenses []string
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func LoadRepoConfig() {
 | 
					// getAssetList returns corresponding asset list in 'conf'.
 | 
				
			||||||
	workDir, err := base.ExecDir()
 | 
					func getAssetList(prefix string) []string {
 | 
				
			||||||
	if err != nil {
 | 
						assets := make([]string, 0, 15)
 | 
				
			||||||
		qlog.Fatalf("Fail to get work directory: %s\n", err)
 | 
						for _, name := range bin.AssetNames() {
 | 
				
			||||||
 | 
							if strings.HasPrefix(name, prefix) {
 | 
				
			||||||
 | 
								assets = append(assets, name)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return assets
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func LoadRepoConfig() {
 | 
				
			||||||
	// Load .gitignore and license files.
 | 
						// Load .gitignore and license files.
 | 
				
			||||||
	types := []string{"gitignore", "license"}
 | 
						types := []string{"gitignore", "license"}
 | 
				
			||||||
	typeFiles := make([][]string, 2)
 | 
						typeFiles := make([][]string, 2)
 | 
				
			||||||
	for i, t := range types {
 | 
						for i, t := range types {
 | 
				
			||||||
		cfgPath := filepath.Join(workDir, "conf", t)
 | 
							files := getAssetList(path.Join("conf", t))
 | 
				
			||||||
		files, err := com.StatDir(cfgPath)
 | 
							customPath := path.Join(setting.CustomPath, "conf", t)
 | 
				
			||||||
 | 
							if com.IsDir(customPath) {
 | 
				
			||||||
 | 
								customFiles, err := com.StatDir(customPath)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
			qlog.Fatalf("Fail to get default %s files: %v\n", t, err)
 | 
									log.Fatal("Fail to get custom %s files: %v", t, err)
 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		cfgPath = filepath.Join(workDir, "custom/conf/gitignore")
 | 
					 | 
				
			||||||
		if com.IsDir(cfgPath) {
 | 
					 | 
				
			||||||
			customFiles, err := com.StatDir(cfgPath)
 | 
					 | 
				
			||||||
			if err != nil {
 | 
					 | 
				
			||||||
				qlog.Fatalf("Fail to get custom %s files: %v\n", t, err)
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			for _, f := range customFiles {
 | 
								for _, f := range customFiles {
 | 
				
			||||||
@@ -192,7 +196,7 @@ func MirrorUpdate() {
 | 
				
			|||||||
			return nil
 | 
								return nil
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		repoPath := filepath.Join(base.RepoRootPath, m.RepoName+".git")
 | 
							repoPath := filepath.Join(setting.RepoRootPath, m.RepoName+".git")
 | 
				
			||||||
		_, stderr, err := com.ExecCmdDir(repoPath, "git", "remote", "update")
 | 
							_, stderr, err := com.ExecCmdDir(repoPath, "git", "remote", "update")
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return errors.New("git remote update: " + stderr)
 | 
								return errors.New("git remote update: " + stderr)
 | 
				
			||||||
@@ -434,7 +438,7 @@ func initRepository(f string, user *User, repo *Repository, initReadme bool, rep
 | 
				
			|||||||
	rp := strings.NewReplacer("\\", "/", " ", "\\ ")
 | 
						rp := strings.NewReplacer("\\", "/", " ", "\\ ")
 | 
				
			||||||
	// hook/post-update
 | 
						// hook/post-update
 | 
				
			||||||
	if err := createHookUpdate(filepath.Join(repoPath, "hooks", "update"),
 | 
						if err := createHookUpdate(filepath.Join(repoPath, "hooks", "update"),
 | 
				
			||||||
		fmt.Sprintf("#!/usr/bin/env %s\n%s update $1 $2 $3\n", base.ScriptType,
 | 
							fmt.Sprintf("#!/usr/bin/env %s\n%s update $1 $2 $3\n", setting.ScriptType,
 | 
				
			||||||
			rp.Replace(appPath))); err != nil {
 | 
								rp.Replace(appPath))); err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -452,7 +456,7 @@ func initRepository(f string, user *User, repo *Repository, initReadme bool, rep
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Clone to temprory path and do the init commit.
 | 
						// Clone to temprory path and do the init commit.
 | 
				
			||||||
	tmpDir := filepath.Join(os.TempDir(), fmt.Sprintf("%d", time.Now().Nanosecond()))
 | 
						tmpDir := filepath.Join(os.TempDir(), base.ToStr(time.Now().Nanosecond()))
 | 
				
			||||||
	os.MkdirAll(tmpDir, os.ModePerm)
 | 
						os.MkdirAll(tmpDir, os.ModePerm)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	_, stderr, err := com.ExecCmd("git", "clone", repoPath, tmpDir)
 | 
						_, stderr, err := com.ExecCmd("git", "clone", repoPath, tmpDir)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,6 +18,7 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"github.com/gogits/gogs/modules/base"
 | 
						"github.com/gogits/gogs/modules/base"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/log"
 | 
						"github.com/gogits/gogs/modules/log"
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// User types.
 | 
					// User types.
 | 
				
			||||||
@@ -73,9 +74,9 @@ func (user *User) HomeLink() string {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// AvatarLink returns the user gravatar link.
 | 
					// AvatarLink returns the user gravatar link.
 | 
				
			||||||
func (user *User) AvatarLink() string {
 | 
					func (user *User) AvatarLink() string {
 | 
				
			||||||
	if base.DisableGravatar {
 | 
						if setting.DisableGravatar {
 | 
				
			||||||
		return "/img/avatar_default.jpg"
 | 
							return "/img/avatar_default.jpg"
 | 
				
			||||||
	} else if base.Service.EnableCacheAvatar {
 | 
						} else if setting.Service.EnableCacheAvatar {
 | 
				
			||||||
		return "/avatar/" + user.Avatar
 | 
							return "/avatar/" + user.Avatar
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return "//1.gravatar.com/avatar/" + user.Avatar
 | 
						return "//1.gravatar.com/avatar/" + user.Avatar
 | 
				
			||||||
@@ -197,7 +198,7 @@ func getVerifyUser(code string) (user *User) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// verify active code when active account
 | 
					// verify active code when active account
 | 
				
			||||||
func VerifyUserActiveCode(code string) (user *User) {
 | 
					func VerifyUserActiveCode(code string) (user *User) {
 | 
				
			||||||
	minutes := base.Service.ActiveCodeLives
 | 
						minutes := setting.Service.ActiveCodeLives
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if user = getVerifyUser(code); user != nil {
 | 
						if user = getVerifyUser(code); user != nil {
 | 
				
			||||||
		// time limit code
 | 
							// time limit code
 | 
				
			||||||
@@ -340,7 +341,7 @@ func DeleteUser(user *User) error {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// UserPath returns the path absolute path of user repositories.
 | 
					// UserPath returns the path absolute path of user repositories.
 | 
				
			||||||
func UserPath(userName string) string {
 | 
					func UserPath(userName string) string {
 | 
				
			||||||
	return filepath.Join(base.RepoRootPath, strings.ToLower(userName))
 | 
						return filepath.Join(setting.RepoRootPath, strings.ToLower(userName))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func GetUserByKeyId(keyId int64) (*User, error) {
 | 
					func GetUserByKeyId(keyId int64) (*User, error) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,6 +13,8 @@ import (
 | 
				
			|||||||
	"runtime"
 | 
						"runtime"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Str2html(raw string) template.HTML {
 | 
					func Str2html(raw string) template.HTML {
 | 
				
			||||||
@@ -52,16 +54,16 @@ var TemplateFuncs template.FuncMap = map[string]interface{}{
 | 
				
			|||||||
		return runtime.Version()
 | 
							return runtime.Version()
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	"AppName": func() string {
 | 
						"AppName": func() string {
 | 
				
			||||||
		return AppName
 | 
							return setting.AppName
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	"AppVer": func() string {
 | 
						"AppVer": func() string {
 | 
				
			||||||
		return AppVer
 | 
							return setting.AppVer
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	"AppDomain": func() string {
 | 
						"AppDomain": func() string {
 | 
				
			||||||
		return Domain
 | 
							return setting.Domain
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	"CdnMode": func() bool {
 | 
						"CdnMode": func() bool {
 | 
				
			||||||
		return ProdMode && !OfflineMode
 | 
							return setting.ProdMode && !setting.OfflineMode
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	"LoadTimes": func(startTime time.Time) string {
 | 
						"LoadTimes": func(startTime time.Time) string {
 | 
				
			||||||
		return fmt.Sprint(time.Since(startTime).Nanoseconds()/1e6) + "ms"
 | 
							return fmt.Sprint(time.Since(startTime).Nanoseconds()/1e6) + "ms"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,6 +16,8 @@ import (
 | 
				
			|||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Encode string to md5 hex value
 | 
					// Encode string to md5 hex value
 | 
				
			||||||
@@ -131,7 +133,7 @@ func CreateTimeLimitCode(data string, minutes int, startInf interface{}) string
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// create sha1 encode string
 | 
						// create sha1 encode string
 | 
				
			||||||
	sh := sha1.New()
 | 
						sh := sha1.New()
 | 
				
			||||||
	sh.Write([]byte(data + SecretKey + startStr + endStr + ToStr(minutes)))
 | 
						sh.Write([]byte(data + setting.SecretKey + startStr + endStr + ToStr(minutes)))
 | 
				
			||||||
	encoded := hex.EncodeToString(sh.Sum(nil))
 | 
						encoded := hex.EncodeToString(sh.Sum(nil))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	code := fmt.Sprintf("%s%06d%s", startStr, minutes, encoded)
 | 
						code := fmt.Sprintf("%s%06d%s", startStr, minutes, encoded)
 | 
				
			||||||
@@ -140,9 +142,9 @@ func CreateTimeLimitCode(data string, minutes int, startInf interface{}) string
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// AvatarLink returns avatar link by given e-mail.
 | 
					// AvatarLink returns avatar link by given e-mail.
 | 
				
			||||||
func AvatarLink(email string) string {
 | 
					func AvatarLink(email string) string {
 | 
				
			||||||
	if DisableGravatar {
 | 
						if setting.DisableGravatar {
 | 
				
			||||||
		return "/img/avatar_default.jpg"
 | 
							return "/img/avatar_default.jpg"
 | 
				
			||||||
	} else if Service.EnableCacheAvatar {
 | 
						} else if setting.Service.EnableCacheAvatar {
 | 
				
			||||||
		return "/avatar/" + EncodeMd5(email)
 | 
							return "/avatar/" + EncodeMd5(email)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return "//1.gravatar.com/avatar/" + EncodeMd5(email)
 | 
						return "//1.gravatar.com/avatar/" + EncodeMd5(email)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										220
									
								
								modules/bin/conf.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										220
									
								
								modules/bin/conf.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,220 @@
 | 
				
			|||||||
 | 
					package bin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"io/ioutil"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// bindata_read reads the given file from disk. It returns an error on failure.
 | 
				
			||||||
 | 
					func bindata_read(path, name string) ([]byte, error) {
 | 
				
			||||||
 | 
						buf, err := ioutil.ReadFile(path)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							err = fmt.Errorf("Error reading asset %s at %s: %v", name, path, err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return buf, err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// conf_app_ini reads file data from disk. It returns an error on failure.
 | 
				
			||||||
 | 
					func conf_app_ini() ([]byte, error) {
 | 
				
			||||||
 | 
						return bindata_read(
 | 
				
			||||||
 | 
							"/Users/jiahuachen/Applications/Go/src/github.com/gogits/gogs/conf/app.ini",
 | 
				
			||||||
 | 
							"conf/app.ini",
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// conf_content_git_bare_zip reads file data from disk. It returns an error on failure.
 | 
				
			||||||
 | 
					func conf_content_git_bare_zip() ([]byte, error) {
 | 
				
			||||||
 | 
						return bindata_read(
 | 
				
			||||||
 | 
							"/Users/jiahuachen/Applications/Go/src/github.com/gogits/gogs/conf/content/git-bare.zip",
 | 
				
			||||||
 | 
							"conf/content/git-bare.zip",
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// conf_etc_supervisord_conf reads file data from disk. It returns an error on failure.
 | 
				
			||||||
 | 
					func conf_etc_supervisord_conf() ([]byte, error) {
 | 
				
			||||||
 | 
						return bindata_read(
 | 
				
			||||||
 | 
							"/Users/jiahuachen/Applications/Go/src/github.com/gogits/gogs/conf/etc/supervisord.conf",
 | 
				
			||||||
 | 
							"conf/etc/supervisord.conf",
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// conf_gitignore_android reads file data from disk. It returns an error on failure.
 | 
				
			||||||
 | 
					func conf_gitignore_android() ([]byte, error) {
 | 
				
			||||||
 | 
						return bindata_read(
 | 
				
			||||||
 | 
							"/Users/jiahuachen/Applications/Go/src/github.com/gogits/gogs/conf/gitignore/Android",
 | 
				
			||||||
 | 
							"conf/gitignore/Android",
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// conf_gitignore_c reads file data from disk. It returns an error on failure.
 | 
				
			||||||
 | 
					func conf_gitignore_c() ([]byte, error) {
 | 
				
			||||||
 | 
						return bindata_read(
 | 
				
			||||||
 | 
							"/Users/jiahuachen/Applications/Go/src/github.com/gogits/gogs/conf/gitignore/C",
 | 
				
			||||||
 | 
							"conf/gitignore/C",
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// conf_gitignore_c_sharp reads file data from disk. It returns an error on failure.
 | 
				
			||||||
 | 
					func conf_gitignore_c_sharp() ([]byte, error) {
 | 
				
			||||||
 | 
						return bindata_read(
 | 
				
			||||||
 | 
							"/Users/jiahuachen/Applications/Go/src/github.com/gogits/gogs/conf/gitignore/C Sharp",
 | 
				
			||||||
 | 
							"conf/gitignore/C Sharp",
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// conf_gitignore_c_ reads file data from disk. It returns an error on failure.
 | 
				
			||||||
 | 
					func conf_gitignore_c_() ([]byte, error) {
 | 
				
			||||||
 | 
						return bindata_read(
 | 
				
			||||||
 | 
							"/Users/jiahuachen/Applications/Go/src/github.com/gogits/gogs/conf/gitignore/C++",
 | 
				
			||||||
 | 
							"conf/gitignore/C++",
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// conf_gitignore_google_go reads file data from disk. It returns an error on failure.
 | 
				
			||||||
 | 
					func conf_gitignore_google_go() ([]byte, error) {
 | 
				
			||||||
 | 
						return bindata_read(
 | 
				
			||||||
 | 
							"/Users/jiahuachen/Applications/Go/src/github.com/gogits/gogs/conf/gitignore/Google Go",
 | 
				
			||||||
 | 
							"conf/gitignore/Google Go",
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// conf_gitignore_java reads file data from disk. It returns an error on failure.
 | 
				
			||||||
 | 
					func conf_gitignore_java() ([]byte, error) {
 | 
				
			||||||
 | 
						return bindata_read(
 | 
				
			||||||
 | 
							"/Users/jiahuachen/Applications/Go/src/github.com/gogits/gogs/conf/gitignore/Java",
 | 
				
			||||||
 | 
							"conf/gitignore/Java",
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// conf_gitignore_objective_c reads file data from disk. It returns an error on failure.
 | 
				
			||||||
 | 
					func conf_gitignore_objective_c() ([]byte, error) {
 | 
				
			||||||
 | 
						return bindata_read(
 | 
				
			||||||
 | 
							"/Users/jiahuachen/Applications/Go/src/github.com/gogits/gogs/conf/gitignore/Objective-C",
 | 
				
			||||||
 | 
							"conf/gitignore/Objective-C",
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// conf_gitignore_python reads file data from disk. It returns an error on failure.
 | 
				
			||||||
 | 
					func conf_gitignore_python() ([]byte, error) {
 | 
				
			||||||
 | 
						return bindata_read(
 | 
				
			||||||
 | 
							"/Users/jiahuachen/Applications/Go/src/github.com/gogits/gogs/conf/gitignore/Python",
 | 
				
			||||||
 | 
							"conf/gitignore/Python",
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// conf_gitignore_ruby reads file data from disk. It returns an error on failure.
 | 
				
			||||||
 | 
					func conf_gitignore_ruby() ([]byte, error) {
 | 
				
			||||||
 | 
						return bindata_read(
 | 
				
			||||||
 | 
							"/Users/jiahuachen/Applications/Go/src/github.com/gogits/gogs/conf/gitignore/Ruby",
 | 
				
			||||||
 | 
							"conf/gitignore/Ruby",
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// conf_license_affero_gpl reads file data from disk. It returns an error on failure.
 | 
				
			||||||
 | 
					func conf_license_affero_gpl() ([]byte, error) {
 | 
				
			||||||
 | 
						return bindata_read(
 | 
				
			||||||
 | 
							"/Users/jiahuachen/Applications/Go/src/github.com/gogits/gogs/conf/license/Affero GPL",
 | 
				
			||||||
 | 
							"conf/license/Affero GPL",
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// conf_license_apache_v2_license reads file data from disk. It returns an error on failure.
 | 
				
			||||||
 | 
					func conf_license_apache_v2_license() ([]byte, error) {
 | 
				
			||||||
 | 
						return bindata_read(
 | 
				
			||||||
 | 
							"/Users/jiahuachen/Applications/Go/src/github.com/gogits/gogs/conf/license/Apache v2 License",
 | 
				
			||||||
 | 
							"conf/license/Apache v2 License",
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// conf_license_artistic_license_2_0 reads file data from disk. It returns an error on failure.
 | 
				
			||||||
 | 
					func conf_license_artistic_license_2_0() ([]byte, error) {
 | 
				
			||||||
 | 
						return bindata_read(
 | 
				
			||||||
 | 
							"/Users/jiahuachen/Applications/Go/src/github.com/gogits/gogs/conf/license/Artistic License 2.0",
 | 
				
			||||||
 | 
							"conf/license/Artistic License 2.0",
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// conf_license_bsd_3_clause_license reads file data from disk. It returns an error on failure.
 | 
				
			||||||
 | 
					func conf_license_bsd_3_clause_license() ([]byte, error) {
 | 
				
			||||||
 | 
						return bindata_read(
 | 
				
			||||||
 | 
							"/Users/jiahuachen/Applications/Go/src/github.com/gogits/gogs/conf/license/BSD (3-Clause) License",
 | 
				
			||||||
 | 
							"conf/license/BSD (3-Clause) License",
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// conf_license_gpl_v2 reads file data from disk. It returns an error on failure.
 | 
				
			||||||
 | 
					func conf_license_gpl_v2() ([]byte, error) {
 | 
				
			||||||
 | 
						return bindata_read(
 | 
				
			||||||
 | 
							"/Users/jiahuachen/Applications/Go/src/github.com/gogits/gogs/conf/license/GPL v2",
 | 
				
			||||||
 | 
							"conf/license/GPL v2",
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// conf_license_mit_license reads file data from disk. It returns an error on failure.
 | 
				
			||||||
 | 
					func conf_license_mit_license() ([]byte, error) {
 | 
				
			||||||
 | 
						return bindata_read(
 | 
				
			||||||
 | 
							"/Users/jiahuachen/Applications/Go/src/github.com/gogits/gogs/conf/license/MIT License",
 | 
				
			||||||
 | 
							"conf/license/MIT License",
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// conf_mysql_sql reads file data from disk. It returns an error on failure.
 | 
				
			||||||
 | 
					func conf_mysql_sql() ([]byte, error) {
 | 
				
			||||||
 | 
						return bindata_read(
 | 
				
			||||||
 | 
							"/Users/jiahuachen/Applications/Go/src/github.com/gogits/gogs/conf/mysql.sql",
 | 
				
			||||||
 | 
							"conf/mysql.sql",
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// conf_supervisor_ini reads file data from disk. It returns an error on failure.
 | 
				
			||||||
 | 
					func conf_supervisor_ini() ([]byte, error) {
 | 
				
			||||||
 | 
						return bindata_read(
 | 
				
			||||||
 | 
							"/Users/jiahuachen/Applications/Go/src/github.com/gogits/gogs/conf/supervisor.ini",
 | 
				
			||||||
 | 
							"conf/supervisor.ini",
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Asset loads and returns the asset for the given name.
 | 
				
			||||||
 | 
					// It returns an error if the asset could not be found or
 | 
				
			||||||
 | 
					// could not be loaded.
 | 
				
			||||||
 | 
					func Asset(name string) ([]byte, error) {
 | 
				
			||||||
 | 
						cannonicalName := strings.Replace(name, "\\", "/", -1)
 | 
				
			||||||
 | 
						if f, ok := _bindata[cannonicalName]; ok {
 | 
				
			||||||
 | 
							return f()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil, fmt.Errorf("Asset %s not found", name)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// AssetNames returns the names of the assets.
 | 
				
			||||||
 | 
					func AssetNames() []string {
 | 
				
			||||||
 | 
						names := make([]string, 0, len(_bindata))
 | 
				
			||||||
 | 
						for name := range _bindata {
 | 
				
			||||||
 | 
							names = append(names, name)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return names
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// _bindata is a table, holding each asset generator, mapped to its name.
 | 
				
			||||||
 | 
					var _bindata = map[string]func() ([]byte, error){
 | 
				
			||||||
 | 
						"conf/app.ini":                        conf_app_ini,
 | 
				
			||||||
 | 
						"conf/content/git-bare.zip":           conf_content_git_bare_zip,
 | 
				
			||||||
 | 
						"conf/etc/supervisord.conf":           conf_etc_supervisord_conf,
 | 
				
			||||||
 | 
						"conf/gitignore/Android":              conf_gitignore_android,
 | 
				
			||||||
 | 
						"conf/gitignore/C":                    conf_gitignore_c,
 | 
				
			||||||
 | 
						"conf/gitignore/C Sharp":              conf_gitignore_c_sharp,
 | 
				
			||||||
 | 
						"conf/gitignore/C++":                  conf_gitignore_c_,
 | 
				
			||||||
 | 
						"conf/gitignore/Google Go":            conf_gitignore_google_go,
 | 
				
			||||||
 | 
						"conf/gitignore/Java":                 conf_gitignore_java,
 | 
				
			||||||
 | 
						"conf/gitignore/Objective-C":          conf_gitignore_objective_c,
 | 
				
			||||||
 | 
						"conf/gitignore/Python":               conf_gitignore_python,
 | 
				
			||||||
 | 
						"conf/gitignore/Ruby":                 conf_gitignore_ruby,
 | 
				
			||||||
 | 
						"conf/license/Affero GPL":             conf_license_affero_gpl,
 | 
				
			||||||
 | 
						"conf/license/Apache v2 License":      conf_license_apache_v2_license,
 | 
				
			||||||
 | 
						"conf/license/Artistic License 2.0":   conf_license_artistic_license_2_0,
 | 
				
			||||||
 | 
						"conf/license/BSD (3-Clause) License": conf_license_bsd_3_clause_license,
 | 
				
			||||||
 | 
						"conf/license/GPL v2":                 conf_license_gpl_v2,
 | 
				
			||||||
 | 
						"conf/license/MIT License":            conf_license_mit_license,
 | 
				
			||||||
 | 
						"conf/mysql.sql":                      conf_mysql_sql,
 | 
				
			||||||
 | 
						"conf/supervisor.ini":                 conf_supervisor_ini,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -6,6 +6,8 @@
 | 
				
			|||||||
package log
 | 
					package log
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/gogits/logs"
 | 
						"github.com/gogits/logs"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -69,3 +71,11 @@ func Critical(format string, v ...interface{}) {
 | 
				
			|||||||
		logger.Critical(format, v...)
 | 
							logger.Critical(format, v...)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Fatal(format string, v ...interface{}) {
 | 
				
			||||||
 | 
						Error(format, v...)
 | 
				
			||||||
 | 
						for _, l := range loggers {
 | 
				
			||||||
 | 
							l.Close()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						os.Exit(2)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,28 +14,29 @@ import (
 | 
				
			|||||||
	"github.com/gogits/gogs/modules/base"
 | 
						"github.com/gogits/gogs/modules/base"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/log"
 | 
						"github.com/gogits/gogs/modules/log"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/middleware"
 | 
						"github.com/gogits/gogs/modules/middleware"
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Create New mail message use MailFrom and MailUser
 | 
					// Create New mail message use MailFrom and MailUser
 | 
				
			||||||
func NewMailMessageFrom(To []string, from, subject, body string) Message {
 | 
					func NewMailMessageFrom(To []string, from, subject, body string) Message {
 | 
				
			||||||
	msg := NewHtmlMessage(To, from, subject, body)
 | 
						msg := NewHtmlMessage(To, from, subject, body)
 | 
				
			||||||
	msg.User = base.MailService.User
 | 
						msg.User = setting.MailService.User
 | 
				
			||||||
	return msg
 | 
						return msg
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Create New mail message use MailFrom and MailUser
 | 
					// Create New mail message use MailFrom and MailUser
 | 
				
			||||||
func NewMailMessage(To []string, subject, body string) Message {
 | 
					func NewMailMessage(To []string, subject, body string) Message {
 | 
				
			||||||
	return NewMailMessageFrom(To, base.MailService.User, subject, body)
 | 
						return NewMailMessageFrom(To, setting.MailService.User, subject, body)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func GetMailTmplData(user *models.User) map[interface{}]interface{} {
 | 
					func GetMailTmplData(user *models.User) map[interface{}]interface{} {
 | 
				
			||||||
	data := make(map[interface{}]interface{}, 10)
 | 
						data := make(map[interface{}]interface{}, 10)
 | 
				
			||||||
	data["AppName"] = base.AppName
 | 
						data["AppName"] = setting.AppName
 | 
				
			||||||
	data["AppVer"] = base.AppVer
 | 
						data["AppVer"] = setting.AppVer
 | 
				
			||||||
	data["AppUrl"] = base.AppUrl
 | 
						data["AppUrl"] = setting.AppUrl
 | 
				
			||||||
	data["AppLogo"] = base.AppLogo
 | 
						data["AppLogo"] = setting.AppLogo
 | 
				
			||||||
	data["ActiveCodeLives"] = base.Service.ActiveCodeLives / 60
 | 
						data["ActiveCodeLives"] = setting.Service.ActiveCodeLives / 60
 | 
				
			||||||
	data["ResetPwdCodeLives"] = base.Service.ResetPwdCodeLives / 60
 | 
						data["ResetPwdCodeLives"] = setting.Service.ResetPwdCodeLives / 60
 | 
				
			||||||
	if user != nil {
 | 
						if user != nil {
 | 
				
			||||||
		data["User"] = user
 | 
							data["User"] = user
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -44,7 +45,7 @@ func GetMailTmplData(user *models.User) map[interface{}]interface{} {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// create a time limit code for user active
 | 
					// create a time limit code for user active
 | 
				
			||||||
func CreateUserActiveCode(user *models.User, startInf interface{}) string {
 | 
					func CreateUserActiveCode(user *models.User, startInf interface{}) string {
 | 
				
			||||||
	minutes := base.Service.ActiveCodeLives
 | 
						minutes := setting.Service.ActiveCodeLives
 | 
				
			||||||
	data := base.ToStr(user.Id) + user.Email + user.LowerName + user.Passwd + user.Rands
 | 
						data := base.ToStr(user.Id) + user.Email + user.LowerName + user.Passwd + user.Rands
 | 
				
			||||||
	code := base.CreateTimeLimitCode(data, minutes, startInf)
 | 
						code := base.CreateTimeLimitCode(data, minutes, startInf)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -139,7 +140,7 @@ func SendIssueNotifyMail(user, owner *models.User, repo *models.Repository, issu
 | 
				
			|||||||
	subject := fmt.Sprintf("[%s] %s(#%d)", repo.Name, issue.Name, issue.Index)
 | 
						subject := fmt.Sprintf("[%s] %s(#%d)", repo.Name, issue.Name, issue.Index)
 | 
				
			||||||
	content := fmt.Sprintf("%s<br>-<br> <a href=\"%s%s/%s/issues/%d\">View it on Gogs</a>.",
 | 
						content := fmt.Sprintf("%s<br>-<br> <a href=\"%s%s/%s/issues/%d\">View it on Gogs</a>.",
 | 
				
			||||||
		base.RenderSpecialLink([]byte(issue.Content), owner.Name+"/"+repo.Name),
 | 
							base.RenderSpecialLink([]byte(issue.Content), owner.Name+"/"+repo.Name),
 | 
				
			||||||
		base.AppUrl, owner.Name, repo.Name, issue.Index)
 | 
							setting.AppUrl, owner.Name, repo.Name, issue.Index)
 | 
				
			||||||
	msg := NewMailMessageFrom(tos, user.Email, subject, content)
 | 
						msg := NewMailMessageFrom(tos, user.Email, subject, content)
 | 
				
			||||||
	msg.Info = fmt.Sprintf("Subject: %s, send issue notify emails", subject)
 | 
						msg.Info = fmt.Sprintf("Subject: %s, send issue notify emails", subject)
 | 
				
			||||||
	SendAsync(&msg)
 | 
						SendAsync(&msg)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,8 +9,8 @@ import (
 | 
				
			|||||||
	"net/smtp"
 | 
						"net/smtp"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/gogits/gogs/modules/base"
 | 
					 | 
				
			||||||
	"github.com/gogits/gogs/modules/log"
 | 
						"github.com/gogits/gogs/modules/log"
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Message struct {
 | 
					type Message struct {
 | 
				
			||||||
@@ -41,7 +41,7 @@ func (m Message) Content() string {
 | 
				
			|||||||
var mailQueue chan *Message
 | 
					var mailQueue chan *Message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewMailerContext() {
 | 
					func NewMailerContext() {
 | 
				
			||||||
	mailQueue = make(chan *Message, base.Cfg.MustInt("mailer", "SEND_BUFFER_LEN", 10))
 | 
						mailQueue = make(chan *Message, setting.Cfg.MustInt("mailer", "SEND_BUFFER_LEN", 10))
 | 
				
			||||||
	go processMailQueue()
 | 
						go processMailQueue()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -67,7 +67,7 @@ func processMailQueue() {
 | 
				
			|||||||
// Direct Send mail message
 | 
					// Direct Send mail message
 | 
				
			||||||
func Send(msg *Message) (int, error) {
 | 
					func Send(msg *Message) (int, error) {
 | 
				
			||||||
	log.Trace("Sending mails to: %s", strings.Join(msg.To, "; "))
 | 
						log.Trace("Sending mails to: %s", strings.Join(msg.To, "; "))
 | 
				
			||||||
	host := strings.Split(base.MailService.Host, ":")
 | 
						host := strings.Split(setting.MailService.Host, ":")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// get message body
 | 
						// get message body
 | 
				
			||||||
	content := msg.Content()
 | 
						content := msg.Content()
 | 
				
			||||||
@@ -78,14 +78,14 @@ func Send(msg *Message) (int, error) {
 | 
				
			|||||||
		return 0, fmt.Errorf("empty email body")
 | 
							return 0, fmt.Errorf("empty email body")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	auth := smtp.PlainAuth("", base.MailService.User, base.MailService.Passwd, host[0])
 | 
						auth := smtp.PlainAuth("", setting.MailService.User, setting.MailService.Passwd, host[0])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if msg.Massive {
 | 
						if msg.Massive {
 | 
				
			||||||
		// send mail to multiple emails one by one
 | 
							// send mail to multiple emails one by one
 | 
				
			||||||
		num := 0
 | 
							num := 0
 | 
				
			||||||
		for _, to := range msg.To {
 | 
							for _, to := range msg.To {
 | 
				
			||||||
			body := []byte("To: " + to + "\r\n" + content)
 | 
								body := []byte("To: " + to + "\r\n" + content)
 | 
				
			||||||
			err := smtp.SendMail(base.MailService.Host, auth, msg.From, []string{to}, body)
 | 
								err := smtp.SendMail(setting.MailService.Host, auth, msg.From, []string{to}, body)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return num, err
 | 
									return num, err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -96,7 +96,7 @@ func Send(msg *Message) (int, error) {
 | 
				
			|||||||
		body := []byte("To: " + strings.Join(msg.To, ";") + "\r\n" + content)
 | 
							body := []byte("To: " + strings.Join(msg.To, ";") + "\r\n" + content)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// send to multiple emails in one message
 | 
							// send to multiple emails in one message
 | 
				
			||||||
		err := smtp.SendMail(base.MailService.Host, auth, msg.From, msg.To, body)
 | 
							err := smtp.SendMail(setting.MailService.Host, auth, msg.From, msg.To, body)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return 0, err
 | 
								return 0, err
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,7 +10,7 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"github.com/go-martini/martini"
 | 
						"github.com/go-martini/martini"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/gogits/gogs/modules/base"
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type ToggleOptions struct {
 | 
					type ToggleOptions struct {
 | 
				
			||||||
@@ -23,7 +23,7 @@ type ToggleOptions struct {
 | 
				
			|||||||
func Toggle(options *ToggleOptions) martini.Handler {
 | 
					func Toggle(options *ToggleOptions) martini.Handler {
 | 
				
			||||||
	return func(ctx *Context) {
 | 
						return func(ctx *Context) {
 | 
				
			||||||
		// Cannot view any page before installation.
 | 
							// Cannot view any page before installation.
 | 
				
			||||||
		if !base.InstallLock {
 | 
							if !setting.InstallLock {
 | 
				
			||||||
			ctx.Redirect("/install")
 | 
								ctx.Redirect("/install")
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -48,7 +48,7 @@ func Toggle(options *ToggleOptions) martini.Handler {
 | 
				
			|||||||
				ctx.SetCookie("redirect_to", "/"+url.QueryEscape(ctx.Req.RequestURI))
 | 
									ctx.SetCookie("redirect_to", "/"+url.QueryEscape(ctx.Req.RequestURI))
 | 
				
			||||||
				ctx.Redirect("/user/login")
 | 
									ctx.Redirect("/user/login")
 | 
				
			||||||
				return
 | 
									return
 | 
				
			||||||
			} else if !ctx.User.IsActive && base.Service.RegisterEmailConfirm {
 | 
								} else if !ctx.User.IsActive && setting.Service.RegisterEmailConfirm {
 | 
				
			||||||
				ctx.Data["Title"] = "Activate Your Account"
 | 
									ctx.Data["Title"] = "Activate Your Account"
 | 
				
			||||||
				ctx.HTML(200, "user/activate")
 | 
									ctx.HTML(200, "user/activate")
 | 
				
			||||||
				return
 | 
									return
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,6 +28,7 @@ import (
 | 
				
			|||||||
	"github.com/gogits/gogs/modules/auth"
 | 
						"github.com/gogits/gogs/modules/auth"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/base"
 | 
						"github.com/gogits/gogs/modules/base"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/log"
 | 
						"github.com/gogits/gogs/modules/log"
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Context represents context of a request.
 | 
					// Context represents context of a request.
 | 
				
			||||||
@@ -325,14 +326,14 @@ func InitContext() martini.Handler {
 | 
				
			|||||||
			// p:      p,
 | 
								// p:      p,
 | 
				
			||||||
			Req:    r,
 | 
								Req:    r,
 | 
				
			||||||
			Res:    res,
 | 
								Res:    res,
 | 
				
			||||||
			Cache:  base.Cache,
 | 
								Cache:  setting.Cache,
 | 
				
			||||||
			Render: rd,
 | 
								Render: rd,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ctx.Data["PageStartTime"] = time.Now()
 | 
							ctx.Data["PageStartTime"] = time.Now()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// start session
 | 
							// start session
 | 
				
			||||||
		ctx.Session = base.SessionManager.SessionStart(res, r)
 | 
							ctx.Session = setting.SessionManager.SessionStart(res, r)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Get flash.
 | 
							// Get flash.
 | 
				
			||||||
		values, err := url.ParseQuery(ctx.GetCookie("gogs_flash"))
 | 
							values, err := url.ParseQuery(ctx.GetCookie("gogs_flash"))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,7 +13,7 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"github.com/go-martini/martini"
 | 
						"github.com/go-martini/martini"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/gogits/gogs/modules/base"
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var isWindows bool
 | 
					var isWindows bool
 | 
				
			||||||
@@ -24,7 +24,7 @@ func init() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func Logger() martini.Handler {
 | 
					func Logger() martini.Handler {
 | 
				
			||||||
	return func(res http.ResponseWriter, req *http.Request, ctx martini.Context, log *log.Logger) {
 | 
						return func(res http.ResponseWriter, req *http.Request, ctx martini.Context, log *log.Logger) {
 | 
				
			||||||
		if base.DisableRouterLog {
 | 
							if setting.DisableRouterLog {
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -39,25 +39,17 @@ var helperFuncs = template.FuncMap{
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
type Delims struct {
 | 
					type Delims struct {
 | 
				
			||||||
	Left  string
 | 
						Left  string
 | 
				
			||||||
 | 
					 | 
				
			||||||
	Right string
 | 
						Right string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type RenderOptions struct {
 | 
					type RenderOptions struct {
 | 
				
			||||||
	Directory       string
 | 
						Directory       string
 | 
				
			||||||
 | 
					 | 
				
			||||||
	Layout          string
 | 
						Layout          string
 | 
				
			||||||
 | 
					 | 
				
			||||||
	Extensions      []string
 | 
						Extensions      []string
 | 
				
			||||||
 | 
					 | 
				
			||||||
	Funcs           []template.FuncMap
 | 
						Funcs           []template.FuncMap
 | 
				
			||||||
 | 
					 | 
				
			||||||
	Delims          Delims
 | 
						Delims          Delims
 | 
				
			||||||
 | 
					 | 
				
			||||||
	Charset         string
 | 
						Charset         string
 | 
				
			||||||
 | 
					 | 
				
			||||||
	IndentJSON      bool
 | 
						IndentJSON      bool
 | 
				
			||||||
 | 
					 | 
				
			||||||
	HTMLContentType string
 | 
						HTMLContentType string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,8 +15,8 @@ import (
 | 
				
			|||||||
	"github.com/gogits/git"
 | 
						"github.com/gogits/git"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/gogits/gogs/models"
 | 
						"github.com/gogits/gogs/models"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/base"
 | 
					 | 
				
			||||||
	"github.com/gogits/gogs/modules/log"
 | 
						"github.com/gogits/gogs/modules/log"
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func RepoAssignment(redirect bool, args ...bool) martini.Handler {
 | 
					func RepoAssignment(redirect bool, args ...bool) martini.Handler {
 | 
				
			||||||
@@ -159,17 +159,17 @@ func RepoAssignment(redirect bool, args ...bool) martini.Handler {
 | 
				
			|||||||
		ctx.Data["IsRepositoryOwner"] = ctx.Repo.IsOwner
 | 
							ctx.Data["IsRepositoryOwner"] = ctx.Repo.IsOwner
 | 
				
			||||||
		ctx.Data["BranchName"] = ""
 | 
							ctx.Data["BranchName"] = ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if base.SshPort != 22 {
 | 
							if setting.SshPort != 22 {
 | 
				
			||||||
			ctx.Repo.CloneLink.SSH = fmt.Sprintf("ssh://%s@%s/%s/%s.git", base.RunUser, base.Domain, user.LowerName, repo.LowerName)
 | 
								ctx.Repo.CloneLink.SSH = fmt.Sprintf("ssh://%s@%s/%s/%s.git", setting.RunUser, setting.Domain, user.LowerName, repo.LowerName)
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			ctx.Repo.CloneLink.SSH = fmt.Sprintf("%s@%s:%s/%s.git", base.RunUser, base.Domain, user.LowerName, repo.LowerName)
 | 
								ctx.Repo.CloneLink.SSH = fmt.Sprintf("%s@%s:%s/%s.git", setting.RunUser, setting.Domain, user.LowerName, repo.LowerName)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		ctx.Repo.CloneLink.HTTPS = fmt.Sprintf("%s%s/%s.git", base.AppUrl, user.LowerName, repo.LowerName)
 | 
							ctx.Repo.CloneLink.HTTPS = fmt.Sprintf("%s%s/%s.git", setting.AppUrl, user.LowerName, repo.LowerName)
 | 
				
			||||||
		ctx.Data["CloneLink"] = ctx.Repo.CloneLink
 | 
							ctx.Data["CloneLink"] = ctx.Repo.CloneLink
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if ctx.Repo.Repository.IsGoget {
 | 
							if ctx.Repo.Repository.IsGoget {
 | 
				
			||||||
			ctx.Data["GoGetLink"] = fmt.Sprintf("%s%s/%s", base.AppUrl, user.LowerName, repo.LowerName)
 | 
								ctx.Data["GoGetLink"] = fmt.Sprintf("%s%s/%s", setting.AppUrl, user.LowerName, repo.LowerName)
 | 
				
			||||||
			ctx.Data["GoGetImport"] = fmt.Sprintf("%s/%s/%s", base.Domain, user.LowerName, repo.LowerName)
 | 
								ctx.Data["GoGetImport"] = fmt.Sprintf("%s/%s/%s", setting.Domain, user.LowerName, repo.LowerName)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// when repo is bare, not valid branch
 | 
							// when repo is bare, not valid branch
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,7 +2,7 @@
 | 
				
			|||||||
// Use of this source code is governed by a MIT-style
 | 
					// Use of this source code is governed by a MIT-style
 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					// license that can be found in the LICENSE file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package base
 | 
					package setting
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
@@ -14,78 +14,171 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"github.com/Unknwon/com"
 | 
						"github.com/Unknwon/com"
 | 
				
			||||||
	"github.com/Unknwon/goconfig"
 | 
						"github.com/Unknwon/goconfig"
 | 
				
			||||||
	qlog "github.com/qiniu/log"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/gogits/cache"
 | 
						"github.com/gogits/cache"
 | 
				
			||||||
	"github.com/gogits/session"
 | 
						"github.com/gogits/session"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/bin"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/log"
 | 
						"github.com/gogits/gogs/modules/log"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Mailer represents mail service.
 | 
					type Scheme string
 | 
				
			||||||
type Mailer struct {
 | 
					 | 
				
			||||||
	Name         string
 | 
					 | 
				
			||||||
	Host         string
 | 
					 | 
				
			||||||
	User, Passwd string
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
type OauthInfo struct {
 | 
					const (
 | 
				
			||||||
	ClientId, ClientSecret string
 | 
						HTTP  Scheme = "http"
 | 
				
			||||||
	Scopes                 string
 | 
						HTTPS Scheme = "https"
 | 
				
			||||||
	AuthUrl, TokenUrl      string
 | 
					)
 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Oauther represents oauth service.
 | 
					 | 
				
			||||||
type Oauther struct {
 | 
					 | 
				
			||||||
	GitHub, Google, Tencent,
 | 
					 | 
				
			||||||
	Twitter, Weibo bool
 | 
					 | 
				
			||||||
	OauthInfos map[string]*OauthInfo
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
 | 
						// App settings.
 | 
				
			||||||
	AppVer  string
 | 
						AppVer  string
 | 
				
			||||||
	AppName string
 | 
						AppName string
 | 
				
			||||||
	AppLogo string
 | 
						AppLogo string
 | 
				
			||||||
	AppUrl  string
 | 
						AppUrl  string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Server settings.
 | 
				
			||||||
 | 
						Protocol           Scheme
 | 
				
			||||||
 | 
						Domain             string
 | 
				
			||||||
 | 
						HttpAddr, HttpPort string
 | 
				
			||||||
	SshPort            int
 | 
						SshPort            int
 | 
				
			||||||
	OfflineMode        bool
 | 
						OfflineMode        bool
 | 
				
			||||||
	DisableRouterLog   bool
 | 
						DisableRouterLog   bool
 | 
				
			||||||
	ProdMode         bool
 | 
						CertFile, KeyFile  string
 | 
				
			||||||
	Domain           string
 | 
						StaticRootPath     string
 | 
				
			||||||
	SecretKey        string
 | 
					 | 
				
			||||||
	RunUser          string
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	RepoRootPath string
 | 
					 | 
				
			||||||
	ScriptType   string
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Security settings.
 | 
				
			||||||
	InstallLock        bool
 | 
						InstallLock        bool
 | 
				
			||||||
 | 
						SecretKey          string
 | 
				
			||||||
	LogInRememberDays  int
 | 
						LogInRememberDays  int
 | 
				
			||||||
	CookieUserName     string
 | 
						CookieUserName     string
 | 
				
			||||||
	CookieRememberName string
 | 
						CookieRememberName string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Cfg          *goconfig.ConfigFile
 | 
						// Repository settings.
 | 
				
			||||||
	MailService  *Mailer
 | 
						RepoRootPath string
 | 
				
			||||||
	OauthService *Oauther
 | 
						ScriptType   string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Picture settings.
 | 
				
			||||||
 | 
						PictureService  string
 | 
				
			||||||
 | 
						DisableGravatar bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Log settings.
 | 
				
			||||||
	LogModes   []string
 | 
						LogModes   []string
 | 
				
			||||||
	LogConfigs []string
 | 
						LogConfigs []string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Cache settings.
 | 
				
			||||||
	Cache        cache.Cache
 | 
						Cache        cache.Cache
 | 
				
			||||||
	CacheAdapter string
 | 
						CacheAdapter string
 | 
				
			||||||
	CacheConfig  string
 | 
						CacheConfig  string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						EnableRedis    bool
 | 
				
			||||||
 | 
						EnableMemcache bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Session settings.
 | 
				
			||||||
	SessionProvider string
 | 
						SessionProvider string
 | 
				
			||||||
	SessionConfig   *session.Config
 | 
						SessionConfig   *session.Config
 | 
				
			||||||
	SessionManager  *session.Manager
 | 
						SessionManager  *session.Manager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	PictureService  string
 | 
						// Global setting objects.
 | 
				
			||||||
	DisableGravatar bool
 | 
						Cfg        *goconfig.ConfigFile
 | 
				
			||||||
 | 
						CustomPath string // Custom directory path.
 | 
				
			||||||
	EnableRedis    bool
 | 
						ProdMode   bool
 | 
				
			||||||
	EnableMemcache bool
 | 
						RunUser    string
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// WorkDir returns absolute path of work directory.
 | 
				
			||||||
 | 
					func WorkDir() (string, error) {
 | 
				
			||||||
 | 
						file, err := exec.LookPath(os.Args[0])
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return "", err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						p, err := filepath.Abs(file)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return "", err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return path.Dir(strings.Replace(p, "\\", "/", -1)), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewConfigContext initializes configuration context.
 | 
				
			||||||
 | 
					func NewConfigContext() {
 | 
				
			||||||
 | 
						workDir, err := WorkDir()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Fatal("Fail to get work directory: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						data, err := bin.Asset("conf/app.ini")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Fatal("Fail to read 'conf/app.ini': %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						Cfg, err = goconfig.LoadFromData(data)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Fatal("Fail to parse 'conf/app.ini': %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						CustomPath = os.Getenv("GOGS_CUSTOM")
 | 
				
			||||||
 | 
						if len(CustomPath) == 0 {
 | 
				
			||||||
 | 
							CustomPath = path.Join(workDir, "custom")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						log.Trace("Custom path: %s", CustomPath)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfgPath := path.Join(CustomPath, "conf/app.ini")
 | 
				
			||||||
 | 
						if com.IsFile(cfgPath) {
 | 
				
			||||||
 | 
							if err = Cfg.AppendFiles(cfgPath); err != nil {
 | 
				
			||||||
 | 
								log.Fatal("Fail to load custom 'conf/app.ini': %v", err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							log.Warn("No custom 'conf/app.ini' found")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						AppName = Cfg.MustValue("", "APP_NAME", "Gogs: Go Git Service")
 | 
				
			||||||
 | 
						AppLogo = Cfg.MustValue("", "APP_LOGO", "img/favicon.png")
 | 
				
			||||||
 | 
						AppUrl = Cfg.MustValue("server", "ROOT_URL", "http://localhost:3000")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Protocol = HTTP
 | 
				
			||||||
 | 
						if Cfg.MustValue("server", "PROTOCOL") == "https" {
 | 
				
			||||||
 | 
							Protocol = HTTPS
 | 
				
			||||||
 | 
							CertFile = Cfg.MustValue("server", "CERT_FILE")
 | 
				
			||||||
 | 
							KeyFile = Cfg.MustValue("server", "KEY_FILE")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						Domain = Cfg.MustValue("server", "DOMAIN", "localhost")
 | 
				
			||||||
 | 
						HttpAddr = Cfg.MustValue("server", "HTTP_ADDR", "0.0.0.0")
 | 
				
			||||||
 | 
						HttpPort = Cfg.MustValue("server", "HTTP_PORT", "3000")
 | 
				
			||||||
 | 
						SshPort = Cfg.MustInt("server", "SSH_PORT", 22)
 | 
				
			||||||
 | 
						OfflineMode = Cfg.MustBool("server", "OFFLINE_MODE")
 | 
				
			||||||
 | 
						DisableRouterLog = Cfg.MustBool("server", "DISABLE_ROUTER_LOG")
 | 
				
			||||||
 | 
						StaticRootPath = Cfg.MustValue("server", "STATIC_ROOT_PATH")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						InstallLock = Cfg.MustBool("security", "INSTALL_LOCK")
 | 
				
			||||||
 | 
						SecretKey = Cfg.MustValue("security", "SECRET_KEY")
 | 
				
			||||||
 | 
						LogInRememberDays = Cfg.MustInt("security", "LOGIN_REMEMBER_DAYS")
 | 
				
			||||||
 | 
						CookieUserName = Cfg.MustValue("security", "COOKIE_USERNAME")
 | 
				
			||||||
 | 
						CookieRememberName = Cfg.MustValue("security", "COOKIE_REMEMBER_NAME")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						RunUser = Cfg.MustValue("", "RUN_USER")
 | 
				
			||||||
 | 
						curUser := os.Getenv("USER")
 | 
				
			||||||
 | 
						if len(curUser) == 0 {
 | 
				
			||||||
 | 
							curUser = os.Getenv("USERNAME")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// Does not check run user when the install lock is off.
 | 
				
			||||||
 | 
						if InstallLock && RunUser != curUser {
 | 
				
			||||||
 | 
							log.Fatal("Expect user(%s) but current user is: %s", RunUser, curUser)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Determine and create root git reposiroty path.
 | 
				
			||||||
 | 
						homeDir, err := com.HomeDir()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Fatal("Fail to get home directory: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						RepoRootPath = Cfg.MustValue("repository", "ROOT", filepath.Join(homeDir, "gogs-repositories"))
 | 
				
			||||||
 | 
						if err = os.MkdirAll(RepoRootPath, os.ModePerm); err != nil {
 | 
				
			||||||
 | 
							log.Fatal("Fail to create repository root path(%s): %v", RepoRootPath, err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						ScriptType = Cfg.MustValue("repository", "SCRIPT_TYPE", "bash")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						PictureService = Cfg.MustValueRange("picture", "SERVICE", "server",
 | 
				
			||||||
 | 
							[]string{"server"})
 | 
				
			||||||
 | 
						DisableGravatar = Cfg.MustBool("picture", "DISABLE_GRAVATAR")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var Service struct {
 | 
					var Service struct {
 | 
				
			||||||
	RegisterEmailConfirm bool
 | 
						RegisterEmailConfirm bool
 | 
				
			||||||
	DisableRegistration  bool
 | 
						DisableRegistration  bool
 | 
				
			||||||
@@ -97,17 +190,12 @@ var Service struct {
 | 
				
			|||||||
	LdapAuth             bool
 | 
						LdapAuth             bool
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ExecDir returns absolute path execution(binary) path.
 | 
					func newService() {
 | 
				
			||||||
func ExecDir() (string, error) {
 | 
						Service.ActiveCodeLives = Cfg.MustInt("service", "ACTIVE_CODE_LIVE_MINUTES", 180)
 | 
				
			||||||
	file, err := exec.LookPath(os.Args[0])
 | 
						Service.ResetPwdCodeLives = Cfg.MustInt("service", "RESET_PASSWD_CODE_LIVE_MINUTES", 180)
 | 
				
			||||||
	if err != nil {
 | 
						Service.DisableRegistration = Cfg.MustBool("service", "DISABLE_REGISTRATION")
 | 
				
			||||||
		return "", err
 | 
						Service.RequireSignInView = Cfg.MustBool("service", "REQUIRE_SIGNIN_VIEW")
 | 
				
			||||||
	}
 | 
						Service.EnableCacheAvatar = Cfg.MustBool("service", "ENABLE_CACHE_AVATAR")
 | 
				
			||||||
	p, err := filepath.Abs(file)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return "", err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return path.Dir(strings.Replace(p, "\\", "/", -1)), nil
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var logLevels = map[string]string{
 | 
					var logLevels = map[string]string{
 | 
				
			||||||
@@ -119,14 +207,6 @@ var logLevels = map[string]string{
 | 
				
			|||||||
	"Critical": "5",
 | 
						"Critical": "5",
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func newService() {
 | 
					 | 
				
			||||||
	Service.ActiveCodeLives = Cfg.MustInt("service", "ACTIVE_CODE_LIVE_MINUTES", 180)
 | 
					 | 
				
			||||||
	Service.ResetPwdCodeLives = Cfg.MustInt("service", "RESET_PASSWD_CODE_LIVE_MINUTES", 180)
 | 
					 | 
				
			||||||
	Service.DisableRegistration = Cfg.MustBool("service", "DISABLE_REGISTRATION", false)
 | 
					 | 
				
			||||||
	Service.RequireSignInView = Cfg.MustBool("service", "REQUIRE_SIGNIN_VIEW", false)
 | 
					 | 
				
			||||||
	Service.EnableCacheAvatar = Cfg.MustBool("service", "ENABLE_CACHE_AVATAR", false)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func newLogService() {
 | 
					func newLogService() {
 | 
				
			||||||
	log.Info("%s %s", AppName, AppVer)
 | 
						log.Info("%s %s", AppName, AppVer)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -137,7 +217,7 @@ func newLogService() {
 | 
				
			|||||||
		mode = strings.TrimSpace(mode)
 | 
							mode = strings.TrimSpace(mode)
 | 
				
			||||||
		modeSec := "log." + mode
 | 
							modeSec := "log." + mode
 | 
				
			||||||
		if _, err := Cfg.GetSection(modeSec); err != nil {
 | 
							if _, err := Cfg.GetSection(modeSec); err != nil {
 | 
				
			||||||
			qlog.Fatalf("Unknown log mode: %s\n", mode)
 | 
								log.Fatal("Unknown log mode: %s", mode)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Log level.
 | 
							// Log level.
 | 
				
			||||||
@@ -145,7 +225,7 @@ func newLogService() {
 | 
				
			|||||||
			[]string{"Trace", "Debug", "Info", "Warn", "Error", "Critical"})
 | 
								[]string{"Trace", "Debug", "Info", "Warn", "Error", "Critical"})
 | 
				
			||||||
		level, ok := logLevels[levelName]
 | 
							level, ok := logLevels[levelName]
 | 
				
			||||||
		if !ok {
 | 
							if !ok {
 | 
				
			||||||
			qlog.Fatalf("Unknown log level: %s\n", levelName)
 | 
								log.Fatal("Unknown log level: %s", levelName)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Generate log configuration.
 | 
							// Generate log configuration.
 | 
				
			||||||
@@ -165,8 +245,8 @@ func newLogService() {
 | 
				
			|||||||
				Cfg.MustInt(modeSec, "MAX_DAYS", 7))
 | 
									Cfg.MustInt(modeSec, "MAX_DAYS", 7))
 | 
				
			||||||
		case "conn":
 | 
							case "conn":
 | 
				
			||||||
			LogConfigs[i] = fmt.Sprintf(`{"level":"%s","reconnectOnMsg":%v,"reconnect":%v,"net":"%s","addr":"%s"}`, level,
 | 
								LogConfigs[i] = fmt.Sprintf(`{"level":"%s","reconnectOnMsg":%v,"reconnect":%v,"net":"%s","addr":"%s"}`, level,
 | 
				
			||||||
				Cfg.MustBool(modeSec, "RECONNECT_ON_MSG", false),
 | 
									Cfg.MustBool(modeSec, "RECONNECT_ON_MSG"),
 | 
				
			||||||
				Cfg.MustBool(modeSec, "RECONNECT", false),
 | 
									Cfg.MustBool(modeSec, "RECONNECT"),
 | 
				
			||||||
				Cfg.MustValueRange(modeSec, "PROTOCOL", "tcp", []string{"tcp", "unix", "udp"}),
 | 
									Cfg.MustValueRange(modeSec, "PROTOCOL", "tcp", []string{"tcp", "unix", "udp"}),
 | 
				
			||||||
				Cfg.MustValue(modeSec, "ADDR", ":7020"))
 | 
									Cfg.MustValue(modeSec, "ADDR", ":7020"))
 | 
				
			||||||
		case "smtp":
 | 
							case "smtp":
 | 
				
			||||||
@@ -202,13 +282,13 @@ func newCacheService() {
 | 
				
			|||||||
	case "redis", "memcache":
 | 
						case "redis", "memcache":
 | 
				
			||||||
		CacheConfig = fmt.Sprintf(`{"conn":"%s"}`, Cfg.MustValue("cache", "HOST"))
 | 
							CacheConfig = fmt.Sprintf(`{"conn":"%s"}`, Cfg.MustValue("cache", "HOST"))
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		qlog.Fatalf("Unknown cache adapter: %s\n", CacheAdapter)
 | 
							log.Fatal("Unknown cache adapter: %s", CacheAdapter)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var err error
 | 
						var err error
 | 
				
			||||||
	Cache, err = cache.NewCache(CacheAdapter, CacheConfig)
 | 
						Cache, err = cache.NewCache(CacheAdapter, CacheConfig)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		qlog.Fatalf("Init cache system failed, adapter: %s, config: %s, %v\n",
 | 
							log.Fatal("Init cache system failed, adapter: %s, config: %s, %v\n",
 | 
				
			||||||
			CacheAdapter, CacheConfig, err)
 | 
								CacheAdapter, CacheConfig, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -237,13 +317,38 @@ func newSessionService() {
 | 
				
			|||||||
	var err error
 | 
						var err error
 | 
				
			||||||
	SessionManager, err = session.NewManager(SessionProvider, *SessionConfig)
 | 
						SessionManager, err = session.NewManager(SessionProvider, *SessionConfig)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		qlog.Fatalf("Init session system failed, provider: %s, %v\n",
 | 
							log.Fatal("Init session system failed, provider: %s, %v",
 | 
				
			||||||
			SessionProvider, err)
 | 
								SessionProvider, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	log.Info("Session Service Enabled")
 | 
						log.Info("Session Service Enabled")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Mailer represents mail service.
 | 
				
			||||||
 | 
					type Mailer struct {
 | 
				
			||||||
 | 
						Name         string
 | 
				
			||||||
 | 
						Host         string
 | 
				
			||||||
 | 
						User, Passwd string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type OauthInfo struct {
 | 
				
			||||||
 | 
						ClientId, ClientSecret string
 | 
				
			||||||
 | 
						Scopes                 string
 | 
				
			||||||
 | 
						AuthUrl, TokenUrl      string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Oauther represents oauth service.
 | 
				
			||||||
 | 
					type Oauther struct {
 | 
				
			||||||
 | 
						GitHub, Google, Tencent,
 | 
				
			||||||
 | 
						Twitter, Weibo bool
 | 
				
			||||||
 | 
						OauthInfos map[string]*OauthInfo
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var (
 | 
				
			||||||
 | 
						MailService  *Mailer
 | 
				
			||||||
 | 
						OauthService *Oauther
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func newMailService() {
 | 
					func newMailService() {
 | 
				
			||||||
	// Check mailer setting.
 | 
						// Check mailer setting.
 | 
				
			||||||
	if !Cfg.MustBool("mailer", "ENABLED") {
 | 
						if !Cfg.MustBool("mailer", "ENABLED") {
 | 
				
			||||||
@@ -281,69 +386,7 @@ func newNotifyMailService() {
 | 
				
			|||||||
	log.Info("Notify Mail Service Enabled")
 | 
						log.Info("Notify Mail Service Enabled")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewConfigContext() {
 | 
					func NewServices() {
 | 
				
			||||||
	workDir, err := ExecDir()
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		qlog.Fatalf("Fail to get work directory: %s\n", err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	cfgPath := filepath.Join(workDir, "conf/app.ini")
 | 
					 | 
				
			||||||
	Cfg, err = goconfig.LoadConfigFile(cfgPath)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		qlog.Fatalf("Cannot load config file(%s): %v\n", cfgPath, err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	Cfg.BlockMode = false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	cfgPaths := []string{os.Getenv("GOGS_CONFIG"), filepath.Join(workDir, "custom/conf/app.ini")}
 | 
					 | 
				
			||||||
	for _, cfgPath := range cfgPaths {
 | 
					 | 
				
			||||||
		if com.IsFile(cfgPath) {
 | 
					 | 
				
			||||||
			if err = Cfg.AppendFiles(cfgPath); err != nil {
 | 
					 | 
				
			||||||
				qlog.Fatalf("Cannot load config file(%s): %v\n", cfgPath, err)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	AppName = Cfg.MustValue("", "APP_NAME", "Gogs: Go Git Service")
 | 
					 | 
				
			||||||
	AppLogo = Cfg.MustValue("", "APP_LOGO", "img/favicon.png")
 | 
					 | 
				
			||||||
	AppUrl = Cfg.MustValue("server", "ROOT_URL")
 | 
					 | 
				
			||||||
	Domain = Cfg.MustValue("server", "DOMAIN")
 | 
					 | 
				
			||||||
	SshPort = Cfg.MustInt("server", "SSH_PORT", 22)
 | 
					 | 
				
			||||||
	OfflineMode = Cfg.MustBool("server", "OFFLINE_MODE", false)
 | 
					 | 
				
			||||||
	DisableRouterLog = Cfg.MustBool("server", "DISABLE_ROUTER_LOG", false)
 | 
					 | 
				
			||||||
	SecretKey = Cfg.MustValue("security", "SECRET_KEY")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	InstallLock = Cfg.MustBool("security", "INSTALL_LOCK", false)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	RunUser = Cfg.MustValue("", "RUN_USER")
 | 
					 | 
				
			||||||
	curUser := os.Getenv("USER")
 | 
					 | 
				
			||||||
	if len(curUser) == 0 {
 | 
					 | 
				
			||||||
		curUser = os.Getenv("USERNAME")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// Does not check run user when the install lock is off.
 | 
					 | 
				
			||||||
	if InstallLock && RunUser != curUser {
 | 
					 | 
				
			||||||
		qlog.Fatalf("Expect user(%s) but current user is: %s\n", RunUser, curUser)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	LogInRememberDays = Cfg.MustInt("security", "LOGIN_REMEMBER_DAYS")
 | 
					 | 
				
			||||||
	CookieUserName = Cfg.MustValue("security", "COOKIE_USERNAME")
 | 
					 | 
				
			||||||
	CookieRememberName = Cfg.MustValue("security", "COOKIE_REMEMBER_NAME")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	PictureService = Cfg.MustValue("picture", "SERVICE")
 | 
					 | 
				
			||||||
	DisableGravatar = Cfg.MustBool("picture", "DISABLE_GRAVATAR", false)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Determine and create root git reposiroty path.
 | 
					 | 
				
			||||||
	homeDir, err := com.HomeDir()
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		qlog.Fatalf("Fail to get home directory): %v\n", err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	RepoRootPath = Cfg.MustValue("repository", "ROOT", filepath.Join(homeDir, "gogs-repositories"))
 | 
					 | 
				
			||||||
	if err = os.MkdirAll(RepoRootPath, os.ModePerm); err != nil {
 | 
					 | 
				
			||||||
		qlog.Fatalf("Fail to create RepoRootPath(%s): %v\n", RepoRootPath, err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	ScriptType = Cfg.MustValue("repository", "SCRIPT_TYPE", "bash")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func NewBaseServices() {
 | 
					 | 
				
			||||||
	newService()
 | 
						newService()
 | 
				
			||||||
	newLogService()
 | 
						newLogService()
 | 
				
			||||||
	newCacheService()
 | 
						newCacheService()
 | 
				
			||||||
@@ -15,8 +15,8 @@ import (
 | 
				
			|||||||
	oauth "github.com/gogits/oauth2"
 | 
						oauth "github.com/gogits/oauth2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/gogits/gogs/models"
 | 
						"github.com/gogits/gogs/models"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/base"
 | 
					 | 
				
			||||||
	"github.com/gogits/gogs/modules/log"
 | 
						"github.com/gogits/gogs/modules/log"
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type BasicUserInfo struct {
 | 
					type BasicUserInfo struct {
 | 
				
			||||||
@@ -40,67 +40,67 @@ var (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewOauthService() {
 | 
					func NewOauthService() {
 | 
				
			||||||
	if !base.Cfg.MustBool("oauth", "ENABLED") {
 | 
						if !setting.Cfg.MustBool("oauth", "ENABLED") {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	base.OauthService = &base.Oauther{}
 | 
						setting.OauthService = &setting.Oauther{}
 | 
				
			||||||
	base.OauthService.OauthInfos = make(map[string]*base.OauthInfo)
 | 
						setting.OauthService.OauthInfos = make(map[string]*setting.OauthInfo)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	socialConfigs := make(map[string]*oauth.Config)
 | 
						socialConfigs := make(map[string]*oauth.Config)
 | 
				
			||||||
	allOauthes := []string{"github", "google", "qq", "twitter", "weibo"}
 | 
						allOauthes := []string{"github", "google", "qq", "twitter", "weibo"}
 | 
				
			||||||
	// Load all OAuth config data.
 | 
						// Load all OAuth config data.
 | 
				
			||||||
	for _, name := range allOauthes {
 | 
						for _, name := range allOauthes {
 | 
				
			||||||
		base.OauthService.OauthInfos[name] = &base.OauthInfo{
 | 
							setting.OauthService.OauthInfos[name] = &setting.OauthInfo{
 | 
				
			||||||
			ClientId:     base.Cfg.MustValue("oauth."+name, "CLIENT_ID"),
 | 
								ClientId:     setting.Cfg.MustValue("oauth."+name, "CLIENT_ID"),
 | 
				
			||||||
			ClientSecret: base.Cfg.MustValue("oauth."+name, "CLIENT_SECRET"),
 | 
								ClientSecret: setting.Cfg.MustValue("oauth."+name, "CLIENT_SECRET"),
 | 
				
			||||||
			Scopes:       base.Cfg.MustValue("oauth."+name, "SCOPES"),
 | 
								Scopes:       setting.Cfg.MustValue("oauth."+name, "SCOPES"),
 | 
				
			||||||
			AuthUrl:      base.Cfg.MustValue("oauth."+name, "AUTH_URL"),
 | 
								AuthUrl:      setting.Cfg.MustValue("oauth."+name, "AUTH_URL"),
 | 
				
			||||||
			TokenUrl:     base.Cfg.MustValue("oauth."+name, "TOKEN_URL"),
 | 
								TokenUrl:     setting.Cfg.MustValue("oauth."+name, "TOKEN_URL"),
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		socialConfigs[name] = &oauth.Config{
 | 
							socialConfigs[name] = &oauth.Config{
 | 
				
			||||||
			ClientId:     base.OauthService.OauthInfos[name].ClientId,
 | 
								ClientId:     setting.OauthService.OauthInfos[name].ClientId,
 | 
				
			||||||
			ClientSecret: base.OauthService.OauthInfos[name].ClientSecret,
 | 
								ClientSecret: setting.OauthService.OauthInfos[name].ClientSecret,
 | 
				
			||||||
			RedirectURL:  strings.TrimSuffix(base.AppUrl, "/") + SocialBaseUrl + name,
 | 
								RedirectURL:  strings.TrimSuffix(setting.AppUrl, "/") + SocialBaseUrl + name,
 | 
				
			||||||
			Scope:        base.OauthService.OauthInfos[name].Scopes,
 | 
								Scope:        setting.OauthService.OauthInfos[name].Scopes,
 | 
				
			||||||
			AuthURL:      base.OauthService.OauthInfos[name].AuthUrl,
 | 
								AuthURL:      setting.OauthService.OauthInfos[name].AuthUrl,
 | 
				
			||||||
			TokenURL:     base.OauthService.OauthInfos[name].TokenUrl,
 | 
								TokenURL:     setting.OauthService.OauthInfos[name].TokenUrl,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	enabledOauths := make([]string, 0, 10)
 | 
						enabledOauths := make([]string, 0, 10)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// GitHub.
 | 
						// GitHub.
 | 
				
			||||||
	if base.Cfg.MustBool("oauth.github", "ENABLED") {
 | 
						if setting.Cfg.MustBool("oauth.github", "ENABLED") {
 | 
				
			||||||
		base.OauthService.GitHub = true
 | 
							setting.OauthService.GitHub = true
 | 
				
			||||||
		newGitHubOauth(socialConfigs["github"])
 | 
							newGitHubOauth(socialConfigs["github"])
 | 
				
			||||||
		enabledOauths = append(enabledOauths, "GitHub")
 | 
							enabledOauths = append(enabledOauths, "GitHub")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Google.
 | 
						// Google.
 | 
				
			||||||
	if base.Cfg.MustBool("oauth.google", "ENABLED") {
 | 
						if setting.Cfg.MustBool("oauth.google", "ENABLED") {
 | 
				
			||||||
		base.OauthService.Google = true
 | 
							setting.OauthService.Google = true
 | 
				
			||||||
		newGoogleOauth(socialConfigs["google"])
 | 
							newGoogleOauth(socialConfigs["google"])
 | 
				
			||||||
		enabledOauths = append(enabledOauths, "Google")
 | 
							enabledOauths = append(enabledOauths, "Google")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// QQ.
 | 
						// QQ.
 | 
				
			||||||
	if base.Cfg.MustBool("oauth.qq", "ENABLED") {
 | 
						if setting.Cfg.MustBool("oauth.qq", "ENABLED") {
 | 
				
			||||||
		base.OauthService.Tencent = true
 | 
							setting.OauthService.Tencent = true
 | 
				
			||||||
		newTencentOauth(socialConfigs["qq"])
 | 
							newTencentOauth(socialConfigs["qq"])
 | 
				
			||||||
		enabledOauths = append(enabledOauths, "QQ")
 | 
							enabledOauths = append(enabledOauths, "QQ")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Twitter.
 | 
						// Twitter.
 | 
				
			||||||
	if base.Cfg.MustBool("oauth.twitter", "ENABLED") {
 | 
						if setting.Cfg.MustBool("oauth.twitter", "ENABLED") {
 | 
				
			||||||
		base.OauthService.Twitter = true
 | 
							setting.OauthService.Twitter = true
 | 
				
			||||||
		newTwitterOauth(socialConfigs["twitter"])
 | 
							newTwitterOauth(socialConfigs["twitter"])
 | 
				
			||||||
		enabledOauths = append(enabledOauths, "Twitter")
 | 
							enabledOauths = append(enabledOauths, "Twitter")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Weibo.
 | 
						// Weibo.
 | 
				
			||||||
	if base.Cfg.MustBool("oauth.weibo", "ENABLED") {
 | 
						if setting.Cfg.MustBool("oauth.weibo", "ENABLED") {
 | 
				
			||||||
		base.OauthService.Weibo = true
 | 
							setting.OauthService.Weibo = true
 | 
				
			||||||
		newWeiboOauth(socialConfigs["weibo"])
 | 
							newWeiboOauth(socialConfigs["weibo"])
 | 
				
			||||||
		enabledOauths = append(enabledOauths, "Weibo")
 | 
							enabledOauths = append(enabledOauths, "Weibo")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,6 +15,7 @@ import (
 | 
				
			|||||||
	"github.com/gogits/gogs/models"
 | 
						"github.com/gogits/gogs/models"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/base"
 | 
						"github.com/gogits/gogs/modules/base"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/middleware"
 | 
						"github.com/gogits/gogs/modules/middleware"
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var startTime = time.Now()
 | 
					var startTime = time.Now()
 | 
				
			||||||
@@ -177,46 +178,46 @@ func Config(ctx *middleware.Context) {
 | 
				
			|||||||
	ctx.Data["Title"] = "Server Configuration"
 | 
						ctx.Data["Title"] = "Server Configuration"
 | 
				
			||||||
	ctx.Data["PageIsConfig"] = true
 | 
						ctx.Data["PageIsConfig"] = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ctx.Data["AppUrl"] = base.AppUrl
 | 
						ctx.Data["AppUrl"] = setting.AppUrl
 | 
				
			||||||
	ctx.Data["Domain"] = base.Domain
 | 
						ctx.Data["Domain"] = setting.Domain
 | 
				
			||||||
	ctx.Data["OfflineMode"] = base.OfflineMode
 | 
						ctx.Data["OfflineMode"] = setting.OfflineMode
 | 
				
			||||||
	ctx.Data["DisableRouterLog"] = base.DisableRouterLog
 | 
						ctx.Data["DisableRouterLog"] = setting.DisableRouterLog
 | 
				
			||||||
	ctx.Data["RunUser"] = base.RunUser
 | 
						ctx.Data["RunUser"] = setting.RunUser
 | 
				
			||||||
	ctx.Data["RunMode"] = strings.Title(martini.Env)
 | 
						ctx.Data["RunMode"] = strings.Title(martini.Env)
 | 
				
			||||||
	ctx.Data["RepoRootPath"] = base.RepoRootPath
 | 
						ctx.Data["RepoRootPath"] = setting.RepoRootPath
 | 
				
			||||||
	ctx.Data["ScriptType"] = base.ScriptType
 | 
						ctx.Data["ScriptType"] = setting.ScriptType
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ctx.Data["Service"] = base.Service
 | 
						ctx.Data["Service"] = setting.Service
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ctx.Data["DbCfg"] = models.DbCfg
 | 
						ctx.Data["DbCfg"] = models.DbCfg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ctx.Data["MailerEnabled"] = false
 | 
						ctx.Data["MailerEnabled"] = false
 | 
				
			||||||
	if base.MailService != nil {
 | 
						if setting.MailService != nil {
 | 
				
			||||||
		ctx.Data["MailerEnabled"] = true
 | 
							ctx.Data["MailerEnabled"] = true
 | 
				
			||||||
		ctx.Data["Mailer"] = base.MailService
 | 
							ctx.Data["Mailer"] = setting.MailService
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ctx.Data["OauthEnabled"] = false
 | 
						ctx.Data["OauthEnabled"] = false
 | 
				
			||||||
	if base.OauthService != nil {
 | 
						if setting.OauthService != nil {
 | 
				
			||||||
		ctx.Data["OauthEnabled"] = true
 | 
							ctx.Data["OauthEnabled"] = true
 | 
				
			||||||
		ctx.Data["Oauther"] = base.OauthService
 | 
							ctx.Data["Oauther"] = setting.OauthService
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ctx.Data["CacheAdapter"] = base.CacheAdapter
 | 
						ctx.Data["CacheAdapter"] = setting.CacheAdapter
 | 
				
			||||||
	ctx.Data["CacheConfig"] = base.CacheConfig
 | 
						ctx.Data["CacheConfig"] = setting.CacheConfig
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ctx.Data["SessionProvider"] = base.SessionProvider
 | 
						ctx.Data["SessionProvider"] = setting.SessionProvider
 | 
				
			||||||
	ctx.Data["SessionConfig"] = base.SessionConfig
 | 
						ctx.Data["SessionConfig"] = setting.SessionConfig
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ctx.Data["PictureService"] = base.PictureService
 | 
						ctx.Data["PictureService"] = setting.PictureService
 | 
				
			||||||
	ctx.Data["DisableGravatar"] = base.DisableGravatar
 | 
						ctx.Data["DisableGravatar"] = setting.DisableGravatar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	type logger struct {
 | 
						type logger struct {
 | 
				
			||||||
		Mode, Config string
 | 
							Mode, Config string
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	loggers := make([]*logger, len(base.LogModes))
 | 
						loggers := make([]*logger, len(setting.LogModes))
 | 
				
			||||||
	for i := range base.LogModes {
 | 
						for i := range setting.LogModes {
 | 
				
			||||||
		loggers[i] = &logger{base.LogModes[i], base.LogConfigs[i]}
 | 
							loggers[i] = &logger{setting.LogModes[i], setting.LogConfigs[i]}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	ctx.Data["Loggers"] = loggers
 | 
						ctx.Data["Loggers"] = loggers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,6 +11,7 @@ import (
 | 
				
			|||||||
	"github.com/gogits/gogs/modules/auth/apiv1"
 | 
						"github.com/gogits/gogs/modules/auth/apiv1"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/base"
 | 
						"github.com/gogits/gogs/modules/base"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/middleware"
 | 
						"github.com/gogits/gogs/modules/middleware"
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const DOC_URL = "http://gogs.io/docs"
 | 
					const DOC_URL = "http://gogs.io/docs"
 | 
				
			||||||
@@ -25,7 +26,7 @@ func Markdown(ctx *middleware.Context, form apiv1.MarkdownForm) {
 | 
				
			|||||||
	switch form.Mode {
 | 
						switch form.Mode {
 | 
				
			||||||
	case "gfm":
 | 
						case "gfm":
 | 
				
			||||||
		ctx.Write(base.RenderMarkdown([]byte(form.Text),
 | 
							ctx.Write(base.RenderMarkdown([]byte(form.Text),
 | 
				
			||||||
			base.AppUrl+strings.TrimPrefix(form.Context, "/")))
 | 
								setting.AppUrl+strings.TrimPrefix(form.Context, "/")))
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		ctx.Write(base.RenderRawMarkdown([]byte(form.Text), ""))
 | 
							ctx.Write(base.RenderRawMarkdown([]byte(form.Text), ""))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,8 +6,8 @@ package routers
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"github.com/gogits/gogs/models"
 | 
						"github.com/gogits/gogs/models"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/base"
 | 
					 | 
				
			||||||
	"github.com/gogits/gogs/modules/middleware"
 | 
						"github.com/gogits/gogs/modules/middleware"
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
	"github.com/gogits/gogs/routers/user"
 | 
						"github.com/gogits/gogs/routers/user"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -18,7 +18,7 @@ func Home(ctx *middleware.Context) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Check auto-login.
 | 
						// Check auto-login.
 | 
				
			||||||
	userName := ctx.GetCookie(base.CookieUserName)
 | 
						userName := ctx.GetCookie(setting.CookieUserName)
 | 
				
			||||||
	if len(userName) != 0 {
 | 
						if len(userName) != 0 {
 | 
				
			||||||
		ctx.Redirect("/user/login")
 | 
							ctx.Redirect("/user/login")
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,19 +8,19 @@ import (
 | 
				
			|||||||
	"github.com/go-martini/martini"
 | 
						"github.com/go-martini/martini"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/gogits/gogs/models"
 | 
						"github.com/gogits/gogs/models"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/base"
 | 
					 | 
				
			||||||
	"github.com/gogits/gogs/modules/middleware"
 | 
						"github.com/gogits/gogs/modules/middleware"
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TemplatePreview(ctx *middleware.Context, params martini.Params) {
 | 
					func TemplatePreview(ctx *middleware.Context, params martini.Params) {
 | 
				
			||||||
	ctx.Data["User"] = models.User{Name: "Unknown"}
 | 
						ctx.Data["User"] = models.User{Name: "Unknown"}
 | 
				
			||||||
	ctx.Data["AppName"] = base.AppName
 | 
						ctx.Data["AppName"] = setting.AppName
 | 
				
			||||||
	ctx.Data["AppVer"] = base.AppVer
 | 
						ctx.Data["AppVer"] = setting.AppVer
 | 
				
			||||||
	ctx.Data["AppUrl"] = base.AppUrl
 | 
						ctx.Data["AppUrl"] = setting.AppUrl
 | 
				
			||||||
	ctx.Data["AppLogo"] = base.AppLogo
 | 
						ctx.Data["AppLogo"] = setting.AppLogo
 | 
				
			||||||
	ctx.Data["Code"] = "2014031910370000009fff6782aadb2162b4a997acb69d4400888e0b9274657374"
 | 
						ctx.Data["Code"] = "2014031910370000009fff6782aadb2162b4a997acb69d4400888e0b9274657374"
 | 
				
			||||||
	ctx.Data["ActiveCodeLives"] = base.Service.ActiveCodeLives / 60
 | 
						ctx.Data["ActiveCodeLives"] = setting.Service.ActiveCodeLives / 60
 | 
				
			||||||
	ctx.Data["ResetPwdCodeLives"] = base.Service.ResetPwdCodeLives / 60
 | 
						ctx.Data["ResetPwdCodeLives"] = setting.Service.ResetPwdCodeLives / 60
 | 
				
			||||||
	ctx.Data["CurDbValue"] = ""
 | 
						ctx.Data["CurDbValue"] = ""
 | 
				
			||||||
	ctx.HTML(200, params["_1"])
 | 
						ctx.HTML(200, params["_1"])
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,6 +8,7 @@ import (
 | 
				
			|||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"os/exec"
 | 
						"os/exec"
 | 
				
			||||||
 | 
						"path"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/Unknwon/goconfig"
 | 
						"github.com/Unknwon/goconfig"
 | 
				
			||||||
@@ -22,14 +23,15 @@ import (
 | 
				
			|||||||
	"github.com/gogits/gogs/modules/log"
 | 
						"github.com/gogits/gogs/modules/log"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/mailer"
 | 
						"github.com/gogits/gogs/modules/mailer"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/middleware"
 | 
						"github.com/gogits/gogs/modules/middleware"
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/social"
 | 
						"github.com/gogits/gogs/modules/social"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func checkRunMode() {
 | 
					func checkRunMode() {
 | 
				
			||||||
	switch base.Cfg.MustValue("", "RUN_MODE") {
 | 
						switch setting.Cfg.MustValue("", "RUN_MODE") {
 | 
				
			||||||
	case "prod":
 | 
						case "prod":
 | 
				
			||||||
		martini.Env = martini.Prod
 | 
							martini.Env = martini.Prod
 | 
				
			||||||
		base.ProdMode = true
 | 
							setting.ProdMode = true
 | 
				
			||||||
	case "test":
 | 
						case "test":
 | 
				
			||||||
		martini.Env = martini.Test
 | 
							martini.Env = martini.Test
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -37,20 +39,20 @@ func checkRunMode() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewServices() {
 | 
					func NewServices() {
 | 
				
			||||||
	base.NewBaseServices()
 | 
						setting.NewServices()
 | 
				
			||||||
	social.NewOauthService()
 | 
						social.NewOauthService()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GlobalInit is for global configuration reload-able.
 | 
					// GlobalInit is for global configuration reload-able.
 | 
				
			||||||
func GlobalInit() {
 | 
					func GlobalInit() {
 | 
				
			||||||
	base.NewConfigContext()
 | 
						setting.NewConfigContext()
 | 
				
			||||||
	mailer.NewMailerContext()
 | 
						mailer.NewMailerContext()
 | 
				
			||||||
	models.LoadModelsConfig()
 | 
						models.LoadModelsConfig()
 | 
				
			||||||
	models.LoadRepoConfig()
 | 
						models.LoadRepoConfig()
 | 
				
			||||||
	models.NewRepoContext()
 | 
						models.NewRepoContext()
 | 
				
			||||||
	NewServices()
 | 
						NewServices()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if base.InstallLock {
 | 
						if setting.InstallLock {
 | 
				
			||||||
		if err := models.NewEngine(); err != nil {
 | 
							if err := models.NewEngine(); err != nil {
 | 
				
			||||||
			qlog.Fatal(err)
 | 
								qlog.Fatal(err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -69,7 +71,7 @@ func renderDbOption(ctx *middleware.Context) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Install(ctx *middleware.Context, form auth.InstallForm) {
 | 
					func Install(ctx *middleware.Context, form auth.InstallForm) {
 | 
				
			||||||
	if base.InstallLock {
 | 
						if setting.InstallLock {
 | 
				
			||||||
		ctx.Handle(404, "install.Install", errors.New("Installation is prohibited"))
 | 
							ctx.Handle(404, "install.Install", errors.New("Installation is prohibited"))
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -95,16 +97,16 @@ func Install(ctx *middleware.Context, form auth.InstallForm) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if len(form.RepoRootPath) == 0 {
 | 
						if len(form.RepoRootPath) == 0 {
 | 
				
			||||||
		form.RepoRootPath = base.RepoRootPath
 | 
							form.RepoRootPath = setting.RepoRootPath
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if len(form.RunUser) == 0 {
 | 
						if len(form.RunUser) == 0 {
 | 
				
			||||||
		form.RunUser = base.RunUser
 | 
							form.RunUser = setting.RunUser
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if len(form.Domain) == 0 {
 | 
						if len(form.Domain) == 0 {
 | 
				
			||||||
		form.Domain = base.Domain
 | 
							form.Domain = setting.Domain
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if len(form.AppUrl) == 0 {
 | 
						if len(form.AppUrl) == 0 {
 | 
				
			||||||
		form.AppUrl = base.AppUrl
 | 
							form.AppUrl = setting.AppUrl
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	renderDbOption(ctx)
 | 
						renderDbOption(ctx)
 | 
				
			||||||
@@ -119,7 +121,7 @@ func Install(ctx *middleware.Context, form auth.InstallForm) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func InstallPost(ctx *middleware.Context, form auth.InstallForm) {
 | 
					func InstallPost(ctx *middleware.Context, form auth.InstallForm) {
 | 
				
			||||||
	if base.InstallLock {
 | 
						if setting.InstallLock {
 | 
				
			||||||
		ctx.Handle(404, "install.Install", errors.New("Installation is prohibited"))
 | 
							ctx.Handle(404, "install.Install", errors.New("Installation is prohibited"))
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -181,35 +183,35 @@ func InstallPost(ctx *middleware.Context, form auth.InstallForm) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Save settings.
 | 
						// Save settings.
 | 
				
			||||||
	base.Cfg.SetValue("database", "DB_TYPE", models.DbCfg.Type)
 | 
						setting.Cfg.SetValue("database", "DB_TYPE", models.DbCfg.Type)
 | 
				
			||||||
	base.Cfg.SetValue("database", "HOST", models.DbCfg.Host)
 | 
						setting.Cfg.SetValue("database", "HOST", models.DbCfg.Host)
 | 
				
			||||||
	base.Cfg.SetValue("database", "NAME", models.DbCfg.Name)
 | 
						setting.Cfg.SetValue("database", "NAME", models.DbCfg.Name)
 | 
				
			||||||
	base.Cfg.SetValue("database", "USER", models.DbCfg.User)
 | 
						setting.Cfg.SetValue("database", "USER", models.DbCfg.User)
 | 
				
			||||||
	base.Cfg.SetValue("database", "PASSWD", models.DbCfg.Pwd)
 | 
						setting.Cfg.SetValue("database", "PASSWD", models.DbCfg.Pwd)
 | 
				
			||||||
	base.Cfg.SetValue("database", "SSL_MODE", models.DbCfg.SslMode)
 | 
						setting.Cfg.SetValue("database", "SSL_MODE", models.DbCfg.SslMode)
 | 
				
			||||||
	base.Cfg.SetValue("database", "PATH", models.DbCfg.Path)
 | 
						setting.Cfg.SetValue("database", "PATH", models.DbCfg.Path)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	base.Cfg.SetValue("repository", "ROOT", form.RepoRootPath)
 | 
						setting.Cfg.SetValue("repository", "ROOT", form.RepoRootPath)
 | 
				
			||||||
	base.Cfg.SetValue("", "RUN_USER", form.RunUser)
 | 
						setting.Cfg.SetValue("", "RUN_USER", form.RunUser)
 | 
				
			||||||
	base.Cfg.SetValue("server", "DOMAIN", form.Domain)
 | 
						setting.Cfg.SetValue("server", "DOMAIN", form.Domain)
 | 
				
			||||||
	base.Cfg.SetValue("server", "ROOT_URL", form.AppUrl)
 | 
						setting.Cfg.SetValue("server", "ROOT_URL", form.AppUrl)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if len(strings.TrimSpace(form.SmtpHost)) > 0 {
 | 
						if len(strings.TrimSpace(form.SmtpHost)) > 0 {
 | 
				
			||||||
		base.Cfg.SetValue("mailer", "ENABLED", "true")
 | 
							setting.Cfg.SetValue("mailer", "ENABLED", "true")
 | 
				
			||||||
		base.Cfg.SetValue("mailer", "HOST", form.SmtpHost)
 | 
							setting.Cfg.SetValue("mailer", "HOST", form.SmtpHost)
 | 
				
			||||||
		base.Cfg.SetValue("mailer", "USER", form.SmtpEmail)
 | 
							setting.Cfg.SetValue("mailer", "USER", form.SmtpEmail)
 | 
				
			||||||
		base.Cfg.SetValue("mailer", "PASSWD", form.SmtpPasswd)
 | 
							setting.Cfg.SetValue("mailer", "PASSWD", form.SmtpPasswd)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		base.Cfg.SetValue("service", "REGISTER_EMAIL_CONFIRM", base.ToStr(form.RegisterConfirm == "on"))
 | 
							setting.Cfg.SetValue("service", "REGISTER_EMAIL_CONFIRM", base.ToStr(form.RegisterConfirm == "on"))
 | 
				
			||||||
		base.Cfg.SetValue("service", "ENABLE_NOTIFY_MAIL", base.ToStr(form.MailNotify == "on"))
 | 
							setting.Cfg.SetValue("service", "ENABLE_NOTIFY_MAIL", base.ToStr(form.MailNotify == "on"))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	base.Cfg.SetValue("", "RUN_MODE", "prod")
 | 
						setting.Cfg.SetValue("", "RUN_MODE", "prod")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	base.Cfg.SetValue("security", "INSTALL_LOCK", "true")
 | 
						setting.Cfg.SetValue("security", "INSTALL_LOCK", "true")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	os.MkdirAll("custom/conf", os.ModePerm)
 | 
						os.MkdirAll("custom/conf", os.ModePerm)
 | 
				
			||||||
	if err := goconfig.SaveConfigFile(base.Cfg, "custom/conf/app.ini"); err != nil {
 | 
						if err := goconfig.SaveConfigFile(setting.Cfg, path.Join(setting.CustomPath, "conf/app.ini")); err != nil {
 | 
				
			||||||
		ctx.RenderWithErr("Fail to save configuration: "+err.Error(), "install", &form)
 | 
							ctx.RenderWithErr("Fail to save configuration: "+err.Error(), "install", &form)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -220,7 +222,7 @@ func InstallPost(ctx *middleware.Context, form auth.InstallForm) {
 | 
				
			|||||||
	if _, err := models.RegisterUser(&models.User{Name: form.AdminName, Email: form.AdminEmail, Passwd: form.AdminPasswd,
 | 
						if _, err := models.RegisterUser(&models.User{Name: form.AdminName, Email: form.AdminEmail, Passwd: form.AdminPasswd,
 | 
				
			||||||
		IsAdmin: true, IsActive: true}); err != nil {
 | 
							IsAdmin: true, IsActive: true}); err != nil {
 | 
				
			||||||
		if err != models.ErrUserAlreadyExist {
 | 
							if err != models.ErrUserAlreadyExist {
 | 
				
			||||||
			base.InstallLock = false
 | 
								setting.InstallLock = false
 | 
				
			||||||
			ctx.RenderWithErr("Admin account setting is invalid: "+err.Error(), "install", &form)
 | 
								ctx.RenderWithErr("Admin account setting is invalid: "+err.Error(), "install", &form)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,9 +11,12 @@ import (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Branches(ctx *middleware.Context, params martini.Params) {
 | 
					func Branches(ctx *middleware.Context, params martini.Params) {
 | 
				
			||||||
 | 
						ctx.Data["Title"] = "Branches"
 | 
				
			||||||
 | 
						ctx.Data["IsRepoToolbarBranches"] = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	brs, err := ctx.Repo.GitRepo.GetBranches()
 | 
						brs, err := ctx.Repo.GitRepo.GetBranches()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		ctx.Handle(404, "repo.Branches", err)
 | 
							ctx.Handle(500, "repo.Branches", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	} else if len(brs) == 0 {
 | 
						} else if len(brs) == 0 {
 | 
				
			||||||
		ctx.Handle(404, "repo.Branches", nil)
 | 
							ctx.Handle(404, "repo.Branches", nil)
 | 
				
			||||||
@@ -21,7 +24,5 @@ func Branches(ctx *middleware.Context, params martini.Params) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ctx.Data["Branches"] = brs
 | 
						ctx.Data["Branches"] = brs
 | 
				
			||||||
	ctx.Data["IsRepoToolbarBranches"] = true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ctx.HTML(200, "repo/branches")
 | 
						ctx.HTML(200, "repo/branches")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,6 +15,8 @@ import (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Commits(ctx *middleware.Context, params martini.Params) {
 | 
					func Commits(ctx *middleware.Context, params martini.Params) {
 | 
				
			||||||
 | 
						ctx.Data["IsRepoToolbarCommits"] = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	userName := ctx.Repo.Owner.Name
 | 
						userName := ctx.Repo.Owner.Name
 | 
				
			||||||
	repoName := ctx.Repo.Repository.Name
 | 
						repoName := ctx.Repo.Repository.Name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -47,8 +49,8 @@ func Commits(ctx *middleware.Context, params martini.Params) {
 | 
				
			|||||||
		nextPage = 0
 | 
							nextPage = 0
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//both `git log branchName` and `git log commitId` work
 | 
						// Both `git log branchName` and `git log commitId` work.
 | 
				
			||||||
	commits, err := ctx.Repo.Commit.CommitsByRange(page)
 | 
						ctx.Data["Commits"], err = ctx.Repo.Commit.CommitsByRange(page)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		ctx.Handle(500, "repo.Commits(CommitsByRange)", err)
 | 
							ctx.Handle(500, "repo.Commits(CommitsByRange)", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
@@ -57,14 +59,14 @@ func Commits(ctx *middleware.Context, params martini.Params) {
 | 
				
			|||||||
	ctx.Data["Username"] = userName
 | 
						ctx.Data["Username"] = userName
 | 
				
			||||||
	ctx.Data["Reponame"] = repoName
 | 
						ctx.Data["Reponame"] = repoName
 | 
				
			||||||
	ctx.Data["CommitCount"] = commitsCount
 | 
						ctx.Data["CommitCount"] = commitsCount
 | 
				
			||||||
	ctx.Data["Commits"] = commits
 | 
					 | 
				
			||||||
	ctx.Data["LastPageNum"] = lastPage
 | 
						ctx.Data["LastPageNum"] = lastPage
 | 
				
			||||||
	ctx.Data["NextPageNum"] = nextPage
 | 
						ctx.Data["NextPageNum"] = nextPage
 | 
				
			||||||
	ctx.Data["IsRepoToolbarCommits"] = true
 | 
					 | 
				
			||||||
	ctx.HTML(200, "repo/commits")
 | 
						ctx.HTML(200, "repo/commits")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Diff(ctx *middleware.Context, params martini.Params) {
 | 
					func Diff(ctx *middleware.Context, params martini.Params) {
 | 
				
			||||||
 | 
						ctx.Data["IsRepoToolbarCommits"] = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	userName := ctx.Repo.Owner.Name
 | 
						userName := ctx.Repo.Owner.Name
 | 
				
			||||||
	repoName := ctx.Repo.Repository.Name
 | 
						repoName := ctx.Repo.Repository.Name
 | 
				
			||||||
	commitId := ctx.Repo.CommitId
 | 
						commitId := ctx.Repo.CommitId
 | 
				
			||||||
@@ -109,13 +111,15 @@ func Diff(ctx *middleware.Context, params martini.Params) {
 | 
				
			|||||||
	ctx.Data["Diff"] = diff
 | 
						ctx.Data["Diff"] = diff
 | 
				
			||||||
	ctx.Data["Parents"] = parents
 | 
						ctx.Data["Parents"] = parents
 | 
				
			||||||
	ctx.Data["DiffNotAvailable"] = diff.NumFiles() == 0
 | 
						ctx.Data["DiffNotAvailable"] = diff.NumFiles() == 0
 | 
				
			||||||
	ctx.Data["IsRepoToolbarCommits"] = true
 | 
					 | 
				
			||||||
	ctx.Data["SourcePath"] = "/" + path.Join(userName, repoName, "src", commitId)
 | 
						ctx.Data["SourcePath"] = "/" + path.Join(userName, repoName, "src", commitId)
 | 
				
			||||||
	ctx.Data["RawPath"] = "/" + path.Join(userName, repoName, "raw", commitId)
 | 
						ctx.Data["RawPath"] = "/" + path.Join(userName, repoName, "raw", commitId)
 | 
				
			||||||
	ctx.HTML(200, "repo/diff")
 | 
						ctx.HTML(200, "repo/diff")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func SearchCommits(ctx *middleware.Context, params martini.Params) {
 | 
					func SearchCommits(ctx *middleware.Context, params martini.Params) {
 | 
				
			||||||
 | 
						ctx.Data["IsSearchPage"] = true
 | 
				
			||||||
 | 
						ctx.Data["IsRepoToolbarCommits"] = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	keyword := ctx.Query("q")
 | 
						keyword := ctx.Query("q")
 | 
				
			||||||
	if len(keyword) == 0 {
 | 
						if len(keyword) == 0 {
 | 
				
			||||||
		ctx.Redirect(ctx.Repo.RepoLink + "/commits/" + ctx.Repo.BranchName)
 | 
							ctx.Redirect(ctx.Repo.RepoLink + "/commits/" + ctx.Repo.BranchName)
 | 
				
			||||||
@@ -145,12 +149,12 @@ func SearchCommits(ctx *middleware.Context, params martini.Params) {
 | 
				
			|||||||
	ctx.Data["Reponame"] = repoName
 | 
						ctx.Data["Reponame"] = repoName
 | 
				
			||||||
	ctx.Data["CommitCount"] = commits.Len()
 | 
						ctx.Data["CommitCount"] = commits.Len()
 | 
				
			||||||
	ctx.Data["Commits"] = commits
 | 
						ctx.Data["Commits"] = commits
 | 
				
			||||||
	ctx.Data["IsSearchPage"] = true
 | 
					 | 
				
			||||||
	ctx.Data["IsRepoToolbarCommits"] = true
 | 
					 | 
				
			||||||
	ctx.HTML(200, "repo/commits")
 | 
						ctx.HTML(200, "repo/commits")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func FileHistory(ctx *middleware.Context, params martini.Params) {
 | 
					func FileHistory(ctx *middleware.Context, params martini.Params) {
 | 
				
			||||||
 | 
						ctx.Data["IsRepoToolbarCommits"] = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fileName := params["_1"]
 | 
						fileName := params["_1"]
 | 
				
			||||||
	if len(fileName) == 0 {
 | 
						if len(fileName) == 0 {
 | 
				
			||||||
		Commits(ctx, params)
 | 
							Commits(ctx, params)
 | 
				
			||||||
@@ -194,8 +198,8 @@ func FileHistory(ctx *middleware.Context, params martini.Params) {
 | 
				
			|||||||
		nextPage = 0
 | 
							nextPage = 0
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//both `git log branchName` and `git log commitId` work
 | 
						ctx.Data["Commits"], err = ctx.Repo.GitRepo.CommitsByFileAndRange(
 | 
				
			||||||
	commits, err := ctx.Repo.GitRepo.CommitsByFileAndRange(branchName, fileName, page)
 | 
							branchName, fileName, page)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		ctx.Handle(500, "repo.FileHistory(CommitsByRange)", err)
 | 
							ctx.Handle(500, "repo.FileHistory(CommitsByRange)", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
@@ -205,9 +209,7 @@ func FileHistory(ctx *middleware.Context, params martini.Params) {
 | 
				
			|||||||
	ctx.Data["Reponame"] = repoName
 | 
						ctx.Data["Reponame"] = repoName
 | 
				
			||||||
	ctx.Data["FileName"] = fileName
 | 
						ctx.Data["FileName"] = fileName
 | 
				
			||||||
	ctx.Data["CommitCount"] = commitsCount
 | 
						ctx.Data["CommitCount"] = commitsCount
 | 
				
			||||||
	ctx.Data["Commits"] = commits
 | 
					 | 
				
			||||||
	ctx.Data["LastPageNum"] = lastPage
 | 
						ctx.Data["LastPageNum"] = lastPage
 | 
				
			||||||
	ctx.Data["NextPageNum"] = nextPage
 | 
						ctx.Data["NextPageNum"] = nextPage
 | 
				
			||||||
	ctx.Data["IsRepoToolbarCommits"] = true
 | 
					 | 
				
			||||||
	ctx.HTML(200, "repo/commits")
 | 
						ctx.HTML(200, "repo/commits")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,18 +18,17 @@ import (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func SingleDownload(ctx *middleware.Context, params martini.Params) {
 | 
					func SingleDownload(ctx *middleware.Context, params martini.Params) {
 | 
				
			||||||
	// Get tree path
 | 
					 | 
				
			||||||
	treename := params["_1"]
 | 
						treename := params["_1"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	blob, err := ctx.Repo.Commit.GetBlobByPath(treename)
 | 
						blob, err := ctx.Repo.Commit.GetBlobByPath(treename)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		ctx.Handle(404, "repo.SingleDownload(GetBlobByPath)", err)
 | 
							ctx.Handle(500, "repo.SingleDownload(GetBlobByPath)", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	data, err := blob.Data()
 | 
						data, err := blob.Data()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		ctx.Handle(404, "repo.SingleDownload(Data)", err)
 | 
							ctx.Handle(500, "repo.SingleDownload(Data)", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -47,8 +46,8 @@ func ZipDownload(ctx *middleware.Context, params martini.Params) {
 | 
				
			|||||||
	commitId := ctx.Repo.CommitId
 | 
						commitId := ctx.Repo.CommitId
 | 
				
			||||||
	archivesPath := filepath.Join(ctx.Repo.GitRepo.Path, "archives/zip")
 | 
						archivesPath := filepath.Join(ctx.Repo.GitRepo.Path, "archives/zip")
 | 
				
			||||||
	if !com.IsDir(archivesPath) {
 | 
						if !com.IsDir(archivesPath) {
 | 
				
			||||||
		if err := os.MkdirAll(archivesPath, 0755); err != nil {
 | 
							if err := os.MkdirAll(archivesPath, 0655); err != nil {
 | 
				
			||||||
			ctx.Handle(404, "ZipDownload -> os.Mkdir(archivesPath)", err)
 | 
								ctx.Handle(500, "ZipDownload -> os.Mkdir(archivesPath)", err)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -60,9 +59,8 @@ func ZipDownload(ctx *middleware.Context, params martini.Params) {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err := ctx.Repo.Commit.CreateArchive(archivePath, git.AT_ZIP)
 | 
						if err := ctx.Repo.Commit.CreateArchive(archivePath, git.AT_ZIP); err != nil {
 | 
				
			||||||
	if err != nil {
 | 
							ctx.Handle(500, "ZipDownload -> CreateArchive "+archivePath, err)
 | 
				
			||||||
		ctx.Handle(404, "ZipDownload -> CreateArchive "+archivePath, err)
 | 
					 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -74,7 +72,7 @@ func TarGzDownload(ctx *middleware.Context, params martini.Params) {
 | 
				
			|||||||
	archivesPath := filepath.Join(ctx.Repo.GitRepo.Path, "archives/targz")
 | 
						archivesPath := filepath.Join(ctx.Repo.GitRepo.Path, "archives/targz")
 | 
				
			||||||
	if !com.IsDir(archivesPath) {
 | 
						if !com.IsDir(archivesPath) {
 | 
				
			||||||
		if err := os.MkdirAll(archivesPath, 0755); err != nil {
 | 
							if err := os.MkdirAll(archivesPath, 0755); err != nil {
 | 
				
			||||||
			ctx.Handle(404, "TarGzDownload -> os.Mkdir(archivesPath)", err)
 | 
								ctx.Handle(500, "TarGzDownload -> os.Mkdir(archivesPath)", err)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -86,9 +84,8 @@ func TarGzDownload(ctx *middleware.Context, params martini.Params) {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err := ctx.Repo.Commit.CreateArchive(archivePath, git.AT_TARGZ)
 | 
						if err := ctx.Repo.Commit.CreateArchive(archivePath, git.AT_TARGZ); err != nil {
 | 
				
			||||||
	if err != nil {
 | 
							ctx.Handle(500, "TarGzDownload -> CreateArchive "+archivePath, err)
 | 
				
			||||||
		ctx.Handle(404, "TarGzDownload -> CreateArchive "+archivePath, err)
 | 
					 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,55 +0,0 @@
 | 
				
			|||||||
package repo
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const advertise_refs = "--advertise-refs"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func command(cmd string, opts ...string) string {
 | 
					 | 
				
			||||||
	return fmt.Sprintf("git %s %s", cmd, strings.Join(opts, " "))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*func upload_pack(repository_path string, opts ...string) string {
 | 
					 | 
				
			||||||
	cmd = "upload-pack"
 | 
					 | 
				
			||||||
	opts = append(opts, "--stateless-rpc", repository_path)
 | 
					 | 
				
			||||||
	return command(cmd, opts...)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func receive_pack(repository_path string, opts ...string) string {
 | 
					 | 
				
			||||||
	cmd = "receive-pack"
 | 
					 | 
				
			||||||
	opts = append(opts, "--stateless-rpc", repository_path)
 | 
					 | 
				
			||||||
	return command(cmd, opts...)
 | 
					 | 
				
			||||||
}*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*func update_server_info(repository_path, opts = {}, &block)
 | 
					 | 
				
			||||||
      cmd = "update-server-info"
 | 
					 | 
				
			||||||
      args = []
 | 
					 | 
				
			||||||
      opts.each {|k,v| args << command_options[k] if command_options.has_key?(k) }
 | 
					 | 
				
			||||||
      opts[:args] = args
 | 
					 | 
				
			||||||
      Dir.chdir(repository_path) do # "git update-server-info" does not take a parameter to specify the repository, so set the working directory to the repository
 | 
					 | 
				
			||||||
        self.command(cmd, opts, &block)
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def get_config_setting(repository_path, key)
 | 
					 | 
				
			||||||
      path = get_config_location(repository_path)
 | 
					 | 
				
			||||||
      raise "Config file could not be found for repository in #{repository_path}." unless path
 | 
					 | 
				
			||||||
      self.command("config", {:args => ["-f #{path}", key]}).chomp
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def get_config_location(repository_path)
 | 
					 | 
				
			||||||
      non_bare = File.join(repository_path,'.git') # This is where the config file will be if the repository is non-bare
 | 
					 | 
				
			||||||
      if File.exists?(non_bare) then # The repository is non-bare
 | 
					 | 
				
			||||||
        non_bare_config = File.join(non_bare, 'config')
 | 
					 | 
				
			||||||
        return non_bare_config if File.exists?(non_bare_config)
 | 
					 | 
				
			||||||
      else # We are dealing with a bare repository
 | 
					 | 
				
			||||||
        bare_config = File.join(repository_path, "config")
 | 
					 | 
				
			||||||
        return bare_config if File.exists?(bare_config)
 | 
					 | 
				
			||||||
      end
 | 
					 | 
				
			||||||
      return nil
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
@@ -22,8 +22,8 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	"github.com/go-martini/martini"
 | 
						"github.com/go-martini/martini"
 | 
				
			||||||
	"github.com/gogits/gogs/models"
 | 
						"github.com/gogits/gogs/models"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/base"
 | 
					 | 
				
			||||||
	"github.com/gogits/gogs/modules/middleware"
 | 
						"github.com/gogits/gogs/modules/middleware"
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Http(ctx *middleware.Context, params martini.Params) {
 | 
					func Http(ctx *middleware.Context, params martini.Params) {
 | 
				
			||||||
@@ -59,7 +59,7 @@ func Http(ctx *middleware.Context, params martini.Params) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// only public pull don't need auth
 | 
						// only public pull don't need auth
 | 
				
			||||||
	isPublicPull := !repo.IsPrivate && isPull
 | 
						isPublicPull := !repo.IsPrivate && isPull
 | 
				
			||||||
	var askAuth = !isPublicPull || base.Service.RequireSignInView
 | 
						var askAuth = !isPublicPull || setting.Service.RequireSignInView
 | 
				
			||||||
	var authUser *models.User
 | 
						var authUser *models.User
 | 
				
			||||||
	var authUsername, passwd string
 | 
						var authUsername, passwd string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -123,7 +123,7 @@ func Http(ctx *middleware.Context, params martini.Params) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	config := Config{base.RepoRootPath, "git", true, true, func(rpc string, input []byte) {
 | 
						config := Config{setting.RepoRootPath, "git", true, true, func(rpc string, input []byte) {
 | 
				
			||||||
		if rpc == "receive-pack" {
 | 
							if rpc == "receive-pack" {
 | 
				
			||||||
			firstLine := bytes.IndexRune(input, '\000')
 | 
								firstLine := bytes.IndexRune(input, '\000')
 | 
				
			||||||
			if firstLine > -1 {
 | 
								if firstLine > -1 {
 | 
				
			||||||
@@ -141,16 +141,6 @@ func Http(ctx *middleware.Context, params martini.Params) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	handler := HttpBackend(&config)
 | 
						handler := HttpBackend(&config)
 | 
				
			||||||
	handler(ctx.ResponseWriter, ctx.Req)
 | 
						handler(ctx.ResponseWriter, ctx.Req)
 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Webdav
 | 
					 | 
				
			||||||
	dir := models.RepoPath(username, reponame)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	prefix := path.Join("/", username, params["reponame"])
 | 
					 | 
				
			||||||
	server := webdav.NewServer(
 | 
					 | 
				
			||||||
		dir, prefix, true)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	server.ServeHTTP(ctx.ResponseWriter, ctx.Req)
 | 
					 | 
				
			||||||
	*/
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type route struct {
 | 
					type route struct {
 | 
				
			||||||
@@ -483,14 +473,3 @@ func hdrCacheForever(w http.ResponseWriter) {
 | 
				
			|||||||
	w.Header().Set("Expires", fmt.Sprintf("%d", expires))
 | 
						w.Header().Set("Expires", fmt.Sprintf("%d", expires))
 | 
				
			||||||
	w.Header().Set("Cache-Control", "public, max-age=31536000")
 | 
						w.Header().Set("Cache-Control", "public, max-age=31536000")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
// Main
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
func main() {
 | 
					 | 
				
			||||||
	http.HandleFunc("/", requestHandler())
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	err := http.ListenAndServe(":8080", nil)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		log.Fatal("ListenAndServe: ", err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}*/
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,6 +19,7 @@ import (
 | 
				
			|||||||
	"github.com/gogits/gogs/modules/log"
 | 
						"github.com/gogits/gogs/modules/log"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/mailer"
 | 
						"github.com/gogits/gogs/modules/mailer"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/middleware"
 | 
						"github.com/gogits/gogs/modules/middleware"
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Issues(ctx *middleware.Context) {
 | 
					func Issues(ctx *middleware.Context) {
 | 
				
			||||||
@@ -242,7 +243,7 @@ func CreateIssuePost(ctx *middleware.Context, params martini.Params, form auth.C
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Mail watchers and mentions.
 | 
						// Mail watchers and mentions.
 | 
				
			||||||
	if base.Service.NotifyMail {
 | 
						if setting.Service.NotifyMail {
 | 
				
			||||||
		tos, err := mailer.SendIssueNotifyMail(ctx.User, ctx.Repo.Owner, ctx.Repo.Repository, issue)
 | 
							tos, err := mailer.SendIssueNotifyMail(ctx.User, ctx.Repo.Owner, ctx.Repo.Repository, issue)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			ctx.Handle(500, "issue.CreateIssue(SendIssueNotifyMail)", err)
 | 
								ctx.Handle(500, "issue.CreateIssue(SendIssueNotifyMail)", err)
 | 
				
			||||||
@@ -677,7 +678,7 @@ func Comment(ctx *middleware.Context, params martini.Params) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Mail watchers and mentions.
 | 
						// Mail watchers and mentions.
 | 
				
			||||||
	if base.Service.NotifyMail {
 | 
						if setting.Service.NotifyMail {
 | 
				
			||||||
		issue.Content = content
 | 
							issue.Content = content
 | 
				
			||||||
		tos, err := mailer.SendIssueNotifyMail(ctx.User, ctx.Repo.Owner, ctx.Repo.Repository, issue)
 | 
							tos, err := mailer.SendIssueNotifyMail(ctx.User, ctx.Repo.Owner, ctx.Repo.Repository, issue)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,6 +16,7 @@ import (
 | 
				
			|||||||
	"github.com/gogits/gogs/modules/log"
 | 
						"github.com/gogits/gogs/modules/log"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/mailer"
 | 
						"github.com/gogits/gogs/modules/mailer"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/middleware"
 | 
						"github.com/gogits/gogs/modules/middleware"
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Setting(ctx *middleware.Context) {
 | 
					func Setting(ctx *middleware.Context) {
 | 
				
			||||||
@@ -189,7 +190,7 @@ func CollaborationPost(ctx *middleware.Context) {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if base.Service.NotifyMail {
 | 
						if setting.Service.NotifyMail {
 | 
				
			||||||
		if err = mailer.SendCollaboratorMail(ctx.Render, u, ctx.User, ctx.Repo.Repository); err != nil {
 | 
							if err = mailer.SendCollaboratorMail(ctx.Render, u, ctx.User, ctx.Repo.Repository); err != nil {
 | 
				
			||||||
			ctx.Handle(500, "setting.CollaborationPost(SendCollaboratorMail)", err)
 | 
								ctx.Handle(500, "setting.CollaborationPost(SendCollaboratorMail)", err)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,9 +14,9 @@ import (
 | 
				
			|||||||
	"github.com/go-martini/martini"
 | 
						"github.com/go-martini/martini"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/gogits/gogs/models"
 | 
						"github.com/gogits/gogs/models"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/base"
 | 
					 | 
				
			||||||
	"github.com/gogits/gogs/modules/log"
 | 
						"github.com/gogits/gogs/modules/log"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/middleware"
 | 
						"github.com/gogits/gogs/modules/middleware"
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/social"
 | 
						"github.com/gogits/gogs/modules/social"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -29,7 +29,7 @@ func extractPath(next string) string {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func SocialSignIn(ctx *middleware.Context, params martini.Params) {
 | 
					func SocialSignIn(ctx *middleware.Context, params martini.Params) {
 | 
				
			||||||
	if base.OauthService == nil {
 | 
						if setting.OauthService == nil {
 | 
				
			||||||
		ctx.Handle(404, "social.SocialSignIn(oauth service not enabled)", nil)
 | 
							ctx.Handle(404, "social.SocialSignIn(oauth service not enabled)", nil)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -45,7 +45,7 @@ func SocialSignIn(ctx *middleware.Context, params martini.Params) {
 | 
				
			|||||||
	code := ctx.Query("code")
 | 
						code := ctx.Query("code")
 | 
				
			||||||
	if code == "" {
 | 
						if code == "" {
 | 
				
			||||||
		// redirect to social login page
 | 
							// redirect to social login page
 | 
				
			||||||
		connect.SetRedirectUrl(strings.TrimSuffix(base.AppUrl, "/") + ctx.Req.URL.Path)
 | 
							connect.SetRedirectUrl(strings.TrimSuffix(setting.AppUrl, "/") + ctx.Req.URL.Path)
 | 
				
			||||||
		ctx.Redirect(connect.AuthCodeURL(next))
 | 
							ctx.Redirect(connect.AuthCodeURL(next))
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,6 +14,7 @@ import (
 | 
				
			|||||||
	"github.com/gogits/gogs/modules/log"
 | 
						"github.com/gogits/gogs/modules/log"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/mailer"
 | 
						"github.com/gogits/gogs/modules/mailer"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/middleware"
 | 
						"github.com/gogits/gogs/modules/middleware"
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func SignIn(ctx *middleware.Context) {
 | 
					func SignIn(ctx *middleware.Context) {
 | 
				
			||||||
@@ -26,23 +27,23 @@ func SignIn(ctx *middleware.Context) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Check auto-login.
 | 
						// Check auto-login.
 | 
				
			||||||
	userName := ctx.GetCookie(base.CookieUserName)
 | 
						userName := ctx.GetCookie(setting.CookieUserName)
 | 
				
			||||||
	if len(userName) == 0 {
 | 
						if len(userName) == 0 {
 | 
				
			||||||
		ctx.HTML(200, "user/signin")
 | 
							ctx.HTML(200, "user/signin")
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if base.OauthService != nil {
 | 
						if setting.OauthService != nil {
 | 
				
			||||||
		ctx.Data["OauthEnabled"] = true
 | 
							ctx.Data["OauthEnabled"] = true
 | 
				
			||||||
		ctx.Data["OauthService"] = base.OauthService
 | 
							ctx.Data["OauthService"] = setting.OauthService
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	isSucceed := false
 | 
						isSucceed := false
 | 
				
			||||||
	defer func() {
 | 
						defer func() {
 | 
				
			||||||
		if !isSucceed {
 | 
							if !isSucceed {
 | 
				
			||||||
			log.Trace("user.SignIn(auto-login cookie cleared): %s", userName)
 | 
								log.Trace("user.SignIn(auto-login cookie cleared): %s", userName)
 | 
				
			||||||
			ctx.SetCookie(base.CookieUserName, "", -1)
 | 
								ctx.SetCookie(setting.CookieUserName, "", -1)
 | 
				
			||||||
			ctx.SetCookie(base.CookieRememberName, "", -1)
 | 
								ctx.SetCookie(setting.CookieRememberName, "", -1)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
@@ -54,7 +55,7 @@ func SignIn(ctx *middleware.Context) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	secret := base.EncodeMd5(user.Rands + user.Passwd)
 | 
						secret := base.EncodeMd5(user.Rands + user.Passwd)
 | 
				
			||||||
	value, _ := ctx.GetSecureCookie(secret, base.CookieRememberName)
 | 
						value, _ := ctx.GetSecureCookie(secret, setting.CookieRememberName)
 | 
				
			||||||
	if value != user.Name {
 | 
						if value != user.Name {
 | 
				
			||||||
		ctx.HTML(200, "user/signin")
 | 
							ctx.HTML(200, "user/signin")
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
@@ -79,9 +80,9 @@ func SignInPost(ctx *middleware.Context, form auth.LogInForm) {
 | 
				
			|||||||
	sid, isOauth := ctx.Session.Get("socialId").(int64)
 | 
						sid, isOauth := ctx.Session.Get("socialId").(int64)
 | 
				
			||||||
	if isOauth {
 | 
						if isOauth {
 | 
				
			||||||
		ctx.Data["IsSocialLogin"] = true
 | 
							ctx.Data["IsSocialLogin"] = true
 | 
				
			||||||
	} else if base.OauthService != nil {
 | 
						} else if setting.OauthService != nil {
 | 
				
			||||||
		ctx.Data["OauthEnabled"] = true
 | 
							ctx.Data["OauthEnabled"] = true
 | 
				
			||||||
		ctx.Data["OauthService"] = base.OauthService
 | 
							ctx.Data["OauthService"] = setting.OauthService
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ctx.HasError() {
 | 
						if ctx.HasError() {
 | 
				
			||||||
@@ -103,9 +104,9 @@ func SignInPost(ctx *middleware.Context, form auth.LogInForm) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if form.Remember {
 | 
						if form.Remember {
 | 
				
			||||||
		secret := base.EncodeMd5(user.Rands + user.Passwd)
 | 
							secret := base.EncodeMd5(user.Rands + user.Passwd)
 | 
				
			||||||
		days := 86400 * base.LogInRememberDays
 | 
							days := 86400 * setting.LogInRememberDays
 | 
				
			||||||
		ctx.SetCookie(base.CookieUserName, user.Name, days)
 | 
							ctx.SetCookie(setting.CookieUserName, user.Name, days)
 | 
				
			||||||
		ctx.SetSecureCookie(secret, base.CookieRememberName, user.Name, days)
 | 
							ctx.SetSecureCookie(secret, setting.CookieRememberName, user.Name, days)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Bind with social account.
 | 
						// Bind with social account.
 | 
				
			||||||
@@ -139,8 +140,8 @@ func SignOut(ctx *middleware.Context) {
 | 
				
			|||||||
	ctx.Session.Delete("socialId")
 | 
						ctx.Session.Delete("socialId")
 | 
				
			||||||
	ctx.Session.Delete("socialName")
 | 
						ctx.Session.Delete("socialName")
 | 
				
			||||||
	ctx.Session.Delete("socialEmail")
 | 
						ctx.Session.Delete("socialEmail")
 | 
				
			||||||
	ctx.SetCookie(base.CookieUserName, "", -1)
 | 
						ctx.SetCookie(setting.CookieUserName, "", -1)
 | 
				
			||||||
	ctx.SetCookie(base.CookieRememberName, "", -1)
 | 
						ctx.SetCookie(setting.CookieRememberName, "", -1)
 | 
				
			||||||
	ctx.Redirect("/")
 | 
						ctx.Redirect("/")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -148,7 +149,7 @@ func SignUp(ctx *middleware.Context) {
 | 
				
			|||||||
	ctx.Data["Title"] = "Sign Up"
 | 
						ctx.Data["Title"] = "Sign Up"
 | 
				
			||||||
	ctx.Data["PageIsSignUp"] = true
 | 
						ctx.Data["PageIsSignUp"] = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if base.Service.DisableRegistration {
 | 
						if setting.Service.DisableRegistration {
 | 
				
			||||||
		ctx.Data["DisableRegistration"] = true
 | 
							ctx.Data["DisableRegistration"] = true
 | 
				
			||||||
		ctx.HTML(200, "user/signup")
 | 
							ctx.HTML(200, "user/signup")
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
@@ -186,7 +187,7 @@ func SignUpPost(ctx *middleware.Context, form auth.RegisterForm) {
 | 
				
			|||||||
	ctx.Data["Title"] = "Sign Up"
 | 
						ctx.Data["Title"] = "Sign Up"
 | 
				
			||||||
	ctx.Data["PageIsSignUp"] = true
 | 
						ctx.Data["PageIsSignUp"] = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if base.Service.DisableRegistration {
 | 
						if setting.Service.DisableRegistration {
 | 
				
			||||||
		ctx.Handle(403, "user.SignUpPost", nil)
 | 
							ctx.Handle(403, "user.SignUpPost", nil)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -212,7 +213,7 @@ func SignUpPost(ctx *middleware.Context, form auth.RegisterForm) {
 | 
				
			|||||||
		Name:     form.UserName,
 | 
							Name:     form.UserName,
 | 
				
			||||||
		Email:    form.Email,
 | 
							Email:    form.Email,
 | 
				
			||||||
		Passwd:   form.Password,
 | 
							Passwd:   form.Password,
 | 
				
			||||||
		IsActive: !base.Service.RegisterEmailConfirm || isOauth,
 | 
							IsActive: !setting.Service.RegisterEmailConfirm || isOauth,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var err error
 | 
						var err error
 | 
				
			||||||
@@ -243,11 +244,11 @@ func SignUpPost(ctx *middleware.Context, form auth.RegisterForm) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Send confirmation e-mail, no need for social account.
 | 
						// Send confirmation e-mail, no need for social account.
 | 
				
			||||||
	if !isOauth && base.Service.RegisterEmailConfirm && u.Id > 1 {
 | 
						if !isOauth && setting.Service.RegisterEmailConfirm && u.Id > 1 {
 | 
				
			||||||
		mailer.SendRegisterMail(ctx.Render, u)
 | 
							mailer.SendRegisterMail(ctx.Render, u)
 | 
				
			||||||
		ctx.Data["IsSendRegisterMail"] = true
 | 
							ctx.Data["IsSendRegisterMail"] = true
 | 
				
			||||||
		ctx.Data["Email"] = u.Email
 | 
							ctx.Data["Email"] = u.Email
 | 
				
			||||||
		ctx.Data["Hours"] = base.Service.ActiveCodeLives / 60
 | 
							ctx.Data["Hours"] = setting.Service.ActiveCodeLives / 60
 | 
				
			||||||
		ctx.HTML(200, "user/activate")
 | 
							ctx.HTML(200, "user/activate")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if err = ctx.Cache.Put("MailResendLimit_"+u.LowerName, u.LowerName, 180); err != nil {
 | 
							if err = ctx.Cache.Put("MailResendLimit_"+u.LowerName, u.LowerName, 180); err != nil {
 | 
				
			||||||
@@ -304,11 +305,11 @@ func Activate(ctx *middleware.Context) {
 | 
				
			|||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		// Resend confirmation e-mail.
 | 
							// Resend confirmation e-mail.
 | 
				
			||||||
		if base.Service.RegisterEmailConfirm {
 | 
							if setting.Service.RegisterEmailConfirm {
 | 
				
			||||||
			if ctx.Cache.IsExist("MailResendLimit_" + ctx.User.LowerName) {
 | 
								if ctx.Cache.IsExist("MailResendLimit_" + ctx.User.LowerName) {
 | 
				
			||||||
				ctx.Data["ResendLimited"] = true
 | 
									ctx.Data["ResendLimited"] = true
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				ctx.Data["Hours"] = base.Service.ActiveCodeLives / 60
 | 
									ctx.Data["Hours"] = setting.Service.ActiveCodeLives / 60
 | 
				
			||||||
				mailer.SendActiveMail(ctx.Render, ctx.User)
 | 
									mailer.SendActiveMail(ctx.Render, ctx.User)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if err := ctx.Cache.Put("MailResendLimit_"+ctx.User.LowerName, ctx.User.LowerName, 180); err != nil {
 | 
									if err := ctx.Cache.Put("MailResendLimit_"+ctx.User.LowerName, ctx.User.LowerName, 180); err != nil {
 | 
				
			||||||
@@ -346,7 +347,7 @@ func Activate(ctx *middleware.Context) {
 | 
				
			|||||||
func ForgotPasswd(ctx *middleware.Context) {
 | 
					func ForgotPasswd(ctx *middleware.Context) {
 | 
				
			||||||
	ctx.Data["Title"] = "Forgot Password"
 | 
						ctx.Data["Title"] = "Forgot Password"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if base.MailService == nil {
 | 
						if setting.MailService == nil {
 | 
				
			||||||
		ctx.Data["IsResetDisable"] = true
 | 
							ctx.Data["IsResetDisable"] = true
 | 
				
			||||||
		ctx.HTML(200, "user/forgot_passwd")
 | 
							ctx.HTML(200, "user/forgot_passwd")
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
@@ -359,7 +360,7 @@ func ForgotPasswd(ctx *middleware.Context) {
 | 
				
			|||||||
func ForgotPasswdPost(ctx *middleware.Context) {
 | 
					func ForgotPasswdPost(ctx *middleware.Context) {
 | 
				
			||||||
	ctx.Data["Title"] = "Forgot Password"
 | 
						ctx.Data["Title"] = "Forgot Password"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if base.MailService == nil {
 | 
						if setting.MailService == nil {
 | 
				
			||||||
		ctx.Handle(403, "user.ForgotPasswdPost", nil)
 | 
							ctx.Handle(403, "user.ForgotPasswdPost", nil)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -388,7 +389,7 @@ func ForgotPasswdPost(ctx *middleware.Context) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ctx.Data["Email"] = email
 | 
						ctx.Data["Email"] = email
 | 
				
			||||||
	ctx.Data["Hours"] = base.Service.ActiveCodeLives / 60
 | 
						ctx.Data["Hours"] = setting.Service.ActiveCodeLives / 60
 | 
				
			||||||
	ctx.Data["IsResetSent"] = true
 | 
						ctx.Data["IsResetSent"] = true
 | 
				
			||||||
	ctx.HTML(200, "user/forgot_passwd")
 | 
						ctx.HTML(200, "user/forgot_passwd")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user