|
rpm
5.4.4
|
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 }
1.7.5.1