From: Lunny Xiao Date: Wed, 26 Mar 2014 06:38:14 +0000 (+0800) Subject: Merge branch 'master' of github.com:gogits/gogs X-Git-Tag: v0.9.99~2320 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=9dbc808c7b71fc97015346704bb3d3db4918aba0;p=gitea.git Merge branch 'master' of github.com:gogits/gogs Conflicts: models/repo.go modules/base/tool.go serve.go --- 9dbc808c7b71fc97015346704bb3d3db4918aba0 diff --cc models/repo.go index 84c3283884,868a5dc2be..477f9472b4 --- a/models/repo.go +++ b/models/repo.go @@@ -261,29 -244,30 +244,17 @@@ func initRepository(f string, user *Use 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 { @@@ -505,239 -489,59 +476,43 @@@ func GetWatches(repoId int64) ([]Watch 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() } diff --cc serve.go index 4af54acc0b,25a34efbaf..96f03e724c --- a/serve.go +++ b/serve.go @@@ -5,12 -5,16 +5,13 @@@ 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" @@@ -112,21 -125,22 +122,22 @@@ func runServ(k *cli.Context) 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 { @@@ -178,7 -222,108 +192,7 @@@ 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) - } - } }