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); }