class RPM::Version
Public Class Methods
@overload new(vr, e = nil)
Creates a version object from a string representation @param [String] vr version and release in the form "v-r" @param [Number] e epoch @return [Version]
@overload new(v, r, e = nil)
Creates a version object from a string representation @param [String] v version @param [String] r release @param [Number] e epoch @return [Version]
@example
RPM:: Version.new "1.0.0-3" RPM:: Version.new "1.04" RPM:: Version.new "1.0.0-3k", 1 RPM:: Version.new "2.0.3", "5k"
static VALUE
version_initialize(int argc, VALUE* argv, VALUE ver)
{
VALUE v = Qnil;
VALUE r = Qnil;
VALUE e = Qnil;
switch (argc) {
case 0:
rb_raise(rb_eArgError, "argument too few(1..3)");
case 1:
if (TYPE(argv[0]) != T_STRING) {
rb_raise(rb_eTypeError, "illegal argument type");
}
version_parse(RSTRING_PTR(argv[0]), &v, &r, &e);
break;
case 2:
if (TYPE(argv[0]) != T_STRING) {
rb_raise(rb_eTypeError, "illegal argument type");
}
version_parse(RSTRING_PTR(argv[0]), &v, &r, &e);
if (e != Qnil) {
rb_raise(rb_eTypeError, "illegal argument value");
}
e = rb_Integer(argv[1]);
break;
case 3:
if (TYPE(argv[0]) != T_STRING
|| TYPE(argv[1]) != T_STRING) {
rb_raise(rb_eTypeError, "illegal argument type");
}
v = rb_str_new2(RSTRING_PTR(argv[0]));
r = rb_str_new2(RSTRING_PTR(argv[1]));
e = rb_Integer(argv[2]);
break;
default:
rb_raise(rb_eArgError, "argument too many(1..3)");
}
if (NIL_P(v) || (!NIL_P(e) && NUM2INT(e) < 0)) {
rb_raise(rb_eArgError, "illegal argument value");
}
rb_ivar_set(ver, id_v, v);
rb_ivar_set(ver, id_r, r);
rb_ivar_set(ver, id_e, e);
return ver;
}
Public Instance Methods
Comparison between versions @param [Version] other @return [Number] -1 if
other is greater than, 0 if other is equal to,
and +1 if other is less than version.
@example
v1 = RPM::Version.new("3.0-0",1)
v2 = RPM::Version.new("3.1-0",1)
v1 <=> v2
=> -1
VALUE
rpm_version_cmp(VALUE ver, VALUE other)
{
VALUE ve,oe;
VALUE vr,or;
VALUE vv,ov;
int sense = 0;
if (rb_obj_is_kind_of(other, rpm_cVersion) != Qtrue) {
rb_raise(rb_eTypeError, "illegal argument type");
}
ve = rb_ivar_get(ver,id_e);
oe = rb_ivar_get(other,id_e);
if (!NIL_P(ve) && NUM2INT(ve) > 0 && NIL_P(oe))
return INT2FIX(1);
else if (NIL_P(ve) && !NIL_P(oe) && NUM2INT(oe) > 0)
return INT2FIX(-1);
else if (!NIL_P(ve) && !NIL_P(oe)) {
if (NUM2INT(ve) < NUM2INT(oe))
return INT2FIX(-1);
else if (NUM2INT(ve) > NUM2INT(oe))
return INT2FIX(1);
}
vv = rb_ivar_get(ver,id_v);
ov = rb_ivar_get(other,id_v);
if (!NIL_P(vv) && NIL_P(ov)) /* XXX */
return INT2FIX(1);
else if (NIL_P(vv) && !NIL_P(ov)) /* XXX */
return INT2FIX(-1);
else if (!NIL_P(vv) && !NIL_P(ov)) {
sense = rpmvercmp(RSTRING_PTR(vv), RSTRING_PTR(ov));
if (sense)
return INT2FIX(sense);
}
vr = rb_ivar_get(ver,id_r);
or = rb_ivar_get(other,id_r);
if (!NIL_P(vr) && NIL_P(or))
return INT2FIX(1);
else if (NIL_P(vr) && !NIL_P(or))
return INT2FIX(-1);
else if (!NIL_P(vr) && !NIL_P(or)) {
sense = rpmvercmp(RSTRING_PTR(vr), RSTRING_PTR(or));
}
return INT2FIX(sense);
}
Access the epoch component @return [Number] epoch component or nil if the
version does not have an epoch component
VALUE
rpm_version_get_e(VALUE ver)
{
return rb_ivar_get(ver, id_e);
}
Hash based on the version content @return [String]
VALUE
rpm_version_hash(VALUE ver)
{
long h;
VALUE v, r, e;
v = rb_ivar_get(ver, id_v);
r = rb_ivar_get(ver, id_r);
e = rb_ivar_get(ver, id_e);
h = NIL_P(e) ? 0 : NUM2INT(e);
h = (h << 1) ^ NUM2LONG(rb_hash(r));
h = (h << 1) ^ NUM2LONG(rb_hash(v));
return LONG2FIX(h);
}
Inspect the version object @return [String] object in the form “#<RPM::Version v=V, r=R, e=E>”
VALUE
rpm_version_inspect(VALUE ver)
{
char buf[BUFSIZ];
VALUE v, r, e;
v = rb_ivar_get(ver, id_v);
r = rb_ivar_get(ver, id_r);
e = rb_ivar_get(ver, id_e);
if (!NIL_P(e)) {
snprintf(buf, BUFSIZ, "#<RPM::Version v=%s, r=%s, e=%ld>", RSTRING_PTR(rb_inspect(v)), RSTRING_PTR(rb_inspect(r)), (long) NUM2INT(e));
} else {
snprintf(buf, BUFSIZ, "#<RPM::Version v=%s, r=%s>", RSTRING_PTR(rb_inspect(v)), RSTRING_PTR(rb_inspect(r)));
}
return rb_str_new2(buf);
}
@param [Version] other Version to compare
against @return [Boolean] true if the version is newer than
other
VALUE
rpm_version_is_newer(VALUE ver, VALUE other)
{
return (NUM2INT(rpm_version_cmp(ver, other)) > 0) ? Qtrue : Qfalse;
}
@param [Version] other Version to compare
against @return [Boolean] true if the version is older than
other
VALUE
rpm_version_is_older(VALUE ver, VALUE other)
{
return rpm_version_is_newer(ver, other) ? Qfalse : Qtrue;
}
Access the release component @return [String] release component or nil if the
version does not have a release component
VALUE
rpm_version_get_r(VALUE ver)
{
return rb_ivar_get(ver, id_r);
}
String representation in the form “v-r” @return [String] @note The epoch is not included
VALUE
rpm_version_to_s(VALUE ver)
{
char buf[BUFSIZ];
char *p = buf;
VALUE v, r;
v = rb_ivar_get(ver, id_v);
r = rb_ivar_get(ver, id_r);
strcpy(p, RSTRING_PTR(v));
if (!NIL_P(r)) {
strcat(p, "-");
strcat(p, RSTRING_PTR(r));
}
return rb_str_new2(buf);
}
String representation in the form “e:v-r” @return [String] @note The epoch is included
VALUE
rpm_version_to_vre(VALUE ver)
{
char buf[BUFSIZ];
char *p = buf;
VALUE v, r, e;
v = rb_ivar_get(ver, id_v);
r = rb_ivar_get(ver, id_r);
e = rb_ivar_get(ver, id_e);
if (!NIL_P(e)) {
snprintf(buf,BUFSIZ,"%ld:", (long) NUM2INT(e));
p += strlen(buf);
}
strcpy(p, RSTRING_PTR(v));
if (!NIL_P(r)) {
strcat(p, "-");
strcat(p, RSTRING_PTR(r));
}
return rb_str_new2(buf);
}
Access the version component @return [String] version component
VALUE
rpm_version_get_v(VALUE ver)
{
return rb_ivar_get(ver, id_v);
}