aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--models/repo.go32
-rw-r--r--routers/repo/single.go19
-rw-r--r--templates/repo/single.tmpl22
-rw-r--r--web.go58
4 files changed, 121 insertions, 10 deletions
diff --git a/models/repo.go b/models/repo.go
index b7b5ac42..c5fa899f 100644
--- a/models/repo.go
+++ b/models/repo.go
@@ -9,6 +9,7 @@ import (
"fmt"
"io/ioutil"
"os"
+ "path"
"path/filepath"
"strings"
"time"
@@ -267,8 +268,10 @@ const (
)
type RepoFile struct {
+ Id *git.Oid
Type int
Name string
+ Path string
Message string
Created time.Time
}
@@ -281,7 +284,7 @@ func (f *RepoFile) IsDir() bool {
return f.Type == git.FilemodeTree
}
-func GetReposFiles(userName, reposName, treeName, rpath string) ([]*RepoFile, error) {
+func GetReposFiles(userName, reposName, branchName, rpath string) ([]*RepoFile, error) {
f := RepoPath(userName, reposName)
repo, err := git.OpenRepository(f)
if err != nil {
@@ -298,17 +301,38 @@ func GetReposFiles(userName, reposName, treeName, rpath string) ([]*RepoFile, er
if err != nil {
return nil, err
}
- var i uint64 = 0
- for ; i < tree.EntryCount(); i++ {
+ //var i uint64 = 0
+ if rpath != "" {
+ rpath = rpath + "/"
+ }
+ fmt.Println("...", rpath, "...")
+
+ tree.Walk(func(dirname string, entry *git.TreeEntry) int {
+ if dirname == rpath {
+ fmt.Println("====", dirname, "==", entry.Name)
+ repofiles = append(repofiles, &RepoFile{
+ entry.Id,
+ entry.Filemode,
+ entry.Name,
+ path.Join(dirname, entry.Name),
+ lastCommit.Message(),
+ lastCommit.Committer().When,
+ })
+ }
+ return 0
+ })
+
+ /*for ; i < tree.EntryCount(); i++ {
entry := tree.EntryByIndex(i)
repofiles = append(repofiles, &RepoFile{
+ entry.Id,
entry.Filemode,
entry.Name,
lastCommit.Message(),
lastCommit.Committer().When,
})
- }
+ }*/
return repofiles, nil
}
diff --git a/routers/repo/single.go b/routers/repo/single.go
index 489666f4..bc35b98e 100644
--- a/routers/repo/single.go
+++ b/routers/repo/single.go
@@ -1,6 +1,7 @@
package repo
import (
+ "strings"
"github.com/codegangsta/martini"
"github.com/martini-contrib/render"
@@ -13,13 +14,27 @@ func Single(params martini.Params, r render.Render, data base.TmplData) {
if !data["IsRepositoryValid"].(bool) {
return
}
-
- files, err := models.GetReposFiles(params["username"], params["reponame"], "HEAD", "/")
+ if params["branchname"] == "" {
+ params["branchname"] = "master"
+ }
+ treename := params["_1"]
+ files, err := models.GetReposFiles(params["username"], params["reponame"],
+ params["branchname"], treename)
if err != nil {
log.Handle(200, "repo.Single", data, r, err)
return
}
+ data["Username"] = params["username"]
+ data["Reponame"] = params["reponame"]
+ data["Branchname"] = params["branchname"]
+ treenames := strings.Split(treename, "/")
+ Paths := make([]string, 0)
+ for i, _ := range treenames {
+ Paths = append(Paths, strings.Join(treenames[0:i+1], "/"))
+ }
+ data["Paths"] = Paths
+ data["Treenames"] = treenames
data["IsRepoToolbarSource"] = true
data["Files"] = files
diff --git a/templates/repo/single.tmpl b/templates/repo/single.tmpl
index fbd05c4b..292f8cbd 100644
--- a/templates/repo/single.tmpl
+++ b/templates/repo/single.tmpl
@@ -16,7 +16,20 @@
</div>
<ol class="breadcrumb">
<li class="root dir">{{.Repository.Name}}</li>
- <li class="dir">Dir</li>
+ {{$paths := .Paths}}
+ {{ $username := .Username}}
+ {{ $reponame := .Reponame}}
+ {{ $branchname := .Branchname}}
+ {{ $treenames := .Treenames}}
+ {{ $n := len $treenames}}
+ {{ $l := Subtract $n 1}}
+ {{range $i, $v := $treenames}}
+ <li class="dir">
+ {{if eq $i $l}}{{$v}}
+ {{else}}
+ <a href="/{{$username}}/{{$reponame}}/tree/{{$branchname}}/{{index $paths $i}}">{{$v}}</a>&nbsp;
+ {{end}}</li>
+ {{end}}
</ol>
</div>
<table id="gogs-source-table" class="table table-hover">
@@ -30,7 +43,12 @@
<tbody>
{{range .Files}}
<tr {{if .IsDir}}class="is-dir"{{end}}>
- <td class="name"><i class="fa {{if .IsDir}}fa-folder{{else}}fa-file{{end}}"></i><a href="#">{{.Name}}</a></td>
+ <td class="name"><i class="fa {{if .IsDir}}fa-folder{{else}}fa-file{{end}}"></i>
+ {{if .IsDir}}
+ <a href="/{{$username}}/{{$reponame}}/tree/{{$branchname}}/{{.Path}}">{{.Name}}</a>
+ {{else}}
+ <a href="#">{{.Name}}</a>
+ {{end}}</td>
<td class="date"><time datetime="{{.Created}}" data-title="true" title="{{.Created}}">{{TimeSince .Created}}</time></td>
<td class="text">{{.Message}}</td>
</tr>
diff --git a/web.go b/web.go
index 8f698e39..c60a262b 100644
--- a/web.go
+++ b/web.go
@@ -33,6 +33,55 @@ gogs web`,
Flags: []cli.Flag{},
}
+func Subtract(left interface{}, right interface{}) interface{} {
+ var rleft, rright int64
+ var fleft, fright float64
+ var isInt bool = true
+ switch left.(type) {
+ case int:
+ rleft = int64(left.(int))
+ case int8:
+ rleft = int64(left.(int8))
+ case int16:
+ rleft = int64(left.(int16))
+ case int32:
+ rleft = int64(left.(int32))
+ case int64:
+ rleft = left.(int64)
+ case float32:
+ fleft = float64(left.(float32))
+ isInt = false
+ case float64:
+ fleft = left.(float64)
+ isInt = false
+ }
+
+ switch right.(type) {
+ case int:
+ rright = int64(right.(int))
+ case int8:
+ rright = int64(right.(int8))
+ case int16:
+ rright = int64(right.(int16))
+ case int32:
+ rright = int64(right.(int32))
+ case int64:
+ rright = right.(int64)
+ case float32:
+ fright = float64(left.(float32))
+ isInt = false
+ case float64:
+ fleft = left.(float64)
+ isInt = false
+ }
+
+ if isInt {
+ return rleft - rright
+ } else {
+ return fleft + float64(rleft) - (fright + float64(rright))
+ }
+}
+
var AppHelpers template.FuncMap = map[string]interface{}{
"AppName": func() string {
return base.Cfg.MustValue("", "APP_NAME")
@@ -41,6 +90,7 @@ var AppHelpers template.FuncMap = map[string]interface{}{
return APP_VER
},
"TimeSince": base.TimeSince,
+ "Subtract": Subtract,
}
func runWeb(*cli.Context) {
@@ -67,8 +117,8 @@ func runWeb(*cli.Context) {
m.Any("/user/setting", auth.SignInRequire(true), binding.BindIgnErr(auth.UpdateProfileForm{}), user.Setting)
m.Any("/user/setting/password", auth.SignInRequire(true), binding.BindIgnErr(auth.UpdatePasswdForm{}), user.SettingPassword)
m.Any("/user/setting/ssh", auth.SignInRequire(true), binding.BindIgnErr(auth.AddSSHKeyForm{}), user.SettingSSHKeys)
- m.Any("/user/setting/notification",auth.SignInRequire(true),user.SettingNotification)
- m.Any("/user/setting/security",auth.SignInRequire(true),user.SettingSecurity)
+ m.Any("/user/setting/notification", auth.SignInRequire(true), user.SettingNotification)
+ m.Any("/user/setting/security", auth.SignInRequire(true), user.SettingSecurity)
m.Get("/user/:username", auth.SignInRequire(false), user.Profile)
@@ -77,6 +127,10 @@ func runWeb(*cli.Context) {
m.Any("/repo/list", auth.SignInRequire(false), repo.List)
m.Get("/:username/:reponame/settings", auth.SignInRequire(false), auth.RepoAssignment(true), repo.Setting)
+ m.Get("/:username/:reponame/tree/:branchname/**",
+ auth.SignInRequire(false), auth.RepoAssignment(true), repo.Single)
+ m.Get("/:username/:reponame/tree/:branchname",
+ auth.SignInRequire(false), auth.RepoAssignment(true), repo.Single)
m.Get("/:username/:reponame", auth.SignInRequire(false), auth.RepoAssignment(true), repo.Single)
//m.Get("/:username/:reponame", repo.Repo)