diff options
-rw-r--r-- | README.md | 2 | ||||
-rw-r--r-- | pkg/u/file.go | 44 | ||||
-rw-r--r-- | pkg/u/file_test.go | 59 | ||||
-rw-r--r-- | templates/gititemtree.qtpl | 2 | ||||
-rw-r--r-- | templates/gititemtree.qtpl.go | 2 |
5 files changed, 94 insertions, 15 deletions
@@ -23,8 +23,6 @@ To run the project you just need to do a make run. ### TODO -- Add path to tree view - - Fix href with extra slash - Add message to tags - Add link to tar browser from commit page - Add patch to the commit page diff --git a/pkg/u/file.go b/pkg/u/file.go index fafe0fb..5010b3e 100644 --- a/pkg/u/file.go +++ b/pkg/u/file.go @@ -4,7 +4,7 @@ import ( "errors" "log/slog" "os" - "path/filepath" + "strings" ) func FileExist(filename string) bool { @@ -22,21 +22,43 @@ func FileExist(filename string) bool { } // This is just a slin wraper to make easier to compose path in the template -type Pathing string +type Pathing struct { + sb strings.Builder +} -func Root() Pathing { - return "/" +func NewPathing() *Pathing { + return &Pathing{} } -func (s Pathing) AddPath(p string) Pathing { - return Pathing(filepath.Join(string(s), p)) +func (s *Pathing) AddPath(p string) *Pathing { + if len(p) == 0 { + return s + } + + // if it has trailing / remove it + if p[len(p)-1] == '/' { + p = p[:len(p)-1] + return s.AddPath(p) + } + + // if it does not have it so add + if p[0] == '/' { + s.sb.WriteString(p) + } else { + s.sb.WriteString("/" + p) + } + + return s } -func (s Pathing) AddPaths(p []string) Pathing { - f := filepath.Join(p...) - return Pathing(filepath.Join(string(s), f)) +func (s *Pathing) AddPaths(p []string) *Pathing { + for _, v := range p { + s.AddPath(v) + } + + return s } -func (s Pathing) Done() string { - return string(s) +func (s *Pathing) Done() string { + return s.sb.String() } diff --git a/pkg/u/file_test.go b/pkg/u/file_test.go new file mode 100644 index 0000000..b7d6975 --- /dev/null +++ b/pkg/u/file_test.go @@ -0,0 +1,59 @@ +// go:build unit +package u + +import "testing" + +func TestPathing(t *testing.T) { + testCases := []struct { + name string + in []any + out string + }{ + { + name: "root", + in: []any{}, + out: "", + }, + { + name: "empty", + in: []any{ + "/", + []string{"/", "/"}, + "/", + []string{"/"}, + }, + out: "", + }, + { + name: "empty", + in: []any{ + "usr", + []string{"/share/", "lib"}, + "/demo", + []string{"/out//"}, + }, + out: "/usr/share/lib/demo/out", + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + r := NewPathing() + + for _, v := range tc.in { + switch s := v.(type) { + case string: + r = r.AddPath(s) + case []string: + r = r.AddPaths(s) + } + } + + path := r.Done() + if tc.out != path { + t.Errorf("String mismatch: wanted %s got %s", tc.out, path) + } + + }) + } +} diff --git a/templates/gititemtree.qtpl b/templates/gititemtree.qtpl index 86fb29c..5898506 100644 --- a/templates/gititemtree.qtpl +++ b/templates/gititemtree.qtpl @@ -15,7 +15,7 @@ %} {% code func url(name, mode, ref, filename string, path []string) string { - return u.Root(). + return u.NewPathing(). AddPath(name). AddPath(mode). AddPath(ref). diff --git a/templates/gititemtree.qtpl.go b/templates/gititemtree.qtpl.go index c0fc3a7..f8d1fd2 100644 --- a/templates/gititemtree.qtpl.go +++ b/templates/gititemtree.qtpl.go @@ -38,7 +38,7 @@ const ( //line gititemtree.qtpl:17 func url(name, mode, ref, filename string, path []string) string { - return u.Root(). + return u.NewPathing(). AddPath(name). AddPath(mode). AddPath(ref). |