mirror of
https://github.com/rocky-linux/peridot.git
synced 2024-11-27 15:36:25 +00:00
104 lines
2.7 KiB
Go
104 lines
2.7 KiB
Go
|
package rpm
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
)
|
||
|
|
||
|
// Dependency flags indicate how versions comparisons should be computed when
|
||
|
// comparing versions of dependent packages.
|
||
|
const (
|
||
|
DepFlagAny = 0
|
||
|
DepFlagLesser = (1 << 1)
|
||
|
DepFlagGreater = (1 << 2)
|
||
|
DepFlagEqual = (1 << 3)
|
||
|
DepFlagLesserOrEqual = (DepFlagEqual | DepFlagLesser)
|
||
|
DepFlagGreaterOrEqual = (DepFlagEqual | DepFlagGreater)
|
||
|
DepFlagPrereq = (1 << 6)
|
||
|
DepFlagScriptPre = (1 << 9)
|
||
|
DepFlagScriptPost = (1 << 10)
|
||
|
DepFlagScriptPreUn = (1 << 11)
|
||
|
DepFlagScriptPostUn = (1 << 12)
|
||
|
DepFlagRpmlib = (1 << 24)
|
||
|
)
|
||
|
|
||
|
// See: https://github.com/rpm-software-management/rpm/blob/master/lib/rpmds.h#L25
|
||
|
|
||
|
// Dependency is an interface which represents a relationship between two
|
||
|
// packages. It might indicate that one package requires, conflicts with,
|
||
|
// obsoletes or provides another package.
|
||
|
//
|
||
|
// Dependency implements the Version interface and so may be used when comparing
|
||
|
// versions.
|
||
|
type Dependency interface {
|
||
|
Version // Version of the other package
|
||
|
|
||
|
Name() string // Name of the other package
|
||
|
Flags() int // See the DepFlag constants
|
||
|
}
|
||
|
|
||
|
// private basic implementation of a package dependency.
|
||
|
type dependency struct {
|
||
|
flags int
|
||
|
name string
|
||
|
epoch int
|
||
|
version string
|
||
|
release string
|
||
|
}
|
||
|
|
||
|
var _ Dependency = &dependency{}
|
||
|
|
||
|
// Flags determines the nature of the package relationship and the comparison
|
||
|
// used for the given version constraint.
|
||
|
func (c *dependency) Flags() int {
|
||
|
return c.flags
|
||
|
}
|
||
|
|
||
|
// Name is the name of the package target package.
|
||
|
func (c *dependency) Name() string {
|
||
|
return c.name
|
||
|
}
|
||
|
|
||
|
// Epoch is the epoch constraint of the target package.
|
||
|
func (c *dependency) Epoch() int {
|
||
|
return c.epoch
|
||
|
}
|
||
|
|
||
|
// Version is the version constraint of the target package.
|
||
|
func (c *dependency) Version() string {
|
||
|
return c.version
|
||
|
}
|
||
|
|
||
|
// Release is the release constraint of the target package.
|
||
|
func (c *dependency) Release() string {
|
||
|
return c.release
|
||
|
}
|
||
|
|
||
|
// String returns a string representation of a package dependency in a similar
|
||
|
// format to `rpm -qR`.
|
||
|
func (c *dependency) String() string {
|
||
|
s := c.name
|
||
|
switch {
|
||
|
case DepFlagLesserOrEqual == (c.flags & DepFlagLesserOrEqual):
|
||
|
s = fmt.Sprintf("%s <=", s)
|
||
|
|
||
|
case DepFlagLesser == (c.flags & DepFlagLesser):
|
||
|
s = fmt.Sprintf("%s <", s)
|
||
|
|
||
|
case DepFlagGreaterOrEqual == (c.flags & DepFlagGreaterOrEqual):
|
||
|
s = fmt.Sprintf("%s >=", s)
|
||
|
|
||
|
case DepFlagGreater == (c.flags & DepFlagGreater):
|
||
|
s = fmt.Sprintf("%s >", s)
|
||
|
|
||
|
case DepFlagEqual == (c.flags & DepFlagEqual):
|
||
|
s = fmt.Sprintf("%s =", s)
|
||
|
}
|
||
|
if c.version != "" {
|
||
|
s = fmt.Sprintf("%s %s", s, c.version)
|
||
|
}
|
||
|
if c.release != "" {
|
||
|
s = fmt.Sprintf("%s.%s", s, c.release)
|
||
|
}
|
||
|
return s
|
||
|
}
|