Add support for a gitea-pages repo with gitea-pages branch on the root

If we don't find a repo, we search for the gitea-pages repo if this
exists, has the gitea-pages topic tag and has a gitea-pages branch we
will use this to do a file lookup.

We don't need a gitea-pages.toml config file for this repo.
This commit is contained in:
Wim 2022-11-01 23:21:52 +01:00
parent 1a9f1b8a15
commit f99aedb6a1
No known key found for this signature in database

View File

@ -2,7 +2,6 @@ package gitea
import ( import (
"bytes" "bytes"
"errors"
"fmt" "fmt"
"io" "io"
"io/fs" "io/fs"
@ -45,20 +44,52 @@ func (c *Client) Open(name, ref string) (fs.File, error) {
ref = c.giteapages ref = c.giteapages
} }
owner, repo, filepath, err := splitName(name) owner, repo, filepath := splitName(name)
if err != nil { // if repo is empty they want to have the gitea-pages repo
return nil, err if repo == "" {
repo = c.giteapages
filepath = "index.html"
} }
// if filepath is empty they want to have the index.html
if filepath == "" {
filepath = "index.html"
}
// we need to check if the repo exists (and allows access)
if !c.allowsPages(owner, repo) { if !c.allowsPages(owner, repo) {
return nil, fs.ErrNotExist // if we're checking the gitea-pages and it doesn't exist, return 404
if repo == c.giteapages && !c.hasRepoBranch(owner, repo, c.giteapages) {
return nil, fs.ErrNotExist
}
// the repo didn't exist but maybe it's a filepath in the gitea-pages repo
// so we need to check if the gitea-pages repo exists
filepath = repo
repo = c.giteapages
if !c.allowsPages(owner, repo) || !c.hasRepoBranch(owner, repo, c.giteapages) {
return nil, fs.ErrNotExist
}
} }
if err = c.readConfig(owner, repo); err != nil { hasConfig := true
return nil, err
if err := c.readConfig(owner, repo); err != nil {
// we don't need a config for gitea-pages
// no config is only exposing the gitea-pages branch
if repo != c.giteapages {
return nil, err
}
hasConfig = false
} }
if !validRefs(ref) { // if we don't have a config and the repo is the gitea-pages
// always overwrite the ref to the gitea-pages branch
if !hasConfig && (repo == c.giteapages || ref == c.giteapages) {
ref = c.giteapages
} else if !validRefs(ref) {
return nil, fs.ErrNotExist return nil, fs.ErrNotExist
} }
@ -155,6 +186,15 @@ func (c *Client) repoTopics(owner, repo string) ([]string, error) {
return repos, err return repos, err
} }
func (c *Client) hasRepoBranch(owner, repo, branch string) bool {
b, _, err := c.gc.GetRepoBranch(owner, repo, branch)
if err != nil {
return false
}
return b.Name == branch
}
func (c *Client) allowsPages(owner, repo string) bool { func (c *Client) allowsPages(owner, repo string) bool {
topics, err := c.repoTopics(owner, repo) topics, err := c.repoTopics(owner, repo)
if err != nil { if err != nil {
@ -172,30 +212,27 @@ func (c *Client) allowsPages(owner, repo string) bool {
func (c *Client) readConfig(owner, repo string) error { func (c *Client) readConfig(owner, repo string) error {
cfg, err := c.getRawFileOrLFS(owner, repo, c.giteapages+".toml", c.giteapages) cfg, err := c.getRawFileOrLFS(owner, repo, c.giteapages+".toml", c.giteapages)
if err != nil && !errors.Is(err, fs.ErrNotExist) { if err != nil {
return err return err
} }
viper.SetConfigType("toml") viper.SetConfigType("toml")
viper.ReadConfig(bytes.NewBuffer(cfg)) //nolint:errcheck
return nil return viper.ReadConfig(bytes.NewBuffer(cfg))
} }
func splitName(name string) (string, string, string, error) { func splitName(name string) (string, string, string) {
parts := strings.Split(name, "/") parts := strings.Split(name, "/")
// parts contains: ["owner", "repo", "filepath"] // parts contains: ["owner", "repo", "filepath"]
// return invalid path if not enough parts switch len(parts) {
if len(parts) < 3 { case 1:
return "", "", "", fs.ErrInvalid return parts[0], "", ""
case 2:
return parts[0], parts[1], ""
default:
return parts[0], parts[1], strings.Join(parts[2:], "/")
} }
owner := parts[0]
repo := parts[1]
filepath := strings.Join(parts[2:], "/")
return owner, repo, filepath, nil
} }
func validRefs(ref string) bool { func validRefs(ref string) bool {