return err
}
- /*
- // hook/post-update
- pu, err := os.OpenFile(filepath.Join(repoPath, "hooks", "post-update"), os.O_CREATE|os.O_WRONLY, 0777)
- if err != nil {
- return err
- }
- defer pu.Close()
- // TODO: Windows .bat
- if _, err = pu.WriteString(fmt.Sprintf("#!/usr/bin/env bash\n%s update\n", appPath)); err != nil {
- return err
- }
-
- // hook/post-update
- pu2, err := os.OpenFile(filepath.Join(repoPath, "hooks", "post-receive"), os.O_CREATE|os.O_WRONLY, 0777)
- if err != nil {
- return err
- }
- defer pu2.Close()
- // TODO: Windows .bat
- if _, err = pu2.WriteString("#!/usr/bin/env bash\ngit update-server-info\n"); err != nil {
- return err
- }
- */
+ // hook/post-update
+ pu, err := os.OpenFile(filepath.Join(repoPath, "hooks", "update"), os.O_CREATE|os.O_WRONLY, 0777)
+ if err != nil {
+ return err
+ }
+ defer pu.Close()
+ // TODO: Windows .bat
+ if _, err = pu.WriteString(fmt.Sprintf("#!/usr/bin/env bash\n%s update $1 $2 $3\n", appPath)); err != nil {
+ return err
+ }
- /*// hook/post-update
- pu2, err := os.OpenFile(filepath.Join(repoPath, "hooks", "post-receive"), os.O_CREATE|os.O_WRONLY, 0777)
- if err != nil {
- return err
- }
- defer pu2.Close()
- // TODO: Windows .bat
- if _, err = pu2.WriteString("#!/usr/bin/env bash\ngit update-server-info\n"); err != nil {
- return err
- }
- */
-
// Initialize repository according to user's choice.
fileName := map[string]string{}
if initReadme {
return watches, err
}
- // IsWatching checks if user has watched given repository.
- func IsWatching(userId, repoId int64) bool {
- has, _ := orm.Get(&Watch{0, repoId, userId})
- return has
- }
-
- func StarReposiory(user *User, repoName string) error {
- return nil
- }
-
- func UnStarRepository() {
-
- }
-
- func WatchRepository() {
-
- }
-
- func UnWatchRepository() {
-
- }
-
- func ForkRepository(reposName string, userId int64) {
-
- }
-
- // RepoFile represents a file object in git repository.
- type RepoFile struct {
- *git.TreeEntry
- Path string
- Size int64
- Repo *git.Repository
- Commit *git.Commit
- }
-
- // LookupBlob returns the content of an object.
- func (file *RepoFile) LookupBlob() (*git.Blob, error) {
- if file.Repo == nil {
- return nil, ErrRepoFileNotLoaded
- }
-
- return file.Repo.LookupBlob(file.Id)
- }
-
- // GetBranches returns all branches of given repository.
- func GetBranches(userName, reposName string) ([]string, error) {
- repo, err := git.OpenRepository(RepoPath(userName, reposName))
- if err != nil {
- return nil, err
- }
-
- refs, err := repo.AllReferences()
- if err != nil {
- return nil, err
- }
-
- brs := make([]string, len(refs))
- for i, ref := range refs {
- brs[i] = ref.BranchName()
- }
- return brs, nil
- }
-
- func GetTargetFile(userName, reposName, branchName, commitId, rpath string) (*RepoFile, error) {
- repo, err := git.OpenRepository(RepoPath(userName, reposName))
+ // NotifyWatchers creates batch of actions for every watcher.
+ func NotifyWatchers(userId, repoId int64, opType int, userName, repoName, refName, content string) error {
+ // Add feeds for user self and all watchers.
+ watches, err := GetWatches(repoId)
if err != nil {
- return nil, err
+ return errors.New("repo.NotifyWatchers(get watches): " + err.Error())
}
+ watches = append(watches, Watch{UserId: userId})
- commit, err := repo.GetCommit(branchName, commitId)
- if err != nil {
- return nil, err
- }
-
- parts := strings.Split(path.Clean(rpath), "/")
-
- var entry *git.TreeEntry
- tree := commit.Tree
- for i, part := range parts {
- if i == len(parts)-1 {
- entry = tree.EntryByName(part)
- if entry == nil {
- return nil, ErrRepoFileNotExist
- }
- } else {
- tree, err = repo.SubTree(tree, part)
- if err != nil {
- return nil, err
- }
+ for i := range watches {
+ if userId == watches[i].UserId && i > 0 {
+ continue // Do not add twice in case author watches his/her repository.
}
- }
-
- size, err := repo.ObjectSize(entry.Id)
- if err != nil {
- return nil, err
- }
- repoFile := &RepoFile{
- entry,
- rpath,
- size,
- repo,
- commit,
+ _, err = orm.InsertOne(&Action{
+ UserId: watches[i].UserId,
+ ActUserId: userId,
+ ActUserName: userName,
+ OpType: opType,
+ Content: content,
+ RepoId: repoId,
+ RepoName: repoName,
+ RefName: refName,
+ })
+ if err != nil {
+ return errors.New("repo.NotifyWatchers(create action): " + err.Error())
+ }
}
-
- return repoFile, nil
+ return nil
}
- // GetReposFiles returns a list of file object in given directory of repository.
- func GetReposFiles(userName, reposName, branchName, commitId, rpath string) ([]*RepoFile, error) {
- repo, err := git.OpenRepository(RepoPath(userName, reposName))
- if err != nil {
- return nil, err
- }
-
- commit, err := repo.GetCommit(branchName, commitId)
- if err != nil {
- return nil, err
- }
-
- var repodirs []*RepoFile
- var repofiles []*RepoFile
- commit.Tree.Walk(func(dirname string, entry *git.TreeEntry) int {
- if dirname == rpath {
- // TODO: size get method shoule be improved
- size, err := repo.ObjectSize(entry.Id)
- if err != nil {
- return 0
- }
-
- var cm = commit
- var i int
- for {
- i = i + 1
- //fmt.Println(".....", i, cm.Id(), cm.ParentCount())
- if cm.ParentCount() == 0 {
- break
- } else if cm.ParentCount() == 1 {
- pt, _ := repo.SubTree(cm.Parent(0).Tree, dirname)
- if pt == nil {
- break
- }
- pEntry := pt.EntryByName(entry.Name)
- if pEntry == nil || !pEntry.Id.Equal(entry.Id) {
- break
- } else {
- cm = cm.Parent(0)
- }
- } else {
- var emptyCnt = 0
- var sameIdcnt = 0
- var lastSameCm *git.Commit
- //fmt.Println(".....", cm.ParentCount())
- for i := 0; i < cm.ParentCount(); i++ {
- //fmt.Println("parent", i, cm.Parent(i).Id())
- p := cm.Parent(i)
- pt, _ := repo.SubTree(p.Tree, dirname)
- var pEntry *git.TreeEntry
- if pt != nil {
- pEntry = pt.EntryByName(entry.Name)
- }
-
- //fmt.Println("pEntry", pEntry)
-
- if pEntry == nil {
- emptyCnt = emptyCnt + 1
- if emptyCnt+sameIdcnt == cm.ParentCount() {
- if lastSameCm == nil {
- goto loop
- } else {
- cm = lastSameCm
- break
- }
- }
- } else {
- //fmt.Println(i, "pEntry", pEntry.Id, "entry", entry.Id)
- if !pEntry.Id.Equal(entry.Id) {
- goto loop
- } else {
- lastSameCm = cm.Parent(i)
- sameIdcnt = sameIdcnt + 1
- if emptyCnt+sameIdcnt == cm.ParentCount() {
- // TODO: now follow the first parent commit?
- cm = lastSameCm
- //fmt.Println("sameId...")
- break
- }
- }
- }
- }
- }
- }
-
- loop:
-
- rp := &RepoFile{
- entry,
- path.Join(dirname, entry.Name),
- size,
- repo,
- cm,
- }
-
- if entry.IsFile() {
- repofiles = append(repofiles, rp)
- } else if entry.IsDir() {
- repodirs = append(repodirs, rp)
- }
- }
- return 0
- })
-
- return append(repodirs, repofiles...), nil
+ // IsWatching checks if user has watched given repository.
+ func IsWatching(userId, repoId int64) bool {
+ has, _ := orm.Get(&Watch{0, repoId, userId})
+ return has
}
- func GetCommit(userName, repoName, branchname, commitid string) (*git.Commit, error) {
- repo, err := git.OpenRepository(RepoPath(userName, repoName))
- if err != nil {
- return nil, err
- }
-func StarReposiory(user *User, repoName string) error {
- return nil
-}
--
- return repo.GetCommit(branchname, commitid)
-func UnStarRepository() {
-
-}
-
-func WatchRepository() {
-
-}
-
-func UnWatchRepository() {
-
--}
-
+ func ForkRepository(reposName string, userId int64) {
- // GetCommits returns all commits of given branch of repository.
- func GetCommits(userName, reposName, branchname string) (*list.List, error) {
- repo, err := git.OpenRepository(RepoPath(userName, reposName))
- if err != nil {
- return nil, err
- }
- r, err := repo.LookupReference(fmt.Sprintf("refs/heads/%s", branchname))
- if err != nil {
- return nil, err
- }
- return r.AllCommits()
}
package main
import (
- "bytes"
- "container/list"
+ //"container/list"
"fmt"
- "io"
"os"
"os/exec"
+ "path"
"strconv"
"strings"
- "time"
"github.com/codegangsta/cli"
"github.com/gogits/gogs/modules/log"
isWrite := In(verb, COMMANDS_WRITE)
isRead := In(verb, COMMANDS_READONLY)
- //repo, err := models.GetRepositoryByName(user.Id, repoName)
- repo, err := models.GetRepositoryByName(user.Id, repoName)
- var isExist bool = true
++ /*//repo, err := models.GetRepositoryByName(user.Id, repoName)
+ //var isExist bool = true
if err != nil {
if err == models.ErrRepoNotExist {
- isExist = false
+ //isExist = false
if isRead {
println("Repository", user.Name+"/"+repoName, "is not exist")
+ log.Error("Repository " + user.Name + "/" + repoName + " is not exist")
return
}
} else {
println("Get repository error:", err)
- log.Error(err.Error())
+ log.Error("Get repository error: " + err.Error())
return
}
-- }
++ }*/
// access check
switch {
if err = gitcmd.Run(); err != nil {
println("execute command error:", err.Error())
- log.Error(err.Error())
+ log.Error("execute command error: " + err.Error())
return
}
-
- if isRead {
- return
- }
-
- time.Sleep(time.Second)
-
- // find push reference name
- var t = "ok refs/heads/"
- var i int
- var refname string
- for {
- l, err := b.ReadString('\n')
- if err != nil {
- break
- }
- i = i + 1
- l = l[:len(l)-1]
- idx := strings.Index(l, t)
- if idx > 0 {
- refname = l[idx+len(t):]
- }
- }
- if refname == "" {
- println("Not found any reference name:", b.String())
- log.Error("Not found any reference name: " + b.String())
- return
- }
-
- var ref *git.Reference
- var ok bool
- var l *list.List
- //log.Info("----", refname, "-----")
- if ref, ok = refs[refname]; !ok {
- // for new branch
- refs, err = rep.AllReferencesMap()
- if err != nil {
- println("Get All References failed:", err.Error())
- log.Error("Get All References failed: " + err.Error())
- return
- }
- if ref, ok = refs[refname]; !ok {
- log.Error("unknow reference name -", refname, "-", b.String())
- return
- }
- l, err = ref.AllCommits()
- if err != nil {
- println("Get All Commits failed:", err.Error())
- log.Error("Get All Commits failed: " + err.Error())
- return
- }
- } else {
- //log.Info("----", ref, "-----")
- var last *git.Commit
- //log.Info("00000", ref.Oid.String())
- last, err = ref.LastCommit()
- if err != nil {
- println("Get last commit failed:", err.Error())
- log.Error("Get last commit failed: " + err.Error())
- return
- }
-
- ref2, err := rep.LookupReference(ref.Name)
- if err != nil {
- println("look up reference failed:", err.Error())
- log.Error("look up reference failed: " + err.Error())
- return
- }
-
- //log.Info("11111", ref2.Oid.String())
- before, err := ref2.LastCommit()
- if err != nil {
- println("Get last commit failed:", err.Error())
- log.Error("Get last commit failed: " + err.Error())
- return
- }
- //log.Info("----", before.Id(), "-----", last.Id())
- l = ref.CommitsBetween(before, last)
- }
-
- commits := make([][]string, 0)
- var maxCommits = 3
- for e := l.Front(); e != nil; e = e.Next() {
- commit := e.Value.(*git.Commit)
- commits = append(commits, []string{commit.Id().String(), commit.Message()})
- if len(commits) >= maxCommits {
- break
- }
- }
-
- if err = models.CommitRepoAction(user.Id, user.Name,
- repo.Id, repoName, refname, &base.PushCommits{l.Len(), commits}); err != nil {
- log.Error("runUpdate.models.CommitRepoAction: %v", err, commits)
- } else {
- c := exec.Command("git", "update-server-info")
- c.Dir = repoPath
- err := c.Run()
- if err != nil {
- log.Error("update-server-info: %v", err)
- }
- }
}