From 2c051112b07f83d6ae70cdc7bc135bdf4b633008 Mon Sep 17 00:00:00 2001 From: ggbiktashev Date: Tue, 16 Jul 2024 19:18:46 +0500 Subject: [PATCH 1/3] Add support for MkDocs markdown format. Differentiate a repository management system from the markdown syntax --- cmd/gomarkdoc/command.go | 27 +++ format/mkdocs.go | 139 +++++++++++++++ format/mkdocs_test.go | 243 +++++++++++++++++++++++++++ format/repo_format/bitbucket.go | 50 ++++++ format/repo_format/bitbucket_test.go | 74 ++++++++ format/repo_format/github.go | 50 ++++++ format/repo_format/github_test.go | 74 ++++++++ format/repo_format/repo_format.go | 16 ++ go.mod | 17 +- go.sum | 47 +++--- lang/config.go | 13 ++ 11 files changed, 721 insertions(+), 29 deletions(-) create mode 100644 format/mkdocs.go create mode 100644 format/mkdocs_test.go create mode 100644 format/repo_format/bitbucket.go create mode 100644 format/repo_format/bitbucket_test.go create mode 100644 format/repo_format/github.go create mode 100644 format/repo_format/github_test.go create mode 100644 format/repo_format/repo_format.go diff --git a/cmd/gomarkdoc/command.go b/cmd/gomarkdoc/command.go index 77d73a0..df4ef68 100644 --- a/cmd/gomarkdoc/command.go +++ b/cmd/gomarkdoc/command.go @@ -18,9 +18,11 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" + "github.com/thediveo/enumflag/v2" "github.com/princjef/gomarkdoc" "github.com/princjef/gomarkdoc/format" + "github.com/princjef/gomarkdoc/format/repo_format" "github.com/princjef/gomarkdoc/lang" "github.com/princjef/gomarkdoc/logger" ) @@ -62,6 +64,11 @@ type commandOptions struct { version bool } +var RepoTypeIds = map[lang.RepoType][]string{ + lang.GitHubRepoType: {"github"}, + lang.BitBucketRepoType: {"bitbucket"}, +} + // Flags populated by goreleaser var version = "" @@ -98,6 +105,7 @@ func buildCommand() *cobra.Command { opts.footerFile = viper.GetString("footerFile") opts.tags = viper.GetStringSlice("tags") opts.excludeDirs = viper.GetStringSlice("excludeDirs") + opts.repository.Type = lang.RepoType(viper.GetInt("repository.type")) opts.repository.Remote = viper.GetString("repository.url") opts.repository.DefaultBranch = viper.GetString("repository.defaultBranch") opts.repository.PathFromRoot = viper.GetString("repository.path") @@ -217,6 +225,17 @@ func buildCommand() *cobra.Command { "", "Manual override for the git repository URL used in place of automatic detection.", ) + + repoTypeIds := make([]string, len(RepoTypeIds)) + for i, repoTypeId := range RepoTypeIds { + // works because of iota in lang.RepoType consts + repoTypeIds[i] = repoTypeId[0] + } + command.Flags().Var( + enumflag.New(&opts.repository.Type, "mode", RepoTypeIds, enumflag.EnumCaseInsensitive), + "repository.type", + fmt.Sprintf("Specifies the repository management system type: could be one of %v", repoTypeIds)) + command.Flags().StringVar( &opts.repository.DefaultBranch, "repository.default-branch", @@ -250,6 +269,7 @@ func buildCommand() *cobra.Command { _ = viper.BindPFlag("footerFile", command.Flags().Lookup("footer-file")) _ = viper.BindPFlag("tags", command.Flags().Lookup("tags")) _ = viper.BindPFlag("excludeDirs", command.Flags().Lookup("exclude-dirs")) + _ = viper.BindPFlag("repository.type", command.Flags().Lookup("repository.type")) _ = viper.BindPFlag("repository.url", command.Flags().Lookup("repository.url")) _ = viper.BindPFlag("repository.defaultBranch", command.Flags().Lookup("repository.default-branch")) _ = viper.BindPFlag("repository.path", command.Flags().Lookup("repository.path")) @@ -372,6 +392,13 @@ func resolveOverrides(opts commandOptions) ([]gomarkdoc.RendererOption, error) { f = &format.AzureDevOpsMarkdown{} case "plain": f = &format.PlainMarkdown{} + case "mkdocs": + f = &format.MkDocsMarkdown{ + RepoFormats: []repo_format.RepoFormat{ + repo_format.GitHubRepoFormat{}, + repo_format.BitBucketRepoFormat{}, + }, + } default: return nil, fmt.Errorf("gomarkdoc: invalid format: %s", opts.format) } diff --git a/format/mkdocs.go b/format/mkdocs.go new file mode 100644 index 0000000..b60bbde --- /dev/null +++ b/format/mkdocs.go @@ -0,0 +1,139 @@ +package format + +import ( + "fmt" + "regexp" + "strings" + + "github.com/princjef/gomarkdoc/format/formatcore" + "github.com/princjef/gomarkdoc/format/repo_format" + "github.com/princjef/gomarkdoc/lang" +) + +// MkDocsMarkdown provides a Format which is compatible with BitBucket +// Markdown's syntax and semantics +type MkDocsMarkdown struct { + RepoFormats []repo_format.RepoFormat +} + +// Bold converts the provided text to bold +func (f *MkDocsMarkdown) Bold(text string) (string, error) { + return formatcore.Bold(text), nil +} + +// CodeBlock wraps the provided code as a code block and tags it with the +// provided language (or no language if the empty string is provided). +func (f *MkDocsMarkdown) CodeBlock(language, code string) (string, error) { + return formatcore.GFMCodeBlock(language, code), nil +} + +// Anchor produces an anchor for the provided link. +func (f *MkDocsMarkdown) Anchor(anchor string) string { + return formatcore.Anchor(anchor) +} + +// AnchorHeader converts the provided text and custom anchor link into a header +// of the provided level. The level is expected to be at least 1. +func (f *MkDocsMarkdown) AnchorHeader(level int, text, anchor string) (string, error) { + return formatcore.AnchorHeader(level, f.Escape(text), anchor) +} + +// Header converts the provided text into a header of the provided level. The +// level is expected to be at least 1. +func (f *MkDocsMarkdown) Header(level int, text string) (string, error) { + return formatcore.Header(level, f.Escape(text)) +} + +// RawAnchorHeader converts the provided text and custom anchor link into a +// header of the provided level without escaping the header text. The level is +// expected to be at least 1. +func (f *MkDocsMarkdown) RawAnchorHeader(level int, text, anchor string) (string, error) { + return formatcore.AnchorHeader(level, text, anchor) +} + +// RawHeader converts the provided text into a header of the provided level +// without escaping the header text. The level is expected to be at least 1. +func (f *MkDocsMarkdown) RawHeader(level int, text string) (string, error) { + return formatcore.Header(level, text) +} + +var ( + mkDocsWhitespaceRegex = regexp.MustCompile(`\s`) + mkDocsRemoveRegex = regexp.MustCompile(`[^\pL-_\d]+`) +) + +// LocalHref generates an href for navigating to a header with the given +// headerText located within the same document as the href itself. +func (f *MkDocsMarkdown) LocalHref(headerText string) (string, error) { + result := formatcore.PlainText(headerText) + result = strings.ToLower(result) + result = strings.TrimSpace(result) + result = mkDocsWhitespaceRegex.ReplaceAllString(result, "-") + result = mkDocsRemoveRegex.ReplaceAllString(result, "") + + return fmt.Sprintf("#%s", result), nil +} + +// RawLocalHref generates an href within the same document but with a direct +// link provided instead of text to slugify. +func (f *MkDocsMarkdown) RawLocalHref(anchor string) string { + return fmt.Sprintf("#%s", anchor) +} + +// Link generates a link with the given text and href values. +func (f *MkDocsMarkdown) Link(text, href string) (string, error) { + return formatcore.Link(text, href), nil +} + +// CodeHref generates an href to the provided code entry. +func (f *MkDocsMarkdown) CodeHref(loc lang.Location) (string, error) { + // If there's no repo, we can't compute an href + if loc.Repo == nil { + return "", nil + } + + for _, repoFormat := range f.RepoFormats { + if repoFormat.Supports(loc.Repo.Type) { + return repoFormat.CodeHref(loc) + } + } + + // if there is no any supported repo format + return "", nil +} + +// ListEntry generates an unordered list entry with the provided text at the +// provided zero-indexed depth. A depth of 0 is considered the topmost level of +// list. +func (f *MkDocsMarkdown) ListEntry(depth int, text string) (string, error) { + return formatcore.ListEntry(depth, text), nil +} + +// Accordion generates a collapsible content. The accordion's visible title +// while collapsed is the provided title and the expanded content is the body. +func (f *MkDocsMarkdown) Accordion(title, body string) (string, error) { + return formatcore.GFMAccordion(title, body), nil +} + +// AccordionHeader generates the header visible when an accordion is collapsed. +// +// The AccordionHeader is expected to be used in conjunction with +// AccordionTerminator() when the demands of the body's rendering requires it to +// be generated independently. The result looks conceptually like the following: +// +// accordion := format.AccordionHeader("Accordion Title") + "Accordion Body" + format.AccordionTerminator() +func (f *MkDocsMarkdown) AccordionHeader(title string) (string, error) { + return formatcore.GFMAccordionHeader(title), nil +} + +// AccordionTerminator generates the code necessary to terminate an accordion +// after the body. It is expected to be used in conjunction with +// AccordionHeader(). See AccordionHeader for a full description. +func (f *MkDocsMarkdown) AccordionTerminator() (string, error) { + return formatcore.GFMAccordionTerminator(), nil +} + +// Escape escapes special markdown characters from the provided text. +func (f *MkDocsMarkdown) Escape(text string) string { + return formatcore.Escape(text) +} diff --git a/format/mkdocs_test.go b/format/mkdocs_test.go new file mode 100644 index 0000000..68b5f2f --- /dev/null +++ b/format/mkdocs_test.go @@ -0,0 +1,243 @@ +package format_test + +import ( + "fmt" + "path/filepath" + "testing" + + "github.com/matryer/is" + + "github.com/princjef/gomarkdoc/format" + "github.com/princjef/gomarkdoc/format/repo_format" + "github.com/princjef/gomarkdoc/lang" +) + +func TestMkDocsMarkdown_Bold(t *testing.T) { + is := is.New(t) + + var f format.MkDocsMarkdown + res, err := f.Bold("sample text") + is.NoErr(err) + is.Equal(res, "**sample text**") +} + +func TestMkDocsMarkdown_CodeBlock(t *testing.T) { + is := is.New(t) + + var f format.MkDocsMarkdown + res, err := f.CodeBlock("go", "Line 1\nLine 2") + is.NoErr(err) + is.Equal(res, "```go\nLine 1\nLine 2\n```") +} + +func TestMkDocsMarkdown_CodeBlock_noLanguage(t *testing.T) { + is := is.New(t) + + var f format.MkDocsMarkdown + res, err := f.CodeBlock("", "Line 1\nLine 2") + is.NoErr(err) + is.Equal(res, "```\nLine 1\nLine 2\n```") +} + +func TestMkDocsMarkdown_Header(t *testing.T) { + tests := []struct { + text string + level int + result string + }{ + {"header text", 1, "# header text"}, + {"level 2", 2, "## level 2"}, + {"level 3", 3, "### level 3"}, + {"level 4", 4, "#### level 4"}, + {"level 5", 5, "##### level 5"}, + {"level 6", 6, "###### level 6"}, + {"other level", 12, "###### other level"}, + {"with * escape", 2, "## with \\* escape"}, + } + + for _, test := range tests { + t.Run(fmt.Sprintf("%s (level %d)", test.text, test.level), func(t *testing.T) { + is := is.New(t) + + var f format.MkDocsMarkdown + res, err := f.Header(test.level, test.text) + is.NoErr(err) + is.Equal(res, test.result) + }) + } +} + +func TestMkDocsMarkdown_Header_invalidLevel(t *testing.T) { + is := is.New(t) + + var f format.MkDocsMarkdown + _, err := f.Header(-1, "invalid") + is.Equal(err.Error(), "format: header level cannot be less than 1") +} + +func TestMkDocsMarkdown_RawHeader(t *testing.T) { + tests := []struct { + text string + level int + result string + }{ + {"header text", 1, "# header text"}, + {"with * escape", 2, "## with * escape"}, + } + + for _, test := range tests { + t.Run(fmt.Sprintf("%s (level %d)", test.text, test.level), func(t *testing.T) { + is := is.New(t) + + var f format.MkDocsMarkdown + res, err := f.RawHeader(test.level, test.text) + is.NoErr(err) + is.Equal(res, test.result) + }) + } +} + +func TestMkDocsMarkdown_LocalHref(t *testing.T) { + tests := map[string]string{ + "Normal Header": "#normal-header", + " Leading whitespace": "#leading-whitespace", + "Multiple whitespace": "#multiple--whitespace", + "Special(#)%^Characters": "#specialcharacters", + "With:colon": "#withcolon", + } + + for input, output := range tests { + t.Run(input, func(t *testing.T) { + is := is.New(t) + + var f format.MkDocsMarkdown + res, err := f.LocalHref(input) + is.NoErr(err) + is.Equal(res, output) + }) + } +} + +type mockRepoFormat struct { + t lang.RepoType + r string +} + +func (m *mockRepoFormat) CodeHref(loc lang.Location) (string, error) { + return m.r, nil +} + +func (m *mockRepoFormat) Supports(repoType lang.RepoType) bool { + return m.t == repoType +} + +func TestMkDocsMarkdown_CodeHref(t *testing.T) { + tests := []struct { + name string + repoType lang.RepoType + result string + }{ + { + name: "github", + repoType: lang.GitHubRepoType, + result: "from github", + }, + { + name: "bitbucket", + repoType: lang.BitBucketRepoType, + result: "from bitbucket", + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + is := is.New(t) + + wd, err := filepath.Abs(".") + is.NoErr(err) + locPath := filepath.Join(wd, "subdir", "file.go") + + f := &format.MkDocsMarkdown{ + RepoFormats: []repo_format.RepoFormat{ + &mockRepoFormat{ + t: lang.GitHubRepoType, + r: "from github", + }, + &mockRepoFormat{ + t: lang.BitBucketRepoType, + r: "from bitbucket", + }, + }, + } + res, err := f.CodeHref(lang.Location{ + Start: lang.Position{Line: 12, Col: 1}, + End: lang.Position{Line: 14, Col: 43}, + Filepath: locPath, + WorkDir: wd, + Repo: &lang.Repo{ + Type: test.repoType, + Remote: "https://dev.azure.com/org/project/_git/repo", + DefaultBranch: "master", + PathFromRoot: "/", + }, + }) + is.NoErr(err) + is.Equal(res, test.result) + }) + } +} + +func TestMkDocsMarkdown_CodeHref_noRepo(t *testing.T) { + is := is.New(t) + + wd, err := filepath.Abs(".") + is.NoErr(err) + locPath := filepath.Join(wd, "subdir", "file.go") + + var f format.MkDocsMarkdown + res, err := f.CodeHref(lang.Location{ + Start: lang.Position{Line: 12, Col: 1}, + End: lang.Position{Line: 14, Col: 43}, + Filepath: locPath, + WorkDir: wd, + Repo: nil, + }) + is.NoErr(err) + is.Equal(res, "") +} + +func TestMkDocsMarkdown_Link(t *testing.T) { + is := is.New(t) + + var f format.MkDocsMarkdown + res, err := f.Link("link text", "https://test.com/a/b/c") + is.NoErr(err) + is.Equal(res, "[link text]()") +} + +func TestMkDocsMarkdown_ListEntry(t *testing.T) { + is := is.New(t) + + var f format.MkDocsMarkdown + res, err := f.ListEntry(0, "list entry text") + is.NoErr(err) + is.Equal(res, "- list entry text") +} + +func TestMkDocsMarkdown_ListEntry_nested(t *testing.T) { + is := is.New(t) + + var f format.MkDocsMarkdown + res, err := f.ListEntry(2, "nested text") + is.NoErr(err) + is.Equal(res, " - nested text") +} + +func TestMkDocsMarkdown_ListEntry_empty(t *testing.T) { + is := is.New(t) + + var f format.MkDocsMarkdown + res, err := f.ListEntry(0, "") + is.NoErr(err) + is.Equal(res, "") +} diff --git a/format/repo_format/bitbucket.go b/format/repo_format/bitbucket.go new file mode 100644 index 0000000..7ef380f --- /dev/null +++ b/format/repo_format/bitbucket.go @@ -0,0 +1,50 @@ +package repo_format + +import ( + "fmt" + "path/filepath" + + "github.com/princjef/gomarkdoc/lang" +) + +type BitBucketRepoFormat struct{} + +func (b BitBucketRepoFormat) CodeHref(loc lang.Location) (string, error) { + var ( + relative string + err error + ) + if filepath.IsAbs(loc.Filepath) { + relative, err = filepath.Rel(loc.WorkDir, loc.Filepath) + if err != nil { + return "", err + } + } else { + relative = loc.Filepath + } + + full := filepath.Join(loc.Repo.PathFromRoot, relative) + p, err := filepath.Rel(string(filepath.Separator), full) + if err != nil { + return "", err + } + + var locStr string + if loc.Start.Line == loc.End.Line { + locStr = fmt.Sprintf("%d", loc.Start.Line) + } else { + locStr = fmt.Sprintf("%d-%d", loc.Start.Line, loc.End.Line) + } + + return fmt.Sprintf( + "%s/browse/%s?at=refs%%2Fheads%%2F%s#%s", + loc.Repo.Remote, + filepath.ToSlash(p), + loc.Repo.DefaultBranch, + locStr, + ), nil +} + +func (b BitBucketRepoFormat) Supports(repoType lang.RepoType) bool { + return repoType == lang.BitBucketRepoType +} diff --git a/format/repo_format/bitbucket_test.go b/format/repo_format/bitbucket_test.go new file mode 100644 index 0000000..42e57f6 --- /dev/null +++ b/format/repo_format/bitbucket_test.go @@ -0,0 +1,74 @@ +package repo_format + +import ( + "testing" + + "github.com/matryer/is" + + "github.com/princjef/gomarkdoc/lang" +) + +func TestBitBucketRepoFormat_CodeHref(t *testing.T) { + tests := []struct { + name string + location lang.Location + href string + err error + }{ + { + name: "concrete_location", + location: lang.Location{ + Start: lang.Position{ + Col: 8, + Line: 15, + }, + End: lang.Position{ + Col: 60, + Line: 15, + }, + Filepath: "/some/path/to/workdir/file.go", + WorkDir: "/some/path/to/workdir", + Repo: &lang.Repo{ + Type: lang.BitBucketRepoType, + Remote: "https://some.bitbucket.repo.com/user/repo", + DefaultBranch: "master", + PathFromRoot: "/path/to/sources", + }, + }, + href: "https://some.bitbucket.repo.com/user/repo/browse/path/to/sources/file.go?at=refs%2Fheads%2Fmaster#15", + err: nil, + }, + { + name: "range", + location: lang.Location{ + Start: lang.Position{ + Col: 8, + Line: 15, + }, + End: lang.Position{ + Col: 60, + Line: 20, + }, + Filepath: "/some/path/to/workdir/file.go", + WorkDir: "/some/path/to/workdir", + Repo: &lang.Repo{ + Type: lang.BitBucketRepoType, + Remote: "https://some.bitbucket.repo.com/user/repo", + DefaultBranch: "main", + PathFromRoot: "/", + }, + }, + href: "https://some.bitbucket.repo.com/user/repo/browse/file.go?at=refs%2Fheads%2Fmain#15-20", + err: nil, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + is := is.New(t) + format := BitBucketRepoFormat{} + href, err := format.CodeHref(test.location) + is.NoErr(err) + is.Equal(test.href, href) + }) + } +} diff --git a/format/repo_format/github.go b/format/repo_format/github.go new file mode 100644 index 0000000..119d272 --- /dev/null +++ b/format/repo_format/github.go @@ -0,0 +1,50 @@ +package repo_format + +import ( + "fmt" + "path/filepath" + + "github.com/princjef/gomarkdoc/lang" +) + +type GitHubRepoFormat struct{} + +func (g GitHubRepoFormat) CodeHref(loc lang.Location) (string, error) { + var ( + relative string + err error + ) + if filepath.IsAbs(loc.Filepath) { + relative, err = filepath.Rel(loc.WorkDir, loc.Filepath) + if err != nil { + return "", err + } + } else { + relative = loc.Filepath + } + + full := filepath.Join(loc.Repo.PathFromRoot, relative) + p, err := filepath.Rel(string(filepath.Separator), full) + if err != nil { + return "", err + } + + var locStr string + if loc.Start.Line == loc.End.Line { + locStr = fmt.Sprintf("L%d", loc.Start.Line) + } else { + locStr = fmt.Sprintf("L%d-L%d", loc.Start.Line, loc.End.Line) + } + + return fmt.Sprintf( + "%s/blob/%s/%s#%s", + loc.Repo.Remote, + loc.Repo.DefaultBranch, + filepath.ToSlash(p), + locStr, + ), nil +} + +func (g GitHubRepoFormat) Supports(repoType lang.RepoType) bool { + return repoType == lang.GitHubRepoType +} diff --git a/format/repo_format/github_test.go b/format/repo_format/github_test.go new file mode 100644 index 0000000..3fd5231 --- /dev/null +++ b/format/repo_format/github_test.go @@ -0,0 +1,74 @@ +package repo_format + +import ( + "testing" + + "github.com/matryer/is" + + "github.com/princjef/gomarkdoc/lang" +) + +func TestGitHubRepoFormat_CodeHref(t *testing.T) { + tests := []struct { + name string + location lang.Location + href string + err error + }{ + { + name: "concrete_location", + location: lang.Location{ + Start: lang.Position{ + Col: 8, + Line: 15, + }, + End: lang.Position{ + Col: 60, + Line: 15, + }, + Filepath: "/some/path/to/workdir/file.go", + WorkDir: "/some/path/to/workdir", + Repo: &lang.Repo{ + Type: lang.GitHubRepoType, + Remote: "https://some.git.repo.com/user/repo", + DefaultBranch: "master", + PathFromRoot: "/path/to/sources", + }, + }, + href: "https://some.git.repo.com/user/repo/blob/master/path/to/sources/file.go#L15", + err: nil, + }, + { + name: "range", + location: lang.Location{ + Start: lang.Position{ + Col: 8, + Line: 15, + }, + End: lang.Position{ + Col: 60, + Line: 20, + }, + Filepath: "/some/path/to/workdir/file.go", + WorkDir: "/some/path/to/workdir", + Repo: &lang.Repo{ + Type: lang.GitHubRepoType, + Remote: "https://some.git.repo.com/user/repo", + DefaultBranch: "main", + PathFromRoot: "/", + }, + }, + href: "https://some.git.repo.com/user/repo/blob/main/file.go#L15-L20", + err: nil, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + is := is.New(t) + format := GitHubRepoFormat{} + href, err := format.CodeHref(test.location) + is.NoErr(err) + is.Equal(test.href, href) + }) + } +} diff --git a/format/repo_format/repo_format.go b/format/repo_format/repo_format.go new file mode 100644 index 0000000..c138823 --- /dev/null +++ b/format/repo_format/repo_format.go @@ -0,0 +1,16 @@ +package repo_format + +import "github.com/princjef/gomarkdoc/lang" + +// RepoFormat represent the format of concrete repository management system (RMS for short). +// Because different RMSs follow different rules (e.g., the URL pattern), we need to differentiate them +// from the Markdown rendering software to generate correct RMS related stuff +type RepoFormat interface { + // CodeHref returns a formatted URL to the specified [lang.Location] + // + // It's guaranteed that [RepoFormat.Supports](loc.Repo.Type) is true + CodeHref(loc lang.Location) (string, error) + + // Supports determines whether this [RepoFormat] supports specified [lang.RepoType] + Supports(repoType lang.RepoType) bool +} diff --git a/go.mod b/go.mod index c9ad264..786c283 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,7 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.7.0 github.com/spf13/viper v1.16.0 + github.com/thediveo/enumflag/v2 v2.0.5 github.com/x-cray/logrus-prefixed-formatter v0.5.2 mvdan.cc/xurls/v2 v2.5.0 ) @@ -42,7 +43,6 @@ require ( github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/onsi/ginkgo v1.14.2 // indirect - github.com/onsi/gomega v1.10.3 // indirect github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/rivo/uniseg v0.4.4 // indirect @@ -53,13 +53,14 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.4.2 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect - golang.org/x/crypto v0.10.0 // indirect - golang.org/x/mod v0.11.0 // indirect - golang.org/x/net v0.11.0 // indirect - golang.org/x/sys v0.9.0 // indirect - golang.org/x/term v0.9.0 // indirect - golang.org/x/text v0.10.0 // indirect - golang.org/x/tools v0.10.0 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect + golang.org/x/mod v0.13.0 // indirect + golang.org/x/net v0.17.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/term v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect + golang.org/x/tools v0.14.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index ef1d56d..5ee581c 100644 --- a/go.sum +++ b/go.sum @@ -99,6 +99,8 @@ github.com/go-git/go-git/v5 v5.7.0/go.mod h1:coJHKEOk5kUClpsNlXrUvPrDxY3w3gjHvhc github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -137,7 +139,7 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -151,6 +153,7 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -215,10 +218,10 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M= github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= -github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= +github.com/onsi/gomega v1.28.1 h1:MijcGUbfYuznzK/5R4CPNoUP/9Xvuo20sXfEm6XxoTA= github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= @@ -272,6 +275,9 @@ github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gt github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/thediveo/enumflag/v2 v2.0.5 h1:VJjvlAqUb6m6mxOrB/0tfBJI0Kvi9wJ8ulh38xK87i8= +github.com/thediveo/enumflag/v2 v2.0.5/go.mod h1:0NcG67nYgwwFsAvoQCmezG0J0KaIxZ0f7skg9eLq1DA= +github.com/thediveo/success v1.0.1 h1:NVwUOwKUwaN8szjkJ+vsiM2L3sNBFscldoDJ2g2tAPg= github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= @@ -298,8 +304,8 @@ golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= -golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -310,6 +316,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -335,8 +343,8 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= +golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -365,7 +373,6 @@ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -376,8 +383,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU= -golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -399,7 +406,7 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -455,15 +462,15 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28= -golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= +golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -475,8 +482,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= -golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -529,13 +536,12 @@ golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.10.0 h1:tvDr/iQoUqNdohiYm0LmmKcBk+q86lb9EprIUFhHHGg= -golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM= +golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc= +golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -646,7 +652,6 @@ gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRN gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/lang/config.go b/lang/config.go index d2ec6ce..2a23034 100644 --- a/lang/config.go +++ b/lang/config.go @@ -16,6 +16,7 @@ import ( "strings" "github.com/go-git/go-git/v5" + "github.com/princjef/gomarkdoc/logger" ) @@ -34,9 +35,13 @@ type ( Log logger.Logger } + // RepoType is the repository management system type used to browse repository + RepoType int + // Repo represents information about a repository relevant to documentation // generation. Repo struct { + Type RepoType Remote string DefaultBranch string PathFromRoot string @@ -62,6 +67,14 @@ type ( ConfigOption func(c *Config) error ) +// Available [RepoType]'s. GitHubRepoType is the default one +const ( + // GitHubRepoType represent the GitHub repository management system + GitHubRepoType RepoType = iota + // BitBucketRepoType represent the BitBucket repository management system + BitBucketRepoType +) + // NewConfig generates a Config for the provided package directory. It will // resolve the filepath and attempt to determine the repository containing the // directory. If no repository is found, the Repo field will be set to nil. An From 5c5689de43f8c2faebf905c512c653677e482bd5 Mon Sep 17 00:00:00 2001 From: ggbiktashev Date: Tue, 16 Jul 2024 19:20:00 +0500 Subject: [PATCH 2/3] Replace deprecated code --- cmd/gomarkdoc/command.go | 9 ++++----- lang/config.go | 3 +-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/cmd/gomarkdoc/command.go b/cmd/gomarkdoc/command.go index df4ef68..6d3a794 100644 --- a/cmd/gomarkdoc/command.go +++ b/cmd/gomarkdoc/command.go @@ -10,7 +10,6 @@ import ( "hash/fnv" "html/template" "io" - "io/ioutil" "os" "path/filepath" "runtime/debug" @@ -376,7 +375,7 @@ func resolveOverrides(opts commandOptions) ([]gomarkdoc.RendererOption, error) { continue } - b, err := ioutil.ReadFile(f) + b, err := os.ReadFile(f) if err != nil { return nil, fmt.Errorf("gomarkdoc: couldn't resolve template for %s: %w", name, err) } @@ -414,7 +413,7 @@ func resolveHeader(opts commandOptions) (string, error) { } if opts.headerFile != "" { - b, err := ioutil.ReadFile(opts.headerFile) + b, err := os.ReadFile(opts.headerFile) if err != nil { return "", fmt.Errorf("gomarkdoc: couldn't resolve header file: %w", err) } @@ -431,7 +430,7 @@ func resolveFooter(opts commandOptions) (string, error) { } if opts.footerFile != "" { - b, err := ioutil.ReadFile(opts.footerFile) + b, err := os.ReadFile(opts.footerFile) if err != nil { return "", fmt.Errorf("gomarkdoc: couldn't resolve footer file: %w", err) } @@ -558,7 +557,7 @@ func getSpecs(paths ...string) []*PackageSpec { p := e.Value.(string) - files, err := ioutil.ReadDir(p) + files, err := os.ReadDir(p) if err != nil { // If we couldn't read the folder, there are no directories that // we're going to find beneath it diff --git a/lang/config.go b/lang/config.go index 2a23034..d80f0ac 100644 --- a/lang/config.go +++ b/lang/config.go @@ -8,7 +8,6 @@ import ( "go/parser" "go/token" "io" - "io/ioutil" "os" "path" "path/filepath" @@ -385,7 +384,7 @@ func NewLocation(cfg *Config, node ast.Node) Location { } func parsePkgFiles(pkgDir string, fs *token.FileSet) ([]*ast.File, error) { - rawFiles, err := ioutil.ReadDir(pkgDir) + rawFiles, err := os.ReadDir(pkgDir) if err != nil { return nil, fmt.Errorf("gomarkdoc: error reading package dir: %w", err) } From 431a804d5b95e5f9228123e54793bf29ea9a6bf7 Mon Sep 17 00:00:00 2001 From: ggbiktashev Date: Tue, 16 Jul 2024 19:20:48 +0500 Subject: [PATCH 3/3] Fix warning --- format/mkdocs_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/format/mkdocs_test.go b/format/mkdocs_test.go index 68b5f2f..5af5d13 100644 --- a/format/mkdocs_test.go +++ b/format/mkdocs_test.go @@ -123,7 +123,7 @@ type mockRepoFormat struct { r string } -func (m *mockRepoFormat) CodeHref(loc lang.Location) (string, error) { +func (m *mockRepoFormat) CodeHref(_ lang.Location) (string, error) { return m.r, nil }