add commit view

This commit is contained in:
Lunny Xiao 2014-03-18 11:22:19 +08:00
parent e656609b0d
commit 3ceb008e1f
4 changed files with 48 additions and 26 deletions

View file

@ -416,12 +416,10 @@ var (
// RepoFile represents a file object in git repository. // RepoFile represents a file object in git repository.
type RepoFile struct { type RepoFile struct {
*git.TreeEntry *git.TreeEntry
Path string Path string
Message string Size int64
Created time.Time Repo *git.Repository
Size int64 Commit *git.Commit
Repo *git.Repository
LastCommit string
} }
// LookupBlob returns the content of an object. // 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. // 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)) repo, err := git.OpenRepository(RepoPath(userName, reposName))
if err != nil { if err != nil {
return nil, err return nil, err
} }
ref, err := repo.LookupReference("refs/heads/" + branchName) commit, err := GetCommit(userName, reposName, branchName, commitId)
if err != nil {
return nil, err
}
lastCommit, err := repo.LookupCommit(ref.Oid)
if err != nil { if err != nil {
return nil, err return nil, err
} }
var repodirs []*RepoFile var repodirs []*RepoFile
var repofiles []*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 { if dirname == rpath {
// TODO: size get method shoule be improved
size, err := repo.ObjectSize(entry.Id) size, err := repo.ObjectSize(entry.Id)
if err != nil { if err != nil {
return 0 return 0
} }
var cm = lastCommit var cm = commit
for { for {
if cm.ParentCount() == 0 { if cm.ParentCount() == 0 {
@ -533,11 +527,9 @@ func GetReposFiles(userName, reposName, branchName, rpath string) ([]*RepoFile,
rp := &RepoFile{ rp := &RepoFile{
entry, entry,
path.Join(dirname, entry.Name), path.Join(dirname, entry.Name),
cm.Message(),
cm.Committer.When,
size, size,
repo, repo,
cm.Id().String(), cm,
} }
if entry.IsFile() { if entry.IsFile() {
@ -552,6 +544,31 @@ func GetReposFiles(userName, reposName, branchName, rpath string) ([]*RepoFile,
return append(repodirs, repofiles...), nil 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. // GetLastestCommit returns the latest commit of given repository.
func GetLastestCommit(userName, repoName string) (*Commit, error) { func GetLastestCommit(userName, repoName string) (*Commit, error) {
stdout, _, err := com.ExecCmd("git", "--git-dir="+RepoPath(userName, repoName), "log", "-1") 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 return commit, nil
} }*/
// GetCommits returns all commits of given branch of repository. // GetCommits returns all commits of given branch of repository.
func GetCommits(userName, reposName, branchname string) ([]*git.Commit, error) { func GetCommits(userName, reposName, branchname string) ([]*git.Commit, error) {

View file

@ -69,7 +69,7 @@ func Single(ctx *middleware.Context, params martini.Params) {
// Directory and file list. // Directory and file list.
files, err := models.GetReposFiles(params["username"], params["reponame"], files, err := models.GetReposFiles(params["username"], params["reponame"],
params["branchname"], treename) params["branchname"], params["commitid"], treename)
if err != nil { if err != nil {
log.Error("repo.Single(GetReposFiles): %v", err) log.Error("repo.Single(GetReposFiles): %v", err)
ctx.Render.Error(404) ctx.Render.Error(404)
@ -90,13 +90,14 @@ func Single(ctx *middleware.Context, params martini.Params) {
} }
// Get latest commit according username and repo name // 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 { if err != nil {
log.Error("repo.Single(GetLastestCommit): %v", err) log.Error("repo.Single(GetCommit): %v", err)
ctx.Render.Error(404) ctx.Render.Error(404)
return return
} }
ctx.Data["LatestCommit"] = commit ctx.Data["CurrentCommit"] = commit
var readmeFile *models.RepoFile var readmeFile *models.RepoFile

View file

@ -45,7 +45,7 @@
<a href="/{{$username}}/{{$reponame}}/commit/{{.LatestCommit.SHA}}">{{.LatestCommit.Message}}</a> <a href="/{{$username}}/{{$reponame}}/commit/{{.LatestCommit.SHA}}">{{.LatestCommit.Message}}</a>
</div> </div>
<div class="panel-body info-content"> <div class="panel-body info-content">
<a href="/user/{{.LatestCommit.Author}}">{{.LatestCommit.Author}}</a> <span class="text-muted">{{TimeSince .LatestCommit.Date}}</span> <a href="/user/{{.LatestCommit.Author}}">{{.LatestCommit.Author}}</a> <span class="text-muted">{{TimeSince .CurrentCommit.Committer.When}}</span>
</div> </div>
<table class="panel-footer table file-list"> <table class="panel-footer table file-list">
<thead class="hidden"> <thead class="hidden">
@ -57,6 +57,7 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{{$currentCommit := .CurrentCommit}}
{{range .Files}} {{range .Files}}
<tr <tr
{{if .IsDir}}class="is-dir"{{end}}> {{if .IsDir}}class="is-dir"{{end}}>
@ -73,10 +74,10 @@
</span> </span>
</td> </td>
<td class="text"> <td class="text">
<span class="wrap"><a href="/{{$username}}/{{$reponame}}/commit/{{.LastCommit}}">{{.Message}}</a></span> <span class="wrap"><a href="/{{$username}}/{{$reponame}}/commit/{{.Commit.Oid}}">{{.Commit.Message}}</a></span>
</td> </td>
<td class="date"> <td class="date">
<span class="wrap">{{TimeSince .Created}}</span> <span class="wrap">{{TimeSince .Commit.Committer.When}}</span>
</td> </td>
</tr> </tr>
{{end}} {{end}}

3
web.go
View file

@ -82,6 +82,9 @@ func runWeb(*cli.Context) {
middleware.SignInRequire(false), middleware.RepoAssignment(true), repo.Single) middleware.SignInRequire(false), middleware.RepoAssignment(true), repo.Single)
m.Get("/:username/:reponame/tree/:branchname", m.Get("/:username/:reponame/tree/:branchname",
middleware.SignInRequire(false), middleware.RepoAssignment(true), repo.Single) 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) m.Get("/:username/:reponame", middleware.SignInRequire(false), middleware.RepoAssignment(true), repo.Single)
listenAddr := fmt.Sprintf("%s:%s", listenAddr := fmt.Sprintf("%s:%s",