aboutsummaryrefslogtreecommitdiff
path: root/internal/slackware_com/package.go
blob: 8868af88d189b1872e334ff1332a8f0c03da4d4e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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)
}