diff --git a/gogs.go b/gogs.go index e826ab9f3..3b33c4e30 100644 --- a/gogs.go +++ b/gogs.go @@ -49,6 +49,7 @@ func main() { app.Commands = []cli.Command{ CmdWeb, CmdServ, + CmdUpdate, } app.Flags = append(app.Flags, []cli.Flag{ cli.BoolFlag{"noterm", "disable color output"}, diff --git a/models/action.go b/models/action.go index 6a77d7300..93c1e2768 100644 --- a/models/action.go +++ b/models/action.go @@ -43,7 +43,22 @@ func (a Action) GetRepoName() string { return a.RepoName } +func CommitRepoAction(userId int64, userName string, + repoId int64, repoName string, msg string) error { + _, err := orm.InsertOne(&Action{ + UserId: userId, + ActUserId: userId, + ActUserName: userName, + OpType: OP_COMMIT_REPO, + Content: msg, + RepoId: repoId, + RepoName: repoName, + }) + return err +} + // NewRepoAction inserts action for create repository. + func NewRepoAction(user *User, repo *Repository) error { _, err := orm.InsertOne(&Action{ UserId: user.Id, diff --git a/serve.go b/serve.go index 56105f2f8..50ec94a8d 100644 --- a/serve.go +++ b/serve.go @@ -73,6 +73,17 @@ func runServ(*cli.Context) { if strings.HasSuffix(repoName, ".git") { repoName = repoName[:len(repoName)-4] } + + os.Setenv("userName", user.Name) + os.Setenv("userId", strconv.Itoa(int(user.Id))) + repo, err := models.GetRepositoryByName(user, repoName) + if err != nil { + println("Unavilable repository", err) + return + } + os.Setenv("repoId", strconv.Itoa(int(repo.Id))) + os.Setenv("repoName", repoName) + isWrite := In(verb, COMMANDS_WRITE) isRead := In(verb, COMMANDS_READONLY) diff --git a/update.go b/update.go new file mode 100644 index 000000000..339b3ab94 --- /dev/null +++ b/update.go @@ -0,0 +1,51 @@ +package main + +import ( + "os" + "strconv" + + "github.com/gogits/gogs/models" + + "github.com/codegangsta/cli" + git "github.com/gogits/git" +) + +var CmdUpdate = cli.Command{ + Name: "update", + Usage: "This command just should be called by ssh shell", + Description: ` +gogs serv provide access auth for repositories`, + Action: runUpdate, + Flags: []cli.Flag{}, +} + +func runUpdate(*cli.Context) { + userName := os.Getenv("userName") + userId := os.Getenv("userId") + repoId := os.Getenv("repoId") + repoName := os.Getenv("repoName") + + f := models.RepoPath(userName, repoName) + + repo, err := git.OpenRepository(f) + if err != nil { + return + } + + ref, err := repo.LookupReference("HEAD") + if err != nil { + return + } + + lastCommit, err := repo.LookupCommit(ref.Oid) + if err != nil { + return + } + sUserId, _ := strconv.Atoi(userId) + sRepoId, _ := strconv.Atoi(repoId) + err = models.CommitRepoAction(int64(sUserId), userName, + int64(sRepoId), repoName, lastCommit.Message()) + if err != nil { + //TODO: log + } +}