rpm  5.4.4
ruby/spec-rb.c
Go to the documentation of this file.
00001 
00009 #include "system.h"
00010 
00011 #include "rpm-rb.h"
00012 #include "spec-rb.h"
00013 #include "rpmmc-rb.h"
00014 #include "package-rb.h"
00015 
00016 #ifndef _GNU_SOURCE
00017 #define _GNU_SOURCE
00018 #endif
00019 #include <stdio.h>
00020 
00021 #define _RPMTS_INTERNAL
00022 #define _RPMFI_INTERNAL
00023 #include <rpmtag.h>
00024 #include <rpmtypes.h>
00025 #include <rpmio.h>
00026 #include <rpmbuild.h>
00027 #include <rpmspec.h>
00028 #include <rpmmacro.h>
00029 
00030 
00031 VALUE specClass;
00032 
00033 
00037 static void
00038 _spec_free(Spec spec)
00039 {
00040     freeSpec(spec);
00041 }
00042 
00043 
00047 static Spec
00048 _spec_get_spec(VALUE self)
00049 {
00050     Spec spec;
00051     Data_Get_Struct(self, struct Spec_s, spec);
00052     return spec;
00053 }
00054 
00055 
00059 static rpmts
00060 _spec_get_ts(VALUE self)
00061 {
00062     rpmts ts;
00063     Data_Get_Struct(rb_iv_get(self, "ts"), struct rpmts_s, ts);
00064     return ts;
00065 }
00066 
00067 
00072 static VALUE
00073 _spec_get_sources(VALUE self, int flags)
00074 {
00075     Spec spec = _spec_get_spec(self);
00076 
00077     VALUE ary = rb_ary_new();
00078 
00079     SpecSource src;
00080     for(src = spec->sources; src != NULL; src = src->next)
00081         if(src->flags & flags)
00082             rb_ary_push(ary, rb_str_new2(src->fullSource));
00083 
00084     return ary;
00085 }
00086 
00087 
00096 static
00097 VALUE spec_get_sources(VALUE self)
00098 {
00099     return _spec_get_sources(self, RPMFILE_SOURCE);
00100 }
00101 
00102 
00111 static VALUE
00112 spec_get_patches(VALUE self)
00113 {
00114     return _spec_get_sources(self, RPMFILE_PATCH);
00115 }
00116 
00117 
00130 static VALUE
00131 spec_get_packages(VALUE self)
00132 {
00133     VALUE pkg_ary = rb_ary_new();
00134     Spec spec = _spec_get_spec(self);
00135     
00136     Package pkg;
00137     for(pkg = spec->packages; pkg != NULL; pkg = pkg->next)
00138         rb_ary_push(pkg_ary, Data_Wrap_Struct(packageClass, 0, -1, pkg));
00139 
00140     return pkg_ary;
00141 }
00142 
00143 
00152 static VALUE
00153 spec_get_macros(VALUE self)
00154 {
00155     Spec spec = _spec_get_spec(self);
00156     return rpmmc_wrap(spec->macros);
00157 }
00158 
00159 
00175 static VALUE
00176 spec_build(VALUE argc, VALUE *argv, VALUE self)
00177 {
00178     VALUE test_v = T_FALSE, flags_v;
00179     rb_scan_args(argc, argv, "11", &flags_v, &test_v);
00180 
00181     int test = 0;
00182     switch(TYPE(test_v)) {
00183         case T_TRUE:
00184             test = 1;
00185             break;
00186         case T_NIL:
00187         case T_FALSE:
00188             test = 0;
00189             break;
00190         default:
00191             rb_raise(rb_eTypeError,
00192                 "Value for test must be either true or false");
00193             break;
00194     }
00195 
00196     Check_Type(flags_v, T_FIXNUM);
00197     int flags = FIX2INT(flags_v);
00198 
00199     rpmts ts = _spec_get_ts(self);
00200     Spec spec = _spec_get_spec(self);
00201 
00202     rpmRC error = buildSpec(ts, spec, flags, test);
00203     if(error) rpm_rb_raise(error, "Building spec file failed");
00204 
00205     return self;
00206 }
00207 
00208 
00209 VALUE
00210 spec_wrap(Spec spec)
00211 {
00212     return Data_Wrap_Struct(specClass, 0, &_spec_free, spec);
00213 }
00214 
00215 
00216 void
00217 Init_spec(void)
00218 {
00219     specClass = rb_define_class_under(rpmModule, "Spec", rb_cObject);
00220 
00221     rb_define_method(specClass, "sources", &spec_get_sources, 0);
00222     rb_define_method(specClass, "patches", &spec_get_patches, 0);
00223     rb_define_method(specClass, "packages", &spec_get_packages, 0);
00224     rb_define_method(specClass, "macros", &spec_get_macros, 0);
00225     rb_define_method(specClass, "build", &spec_build, -1);
00226 }