diff options
Diffstat (limited to 'internal/slackware_com/package.go')
-rw-r--r-- | internal/slackware_com/package.go | 111 |
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) +} |