Monorepo for Tangled

apview/repo: add a redirect to get latest tag

Signed-off-by: Evan Jarrett <evan@evanjarrett.com>

authored by

Evan Jarrett and committed by
Anirudh Oppiliappan
3b646dcb 8817c3ca

+48 -1
+27 -1
appview/repo/tags.go
··· 4 "encoding/json" 5 "fmt" 6 "net/http" 7 8 "tangled.org/core/api/tangled" 9 "tangled.org/core/appview/db" 10 "tangled.org/core/appview/models" 11 "tangled.org/core/appview/pages" 12 xrpcclient "tangled.org/core/appview/xrpcclient" 13 "tangled.org/core/orm" 14 "tangled.org/core/types" ··· 101 102 xrpcBytes, err := tangled.RepoTag(r.Context(), xrpcc, repo, tag) 103 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { 104 - l.Error("failed to call XRPC repo.tags", "err", xrpcerr) 105 rp.pages.Error503(w) 106 return 107 }
··· 4 "encoding/json" 5 "fmt" 6 "net/http" 7 + "net/url" 8 9 "tangled.org/core/api/tangled" 10 "tangled.org/core/appview/db" 11 "tangled.org/core/appview/models" 12 "tangled.org/core/appview/pages" 13 + "tangled.org/core/appview/reporesolver" 14 xrpcclient "tangled.org/core/appview/xrpcclient" 15 "tangled.org/core/orm" 16 "tangled.org/core/types" ··· 103 104 xrpcBytes, err := tangled.RepoTag(r.Context(), xrpcc, repo, tag) 105 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { 106 + // if we don't match an existing tag, and the tag we're trying 107 + // to match is "latest", resolve to the most recent tag 108 + if tag == "latest" { 109 + tagsBytes, err := tangled.RepoTags(r.Context(), xrpcc, "", 1, repo) 110 + if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { 111 + l.Error("failed to call XRPC repo.tags for latest", "err", xrpcerr) 112 + rp.pages.Error503(w) 113 + return 114 + } 115 + var tagsResult types.RepoTagsResponse 116 + if err := json.Unmarshal(tagsBytes, &tagsResult); err != nil { 117 + l.Error("failed to decode XRPC response", "err", err) 118 + rp.pages.Error503(w) 119 + return 120 + } 121 + if len(tagsResult.Tags) == 0 { 122 + rp.pages.Error503(w) 123 + return 124 + } 125 + latestTag := tagsResult.Tags[0].Name 126 + ownerSlashRepo := reporesolver.GetBaseRepoPath(r, f) 127 + http.Redirect(w, r, fmt.Sprintf("/%s/tags/%s", ownerSlashRepo, url.PathEscape(latestTag)), http.StatusTemporaryRedirect) 128 + return 129 + } 130 + l.Error("failed to call XRPC repo.tag", "err", xrpcerr) 131 rp.pages.Error503(w) 132 return 133 }
+21
knotserver/git/tag_test.go
··· 353 assert.Len(s.T(), tags, 5, "zero limit should return all tags") 354 } 355 356 func (s *TagSuite) TestTags_Pattern() { 357 s.setupRepoWithTags() 358
··· 353 assert.Len(s.T(), tags, 5, "zero limit should return all tags") 354 } 355 356 + func (s *TagSuite) TestTags_OrderedNewestFirst() { 357 + s.setupRepoWithTags() 358 + 359 + tags, err := s.repo.Tags(nil) 360 + require.NoError(s.T(), err) 361 + require.Len(s.T(), tags, 5) 362 + 363 + // v3.0.0 has the latest tagger date (baseTime+3h), should be first 364 + assert.Equal(s.T(), "v3.0.0", tags[0].Name, "newest tag should be first") 365 + } 366 + 367 + func (s *TagSuite) TestTags_LatestWithLimit1() { 368 + s.setupRepoWithTags() 369 + 370 + tags, err := s.repo.Tags(&TagsOptions{Limit: 1}) 371 + require.NoError(s.T(), err) 372 + require.Len(s.T(), tags, 1) 373 + 374 + assert.Equal(s.T(), "v3.0.0", tags[0].Name, "limit=1 should return the newest tag") 375 + } 376 + 377 func (s *TagSuite) TestTags_Pattern() { 378 s.setupRepoWithTags() 379