summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2025-10-11 11:08:20 -0500
committerJeff Carr <[email protected]>2025-10-11 11:09:39 -0500
commitb60a841021e44552b6413b4fcc4a79c4b8e39357 (patch)
treea03b2054c1c9f4c0e626e81953547265ace45313
parent52e3dcde67bf679aea491922761e79fb243b2a80 (diff)
goes in 'mirrors' foreverv0.0.36
-rw-r--r--debVersion.go287
1 files changed, 0 insertions, 287 deletions
diff --git a/debVersion.go b/debVersion.go
deleted file mode 100644
index c10fc81..0000000
--- a/debVersion.go
+++ /dev/null
@@ -1,287 +0,0 @@
-package fhelp
-
-// the origin repo was broken. pulled in from:
-// MIT License
-// Copyright (c) 2017 Teppei Fukuda
-
-import (
- "errors"
- "fmt"
- "reflect"
- "regexp"
- "strconv"
- "strings"
- "unicode"
-)
-
-type defaultNumSlice []int
-
-// get function returns 0, if the slice does not have the specified index.
-func (n defaultNumSlice) get(i int) int {
- if len(n) > i {
- return n[i]
- }
- return 0
-}
-
-type defaultStringSlice []string
-
-// get function returns "", if the slice does not have the specified index.
-func (s defaultStringSlice) get(i int) string {
- if len(s) > i {
- return s[i]
- }
- return ""
-}
-
-// Version represents a package version (http://man.he.net/man5/deb-version).
-type Version struct {
- epoch int
- upstreamVersion string
- debianRevision string
-}
-
-var (
- digitRegexp = regexp.MustCompile(`[0-9]+`)
- nonDigitRegexp = regexp.MustCompile(`[^0-9]+`)
-)
-
-// NewDebVersion returns a parsed version
-func NewDebVersion(ver string) (version Version, err error) {
- // Trim space
- ver = strings.TrimSpace(ver)
-
- // Parse epoch
- splitted := strings.SplitN(ver, ":", 2)
- if len(splitted) == 1 {
- version.epoch = 0
- ver = splitted[0]
- } else {
- version.epoch, err = strconv.Atoi(splitted[0])
- if err != nil {
- return Version{}, fmt.Errorf("epoch parse error: %v", err)
- }
-
- if version.epoch < 0 {
- return Version{}, errors.New("epoch is negative")
- }
- ver = splitted[1]
- }
-
- // Parse upstream_version and debian_revision
- index := strings.LastIndex(ver, "-")
- if index >= 0 {
- version.upstreamVersion = ver[:index]
- version.debianRevision = ver[index+1:]
-
- } else {
- version.upstreamVersion = ver
- }
-
- // Verify upstream_version is valid
- err = verifyUpstreamVersion(version.upstreamVersion)
- if err != nil {
- return Version{}, err
- }
-
- // Verify debian_revision is valid
- err = verifyDebianRevision(version.debianRevision)
- if err != nil {
- return Version{}, err
- }
-
- return version, nil
-}
-
-func verifyUpstreamVersion(str string) error {
- if len(str) == 0 {
- return errors.New("upstream_version is empty")
- }
-
- // The upstream-version should start with a digit
- if !unicode.IsDigit(rune(str[0])) {
- return errors.New("upstream_version must start with digit")
- }
-
- // The upstream-version may contain only alphanumerics("A-Za-z0-9") and the characters .+-:~
- allowedSymbols := ".-+~:_"
- for _, s := range str {
- if !unicode.IsDigit(s) && !unicode.IsLetter(s) && !strings.ContainsRune(allowedSymbols, s) {
- return errors.New("upstream_version includes invalid character")
- }
- }
- return nil
-}
-
-func verifyDebianRevision(str string) error {
- // The debian-revision may contain only alphanumerics and the characters +.~
- allowedSymbols := "+.~_"
- for _, s := range str {
- if !unicode.IsDigit(s) && !unicode.IsLetter(s) && !strings.ContainsRune(allowedSymbols, s) {
- return errors.New("debian_revision includes invalid character")
- }
- }
- return nil
-}
-
-// Valid validates the version
-func Valid(ver string) bool {
- _, err := NewDebVersion(ver)
- return err == nil
-}
-
-// Equal returns whether this version is equal with another version.
-func (v1 *Version) Equal(v2 Version) bool {
- return v1.Compare(v2) == 0
-}
-
-// GreaterThan returns whether this version is greater than another version.
-func (v1 *Version) GreaterThan(v2 Version) bool {
- return v1.Compare(v2) > 0
-}
-
-// LessThan returns whether this version is less than another version.
-func (v1 *Version) LessThan(v2 Version) bool {
- return v1.Compare(v2) < 0
-}
-
-// Compare returns an integer comparing two version according to deb-version.
-// The result will be 0 if v1==v2, -1 if v1 < v2, and +1 if v1 > v2.
-func (v1 *Version) Compare(v2 Version) int {
- // Equal
- if reflect.DeepEqual(v1, v2) {
- return 0
- }
-
- // Compare epochs
- if v1.epoch > v2.epoch {
- return 1
- } else if v1.epoch < v2.epoch {
- return -1
- }
-
- // Compare version
- ret := compare(v1.upstreamVersion, v2.upstreamVersion)
- if ret != 0 {
- return ret
- }
-
- //Compare debian_revision
- return compare(v1.debianRevision, v2.debianRevision)
-}
-
-// String returns the full version string
-func (v1 *Version) String() string {
- version := ""
- if v1.epoch > 0 {
- version += fmt.Sprintf("%d:", v1.epoch)
- }
- version += v1.upstreamVersion
-
- if v1.debianRevision != "" {
- version += fmt.Sprintf("-%s", v1.debianRevision)
-
- }
- return version
-}
-
-func (v1 *Version) Epoch() int {
- return v1.epoch
-}
-
-func (v1 *Version) Version() string {
- return v1.upstreamVersion
-}
-
-func (v1 *Version) Revision() string {
- return v1.debianRevision
-}
-
-func compare(v1, v2 string) int {
- // Equal
- if v1 == v2 {
- return 0
- }
-
- // Extract digit strings and non-digit strings
- numbers1, strings1 := extract(v1)
- numbers2, strings2 := extract(v2)
-
- if len(v1) > 0 && unicode.IsDigit(rune(v1[0])) {
- strings1 = append([]string{""}, strings1...)
- }
- if len(v2) > 0 && unicode.IsDigit(rune(v2[0])) {
- strings2 = append([]string{""}, strings2...)
- }
-
- index := max(len(numbers1), len(numbers2), len(strings1), len(strings2))
- for i := 0; i < index; i++ {
- // Compare non-digit strings
- diff := compareString(strings1.get(i), strings2.get(i))
- if diff != 0 {
- return diff
- }
-
- // Compare digit strings
- diff = numbers1.get(i) - numbers2.get(i)
- if diff != 0 {
- return diff
- }
- }
-
- return 0
-}
-
-func compareString(s1, s2 string) int {
- if s1 == s2 {
- return 0
- }
-
- index := max(len(s1), len(s2))
- for i := 0; i < index; i++ {
- a := 0
- if i < len(s1) {
- a = order(rune(s1[i]))
- }
-
- b := 0
- if i < len(s2) {
- b = order(rune(s2[i]))
- }
-
- if a != b {
- return a - b
- }
- }
- return 0
-}
-
-// order function returns the number corresponding to rune
-func order(r rune) int {
- // all the letters sort earlier than all the non-letters
- if unicode.IsLetter(r) {
- return int(r)
- }
-
- // a tilde sorts before anything
- if r == '~' {
- return -1
- }
-
- return int(r) + 256
-}
-
-func extract(version string) (defaultNumSlice, defaultStringSlice) {
- numbers := digitRegexp.FindAllString(version, -1)
-
- var dnum defaultNumSlice
- for _, number := range numbers {
- n, _ := strconv.Atoi(number)
- dnum = append(dnum, n)
- }
-
- s := nonDigitRegexp.FindAllString(version, -1)
-
- return dnum, defaultStringSlice(s)
-
-}