Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: refresh assets when listing root level dirs #10

Merged
merged 1 commit into from
Apr 16, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 13 additions & 7 deletions ghafs.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@ import (

// ghaFS implements the GitHub Release Assets file system.
type ghaFS struct {
rasm *ReleaseAssetsMap
mgmt *ReleaseAssetsMgmt
token *string
}

// root implements both Node and Handle for the root directory.
type root struct {
rasm *ReleaseAssetsMap
mgmt *ReleaseAssetsMgmt
token *string
}

Expand All @@ -30,12 +30,12 @@ type tagDir struct {
token *string
}

func NewGhaFS(rasm *ReleaseAssetsMap, token *string) ghaFS {
return ghaFS{rasm, token}
func NewGhaFS(mgmt *ReleaseAssetsMgmt, token *string) ghaFS {
return ghaFS{mgmt, token}
}

func (g ghaFS) Root() (fs.Node, error) {
return root{rasm: g.rasm, token: g.token}, nil
return root{mgmt: g.mgmt, token: g.token}, nil
}

func (root) Attr(ctx context.Context, a *fuse.Attr) error {
Expand All @@ -45,11 +45,17 @@ func (root) Attr(ctx context.Context, a *fuse.Attr) error {
}

func (r root) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) {
return rasToDirents(r.rasm), nil
rasm, err := r.mgmt.refresh()

if err != nil {
return nil, err
}

return rasToDirents(rasm), nil
}

func (r root) Lookup(ctx context.Context, name string) (fs.Node, error) {
for tag, ras := range *r.rasm {
for tag, ras := range *r.mgmt.getCurrent() {
if name == tag {
return tagDir{ras: &ras, token: r.token}, nil
}
Expand Down
4 changes: 2 additions & 2 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ func main() {
}

client := github.NewClient(tc)
rasm, err := getReleaseAssets(ctx, client, owner, repo)
mgmt, err := makeReleaseAssetsMgmt(ctx, client, owner, repo)

if err != nil {
log.Fatal(err)
Expand All @@ -72,7 +72,7 @@ func main() {
token = &oauth2Token
}

err = fs.Serve(c, NewGhaFS(rasm, token))
err = fs.Serve(c, NewGhaFS(mgmt, token))
if err != nil {
log.Fatal(err)
}
Expand Down
42 changes: 42 additions & 0 deletions releaseAssets.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package main

import (
"context"
"sync"

"github.com/google/go-github/v28/github"
)
Expand Down Expand Up @@ -37,3 +38,44 @@ func getReleaseAssets(ctx context.Context, client *github.Client, owner string,

return &rasm, nil
}

type ReleaseAssetsMgmt struct {
ctx context.Context
client *github.Client
owner string
repo string

current *ReleaseAssetsMap
m sync.Mutex
}

func makeReleaseAssetsMgmt(ctx context.Context, client *github.Client, owner string, repo string) (*ReleaseAssetsMgmt, error) {
var mgmt ReleaseAssetsMgmt
mgmt.ctx = ctx
mgmt.client = client
mgmt.owner = owner
mgmt.repo = repo

_, err := mgmt.refresh()
return &mgmt, err
}

func (mgmt *ReleaseAssetsMgmt) refresh() (*ReleaseAssetsMap, error) {
mgmt.m.Lock()
defer mgmt.m.Unlock()

var err error
mgmt.current, err = getReleaseAssets(mgmt.ctx, mgmt.client, mgmt.owner, mgmt.repo)

// See getCurrent for comments about correctness
return mgmt.current, err
}

func (mgmt *ReleaseAssetsMgmt) getCurrent() *ReleaseAssetsMap {
// For simplicity, we assume readonly access to ReleaseAssetsMgmt
// so that we do not need to lock and return a cloned ReleaseAssetsMap
// for correctness
mgmt.m.Lock()
defer mgmt.m.Unlock()
return mgmt.current
}