diff options
Diffstat (limited to 'models')
-rw-r--r-- | models/git.go | 8 | ||||
-rw-r--r-- | models/repo.go | 1 | ||||
-rw-r--r-- | models/update.go | 93 |
3 files changed, 98 insertions, 4 deletions
diff --git a/models/git.go b/models/git.go index 77b7ef2d..68e13905 100644 --- a/models/git.go +++ b/models/git.go @@ -14,6 +14,8 @@ import ( "path" "strings" + "github.com/Unknwon/com" + "github.com/gogits/git" "github.com/gogits/gogs/modules/base" @@ -163,13 +165,11 @@ func getReposFiles(userName, repoName, commitId string, rpath string) ([]*RepoFi return 0 } - cmd := exec.Command("git", "log", "-1", "--pretty=format:%H", commitId, "--", path.Join(dirname, entry.Name)) - cmd.Dir = repopath - out, err := cmd.Output() + stdout, _, err := com.ExecCmdDir(repopath, "git", "log", "-1", "--pretty=format:%H", commitId, "--", path.Join(dirname, entry.Name)) if err != nil { return 0 } - filecm, err := repo.GetCommit(string(out)) + filecm, err := repo.GetCommit(string(stdout)) if err != nil { return 0 } diff --git a/models/repo.go b/models/repo.go index 573e0f4e..91dc7102 100644 --- a/models/repo.go +++ b/models/repo.go @@ -80,6 +80,7 @@ type Repository struct { IsPrivate bool IsBare bool IsGoget bool + DefaultBranch string Created time.Time `xorm:"created"` Updated time.Time `xorm:"updated"` } diff --git a/models/update.go b/models/update.go new file mode 100644 index 00000000..2ceac271 --- /dev/null +++ b/models/update.go @@ -0,0 +1,93 @@ +package models + +import ( + "container/list" + "os/exec" + "strings" + + "github.com/gogits/git" + "github.com/gogits/gogs/modules/base" + qlog "github.com/qiniu/log" +) + +func Update(refName, oldCommitId, newCommitId, userName, repoName string, userId int64) { + isNew := strings.HasPrefix(oldCommitId, "0000000") + if isNew && + strings.HasPrefix(newCommitId, "0000000") { + qlog.Fatal("old rev and new rev both 000000") + } + + f := RepoPath(userName, repoName) + + gitUpdate := exec.Command("git", "update-server-info") + gitUpdate.Dir = f + gitUpdate.Run() + + repo, err := git.OpenRepository(f) + if err != nil { + qlog.Fatalf("runUpdate.Open repoId: %v", err) + } + + newOid, err := git.NewOidFromString(newCommitId) + if err != nil { + qlog.Fatalf("runUpdate.Ref repoId:%v err: %v", newCommitId, err) + } + + newCommit, err := repo.LookupCommit(newOid) + if err != nil { + qlog.Fatalf("runUpdate.Ref repoId: %v", err) + } + + var l *list.List + // if a new branch + if isNew { + l, err = repo.CommitsBefore(newCommit.Id()) + if err != nil { + qlog.Fatalf("Find CommitsBefore erro:", err) + } + } else { + oldOid, err := git.NewOidFromString(oldCommitId) + if err != nil { + qlog.Fatalf("runUpdate.Ref repoId: %v", err) + } + + oldCommit, err := repo.LookupCommit(oldOid) + if err != nil { + qlog.Fatalf("runUpdate.Ref repoId: %v", err) + } + l = repo.CommitsBetween(newCommit, oldCommit) + } + + if err != nil { + qlog.Fatalf("runUpdate.Commit repoId: %v", err) + } + + repos, err := GetRepositoryByName(userId, repoName) + if err != nil { + qlog.Fatalf("runUpdate.GetRepositoryByName userId: %v", err) + } + + commits := make([]*base.PushCommit, 0) + var maxCommits = 3 + var actEmail string + for e := l.Front(); e != nil; e = e.Next() { + commit := e.Value.(*git.Commit) + if actEmail == "" { + actEmail = commit.Committer.Email + } + commits = append(commits, + &base.PushCommit{commit.Id().String(), + commit.Message(), + commit.Author.Email, + commit.Author.Name}) + if len(commits) >= maxCommits { + break + } + } + + //commits = append(commits, []string{lastCommit.Id().String(), lastCommit.Message()}) + if err = CommitRepoAction(userId, userName, actEmail, + repos.Id, repoName, git.BranchName(refName), &base.PushCommits{l.Len(), commits}); err != nil { + qlog.Fatalf("runUpdate.models.CommitRepoAction: %v", err) + } +} |