From e948177cd18754a265f8b1a1a5dfaf71bd673026 Mon Sep 17 00:00:00 2001 From: maze Date: Fri, 29 Sep 2017 01:20:15 +0200 Subject: [PATCH] Split package --- package.go | 336 +-------------------------------------- package_desc.go | 156 ++++++++++++++++++ package_desc_test.go | 186 ++++++++++++++++++++++ package_info.go | 199 +++++++++++++++++++++++ package_info_test.go | 192 +++++++++++++++++++++++ package_test.go | 366 ------------------------------------------- 6 files changed, 737 insertions(+), 698 deletions(-) create mode 100644 package_desc.go create mode 100644 package_desc_test.go create mode 100644 package_info.go create mode 100644 package_info_test.go diff --git a/package.go b/package.go index 61c053d..3da8c07 100644 --- a/package.go +++ b/package.go @@ -1,15 +1,10 @@ package archlinux import ( - "bufio" - "encoding/base64" - "encoding/hex" "encoding/json" "errors" - "fmt" "io" "net/url" - "strconv" "strings" "time" @@ -132,6 +127,9 @@ type Package struct { // Contributors to this package Contributors []string + + // Files is a list of files provided by the package + Files []string } const unknown = "unknown" @@ -221,336 +219,10 @@ func ReadPackage(r io.Reader) (*Package, error) { if err = pkg.readPackageInfo(t); err != nil { return nil, err } - } - } -} - -// ReadPackageInfo reads a package description from a .PKGINFO file -func ReadPackageInfo(r io.Reader) (*Package, error) { - pkg := new(Package) - if n, ok := r.(namer); ok { - pkg.Filename = n.Name() - } - if err := pkg.readPackageInfo(r); err != nil { - return nil, err - } - if pkg.Name == "" { - return nil, ErrNoPackageName - } - if pkg.Version == "" { - return nil, ErrNoPackageVersion - } - if pkg.Release == "" { - return nil, ErrNoPackageRelease - } - return pkg, nil -} - -// ReadPackageDesc reads a package description from a desc file -func ReadPackageDesc(r io.Reader) (*Package, error) { - pkg := new(Package) - if n, ok := r.(namer); ok { - pkg.Filename = n.Name() - } - if err := pkg.readPackageDesc(r); err != nil { - return nil, err - } - if pkg.Name == "" { - return nil, ErrNoPackageName - } - if pkg.Version == "" { - return nil, ErrNoPackageVersion - } - if pkg.Release == "" { - return nil, ErrNoPackageRelease - } - return pkg, nil -} - -func (pkg *Package) readBuildInfo(r io.Reader) (err error) { - s := bufio.NewScanner(r) - for s.Scan() { - if err = s.Err(); err != nil { - if err == io.EOF { - err = nil - } - break - } - - fields := strings.SplitN(s.Text(), " = ", 2) - if len(fields) != 2 { - continue - } - - switch fields[0] { - case "buildenv": - pkg.BuildEnv = append(pkg.BuildEnv, fields[1]) - case "options": - pkg.Options = append(pkg.Options, fields[1]) - } - } - return -} - -func (pkg *Package) readPackageInfo(r io.Reader) (err error) { - s := bufio.NewScanner(r) - for s.Scan() { - if err = s.Err(); err != nil { - if err == io.EOF { - err = nil - } - break - } - - fields := strings.SplitN(s.Text(), " = ", 2) - if len(fields) != 2 { - continue - } - - switch fields[0] { - case "pkgname": - pkg.Name = fields[1] - case "pkgbase": - pkg.Base = fields[1] - case "pkgver": - if i := strings.IndexByte(fields[1], '-'); i != -1 { - pkg.Version, pkg.Release = fields[1][:i], fields[1][i+1:] - } else { - return fmt.Errorf("archlinux: invalid version %q", fields[1]) - } - case "pkgdesc": - pkg.Description = fields[1] - case "url": - if pkg.URL, err = url.Parse(fields[1]); err != nil { - return fmt.Errorf("archlinux: invalid url %q: %v", fields[1], err) - } - case "builddate": - var t int64 - if t, err = strconv.ParseInt(fields[1], 10, 64); err != nil { - return fmt.Errorf("archlinux: invalid build date %q: %v", fields[1], err) - } - pkg.BuildDate = time.Unix(t, 0) - case "packager": - pkg.Packager = fields[1] - case "size": - if pkg.Size, err = strconv.ParseInt(fields[1], 10, 64); err != nil { - return fmt.Errorf("archlinux: invalid size %q: %v", fields[1], err) - } - case "arch": - pkg.Arch = append(pkg.Arch, fields[1]) - case "group": - pkg.Groups = append(pkg.Groups, fields[1]) - case "license": - pkg.License = append(pkg.License, fields[1]) - case "backup": - pkg.Backup = append(pkg.Backup, fields[1]) - case "replaces": - pkg.Replaces = append(pkg.Replaces, fields[1]) - case "depend": - pkg.Depends = append(pkg.Depends, fields[1]) - case "conflict": - pkg.Conflicts = append(pkg.Conflicts, fields[1]) - case "provides": - pkg.Provides = append(pkg.Provides, fields[1]) - case "optdepend": - pkg.OptionalDepends = append(pkg.OptionalDepends, fields[1]) - case "makedepend": - pkg.MakeDepends = append(pkg.MakeDepends, fields[1]) - case "checkdepend": - pkg.CheckDepends = append(pkg.CheckDepends, fields[1]) default: - return fmt.Errorf("archlinux: unknown PKGINFO field %q", fields[0]) + pkg.Files = append(pkg.Files, strings.TrimLeft(h.Name, "/")) } } - return -} - -// WritePackageInfo writes a PKGINFO to the supplied Writer -func (pkg *Package) WritePackageInfo(w io.Writer) error { - var ( - fields = []struct { - Key string - Value interface{} - }{ - {"pkgname", pkg.Name}, - {"pkgbase", pkg.Base}, - {"pkgver", pkg.Version + "-" + pkg.Release}, - {"pkgdesc", pkg.Description}, - {"url", pkg.URL}, - {"builddate", pkg.BuildDate}, - {"packager", pkg.Packager}, - {"size", pkg.Size}, - {"arch", pkg.Arch}, - {"license", pkg.License}, - {"provides", pkg.Provides}, - {"conflicts", pkg.Conflicts}, - {"replaces", pkg.Replaces}, - {"backup", pkg.Backup}, - {"depend", pkg.Depends}, - {"optdepend", pkg.OptionalDepends}, - {"makedepend", pkg.MakeDepends}, - {"checkdepend", pkg.CheckDepends}, - } - err error - ) - if _, err = fmt.Fprintln(w, "# Generated by maze.io/archlinux.v0\n#", time.Now().UTC().Format(time.UnixDate)); err != nil { - return err - } - for _, f := range fields { - switch value := f.Value.(type) { - case string: - if value == "" { - continue - } - if _, err = fmt.Fprintln(w, f.Key, "=", value); err != nil { - return err - } - case []string: - if len(value) > 0 { - for _, v := range value { - if v == "" { - continue - } - if _, err = fmt.Fprintln(w, f.Key, "=", v); err != nil { - return err - } - } - } - case int64: - if value > 0 { - if _, err = fmt.Fprintln(w, f.Key, "=", value); err != nil { - return err - } - } - case *url.URL: - if value == nil { - continue - } - if _, err = fmt.Fprintln(w, f.Key, "=", value.String()); err != nil { - return err - } - } - } - return nil -} - -func (pkg *Package) readPackageDesc(r io.Reader) (err error) { - var ( - s = bufio.NewScanner(r) - line string - lines []string - section string - ) - for s.Scan() { - if err = s.Err(); err != nil { - if err == io.EOF { - err = nil - } - break - } - line = s.Text() - - if len(line) == 0 { - switch section { - case "FILENAME": - pkg.Filename = lines[0] - case "NAME": - pkg.Name = lines[0] - case "BASE": - pkg.Base = lines[0] - case "VERSION": - i := strings.LastIndexByte(lines[0], '-') - if i == -1 { - return fmt.Errorf("archlinux: invalid version %q", lines[0]) - } - pkg.Version, pkg.Release = lines[0][:i], lines[0][i+1:] - case "DESC": - pkg.Description = strings.TrimSpace(strings.Join(lines, "\n")) - case "ARCH": - pkg.Arch = make([]string, len(lines)) - copy(pkg.Arch, lines) - case "LICENSE": - pkg.License = make([]string, len(lines)) - copy(pkg.License, lines) - case "GROUPS": - pkg.Groups = make([]string, len(lines)) - copy(pkg.Groups, lines) - case "CSIZE": - if pkg.CompressedSize, err = strconv.ParseInt(lines[0], 10, 64); err != nil { - return - } - case "ISIZE": - if pkg.Size, err = strconv.ParseInt(lines[0], 10, 64); err != nil { - return - } - case "MD5SUM": - if pkg.MD5, err = hex.DecodeString(lines[0]); err != nil { - return - } - case "SHA1SUM": - if pkg.SHA1, err = hex.DecodeString(lines[0]); err != nil { - return - } - case "SHA256SUM": - if pkg.SHA256, err = hex.DecodeString(lines[0]); err != nil { - return - } - case "SHA384SUM": - if pkg.SHA384, err = hex.DecodeString(lines[0]); err != nil { - return - } - case "SHA512SUM": - if pkg.SHA512, err = hex.DecodeString(lines[0]); err != nil { - return - } - case "PGPSIG": - if pkg.PGPSignature, err = base64.StdEncoding.DecodeString(lines[0]); err != nil { - return - } - case "URL": - if pkg.URL, err = url.Parse(lines[0]); err != nil { - return - } - case "DEPENDS": - pkg.Depends = make([]string, len(lines)) - copy(pkg.Depends, lines) - case "OPTDEPENDS": - pkg.OptionalDepends = make([]string, len(lines)) - copy(pkg.OptionalDepends, lines) - case "MAKEDEPENDS": - pkg.MakeDepends = make([]string, len(lines)) - copy(pkg.MakeDepends, lines) - case "CHECKDEPENDS": - pkg.CheckDepends = make([]string, len(lines)) - copy(pkg.CheckDepends, lines) - case "PROVIDES": - pkg.Provides = make([]string, len(lines)) - copy(pkg.Provides, lines) - case "CONFLICTS": - pkg.Conflicts = make([]string, len(lines)) - copy(pkg.Conflicts, lines) - case "REPLACES": - pkg.Replaces = make([]string, len(lines)) - copy(pkg.Replaces, lines) - case "BUILDDATE": - var i int64 - if i, err = strconv.ParseInt(lines[0], 10, 64); err != nil { - return - } - pkg.BuildDate = time.Unix(i, 0) - case "PACKAGER": - pkg.Packager = lines[0] - default: - return fmt.Errorf("archlinux: unsupported desc section %q", section) - } - } else if line[0] == '%' && line[len(line)-1] == '%' { - section = line[1 : len(line)-1] - lines = lines[:0] - } else { - lines = append(lines, line) - } - } - return } // ParsePackageArchiveName parsea an Arch Linux package archive name diff --git a/package_desc.go b/package_desc.go new file mode 100644 index 0000000..66ebddb --- /dev/null +++ b/package_desc.go @@ -0,0 +1,156 @@ +package archlinux + +import ( + "bufio" + "encoding/base64" + "encoding/hex" + "fmt" + "io" + "net/url" + "strconv" + "strings" + "time" +) + +// ReadPackageDesc reads a package description from a desc file +func ReadPackageDesc(r io.Reader) (*Package, error) { + pkg := new(Package) + if n, ok := r.(namer); ok { + pkg.Filename = n.Name() + } + if err := pkg.readPackageDesc(r); err != nil { + return nil, err + } + if pkg.Name == "" { + return nil, ErrNoPackageName + } + if pkg.Version == "" { + return nil, ErrNoPackageVersion + } + if pkg.Release == "" { + return nil, ErrNoPackageRelease + } + return pkg, nil +} + +func (pkg *Package) readPackageDesc(r io.Reader) (err error) { + var ( + s = bufio.NewScanner(r) + line string + lines []string + section string + ) + for s.Scan() { + if err = s.Err(); err != nil { + if err == io.EOF { + err = nil + } + break + } + line = s.Text() + + if len(line) == 0 { + switch section { + case "FILENAME": + pkg.Filename = lines[0] + case "NAME": + pkg.Name = lines[0] + case "BASE": + pkg.Base = lines[0] + case "VERSION": + i := strings.LastIndexByte(lines[0], '-') + if i == -1 { + return fmt.Errorf("archlinux: invalid version %q", lines[0]) + } + pkg.Version, pkg.Release = lines[0][:i], lines[0][i+1:] + case "DESC": + pkg.Description = strings.TrimSpace(strings.Join(lines, "\n")) + case "ARCH": + pkg.Arch = make([]string, len(lines)) + copy(pkg.Arch, lines) + case "LICENSE": + pkg.License = make([]string, len(lines)) + copy(pkg.License, lines) + case "GROUPS": + pkg.Groups = make([]string, len(lines)) + copy(pkg.Groups, lines) + case "CSIZE": + if pkg.CompressedSize, err = strconv.ParseInt(lines[0], 10, 64); err != nil { + return + } + case "ISIZE": + if pkg.Size, err = strconv.ParseInt(lines[0], 10, 64); err != nil { + return + } + case "MD5SUM": + if pkg.MD5, err = hex.DecodeString(lines[0]); err != nil { + return + } + case "SHA1SUM": + if pkg.SHA1, err = hex.DecodeString(lines[0]); err != nil { + return + } + case "SHA256SUM": + if pkg.SHA256, err = hex.DecodeString(lines[0]); err != nil { + return + } + case "SHA384SUM": + if pkg.SHA384, err = hex.DecodeString(lines[0]); err != nil { + return + } + case "SHA512SUM": + if pkg.SHA512, err = hex.DecodeString(lines[0]); err != nil { + return + } + case "PGPSIG": + if pkg.PGPSignature, err = base64.StdEncoding.DecodeString(lines[0]); err != nil { + return + } + case "URL": + if pkg.URL, err = url.Parse(lines[0]); err != nil { + return + } + case "DEPENDS": + pkg.Depends = make([]string, len(lines)) + copy(pkg.Depends, lines) + case "OPTDEPENDS": + pkg.OptionalDepends = make([]string, len(lines)) + copy(pkg.OptionalDepends, lines) + case "MAKEDEPENDS": + pkg.MakeDepends = make([]string, len(lines)) + copy(pkg.MakeDepends, lines) + case "CHECKDEPENDS": + pkg.CheckDepends = make([]string, len(lines)) + copy(pkg.CheckDepends, lines) + case "PROVIDES": + pkg.Provides = make([]string, len(lines)) + copy(pkg.Provides, lines) + case "CONFLICTS": + pkg.Conflicts = make([]string, len(lines)) + copy(pkg.Conflicts, lines) + case "REPLACES": + pkg.Replaces = make([]string, len(lines)) + copy(pkg.Replaces, lines) + case "BUILDDATE": + var i int64 + if i, err = strconv.ParseInt(lines[0], 10, 64); err != nil { + return + } + pkg.BuildDate = time.Unix(i, 0) + case "PACKAGER": + pkg.Packager = lines[0] + case "FILES": + pkg.Files = make([]string, len(lines)) + copy(lines, pkg.Files) + default: + return fmt.Errorf("archlinux: unsupported desc section %q", section) + } + } else if line[0] == '%' && line[len(line)-1] == '%' { + section = line[1 : len(line)-1] + lines = lines[:0] + } else { + lines = append(lines, line) + } + } + return +} diff --git a/package_desc_test.go b/package_desc_test.go new file mode 100644 index 0000000..f943a36 --- /dev/null +++ b/package_desc_test.go @@ -0,0 +1,186 @@ +package archlinux + +import ( + "bytes" + "testing" +) + +func TestReadPackageDesc(t *testing.T) { + pkg, err := ReadPackageDesc(bytes.NewBufferString(testReadPackageDesc)) + if err != nil { + t.Fatal(err) + } + // TODO(maze): checks + _ = pkg +} + +var ( + testReadPackageDesc = `%FILENAME% +perl-5.26.0-4-x86_64.pkg.tar.xz + +%NAME% +perl + +%VERSION% +5.26.0-4 + +%DESC% +A highly capable, feature-rich programming language + +%GROUPS% +base + +%CSIZE% +14343632 + +%ISIZE% +54492160 + +%MD5SUM% +08a8b1fcab42ec43fdf07c4a5b1b2f50 + +%SHA256SUM% +ab958e0796650557a227f7eff56924ea8d03160803f8d061717b6013ee0045c1 + +%PGPSIG% +iQEzBAABCAAdFiEEhs/8qRjPOvRxR1iAUeixSKmZnDQFAlmew3MACgkQUeixSKmZnDRRhwf/Q0Ve+pIQAxknR0v3p2FyWgfuanwYCpWhIZgTCKGCmCntayBKZ0U9v41Mac7PJ11AJvntNWJ9vhmR3dqpj6AOw6lXa4AGXUCHOmo21FMYEPltcp27zRCk/7FHFHwxDd+8y0cU8x4l7QVmTq4odMjAQiimMEcxY/jXsoUX084SzOQ02ix2DA67spFLAD7BC9z6tmdH9ABXaRA8QL51uQxGaQ+fxc8FKXFjOhbNyPcjOZasiwvrLboB/nQRfygf0baBSzzbM/hOnHVgqc3WfAqE1y4Qve8cE1L+2hhXXHaFCj9/v6vI1JZGQlMYisbhYMuK0n4kM4RbX7N6I78IHuRuyg== + +%URL% +http://www.perl.org + +%LICENSE% +GPL +PerlArtistic + +%ARCH% +x86_64 + +%BUILDDATE% +1503575763 + +%PACKAGER% +Evangelos Foutras + +%PROVIDES% +perl-archive-tar=2.24 +perl-attribute-handlers=0.99 +perl-autodie=2.29 +perl-autoloader=5.74 +perl-autouse=1.11 +perl-b-debug=1.24 +perl-base=2.25 +perl-bignum=0.47 +perl-carp=1.42 +perl-compress-raw-bzip2=2.074 +perl-compress-raw-zlib=2.074 +perl-config-perl-v=0.28 +perl-constant=1.33 +perl-cpan-meta-requirements=2.140 +perl-cpan-meta-yaml=0.018 +perl-cpan-meta=2.150010 +perl-cpan=2.18 +perl-data-dumper=2.167 +perl-db_file=1.840 +perl-devel-ppport=3.35 +perl-devel-selfstubber=1.06 +perl-digest-md5=2.55 +perl-digest-sha=5.96 +perl-digest=1.17_01 +perl-dumpvalue=1.18 +perl-encode=2.88 +perl-encoding-warnings=0.13 +perl-env=1.04 +perl-experimental=0.016 +perl-exporter=5.72 +perl-extutils-cbuilder=0.280225 +perl-extutils-constant=0.23 +perl-extutils-install=2.04 +perl-extutils-makemaker=7.24 +perl-extutils-manifest=1.70 +perl-extutils-parsexs=3.34 +perl-file-fetch=0.52 +perl-file-path=2.12_01 +perl-file-temp=0.2304 +perl-filter-simple=0.93 +perl-filter-util-call=1.55 +perl-getopt-long=2.49 +perl-http-tiny=0.070 +perl-i18n-collate=1.02 +perl-i18n-langtags=0.42 +perl-if=0.0606 +perl-io-compress=2.074 +perl-io-socket-ip=0.38 +perl-io-zlib=1.10 +perl-io=1.38 +perl-ipc-cmd=0.96 +perl-ipc-sysv=2.07 +perl-json-pp=2.27400_02 +perl-lib=0.64 +perl-libnet=3.10 +perl-locale-codes=3.42 +perl-locale-maketext-simple=0.21_01 +perl-locale-maketext=1.28 +perl-math-bigint-fastcalc=0.5005 +perl-math-bigint=1.999806 +perl-math-bigrat=0.2611 +perl-math-complex=1.5901 +perl-memoize=1.03_01 +perl-mime-base64=3.15 +perl-module-corelist=5.20170530 +perl-module-load-conditional=0.68 +perl-module-load=0.32 +perl-module-loaded=0.08 +perl-module-metadata=1.000033 +perl-net-ping=2.55 +perl-params-check=0.38 +perl-parent=0.236 +perl-pathtools=3.67 +perl-perl-ostype=1.010 +perl-perlfaq=5.021011 +perl-perlio-via-quotedprint=0.08 +perl-pod-checker=1.73 +perl-pod-escapes=1.07 +perl-pod-parser=1.63 +perl-pod-perldoc=3.28 +perl-pod-simple=3.35 +perl-pod-usage=1.69 +perl-podlators=5.006 +perl-safe=2.40 +perl-scalar-list-utils=1.46_02 +perl-search-dict=1.07 +perl-selfloader=1.23 +perl-socket=2.020_03 +perl-storable=2.62 +perl-sys-syslog=0.35 +perl-term-ansicolor=4.06 +perl-term-cap=1.17 +perl-term-complete=1.403 +perl-term-readline=1.16 +perl-test-harness=3.38 +perl-test-simple=1.302073 +perl-test=1.30 +perl-text-abbrev=1.02 +perl-text-balanced=2.03 +perl-text-parsewords=3.30 +perl-text-tabs=2013.0523 +perl-thread-queue=3.12 +perl-thread-semaphore=2.13 +perl-threads-shared=1.56 +perl-threads=2.15 +perl-tie-file=1.02 +perl-tie-refhash=1.39 +perl-time-hires=1.9741 +perl-time-local=1.25 +perl-time-piece=1.31 +perl-unicode-collate=1.19 +perl-unicode-normalize=1.25 +perl-version=0.9917 +perl-xsloader=0.27 + +%DEPENDS% +gdbm +db +glibc + +` +) diff --git a/package_info.go b/package_info.go new file mode 100644 index 0000000..3859791 --- /dev/null +++ b/package_info.go @@ -0,0 +1,199 @@ +package archlinux + +import ( + "bufio" + "fmt" + "io" + "net/url" + "strconv" + "strings" + "time" +) + +// ReadPackageInfo reads a package description from a .PKGINFO file +func ReadPackageInfo(r io.Reader) (*Package, error) { + pkg := new(Package) + if n, ok := r.(namer); ok { + pkg.Filename = n.Name() + } + if err := pkg.readPackageInfo(r); err != nil { + return nil, err + } + if pkg.Name == "" { + return nil, ErrNoPackageName + } + if pkg.Version == "" { + return nil, ErrNoPackageVersion + } + if pkg.Release == "" { + return nil, ErrNoPackageRelease + } + return pkg, nil +} + +func (pkg *Package) readBuildInfo(r io.Reader) (err error) { + s := bufio.NewScanner(r) + for s.Scan() { + if err = s.Err(); err != nil { + if err == io.EOF { + err = nil + } + break + } + + fields := strings.SplitN(s.Text(), " = ", 2) + if len(fields) != 2 { + continue + } + + switch fields[0] { + case "buildenv": + pkg.BuildEnv = append(pkg.BuildEnv, fields[1]) + case "options": + pkg.Options = append(pkg.Options, fields[1]) + } + } + return +} + +func (pkg *Package) readPackageInfo(r io.Reader) (err error) { + s := bufio.NewScanner(r) + for s.Scan() { + if err = s.Err(); err != nil { + if err == io.EOF { + err = nil + } + break + } + + fields := strings.SplitN(s.Text(), " = ", 2) + if len(fields) != 2 { + continue + } + + switch fields[0] { + case "pkgname": + pkg.Name = fields[1] + case "pkgbase": + pkg.Base = fields[1] + case "pkgver": + if i := strings.IndexByte(fields[1], '-'); i != -1 { + pkg.Version, pkg.Release = fields[1][:i], fields[1][i+1:] + } else { + return fmt.Errorf("archlinux: invalid version %q", fields[1]) + } + case "pkgdesc": + pkg.Description = fields[1] + case "url": + if pkg.URL, err = url.Parse(fields[1]); err != nil { + return fmt.Errorf("archlinux: invalid url %q: %v", fields[1], err) + } + case "builddate": + var t int64 + if t, err = strconv.ParseInt(fields[1], 10, 64); err != nil { + return fmt.Errorf("archlinux: invalid build date %q: %v", fields[1], err) + } + pkg.BuildDate = time.Unix(t, 0) + case "packager": + pkg.Packager = fields[1] + case "size": + if pkg.Size, err = strconv.ParseInt(fields[1], 10, 64); err != nil { + return fmt.Errorf("archlinux: invalid size %q: %v", fields[1], err) + } + case "arch": + pkg.Arch = append(pkg.Arch, fields[1]) + case "group": + pkg.Groups = append(pkg.Groups, fields[1]) + case "license": + pkg.License = append(pkg.License, fields[1]) + case "backup": + pkg.Backup = append(pkg.Backup, fields[1]) + case "replaces": + pkg.Replaces = append(pkg.Replaces, fields[1]) + case "depend": + pkg.Depends = append(pkg.Depends, fields[1]) + case "conflict": + pkg.Conflicts = append(pkg.Conflicts, fields[1]) + case "provides": + pkg.Provides = append(pkg.Provides, fields[1]) + case "optdepend": + pkg.OptionalDepends = append(pkg.OptionalDepends, fields[1]) + case "makedepend": + pkg.MakeDepends = append(pkg.MakeDepends, fields[1]) + case "checkdepend": + pkg.CheckDepends = append(pkg.CheckDepends, fields[1]) + default: + return fmt.Errorf("archlinux: unknown PKGINFO field %q", fields[0]) + } + } + return +} + +// WritePackageInfo writes a PKGINFO to the supplied Writer +func (pkg *Package) WritePackageInfo(w io.Writer) error { + var ( + fields = []struct { + Key string + Value interface{} + }{ + {"pkgname", pkg.Name}, + {"pkgbase", pkg.Base}, + {"pkgver", pkg.Version + "-" + pkg.Release}, + {"pkgdesc", pkg.Description}, + {"url", pkg.URL}, + {"builddate", pkg.BuildDate}, + {"packager", pkg.Packager}, + {"size", pkg.Size}, + {"arch", pkg.Arch}, + {"license", pkg.License}, + {"provides", pkg.Provides}, + {"conflicts", pkg.Conflicts}, + {"replaces", pkg.Replaces}, + {"backup", pkg.Backup}, + {"depend", pkg.Depends}, + {"optdepend", pkg.OptionalDepends}, + {"makedepend", pkg.MakeDepends}, + {"checkdepend", pkg.CheckDepends}, + } + err error + ) + if _, err = fmt.Fprintln(w, "# Generated by maze.io/archlinux.v0\n#", time.Now().UTC().Format(time.UnixDate)); err != nil { + return err + } + for _, f := range fields { + switch value := f.Value.(type) { + case string: + if value == "" { + continue + } + if _, err = fmt.Fprintln(w, f.Key, "=", value); err != nil { + return err + } + case []string: + if len(value) > 0 { + for _, v := range value { + if v == "" { + continue + } + if _, err = fmt.Fprintln(w, f.Key, "=", v); err != nil { + return err + } + } + } + case int64: + if value > 0 { + if _, err = fmt.Fprintln(w, f.Key, "=", value); err != nil { + return err + } + } + case *url.URL: + if value == nil { + continue + } + if _, err = fmt.Fprintln(w, f.Key, "=", value.String()); err != nil { + return err + } + } + } + return nil +} diff --git a/package_info_test.go b/package_info_test.go new file mode 100644 index 0000000..9687a91 --- /dev/null +++ b/package_info_test.go @@ -0,0 +1,192 @@ +package archlinux + +import ( + "bytes" + "io/ioutil" + "strings" + "testing" + "time" +) + +func TestReadPackageInfo(t *testing.T) { + var tests = []struct { + PKGINFO string + Package + }{ + { + testPackageInfo, Package{ + Name: "xterm", + Version: "330", + Release: "1", + Arch: []string{"x86_64"}, + Size: 851968, + }, + }, + { + testPackageInfo2, Package{ + Name: "imagemagick", + Version: "6.9.9.15", + Release: "1", + Arch: []string{"x86_64"}, + Size: 9897984, + }, + }, + } + for _, test := range tests { + t.Run(test.Package.String(), func(t *testing.T) { + p, err := ReadPackageInfo(bytes.NewBufferString(test.PKGINFO)) + if err != nil { + t.Fatal(err) + } + testComparePackage(t, p, &test.Package) + }) + } +} + +var ( + testPackageInfo = `# Generated by makepkg 5.0.2 +# using fakeroot version 1.21 +# Fri Jun 23 20:03:18 UTC 2017 +pkgname = xterm +pkgver = 330-1 +pkgdesc = X Terminal Emulator +url = http://invisible-island.net/xterm/ +builddate = 1498248198 +packager = Andreas Radke +size = 851968 +arch = x86_64 +license = custom +depend = libxft +depend = libxaw +depend = ncurses +depend = xorg-luit +depend = xbitmaps +depend = libutempter +depend = libxkbfile +` + testPackageInfo2 = `# Generated by makepkg 5.0.2 +# using fakeroot version 1.22 +# Sat Sep 23 21:53:45 UTC 2017 +pkgname = imagemagick +pkgbase = imagemagick +pkgver = 6.9.9.15-1 +pkgdesc = An image viewing/manipulation program +url = http://www.imagemagick.org/ +builddate = 1506203625 +packager = Antonio Rojas +size = 9897984 +arch = x86_64 +license = custom +backup = etc/ImageMagick-6/coder.xml +backup = etc/ImageMagick-6/colors.xml +backup = etc/ImageMagick-6/delegates.xml +backup = etc/ImageMagick-6/log.xml +backup = etc/ImageMagick-6/magic.xml +backup = etc/ImageMagick-6/mime.xml +backup = etc/ImageMagick-6/policy.xml +backup = etc/ImageMagick-6/quantization-table.xml +backup = etc/ImageMagick-6/thresholds.xml +backup = etc/ImageMagick-6/type.xml +backup = etc/ImageMagick-6/type-dejavu.xml +backup = etc/ImageMagick-6/type-ghostscript.xml +backup = etc/ImageMagick-6/type-windows.xml +depend = libltdl +depend = lcms2 +depend = libxt +depend = fontconfig +depend = libxext +depend = liblqr +depend = libraqm +depend = opencl-icd-loader +depend = perl>=5.26 +depend = perl<5.27 +optdepend = imagemagick-doc: for additional information +optdepend = ghostscript: for Ghostscript support +optdepend = openexr: for OpenEXR support +optdepend = openjpeg2: for JP2 support +optdepend = libwmf: for WMF support +optdepend = librsvg: for SVG support +optdepend = libxml2: for XML support +optdepend = libpng: for PNG support +optdepend = libwebp: for WEBP support +optdepend = libraw: for DNG support +makedepend = libltdl +makedepend = lcms2 +makedepend = libxt +makedepend = fontconfig +makedepend = libxext +makedepend = ghostscript +makedepend = openexr +makedepend = libwmf +makedepend = librsvg +makedepend = libxml2 +makedepend = liblqr +makedepend = openjpeg2 +makedepend = libraw +makedepend = libraqm +makedepend = opencl-headers +makedepend = opencl-icd-loader +makedepend = libwebp +makedepend = subversion +makedepend = glu +` +) + +func TestReadPackageInfoError(t *testing.T) { + var tests = []struct { + PKGINFO string + Error string + }{ + {testPackageInfoError, `unknown PKGINFO field`}, + {testPackageInfoErrorName, "name is missing"}, + {testPackageInfoErrorVersion, "version is missing"}, + {testPackageInfoErrorVersionInvalid, "invalid version"}, + {testPackageInfoErrorRelease, "release is missing"}, + } + for _, test := range tests { + t.Run(test.Error, func(t *testing.T) { + _, err := ReadPackageInfo(bytes.NewBufferString(test.PKGINFO)) + if err == nil { + t.Fatal("expected error") + } + if s := err.Error(); !strings.Contains(s, test.Error) { + t.Fatalf(`expected error %q, got %q`, test.Error, s) + } + }) + } +} + +var ( + testPackageInfoError = `foo = bar` + testPackageInfoErrorName = `pkgver = 330-1` + testPackageInfoErrorVersion = `pkgname = xterm` + testPackageInfoErrorVersionInvalid = `pkgname = xterm +pkgver = 330` + testPackageInfoErrorRelease = `pkgname = xterm +pkgver = 330-` +) + +func TestWritePackageInfo(t *testing.T) { + if err := testWritePackageInfo.WritePackageInfo(ioutil.Discard); err != nil { + t.Fatal(err) + } +} + +var ( + testWritePackageInfo = &Package{ + Name: "imagemagick", + Base: "imagemagick", + Version: "6.9.9.15", + Release: "1", + Description: "An image viewing/manipulation program", + Arch: []string{"x86_64"}, + License: []string{"custom"}, + Depends: []string{"libltdl", "lcms2", "libxt", "fontconfig", "libxext", "liblqr", "libraqm", "opencl-icd-loader", "perl>=5.26", "perl<5.27"}, + MakeDepends: []string{"libltdl", "lcms2", "libxt", "fontconfig", "libxext", "ghostscript", "openexr", "libwmf", "librsvg", "libxml2", "liblqr", "openjpeg2", "libraw", "libraqm", "opencl-headers", "opencl-icd-loader", "libwebp", "subversion", "glu"}, + OptionalDepends: []string{"imagemagick-doc: for additional information", "ghostscript: for Ghostscript support", "openexr: for OpenEXR support", "openjpeg2: for JP2 support", "libwmf: for WMF support", "librsvg: for SVG support", "libxml2: for XML support", "libpng: for PNG support", "libwebp: for WEBP support", "libraw: for DNG support"}, + Backup: []string{"etc/ImageMagick-6/coder.xml", "etc/ImageMagick-6/colors.xml", "etc/ImageMagick-6/delegates.xml", "etc/ImageMagick-6/log.xml", "etc/ImageMagick-6/magic.xml", "etc/ImageMagick-6/mime.xml", "etc/ImageMagick-6/policy.xml", "etc/ImageMagick-6/quantization-table.xml", "etc/ImageMagick-6/thresholds.xml", "etc/ImageMagick-6/type.xml", "etc/ImageMagick-6/type-dejavu.xml", "etc/ImageMagick-6/type-ghostscript.xml", "etc/ImageMagick-6/type-windows.xml"}, + Size: 9897984, + BuildDate: time.Unix(1506203625, 0), + Packager: "Antonio Rojas ", + } +) diff --git a/package_test.go b/package_test.go index 4b36074..89fedf7 100644 --- a/package_test.go +++ b/package_test.go @@ -4,11 +4,8 @@ import ( "bytes" "fmt" "io" - "io/ioutil" "os" - "strings" "testing" - "time" "maze.io/archlinux.v0/version" ) @@ -107,369 +104,6 @@ var ( testReadPackageTarXz = []byte("\x1f\x9d\x90\x2e\xa0\x2c\x39\x92\xc4\x89\x91\x27\x00\x12\x2a\x5c\xc8\xb0\xa1\xc3\x87\x10\x23\x4a\x9c\x48\x11\x00\x8c\x8b\x30\x6c\xd0\xa0\x61\x11\x23\xc6\x8e\x1e\x61\x80\xf4\x38\xa3\xc6\x8c\x19\x00\x62\xcc\x88\x61\x23\x46\x0d\x93\x37\x6a\xc4\xb0\x18\x23\xa3\x8d\x1a\x00\x40\x88\xac\xc8\xb3\xa7\xcf\x9f\x40\xeb\xcc\xa1\x13\x46\x0e\x08\x10\x00\xe4\xbc\x79\x43\x07\x28\x44\xa5\x4c\x9d\x4a\x9d\x4a\xb5\xaa\xd5\xab\x58\xa9\x8e\x00\x71\xa4\x8c\x9b\x32\x72\xc2\xd0\x29\x43\x06\x84\x98\x3c\x20\xda\x84\x59\x53\x06\xce\x9a\x33\x20\x6a\xb8\x80\xe1\x42\x86\x82\xad\x42\xd3\xb8\x81\x6b\x66\x2d\xd8\xa5\x74\x40\xd8\x01\x3b\x27\xcd\x1b\x37\x20\x62\xd4\xb5\xbb\x75\x8a\x58\x10\x53\xda\x82\x90\x31\x63\x72\x0c\x1d\x26\x75\xd0\xa8\x01\xa2\x0a\x95\x21\x93\x61\xc4\xb8\xa1\xc0\xed\x19\x37\x61\xda\x94\x01\xd1\x03\x44\x1a\xb5\x67\xca\xc0\x4e\x33\x66\x4d\xe9\xb7\x62\xc2\xcc\x59\xdd\xfa\x75\x98\xd8\xb3\x6b\xdf\x3e\x33\xd8\x68\x6b\x1b\x2e\x72\x24\x77\xe1\xb2\x45\x8c\xe1\x64\xca\xcc\x19\xc3\x1a\x44\x10\xc4\xbe\x63\x0b\x4e\x53\xe6\x8e\xde\x33\x2f\xd4\xba\x49\x03\xa7\x0e\x1b\xb1\x86\x11\xc3\x51\x7a\x26\x6c\x1b\x05\x75\xe4\xb0\xa9\x8e\x86\x0e\x1d\x38\x3a\x5e\xbc\xb8\xc3\xdf\x45\x76\xd9\xbf\xd1\xb6\x86\x0b\x6f\xc8\x01\x9e\x02\x62\xd4\x91\x06\x1b\x64\x90\x21\x16\x6f\x89\xd5\x90\x91\x0c\x30\xcc\x60\x83\x0c\x35\x94\x16\x46\x6d\xbf\x81\x55\xdd\x75\x74\x1c\x66\x18\x08\x52\xbc\xa1\x86\x6e\x20\xf0\x50\x94\x89\xba\x01\x51\xd4\x18\x68\xb0\xa1\x57\x1d\x78\x10\x68\xa0\x0f\x0a\x14\xa6\x07\x84\x39\xe0\x90\xc3\x0d\x3d\xd2\xa0\xc0\x8b\x68\x54\x87\x07\x0e\x36\x7c\xa1\x91\x02\x32\x8e\xe1\xd5\x6e\xd5\x8d\x21\x54\x88\xef\xe5\x56\x5b\x1d\x70\x54\x57\x06\x1d\x63\xbc\x90\x04\x6c\x65\x34\x11\x60\x6d\x2d\xd8\xf0\xc2\x18\x6f\x44\x27\x87\x0b\x78\xb4\xc1\x06\x82\x1b\xae\x81\xa5\x96\x5c\x7a\x09\xa6\x98\x67\x08\x58\xe6\x99\x6f\xb0\x51\xe0\x1c\x6c\xba\x09\xe7\x95\x59\xb6\xb6\x65\x97\x5f\x76\x88\xa7\x9e\x66\x46\xc7\x46\x19\x67\x3c\x08\x68\x9b\x6f\x5a\x29\x67\xa1\x20\x1c\x6a\xa7\xa2\x63\xae\xb1\xa7\x9f\x67\x04\x5a\x69\x9c\x73\x1a\x5a\x67\xa2\xb1\x2d\x4a\xa6\x99\xc1\x89\x3a\xe8\xa5\x74\x22\x7a\x67\xa7\x7b\xb6\xf1\x5a\x19\xae\x5a\x5a\x6a\xa6\xa7\xce\x9a\xe7\xaa\x2f\xc0\xd1\x27\x6d\x79\xe4\x4a\x2a\xa6\x9a\xa2\x1a\x26\xad\x66\xc6\x51\x47\x18\x6e\xd0\x91\x86\x1e\xe8\x1d\xd6\x02\x51\x62\x3c\x6a\x2c\xa1\xb1\x6e\x9a\x2a\xb3\x2f\xd0\x81\x86\x1c\xd2\xa1\xd1\x27\x19\x93\x0a\xaa\x2b\xb2\xbd\x72\xfa\xab\xa7\x66\xd2\x91\x07\x1c\xb8\x52\xfa\xea\xae\xc9\xfa\xca\x68\xb8\xf3\x96\xd1\x42\x74\x27\xda\x51\xc7\xb6\xb0\x9a\x2a\xab\xbb\xfb\xca\x4b\x6f\x0b\x67\x98\x3b\xd4\x74\x72\x90\x47\x07\xc1\xf8\xb6\xfb\xed\xbb\x7b\x2a\xec\xaf\x77\x6e\x90\xf1\xc6\x1d\xe9\xbe\x19\x1d\xbd\x1d\x57\x27\x63\xb6\x74\x90\x21\x72\x5b\x5e\x95\xd5\x1a\x1b\x63\xb4\x31\x87\x5d\x23\xb7\x6c\x72\x1a\x62\xe0\x41\x87\x02\x35\x97\xdc\x9a\x19\x87\x71\x79\x98\x19\x69\x9c\xc1\x33\xcb\x3e\x83\x70\x32\x1e\x65\xe8\x7c\x34\xc9\x2e\x2b\x8d\x33\x1b\x71\xc8\xf1\xb4\xcd\x2f\xe3\x1c\x56\x1c\xef\xf5\x1c\xf5\x1b\x24\x8f\xc1\x46\x0b\xb4\x91\xd1\x82\x9f\x61\xa8\x79\x75\xd2\xf4\xca\xe7\x43\x0f\x72\xc9\x60\xc3\xda\x51\xb7\xcd\x06\x0f\x71\x93\x06\x76\xca\x48\x47\xfd\x5f\x70\x9e\x7a\x3c\x86\x0e\x20\x00\x6d\x54\xda\x64\xa4\x21\xed\x61\x61\xcc\xa7\x97\xe1\x6a\x2d\xee\x86\x02\x7b\x7b\x5d\x5d\xc3\x6f\x3c\x3c\x46\xc4\x70\xd0\x41\xb8\xe1\x5c\x39\x4c\x07\xc4\x12\x83\x30\x07\x96\xc2\xca\xb1\x73\xe5\x7d\x57\x07\xb6\x57\x4d\xcb\xf1\x79\x81\x20\x3c\x41\x72\x11\x58\x48\x61\x3a\xea\x05\xae\xde\xb9\xe5\xad\xbd\xee\x86\x1a\xf4\x9e\x21\xc3\xec\x46\x29\x01\x85\x0c\xbb\xc3\x91\xba\xef\x7c\x43\x7d\xb3\x18\x77\xb4\x61\x06\xf2\x20\x5c\xd1\x84\x11\xcd\x3f\x4f\xf9\xef\xad\x67\x2d\x86\x1c\x73\xd8\x71\x06\xf6\x53\x58\x71\x44\xf7\xbd\x7f\x1f\x3d\xd6\x52\xe7\xec\xe6\xf1\x85\xd3\x8e\x45\x13\x4c\xb0\xaf\xba\xfb\xc0\xc7\x0f\xc7\x5e\xd8\x83\x82\x13\xd6\x77\x3a\xe7\xb5\x8f\x75\xd2\x13\xdf\x1d\xca\x20\x06\xfc\xd4\xcf\x28\x57\x28\x82\x10\xa0\xa0\x3f\xe8\xf5\xef\x64\x61\xb9\x03\xf6\x88\x30\xc0\x0a\x2a\x40\x2d\x6c\xb9\xe0\xd4\x52\xf6\x26\x10\x92\x25\x7c\x4a\x8b\xd9\xcc\x3e\xe8\x17\x11\xe6\x6c\x67\x26\xec\x1f\xd0\xa2\x85\x26\x37\x10\xcd\x68\x31\x44\xe1\xd2\x9a\x06\xc3\x16\xa2\x10\x73\x9a\xe3\x5c\x0f\x43\x88\x42\xe1\xc5\x8e\x85\x44\x4c\x60\xfc\xaa\x67\x06\x24\x9e\x50\x89\x18\x2c\x1f\x0e\x7d\x08\x45\x9c\x51\xca\x2e\x39\xac\x62\xb6\xaa\xe6\xc4\xfe\x09\x8f\x78\x90\xc2\x22\x15\xe1\x87\xc1\x30\xdc\xa1\x8b\x3a\xd4\x5a\x18\xb8\x86\x46\x25\x0a\x4f\x6c\x2d\x40\x43\x19\xd2\x46\x98\x36\xc2\xef\x8d\x63\x2b\xdb\xd9\xde\x40\x47\xab\x65\x91\x8c\x38\x5b\x60\x03\xed\x98\xb4\xd3\x89\xa1\x38\x85\x39\x0c\x21\xa3\x76\x06\x36\xd4\x41\x01\x59\x89\xa4\x24\x27\x49\x49\x9e\xb8\x40\x08\x55\x48\x02\x13\x88\x50\x90\x83\x54\xf2\x93\x54\xf1\x88\x46\x38\xe2\x91\x1b\xdc\x04\x24\xa3\x91\xd0\x48\x30\x72\x83\x1b\x64\x24\x25\x2b\xa1\x8c\x0c\x6e\x40\xa1\x57\x8a\x46\x06\x18\x42\x89\x4e\x40\xc9\xcb\x48\x4e\xa9\x28\x47\x01\x80\x77\xd4\x80\x9a\x8e\x59\x65\x98\xc5\x24\x43\x2f\x97\xc9\xcc\x66\x3a\x93\x22\x09\x5a\x50\x83\xd2\x60\x1c\x10\xbc\x20\x9a\x0c\x1a\x0e\x36\xc9\xf0\x85\x39\xa0\x21\x0c\x18\xb2\xc1\xe9\xda\x50\x1d\x31\xe4\xe0\x9c\x37\x68\x50\x2b\xc9\xe0\x92\x32\x58\x68\x06\x30\xa8\xc1\x18\xcc\x70\x03\x1a\xdc\x80\x9e\x38\xa0\x41\x5f\xc2\x40\x83\x32\x38\xc9\x0c\xd1\xe9\x27\x38\x7f\x54\x06\x7d\xe2\x80\x0c\x36\xb0\x41\x0e\x36\xd2\x97\x19\xb8\x33\x07\x36\xa8\x90\x18\xc6\x80\x20\x05\x31\xc8\x2b\x76\xa8\x4e\x08\x12\x37\x94\x31\x50\x74\x9b\x18\x8d\x52\x9f\x0a\x54\x51\x69\x86\xb4\x35\x21\xf0\xe8\x86\xe4\x58\xd2\x8b\xba\x21\xa3\xad\x81\x91\x3f\x6d\x03\xd2\x97\x6a\xb4\x30\xa7\x71\x5f\x7a\xe6\x50\x9d\xa1\x70\x4e\xa7\x87\xe1\x69\x6b\x04\x37\x07\xa0\xba\x41\xa8\x20\x08\xc1\xc9\x42\xd4\x27\xa3\x22\x35\x04\x43\x41\x8f\xd8\x70\x56\xd4\xbd\xed\x54\x4b\x6d\xe8\x5c\x1e\x12\x47\x3e\xa7\x56\x47\x0f\xe4\x11\x8f\x57\x5b\x53\x1e\x03\x95\x61\xac\x49\xb5\xea\xff\x8c\x66\xd5\xa0\x6a\x14\x4b\x78\x40\xeb\x46\x19\x58\x07\xa3\xe9\x25\xaa\x6c\x78\x54\xd4\x36\x34\x36\x19\xd4\xc5\x05\x35\x90\x41\x0b\x66\xa0\x80\xbb\x12\x25\xaf\x64\xa9\x0e\x91\x64\xe4\x06\x1a\xb5\x80\x2d\x79\x88\xd8\x5e\x5a\x40\xa1\xd1\x64\x24\x06\x31\x70\x4e\x61\x8f\x7a\x58\xbd\x2a\xd6\x3e\x72\xa0\xac\x0b\x68\x30\xda\x1b\x50\x76\xb3\x78\xf5\x6c\x6b\xc2\x50\x87\x10\xd5\xd0\x0c\xa2\x55\x68\x0b\x84\x64\xd8\xc6\xa9\x16\x04\xac\xa5\x92\x5f\x9c\xc3\x9c\x1a\x9c\xb6\xb6\x88\x8d\x5a\x6e\xbc\x39\xdb\xd1\xce\x25\x06\x82\xb5\x0b\x70\x6f\x2b\x86\x19\x49\x8b\x0d\x73\x10\xad\x0c\x70\x30\x97\xc1\xa2\xb6\xb3\x89\x6d\x4d\x73\xe7\x60\xad\x19\xcc\x65\xb4\xbf\xe5\xac\x6d\xb3\x6b\x16\xb0\xc2\x41\xb0\x8a\xa1\x8b\x0d\xca\x74\xdd\xf1\x46\x6d\x0c\x61\x68\x81\x93\x54\x97\x06\xa2\xc1\x77\x2c\xd1\xad\xac\x2b\xe1\x69\xda\xe7\x2c\x97\xbc\xf0\x95\x2f\x58\xa4\x65\x5f\x49\xc9\x77\x43\x03\xa6\xac\x68\x68\x00\x03\x1c\xc8\x80\x06\xb3\x6d\x6f\x70\xa3\x14\xdf\xf9\x12\x98\x36\x06\x6e\xc3\x1b\xc0\x9a\xd7\xf8\x7a\x77\x25\xd6\xfd\xef\x7b\x2b\x3c\xe0\xfa\x62\x18\xbf\x2d\x68\xed\x82\xf2\x2b\x9a\xfd\xc2\xa0\xbf\x12\xbe\x2d\x9a\xc8\xa5\x62\xe8\xb6\x80\xba\xb3\xd4\xac\x88\xa3\x14\x96\xda\x9c\x4c\xb4\xca\x59\xaf\x7f\xc5\x3b\xe1\x98\xc6\x67\x6c\x37\x00\x2c\x69\x33\x3b\xe4\xd4\x92\x97\x0c\x62\x68\x81\x5c\xbc\x3b\xdd\x10\x13\xf9\xb6\x89\x33\x83\x19\x6a\x1c\x5d\xef\x0a\x39\xc6\xe4\x2d\x83\x0c\xcc\x30\x87\xf5\xbc\xe1\x0c\xd1\x55\x0c\x0d\xbc\x0b\xe1\x26\x63\x37\x6a\x4d\x83\x83\x58\xa4\xcb\x1c\x1d\x5f\x99\xbc\x7d\x61\x0b\x54\xe8\xc0\x5b\x19\x64\x56\xb9\x77\x8e\x1a\xd1\x1e\x25\x65\x17\x80\xd8\xcd\xee\xad\xce\xa0\xa5\x93\x87\xa1\xc8\x46\xc1\xa3\x99\xcb\x0c\xc2\xeb\x64\x41\xeb\x85\x0c\x5c\x2e\x2e\x72\x60\x40\xe9\x37\x2b\xfa\x51\x78\x88\x2d\x78\x11\x5d\xe4\xfa\xd1\x70\x68\x45\x13\x2d\x72\x0d\x6d\xe7\x4a\x2b\x9a\x5c\x5b\xea\x57\x72\x5d\x80\x83\x4e\x27\xba\x35\x91\xba\x83\xa7\x96\x0c\x5e\x40\xbb\x1a\xd7\x63\x68\x41\x92\x37\xdd\x6a\x4f\x03\x3b\xd8\x49\x56\x4c\x66\x09\xbb\xe3\x63\x9f\x8d\xaa\xc2\x66\x4e\x9d\x99\x1d\xe8\xcb\x41\xb9\x0d\xbc\x55\x49\xb1\x6f\x0d\x82\xd8\xd8\x87\x87\x2d\xa0\x4b\x0c\x94\x43\xdd\x3f\x83\x99\x91\x27\x9b\x75\x60\x59\x4d\xea\xdb\x36\x12\x67\xc1\xf6\x2b\x86\xa4\x7c\xee\xcb\x65\xb5\x4c\xd2\x46\x6f\xbd\x71\xdd\x58\x38\x9c\x41\xd5\x75\x59\xf6\xbe\xbb\xdd\x58\x3a\xd8\xd8\xbb\x72\xd1\x76\xbb\xc9\x7b\x06\x7f\xab\x86\xb7\xca\xe1\x34\xb5\x7f\xdd\xed\xb0\xc0\x01\x0d\x8a\xf3\xd7\x65\x14\xe3\xdd\x9a\x6c\xbb\xd4\xed\x69\xcb\x60\xab\xbb\x70\x46\x2a\x45\xcb\x7d\xf6\xeb\xa4\x49\xd3\xec\x6e\x5b\xd4\x5f\xf2\xae\xcb\xc7\xdd\x6d\x5e\xde\xd6\xda\xd7\xc6\x06\xc1\x37\xe5\x60\x86\x04\xe9\x41\x0f\xbc\x25\xed\x97\x5b\x9e\x06\x68\xc5\xf7\x50\x90\x76\xa5\x4c\xf4\x4d\x74\x29\x49\x59\x39\x4c\x1e\xf8\x1a\x1a\xa8\x94\x10\xf1\x96\x2e\x30\x6e\x39\x64\x33\xad\x98\x84\x73\xba\xe4\xd5\x59\x83\x1c\xc4\xe0\x5b\x65\x27\x7c\xe6\xe4\x7d\xd4\x1c\xa2\x4b\x03\x1c\x64\xbd\xda\xe2\x23\x52\x1a\x06\x33\xf2\x8e\xd3\xbb\xe5\x27\xd3\xcd\xe9\xa0\x25\x5a\xd2\x4e\x1a\xec\x71\xa7\x12\x6d\xbe\x00\xb6\xe8\x26\x59\xe8\x68\x8f\xda\xc9\xe0\x0b\x07\xe9\x96\x7d\xe0\x8b\x0f\x43\xe3\x27\x8b\x75\x5a\x27\x7e\x7a\x5a\x4e\xc3\xc8\xfd\x6a\x6e\xbc\xe3\x6c\x86\x63\x71\x43\xb0\x95\xcd\x6e\xc8\xe3\xec\x0c\x9b\x9b\x17\x9f\x15\x93\xe4\xb7\x53\xfc\x64\x0d\xff\x37\x58\x94\x12\x5a\xc5\xe4\x18\xf0\xf1\xa3\x8d\xc6\xbf\x9b\x83\xcb\x8b\x2f\x0d\x64\x70\x03\x6f\x4f\xe2\xfb\xf8\xad\x61\x0e\xb9\x19\x7e\xaf\x4d\x9f\x2d\x07\x35\xde\xaf\xa4\xdd\xc8\xdd\xe1\x1e\xbf\xac\x8e\xfe\xbb\x93\xc6\x39\xb7\x4f\xb6\x97\xfa\xdc\x07\xbd\x75\xb1\x3b\xee\x4f\xb6\x56\xde\x22\x47\x06\xbd\x1f\x3f\xce\xe0\x30\x87\xb1\x89\x3b\xc9\x9c\xd6\x7e\xa9\x4f\x36\x07\xdd\xf4\x35\xdf\x42\x56\xbf\x18\x76\xb3\xb9\x2d\x85\x9b\x39\xd4\x55\x03\x2b\x10\x03\x34\xb0\x02\x67\x70\x4e\x38\x90\x11\x2f\x51\x7c\xf4\x87\x6d\xb6\x27\x73\xf2\x77\x5b\xf4\xe7\x4d\xe0\x47\x5d\xf1\xc7\x7c\x73\xd0\x68\x63\xd1\x06\x66\x43\x19\x93\x96\x21\x9e\x27\x06\x44\x31\x07\x6e\x90\x59\x4b\xc6\x74\xd4\xb7\x54\xd4\x04\x07\xd7\x27\x6e\x56\xf6\x7a\x38\xc3\x54\xf7\x87\x78\x38\xc0\x7c\x75\x30\x1e\x3e\xf5\x1d\xff\xa7\x1c\xae\x97\x73\x27\xd3\x5a\xb2\xd1\x39\x60\x91\x6d\x2e\xb0\x5e\x11\x98\x76\x38\x53\x63\xcf\xd6\x58\xa1\xa6\x72\x17\x18\x82\x78\x80\x59\xe6\x07\x58\x0c\x68\x45\xac\x75\x75\x96\x77\x84\x8a\x67\x85\x77\x80\x85\x0a\xc7\x7c\x78\x30\x06\x51\xa6\x6c\x28\x08\x83\x39\x43\x06\x6d\x30\x06\x8d\x47\x7a\x65\xe8\x83\x56\x04\x6e\x1c\x57\x7a\x50\x68\x06\x7c\xa6\x72\x32\xa7\x7f\x78\x30\x75\x8b\x86\x85\xe9\x07\x86\x6d\x50\x07\x44\xd8\x86\xdb\x67\x45\x70\x80\x6d\x08\xc7\x1c\x82\x38\x7f\x56\x44\x2e\x1d\x33\x84\x74\x01\x75\x5f\x07\x86\xab\x27\x6d\x8f\xe7\x79\x4c\xd8\x02\x92\xa7\x79\x72\xd4\x47\x6c\xc7\x1c\x2e\x38\x7e\x7a\xd0\x66\x3a\xc0\x7a\x54\x88\x7b\x6d\xd0\x66\xc6\x15\x03\xb5\x66\x8a\xbb\x45\x5a\x9c\x67\x6b\xa5\x96\x55\x66\x10\x5a\x1d\x07\x58\x2e\x70\x5e\xc5\x27\x7a\xf1\xb1\x1b\xd1\xb5\x69\x2b\xa0\x5f\xf1\x74\x7b\x03\xf7\x15\xf6\x41\x68\x1f\x96\x8b\x9d\x83\x06\xbc\x55\x89\xd4\x27\x3c\x6b\x37\x36\xa4\x47\x17\xb0\x85\x7b\x70\x20\x85\x6b\xa0\x38\xff\x47\x19\x2e\xd0\x83\xdc\x26\x67\x31\xc3\x77\x72\x41\x17\x89\x78\x5b\xde\x28\x1e\x2d\x60\x2b\x72\x40\x7b\x32\x32\x14\x49\x07\x03\x34\x20\x8c\x2d\x27\x67\x0e\x68\x68\x24\x37\x70\xf2\x38\x5c\x30\x27\x1a\xf0\x94\x03\x55\x46\x8d\x62\x01\x23\xa2\x95\x64\xcc\x48\x71\x2c\x48\x2e\x37\x36\x5a\x91\x18\x8f\x60\x31\x36\x71\x43\x6c\xd4\xa8\x17\x5e\x41\x07\x72\x90\x07\x58\x98\x90\xd4\x67\x1a\xf2\x85\x6a\xff\x26\x8e\xca\x31\x8e\xe4\x45\x2e\x69\xc3\x58\xfe\x02\x7f\x73\x51\x21\xc5\xc7\x88\x6a\x62\x66\x56\x27\x6e\xca\xf6\x82\x39\xb7\x1b\x66\x13\x7d\xc5\xe7\x4d\x69\xf3\x31\xc5\x05\x61\x13\xf7\x92\x71\x20\x23\x63\x31\x72\xe3\x26\x87\xd4\x77\x3a\x1e\x63\x73\x75\x41\x17\xb8\x88\x7b\x44\x51\x7b\x75\xd1\x7b\x5a\x58\x1d\x63\x81\x07\x8f\xf3\x06\xf8\x96\x7d\x03\x47\x07\x7a\xe0\x20\x44\x91\x74\x63\x38\x70\x4a\xc8\x58\x8e\xe5\x84\xb0\x78\x5b\x77\x80\x71\x00\x29\x6f\x9d\x47\x7d\x78\xd0\x5c\x74\xa0\x16\xec\x47\x84\x02\xd7\x72\x61\x18\x65\x2a\x29\x95\x64\xe8\x92\xdc\xc6\x34\x3a\x33\x97\xd1\xe6\x5d\x16\x49\x71\x78\x50\x20\xff\xe6\x48\xd8\x48\x7a\x67\xe9\x97\x7a\x49\x92\x87\x36\x70\x78\x00\x74\x71\x03\x94\x14\xa7\x07\x3f\xb6\x71\x7f\x25\x85\xcf\xf1\x4c\x96\x79\x99\x98\x99\x99\x9a\xb9\x99\x9c\xd9\x99\x9e\xf9\x99\xa0\x19\x9a\xa2\x39\x9a\xa4\x59\x9a\xa6\x79\x9a\xa8\x99\x9a\xaa\xb9\x9a\xac\xd9\x9a\xae\xf9\x9a\xb0\x19\x9b\xb2\x39\x9b\xb4\x59\x9b\xb6\x79\x9b\xb8\x99\x9b\xba\xb9\x9b\xbc\xd9\x9b\xbe\xf9\x9b\xc0\x19\x9c\xc2\x39\x9c\xb6\x09") ) -func TestReadPackageInfo(t *testing.T) { - var tests = []struct { - PKGINFO string - Package - }{ - { - testPackageInfo, Package{ - Name: "xterm", - Version: "330", - Release: "1", - Arch: []string{"x86_64"}, - Size: 851968, - }, - }, - { - testPackageInfo2, Package{ - Name: "imagemagick", - Version: "6.9.9.15", - Release: "1", - Arch: []string{"x86_64"}, - Size: 9897984, - }, - }, - } - for _, test := range tests { - t.Run(test.Package.String(), func(t *testing.T) { - p, err := ReadPackageInfo(bytes.NewBufferString(test.PKGINFO)) - if err != nil { - t.Fatal(err) - } - testComparePackage(t, p, &test.Package) - }) - } -} - -var ( - testPackageInfo = `# Generated by makepkg 5.0.2 -# using fakeroot version 1.21 -# Fri Jun 23 20:03:18 UTC 2017 -pkgname = xterm -pkgver = 330-1 -pkgdesc = X Terminal Emulator -url = http://invisible-island.net/xterm/ -builddate = 1498248198 -packager = Andreas Radke -size = 851968 -arch = x86_64 -license = custom -depend = libxft -depend = libxaw -depend = ncurses -depend = xorg-luit -depend = xbitmaps -depend = libutempter -depend = libxkbfile -` - testPackageInfo2 = `# Generated by makepkg 5.0.2 -# using fakeroot version 1.22 -# Sat Sep 23 21:53:45 UTC 2017 -pkgname = imagemagick -pkgbase = imagemagick -pkgver = 6.9.9.15-1 -pkgdesc = An image viewing/manipulation program -url = http://www.imagemagick.org/ -builddate = 1506203625 -packager = Antonio Rojas -size = 9897984 -arch = x86_64 -license = custom -backup = etc/ImageMagick-6/coder.xml -backup = etc/ImageMagick-6/colors.xml -backup = etc/ImageMagick-6/delegates.xml -backup = etc/ImageMagick-6/log.xml -backup = etc/ImageMagick-6/magic.xml -backup = etc/ImageMagick-6/mime.xml -backup = etc/ImageMagick-6/policy.xml -backup = etc/ImageMagick-6/quantization-table.xml -backup = etc/ImageMagick-6/thresholds.xml -backup = etc/ImageMagick-6/type.xml -backup = etc/ImageMagick-6/type-dejavu.xml -backup = etc/ImageMagick-6/type-ghostscript.xml -backup = etc/ImageMagick-6/type-windows.xml -depend = libltdl -depend = lcms2 -depend = libxt -depend = fontconfig -depend = libxext -depend = liblqr -depend = libraqm -depend = opencl-icd-loader -depend = perl>=5.26 -depend = perl<5.27 -optdepend = imagemagick-doc: for additional information -optdepend = ghostscript: for Ghostscript support -optdepend = openexr: for OpenEXR support -optdepend = openjpeg2: for JP2 support -optdepend = libwmf: for WMF support -optdepend = librsvg: for SVG support -optdepend = libxml2: for XML support -optdepend = libpng: for PNG support -optdepend = libwebp: for WEBP support -optdepend = libraw: for DNG support -makedepend = libltdl -makedepend = lcms2 -makedepend = libxt -makedepend = fontconfig -makedepend = libxext -makedepend = ghostscript -makedepend = openexr -makedepend = libwmf -makedepend = librsvg -makedepend = libxml2 -makedepend = liblqr -makedepend = openjpeg2 -makedepend = libraw -makedepend = libraqm -makedepend = opencl-headers -makedepend = opencl-icd-loader -makedepend = libwebp -makedepend = subversion -makedepend = glu -` -) - -func TestReadPackageInfoError(t *testing.T) { - var tests = []struct { - PKGINFO string - Error string - }{ - {testPackageInfoError, `unknown PKGINFO field`}, - {testPackageInfoErrorName, "name is missing"}, - {testPackageInfoErrorVersion, "version is missing"}, - {testPackageInfoErrorVersionInvalid, "invalid version"}, - {testPackageInfoErrorRelease, "release is missing"}, - } - for _, test := range tests { - t.Run(test.Error, func(t *testing.T) { - _, err := ReadPackageInfo(bytes.NewBufferString(test.PKGINFO)) - if err == nil { - t.Fatal("expected error") - } - if s := err.Error(); !strings.Contains(s, test.Error) { - t.Fatalf(`expected error %q, got %q`, test.Error, s) - } - }) - } -} - -var ( - testPackageInfoError = `foo = bar` - testPackageInfoErrorName = `pkgver = 330-1` - testPackageInfoErrorVersion = `pkgname = xterm` - testPackageInfoErrorVersionInvalid = `pkgname = xterm -pkgver = 330` - testPackageInfoErrorRelease = `pkgname = xterm -pkgver = 330-` -) - -func TestWritePackageInfo(t *testing.T) { - if err := testWritePackageInfo.WritePackageInfo(ioutil.Discard); err != nil { - t.Fatal(err) - } -} - -var ( - testWritePackageInfo = &Package{ - Name: "imagemagick", - Base: "imagemagick", - Version: "6.9.9.15", - Release: "1", - Description: "An image viewing/manipulation program", - Arch: []string{"x86_64"}, - License: []string{"custom"}, - Depends: []string{"libltdl", "lcms2", "libxt", "fontconfig", "libxext", "liblqr", "libraqm", "opencl-icd-loader", "perl>=5.26", "perl<5.27"}, - MakeDepends: []string{"libltdl", "lcms2", "libxt", "fontconfig", "libxext", "ghostscript", "openexr", "libwmf", "librsvg", "libxml2", "liblqr", "openjpeg2", "libraw", "libraqm", "opencl-headers", "opencl-icd-loader", "libwebp", "subversion", "glu"}, - OptionalDepends: []string{"imagemagick-doc: for additional information", "ghostscript: for Ghostscript support", "openexr: for OpenEXR support", "openjpeg2: for JP2 support", "libwmf: for WMF support", "librsvg: for SVG support", "libxml2: for XML support", "libpng: for PNG support", "libwebp: for WEBP support", "libraw: for DNG support"}, - Backup: []string{"etc/ImageMagick-6/coder.xml", "etc/ImageMagick-6/colors.xml", "etc/ImageMagick-6/delegates.xml", "etc/ImageMagick-6/log.xml", "etc/ImageMagick-6/magic.xml", "etc/ImageMagick-6/mime.xml", "etc/ImageMagick-6/policy.xml", "etc/ImageMagick-6/quantization-table.xml", "etc/ImageMagick-6/thresholds.xml", "etc/ImageMagick-6/type.xml", "etc/ImageMagick-6/type-dejavu.xml", "etc/ImageMagick-6/type-ghostscript.xml", "etc/ImageMagick-6/type-windows.xml"}, - Size: 9897984, - BuildDate: time.Unix(1506203625, 0), - Packager: "Antonio Rojas ", - } -) - -func TestReadPackageDesc(t *testing.T) { - pkg, err := ReadPackageDesc(bytes.NewBufferString(testReadPackageDesc)) - if err != nil { - t.Fatal(err) - } - // TODO(maze): checks - _ = pkg -} - -var ( - testReadPackageDesc = `%FILENAME% -perl-5.26.0-4-x86_64.pkg.tar.xz - -%NAME% -perl - -%VERSION% -5.26.0-4 - -%DESC% -A highly capable, feature-rich programming language - -%GROUPS% -base - -%CSIZE% -14343632 - -%ISIZE% -54492160 - -%MD5SUM% -08a8b1fcab42ec43fdf07c4a5b1b2f50 - -%SHA256SUM% -ab958e0796650557a227f7eff56924ea8d03160803f8d061717b6013ee0045c1 - -%PGPSIG% -iQEzBAABCAAdFiEEhs/8qRjPOvRxR1iAUeixSKmZnDQFAlmew3MACgkQUeixSKmZnDRRhwf/Q0Ve+pIQAxknR0v3p2FyWgfuanwYCpWhIZgTCKGCmCntayBKZ0U9v41Mac7PJ11AJvntNWJ9vhmR3dqpj6AOw6lXa4AGXUCHOmo21FMYEPltcp27zRCk/7FHFHwxDd+8y0cU8x4l7QVmTq4odMjAQiimMEcxY/jXsoUX084SzOQ02ix2DA67spFLAD7BC9z6tmdH9ABXaRA8QL51uQxGaQ+fxc8FKXFjOhbNyPcjOZasiwvrLboB/nQRfygf0baBSzzbM/hOnHVgqc3WfAqE1y4Qve8cE1L+2hhXXHaFCj9/v6vI1JZGQlMYisbhYMuK0n4kM4RbX7N6I78IHuRuyg== - -%URL% -http://www.perl.org - -%LICENSE% -GPL -PerlArtistic - -%ARCH% -x86_64 - -%BUILDDATE% -1503575763 - -%PACKAGER% -Evangelos Foutras - -%PROVIDES% -perl-archive-tar=2.24 -perl-attribute-handlers=0.99 -perl-autodie=2.29 -perl-autoloader=5.74 -perl-autouse=1.11 -perl-b-debug=1.24 -perl-base=2.25 -perl-bignum=0.47 -perl-carp=1.42 -perl-compress-raw-bzip2=2.074 -perl-compress-raw-zlib=2.074 -perl-config-perl-v=0.28 -perl-constant=1.33 -perl-cpan-meta-requirements=2.140 -perl-cpan-meta-yaml=0.018 -perl-cpan-meta=2.150010 -perl-cpan=2.18 -perl-data-dumper=2.167 -perl-db_file=1.840 -perl-devel-ppport=3.35 -perl-devel-selfstubber=1.06 -perl-digest-md5=2.55 -perl-digest-sha=5.96 -perl-digest=1.17_01 -perl-dumpvalue=1.18 -perl-encode=2.88 -perl-encoding-warnings=0.13 -perl-env=1.04 -perl-experimental=0.016 -perl-exporter=5.72 -perl-extutils-cbuilder=0.280225 -perl-extutils-constant=0.23 -perl-extutils-install=2.04 -perl-extutils-makemaker=7.24 -perl-extutils-manifest=1.70 -perl-extutils-parsexs=3.34 -perl-file-fetch=0.52 -perl-file-path=2.12_01 -perl-file-temp=0.2304 -perl-filter-simple=0.93 -perl-filter-util-call=1.55 -perl-getopt-long=2.49 -perl-http-tiny=0.070 -perl-i18n-collate=1.02 -perl-i18n-langtags=0.42 -perl-if=0.0606 -perl-io-compress=2.074 -perl-io-socket-ip=0.38 -perl-io-zlib=1.10 -perl-io=1.38 -perl-ipc-cmd=0.96 -perl-ipc-sysv=2.07 -perl-json-pp=2.27400_02 -perl-lib=0.64 -perl-libnet=3.10 -perl-locale-codes=3.42 -perl-locale-maketext-simple=0.21_01 -perl-locale-maketext=1.28 -perl-math-bigint-fastcalc=0.5005 -perl-math-bigint=1.999806 -perl-math-bigrat=0.2611 -perl-math-complex=1.5901 -perl-memoize=1.03_01 -perl-mime-base64=3.15 -perl-module-corelist=5.20170530 -perl-module-load-conditional=0.68 -perl-module-load=0.32 -perl-module-loaded=0.08 -perl-module-metadata=1.000033 -perl-net-ping=2.55 -perl-params-check=0.38 -perl-parent=0.236 -perl-pathtools=3.67 -perl-perl-ostype=1.010 -perl-perlfaq=5.021011 -perl-perlio-via-quotedprint=0.08 -perl-pod-checker=1.73 -perl-pod-escapes=1.07 -perl-pod-parser=1.63 -perl-pod-perldoc=3.28 -perl-pod-simple=3.35 -perl-pod-usage=1.69 -perl-podlators=5.006 -perl-safe=2.40 -perl-scalar-list-utils=1.46_02 -perl-search-dict=1.07 -perl-selfloader=1.23 -perl-socket=2.020_03 -perl-storable=2.62 -perl-sys-syslog=0.35 -perl-term-ansicolor=4.06 -perl-term-cap=1.17 -perl-term-complete=1.403 -perl-term-readline=1.16 -perl-test-harness=3.38 -perl-test-simple=1.302073 -perl-test=1.30 -perl-text-abbrev=1.02 -perl-text-balanced=2.03 -perl-text-parsewords=3.30 -perl-text-tabs=2013.0523 -perl-thread-queue=3.12 -perl-thread-semaphore=2.13 -perl-threads-shared=1.56 -perl-threads=2.15 -perl-tie-file=1.02 -perl-tie-refhash=1.39 -perl-time-hires=1.9741 -perl-time-local=1.25 -perl-time-piece=1.31 -perl-unicode-collate=1.19 -perl-unicode-normalize=1.25 -perl-version=0.9917 -perl-xsloader=0.27 - -%DEPENDS% -gdbm -db -glibc - -` -) - func TestParsePackageArchiveName(t *testing.T) { var tests = []struct { Archive string