hello world! 🌸
This commit is contained in:
commit
4b582e6c48
31
.gitignore
vendored
Normal file
31
.gitignore
vendored
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
# ---> Go
|
||||||
|
# If you prefer the allow list template instead of the deny list, see community template:
|
||||||
|
# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
|
||||||
|
#
|
||||||
|
# Binaries for programs and plugins
|
||||||
|
*.exe
|
||||||
|
*.exe~
|
||||||
|
*.dll
|
||||||
|
*.so
|
||||||
|
*.dylib
|
||||||
|
|
||||||
|
# Test binary, built with `go test -c`
|
||||||
|
*.test
|
||||||
|
|
||||||
|
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||||
|
*.out
|
||||||
|
|
||||||
|
# Dependency directories (remove the comment below to include it)
|
||||||
|
# vendor/
|
||||||
|
|
||||||
|
# Go workspace file
|
||||||
|
go.work
|
||||||
|
go.work.sum
|
||||||
|
|
||||||
|
# env file
|
||||||
|
.env
|
||||||
|
|
||||||
|
.idea/material_theme_project_new.xml
|
||||||
|
build/**/*
|
||||||
|
.idea/workspace.xml
|
||||||
|
.idea/vcs.xml
|
9
.idea/gopack-internal.iml
Normal file
9
.idea/gopack-internal.iml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="WEB_MODULE" version="4">
|
||||||
|
<component name="Go" enabled="true" />
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$" />
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
15
.idea/inspectionProfiles/Project_Default.xml
Normal file
15
.idea/inspectionProfiles/Project_Default.xml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<profile version="1.0">
|
||||||
|
<option name="myName" value="Project Default" />
|
||||||
|
<inspection_tool class="GoErrorStringFormat" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
|
||||||
|
<inspection_tool class="GoSwitchMissingCasesForIotaConsts" enabled="true" level="WEAK WARNING" enabled_by_default="true" editorAttributes="INFO_ATTRIBUTES" />
|
||||||
|
<inspection_tool class="GoUnhandledErrorResult" enabled="true" level="WEAK WARNING" enabled_by_default="true" editorAttributes="INFO_ATTRIBUTES" />
|
||||||
|
<inspection_tool class="GrazieInspection" enabled="false" level="GRAMMAR_ERROR" enabled_by_default="false" />
|
||||||
|
<inspection_tool class="LanguageDetectionInspection" enabled="false" level="WARNING" enabled_by_default="false" />
|
||||||
|
<inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
|
||||||
|
<option name="processCode" value="true" />
|
||||||
|
<option name="processLiterals" value="true" />
|
||||||
|
<option name="processComments" value="true" />
|
||||||
|
</inspection_tool>
|
||||||
|
</profile>
|
||||||
|
</component>
|
8
.idea/modules.xml
Normal file
8
.idea/modules.xml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/gopack-internal.iml" filepath="$PROJECT_DIR$/.idea/gopack-internal.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
9
README.md
Normal file
9
README.md
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# gopack
|
||||||
|
|
||||||
|
internal utility to create zip files from go module directories
|
||||||
|
|
||||||
|
## usage
|
||||||
|
|
||||||
|
```
|
||||||
|
gopack PACKAGE-NAME VERSION PATH [COMMA-SEPARATED-EXCLUSION-GLOBS]
|
||||||
|
```
|
8
go.mod
Normal file
8
go.mod
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
module rockfic.com/gopack
|
||||||
|
|
||||||
|
go 1.23.0
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/bmatcuk/doublestar/v4 v4.6.1 // indirect
|
||||||
|
golang.org/x/mod v0.21.0 // indirect
|
||||||
|
)
|
4
go.sum
Normal file
4
go.sum
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
github.com/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I=
|
||||||
|
github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
|
||||||
|
golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
|
||||||
|
golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
141
main.go
Normal file
141
main.go
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"github.com/bmatcuk/doublestar/v4"
|
||||||
|
"golang.org/x/mod/module"
|
||||||
|
"golang.org/x/mod/zip"
|
||||||
|
"io"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
"path/filepath"
|
||||||
|
"slices"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type dirFile struct {
|
||||||
|
filePath, slashPath string
|
||||||
|
info os.FileInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f dirFile) Path() string { return f.slashPath }
|
||||||
|
func (f dirFile) Lstat() (os.FileInfo, error) { return f.info, nil }
|
||||||
|
func (f dirFile) Open() (io.ReadCloser, error) { return os.Open(f.filePath) }
|
||||||
|
|
||||||
|
func parseGitignore(wd string) []string {
|
||||||
|
f := make([]string, 0)
|
||||||
|
file, err := os.ReadFile(path.Join(wd, ".gitignore"))
|
||||||
|
if err == nil {
|
||||||
|
str := bytes.NewBuffer(file).String()
|
||||||
|
for _, rline := range strings.Split(str, "\n") {
|
||||||
|
line := strings.TrimSpace(rline)
|
||||||
|
if line == "" || strings.HasPrefix(line, "#") || strings.HasPrefix(line, "!") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if strings.HasPrefix(line, "*") {
|
||||||
|
f = append(f, line)
|
||||||
|
f = append(f, fmt.Sprintf("**/%s", line))
|
||||||
|
} else if strings.HasSuffix(line, "/") {
|
||||||
|
f = append(f, fmt.Sprintf("%s/**", line))
|
||||||
|
f = append(f, fmt.Sprintf("%s/**/*", line))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println(f)
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
|
||||||
|
func doWalk(wd string, exGlobs []string) []zip.File {
|
||||||
|
f := make([]zip.File, 0)
|
||||||
|
filepath.Walk(wd, func(p string, info os.FileInfo, err error) error {
|
||||||
|
slashed := filepath.ToSlash(p)
|
||||||
|
rel, _ := filepath.Rel(wd, slashed)
|
||||||
|
rel = filepath.ToSlash(rel)
|
||||||
|
if info.IsDir() {
|
||||||
|
if p == wd {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
switch filepath.Base(p) {
|
||||||
|
case ".git", ".bzr", ".svn", ".hg":
|
||||||
|
return filepath.SkipDir
|
||||||
|
}
|
||||||
|
if goModInfo, err := os.Lstat(filepath.Join(p, "go.mod")); err == nil && !goModInfo.IsDir() {
|
||||||
|
return filepath.SkipDir
|
||||||
|
}
|
||||||
|
for _, pat := range exGlobs {
|
||||||
|
|
||||||
|
ok, _ := doublestar.Match(pat, rel)
|
||||||
|
if ok {
|
||||||
|
return filepath.SkipDir
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if !info.Mode().IsRegular() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
ok, err := doublestar.Match(fmt.Sprintf("{%s}", strings.Join(exGlobs, ",")), rel)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
|
if !slices.Contains(maps(f, func(t zip.File) string {
|
||||||
|
return t.Path()
|
||||||
|
}), slashed) {
|
||||||
|
f = append(f, dirFile{
|
||||||
|
filePath: p,
|
||||||
|
info: info,
|
||||||
|
slashPath: rel,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
|
||||||
|
func maps[T any, R any](slice []T, fn func(t T) R) []R {
|
||||||
|
ret := make([]R, 0)
|
||||||
|
for _, e := range slice {
|
||||||
|
ret = append(ret, fn(e))
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
args := os.Args[1:]
|
||||||
|
if len(args) < 3 {
|
||||||
|
log.Fatal("usage: PACKAGE-NAME VERSION PATH [EXCLUSION-GLOBS...]")
|
||||||
|
}
|
||||||
|
version := args[1]
|
||||||
|
if !strings.HasPrefix(version, "v") {
|
||||||
|
version = fmt.Sprintf("v%s", version)
|
||||||
|
}
|
||||||
|
|
||||||
|
var absPath string
|
||||||
|
absPath, _ = filepath.Abs(args[2])
|
||||||
|
excludeGlobs := make([]string, 0)
|
||||||
|
excludeGlobs = append(excludeGlobs, ".*/*", "build/**")
|
||||||
|
excludeGlobs = append(excludeGlobs, parseGitignore(absPath)...)
|
||||||
|
if len(args) >= 4 {
|
||||||
|
excludeGlobs = append(excludeGlobs, args[3:]...)
|
||||||
|
}
|
||||||
|
|
||||||
|
buildFile := fmt.Sprintf(filepath.Join(absPath, "build", "%s.zip"), version)
|
||||||
|
walked := doWalk(absPath, excludeGlobs)
|
||||||
|
_ = os.Remove(buildFile)
|
||||||
|
f, _ := os.Create(buildFile)
|
||||||
|
err := zip.Create(f, module.Version{
|
||||||
|
Version: version,
|
||||||
|
Path: args[0],
|
||||||
|
}, walked)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user