From ba5d9cc4222e84a50540885114220dcde0e2cf8b Mon Sep 17 00:00:00 2001 From: Serge Bazanski <q3k@q3k.org> Date: Tue, 15 Aug 2023 23:28:36 +0200 Subject: [PATCH] api: support path_in_repo, add CORS --- server_apps.go | 27 ++++++++++++++++++--------- server_releases.go | 1 + 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/server_apps.go b/server_apps.go index ddb53ac..ea0aa14 100644 --- a/server_apps.go +++ b/server_apps.go @@ -7,6 +7,7 @@ import ( "io" "log" "net/http" + "path" "regexp" "strings" "time" @@ -21,6 +22,7 @@ import ( type appDescriptor struct { repository string + pathInRepo string appInfo *appInfo } @@ -38,10 +40,11 @@ var ( reAppRepo = regexp.MustCompile(`^([a-zA-Z\-_\.0-9]+)/([a-zA-Z\-_0-9]+)$`) ) -func (s *server) parseAppToml(ctx context.Context, obj *object.Commit) (*appInfo, error) { - f, err := obj.File("flow3r.toml") +func (s *server) parseAppToml(ctx context.Context, pathInRepo string, obj *object.Commit) (*appInfo, error) { + p := path.Join(pathInRepo, "flow3r.toml") + f, err := obj.File(p) if err != nil { - return nil, fmt.Errorf("toml open failed: %w", err) + return nil, fmt.Errorf("toml open (%q) failed: %w", p, err) } reader, err := f.Reader() if err != nil { @@ -99,7 +102,7 @@ func (s *server) parseAppToml(ctx context.Context, obj *object.Commit) (*appInfo }, nil } -func (s *server) getAppInfo(ctx context.Context, repo string) (*appInfo, error) { +func (s *server) getAppInfo(ctx context.Context, pathInRepo, repo string) (*appInfo, error) { url := "https://git.flow3r.garden/" + repo g, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{ URL: url, @@ -116,7 +119,7 @@ func (s *server) getAppInfo(ctx context.Context, repo string) (*appInfo, error) return nil, fmt.Errorf("no branches") } var bname string - for name, _ := range cfg.Branches { + for name := range cfg.Branches { bname = name break } @@ -141,7 +144,7 @@ func (s *server) getAppInfo(ctx context.Context, repo string) (*appInfo, error) highsetVerNil := true firstTime := make(map[int]*appInfo) for { - info, err := s.parseAppToml(ctx, obj) + info, err := s.parseAppToml(ctx, pathInRepo, obj) if err == nil { ver := info.version firstTime[ver] = info @@ -149,6 +152,8 @@ func (s *server) getAppInfo(ctx context.Context, repo string) (*appInfo, error) highestVer = ver highsetVerNil = false } + } else { + log.Printf("%s@%s: %v", repo, obj.Hash.String(), err) } if len(obj.ParentHashes) == 0 { break @@ -224,7 +229,8 @@ func (s *server) getAppRegistry(ctx context.Context) ([]*appDescriptor, error) { dec := toml.NewDecoder(reader) var dat struct { - Repo string + Repo string + PathInRepo string `toml:"path_in_repo"` } err = dec.Decode(&dat) reader.Close() @@ -232,6 +238,7 @@ func (s *server) getAppRegistry(ctx context.Context) ([]*appDescriptor, error) { log.Printf("App %q: couldn't parse TOML: %v", m[1], err) continue } + log.Printf("%+v", dat) n := reAppRepo.FindStringSubmatch(dat.Repo) if n == nil { log.Printf("App %q: invalid repo %q", m[1], dat.Repo) @@ -239,11 +246,12 @@ func (s *server) getAppRegistry(ctx context.Context) ([]*appDescriptor, error) { } res = append(res, &appDescriptor{ repository: dat.Repo, + pathInRepo: dat.PathInRepo, }) } for _, app := range res { - info, err := s.getAppInfo(ctx, app.repository) + info, err := s.getAppInfo(ctx, app.pathInRepo, app.repository) if err != nil { log.Printf("App %q: %v", app.repository, err) continue @@ -267,7 +275,7 @@ func (s *server) handleApps(w http.ResponseWriter, r *http.Request) { type app struct { RepoURL string `json:"repoUrl"` Commit string `json:"commit"` - DownloadURL string `json:"downloadURL"` + DownloadURL string `json:"downloadUr"` Name string `json:"name"` Menu string `json:"menu"` Author string `json:"author"` @@ -302,6 +310,7 @@ func (s *server) handleApps(w http.ResponseWriter, r *http.Request) { Version: a.appInfo.version, }) } + w.Header().Add("Access-Control-Allow-Origin", "*") w.Header().Add("Content-Type", "application/json") j := json.NewEncoder(w) j.Encode(resp) diff --git a/server_releases.go b/server_releases.go index 6919d24..ffbef4a 100644 --- a/server_releases.go +++ b/server_releases.go @@ -96,6 +96,7 @@ func (s *server) handleReleases(w http.ResponseWriter, r *http.Request) { Partitions: partitions, }) } + w.Header().Add("Access-Control-Allow-Origin", "*") w.Header().Add("Content-Type", "application/json") j := json.NewEncoder(w) j.Encode(resp) -- GitLab