Monorepo for Tangled tangled.org

appview/reporesolver: fix current directory extraction for tree paths #933

path.Dir on extractPathAfterRef returned the parent directory, which broke relative link resolution in markdown when viewing directories. extractCurrentDir now handles blob and tree paths separately: blob paths return the parent dir, tree paths return the directory itself

Signed-off-by: moshyfawn email@moshyfawn.dev

Labels

None yet.

assignee

None yet.

Participants 2
AT URI
at://did:plc:sshwio5obbx4zjfrn3fhsen6/sh.tangled.repo.pull/3mbsmvtynk422
+48 -1
Diff #1
+26 -1
appview/reporesolver/resolver.go
··· 63 63 } 64 64 65 65 // get dir/ref 66 - currentDir := path.Dir(extractPathAfterRef(r.URL.EscapedPath())) 66 + currentDir := extractCurrentDir(r.URL.EscapedPath()) 67 67 ref := chi.URLParam(r, "ref") 68 68 69 69 repoAt := repo.RepoAt() ··· 132 132 return repoInfo 133 133 } 134 134 135 + // extractCurrentDir gets the current directory for markdown link resolution. 136 + // for blob paths, returns the parent dir. for tree paths, returns the path itself. 137 + // 138 + // /@user/repo/blob/main/docs/README.md => docs 139 + // /@user/repo/tree/main/docs => docs 140 + func extractCurrentDir(fullPath string) string { 141 + fullPath = strings.TrimPrefix(fullPath, "/") 142 + 143 + blobPattern := regexp.MustCompile(`blob/[^/]+/(.*)$`) 144 + if matches := blobPattern.FindStringSubmatch(fullPath); len(matches) > 1 { 145 + return path.Dir(matches[1]) 146 + } 147 + 148 + treePattern := regexp.MustCompile(`tree/[^/]+/(.*)$`) 149 + if matches := treePattern.FindStringSubmatch(fullPath); len(matches) > 1 { 150 + dir := strings.TrimSuffix(matches[1], "/") 151 + if dir == "" { 152 + return "." 153 + } 154 + return dir 155 + } 156 + 157 + return "." 158 + } 159 + 135 160 // extractPathAfterRef gets the actual repository path 136 161 // after the ref. for example: 137 162 //
+22
appview/reporesolver/resolver_test.go
··· 1 + package reporesolver 2 + 3 + import "testing" 4 + 5 + func TestExtractCurrentDir(t *testing.T) { 6 + tests := []struct { 7 + path string 8 + want string 9 + }{ 10 + {"/@user/repo/blob/main/docs/README.md", "docs"}, 11 + {"/@user/repo/blob/main/README.md", "."}, 12 + {"/@user/repo/tree/main/docs", "docs"}, 13 + {"/@user/repo/tree/main/docs/", "docs"}, 14 + {"/@user/repo/tree/main", "."}, 15 + } 16 + 17 + for _, tt := range tests { 18 + if got := extractCurrentDir(tt.path); got != tt.want { 19 + t.Errorf("extractCurrentDir(%q) = %q, want %q", tt.path, got, tt.want) 20 + } 21 + } 22 + }

History

2 rounds 4 comments
sign up or login to add to the discussion
1 commit
expand
appview/reporesolver: fix current directory extraction for tree paths
expand 2 comments

Thank you! Tangled’s a great piece of software and it’s been a blast hacking at it πŸ”₯

I’m not a casual Nix user, so I ran into quite a few issues getting the full stack setup working on my Mac. I had to hack some code up and populate the local DB with a mirror of my repos. I think I messed something up during cleanup, and now I have 2 extra repos that still show up and never resolve, even though I’ve deleted them from my own knot and cleaned up my PDS records. I think I’ve almost gotten it to build with the OrbStack NixOS setup, though I can’t quite get the appview to be served; it serves an empty shell for me. Has anyone on the team done a build with a similar setup?

thanks for the patch! we have some instructions on setting up nix on macos + setting up the appview here (sorry for being pedantic, but this is just in case you haven't already seen this page!).

as for the bug itself, did you create these repos on the tangled appview (tangled.org, not local dev)? in which case, it makes sense because we don't yet propagate or handle deletion events from the firehose for repo records, so we tend to have some stale state cached on the appview. let me know if you'd like me to delete these on our end!

pull request successfully merged
2 commits
expand
appview/reporesolver: fix current directory extraction for tree paths
appview/reporesolver: add tests for extractCurrentDir
expand 2 comments

You can test this at https://tangled.org/slices.network/quickslice/tree/main/docs - try the "Build Statusphere with Quickslice" link in the README; it should now correctly go to docs/tutorial.md instead of pointing to the repo root.

lgtm! thanks for the contribution, could you squash both commits into one (IMO makes sense when together) and rebase on the latest master?