From 3ceb008e1f50b89a2e0fda8fac939df92642219c Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 18 Mar 2014 11:22:19 +0800 Subject: [PATCH] add commit view --- models/repo.go | 55 +++++++++++++++++++++++++------------- routers/repo/single.go | 9 ++++--- templates/repo/single.tmpl | 7 ++--- web.go | 3 +++ 4 files changed, 48 insertions(+), 26 deletions(-) diff --git a/models/repo.go b/models/repo.go index 6e3754acf..c37fb4de2 100644 --- a/models/repo.go +++ b/models/repo.go @@ -416,12 +416,10 @@ var ( // RepoFile represents a file object in git repository. type RepoFile struct { *git.TreeEntry - Path string - Message string - Created time.Time - Size int64 - Repo *git.Repository - LastCommit string + Path string + Size int64 + Repo *git.Repository + Commit *git.Commit } // LookupBlob returns the content of an object. @@ -453,32 +451,28 @@ func GetBranches(userName, reposName string) ([]string, error) { } // GetReposFiles returns a list of file object in given directory of repository. -func GetReposFiles(userName, reposName, branchName, rpath string) ([]*RepoFile, error) { +func GetReposFiles(userName, reposName, branchName, commitId, rpath string) ([]*RepoFile, error) { repo, err := git.OpenRepository(RepoPath(userName, reposName)) if err != nil { return nil, err } - ref, err := repo.LookupReference("refs/heads/" + branchName) - if err != nil { - return nil, err - } - - lastCommit, err := repo.LookupCommit(ref.Oid) + commit, err := GetCommit(userName, reposName, branchName, commitId) if err != nil { return nil, err } var repodirs []*RepoFile var repofiles []*RepoFile - lastCommit.Tree.Walk(func(dirname string, entry *git.TreeEntry) int { + 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 = lastCommit + var cm = commit for { if cm.ParentCount() == 0 { @@ -533,11 +527,9 @@ func GetReposFiles(userName, reposName, branchName, rpath string) ([]*RepoFile, rp := &RepoFile{ entry, path.Join(dirname, entry.Name), - cm.Message(), - cm.Committer.When, size, repo, - cm.Id().String(), + cm, } if entry.IsFile() { @@ -552,6 +544,31 @@ func GetReposFiles(userName, reposName, branchName, rpath string) ([]*RepoFile, return append(repodirs, repofiles...), nil } +func GetCommit(userName, repoName, branchname, commitid string) (*git.Commit, error) { + repo, err := git.OpenRepository(RepoPath(userName, repoName)) + if err != nil { + return nil, err + } + + if commitid != "" { + oid, err := git.NewOidFromString(commitid) + if err != nil { + return nil, err + } + return repo.LookupCommit(oid) + } + if branchname == "" { + return nil, errors.New("no branch name and no commit id") + } + + r, err := repo.LookupReference(fmt.Sprintf("refs/heads/%s", branchname)) + if err != nil { + return nil, err + } + return r.LastCommit() +} + +/* // GetLastestCommit returns the latest commit of given repository. func GetLastestCommit(userName, repoName string) (*Commit, error) { stdout, _, err := com.ExecCmd("git", "--git-dir="+RepoPath(userName, repoName), "log", "-1") @@ -581,7 +598,7 @@ func GetLastestCommit(userName, repoName string) (*Commit, error) { } } return commit, nil -} +}*/ // GetCommits returns all commits of given branch of repository. func GetCommits(userName, reposName, branchname string) ([]*git.Commit, error) { diff --git a/routers/repo/single.go b/routers/repo/single.go index 1b5da9d30..2ed5cfed2 100644 --- a/routers/repo/single.go +++ b/routers/repo/single.go @@ -69,7 +69,7 @@ func Single(ctx *middleware.Context, params martini.Params) { // Directory and file list. files, err := models.GetReposFiles(params["username"], params["reponame"], - params["branchname"], treename) + params["branchname"], params["commitid"], treename) if err != nil { log.Error("repo.Single(GetReposFiles): %v", err) ctx.Render.Error(404) @@ -90,13 +90,14 @@ func Single(ctx *middleware.Context, params martini.Params) { } // Get latest commit according username and repo name - commit, err := models.GetLastestCommit(params["username"], params["reponame"]) + commit, err := models.GetCommit(params["username"], params["reponame"], + params["branchname"], params["commitid"]) if err != nil { - log.Error("repo.Single(GetLastestCommit): %v", err) + log.Error("repo.Single(GetCommit): %v", err) ctx.Render.Error(404) return } - ctx.Data["LatestCommit"] = commit + ctx.Data["CurrentCommit"] = commit var readmeFile *models.RepoFile diff --git a/templates/repo/single.tmpl b/templates/repo/single.tmpl index 019ec8eaa..c19ade778 100644 --- a/templates/repo/single.tmpl +++ b/templates/repo/single.tmpl @@ -45,7 +45,7 @@ {{.LatestCommit.Message}}
- {{.LatestCommit.Author}} {{TimeSince .LatestCommit.Date}} + {{.LatestCommit.Author}} {{TimeSince .CurrentCommit.Committer.When}}
@@ -57,6 +57,7 @@ + {{$currentCommit := .CurrentCommit}} {{range .Files}} @@ -73,10 +74,10 @@ {{end}} diff --git a/web.go b/web.go index 2177d5662..ca504ea56 100644 --- a/web.go +++ b/web.go @@ -82,6 +82,9 @@ func runWeb(*cli.Context) { middleware.SignInRequire(false), middleware.RepoAssignment(true), repo.Single) m.Get("/:username/:reponame/tree/:branchname", middleware.SignInRequire(false), middleware.RepoAssignment(true), repo.Single) + m.Get("/:username/:reponame/commit/:commitid/**", middleware.SignInRequire(false), middleware.RepoAssignment(true), repo.Single) + m.Get("/:username/:reponame/commit/:commitid", middleware.SignInRequire(false), middleware.RepoAssignment(true), repo.Single) + m.Get("/:username/:reponame", middleware.SignInRequire(false), middleware.RepoAssignment(true), repo.Single) listenAddr := fmt.Sprintf("%s:%s",