From d8b2597d472f458b99779241649180b9ece3e080 Mon Sep 17 00:00:00 2001 From: Daniele Rondina Date: Wed, 15 Jan 2025 18:11:10 +0100 Subject: [PATCH] Add `builtin-noop` generator In order to define pinned packages without reading remote services it's possible to use the `builtin-noop` generator and defines the versions directly on *vars* attribute. The `versions` attributes is mandatory in this case and must be an array of strings. --- contrib/autogen/noop_example.yml | 34 ++++++++ contrib/autogen/templates/metatools.tmpl | 46 ++++++++++ pkg/autogen/bot.go | 26 +++++- pkg/autogen/generators/builtin_noop.go | 104 +++++++++++++++++++++++ pkg/autogen/generators/generator.go | 2 + pkg/specs/definition_autogen.go | 2 + 6 files changed, 213 insertions(+), 1 deletion(-) create mode 100644 contrib/autogen/noop_example.yml create mode 100644 contrib/autogen/templates/metatools.tmpl create mode 100644 pkg/autogen/generators/builtin_noop.go diff --git a/contrib/autogen/noop_example.yml b/contrib/autogen/noop_example.yml new file mode 100644 index 0000000..dd08bba --- /dev/null +++ b/contrib/autogen/noop_example.yml @@ -0,0 +1,34 @@ +x11libs: + generator: builtin-noop + template: + engine: helm + + defaults: + category: x11-libs + packages: + - libX11: + vars: + desc: "X.Org X11 library" + versions: + - "1.8.1" + + assets: + - name: "libX11-{{ .Values.version}}.tar.xz" + prefix: https://www.x.org/releases/individual/lib/ + + - metatools: + category: sys-apps + vars: + github_user: macaroni-os + github_repo: funtoo-metatools + homepage: https://github.com/macaroni-os/funtoo-metatools + license: Apache-2.0 + desc: "M.A.R.K. metatools -- autogeneration framework." + versions: + - 1.3.8_pre20240818 + snapshot: 3ca77d7dac6b9256e161d0bce47c7f7eb85e6e96 + + assets: + - name: "{{ .Values.pn }}-{{ .Values.version }}-{{ substr 0 7 .Values.snapshot }}.zip" + url: "https://github.com/{{ .Values.github_user }}/{{ .Values.github_repo }}/archive/{{ .Values.snapshot }}.zip" + diff --git a/contrib/autogen/templates/metatools.tmpl b/contrib/autogen/templates/metatools.tmpl new file mode 100644 index 0000000..bd9cd45 --- /dev/null +++ b/contrib/autogen/templates/metatools.tmpl @@ -0,0 +1,46 @@ +# Distributed under the terms of the GNU General Public License v2 + +EAPI=7 + +PYTHON_COMPAT=( python3+ ) +inherit distutils-r1 + +DESCRIPTION="{{- .Values.desc }}" +HOMEPAGE="{{- .Values.homepage }}" + +RESTRICT="network-sandbox" +DEPEND=">=dev-python/subpop-2.0.0[${PYTHON_USEDEP}]" +RDEPEND=" + app-arch/unzip + >=dev-util/meson-1.2.0 + dev-python/beautifulsoup[${PYTHON_USEDEP}] + dev-python/dict-toolbox[${PYTHON_USEDEP}] + >=dev-python/httpx-0.24.0[${PYTHON_USEDEP}] + >=dev-python/jinja-3[${PYTHON_USEDEP}] + dev-python/packaging[${PYTHON_USEDEP}] + dev-python/packaging-legacy[${PYTHON_USEDEP}] + dev-python/psutil[${PYTHON_USEDEP}] + dev-python/pymongo[${PYTHON_USEDEP}] + dev-python/pyyaml[${PYTHON_USEDEP}] + dev-python/pyzmq[${PYTHON_USEDEP}] + dev-python/rich[${PYTHON_USEDEP}] + dev-python/toml[${PYTHON_USEDEP}] + dev-python/xmltodict[${PYTHON_USEDEP}] + dev-python/colorama[${PYTHON_USEDEP}]" +IUSE="" +SLOT="0" +LICENSE="{{- .Values.license }}" +KEYWORDS="*" +SRC_URI="{{- .Values.src_uri }}" +S="${WORKDIR}/funtoo-metatools-{{ .Values.snapshot }}" + +src_configure() { + # Create setup.py + sed -e "s/##VERSION##/${PV/_*/}/g" \ + setup.py.in > setup.py + + unset PYTHONPATH + default +} + +# vim: syn=ebuild noet ts=4 diff --git a/pkg/autogen/bot.go b/pkg/autogen/bot.go index c298ec3..757fdb8 100644 --- a/pkg/autogen/bot.go +++ b/pkg/autogen/bot.go @@ -472,7 +472,31 @@ func (a *AutogenBot) ProcessPackage(mkit *specs.MergeKit, if len(atom.Vars) > 0 { for k, v := range atom.Vars { - values[k] = v + if k == "versions" { + + ilist, ok := v.([]interface{}) + if !ok { + return fmt.Errorf( + "Invalid type on versions var for package %s", + atom.Name) + } + + // Special case. + // I need to convert []interface{} to []string + vlist := []string{} + for _, vv := range ilist { + str, ok := vv.(string) + if !ok { + return fmt.Errorf( + "Invalid value %v on versions var for package %s", + vv, atom.Name) + } + vlist = append(vlist, str) + } + values[k] = vlist + } else { + values[k] = v + } } } diff --git a/pkg/autogen/generators/builtin_noop.go b/pkg/autogen/generators/builtin_noop.go new file mode 100644 index 0000000..adc4aa2 --- /dev/null +++ b/pkg/autogen/generators/builtin_noop.go @@ -0,0 +1,104 @@ +/* + Copyright © 2024-2025 Macaroni OS Linux + See AUTHORS and LICENSE for the license details and contributors. +*/ + +package generators + +import ( + "fmt" + "strings" + + "github.com/macaroni-os/mark-devkit/pkg/helpers" + "github.com/macaroni-os/mark-devkit/pkg/logger" + "github.com/macaroni-os/mark-devkit/pkg/specs" +) + +type NoopGenerator struct{} + +func NewNoopGenerator() *NoopGenerator { + return &NoopGenerator{} +} + +func (g *NoopGenerator) GetType() string { + return specs.GeneratorBuiltinNoop +} + +func (g *NoopGenerator) SetVersion(atom *specs.AutogenAtom, version string, + mapref *map[string]interface{}) error { + + log := logger.GetDefaultLogger() + values := *mapref + + delete(values, "versions") + + artefacts := []*specs.AutogenArtefact{} + + if atom.HasAssets() { + for _, asset := range atom.Assets { + name, err := helpers.RenderContentWithTemplates( + asset.Name, + "", "", "asset.name", values, []string{}, + ) + if err != nil { + return err + } + + if asset.Prefix == "" && asset.Url == "" { + return fmt.Errorf( + "Asset %s for atom %s without prefix and url not admitted with noop", + asset.Name, atom.Name) + } + + var srcUri string + + if asset.Prefix != "" { + srcUri, err = helpers.RenderContentWithTemplates( + asset.Prefix, + "", "", "asset.name", values, []string{}, + ) + if err != nil { + return err + } + + if !strings.HasSuffix(srcUri, "/") { + srcUri += "/" + } + srcUri += name + + } else { + srcUri, err = helpers.RenderContentWithTemplates( + asset.Url, + "", "", "asset.name", values, []string{}, + ) + if err != nil { + return err + } + + } + + if log.Config.GetGeneral().Debug { + log.Debug(fmt.Sprintf("[%s] For asset %s using url %s", + atom.Name, name, srcUri)) + } + + artefacts = append(artefacts, &specs.AutogenArtefact{ + SrcUri: []string{srcUri}, + Use: asset.Use, + Name: name, + }) + } + + } + + values["artefacts"] = artefacts + + return nil +} + +func (g *NoopGenerator) Process(atom *specs.AutogenAtom, + def *specs.AutogenAtom) (*map[string]interface{}, error) { + ans := make(map[string]interface{}, 0) + + return &ans, nil +} diff --git a/pkg/autogen/generators/generator.go b/pkg/autogen/generators/generator.go index d4b7df4..a212522 100644 --- a/pkg/autogen/generators/generator.go +++ b/pkg/autogen/generators/generator.go @@ -22,6 +22,8 @@ func NewGenerator(t string) (Generator, error) { return NewGithubGenerator(), nil case specs.GeneratorBuiltinDirListing: return NewDirlistingGenerator(), nil + case specs.GeneratorBuiltinNoop: + return NewNoopGenerator(), nil default: return nil, fmt.Errorf("Invalid generator type %s", t) } diff --git a/pkg/specs/definition_autogen.go b/pkg/specs/definition_autogen.go index 484bbe1..46f258f 100644 --- a/pkg/specs/definition_autogen.go +++ b/pkg/specs/definition_autogen.go @@ -7,6 +7,7 @@ package specs const ( GeneratorBuiltinGitub = "builtin-github" GeneratorBuiltinDirListing = "builtin-dirlisting" + GeneratorBuiltinNoop = "builtin-noop" TmplEngineHelm = "helm" TmplEnginePongo2 = "pongo2" @@ -57,6 +58,7 @@ type AutogenAsset struct { Name string `json:"name,omitempty" yaml:"name,omitempty"` Matcher string `json:"matcher,omitempty" yaml:"matcher,omitempty"` Prefix string `json:"prefix,omitempty" yaml:"prefix,omitempty"` + Url string `json:"url,omitempty" yaml:"url,omitempty"` } type AutogenTransform struct {