aboutsummaryrefslogtreecommitdiff
path: root/internal/slackware_com/package.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/slackware_com/package.go')
-rw-r--r--internal/slackware_com/package.go111
1 files changed, 111 insertions, 0 deletions
diff --git a/internal/slackware_com/package.go b/internal/slackware_com/package.go
new file mode 100644
index 0000000..8868af8
--- /dev/null
+++ b/internal/slackware_com/package.go
@@ -0,0 +1,111 @@
+package slackware_com
+
+import (
+ "errors"
+ "fmt"
+ "path"
+ "strconv"
+ "strings"
+ "unicode"
+)
+
+func VerifyPackageFile(filePath string, ascFilePath string) (bool, error) {
+ return true, nil
+}
+
+type PackageName struct {
+ Application string
+ Version string
+ Arch string
+ Build int
+ Tag string
+}
+
+func parseBuildTag(str string) (int, string, error) {
+ runes := []rune(str)
+
+ var v []rune
+ for _, r := range runes {
+ if !unicode.IsDigit(r) {
+ break
+ }
+ v = append(v, r)
+ }
+ build, err := strconv.Atoi(string(v))
+ if err != nil {
+ return 0, "", fmt.Errorf("build number: %w", err)
+ }
+
+ return build, str[len(v):], err
+}
+
+func NewPackageName(name string) (PackageName, error) {
+ strs := strings.Split(name, "-")
+ if len(strs) < 4 {
+ return PackageName{}, fmt.Errorf("badly formatted package name '%s'", name)
+ }
+
+ build, tag, err := parseBuildTag(strs[len(strs)-1])
+ if err != nil {
+ return PackageName{}, err
+ }
+
+ return PackageName{
+ Application: strings.Join(strs[:len(strs)-3], "-"),
+ Version: strs[len(strs)-3],
+ Arch: strs[len(strs)-2],
+ Build: build,
+ Tag: tag,
+ }, nil
+}
+
+func MustPackageName(name string) PackageName {
+ pkg, err := NewPackageName(name)
+ if err != nil {
+ panic(err)
+ }
+ return pkg
+}
+
+func NewPackageNameFromPath(filePath string) (PackageName, error) {
+ fileName := path.Base(filePath)
+ str, ok := strings.CutSuffix(fileName, path.Ext(fileName))
+ if !ok {
+ return PackageName{}, errors.New("file extension missing")
+ }
+ return NewPackageName(str)
+}
+
+func IsPackage(filePath string) bool {
+ ext := path.Ext(filePath)
+ switch ext {
+ case ".tbz", ".tgz", ".tlz", ".txz":
+ return true
+ default:
+ return false
+ }
+}
+
+func (p *PackageName) String() string {
+ return fmt.Sprintf("%s-%s-%s-%d%s", p.Application, p.Version, p.Arch, p.Build, p.Tag)
+}
+
+func (p *PackageName) AppplicationVersion() string {
+ return fmt.Sprintf("%s-%s", p.Application, p.Version)
+}
+
+// PackageNamePattern is the shorthand string used to specify a package.
+type PackageNamePattern string
+
+func MustPackageNamePattern(name string) PackageNamePattern {
+ return PackageNamePattern(name)
+}
+
+func (p *PackageNamePattern) IsMatch(pkg PackageName) bool {
+ return p.String() == pkg.Application ||
+ p.String() == fmt.Sprintf("%s-%s", pkg.Application, pkg.Version)
+}
+
+func (p *PackageNamePattern) String() string {
+ return string(*p)
+}