2014-02-19 13:50:53 +04:00
// Copyright 2014 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package main
import (
"fmt"
2014-02-19 23:49:08 +04:00
"html/template"
2014-02-19 13:50:53 +04:00
"net/http"
2014-03-18 09:33:53 +04:00
"strings"
2014-02-19 13:50:53 +04:00
"github.com/codegangsta/cli"
"github.com/codegangsta/martini"
2014-03-06 11:21:44 +04:00
"github.com/gogits/binding"
2014-03-21 09:48:10 +04:00
"github.com/gogits/gogs/models"
2014-03-06 11:21:44 +04:00
"github.com/gogits/gogs/modules/auth"
"github.com/gogits/gogs/modules/base"
2014-03-08 02:22:15 +04:00
"github.com/gogits/gogs/modules/log"
2014-03-21 09:48:10 +04:00
"github.com/gogits/gogs/modules/mailer"
2014-03-15 15:01:50 +04:00
"github.com/gogits/gogs/modules/middleware"
2014-02-19 13:50:53 +04:00
"github.com/gogits/gogs/routers"
2014-03-20 15:50:26 +04:00
"github.com/gogits/gogs/routers/admin"
2014-03-19 20:50:44 +04:00
"github.com/gogits/gogs/routers/dev"
2014-02-20 06:45:43 +04:00
"github.com/gogits/gogs/routers/repo"
2014-02-19 13:50:53 +04:00
"github.com/gogits/gogs/routers/user"
)
var CmdWeb = cli . Command {
Name : "web" ,
Usage : "just run" ,
Description : `
gogs web ` ,
Action : runWeb ,
2014-03-13 10:09:36 +04:00
Flags : [ ] cli . Flag { } ,
2014-02-19 13:50:53 +04:00
}
2014-03-21 09:48:10 +04:00
// globalInit is for global configuration reload-able.
func globalInit ( ) {
base . NewConfigContext ( )
mailer . NewMailerContext ( )
models . LoadModelsConfig ( )
models . LoadRepoConfig ( )
models . NewRepoContext ( )
models . NewEngine ( )
}
2014-03-18 09:33:53 +04:00
// Check run mode(Default of martini is Dev).
func checkRunMode ( ) {
switch base . Cfg . MustValue ( "" , "RUN_MODE" ) {
case "prod" :
martini . Env = martini . Prod
case "test" :
martini . Env = martini . Test
}
log . Info ( "Run Mode: %s" , strings . Title ( martini . Env ) )
}
2014-03-19 13:31:38 +04:00
func newMartini ( ) * martini . ClassicMartini {
r := martini . NewRouter ( )
m := martini . New ( )
m . Use ( middleware . Logger ( ) )
m . Use ( martini . Recovery ( ) )
m . Use ( martini . Static ( "public" ) )
m . MapTo ( r , ( * martini . Routes ) ( nil ) )
m . Action ( r . Handle )
return & martini . ClassicMartini { m , r }
}
2014-02-19 13:50:53 +04:00
func runWeb ( * cli . Context ) {
2014-03-21 09:48:10 +04:00
globalInit ( )
2014-03-19 21:24:46 +04:00
base . NewServices ( )
2014-03-18 09:33:53 +04:00
checkRunMode ( )
2014-03-19 12:48:45 +04:00
log . Info ( "%s %s" , base . AppName , base . AppVer )
2014-02-19 13:50:53 +04:00
2014-03-19 13:31:38 +04:00
m := newMartini ( )
2014-02-19 13:50:53 +04:00
2014-03-08 02:08:21 +04:00
// Middlewares.
2014-03-19 17:57:55 +04:00
m . Use ( middleware . Renderer ( middleware . RenderOptions { Funcs : [ ] template . FuncMap { base . TemplateFuncs } } ) )
2014-02-19 13:50:53 +04:00
2014-03-15 15:01:50 +04:00
m . Use ( middleware . InitContext ( ) )
2014-03-22 21:44:02 +04:00
reqSignIn := middleware . Toggle ( & middleware . ToggleOptions { SignInRequire : true } )
ignSignIn := middleware . Toggle ( & middleware . ToggleOptions { SignInRequire : base . Service . RequireSignInView } )
reqSignOut := middleware . Toggle ( & middleware . ToggleOptions { SignOutRequire : true } )
2014-02-19 13:50:53 +04:00
// Routers.
2014-03-18 17:58:58 +04:00
m . Get ( "/" , ignSignIn , routers . Home )
m . Get ( "/issues" , reqSignIn , user . Issues )
m . Get ( "/pulls" , reqSignIn , user . Pulls )
m . Get ( "/stars" , reqSignIn , user . Stars )
m . Any ( "/user/login" , reqSignOut , binding . BindIgnErr ( auth . LogInForm { } ) , user . SignIn )
m . Any ( "/user/logout" , reqSignIn , user . SignOut )
m . Any ( "/user/sign_up" , reqSignOut , binding . BindIgnErr ( auth . RegisterForm { } ) , user . SignUp )
m . Any ( "/user/delete" , reqSignIn , user . Delete )
2014-03-13 09:14:43 +04:00
m . Get ( "/user/feeds" , binding . Bind ( auth . FeedsForm { } ) , user . Feeds )
2014-03-19 17:24:02 +04:00
m . Get ( "/user/activate" , user . Activate )
2014-03-10 12:54:52 +04:00
2014-03-18 17:58:58 +04:00
m . Any ( "/user/setting" , reqSignIn , binding . BindIgnErr ( auth . UpdateProfileForm { } ) , user . Setting )
m . Any ( "/user/setting/password" , reqSignIn , binding . BindIgnErr ( auth . UpdatePasswdForm { } ) , user . SettingPassword )
m . Any ( "/user/setting/ssh" , reqSignIn , binding . BindIgnErr ( auth . AddSSHKeyForm { } ) , user . SettingSSHKeys )
m . Any ( "/user/setting/notification" , reqSignIn , user . SettingNotification )
m . Any ( "/user/setting/security" , reqSignIn , user . SettingSecurity )
2014-03-10 12:54:52 +04:00
2014-03-18 17:58:58 +04:00
m . Get ( "/user/:username" , ignSignIn , user . Profile )
2014-03-08 02:08:21 +04:00
2014-03-18 17:58:58 +04:00
m . Any ( "/repo/create" , reqSignIn , binding . BindIgnErr ( auth . CreateRepoForm { } ) , repo . Create )
2014-03-13 10:08:49 +04:00
2014-03-16 11:41:22 +04:00
m . Get ( "/help" , routers . Help )
2014-03-22 21:44:02 +04:00
adminReq := middleware . Toggle ( & middleware . ToggleOptions { SignInRequire : true , AdminRequire : true } )
m . Get ( "/admin" , adminReq , admin . Dashboard )
m . Get ( "/admin/users" , adminReq , admin . Users )
m . Any ( "/admin/users/new" , adminReq , binding . BindIgnErr ( auth . RegisterForm { } ) , admin . NewUser )
m . Any ( "/admin/users/:userid" , adminReq , binding . BindIgnErr ( auth . AdminEditUserForm { } ) , admin . EditUser )
m . Any ( "/admin/users/:userid/delete" , adminReq , admin . DeleteUser )
m . Get ( "/admin/repos" , adminReq , admin . Repositories )
m . Get ( "/admin/config" , adminReq , admin . Config )
2014-03-20 15:50:26 +04:00
2014-03-18 17:58:58 +04:00
m . Post ( "/:username/:reponame/settings" , reqSignIn , middleware . RepoAssignment ( true ) , repo . SettingPost )
m . Get ( "/:username/:reponame/settings" , reqSignIn , middleware . RepoAssignment ( true ) , repo . Setting )
2014-03-17 10:36:28 +04:00
2014-03-18 17:58:58 +04:00
m . Get ( "/:username/:reponame/commits/:branchname" , ignSignIn , middleware . RepoAssignment ( true ) , repo . Commits )
m . Get ( "/:username/:reponame/issues" , ignSignIn , middleware . RepoAssignment ( true ) , repo . Issues )
m . Get ( "/:username/:reponame/pulls" , ignSignIn , middleware . RepoAssignment ( true ) , repo . Pulls )
m . Get ( "/:username/:reponame/branches" , ignSignIn , middleware . RepoAssignment ( true ) , repo . Branches )
2014-03-20 07:20:55 +04:00
m . Get ( "/:username/:reponame/action/:action" , reqSignIn , middleware . RepoAssignment ( true ) , repo . Action )
2014-03-20 09:31:24 +04:00
m . Get ( "/:username/:reponame/src/:branchname/**" ,
2014-03-18 17:58:58 +04:00
ignSignIn , middleware . RepoAssignment ( true ) , repo . Single )
2014-03-20 09:31:24 +04:00
m . Get ( "/:username/:reponame/src/:branchname" ,
2014-03-18 17:58:58 +04:00
ignSignIn , middleware . RepoAssignment ( true ) , repo . Single )
m . Get ( "/:username/:reponame/commit/:commitid/**" , ignSignIn , middleware . RepoAssignment ( true ) , repo . Single )
m . Get ( "/:username/:reponame/commit/:commitid" , ignSignIn , middleware . RepoAssignment ( true ) , repo . Single )
2014-03-18 07:22:19 +04:00
2014-03-18 17:58:58 +04:00
m . Get ( "/:username/:reponame" , ignSignIn , middleware . RepoAssignment ( true ) , repo . Single )
2014-02-19 13:50:53 +04:00
2014-03-21 20:48:26 +04:00
m . Any ( "/:username/:reponame/**" , ignSignIn , repo . Http )
2014-03-19 20:50:44 +04:00
if martini . Env == martini . Dev {
m . Get ( "/template/**" , dev . TemplatePreview )
}
2014-02-19 13:50:53 +04:00
listenAddr := fmt . Sprintf ( "%s:%s" ,
2014-03-08 02:22:15 +04:00
base . Cfg . MustValue ( "server" , "HTTP_ADDR" ) ,
base . Cfg . MustValue ( "server" , "HTTP_PORT" , "3000" ) )
2014-02-19 13:50:53 +04:00
log . Info ( "Listen: %s" , listenAddr )
2014-03-18 17:58:58 +04:00
if err := http . ListenAndServe ( listenAddr , m ) ; err != nil {
log . Critical ( err . Error ( ) )
}
2014-02-19 13:50:53 +04:00
}