]> source.dussan.org Git - gitea.git/commitdiff
Merge branch 'master' of github.com:gogits/gogs
authorLunny Xiao <xiaolunwen@gmail.com>
Wed, 26 Mar 2014 06:38:14 +0000 (14:38 +0800)
committerLunny Xiao <xiaolunwen@gmail.com>
Wed, 26 Mar 2014 06:38:14 +0000 (14:38 +0800)
Conflicts:
models/repo.go
modules/base/tool.go
serve.go

1  2 
README.md
models/repo.go
serve.go

diff --cc README.md
Simple merge
diff --cc models/repo.go
index 84c32838842c86c60d40c4801c8cb0ebdce3852d,868a5dc2be24315cdb6a006c80ed32dffdde0ede..477f9472b4ef40e3b0a9b616d7e05d4036723748
@@@ -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 4af54acc0ba2b63e4cc87f243d5535c30258ad6a,25a34efbaff8b7463a583b0abd9cb94478221012..96f03e724c84d919afe9dd8069c0db6b0c52fdf6
+++ 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 {
  
        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)
 -              }
 -      }
  }