From 3e64b1b9323ea17eb8f87dfed6d897683c6196be Mon Sep 17 00:00:00 2001 From: Nicolas Paul Date: Wed, 31 May 2023 13:22:43 +0200 Subject: Move intern functions into prelude lib to avoid cyclic imports Signed-off-by: Nicolas Paul --- cmd/svgu/svgu.go | 22 ++++---- pkg/config/lib/bzr/bzr.go | 4 +- pkg/config/lib/fossil/fossil.go | 4 +- pkg/config/lib/git/git.go | 4 +- pkg/config/lib/git/git.star | 20 +++---- pkg/config/lib/hg/hg.go | 4 +- pkg/config/lib/prelude/prelude.go | 93 ++++++++++++++++++++++++++++++++ pkg/config/lib/svn/svn.go | 4 +- pkg/config/starlark.go | 109 +++++--------------------------------- 9 files changed, 136 insertions(+), 128 deletions(-) create mode 100644 pkg/config/lib/prelude/prelude.go diff --git a/cmd/svgu/svgu.go b/cmd/svgu/svgu.go index 1e7f599..16abcb7 100644 --- a/cmd/svgu/svgu.go +++ b/cmd/svgu/svgu.go @@ -4,7 +4,6 @@ package main // import "go.nc0.fr/svgu" import ( "flag" "go.nc0.fr/svgu/pkg/config" - "go.nc0.fr/svgu/pkg/types" "log" "os" "path/filepath" @@ -23,7 +22,7 @@ func main() { // Check if the configuration file exists. if *verbose { - log.Printf("checking if configuration file %q exists", cfg) + log.Printf("checking if configuration file %q exists", *cfg) } if cfg, err := filepath.Abs(*cfg); err != nil { @@ -31,14 +30,14 @@ func main() { } if cfgfd, err := os.Stat(*cfg); os.IsNotExist(err) || cfgfd.IsDir() { - log.Fatalf("configuration file %q does not exist", cfg) + log.Fatalf("configuration file %q does not exist", *cfg) } else if err != nil { - log.Fatalf("could not stat %q: %v", cfg, err) + log.Fatalf("could not stat %q: %v", *cfg, err) } // Check if the output directory exists. if *verbose { - log.Printf("checking if output directory %q exists", out) + log.Printf("checking if output directory %q exists", *out) } if out, err := filepath.Abs(*out); err != nil { @@ -46,24 +45,24 @@ func main() { } if outfd, err := os.Stat(*out); outfd != nil && outfd.IsDir() { - log.Fatalf("output directory %q already exists", out) + log.Fatalf("output directory %q already exists", *out) } else if err != nil && !os.IsNotExist(err) { - log.Fatalf("could not stat %q: %v", out, err) + log.Fatalf("could not stat %q: %v", *out, err) } // Execute the configuration file and get the registered modules. if *verbose { - log.Printf("executing configuration file %q", cfg) + log.Printf("executing configuration file %q", *cfg) } idx, err := config.ExecConfig(*cfg) if err != nil { - log.Fatalf("could not execute configuration file %q: %v", cfg, err) + log.Fatalf("could not execute configuration file %q: %v", *cfg, err) } // Create the output directory. if *verbose { - log.Printf("creating output directory %q", out) + log.Printf("creating output directory %q", *out) } if err := os.MkdirAll(*out, 0755); err != nil { @@ -84,8 +83,7 @@ func main() { log.Printf("generating modules") } - var mod *types.Module - for _, mod = range idx.Modules { + for _, mod := range idx.Modules { if err := mod.GenerateFile(*out, idx.Domain); err != nil { log.Fatalf("could not generate module %q: %v", mod.Path, err) } diff --git a/pkg/config/lib/bzr/bzr.go b/pkg/config/lib/bzr/bzr.go index 81b0177..53cc2cf 100644 --- a/pkg/config/lib/bzr/bzr.go +++ b/pkg/config/lib/bzr/bzr.go @@ -2,7 +2,7 @@ package bzr import ( _ "embed" - "go.nc0.fr/svgu/pkg/config" + "go.nc0.fr/svgu/pkg/config/lib/prelude" "go.starlark.net/starlark" "go.starlark.net/starlarkstruct" "sync" @@ -21,7 +21,7 @@ func LoadBzrModule(t *starlark.Thread) (starlark.StringDict, error) { once.Do(func() { env := starlark.StringDict{ "module": starlark.NewBuiltin("module", - config.InternModule), + prelude.InternModule), "make_module": starlark.NewBuiltin("mod", starlarkstruct.MakeModule), } diff --git a/pkg/config/lib/fossil/fossil.go b/pkg/config/lib/fossil/fossil.go index bf49882..bc7f6da 100644 --- a/pkg/config/lib/fossil/fossil.go +++ b/pkg/config/lib/fossil/fossil.go @@ -2,7 +2,7 @@ package fossil import ( _ "embed" - "go.nc0.fr/svgu/pkg/config" + "go.nc0.fr/svgu/pkg/config/lib/prelude" "go.starlark.net/starlark" "go.starlark.net/starlarkstruct" "sync" @@ -21,7 +21,7 @@ func LoadFossilModule(t *starlark.Thread) (starlark.StringDict, error) { once.Do(func() { env := starlark.StringDict{ "module": starlark.NewBuiltin("module", - config.InternModule), + prelude.InternModule), "make_module": starlark.NewBuiltin("mod", starlarkstruct.MakeModule), } diff --git a/pkg/config/lib/git/git.go b/pkg/config/lib/git/git.go index f1e0607..d9dbe71 100644 --- a/pkg/config/lib/git/git.go +++ b/pkg/config/lib/git/git.go @@ -4,7 +4,7 @@ package git import ( _ "embed" - "go.nc0.fr/svgu/pkg/config" + "go.nc0.fr/svgu/pkg/config/lib/prelude" "go.starlark.net/starlark" "go.starlark.net/starlarkstruct" "sync" @@ -23,7 +23,7 @@ func LoadGitModule(t *starlark.Thread) (starlark.StringDict, error) { once.Do(func() { env := starlark.StringDict{ "module": starlark.NewBuiltin("module", - config.InternModule), + prelude.InternModule), "make_module": starlark.NewBuiltin("mod", starlarkstruct.MakeModule), } diff --git a/pkg/config/lib/git/git.star b/pkg/config/lib/git/git.star index debefc6..cf31524 100644 --- a/pkg/config/lib/git/git.star +++ b/pkg/config/lib/git/git.star @@ -4,13 +4,13 @@ _GIT = "git" # https://github.com/github/renaming _GITHUB_DEFAULT_INSTANCE = "https://github.com" -_GITHUB_DEFAULT_MASTER = "main" +_GITHUB_DEFAULT_REF = "main" def _github( name, user, repo, - ref = _GITHUB_DEFAULT_MASTER, + ref = _GITHUB_DEFAULT_REF, instance = _GITHUB_DEFAULT_INSTANCE): """Register a module hosted on GitHub. @@ -19,7 +19,7 @@ def _github( user (str): The name of the user or organization. repo (str): The name of the repository. ref (str): The name of the ref. - Defaults to `git.GITHUB_DEFAULT_MASTER`. + Defaults to `git.GITHUB_DEFAULT_REF`. instance (str): The name of the instance. Defaults to `git.GITHUB_DEFAULT_INSTANCE`. """ @@ -34,7 +34,7 @@ def _github( ) _SOURCEHUT_DEFAULT_INSTANCE = "git.sr.ht" -_SOURCEHUT_DEFAULT_MASTER = "master" +_SOURCEHUT_DEFAULT_REF = "master" # TODO(nc0): See the status for organizations and groups, as they are expected # to use another symbol than `~`. @@ -42,7 +42,7 @@ def _sourcehut( name, user, repo, - ref = _SOURCEHUT_DEFAULT_MASTER, + ref = _SOURCEHUT_DEFAULT_REF, instance = _SOURCEHUT_DEFAULT_INSTANCE): """Register a module hosted on Source Hut's Git hosting. @@ -51,7 +51,7 @@ def _sourcehut( user (str): The name of the user or organization. repo (str): The name of the repository. ref (str): The name of the ref. - Defaults to `git.SOURCEHUT_DEFAULT_MASTER`. + Defaults to `git.SOURCEHUT_DEFAULT_REF`. instance (str): The name of the instance. Defaults to `git.SOURCEHUT_DEFAULT_INSTANCE`. """ @@ -68,13 +68,13 @@ def _sourcehut( # https://about.gitlab.com/blog/2021/03/10/new-git-default-branch-name/ _GITLAB_DEFAULT_INSTANCE = "https://gitlab.com" -_GITLAB_DEFAULT_MASTER = "main" +_GITLAB_DEFAULT_REF = "main" def _gitlab( name, user, repo, - ref = _GITLAB_DEFAULT_MASTER, + ref = _GITLAB_DEFAULT_REF, instance = _GITLAB_DEFAULT_INSTANCE): """Register a module hosted on GitLab. @@ -83,7 +83,7 @@ def _gitlab( user (str): The name of the user or organization. repo (str): The name of the repository. ref (str): The name of the ref. - Defaults to `git.GITLAB_DEFAULT_MASTER`. + Defaults to `git.GITLAB_DEFAULT_REF`. instance (str): The name of the instance. Defaults to `git.GITLAB_DEFAULT_INSTANCE`. """ @@ -130,7 +130,7 @@ def _bitbucket( repo = "%s/%s/%s" % (instance, workspace, repo), dir = "%s/%s/%s/src/%s{/dir}" % (instance, workspace, repo, ref), file = "%s/%s/%s/src/%s{/dir}/{file}#{file}-{line}" % - (instance, user, repo, ref), + (instance, workspace, repo, ref), ) _GITILES_DEFAULT_REF = "master" diff --git a/pkg/config/lib/hg/hg.go b/pkg/config/lib/hg/hg.go index d06e5aa..edba44a 100644 --- a/pkg/config/lib/hg/hg.go +++ b/pkg/config/lib/hg/hg.go @@ -2,7 +2,7 @@ package hg import ( _ "embed" - "go.nc0.fr/svgu/pkg/config" + "go.nc0.fr/svgu/pkg/config/lib/prelude" "go.starlark.net/starlark" "go.starlark.net/starlarkstruct" "sync" @@ -21,7 +21,7 @@ func LoadHgModule(t *starlark.Thread) (starlark.StringDict, error) { once.Do(func() { env := starlark.StringDict{ "module": starlark.NewBuiltin("module", - config.InternModule), + prelude.InternModule), "make_module": starlark.NewBuiltin("mod", starlarkstruct.MakeModule), } diff --git a/pkg/config/lib/prelude/prelude.go b/pkg/config/lib/prelude/prelude.go new file mode 100644 index 0000000..c1e42f4 --- /dev/null +++ b/pkg/config/lib/prelude/prelude.go @@ -0,0 +1,93 @@ +package prelude + +import ( + "fmt" + "go.nc0.fr/svgu/pkg/types" + "go.starlark.net/starlark" + "strings" +) + +// https://stackoverflow.com/questions/1976007/what-characters-are-forbidden-in-windows-and-linux-directory-names +const invalidName string = "..\\/<>:\"|?* \t\n\r\b\findex" + +// Registered represents the index of registered modules. +var Registered types.Index + +// InternIndex represents the built-in function "index". +// index(domain) initializes a new index with the given domain. +func InternIndex(_ *starlark.Thread, _ *starlark.Builtin, args starlark.Tuple, + kwargs []starlark.Tuple) (starlark.Value, error) { + var domain string + if err := starlark.UnpackArgs("index", args, kwargs, + "domain", &domain); err != nil { + return nil, err + } + + Registered.SetDomain(domain) + + return starlark.None, nil +} + +// InternModule represents the built-in function "module". +// module(name, vcs, repo, dir, file) registers a new module into the +// index. +func InternModule(_ *starlark.Thread, _ *starlark.Builtin, args starlark.Tuple, + kwargs []starlark.Tuple) (starlark.Value, error) { + + var name, vcs, repo, dir, file string + if err := starlark.UnpackArgs("module", args, kwargs, "name", + &name, "vcs", &vcs, "repo", &repo, "dir", &dir, "file", &file); err != nil { + return nil, err + } + + if Registered.Domain == "" { + return nil, fmt.Errorf("index not initialized") + } + + if name == "" { + return nil, fmt.Errorf("module name cannot be empty") + } + + if vcs == "" { + return nil, fmt.Errorf("module %q vcs cannot be empty", name) + } + + if repo == "" { + return nil, fmt.Errorf("module %q repo cannot be empty", name) + } + + // Check for name conditions. + if strings.Contains(invalidName, name) { + return nil, fmt.Errorf("module %q name is invalid", name) + } + + if Registered.CheckModule(name) { + return nil, fmt.Errorf("module %q already exists", name) + } + + var v types.Vcs + switch vcs { + case "git": + v = types.VcsGit + case "hg": + v = types.VcsMercurial + case "svn": + v = types.VcsSubversion + case "fossil": + v = types.VcsFossil + case "bzr": + v = types.VcsBazaar + default: + return nil, fmt.Errorf("unknown vcs %q", vcs) + } + + Registered.AddModule(name, types.Module{ + Path: name, + Vcs: v, + Repo: repo, + Dir: dir, + File: file, + }) + + return starlark.None, nil +} diff --git a/pkg/config/lib/svn/svn.go b/pkg/config/lib/svn/svn.go index 6d71259..d68f3ec 100644 --- a/pkg/config/lib/svn/svn.go +++ b/pkg/config/lib/svn/svn.go @@ -2,7 +2,7 @@ package svn import ( _ "embed" - "go.nc0.fr/svgu/pkg/config" + "go.nc0.fr/svgu/pkg/config/lib/prelude" "go.starlark.net/starlark" "go.starlark.net/starlarkstruct" "sync" @@ -21,7 +21,7 @@ func LoadSvnModule(t *starlark.Thread) (starlark.StringDict, error) { once.Do(func() { env := starlark.StringDict{ "module": starlark.NewBuiltin("module", - config.InternModule), + prelude.InternModule), "make_module": starlark.NewBuiltin("mod", starlarkstruct.MakeModule), } diff --git a/pkg/config/starlark.go b/pkg/config/starlark.go index a954e92..d739a4a 100644 --- a/pkg/config/starlark.go +++ b/pkg/config/starlark.go @@ -6,17 +6,12 @@ import ( "go.nc0.fr/svgu/pkg/config/lib/fossil" "go.nc0.fr/svgu/pkg/config/lib/git" "go.nc0.fr/svgu/pkg/config/lib/hg" + "go.nc0.fr/svgu/pkg/config/lib/prelude" "go.nc0.fr/svgu/pkg/config/lib/svn" "go.nc0.fr/svgu/pkg/types" "go.starlark.net/starlark" - "strings" ) -// https://stackoverflow.com/questions/1976007/what-characters-are-forbidden-in-windows-and-linux-directory-names -const invalidName string = "..\\/<>:\"|?* \t\n\r\b\findex" - -var registered types.Index - // ExecConfig configures the Starlark environment and executes the given // configuration file "fl". // The function returns a list of registered modules, or an error if something @@ -29,113 +24,35 @@ func ExecConfig(fl string) (*types.Index, error) { // TODO(nc0): add built-ins env := starlark.StringDict{ - "index": starlark.NewBuiltin("index", InternIndex), - "module": starlark.NewBuiltin("module", InternModule), + "index": starlark.NewBuiltin("index", prelude.InternIndex), + "module": starlark.NewBuiltin("module", prelude.InternModule), } - registered = types.Index{} + prelude.Registered = types.Index{ + Domain: "", + Modules: make(map[string]types.Module), + } if _, err := starlark.ExecFile(th, fl, nil, env); err != nil { return &types.Index{}, err } - return ®istered, nil + return &prelude.Registered, nil } // load loads a module from the given path. func load(t *starlark.Thread, module string) (starlark.StringDict, error) { switch module { - case "git.star": // git + case "@svgu/git.star": // git return git.LoadGitModule(t) - case "hg.star": // mercurial + case "@svgu/hg.star": // mercurial return hg.LoadHgModule(t) - case "svn.star": // subversion + case "@svgu/svn.star": // subversion return svn.LoadSvnModule(t) - case "fossil.star": // fossil + case "@svgu/fossil.star": // fossil return fossil.LoadFossilModule(t) - case "bzr.star": // bazaar + case "@svgu/bzr.star": // bazaar return bzr.LoadBzrModule(t) default: return nil, fmt.Errorf("unknown module %q", module) } } - -// Injected built-ins. - -// InternIndex represents the built-in function "index". -// index(domain) initializes a new index with the given domain. -func InternIndex(_ *starlark.Thread, _ *starlark.Builtin, args starlark.Tuple, - kwargs []starlark.Tuple) (starlark.Value, error) { - var domain string - if err := starlark.UnpackArgs("index", args, kwargs, - "domain", &domain); err != nil { - return nil, err - } - - registered.SetDomain(domain) - - return starlark.None, nil -} - -// InternModule represents the built-in function "module". -// module(name, vcs, repo, dir, file) registers a new module into the -// index. -func InternModule(_ *starlark.Thread, _ *starlark.Builtin, args starlark.Tuple, - kwargs []starlark.Tuple) (starlark.Value, error) { - - var name, vcs, repo, dir, file string - if err := starlark.UnpackArgs("module", args, kwargs, "name", - &name, "vcs", &vcs, "repo", &repo, "dir", &dir, "file", &file); err != nil { - return nil, err - } - - if registered.Domain == "" { - return nil, fmt.Errorf("index not initialized") - } - - if name == "" { - return nil, fmt.Errorf("module name cannot be empty") - } - - if vcs == "" { - return nil, fmt.Errorf("module %q vcs cannot be empty", name) - } - - if repo == "" { - return nil, fmt.Errorf("module %q repo cannot be empty", name) - } - - // Check for name conditions. - if strings.Contains(invalidName, name) { - return nil, fmt.Errorf("module %q name is invalid", name) - } - - if registered.CheckModule(name) { - return nil, fmt.Errorf("module %q already exists", name) - } - - var v types.Vcs - switch vcs { - case "git": - v = types.VcsGit - case "hg": - v = types.VcsMercurial - case "svn": - v = types.VcsSubversion - case "fossil": - v = types.VcsFossil - case "bzr": - v = types.VcsBazaar - default: - return nil, fmt.Errorf("unknown vcs %q", vcs) - } - - registered.AddModule(name, types.Module{ - Path: name, - Vcs: v, - Repo: repo, - Dir: dir, - File: file, - }) - - return starlark.None, nil -} -- cgit v1.2.3