diff options
author | Gabriel A. Giovanini <mail@gabrielgio.me> | 2025-02-06 23:32:18 +0100 |
---|---|---|
committer | Gabriel A. Giovanini <mail@gabrielgio.me> | 2025-02-06 23:32:18 +0100 |
commit | e8265117372cf262ce7cb4f6ce3b61f19373aee6 (patch) | |
tree | eee905d4e0697cf3cb057d9d703e26825941ec83 | |
parent | 77f5ad1047dc2ae72cd616dc2acc839ea38d881f (diff) | |
download | cerrado-e8265117372cf262ce7cb4f6ce3b61f19373aee6.tar.gz cerrado-e8265117372cf262ce7cb4f6ce3b61f19373aee6.tar.bz2 cerrado-e8265117372cf262ce7cb4f6ce3b61f19373aee6.zip |
feat: Add configuration for ordering repo list
Now it is possible to order the list by; unordered, alphabetical and
last commit both ascendent and descendent.
-rw-r--r-- | config.example.scfg | 8 | ||||
-rw-r--r-- | pkg/config/config.go | 49 | ||||
-rw-r--r-- | pkg/handler/git/handler.go | 28 |
3 files changed, 84 insertions, 1 deletions
diff --git a/config.example.scfg b/config.example.scfg index 59a04ad..3ba8959 100644 --- a/config.example.scfg +++ b/config.example.scfg @@ -10,6 +10,14 @@ syntax-highlight monokailight passphrase $2a$14$VnB/ZcB1DUDkMnosRA6Y7.dj8h5eroslDxTeXlLwfQX/x86mh6WAq aes-key 8XHptZxSWCGs1m7QzztX5zNQ7D9NiQevVX0DaUTNMbDpRwFzoJiB0U7K6O/kqIt01jJVgzBUfiR8ES46ZLLb4w== +# order of the list of repository, values: +# unordered +# alphabetical-asc +# alphabetical-desc +# lastcommit-asc +# lastcommit-desc +order-by lastcommit-asc + # repository section is order dependent where the first repository has priority # in case of conflict. Repository has also priority over scan. The order # between scan and repository is irrelevant which means that all repository diff --git a/pkg/config/config.go b/pkg/config/config.go index 1ad5108..60a3444 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "io" + "log/slog" "os" "path" "path/filepath" @@ -19,6 +20,16 @@ var ( ErrInvalidProperty = errors.New("Invalid property") ) +type OrderBy int + +const ( + Unordered OrderBy = iota + AlphabeticalAsc + AlphabeticalDesc + LastCommitAsc + LastCommitDesc +) + type ( // scan represents piece of the scan from the configuration file. @@ -36,6 +47,7 @@ type ( Passphrase string SyntaxHighlight string AESKey string + OrderBy string Repositories []*GitRepositoryConfiguration } @@ -58,6 +70,7 @@ type ( passphrase []byte aesKey []byte syntaxHighlight string + orderBy OrderBy repositories []*GitRepositoryConfiguration } ) @@ -80,6 +93,7 @@ func LoadConfigurationRepository(configPath string) (*ConfigurationRepository, e repositories: config.Repositories, rootReadme: config.RootReadme, syntaxHighlight: config.SyntaxHighlight, + orderBy: parseOrderBy(config.OrderBy), } for _, scan := range config.Scans { @@ -99,6 +113,10 @@ func (c *ConfigurationRepository) GetRootReadme() string { return c.rootReadme } +func (c *ConfigurationRepository) GetOrderBy() OrderBy { + return c.orderBy +} + func (c *ConfigurationRepository) GetSyntaxHighlight() string { return c.syntaxHighlight } @@ -211,6 +229,11 @@ func parse(r io.Reader) (*configuration, error) { return nil, err } + err = setOrderby(block, &config.OrderBy) + if err != nil { + return nil, err + } + err = setRepositories(block, &config.Repositories) if err != nil { return nil, err @@ -316,6 +339,11 @@ func setSyntaxHighlight(block scfg.Block, listenAddr *string) error { return setString(scanDir, listenAddr) } +func setOrderby(block scfg.Block, orderBy *string) error { + scanDir := block.Get("order-by") + return setString(scanDir, orderBy) +} + func setListenAddr(block scfg.Block, listenAddr *string) error { scanDir := block.Get("listen-addr") return setString(scanDir, listenAddr) @@ -363,3 +391,24 @@ func setString(dir *scfg.Directive, field *string) error { } return nil } + +func parseOrderBy(s string) OrderBy { + switch s { + case "": + return LastCommitAsc + case "unordered": + return Unordered + case "alphabetical-asc": + return AlphabeticalAsc + case "alphabetical-desc": + return AlphabeticalDesc + case "lastcommit-asc": + return LastCommitAsc + case "lastcommit-desc": + return LastCommitDesc + default: + slog.Warn("Invalid order-by using default unordered") + return LastCommitAsc + + } +} diff --git a/pkg/handler/git/handler.go b/pkg/handler/git/handler.go index 436d364..9c7ba5b 100644 --- a/pkg/handler/git/handler.go +++ b/pkg/handler/git/handler.go @@ -9,8 +9,10 @@ import ( "net/http" "os" "path/filepath" + "sort" "strings" + "git.gabrielgio.me/cerrado/pkg/config" "git.gabrielgio.me/cerrado/pkg/ext" "git.gabrielgio.me/cerrado/pkg/service" "git.gabrielgio.me/cerrado/pkg/u" @@ -34,6 +36,7 @@ type ( configurationRepository interface { GetRootReadme() string GetSyntaxHighlight() string + GetOrderBy() config.OrderBy } ) @@ -79,7 +82,7 @@ func (g *GitHandler) List(w http.ResponseWriter, r *http.Request) error { bs = markdown.Render(doc, renderer) gitList := &templates.GitListPage{ - Respositories: repos, + Respositories: orderBy(repos, g.config.GetOrderBy()), About: bs, } templates.WritePageTemplate(w, gitList, r.Context()) @@ -390,3 +393,26 @@ func GetLexers(filename string) chroma.Lexer { func isPublic(r *service.Repository) bool { return r.Public } + +func orderBy(repos []*service.Repository, order config.OrderBy) []*service.Repository { + switch order { + case config.AlphabeticalAsc: + sort.Slice(repos, func(i, j int) bool { + return repos[i].Name < repos[j].Name + }) + case config.AlphabeticalDesc: + sort.Slice(repos, func(i, j int) bool { + return repos[i].Name > repos[j].Name + }) + case config.LastCommitAsc: + sort.Slice(repos, func(i, j int) bool { + return repos[i].LastCommit.Committer.When.Before(repos[j].LastCommit.Committer.When) + }) + case config.LastCommitDesc: + sort.Slice(repos, func(i, j int) bool { + return repos[i].LastCommit.Committer.When.After(repos[j].LastCommit.Committer.When) + }) + } + + return repos +} |