@@ -1,4 +1,8 @@ | |||
APP_NAME = Gogs - Go Git Service | |||
RUN_USER = git | |||
[repository] | |||
ROOT = /home/git/gogs-repositories | |||
[server] | |||
HTTP_ADDR = | |||
@@ -17,7 +17,7 @@ import ( | |||
// Test that go1.1 tag above is included in builds. main.go refers to this definition. | |||
const go11tag = true | |||
const APP_VER = "0.0.0.0219" | |||
const APP_VER = "0.0.0.0220" | |||
func init() { | |||
runtime.GOMAXPROCS(runtime.NumCPU()) | |||
@@ -36,5 +36,4 @@ func main() { | |||
cli.BoolFlag{"noterm", "disable color output"}, | |||
}...) | |||
app.Run(os.Args) | |||
println("wo cao???") | |||
} |
@@ -77,6 +77,8 @@ func setEngine() { | |||
//x.ShowSQL = true | |||
log.Trace("Initialized database -> %s", dbName) | |||
RepoRootPath = utils.Cfg.MustValue("repository", "ROOT") | |||
} | |||
func init() { | |||
@@ -11,6 +11,7 @@ import ( | |||
"time" | |||
git "github.com/libgit2/git2go" | |||
"github.com/qiniu/log" | |||
) | |||
type Repo struct { | |||
@@ -35,7 +36,7 @@ func IsRepositoryExist(user *User, reposName string) (bool, error) { | |||
} | |||
s, err := os.Stat(filepath.Join(RepoRootPath, user.Name, reposName)) | |||
if err != nil { | |||
return false, err | |||
return false, nil | |||
} | |||
return s.IsDir(), nil | |||
} | |||
@@ -44,9 +45,7 @@ func IsRepositoryExist(user *User, reposName string) (bool, error) { | |||
// create a repository for a user or orgnaziation | |||
// | |||
func CreateRepository(user *User, reposName string) (*Repo, error) { | |||
p := filepath.Join(RepoRootPath, user.Name) | |||
os.MkdirAll(p, os.ModePerm) | |||
f := filepath.Join(p, reposName+".git") | |||
f := RepoPath(user.Name, reposName) | |||
_, err := git.InitRepository(f, false) | |||
if err != nil { | |||
return nil, err | |||
@@ -58,19 +57,28 @@ func CreateRepository(user *User, reposName string) (*Repo, error) { | |||
session.Begin() | |||
_, err = session.Insert(&repo) | |||
if err != nil { | |||
os.RemoveAll(f) | |||
err2 := os.RemoveAll(f) | |||
if err2 != nil { | |||
log.Error("delete repo directory %s/%s failed", user.Name, reposName) | |||
} | |||
session.Rollback() | |||
return nil, err | |||
} | |||
_, err = session.Exec("update user set num_repos = num_repos + 1 where id = ?", user.Id) | |||
if err != nil { | |||
os.RemoveAll(f) | |||
err2 := os.RemoveAll(f) | |||
if err2 != nil { | |||
log.Error("delete repo directory %s/%s failed", user.Name, reposName) | |||
} | |||
session.Rollback() | |||
return nil, err | |||
} | |||
err = session.Commit() | |||
if err != nil { | |||
os.RemoveAll(f) | |||
err2 := os.RemoveAll(f) | |||
if err2 != nil { | |||
log.Error("delete repo directory %s/%s failed", user.Name, reposName) | |||
} | |||
session.Rollback() | |||
return nil, err | |||
} | |||
@@ -100,6 +108,10 @@ func UnWatchRepository() { | |||
} | |||
func RepoPath(userName, repoName string) string { | |||
return filepath.Join(UserPath(userName), repoName+".git") | |||
} | |||
// DeleteRepository deletes a repository for a user or orgnaztion. | |||
func DeleteRepository(user *User, reposName string) (err error) { | |||
session := orm.NewSession() | |||
@@ -115,8 +127,9 @@ func DeleteRepository(user *User, reposName string) (err error) { | |||
session.Rollback() | |||
return err | |||
} | |||
if err = os.RemoveAll(filepath.Join(RepoRootPath, user.Name, reposName+".git")); err != nil { | |||
if err = os.RemoveAll(RepoPath(user.Name, reposName)); err != nil { | |||
// TODO: log and delete manully | |||
log.Error("delete repo %s/%s failed", user.Name, reposName) | |||
return err | |||
} | |||
return nil | |||
@@ -7,12 +7,15 @@ package models | |||
import ( | |||
"errors" | |||
"fmt" | |||
"os" | |||
"path/filepath" | |||
"strings" | |||
"time" | |||
"github.com/dchest/scrypt" | |||
"github.com/gogits/gogs/utils" | |||
"github.com/gogits/gogs/utils/log" | |||
) | |||
// User types. | |||
@@ -96,10 +99,22 @@ func RegisterUser(user *User) (err error) { | |||
user.LowerName = strings.ToLower(user.Name) | |||
user.Avatar = utils.EncodeMd5(user.Email) | |||
user.Updated = time.Now() | |||
user.EncodePasswd() | |||
_, err = orm.Insert(user) | |||
return err | |||
if err != nil { | |||
return err | |||
} | |||
err = os.MkdirAll(UserPath(user.Name), os.ModePerm) | |||
if err != nil { | |||
_, err2 := orm.Id(user.Id).Delete(&User{}) | |||
if err2 != nil { | |||
log.Error("create userpath %s failed and delete table record faild", | |||
user.Name) | |||
} | |||
return err | |||
} | |||
return nil | |||
} | |||
// UpdateUser updates user's information. | |||
@@ -129,6 +144,10 @@ func (user *User) EncodePasswd() error { | |||
return err | |||
} | |||
func UserPath(userName string) string { | |||
return filepath.Join(RepoRootPath, userName) | |||
} | |||
func GetUserByKeyId(keyId int64) (*User, error) { | |||
user := new(User) | |||
has, err := orm.Sql("select a.* from user as a, public_key as b where a.id = b.owner_id and b.id=?", keyId).Get(user) | |||
@@ -4,7 +4,6 @@ import ( | |||
"fmt" | |||
"os" | |||
"os/exec" | |||
"path/filepath" | |||
"strconv" | |||
"strings" | |||
@@ -66,16 +65,12 @@ func runServ(*cli.Context) { | |||
return | |||
} | |||
f, _ := os.Create("test2.log") | |||
f.WriteString(cmd) | |||
f.Close() | |||
log.Info("cmd is %s", cmd) | |||
println(cmd) | |||
verb, args := parseCmd(cmd) | |||
rr := strings.SplitN(strings.Trim(args, "'"), "/", 1) | |||
rr := strings.SplitN(strings.Trim(args, "'"), "/", 2) | |||
if len(rr) != 2 { | |||
fmt.Printf("Unavilable repository") | |||
println("Unavilable repository", args) | |||
return | |||
} | |||
repoName := rr[1] | |||
@@ -84,6 +79,9 @@ func runServ(*cli.Context) { | |||
} | |||
isWrite := In(verb, COMMANDS_WRITE) | |||
isRead := In(verb, COMMANDS_READONLY) | |||
println("repoPath:", models.RepoPath(user.Name, repoName)) | |||
switch { | |||
case isWrite: | |||
has, err := models.HasAccess(user.Name, repoName, COMMANDS_WRITE[verb]) | |||
@@ -92,7 +90,7 @@ func runServ(*cli.Context) { | |||
return | |||
} | |||
if !has { | |||
fmt.Println("You have no right to access this repository") | |||
println("You have no right to access this repository") | |||
return | |||
} | |||
case isRead: | |||
@@ -109,36 +107,36 @@ func runServ(*cli.Context) { | |||
} | |||
} | |||
if !has { | |||
fmt.Println("You have no right to access this repository") | |||
println("You have no right to access this repository") | |||
return | |||
} | |||
default: | |||
fmt.Println("Unknown command") | |||
println("Unknown command") | |||
return | |||
} | |||
isExist, err := models.IsRepositoryExist(user, repoName) | |||
if err != nil { | |||
fmt.Println("Inernel error") | |||
println("Inernel error:", err.Error()) | |||
return | |||
} | |||
if !isExist { | |||
if isRead { | |||
fmt.Println("Repository is not exist") | |||
println("Repository", user.Name+"/"+repoName, "is not exist") | |||
return | |||
} else if isWrite { | |||
_, err := models.CreateRepository(user, repoName) | |||
if err != nil { | |||
fmt.Println("Create repository failed") | |||
println("Create repository failed") | |||
return | |||
} | |||
} | |||
} | |||
fullPath := filepath.Join(models.RepoRootPath, user.Name, repoName+".git") | |||
fullPath := models.RepoPath(user.Name, repoName) | |||
newcmd := fmt.Sprintf("%s '%s'", verb, fullPath) | |||
fmt.Println(newcmd) | |||
println(newcmd) | |||
gitcmd := exec.Command("git", "shell", "-c", newcmd) | |||
gitcmd.Stdout = os.Stdout | |||
gitcmd.Stderr = os.Stderr | |||
@@ -150,13 +148,14 @@ func runServ(*cli.Context) { | |||
} | |||
func parseCmd(cmd string) (string, string) { | |||
ss := strings.SplitN(cmd, " ", 1) | |||
ss := strings.SplitN(cmd, " ", 2) | |||
if len(ss) != 2 { | |||
return "", "" | |||
} | |||
verb, args := ss[0], ss[1] | |||
if verb == "git" { | |||
ss = strings.SplitN(args, " ", 1) | |||
ss = strings.SplitN(args, " ", 2) | |||
args = ss[1] | |||
verb = fmt.Sprintf("%s %s", verb, ss[0]) | |||
} | |||