From 3e287db1f9e9b0b64608232deaf28f96b32c049d Mon Sep 17 00:00:00 2001 From: Matthias Bertschy Date: Fri, 19 Jan 2024 22:11:41 +0100 Subject: [PATCH] remove libgit files and dependencies Signed-off-by: Matthias Bertschy --- .gitmodules | 3 - .golangci.yml | 3 - Makefile | 26 +--- build.ps1 | 78 ----------- build.py | 97 ------------- build/Dockerfile.dockerignore | 1 - build/kubescape-cli.Dockerfile.dockerignore | 1 - cmd/version/git_native_disabled.go | 7 - cmd/version/git_native_enabled.go | 7 - cmd/version/version.go | 2 - core/cautils/git_native_disabled.go | 2 - core/cautils/git_native_enabled.go | 146 -------------------- core/cautils/localgitrepository.go | 5 +- git2go | 1 - go.mod | 3 - go.sum | 2 - httphandler/go.mod | 3 - httphandler/go.sum | 2 - 18 files changed, 6 insertions(+), 383 deletions(-) delete mode 100644 .gitmodules delete mode 100644 build.ps1 delete mode 100644 build.py delete mode 100644 cmd/version/git_native_disabled.go delete mode 100644 cmd/version/git_native_enabled.go delete mode 100644 core/cautils/git_native_enabled.go delete mode 160000 git2go diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 0cda0556..00000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "git2go"] - path = git2go - url = https://github.com/libgit2/git2go.git diff --git a/.golangci.yml b/.golangci.yml index 7503c25a..37a098d0 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -52,6 +52,3 @@ issues: - linters: - stylecheck text: "ST1003" -run: - skip-dirs: - - git2go diff --git a/Makefile b/Makefile index 33eda247..42dc40ac 100644 --- a/Makefile +++ b/Makefile @@ -1,28 +1,12 @@ -.PHONY: test all build libgit2 +.PHONY: test all build # default task invoked while running make -all: libgit2 build +all: build -export CGO_ENABLED=1 - -# build and install libgit2 -libgit2: - -git submodule update --init --recursive - cd git2go; make install-static - -# build and install libgit2 for macOS m1 -libgit2arm64: - git submodule update --init --recursive - if [ "$(shell uname -s)" = "Darwin" ]; then \ - sed -i '' 's/cmake -D/cmake -DCMAKE_OSX_ARCHITECTURES="arm64" -D/' git2go/script/build-libgit2.sh; \ - fi - cd git2go; make install-static - -# go build tags -TAGS = "gitenabled,static" +export CGO_ENABLED=0 build: - go build -v -tags=$(TAGS) . + go build -v . test: - go test -v -tags=$(TAGS) ./... + go test -v ./... diff --git a/build.ps1 b/build.ps1 deleted file mode 100644 index 7b4e0fa7..00000000 --- a/build.ps1 +++ /dev/null @@ -1,78 +0,0 @@ -# Defining input params -param ( - [string]$mode = "error" -) - -# Function to install MSYS -function Install { - Write-Host "Starting install..." -ForegroundColor Cyan - - # Check to see if already installed - if (Test-Path "C:\MSYS64\") { - Write-Host "MSYS2 already installed" -ForegroundColor Green - } else { - # Create a temp directory - New-Item -Path "$PSScriptRoot\temp_install" -ItemType Directory > $null - - # Download MSYS - Write-Host "Downloading MSYS2..." -ForegroundColor Cyan - $bitsJobObj = Start-BitsTransfer "https://github.com/msys2/msys2-installer/releases/download/2022-06-03/msys2-x86_64-20220603.exe" -Destination "$PSScriptRoot\temp_install\msys2-x86_64-20220603.exe" - switch ($bitsJobObj.JobState) { - "Transferred" { - Complete-BitsTransfer -BitsJob $bitsJobObj - break - } - "Error" { - throw "Error downloading" - } - } - Write-Host "MSYS2 download complete" -ForegroundColor Green - - # Install MSYS - Write-Host "Installing MSYS2..." -ForegroundColor Cyan - Start-Process -Filepath "$PSScriptRoot\temp_install\msys2-x86_64-20220603.exe" -ArgumentList @("install", "--root", "C:\MSYS64", "--confirm-command") -Wait - Write-Host "MSYS2 install complete" -ForegroundColor Green - - # Remove temp directory - Remove-Item "$PSScriptRoot\temp_install" -Recurse - } - - # Set PATH - $env:Path = "C:\MSYS64\mingw64\bin;C:\MSYS64\usr\bin;" + $env:Path - - # Install MSYS packages - Write-Host "Installing MSYS2 packages..." -ForegroundColor Cyan - Start-Process -Filepath "pacman" -ArgumentList @("-S", "--needed", "--noconfirm", "make") -Wait - Start-Process -Filepath "pacman" -ArgumentList @("-S", "--needed", "--noconfirm", "mingw-w64-x86_64-cmake") -Wait - Start-Process -Filepath "pacman" -ArgumentList @("-S", "--needed", "--noconfirm", "mingw-w64-x86_64-gcc") -Wait - Start-Process -Filepath "pacman" -ArgumentList @("-S", "--needed", "--noconfirm", "mingw-w64-x86_64-pkg-config") -Wait - Start-Process -Filepath "pacman" -ArgumentList @("-S", "--needed", "--noconfirm", "msys2-w32api-runtime") -Wait - Write-Host "MSYS2 packages install complete" -ForegroundColor Green - - Write-Host "Install complete" -ForegroundColor Green -} - -# Function to build libgit2 -function Build { - Write-Host "Starting build..." -ForegroundColor Cyan - - # Set PATH - $env:Path = "C:\MSYS64\mingw64\bin;C:\MSYS64\usr\bin;" + $env:Path - - # Build - Start-Process -Filepath "make" -ArgumentList @("libgit2") -Wait -NoNewWindow - - Write-Host "Build complete" -ForegroundColor Green -} - -# Check user call mode -if ($mode -eq "all") { - Install - Build -} elseif ($mode -eq "install") { - Install -} elseif ($mode -eq "build") { - Build -} else { - Write-Host "Error: -mode should be one of (all|install|build)" -ForegroundColor Red -} \ No newline at end of file diff --git a/build.py b/build.py deleted file mode 100644 index 93d422ec..00000000 --- a/build.py +++ /dev/null @@ -1,97 +0,0 @@ -import os -import sys -import hashlib -import platform -import subprocess -import tarfile - -BASE_GETTER_CONST = "github.com/kubescape/kubescape/v3/core/cautils/getter" -CURRENT_PLATFORM = platform.system() - -platformSuffixes = { - "Windows": "windows-latest", - "Linux": "ubuntu-latest", - "Darwin": "macos-latest", -} - -def check_status(status, msg): - if status != 0: - sys.stderr.write(msg) - exit(status) - - -def get_build_dir(): - return "build" - - -def get_package_name(): - if CURRENT_PLATFORM not in platformSuffixes: raise OSError("Platform %s is not supported!" % (CURRENT_PLATFORM)) - - # # TODO: kubescape-windows-latest is deprecated and should be removed - # if CURRENT_PLATFORM == "Windows": return "kubescape.exe" - - package_name = "kubescape-" - if os.getenv("GOARCH"): - package_name += os.getenv("GOARCH") + "-" - return package_name + platformSuffixes[CURRENT_PLATFORM] - - -def main(): - print("Building Kubescape") - - # Set some variables - package_name = get_package_name() - build_url = "github.com/kubescape/kubescape/v3/core/cautils.BuildNumber" - release_version = os.getenv("RELEASE") - - client_var = "github.com/kubescape/kubescape/v3/core/cautils.Client" - client_name = os.getenv("CLIENT") - - # Create build directory - build_dir = get_build_dir() - - ks_file = os.path.join(build_dir, package_name) - hash_file = ks_file + ".sha256" - tar_file = ks_file + ".tar.gz" - - if not os.path.isdir(build_dir): - os.makedirs(build_dir) - - # Build kubescape - ldflags = "-w -s" - if release_version: - ldflags += " -X {}={}".format(build_url, release_version) - if client_name: - ldflags += " -X {}={}".format(client_var, client_name) - - build_command = ["go", "build", "-buildmode=pie", "-tags=static,gitenabled", "-o", ks_file, "-ldflags" ,ldflags] - if CURRENT_PLATFORM == "Windows": - os.putenv("CGO_ENABLED", "0") - build_command = ["go", "build", "-o", ks_file, "-ldflags", ldflags] - - print("Building kubescape and saving here: {}".format(ks_file)) - print("Build command: {}".format(" ".join(build_command))) - - status = subprocess.call(build_command) - check_status(status, "Failed to build kubescape") - - sha256 = hashlib.sha256() - with open(ks_file, "rb") as kube: - sha256.update(kube.read()) - with open(hash_file, "w") as kube_sha: - hash = sha256.hexdigest() - print("kubescape hash: {}, file: {}".format(hash, hash_file)) - kube_sha.write(sha256.hexdigest()) - - with tarfile.open(tar_file, 'w:gz') as archive: - name = "kubescape" - if CURRENT_PLATFORM == "Windows": - name += ".exe" - archive.add(ks_file, name) - archive.add("LICENSE", "LICENSE") - - print("Build Done") - - -if __name__ == "__main__": - main() diff --git a/build/Dockerfile.dockerignore b/build/Dockerfile.dockerignore index ecd99964..22eb96e5 100644 --- a/build/Dockerfile.dockerignore +++ b/build/Dockerfile.dockerignore @@ -1,3 +1,2 @@ .git -git2go kubescape* diff --git a/build/kubescape-cli.Dockerfile.dockerignore b/build/kubescape-cli.Dockerfile.dockerignore index 01146cf4..6b8710a7 100644 --- a/build/kubescape-cli.Dockerfile.dockerignore +++ b/build/kubescape-cli.Dockerfile.dockerignore @@ -1,2 +1 @@ .git -git2go diff --git a/cmd/version/git_native_disabled.go b/cmd/version/git_native_disabled.go deleted file mode 100644 index c0c9bd29..00000000 --- a/cmd/version/git_native_disabled.go +++ /dev/null @@ -1,7 +0,0 @@ -//go:build !gitenabled - -package version - -func isGitEnabled() bool { - return false -} diff --git a/cmd/version/git_native_enabled.go b/cmd/version/git_native_enabled.go deleted file mode 100644 index 518404f9..00000000 --- a/cmd/version/git_native_enabled.go +++ /dev/null @@ -1,7 +0,0 @@ -//go:build gitenabled - -package version - -func isGitEnabled() bool { - return true -} diff --git a/cmd/version/version.go b/cmd/version/version.go index e61ac8d2..597949b7 100644 --- a/cmd/version/version.go +++ b/cmd/version/version.go @@ -4,7 +4,6 @@ import ( "context" "fmt" - "github.com/kubescape/go-logger" "github.com/kubescape/kubescape/v3/core/cautils" "github.com/spf13/cobra" ) @@ -23,7 +22,6 @@ func GetVersionCmd() *cobra.Command { "Your current version is: %s\n", versionCheckRequest.ClientVersion, ) - logger.L().Debug(fmt.Sprintf("git enabled in build: %t", isGitEnabled())) return nil }, } diff --git a/core/cautils/git_native_disabled.go b/core/cautils/git_native_disabled.go index 5727b914..2493979e 100644 --- a/core/cautils/git_native_disabled.go +++ b/core/cautils/git_native_disabled.go @@ -1,5 +1,3 @@ -//go:build !gitenabled - package cautils import ( diff --git a/core/cautils/git_native_enabled.go b/core/cautils/git_native_enabled.go deleted file mode 100644 index 10523359..00000000 --- a/core/cautils/git_native_enabled.go +++ /dev/null @@ -1,146 +0,0 @@ -//go:build gitenabled - -package cautils - -import ( - "fmt" - "time" - - "github.com/kubescape/go-git-url/apis" - git2go "github.com/libgit2/git2go/v33" -) - -type gitRepository struct { - git2GoRepo *git2go.Repository - fileToLastCommit map[string]*git2go.Commit -} - -func newGitRepository(root string) (*gitRepository, error) { - git2GoRepo, err := git2go.OpenRepository(root) - if err != nil { - return nil, err - } - - return &gitRepository{ - git2GoRepo: git2GoRepo, - }, nil -} - -func (g *gitRepository) GetFileLastCommit(filePath string) (*apis.Commit, error) { - if len(g.fileToLastCommit) == 0 { - g.buildCommitMap() - } - - if relevantCommit, exists := g.fileToLastCommit[filePath]; exists { - return g.getCommit(relevantCommit), nil - } - - return nil, fmt.Errorf("failed to get commit information for file: %s", filePath) -} - -func (g *gitRepository) buildCommitMap() { - filePathToCommitTime := map[string]time.Time{} - filePathToCommit := map[string]*git2go.Commit{} - allCommits, _ := g.getAllCommits() - - // builds a map of all files to their last commit - for _, commit := range allCommits { - // Ignore merge commits (2+ parents) - if commit.ParentCount() <= 1 { - tree, err := commit.Tree() - if err != nil { - continue - } - - // ParentCount can be either 1 or 0 (initial commit) - // In case it's the initial commit, prevTree is nil - var prevTree *git2go.Tree - if commit.ParentCount() == 1 { - prevCommit := commit.Parent(0) - prevTree, err = prevCommit.Tree() - if err != nil { - continue - } - } - - diff, err := g.git2GoRepo.DiffTreeToTree(prevTree, tree, nil) - if err != nil { - continue - } - - numDeltas, err := diff.NumDeltas() - if err != nil { - continue - } - - for i := 0; i < numDeltas; i++ { - delta, err := diff.Delta(i) - if err != nil { - continue - } - - deltaFilePath := delta.NewFile.Path - commitTime := commit.Author().When - - // In case we have the commit information for the file which is not the latest - we override it - if currentCommitTime, exists := filePathToCommitTime[deltaFilePath]; exists { - if currentCommitTime.Before(commitTime) { - filePathToCommitTime[deltaFilePath] = commitTime - filePathToCommit[deltaFilePath] = commit - } - } else { - filePathToCommitTime[deltaFilePath] = commitTime - filePathToCommit[deltaFilePath] = commit - } - } - } - } - - g.fileToLastCommit = filePathToCommit -} - -func (g *gitRepository) getAllCommits() ([]*git2go.Commit, error) { - logItr, itrErr := g.git2GoRepo.Walk() - if itrErr != nil { - - return nil, itrErr - } - - pushErr := logItr.PushHead() - if pushErr != nil { - return nil, pushErr - } - - var allCommits []*git2go.Commit - err := logItr.Iterate(func(commit *git2go.Commit) bool { - if commit != nil { - allCommits = append(allCommits, commit) - return true - } - return false - }) - - if err != nil { - return nil, err - } - - if err != nil { - return nil, err - } - - return allCommits, nil -} - -func (g *gitRepository) getCommit(commit *git2go.Commit) *apis.Commit { - return &apis.Commit{ - SHA: commit.Id().String(), - Author: apis.Committer{ - Name: commit.Author().Name, - Email: commit.Author().Email, - Date: commit.Author().When, - }, - Message: commit.Message(), - Committer: apis.Committer{}, - Files: []apis.Files{}, - } -} diff --git a/core/cautils/localgitrepository.go b/core/cautils/localgitrepository.go index 23080e29..60f06c75 100644 --- a/core/cautils/localgitrepository.go +++ b/core/cautils/localgitrepository.go @@ -1,7 +1,6 @@ package cautils import ( - "errors" "fmt" "path" "strings" @@ -19,8 +18,6 @@ type LocalGitRepository struct { config *configv5.Config } -var ErrWarnNotSupportedByBuild = errors.New(`git commits retrieval not supported by this build. Build with tag "gitenabled" to enable the full git scan feature`) - func NewLocalGitRepository(path string) (*LocalGitRepository, error) { goGitRepo, err := gitv5.PlainOpenWithOptions(path, &gitv5.PlainOpenOptions{DetectDotGit: true}) if err != nil { @@ -53,7 +50,7 @@ func NewLocalGitRepository(path string) (*LocalGitRepository, error) { if repoRoot, err := l.GetRootDir(); err == nil { gitRepository, err := newGitRepository(repoRoot) - if err != nil && !errors.Is(err, ErrWarnNotSupportedByBuild) { + if err != nil { return l, err } diff --git a/git2go b/git2go deleted file mode 160000 index eae00773..00000000 --- a/git2go +++ /dev/null @@ -1 +0,0 @@ -Subproject commit eae00773cce87d5282a8ac7c10b5c1961ee6f9cb diff --git a/go.mod b/go.mod index 84d643ad..c0558fb3 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,6 @@ require ( github.com/kubescape/opa-utils v0.0.273 github.com/kubescape/rbac-utils v0.0.21-0.20230806101615-07e36f555520 github.com/kubescape/regolibrary v1.0.300 - github.com/libgit2/git2go/v33 v33.0.9 github.com/maruel/natural v1.1.1 github.com/matthyx/go-gitlog v0.0.0-20231005131906-9ffabe3c5bcd github.com/mattn/go-isatty v0.0.19 @@ -448,8 +447,6 @@ require ( sigs.k8s.io/yaml v1.3.0 // indirect ) -replace github.com/libgit2/git2go/v33 => ./git2go - replace ( // Using the forked version of tablewriter github.com/olekukonko/tablewriter => github.com/kubescape/tablewriter v0.0.6-0.20231106230230-aac7d2659c94 diff --git a/go.sum b/go.sum index 737021be..f07def0a 100644 --- a/go.sum +++ b/go.sum @@ -2062,7 +2062,6 @@ golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -2309,7 +2308,6 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201005172224-997123666555/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/httphandler/go.mod b/httphandler/go.mod index f4116636..4e841644 100644 --- a/httphandler/go.mod +++ b/httphandler/go.mod @@ -276,7 +276,6 @@ require ( github.com/kylelemons/godebug v1.1.0 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/letsencrypt/boulder v0.0.0-20221109233200-85aa52084eaf // indirect - github.com/libgit2/git2go/v33 v33.0.9 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/maruel/natural v1.1.1 // indirect @@ -457,8 +456,6 @@ require ( sigs.k8s.io/yaml v1.3.0 // indirect ) -replace github.com/libgit2/git2go/v33 => ../git2go - replace ( // Using the forked version of tablewriter github.com/olekukonko/tablewriter => github.com/kubescape/tablewriter v0.0.6-0.20230907094812-c8c737a432a6 diff --git a/httphandler/go.sum b/httphandler/go.sum index 37955397..48a9d83c 100644 --- a/httphandler/go.sum +++ b/httphandler/go.sum @@ -2068,7 +2068,6 @@ golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -2315,7 +2314,6 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201005172224-997123666555/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=