@@ -23,13 +23,22 @@ import (
2323 "github.com/mholt/archiver/v3"
2424)
2525
26+ // Arch Linux Packages
27+ // https://man.archlinux.org/man/PKGBUILD.5
28+
2629const (
27- PropertyDescription = "arch.description"
28- PropertySignature = "arch.signature"
30+ PropertyDescription = "arch.description"
31+ PropertySignature = "arch.signature"
32+ PropertyCompressedSize = "arch.compsize"
33+ PropertyInstalledSize = "arch.inssize"
34+ PropertySHA256 = "arch.sha256"
35+ PropertyBuildDate = "arch.builddate"
36+ PropertyPackager = "arch.packager"
37+ PropertyArch = "arch.architecture"
38+ PropertyDistribution = "arch.distribution"
2939)
3040
3141var (
32- // https://man.archlinux.org/man/PKGBUILD.5
3342 reName = regexp .MustCompile (`^[a-zA-Z0-9@._+-]+$` )
3443 reVer = regexp .MustCompile (`^[a-zA-Z0-9:_.+]+-+[0-9]+$` )
3544 reOptDep = regexp .MustCompile (`^[a-zA-Z0-9@._+-]+$|^[a-zA-Z0-9@._+-]+(:.*)` )
3847
3948type Package struct {
4049 Name string `json:"name"`
41- Version string `json:"version"`
50+ Version string `json:"version"` // Includes version, release and epoch
4251 VersionMetadata VersionMetadata
4352 FileMetadata FileMetadata
4453}
@@ -56,23 +65,25 @@ type VersionMetadata struct {
5665 OptDepends []string `json:"opt_depends,omitempty"`
5766 MakeDepends []string `json:"make_depends,omitempty"`
5867 CheckDepends []string `json:"check_depends,omitempty"`
68+ Conflicts []string `json:"conflicts,omitempty"`
69+ Replaces []string `json:"replaces,omitempty"`
5970 Backup []string `json:"backup,omitempty"`
71+ Xdata []string `json:"xdata,omitempty"`
6072}
6173
6274// Metadata related to specific pakcage file.
6375// This metadata might vary for different architecture and distribution.
6476type FileMetadata struct {
6577 CompressedSize int64 `json:"compressed_size"`
6678 InstalledSize int64 `json:"installed_size"`
67- MD5 string `json:"md5"`
6879 SHA256 string `json:"sha256"`
6980 BuildDate int64 `json:"build_date"`
7081 Packager string `json:"packager"`
7182 Arch string `json:"arch"`
7283}
7384
7485// Function that receives arch package archive data and returns it's metadata.
75- func ParsePackage (r io.Reader , md5 , sha256 []byte , size int64 ) (* Package , error ) {
86+ func ParsePackage (r io.Reader , sha256 []byte , size int64 ) (* Package , error ) {
7687 zstd := archiver .NewTarZstd ()
7788 err := zstd .Open (r , 0 )
7889 if err != nil {
@@ -114,7 +125,6 @@ func ParsePackage(r io.Reader, md5, sha256 []byte, size int64) (*Package, error)
114125
115126 pkg .FileMetadata .CompressedSize = size
116127 pkg .FileMetadata .SHA256 = hex .EncodeToString (sha256 )
117- pkg .FileMetadata .MD5 = hex .EncodeToString (md5 )
118128
119129 return pkg , nil
120130}
@@ -171,6 +181,12 @@ func ParsePackageInfo(r io.Reader) (*Package, error) {
171181 p .VersionMetadata .Backup = append (p .VersionMetadata .Backup , value )
172182 case "group" :
173183 p .VersionMetadata .Groups = append (p .VersionMetadata .Groups , value )
184+ case "conflict" :
185+ p .VersionMetadata .Conflicts = append (p .VersionMetadata .Conflicts , value )
186+ case "replaces" :
187+ p .VersionMetadata .Replaces = append (p .VersionMetadata .Replaces , value )
188+ case "xdata" :
189+ p .VersionMetadata .Xdata = append (p .VersionMetadata .Xdata , value )
174190 case "builddate" :
175191 bd , err := strconv .ParseInt (value , 10 , 64 )
176192 if err != nil {
@@ -183,6 +199,8 @@ func ParsePackageInfo(r io.Reader) (*Package, error) {
183199 return nil , err
184200 }
185201 p .FileMetadata .InstalledSize = is
202+ default :
203+ return nil , util .NewInvalidArgumentErrorf ("property is not supported %s" , key )
186204 }
187205 }
188206
@@ -228,6 +246,21 @@ func ValidatePackageSpec(p *Package) error {
228246 return util .NewInvalidArgumentErrorf ("invalid provides: " + p )
229247 }
230248 }
249+ for _ , p := range p .VersionMetadata .Conflicts {
250+ if ! rePkgVer .MatchString (p ) {
251+ return util .NewInvalidArgumentErrorf ("invalid conflicts: " + p )
252+ }
253+ }
254+ for _ , p := range p .VersionMetadata .Replaces {
255+ if ! rePkgVer .MatchString (p ) {
256+ return util .NewInvalidArgumentErrorf ("invalid replaces: " + p )
257+ }
258+ }
259+ for _ , p := range p .VersionMetadata .Replaces {
260+ if ! rePkgVer .MatchString (p ) {
261+ return util .NewInvalidArgumentErrorf ("invalid xdata: " + p )
262+ }
263+ }
231264 for _ , od := range p .VersionMetadata .OptDepends {
232265 if ! reOptDep .MatchString (od ) {
233266 return util .NewInvalidArgumentErrorf ("invalid optional dependency: " + od )
@@ -243,7 +276,7 @@ func ValidatePackageSpec(p *Package) error {
243276
244277// Create pacman package description file.
245278func (p * Package ) Desc () string {
246- entries := [40 ]string {
279+ entries := [44 ]string {
247280 "FILENAME" , fmt .Sprintf ("%s-%s-%s.pkg.tar.zst" , p .Name , p .Version , p .FileMetadata .Arch ),
248281 "NAME" , p .Name ,
249282 "BASE" , p .VersionMetadata .Base ,
@@ -252,13 +285,14 @@ func (p *Package) Desc() string {
252285 "GROUPS" , strings .Join (p .VersionMetadata .Groups , "\n " ),
253286 "CSIZE" , fmt .Sprintf ("%d" , p .FileMetadata .CompressedSize ),
254287 "ISIZE" , fmt .Sprintf ("%d" , p .FileMetadata .InstalledSize ),
255- "MD5SUM" , p .FileMetadata .MD5 ,
256288 "SHA256SUM" , p .FileMetadata .SHA256 ,
257289 "URL" , p .VersionMetadata .ProjectURL ,
258290 "LICENSE" , strings .Join (p .VersionMetadata .License , "\n " ),
259291 "ARCH" , p .FileMetadata .Arch ,
260292 "BUILDDATE" , fmt .Sprintf ("%d" , p .FileMetadata .BuildDate ),
261293 "PACKAGER" , p .FileMetadata .Packager ,
294+ "REPLACES" , strings .Join (p .VersionMetadata .Replaces , "\n " ),
295+ "CONFLICTS" , strings .Join (p .VersionMetadata .Conflicts , "\n " ),
262296 "PROVIDES" , strings .Join (p .VersionMetadata .Provides , "\n " ),
263297 "DEPENDS" , strings .Join (p .VersionMetadata .Depends , "\n " ),
264298 "OPTDEPENDS" , strings .Join (p .VersionMetadata .OptDepends , "\n " ),
0 commit comments