cerrado @ 1b1460c8d4fa358433c51fd5293fd1c79f32aeff

feat: Add pathing to the tree tab
diff --git a/pkg/handler/git/handler.go b/pkg/handler/git/handler.go
index fd62e44b540b98d3f9dc04ab4d463215200deafa..5e5012263de12db42cb7457a21a2fad99ee50b89 100644
--- a/pkg/handler/git/handler.go
+++ b/pkg/handler/git/handler.go
@@ -233,6 +233,12 @@ 	ext.SetHTML(w)
 	name := r.PathValue("name")
 	ref := r.PathValue("ref")
 	rest := r.PathValue("rest")
+	paths := []string{}
+
+	// this is avoid Split from generating a len 1 array with empty string
+	if rest != "" {
+		paths = strings.Split(rest, "/")
+	}
 
 	tree, err := g.gitService.GetTree(name, ref, rest)
 	if err != nil {
@@ -243,8 +249,8 @@ 	gitList := &templates.GitItemPage{
 		Name: name,
 		Ref:  ref,
 		GitItemBase: &templates.GitItemTreePage{
-			CurrentPath: rest,
-			Tree:        tree,
+			Path: paths,
+			Tree: tree,
 		},
 	}
 	templates.WritePageTemplate(w, gitList)
@@ -256,6 +262,12 @@ 	ext.SetHTML(w)
 	name := r.PathValue("name")
 	ref := r.PathValue("ref")
 	rest := r.PathValue("rest")
+	paths := []string{}
+
+	// this is avoid Split from generating a len 1 array with empty string
+	if rest != "" {
+		paths = strings.Split(rest, "/")
+	}
 
 	isBin, err := g.gitService.IsBinary(name, ref, rest)
 	if err != nil {
@@ -268,7 +280,7 @@ 		gitList := &templates.GitItemPage{
 			Name: name,
 			Ref:  ref,
 			GitItemBase: &templates.GitItemBlobPage{
-				File:    rest,
+				Path:    paths,
 				Content: []byte("Binary file"),
 			},
 		}
@@ -303,7 +315,7 @@ 	gitList := &templates.GitItemPage{
 		Name: name,
 		Ref:  ref,
 		GitItemBase: &templates.GitItemBlobPage{
-			File:    rest,
+			Path:    paths,
 			Content: code.Bytes(),
 		},
 	}
diff --git a/pkg/u/file.go b/pkg/u/file.go
index cf86c7513b5e1d802fb9a7f0afc6d4442bae3ba4..fafe0fb00f4b30262594af5ab6b32873515301bb 100644
--- a/pkg/u/file.go
+++ b/pkg/u/file.go
@@ -4,6 +4,7 @@ import (
 	"errors"
 	"log/slog"
 	"os"
+	"path/filepath"
 )
 
 func FileExist(filename string) bool {
@@ -19,3 +20,23 @@ 		// report the file doest not exist
 		return false
 	}
 }
+
+// This is just a slin wraper to make easier to compose path in the template
+type Pathing string
+
+func Root() Pathing {
+	return "/"
+}
+
+func (s Pathing) AddPath(p string) Pathing {
+	return Pathing(filepath.Join(string(s), p))
+}
+
+func (s Pathing) AddPaths(p []string) Pathing {
+	f := filepath.Join(p...)
+	return Pathing(filepath.Join(string(s), f))
+}
+
+func (s Pathing) Done() string {
+	return string(s)
+}
diff --git a/pkg/u/list.go b/pkg/u/list.go
index 7271ef3783e892aad55ea49786515f491af30735..39d7b117fa7b9a509be2fa3f7946dc11945ce812 100644
--- a/pkg/u/list.go
+++ b/pkg/u/list.go
@@ -16,12 +16,12 @@ 	}
 	return v[0]
 }
 
-func Map[T any, V any](ts []T, fun func(T) V) []V {
-	rs := make([]V, len(ts))
-	for i := range ts {
-		rs[i] = fun(ts[i])
+func LastOrZero[T any](v []T) T {
+	if len(v) == 0 {
+		var zero T
+		return zero
 	}
-	return rs
+	return v[len(v)-1]
 }
 
 func ChunkBy[T any](items []T, chunkSize int) [][]T {
diff --git a/pkg/u/list_test.go b/pkg/u/list_test.go
index 3a856b961818256ffdd0842824879169af645f7b..805a2091b59ce4c644f748b4b6c49a28aec50cdb 100644
--- a/pkg/u/list_test.go
+++ b/pkg/u/list_test.go
@@ -3,7 +3,6 @@
 package u
 
 import (
-	"strconv"
 	"testing"
 
 	"github.com/google/go-cmp/cmp"
@@ -130,32 +129,3 @@
 		})
 	}
 }
-
-func TestMap(t *testing.T) {
-	testCases := []struct {
-		name string
-		in   []int
-		out  []string
-	}{
-		{
-			name: "empty",
-			in:   []int{},
-			out:  []string{},
-		},
-		{
-			name: "not empty",
-			in:   []int{1, 2, 3},
-			out:  []string{"1", "2", "3"},
-		},
-	}
-
-	for _, tc := range testCases {
-		t.Run(tc.name, func(t *testing.T) {
-			out := Map(tc.in, func(v int) string { return strconv.Itoa(v) })
-
-			if diff := cmp.Diff(tc.out, out); diff != "" {
-				t.Errorf("Map error:\n%s", diff)
-			}
-		})
-	}
-}
diff --git a/scss/main.scss b/scss/main.scss
index 893e66c6a16cf2ed3b6b5f1ebcb2e3674efcc001..4a09925a0811d8a409385fa748543b9dc8ef199f 100644
--- a/scss/main.scss
+++ b/scss/main.scss
@@ -122,6 +122,11 @@     display: grid;
     overflow-x: auto;
 }
 
+.pathing{
+  margin-left: $spacer;
+  display: inline-block
+}
+
 pre {
     display: grid;
     overflow-x: auto;
diff --git a/templates/gititemblob.qtpl b/templates/gititemblob.qtpl
index f9bab3d53aa36fdc211bab7c9feea16b179b333f..ca3a1faaf12d3dc0cf337b42cecfa209ba6a1938 100644
--- a/templates/gititemblob.qtpl
+++ b/templates/gititemblob.qtpl
@@ -1,6 +1,8 @@
+{% import "git.gabrielgio.me/cerrado/pkg/u" %}
+
 {% code
 type GitItemBlobPage struct {
-    File string
+    Path []string
     Content []byte
 }
 %}
@@ -8,6 +10,19 @@
 {% func (g *GitItemBlobPage) Nav(name, ref string) %}{%= GitItemNav(name, ref, Tree) %}{% endfunc %}
 
 {% func (g *GitItemBlobPage) GitContent(name, ref string) %}
+<div class="pathing">
+    {% stripspace %}
+    {% if len(g.Path) != 0 %}
+    <a href="{%s url(name, Folder, ref, Root, []string{}) %}">root/</a>
+    {% for i, e := range g.Path[:len(g.Path)-1] %}
+    <a href="{%s url(name, Folder, ref, Root, g.Path[:1+i]) %}">{%s e %}/</a>
+    {% endfor %}
+    <a>{%s u.LastOrZero(g.Path) %}</a>
+    {% else %}
+    <a>root/</a>
+    {% endif %}
+    {% endstripspace %}
+</div>
 <div class="code-view">
 {%z= g.Content %}
 </div>
diff --git a/templates/gititemblob.qtpl.go b/templates/gititemblob.qtpl.go
index 05e0667c856d5ff46a2222d8a4979da2de1ea4ef..5d986b4928df2b4ee4fcb489179821ff7759fd90 100644
--- a/templates/gititemblob.qtpl.go
+++ b/templates/gititemblob.qtpl.go
@@ -5,94 +5,136 @@ //line gititemblob.qtpl:1
 package templates
 
 //line gititemblob.qtpl:1
+import "git.gabrielgio.me/cerrado/pkg/u"
+
+//line gititemblob.qtpl:3
 import (
 	qtio422016 "io"
 
 	qt422016 "github.com/valyala/quicktemplate"
 )
 
-//line gititemblob.qtpl:1
+//line gititemblob.qtpl:3
 var (
 	_ = qtio422016.Copy
 	_ = qt422016.AcquireByteBuffer
 )
 
-//line gititemblob.qtpl:2
+//line gititemblob.qtpl:4
 type GitItemBlobPage struct {
-	File    string
+	Path    []string
 	Content []byte
 }
 
-//line gititemblob.qtpl:8
+//line gititemblob.qtpl:10
 func (g *GitItemBlobPage) StreamNav(qw422016 *qt422016.Writer, name, ref string) {
-//line gititemblob.qtpl:8
+//line gititemblob.qtpl:10
 	StreamGitItemNav(qw422016, name, ref, Tree)
-//line gititemblob.qtpl:8
+//line gititemblob.qtpl:10
 }
 
-//line gititemblob.qtpl:8
+//line gititemblob.qtpl:10
 func (g *GitItemBlobPage) WriteNav(qq422016 qtio422016.Writer, name, ref string) {
-//line gititemblob.qtpl:8
+//line gititemblob.qtpl:10
 	qw422016 := qt422016.AcquireWriter(qq422016)
-//line gititemblob.qtpl:8
+//line gititemblob.qtpl:10
 	g.StreamNav(qw422016, name, ref)
-//line gititemblob.qtpl:8
+//line gititemblob.qtpl:10
 	qt422016.ReleaseWriter(qw422016)
-//line gititemblob.qtpl:8
+//line gititemblob.qtpl:10
 }
 
-//line gititemblob.qtpl:8
+//line gititemblob.qtpl:10
 func (g *GitItemBlobPage) Nav(name, ref string) string {
-//line gititemblob.qtpl:8
+//line gititemblob.qtpl:10
 	qb422016 := qt422016.AcquireByteBuffer()
-//line gititemblob.qtpl:8
+//line gititemblob.qtpl:10
 	g.WriteNav(qb422016, name, ref)
-//line gititemblob.qtpl:8
+//line gititemblob.qtpl:10
 	qs422016 := string(qb422016.B)
-//line gititemblob.qtpl:8
+//line gititemblob.qtpl:10
 	qt422016.ReleaseByteBuffer(qb422016)
-//line gititemblob.qtpl:8
+//line gititemblob.qtpl:10
 	return qs422016
-//line gititemblob.qtpl:8
+//line gititemblob.qtpl:10
 }
 
-//line gititemblob.qtpl:10
+//line gititemblob.qtpl:12
 func (g *GitItemBlobPage) StreamGitContent(qw422016 *qt422016.Writer, name, ref string) {
-//line gititemblob.qtpl:10
+//line gititemblob.qtpl:12
 	qw422016.N().S(`
+<div class="pathing">
+    `)
+//line gititemblob.qtpl:15
+	if len(g.Path) != 0 {
+//line gititemblob.qtpl:15
+		qw422016.N().S(`<a href="`)
+//line gititemblob.qtpl:16
+		qw422016.E().S(url(name, Folder, ref, Root, []string{}))
+//line gititemblob.qtpl:16
+		qw422016.N().S(`">root/</a>`)
+//line gititemblob.qtpl:17
+		for i, e := range g.Path[:len(g.Path)-1] {
+//line gititemblob.qtpl:17
+			qw422016.N().S(`<a href="`)
+//line gititemblob.qtpl:18
+			qw422016.E().S(url(name, Folder, ref, Root, g.Path[:1+i]))
+//line gititemblob.qtpl:18
+			qw422016.N().S(`">`)
+//line gititemblob.qtpl:18
+			qw422016.E().S(e)
+//line gititemblob.qtpl:18
+			qw422016.N().S(`/</a>`)
+//line gititemblob.qtpl:19
+		}
+//line gititemblob.qtpl:19
+		qw422016.N().S(`<a>`)
+//line gititemblob.qtpl:20
+		qw422016.E().S(u.LastOrZero(g.Path))
+//line gititemblob.qtpl:20
+		qw422016.N().S(`</a>`)
+//line gititemblob.qtpl:21
+	} else {
+//line gititemblob.qtpl:21
+		qw422016.N().S(`<a>root/</a>`)
+//line gititemblob.qtpl:23
+	}
+//line gititemblob.qtpl:24
+	qw422016.N().S(`
+</div>
 <div class="code-view">
 `)
-//line gititemblob.qtpl:12
+//line gititemblob.qtpl:27
 	qw422016.N().Z(g.Content)
-//line gititemblob.qtpl:12
+//line gititemblob.qtpl:27
 	qw422016.N().S(`
 </div>
 `)
-//line gititemblob.qtpl:14
+//line gititemblob.qtpl:29
 }
 
-//line gititemblob.qtpl:14
+//line gititemblob.qtpl:29
 func (g *GitItemBlobPage) WriteGitContent(qq422016 qtio422016.Writer, name, ref string) {
-//line gititemblob.qtpl:14
+//line gititemblob.qtpl:29
 	qw422016 := qt422016.AcquireWriter(qq422016)
-//line gititemblob.qtpl:14
+//line gititemblob.qtpl:29
 	g.StreamGitContent(qw422016, name, ref)
-//line gititemblob.qtpl:14
+//line gititemblob.qtpl:29
 	qt422016.ReleaseWriter(qw422016)
-//line gititemblob.qtpl:14
+//line gititemblob.qtpl:29
 }
 
-//line gititemblob.qtpl:14
+//line gititemblob.qtpl:29
 func (g *GitItemBlobPage) GitContent(name, ref string) string {
-//line gititemblob.qtpl:14
+//line gititemblob.qtpl:29
 	qb422016 := qt422016.AcquireByteBuffer()
-//line gititemblob.qtpl:14
+//line gititemblob.qtpl:29
 	g.WriteGitContent(qb422016, name, ref)
-//line gititemblob.qtpl:14
+//line gititemblob.qtpl:29
 	qs422016 := string(qb422016.B)
-//line gititemblob.qtpl:14
+//line gititemblob.qtpl:29
 	qt422016.ReleaseByteBuffer(qb422016)
-//line gititemblob.qtpl:14
+//line gititemblob.qtpl:29
 	return qs422016
-//line gititemblob.qtpl:14
+//line gititemblob.qtpl:29
 }
diff --git a/templates/gititemtree.qtpl b/templates/gititemtree.qtpl
index ffc063dff52d97495cdc7df57c686fa2e67b1e6a..86fb29cbac5c8aa52d98b729ca13e839ca839db8 100644
--- a/templates/gititemtree.qtpl
+++ b/templates/gititemtree.qtpl
@@ -1,24 +1,62 @@
+{% import "git.gabrielgio.me/cerrado/pkg/u" %}
 {% import "github.com/go-git/go-git/v5/plumbing/object" %}
 
-{% code
-type GitItemTreePage struct {
-    CurrentPath string
+{% code type GitItemTreePage struct {
+    Path []string
     Tree *object.Tree
+}
+%}
+
+{% code const (
+    Folder = "tree"
+    Blob = "blob"
+    Root = ""
+)
+%}
+
+{% code func url(name, mode, ref, filename string, path []string) string {
+    return u.Root().
+        AddPath(name).
+        AddPath(mode).
+        AddPath(ref).
+        AddPaths(path).
+        AddPath(filename).
+        Done()
 }
 %}
 
 {% func (g *GitItemTreePage) Nav(name, ref string) %}{%= GitItemNav(name, ref, Tree) %}{% endfunc %}
 
 {% func (g *GitItemTreePage) GitContent(name, ref string) %}
+<div class="pathing">
+    {% stripspace %}
+    {% if len(g.Path) != 0 %}
+    <a href="{%s url(name, Folder, ref, Root, []string{}) %}">root/</a>
+    {% for i, e := range g.Path[:len(g.Path)-1] %}
+    <a href="{%s url(name, Folder, ref, Root, g.Path[:1+i]) %}">{%s e %}/</a>
+    {% endfor %}
+    <a>{%s u.LastOrZero(g.Path) %}</a>
+    {% else %}
+    <a>root/</a>
+    {% endif %}
+    {% endstripspace %}
+</div>
 <div class="row">
   <div class="col-md-12">
     <div class="tree-list">
+      {% if len(g.Path) != 0 %}
+          <div class="mode"><a href="{%s url(name, Folder, ref, g.Path[len(g.Path)-1], g.Path[:len(g.Path)-1]) %}">..</a></div>
+          <div class="name tree"></div>
+          <div class="commit"></div>
+          <div class="date"></div>
+          <div class="size"></div>
+      {% endif %}
       {% for _, e := range g.Tree.Entries %}
           <div class="mode">{%s Ignore(e.Mode.ToOSFileMode()).String() %}</div>
           {% if e.Mode.IsFile() %}
-          <div class="name blob"><a href="/{%s name %}/blob/{%s ref%}/{%s g.CurrentPath %}/{%s e.Name %}">{%s e.Name %}</a></div>
+          <div class="name blob"><a href="{%s url(name, Blob, ref, e.Name, g.Path) %}">{%s e.Name %}</a></div>
           {% else %}
-          <div class="name tree"><a href="./{%s g.CurrentPath %}/{%s e.Name %}">{%s e.Name %}</a></div>
+          <div class="name tree"><a href="{%s url(name, Folder, ref, e.Name, g.Path) %}">{%s e.Name %}</a></div>
           {% endif %}
           <div class="commit"></div>
           <div class="date"></div>
diff --git a/templates/gititemtree.qtpl.go b/templates/gititemtree.qtpl.go
index 0e9b09e05723a383d173474668cea00b3f680793..c0fc3a7787bc21e5a1755a73a878af40c1531c8c 100644
--- a/templates/gititemtree.qtpl.go
+++ b/templates/gititemtree.qtpl.go
@@ -5,16 +5,19 @@ //line gititemtree.qtpl:1
 package templates
 
 //line gititemtree.qtpl:1
+import "git.gabrielgio.me/cerrado/pkg/u"
+
+//line gititemtree.qtpl:2
 import "github.com/go-git/go-git/v5/plumbing/object"
 
-//line gititemtree.qtpl:3
+//line gititemtree.qtpl:4
 import (
 	qtio422016 "io"
 
 	qt422016 "github.com/valyala/quicktemplate"
 )
 
-//line gititemtree.qtpl:3
+//line gititemtree.qtpl:4
 var (
 	_ = qtio422016.Copy
 	_ = qt422016.AcquireByteBuffer
@@ -22,150 +25,210 @@ )
 
 //line gititemtree.qtpl:4
 type GitItemTreePage struct {
-	CurrentPath string
-	Tree        *object.Tree
+	Path []string
+	Tree *object.Tree
 }
 
 //line gititemtree.qtpl:10
+const (
+	Folder = "tree"
+	Blob   = "blob"
+	Root   = ""
+)
+
+//line gititemtree.qtpl:17
+func url(name, mode, ref, filename string, path []string) string {
+	return u.Root().
+		AddPath(name).
+		AddPath(mode).
+		AddPath(ref).
+		AddPaths(path).
+		AddPath(filename).
+		Done()
+}
+
+//line gititemtree.qtpl:28
 func (g *GitItemTreePage) StreamNav(qw422016 *qt422016.Writer, name, ref string) {
-//line gititemtree.qtpl:10
+//line gititemtree.qtpl:28
 	StreamGitItemNav(qw422016, name, ref, Tree)
-//line gititemtree.qtpl:10
+//line gititemtree.qtpl:28
 }
 
-//line gititemtree.qtpl:10
+//line gititemtree.qtpl:28
 func (g *GitItemTreePage) WriteNav(qq422016 qtio422016.Writer, name, ref string) {
-//line gititemtree.qtpl:10
+//line gititemtree.qtpl:28
 	qw422016 := qt422016.AcquireWriter(qq422016)
-//line gititemtree.qtpl:10
+//line gititemtree.qtpl:28
 	g.StreamNav(qw422016, name, ref)
-//line gititemtree.qtpl:10
+//line gititemtree.qtpl:28
 	qt422016.ReleaseWriter(qw422016)
-//line gititemtree.qtpl:10
+//line gititemtree.qtpl:28
 }
 
-//line gititemtree.qtpl:10
+//line gititemtree.qtpl:28
 func (g *GitItemTreePage) Nav(name, ref string) string {
-//line gititemtree.qtpl:10
+//line gititemtree.qtpl:28
 	qb422016 := qt422016.AcquireByteBuffer()
-//line gititemtree.qtpl:10
+//line gititemtree.qtpl:28
 	g.WriteNav(qb422016, name, ref)
-//line gititemtree.qtpl:10
+//line gititemtree.qtpl:28
 	qs422016 := string(qb422016.B)
-//line gititemtree.qtpl:10
+//line gititemtree.qtpl:28
 	qt422016.ReleaseByteBuffer(qb422016)
-//line gititemtree.qtpl:10
+//line gititemtree.qtpl:28
 	return qs422016
-//line gititemtree.qtpl:10
+//line gititemtree.qtpl:28
 }
 
-//line gititemtree.qtpl:12
+//line gititemtree.qtpl:30
 func (g *GitItemTreePage) StreamGitContent(qw422016 *qt422016.Writer, name, ref string) {
-//line gititemtree.qtpl:12
+//line gititemtree.qtpl:30
+	qw422016.N().S(`
+<div class="pathing">
+    `)
+//line gititemtree.qtpl:33
+	if len(g.Path) != 0 {
+//line gititemtree.qtpl:33
+		qw422016.N().S(`<a href="`)
+//line gititemtree.qtpl:34
+		qw422016.E().S(url(name, Folder, ref, Root, []string{}))
+//line gititemtree.qtpl:34
+		qw422016.N().S(`">root/</a>`)
+//line gititemtree.qtpl:35
+		for i, e := range g.Path[:len(g.Path)-1] {
+//line gititemtree.qtpl:35
+			qw422016.N().S(`<a href="`)
+//line gititemtree.qtpl:36
+			qw422016.E().S(url(name, Folder, ref, Root, g.Path[:1+i]))
+//line gititemtree.qtpl:36
+			qw422016.N().S(`">`)
+//line gititemtree.qtpl:36
+			qw422016.E().S(e)
+//line gititemtree.qtpl:36
+			qw422016.N().S(`/</a>`)
+//line gititemtree.qtpl:37
+		}
+//line gititemtree.qtpl:37
+		qw422016.N().S(`<a>`)
+//line gititemtree.qtpl:38
+		qw422016.E().S(u.LastOrZero(g.Path))
+//line gititemtree.qtpl:38
+		qw422016.N().S(`</a>`)
+//line gititemtree.qtpl:39
+	} else {
+//line gititemtree.qtpl:39
+		qw422016.N().S(`<a>root/</a>`)
+//line gititemtree.qtpl:41
+	}
+//line gititemtree.qtpl:42
 	qw422016.N().S(`
+</div>
 <div class="row">
   <div class="col-md-12">
     <div class="tree-list">
       `)
-//line gititemtree.qtpl:16
+//line gititemtree.qtpl:47
+	if len(g.Path) != 0 {
+//line gititemtree.qtpl:47
+		qw422016.N().S(`
+          <div class="mode"><a href="`)
+//line gititemtree.qtpl:48
+		qw422016.E().S(url(name, Folder, ref, g.Path[len(g.Path)-1], g.Path[:len(g.Path)-1]))
+//line gititemtree.qtpl:48
+		qw422016.N().S(`">..</a></div>
+          <div class="name tree"></div>
+          <div class="commit"></div>
+          <div class="date"></div>
+          <div class="size"></div>
+      `)
+//line gititemtree.qtpl:53
+	}
+//line gititemtree.qtpl:53
+	qw422016.N().S(`
+      `)
+//line gititemtree.qtpl:54
 	for _, e := range g.Tree.Entries {
-//line gititemtree.qtpl:16
+//line gititemtree.qtpl:54
 		qw422016.N().S(`
           <div class="mode">`)
-//line gititemtree.qtpl:17
+//line gititemtree.qtpl:55
 		qw422016.E().S(Ignore(e.Mode.ToOSFileMode()).String())
-//line gititemtree.qtpl:17
+//line gititemtree.qtpl:55
 		qw422016.N().S(`</div>
           `)
-//line gititemtree.qtpl:18
+//line gititemtree.qtpl:56
 		if e.Mode.IsFile() {
-//line gititemtree.qtpl:18
+//line gititemtree.qtpl:56
 			qw422016.N().S(`
-          <div class="name blob"><a href="/`)
-//line gititemtree.qtpl:19
-			qw422016.E().S(name)
-//line gititemtree.qtpl:19
-			qw422016.N().S(`/blob/`)
-//line gititemtree.qtpl:19
-			qw422016.E().S(ref)
-//line gititemtree.qtpl:19
-			qw422016.N().S(`/`)
-//line gititemtree.qtpl:19
-			qw422016.E().S(g.CurrentPath)
-//line gititemtree.qtpl:19
-			qw422016.N().S(`/`)
-//line gititemtree.qtpl:19
-			qw422016.E().S(e.Name)
-//line gititemtree.qtpl:19
+          <div class="name blob"><a href="`)
+//line gititemtree.qtpl:57
+			qw422016.E().S(url(name, Blob, ref, e.Name, g.Path))
+//line gititemtree.qtpl:57
 			qw422016.N().S(`">`)
-//line gititemtree.qtpl:19
+//line gititemtree.qtpl:57
 			qw422016.E().S(e.Name)
-//line gititemtree.qtpl:19
+//line gititemtree.qtpl:57
 			qw422016.N().S(`</a></div>
           `)
-//line gititemtree.qtpl:20
+//line gititemtree.qtpl:58
 		} else {
-//line gititemtree.qtpl:20
+//line gititemtree.qtpl:58
 			qw422016.N().S(`
-          <div class="name tree"><a href="./`)
-//line gititemtree.qtpl:21
-			qw422016.E().S(g.CurrentPath)
-//line gititemtree.qtpl:21
-			qw422016.N().S(`/`)
-//line gititemtree.qtpl:21
-			qw422016.E().S(e.Name)
-//line gititemtree.qtpl:21
+          <div class="name tree"><a href="`)
+//line gititemtree.qtpl:59
+			qw422016.E().S(url(name, Folder, ref, e.Name, g.Path))
+//line gititemtree.qtpl:59
 			qw422016.N().S(`">`)
-//line gititemtree.qtpl:21
+//line gititemtree.qtpl:59
 			qw422016.E().S(e.Name)
-//line gititemtree.qtpl:21
+//line gititemtree.qtpl:59
 			qw422016.N().S(`</a></div>
           `)
-//line gititemtree.qtpl:22
+//line gititemtree.qtpl:60
 		}
-//line gititemtree.qtpl:22
+//line gititemtree.qtpl:60
 		qw422016.N().S(`
           <div class="commit"></div>
           <div class="date"></div>
           <div class="size">`)
-//line gititemtree.qtpl:25
+//line gititemtree.qtpl:63
 		qw422016.N().DL(Ignore(g.Tree.Size(e.Name)))
-//line gititemtree.qtpl:25
+//line gititemtree.qtpl:63
 		qw422016.N().S(` KiB</div>
       `)
-//line gititemtree.qtpl:26
+//line gititemtree.qtpl:64
 	}
-//line gititemtree.qtpl:26
+//line gititemtree.qtpl:64
 	qw422016.N().S(`
     </div>
   </div>
 </div>
 `)
-//line gititemtree.qtpl:30
+//line gititemtree.qtpl:68
 }
 
-//line gititemtree.qtpl:30
+//line gititemtree.qtpl:68
 func (g *GitItemTreePage) WriteGitContent(qq422016 qtio422016.Writer, name, ref string) {
-//line gititemtree.qtpl:30
+//line gititemtree.qtpl:68
 	qw422016 := qt422016.AcquireWriter(qq422016)
-//line gititemtree.qtpl:30
+//line gititemtree.qtpl:68
 	g.StreamGitContent(qw422016, name, ref)
-//line gititemtree.qtpl:30
+//line gititemtree.qtpl:68
 	qt422016.ReleaseWriter(qw422016)
-//line gititemtree.qtpl:30
+//line gititemtree.qtpl:68
 }
 
-//line gititemtree.qtpl:30
+//line gititemtree.qtpl:68
 func (g *GitItemTreePage) GitContent(name, ref string) string {
-//line gititemtree.qtpl:30
+//line gititemtree.qtpl:68
 	qb422016 := qt422016.AcquireByteBuffer()
-//line gititemtree.qtpl:30
+//line gititemtree.qtpl:68
 	g.WriteGitContent(qb422016, name, ref)
-//line gititemtree.qtpl:30
+//line gititemtree.qtpl:68
 	qs422016 := string(qb422016.B)
-//line gititemtree.qtpl:30
+//line gititemtree.qtpl:68
 	qt422016.ReleaseByteBuffer(qb422016)
-//line gititemtree.qtpl:30
+//line gititemtree.qtpl:68
 	return qs422016
-//line gititemtree.qtpl:30
+//line gititemtree.qtpl:68
 }