diff --git a/appview/pages/funcmap.go b/appview/pages/funcmap.go index 32ee76b..cc5c82b 100644 --- a/appview/pages/funcmap.go +++ b/appview/pages/funcmap.go @@ -191,7 +191,7 @@ func (p *Pages) funcMap() template.FuncMap { if v.Len() == 0 { return nil } - return v.Slice(0, min(n, v.Len()-1)).Interface() + return v.Slice(0, min(n, v.Len())).Interface() }, "markdown": func(text string) template.HTML { diff --git a/appview/pages/pages.go b/appview/pages/pages.go index d7a4b8e..e22d23f 100644 --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -555,8 +555,7 @@ type RepoTreeParams struct { RepoInfo repoinfo.RepoInfo Active string BreadCrumbs [][]string - BaseTreeLink string - BaseBlobLink string + TreePath string types.RepoTreeResponse } diff --git a/appview/pages/templates/repo/index.html b/appview/pages/templates/repo/index.html index 011225d..dc75ec6 100644 --- a/appview/pages/templates/repo/index.html +++ b/appview/pages/templates/repo/index.html @@ -127,56 +127,36 @@ {{ end }} {{ define "fileTree" }} -
- {{ $containerstyle := "py-1" }} - {{ $linkstyle := "no-underline hover:underline dark:text-white" }} - - {{ range .Files }} - {{ if not .IsFile }} -
-
- -
- {{ i "folder" "size-4 fill-current" }} - {{ .Name }} -
-
+
+ {{ $linkstyle := "no-underline hover:underline dark:text-white" }} - {{ if .LastCommit }} - {{ template "repo/fragments/time" .LastCommit.When }} - {{ end }} -
-
- {{ end }} - {{ end }} + {{ range .Files }} +
+
+ {{ $link := printf "/%s/%s/%s/%s" $.RepoInfo.FullName "tree" (urlquery $.Ref) .Name }} + {{ $icon := "folder" }} + {{ $iconStyle := "size-4 fill-current" }} - {{ range .Files }} - {{ if .IsFile }} -
-
- -
- {{ i "file" "size-4" }}{{ .Name }} -
-
+ {{ if .IsFile }} + {{ $link = printf "/%s/%s/%s/%s" $.RepoInfo.FullName "blob" (urlquery $.Ref) .Name }} + {{ $icon = "file" }} + {{ $iconStyle = "size-4" }} + {{ end }} + +
+ {{ i $icon $iconStyle }}{{ .Name }} +
+
+
- {{ if .LastCommit }} - {{ template "repo/fragments/time" .LastCommit.When }} - {{ end }} -
-
- {{ end }} - {{ end }} -
+
+ {{ with .LastCommit }} + {{ template "repo/fragments/time" .When }} + {{ end }} +
+
+ {{ end }} +
{{ end }} {{ define "rightInfo" }} diff --git a/appview/pages/templates/repo/tree.html b/appview/pages/templates/repo/tree.html index fbaadbb..f596f88 100644 --- a/appview/pages/templates/repo/tree.html +++ b/appview/pages/templates/repo/tree.html @@ -19,7 +19,6 @@ {{define "repoContent"}}
- {{ $containerstyle := "py-1" }} {{ $linkstyle := "no-underline hover:underline" }}
@@ -54,44 +53,37 @@
{{ range .Files }} - {{ if not .IsFile }} -
-
- -
- {{ i "folder" "size-4 fill-current" }}{{ .Name }} -
-
- {{ if .LastCommit}} -
- {{ .LastCommit.Message }} - {{ template "repo/fragments/time" .LastCommit.When }} +
+
+ {{ $link := printf "/%s/%s/%s/%s/%s" $.RepoInfo.FullName "tree" (urlquery $.Ref) $.TreePath .Name }} + {{ $icon := "folder" }} + {{ $iconStyle := "size-4 fill-current" }} + + {{ if .IsFile }} + {{ $icon = "file" }} + {{ $iconStyle = "size-4" }} + {{ end }} + +
+ {{ i $icon $iconStyle }}{{ .Name }}
- {{ end }} +
-
- {{ end }} - {{ end }} - {{ range .Files }} - {{ if .IsFile }} -
-
- -
- {{ i "file" "size-4" }}{{ .Name }} -
-
- {{ if .LastCommit}} -
- {{ .LastCommit.Message }} - {{ template "repo/fragments/time" .LastCommit.When }} -
- {{ end }} + -
- {{ end }} + +
+ {{ with .LastCommit }} + {{ template "repo/fragments/time" .When }} + {{ end }} +
+
{{ end }} +
{{end}} diff --git a/appview/pages/templates/user/repos.html b/appview/pages/templates/user/repos.html index 789d6ad..71b176a 100644 --- a/appview/pages/templates/user/repos.html +++ b/appview/pages/templates/user/repos.html @@ -8,11 +8,11 @@ {{ end }} {{ define "content" }} -
-
+
+
{{ template "user/fragments/profileCard" .Card }}
-
+
{{ block "ownRepos" . }}{{ end }}
diff --git a/appview/repo/index.go b/appview/repo/index.go index 370c555..2661325 100644 --- a/appview/repo/index.go +++ b/appview/repo/index.go @@ -58,6 +58,8 @@ func (rp *Repo) RepoIndex(w http.ResponseWriter, r *http.Request) { tagMap[hash] = append(tagMap[hash], branch.Name) } + sortFiles(result.Files) + slices.SortFunc(result.Branches, func(a, b types.Branch) int { if a.Name == result.Ref { return -1 diff --git a/appview/repo/repo.go b/appview/repo/repo.go index 31436b2..f6b6fd0 100644 --- a/appview/repo/repo.go +++ b/appview/repo/repo.go @@ -10,9 +10,7 @@ import ( "log" "net/http" "net/url" - "path" "slices" - "sort" "strconv" "strings" "time" @@ -374,7 +372,8 @@ func (rp *Repo) RepoTree(w http.ResponseWriter, r *http.Request) { // redirects tree paths trying to access a blob; in this case the result.Files is unpopulated, // so we can safely redirect to the "parent" (which is the same file). - if len(result.Files) == 0 && result.Parent == treePath { + unescapedTreePath, _ := url.PathUnescape(treePath) + if len(result.Files) == 0 && result.Parent == unescapedTreePath { http.Redirect(w, r, fmt.Sprintf("/%s/blob/%s/%s", f.OwnerSlashRepo(), ref, result.Parent), http.StatusFound) return } @@ -389,18 +388,15 @@ func (rp *Repo) RepoTree(w http.ResponseWriter, r *http.Request) { } } - baseTreeLink := path.Join(f.OwnerSlashRepo(), "tree", ref, treePath) - baseBlobLink := path.Join(f.OwnerSlashRepo(), "blob", ref, treePath) + sortFiles(result.Files) rp.pages.RepoTree(w, pages.RepoTreeParams{ LoggedInUser: user, BreadCrumbs: breadcrumbs, - BaseTreeLink: baseTreeLink, - BaseBlobLink: baseBlobLink, + TreePath: treePath, RepoInfo: f.RepoInfo(user), RepoTreeResponse: result, }) - return } func (rp *Repo) RepoTags(w http.ResponseWriter, r *http.Request) { @@ -480,22 +476,7 @@ func (rp *Repo) RepoBranches(w http.ResponseWriter, r *http.Request) { return } - slices.SortFunc(result.Branches, func(a, b types.Branch) int { - if a.IsDefault { - return -1 - } - if b.IsDefault { - return 1 - } - if a.Commit != nil && b.Commit != nil { - if a.Commit.Committer.When.Before(b.Commit.Committer.When) { - return 1 - } else { - return -1 - } - } - return strings.Compare(a.Name, b.Name) * -1 - }) + sortBranches(result.Branches) user := rp.oauth.GetUser(r) rp.pages.RepoBranches(w, pages.RepoBranchesParams{ @@ -503,7 +484,6 @@ func (rp *Repo) RepoBranches(w http.ResponseWriter, r *http.Request) { RepoInfo: f.RepoInfo(user), RepoBranchesResponse: *result, }) - return } func (rp *Repo) RepoBlob(w http.ResponseWriter, r *http.Request) { @@ -1233,9 +1213,8 @@ func (rp *Repo) RepoCompareNew(w http.ResponseWriter, r *http.Request) { return } branches := result.Branches - sort.Slice(branches, func(i int, j int) bool { - return branches[i].Commit.Committer.When.After(branches[j].Commit.Committer.When) - }) + + sortBranches(branches) var defaultBranch string for _, b := range branches { diff --git a/appview/repo/repo_util.go b/appview/repo/repo_util.go index 50c614b..f562f72 100644 --- a/appview/repo/repo_util.go +++ b/appview/repo/repo_util.go @@ -5,13 +5,47 @@ import ( "crypto/rand" "fmt" "math/big" + "slices" + "sort" + "strings" "tangled.sh/tangled.sh/core/appview/db" "tangled.sh/tangled.sh/core/appview/pages/repoinfo" + "tangled.sh/tangled.sh/core/types" "github.com/go-git/go-git/v5/plumbing/object" ) +func sortFiles(files []types.NiceTree) { + sort.Slice(files, func(i, j int) bool { + iIsFile := files[i].IsFile + jIsFile := files[j].IsFile + if iIsFile != jIsFile { + return !iIsFile + } + return files[i].Name < files[j].Name + }) +} + +func sortBranches(branches []types.Branch) { + slices.SortFunc(branches, func(a, b types.Branch) int { + if a.IsDefault { + return -1 + } + if b.IsDefault { + return 1 + } + if a.Commit != nil && b.Commit != nil { + if a.Commit.Committer.When.Before(b.Commit.Committer.When) { + return 1 + } else { + return -1 + } + } + return strings.Compare(a.Name, b.Name) + }) +} + func uniqueEmails(commits []*object.Commit) []string { emails := make(map[string]struct{}) for _, commit := range commits {