// Test that go1.1 tag above is included in builds. main.go refers to this definition.
const go11tag = true
-const APP_VER = "0.0.2.0309"
+const APP_VER = "0.0.2.0310"
func init() {
runtime.GOMAXPROCS(runtime.NumCPU())
import (
"errors"
+ "fmt"
"os"
"path/filepath"
"strings"
if _, err = session.Insert(repo); err != nil {
if err2 := os.RemoveAll(f); err2 != nil {
- log.Error("delete repo directory %s/%s failed", user.Name, repoName)
+ return nil, errors.New(fmt.Sprintf(
+ "delete repo directory %s/%s failed", user.Name, repoName))
}
session.Rollback()
return nil, err
}
if _, err = session.Insert(&access); err != nil {
if err2 := os.RemoveAll(f); err2 != nil {
- log.Error("delete repo directory %s/%s failed", user.Name, repoName)
+ return nil, errors.New(fmt.Sprintf(
+ "delete repo directory %s/%s failed", user.Name, repoName))
}
session.Rollback()
return nil, err
if _, err = session.Exec("update user set num_repos = num_repos + 1 where id = ?", user.Id); err != nil {
if err2 := os.RemoveAll(f); err2 != nil {
- log.Error("delete repo directory %s/%s failed", user.Name, repoName)
+ return nil, errors.New(fmt.Sprintf(
+ "delete repo directory %s/%s failed", user.Name, repoName))
}
session.Rollback()
return nil, err
if err = session.Commit(); err != nil {
if err2 := os.RemoveAll(f); err2 != nil {
- log.Error("delete repo directory %s/%s failed", user.Name, repoName)
+ return nil, errors.New(fmt.Sprintf(
+ "delete repo directory %s/%s failed", user.Name, repoName))
}
session.Rollback()
return nil, err
return repo, nil
}
+// InitRepository initializes README and .gitignore if needed.
+func InitRepository(repo *Repository, initReadme bool, repoLang string) error {
+ // README.
+
+ // .gitignore
+ return nil
+}
+
// GetRepositories returns the list of repositories of given user.
func GetRepositories(user *User) ([]Repository, error) {
repos := make([]Repository, 0, 10)
--- /dev/null
+// 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 auth
+
+import (
+ "net/http"
+ "reflect"
+ "strings"
+
+ "github.com/codegangsta/martini"
+
+ "github.com/gogits/binding"
+
+ "github.com/gogits/gogs/modules/base"
+ "github.com/gogits/gogs/modules/log"
+)
+
+// Web form interface.
+type Form interface {
+ Name(field string) string
+}
+
+type RegisterForm struct {
+ UserName string `form:"username" binding:"Required;AlphaDash;MinSize(5);MaxSize(30)"`
+ Email string `form:"email" binding:"Required;Email;MaxSize(50)"`
+ Password string `form:"passwd" binding:"Required;MinSize(6);MaxSize(30)"`
+ RetypePasswd string `form:"retypepasswd"`
+}
+
+func (f *RegisterForm) Name(field string) string {
+ names := map[string]string{
+ "UserName": "Username",
+ "Email": "E-mail address",
+ "Password": "Password",
+ "RetypePasswd": "Re-type password",
+ }
+ return names[field]
+}
+
+func (f *RegisterForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) {
+ if req.Method == "GET" || errors.Count() == 0 {
+ return
+ }
+
+ data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData)
+ data["HasError"] = true
+ AssignForm(f, data)
+
+ if len(errors.Overall) > 0 {
+ for _, err := range errors.Overall {
+ log.Error("RegisterForm.Validate: %v", err)
+ }
+ return
+ }
+
+ validate(errors, data, f)
+}
+
+type LogInForm struct {
+ UserName string `form:"username" binding:"Required;AlphaDash;MinSize(5);MaxSize(30)"`
+ Password string `form:"passwd" binding:"Required;MinSize(6);MaxSize(30)"`
+}
+
+func (f *LogInForm) Name(field string) string {
+ names := map[string]string{
+ "UserName": "Username",
+ "Password": "Password",
+ }
+ return names[field]
+}
+
+func (f *LogInForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) {
+ if req.Method == "GET" || errors.Count() == 0 {
+ return
+ }
+
+ data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData)
+ data["HasError"] = true
+ AssignForm(f, data)
+
+ if len(errors.Overall) > 0 {
+ for _, err := range errors.Overall {
+ log.Error("LogInForm.Validate: %v", err)
+ }
+ return
+ }
+
+ validate(errors, data, f)
+}
+
+func getMinMaxSize(field reflect.StructField) string {
+ for _, rule := range strings.Split(field.Tag.Get("binding"), ";") {
+ if strings.HasPrefix(rule, "MinSize(") || strings.HasPrefix(rule, "MaxSize(") {
+ return rule[8 : len(rule)-1]
+ }
+ }
+ return ""
+}
+
+func validate(errors *binding.Errors, data base.TmplData, form Form) {
+ typ := reflect.TypeOf(form)
+ val := reflect.ValueOf(form)
+
+ if typ.Kind() == reflect.Ptr {
+ typ = typ.Elem()
+ val = val.Elem()
+ }
+
+ for i := 0; i < typ.NumField(); i++ {
+ field := typ.Field(i)
+
+ fieldName := field.Tag.Get("form")
+ // Allow ignored fields in the struct
+ if fieldName == "-" {
+ continue
+ }
+
+ if err, ok := errors.Fields[field.Name]; ok {
+ data["Err_"+field.Name] = true
+ switch err {
+ case binding.RequireError:
+ data["ErrorMsg"] = form.Name(field.Name) + " cannot be empty"
+ case binding.AlphaDashError:
+ data["ErrorMsg"] = form.Name(field.Name) + " must be valid alpha or numeric or dash(-_) characters"
+ case binding.MinSizeError:
+ data["ErrorMsg"] = form.Name(field.Name) + " must contain at least " + getMinMaxSize(field) + " characters"
+ case binding.MaxSizeError:
+ data["ErrorMsg"] = form.Name(field.Name) + " must contain at most " + getMinMaxSize(field) + " characters"
+ case binding.EmailError:
+ data["ErrorMsg"] = form.Name(field.Name) + " is not valid"
+ default:
+ data["ErrorMsg"] = "Unknown error: " + err
+ }
+ return
+ }
+ }
+}
+
+// AssignForm assign form values back to the template data.
+func AssignForm(form interface{}, data base.TmplData) {
+ typ := reflect.TypeOf(form)
+ val := reflect.ValueOf(form)
+
+ if typ.Kind() == reflect.Ptr {
+ typ = typ.Elem()
+ val = val.Elem()
+ }
+
+ for i := 0; i < typ.NumField(); i++ {
+ field := typ.Field(i)
+
+ fieldName := field.Tag.Get("form")
+ // Allow ignored fields in the struct
+ if fieldName == "-" {
+ continue
+ }
+
+ data[fieldName] = val.Field(i).Interface()
+ }
+}
+++ /dev/null
-// 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 auth
-
-import (
- "net/http"
- "reflect"
- "strings"
-
- "github.com/codegangsta/martini"
-
- "github.com/gogits/binding"
-
- "github.com/gogits/gogs/modules/base"
- "github.com/gogits/gogs/modules/log"
-)
-
-// Web form interface.
-type Form interface {
- Name(field string) string
-}
-
-type RegisterForm struct {
- UserName string `form:"username" binding:"Required;AlphaDash;MinSize(5);MaxSize(30)"`
- Email string `form:"email" binding:"Required;Email;MaxSize(50)"`
- Password string `form:"passwd" binding:"Required;MinSize(6);MaxSize(30)"`
- RetypePasswd string `form:"retypepasswd"`
-}
-
-func (f *RegisterForm) Name(field string) string {
- names := map[string]string{
- "UserName": "Username",
- "Email": "E-mail address",
- "Password": "Password",
- "RetypePasswd": "Re-type password",
- }
- return names[field]
-}
-
-func (f *RegisterForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) {
- if req.Method == "GET" || errors.Count() == 0 {
- return
- }
-
- data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData)
- data["HasError"] = true
- AssignForm(f, data)
-
- if len(errors.Overall) > 0 {
- for _, err := range errors.Overall {
- log.Error("RegisterForm.Validate: %v", err)
- }
- return
- }
-
- validate(errors, data, f)
-}
-
-type LogInForm struct {
- UserName string `form:"username" binding:"Required;AlphaDash;MinSize(5);MaxSize(30)"`
- Password string `form:"passwd" binding:"Required;MinSize(6);MaxSize(30)"`
-}
-
-func (f *LogInForm) Name(field string) string {
- names := map[string]string{
- "UserName": "Username",
- "Password": "Password",
- }
- return names[field]
-}
-
-func (f *LogInForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) {
- if req.Method == "GET" || errors.Count() == 0 {
- return
- }
-
- data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData)
- data["HasError"] = true
- AssignForm(f, data)
-
- if len(errors.Overall) > 0 {
- for _, err := range errors.Overall {
- log.Error("LogInForm.Validate: %v", err)
- }
- return
- }
-
- validate(errors, data, f)
-}
-
-func getMinMaxSize(field reflect.StructField) string {
- for _, rule := range strings.Split(field.Tag.Get("binding"), ";") {
- if strings.HasPrefix(rule, "MinSize(") || strings.HasPrefix(rule, "MaxSize(") {
- return rule[8 : len(rule)-1]
- }
- }
- return ""
-}
-
-func validate(errors *binding.Errors, data base.TmplData, form Form) {
- typ := reflect.TypeOf(form)
- val := reflect.ValueOf(form)
-
- if typ.Kind() == reflect.Ptr {
- typ = typ.Elem()
- val = val.Elem()
- }
-
- for i := 0; i < typ.NumField(); i++ {
- field := typ.Field(i)
-
- fieldName := field.Tag.Get("form")
- // Allow ignored fields in the struct
- if fieldName == "-" {
- continue
- }
-
- if err, ok := errors.Fields[field.Name]; ok {
- data["Err_"+field.Name] = true
- switch err {
- case binding.RequireError:
- data["ErrorMsg"] = form.Name(field.Name) + " cannot be empty"
- case binding.AlphaDashError:
- data["ErrorMsg"] = form.Name(field.Name) + " must be valid alpha or numeric or dash(-_) characters"
- case binding.MinSizeError:
- data["ErrorMsg"] = form.Name(field.Name) + " must contain at least " + getMinMaxSize(field) + " characters"
- case binding.MaxSizeError:
- data["ErrorMsg"] = form.Name(field.Name) + " must contain at most " + getMinMaxSize(field) + " characters"
- case binding.EmailError:
- data["ErrorMsg"] = form.Name(field.Name) + " is not valid"
- default:
- data["ErrorMsg"] = "Unknown error: " + err
- }
- return
- }
- }
-}
-
-// AssignForm assign form values back to the template data.
-func AssignForm(form interface{}, data base.TmplData) {
- typ := reflect.TypeOf(form)
- val := reflect.ValueOf(form)
-
- if typ.Kind() == reflect.Ptr {
- typ = typ.Elem()
- val = val.Elem()
- }
-
- for i := 0; i < typ.NumField(); i++ {
- field := typ.Field(i)
-
- fieldName := field.Tag.Get("form")
- // Allow ignored fields in the struct
- if fieldName == "-" {
- continue
- }
-
- data[fieldName] = val.Field(i).Interface()
- }
-}
--- /dev/null
+// 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 auth
+
+import (
+ "net/http"
+ "reflect"
+ "strings"
+
+ "github.com/codegangsta/martini"
+
+ "github.com/gogits/binding"
+
+ "github.com/gogits/gogs/modules/base"
+ "github.com/gogits/gogs/modules/log"
+)
+
+type AddSSHKeyForm struct {
+ KeyName string `form:"keyname" binding:"Required"`
+ KeyContent string `form:"key_content" binding:"Required"`
+}
+
+func (f *AddSSHKeyForm) Name(field string) string {
+ names := map[string]string{
+ "KeyName": "SSH key name",
+ "KeyContent": "SSH key content",
+ }
+ return names[field]
+}
+
+func (f *AddSSHKeyForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) {
+ data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData)
+ AssignForm(f, data)
+
+ if req.Method == "GET" || errors.Count() == 0 {
+ if req.Method == "POST" &&
+ (len(f.KeyContent) < 100 || !strings.HasPrefix(f.KeyContent, "ssh-rsa")) {
+ data["HasError"] = true
+ data["ErrorMsg"] = "SSH key content is not valid"
+ }
+ return
+ }
+
+ data["HasError"] = true
+ if len(errors.Overall) > 0 {
+ for _, err := range errors.Overall {
+ log.Error("AddSSHKeyForm.Validate: %v", err)
+ }
+ return
+ }
+
+ validate(errors, data, f)
+}
}
fmt.Println(models.RepoPath(user.Name, form.RepoName))
if err == nil {
- if _, err = models.CreateRepository(user,
+ if repo, err := models.CreateRepository(user,
form.RepoName, form.Description, form.Visibility == "private"); err == nil {
- // Initialize README.
- if form.InitReadme == "true" {
- // TODO
+ err = models.InitRepository(repo, form.InitReadme == "true", form.Language)
+ if err == nil {
+ data["RepoName"] = user.Name + "/" + form.RepoName
+ r.HTML(200, "repo/created", data)
+ return
}
- // TODO: init .gitignore file
- data["RepoName"] = user.Name + "/" + form.RepoName
- r.HTML(200, "repo/created", data)
- return
}
}
package user
import (
+ "net/http"
+ "strconv"
+
+ "github.com/martini-contrib/render"
+ "github.com/martini-contrib/sessions"
+
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/auth"
"github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/log"
- "github.com/martini-contrib/render"
- "github.com/martini-contrib/sessions"
- "net/http"
- "strconv"
)
func Setting(r render.Render, data base.TmplData, session sessions.Session) {
r.HTML(200, "user/setting", data)
}
-func SettingSSHKeys(r render.Render, data base.TmplData, req *http.Request, session sessions.Session) {
- // del ssh ky
+func SettingSSHKeys(form auth.AddSSHKeyForm, r render.Render, data base.TmplData, req *http.Request, session sessions.Session) {
+ data["Title"] = "SSH Keys"
+
+ // Delete SSH key.
if req.Method == "DELETE" || req.FormValue("_method") == "DELETE" {
+ println(1)
id, err := strconv.ParseInt(req.FormValue("id"), 10, 64)
if err != nil {
data["ErrorMsg"] = err
Id: id,
OwnerId: auth.SignedInId(session),
}
- err = models.DeletePublicKey(k)
- if err != nil {
+
+ if err = models.DeletePublicKey(k); err != nil {
data["ErrorMsg"] = err
log.Error("ssh.DelPublicKey: %v", err)
r.JSON(200, map[string]interface{}{
"ok": true,
})
}
- return
}
- // add ssh key
+
+ // Add new SSH key.
if req.Method == "POST" {
+ if hasErr, ok := data["HasError"]; ok && hasErr.(bool) {
+ r.HTML(200, "user/publickey", data)
+ return
+ }
+
k := &models.PublicKey{OwnerId: auth.SignedInId(session),
- Name: req.FormValue("keyname"),
- Content: req.FormValue("key_content"),
+ Name: form.KeyName,
+ Content: form.KeyContent,
}
- err := models.AddPublicKey(k)
- if err != nil {
+
+ if err := models.AddPublicKey(k); err != nil {
data["ErrorMsg"] = err
log.Error("ssh.AddPublicKey: %v", err)
r.HTML(200, "base/error", data)
data["AddSSHKeySuccess"] = true
}
}
- // get keys
+
+ // List existed SSH keys.
keys, err := models.ListPublicKey(auth.SignedInId(session))
if err != nil {
data["ErrorMsg"] = err
return
}
- // set to template
- data["Title"] = "SSH Keys"
data["PageIsUserSetting"] = true
data["Keys"] = keys
r.HTML(200, "user/publickey", data)
"github.com/gogits/gogs/modules/log"
)
-func AddPublicKey(req *http.Request, data base.TmplData, r render.Render, session sessions.Session) {
- data["Title"] = "Add Public Key"
-
- if req.Method == "GET" {
- r.HTML(200, "user/publickey_add", data)
- return
- }
-
- k := &models.PublicKey{OwnerId: auth.SignedInId(session),
- Name: req.FormValue("keyname"),
- Content: req.FormValue("key_content"),
- }
- err := models.AddPublicKey(k)
- if err != nil {
- data["ErrorMsg"] = err
- log.Error("ssh.AddPublicKey: %v", err)
- r.HTML(200, "base/error", data)
- } else {
- r.HTML(200, "user/publickey_added", data)
- }
-}
-
func DelPublicKey(req *http.Request, data base.TmplData, r render.Render, session sessions.Session) {
data["Title"] = "Del Public Key"
}
}
}
-
-func ListPublicKey(req *http.Request, data base.TmplData, r render.Render, session sessions.Session) {
- data["Title"] = "Public Keys"
-
- keys, err := models.ListPublicKey(auth.SignedInId(session))
- if err != nil {
- data["ErrorMsg"] = err
- log.Error("ssh.ListPublicKey: %v", err)
- r.HTML(200, "base/error", data)
- return
- }
-
- data["Keys"] = keys
- r.HTML(200, "user/publickey_list", data)
-}
<li class="list-group-item"><a href="#">Kill Myself</a></li>
</ul>
</div>
+
<div id="gogs-user-setting-container" class="col-md-9">
<div id="gogs-ssh-keys">
<h4>SSH Keys</h4>{{if .AddSSHKeySuccess}}
- <p class="alert alert-success">New SSH Key is added !</p>{{end}}
+ <p class="alert alert-success">New SSH Key has been added !</p>{{else if .HasError}}<p class="alert alert-danger">{{.ErrorMsg}}</p>{{end}}
<ul id="gogs-ssh-keys-list" class="list-group">
<li class="list-group-item"><span class="name">SSH Key's name</span></li>{{range .Keys}}
<li class="list-group-item">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4 class="modal-title" id="myModalLabel">Add SSH Key</h4>
</div>
+
<div class="modal-body">
<div class="form-group">
<label class="col-md-3 control-label">The name of key<strong class="text-danger">*</strong></label>
<input name="keyname" class="form-control" placeholder="Type your preferred name" required="required">
</div>
</div>
+
<div class="form-group">
<label class="col-md-3 control-label">SSH Key<strong class="text-danger">*</strong></label>
<div class="col-md-8">
</div>
</div>
</div>
+
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
<button type="submit" class="btn btn-primary">Save SSH Key</button>
</form>
</div>
</div>
- <p><strong>Need help?</strong> Check out our guide to <a href="https://help.github.com/articles/generating-ssh-keys" target="_blank">generating SSH keys</a> or troubleshoot <a href="https://help.github.com/ssh-issues/" target="_blank">common SSH Problems</a></p>
+ <p><strong>Need help?</strong> Check out the guide to <a href="https://help.github.com/articles/generating-ssh-keys" target="_blank">generating SSH keys</a> or troubleshoot <a href="https://help.github.com/ssh-issues/" target="_blank">common SSH Problems</a></p>
</div>
</div>
</div>
<div class="form-group">
<label class="col-md-4 control-label">Name of this public key: </label>
<div class="col-md-3">
- <input name="keyname" class="form-control" placeholder="Type your preferred name">
+ <input name="keyname" class="form-control" placeholder="Type your preferred name" value="{{.KeyName}}">
</div>
</div>
<div class="form-group">
<label class="col-md-4 control-label">Paste your key here: </label>
<div class="col-md-3">
- <textarea name="key_content" cols="30" rows="10" class="form-control"></textarea>
+ <textarea name="key_content" cols="30" rows="10" class="form-control">{{.KeyContent}}</textarea>
</div>
</div>
<li class="list-group-item"><a href="#">Notifications</a></li>
<li class="list-group-item"><a href="/user/setting/ssh/">SSH Keys</a></li>
<li class="list-group-item"><a href="#">Security</a></li>
- <li class="list-group-item"><a href="#">Kill myself</a></li>
+ <li class="list-group-item"><a href="#">Kill Myself</a></li>
</ul>
</div>
<div id="gogs-user-setting-container" class="col-md-9">
m.Any("/user/sign_up", auth.SignOutRequire(), binding.BindIgnErr(auth.RegisterForm{}), user.SignUp)
m.Any("/user/delete", auth.SignInRequire(true), user.Delete)
- m.Any("/user/setting",auth.SignInRequire(true),user.Setting)
- m.Any("/user/setting/ssh",auth.SignInRequire(true),user.SettingSSHKeys)
+ m.Any("/user/setting", auth.SignInRequire(true), user.Setting)
+ m.Any("/user/setting/ssh", auth.SignInRequire(true), binding.BindIgnErr(auth.AddSSHKeyForm{}), user.SettingSSHKeys)
m.Get("/user/:username", auth.SignInRequire(false), user.Profile)
- //m.Any("/user/publickey/add", auth.SignInRequire(true), user.AddPublicKey)
- //m.Any("/user/publickey/list", auth.SignInRequire(true), user.ListPublicKey)
-
m.Any("/repo/create", auth.SignInRequire(true), binding.BindIgnErr(auth.CreateRepoForm{}), repo.Create)
m.Any("/repo/delete", auth.SignInRequire(true), repo.Delete)
m.Any("/repo/list", auth.SignInRequire(false), repo.List)