diff options
| author | Jeff Carr <[email protected]> | 2025-10-11 11:08:20 -0500 | 
|---|---|---|
| committer | Jeff Carr <[email protected]> | 2025-10-11 11:09:39 -0500 | 
| commit | b60a841021e44552b6413b4fcc4a79c4b8e39357 (patch) | |
| tree | a03b2054c1c9f4c0e626e81953547265ace45313 | |
| parent | 52e3dcde67bf679aea491922761e79fb243b2a80 (diff) | |
goes in 'mirrors' foreverv0.0.36
| -rw-r--r-- | debVersion.go | 287 | 
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) - -}  | 
