ruby-rpm 1.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +340 -0
- data/ChangeLog +434 -0
- data/NEWS +14 -0
- data/README +38 -0
- data/Rakefile +107 -0
- data/doc/refm.rd.ja +913 -0
- data/ext/rpm/MANIFEST +13 -0
- data/ext/rpm/db.c +1128 -0
- data/ext/rpm/dependency.c +330 -0
- data/ext/rpm/extconf.rb +78 -0
- data/ext/rpm/file.c +281 -0
- data/ext/rpm/package.c +800 -0
- data/ext/rpm/private.h +114 -0
- data/ext/rpm/rpm.c +660 -0
- data/ext/rpm/rpm40_compat.c +28 -0
- data/ext/rpm/rpm40_compat.h +9 -0
- data/ext/rpm/ruby-rpm.h +181 -0
- data/ext/rpm/source.c +152 -0
- data/ext/rpm/spec.c +346 -0
- data/ext/rpm/version.c +341 -0
- data/install.rb +1015 -0
- data/lib/rpm.rb +143 -0
- data/spec/fedora/ruby-rpm.spec +226 -0
- data/tests/runner.rb +15 -0
- data/tests/test_db.rb +44 -0
- data/tests/test_dependency.rb +29 -0
- data/tests/test_file.rb +13 -0
- data/tests/test_rpm.rb +13 -0
- data/tests/test_source.rb +31 -0
- data/tests/test_ts.rb +169 -0
- data/tests/test_version.rb +51 -0
- metadata +77 -0
@@ -0,0 +1,28 @@
|
|
1
|
+
/* -*- mode: C; c-basic-offset: 4; tab-width: 4; -*- */
|
2
|
+
/* Ruby/RPM
|
3
|
+
*
|
4
|
+
* Copyright (C) 2004 YAMAZAKI Makoto <zaki@zakky.org>
|
5
|
+
*/
|
6
|
+
|
7
|
+
/* $Id: rpm40_compat.c 11 2004-03-13 14:54:21Z zaki $ */
|
8
|
+
|
9
|
+
#include "private.h"
|
10
|
+
|
11
|
+
|
12
|
+
#if RPM_VERSION(4,2,0) <= RPM_VERSION_CODE
|
13
|
+
|
14
|
+
rpmRC
|
15
|
+
rpmReadPackageInfo(FD_t fd, Header * sigp, Header * hdrp)
|
16
|
+
{
|
17
|
+
rpmRC rc;
|
18
|
+
|
19
|
+
rpmts ts = rpmtsCreate();
|
20
|
+
rc = rpmReadPackageFile(ts, fd, "readRPM", hdrp);
|
21
|
+
ts = rpmtsFree(ts);
|
22
|
+
|
23
|
+
if (sigp) *sigp = NULL; /* XXX HACK */
|
24
|
+
|
25
|
+
return rc;
|
26
|
+
}
|
27
|
+
|
28
|
+
#endif /* RPM_VERSION(4,2,0) <= RPM_VERSION_CODE */
|
data/ext/rpm/ruby-rpm.h
ADDED
@@ -0,0 +1,181 @@
|
|
1
|
+
/* -*- mode: C; c-basic-offset: 4; tab-width: 4; -*- */
|
2
|
+
/* Ruby/RPM
|
3
|
+
*
|
4
|
+
* Copyright (C) 2002 Kenta MURATA <muraken2@nifty.com>.
|
5
|
+
*/
|
6
|
+
|
7
|
+
/* $Id: ruby-rpm.h 27 2004-05-23 04:54:24Z zaki $ */
|
8
|
+
|
9
|
+
#ifndef ruby_rpm_h_Included
|
10
|
+
#define ruby_rpm_h_Included 1
|
11
|
+
|
12
|
+
#include <ruby.h>
|
13
|
+
|
14
|
+
#define RUBY_RPM_VERSION "1.1.10"
|
15
|
+
|
16
|
+
extern VALUE rpm_mRPM;
|
17
|
+
extern VALUE rpm_cConflict;
|
18
|
+
extern VALUE rpm_cDB;
|
19
|
+
extern VALUE rpm_cDependency;
|
20
|
+
extern VALUE rpm_cFile;
|
21
|
+
extern VALUE rpm_cIcon;
|
22
|
+
extern VALUE rpm_cMatchIterator;
|
23
|
+
extern VALUE rpm_cObsolete;
|
24
|
+
extern VALUE rpm_cPackage;
|
25
|
+
extern VALUE rpm_cPatch;
|
26
|
+
extern VALUE rpm_cProvide;
|
27
|
+
extern VALUE rpm_cRequire;
|
28
|
+
extern VALUE rpm_cSource;
|
29
|
+
extern VALUE rpm_cSpec;
|
30
|
+
extern VALUE rpm_cTransaction;
|
31
|
+
extern VALUE rpm_cVersion;
|
32
|
+
extern VALUE rpm_sChangeLog;
|
33
|
+
extern VALUE rpm_sCallbackData;
|
34
|
+
extern VALUE rpm_sProblem;
|
35
|
+
|
36
|
+
/* db.c */
|
37
|
+
VALUE rpm_db_open(int writable, const char* root);
|
38
|
+
void rpm_db_init(const char* root, int writable);
|
39
|
+
void rpm_db_rebuild(const char* root);
|
40
|
+
VALUE rpm_db_get_root(VALUE db);
|
41
|
+
VALUE rpm_db_get_home(VALUE db);
|
42
|
+
VALUE rpm_db_is_writable(VALUE db);
|
43
|
+
VALUE rpm_db_each_match(VALUE db, VALUE key, VALUE val);
|
44
|
+
VALUE rpm_db_each(VALUE db);
|
45
|
+
VALUE rpm_db_transaction(int argc, VALUE* argv, VALUE db);
|
46
|
+
VALUE rpm_transaction_get_db(VALUE trans);
|
47
|
+
VALUE rpm_transaction_get_script_file(VALUE trans);
|
48
|
+
VALUE rpm_transaction_set_script_file(VALUE trans, VALUE file);
|
49
|
+
VALUE rpm_transaction_install(VALUE trans, VALUE pkg, VALUE key);
|
50
|
+
VALUE rpm_transaction_upgrade(VALUE trans, VALUE pkg, VALUE key);
|
51
|
+
VALUE rpm_transaction_available(VALUE trans, VALUE pkg, VALUE key);
|
52
|
+
VALUE rpm_transaction_delete(VALUE trans, VALUE name);
|
53
|
+
VALUE rpm_transaction_check(VALUE trans);
|
54
|
+
VALUE rpm_transaction_order(VALUE trans);
|
55
|
+
VALUE rpm_transaction_keys(VALUE trans);
|
56
|
+
VALUE rpm_transaction_commit(int argc, VALUE* argv, VALUE trans);
|
57
|
+
VALUE rpm_transaction_abort(VALUE trans);
|
58
|
+
VALUE rpm_db_init_iterator(VALUE db, VALUE key, VALUE val);
|
59
|
+
VALUE rpm_mi_next_iterator(VALUE mi);
|
60
|
+
VALUE rpm_mi_each(VALUE mi);
|
61
|
+
VALUE rpm_mi_get_iterator_count(VALUE mi);
|
62
|
+
VALUE rpm_mi_get_iterator_offset(VALUE mi);
|
63
|
+
VALUE rpm_mi_set_iterator_re(VALUE mi,VALUE tag, VALUE mode, VALUE re);
|
64
|
+
VALUE rpm_mi_set_iterator_version(VALUE mi, VALUE version);
|
65
|
+
|
66
|
+
|
67
|
+
/* dependency.c */
|
68
|
+
VALUE rpm_provide_new(const char* name, VALUE version, int flags, VALUE target);
|
69
|
+
VALUE rpm_require_new(const char* name, VALUE version, int flags, VALUE target);
|
70
|
+
VALUE rpm_conflict_new(const char* name, VALUE version, int flags, VALUE target);
|
71
|
+
VALUE rpm_obsolete_new(const char* name, VALUE version, int flags, VALUE target);
|
72
|
+
VALUE rpm_dependency_get_name(VALUE dep);
|
73
|
+
VALUE rpm_dependency_get_version(VALUE dep);
|
74
|
+
VALUE rpm_dependency_get_flags(VALUE dep);
|
75
|
+
VALUE rpm_dependency_get_target(VALUE dep);
|
76
|
+
VALUE rpm_dependency_is_lt(VALUE dep);
|
77
|
+
VALUE rpm_dependency_is_gt(VALUE dep);
|
78
|
+
VALUE rpm_dependency_is_eq(VALUE dep);
|
79
|
+
VALUE rpm_dependency_is_le(VALUE dep);
|
80
|
+
VALUE rpm_dependency_is_ge(VALUE dep);
|
81
|
+
VALUE rpm_require_is_pre(VALUE req);
|
82
|
+
VALUE rpm_dependency_get_nametag(VALUE dep);
|
83
|
+
VALUE rpm_dependency_get_versiontag(VALUE dep);
|
84
|
+
VALUE rpm_dependency_get_flagstag(VALUE dep);
|
85
|
+
|
86
|
+
|
87
|
+
/* file.c */
|
88
|
+
VALUE rpm_file_new(const char* path, const char* md5sum, const char* link_to,
|
89
|
+
size_t size, time_t mtime, const char* owner, const char* group,
|
90
|
+
dev_t rdev, mode_t mode, rpmfileAttrs attr, rpmfileState state);
|
91
|
+
VALUE rpm_file_get_path(VALUE file);
|
92
|
+
VALUE rpm_file_get_md5sum(VALUE file);
|
93
|
+
VALUE rpm_file_get_link_to(VALUE file);
|
94
|
+
VALUE rpm_file_get_size(VALUE file);
|
95
|
+
VALUE rpm_file_get_mtime(VALUE file);
|
96
|
+
VALUE rpm_file_get_owner(VALUE file);
|
97
|
+
VALUE rpm_file_get_group(VALUE file);
|
98
|
+
VALUE rpm_file_get_rdev(VALUE file);
|
99
|
+
VALUE rpm_file_get_mode(VALUE file);
|
100
|
+
VALUE rpm_file_get_attr(VALUE file);
|
101
|
+
VALUE rpm_file_get_state(VALUE file);
|
102
|
+
VALUE rpm_file_is_symlink(VALUE file);
|
103
|
+
VALUE rpm_file_is_config(VALUE file);
|
104
|
+
VALUE rpm_file_is_doc(VALUE file);
|
105
|
+
VALUE rpm_file_is_donotuse(VALUE file);
|
106
|
+
VALUE rpm_file_is_missingok(VALUE file);
|
107
|
+
VALUE rpm_file_is_noreplace(VALUE file);
|
108
|
+
VALUE rpm_file_is_specfile(VALUE file);
|
109
|
+
VALUE rpm_file_is_ghost(VALUE file);
|
110
|
+
VALUE rpm_file_is_license(VALUE file);
|
111
|
+
VALUE rpm_file_is_readme(VALUE file);
|
112
|
+
VALUE rpm_file_is_exclude(VALUE file);
|
113
|
+
VALUE rpm_file_is_replaced(VALUE file);
|
114
|
+
VALUE rpm_file_is_notinstalled(VALUE file);
|
115
|
+
VALUE rpm_file_is_netshared(VALUE file);
|
116
|
+
|
117
|
+
/* package.c */
|
118
|
+
VALUE rpm_package_new_from_header(Header hdr);
|
119
|
+
#if RPM_VERSION(4,1,0) <= RPM_VERSION_CODE
|
120
|
+
VALUE rpm_package_new_from_N_EVR(VALUE name, VALUE version);
|
121
|
+
#endif
|
122
|
+
VALUE rpm_package_aref(VALUE pkg, VALUE tag);
|
123
|
+
VALUE rpm_package_get_name(VALUE pkg);
|
124
|
+
VALUE rpm_package_get_version(VALUE pkg);
|
125
|
+
VALUE rpm_package_get_signature(VALUE pkg);
|
126
|
+
VALUE rpm_package_get_files(VALUE pkg);
|
127
|
+
VALUE rpm_package_get_provides(VALUE pkg);
|
128
|
+
VALUE rpm_package_get_requires(VALUE pkg);
|
129
|
+
VALUE rpm_package_get_conflicts(VALUE pkg);
|
130
|
+
VALUE rpm_package_get_obsoletes(VALUE pkg);
|
131
|
+
VALUE rpm_package_get_changelog(VALUE pkg);
|
132
|
+
VALUE rpm_package_dump(VALUE pkg);
|
133
|
+
VALUE rpm_package_add_dependency(VALUE pkg,VALUE dep);
|
134
|
+
VALUE rpm_package_add_string(VALUE pkg,VALUE tag,VALUE val);
|
135
|
+
VALUE rpm_package_add_string_array(VALUE pkg,VALUE tag,VALUE val);
|
136
|
+
VALUE rpm_package_add_int32(VALUE pkg,VALUE tag,VALUE val);
|
137
|
+
VALUE rpm_package_add_binary(VALUE pkg,VALUE tag,VALUE val);
|
138
|
+
|
139
|
+
|
140
|
+
/* rpm.c */
|
141
|
+
VALUE rpm_macro_aref(VALUE name);
|
142
|
+
VALUE rpm_macro_aset(VALUE name, VALUE val);
|
143
|
+
void rpm_readrc(const char* rcpath);
|
144
|
+
void rpm_init_marcros(const char* path);
|
145
|
+
VALUE rpm_get_verbosity(void);
|
146
|
+
void rpm_set_verbosity(VALUE verbosity);
|
147
|
+
|
148
|
+
/* source.c */
|
149
|
+
VALUE rpm_source_new(const char* fullname, unsigned int num, int no);
|
150
|
+
VALUE rpm_patch_new(const char* fullname, unsigned int num, int no);
|
151
|
+
VALUE rpm_icon_new(const char* fullname, unsigned int num, int no);
|
152
|
+
VALUE rpm_source_get_fullname(VALUE src);
|
153
|
+
VALUE rpm_source_get_filename(VALUE src);
|
154
|
+
VALUE rpm_source_get_num(VALUE src);
|
155
|
+
VALUE rpm_source_is_no(VALUE src);
|
156
|
+
|
157
|
+
/* spec.c */
|
158
|
+
VALUE rpm_spec_open(const char* filename);
|
159
|
+
VALUE rpm_spec_get_buildroot(VALUE spec);
|
160
|
+
VALUE rpm_spec_get_buildsubdir(VALUE spec);
|
161
|
+
VALUE rpm_spec_get_buildarchs(VALUE spec);
|
162
|
+
VALUE rpm_spec_get_buildrequires(VALUE spec);
|
163
|
+
VALUE rpm_spec_get_buildconflicts(VALUE spec);
|
164
|
+
VALUE rpm_spec_get_build_restrictions(VALUE spec);
|
165
|
+
VALUE rpm_spec_get_sources(VALUE spec);
|
166
|
+
VALUE rpm_spec_get_packages(VALUE spec);
|
167
|
+
|
168
|
+
/* version.c */
|
169
|
+
VALUE rpm_version_new(const char* vr);
|
170
|
+
VALUE rpm_version_new2(const char* vr, int e);
|
171
|
+
VALUE rpm_version_new3(const char* v, const char* r, int e);
|
172
|
+
VALUE rpm_version_cmp(VALUE ver, VALUE other);
|
173
|
+
VALUE rpm_version_is_newer(VALUE ver, VALUE other);
|
174
|
+
VALUE rpm_version_is_older(VALUE ver, VALUE other);
|
175
|
+
VALUE rpm_version_get_v(VALUE ver);
|
176
|
+
VALUE rpm_version_get_r(VALUE ver);
|
177
|
+
VALUE rpm_version_get_e(VALUE ver);
|
178
|
+
VALUE rpm_version_to_s(VALUE ver);
|
179
|
+
VALUE rpm_version_to_vre(VALUE ver);
|
180
|
+
|
181
|
+
#endif /* !ruby_rpm_h_Included */
|
data/ext/rpm/source.c
ADDED
@@ -0,0 +1,152 @@
|
|
1
|
+
/* -*- mode: C; c-basic-offset: 4; tab-width: 4; -*- */
|
2
|
+
/* Ruby/RPM
|
3
|
+
*
|
4
|
+
* Copyright (C) 2002 Kenta MURATA <muraken2@nifty.com>.
|
5
|
+
*/
|
6
|
+
|
7
|
+
/* $Id: source.c 22 2004-03-29 03:42:35Z zaki $ */
|
8
|
+
|
9
|
+
#include "private.h"
|
10
|
+
|
11
|
+
VALUE rpm_cSource;
|
12
|
+
VALUE rpm_cPatch;
|
13
|
+
VALUE rpm_cIcon;
|
14
|
+
|
15
|
+
static ID id_full;
|
16
|
+
static ID id_fn;
|
17
|
+
static ID id_num;
|
18
|
+
static ID id_no;
|
19
|
+
|
20
|
+
static VALUE
|
21
|
+
source_initialize(int argc, VALUE* argv, VALUE src)
|
22
|
+
{
|
23
|
+
switch (argc) {
|
24
|
+
case 0: case 1:
|
25
|
+
rb_raise(rb_eArgError, "argument too few(2..3)");
|
26
|
+
|
27
|
+
case 2: case 3:
|
28
|
+
if (TYPE(argv[0]) != T_STRING) {
|
29
|
+
rb_raise(rb_eTypeError, "illegal argument type");
|
30
|
+
}
|
31
|
+
|
32
|
+
rb_ivar_set(src, id_full, argv[0]);
|
33
|
+
rb_ivar_set(src, id_num, rb_Integer(argv[1]));
|
34
|
+
if (argc == 3) {
|
35
|
+
rb_ivar_set(src, id_no, RTEST(argv[2]) ? Qtrue : Qfalse);
|
36
|
+
} else {
|
37
|
+
rb_ivar_set(src, id_no, Qfalse);
|
38
|
+
}
|
39
|
+
break;
|
40
|
+
|
41
|
+
default:
|
42
|
+
rb_raise(rb_eArgError, "argument too many(2..3)");
|
43
|
+
}
|
44
|
+
|
45
|
+
return src;
|
46
|
+
}
|
47
|
+
|
48
|
+
VALUE
|
49
|
+
rpm_source_new(const char* fullname, unsigned int num, int no)
|
50
|
+
{
|
51
|
+
VALUE src, argv[3];
|
52
|
+
|
53
|
+
argv[0] = rb_str_new2(fullname);
|
54
|
+
argv[1] = UINT2NUM(num);
|
55
|
+
argv[2] = no ? Qtrue : Qfalse;
|
56
|
+
|
57
|
+
src = rb_newobj();
|
58
|
+
OBJSETUP(src, rpm_cSource, T_OBJECT);
|
59
|
+
rb_obj_call_init(src, 3, argv);
|
60
|
+
|
61
|
+
return src;
|
62
|
+
}
|
63
|
+
|
64
|
+
VALUE
|
65
|
+
rpm_patch_new(const char* fullname, unsigned int num, int no)
|
66
|
+
{
|
67
|
+
VALUE src, argv[3];
|
68
|
+
|
69
|
+
argv[0] = rb_str_new2(fullname);
|
70
|
+
argv[1] = UINT2NUM(num);
|
71
|
+
argv[2] = no ? Qtrue : Qfalse;
|
72
|
+
|
73
|
+
src = rb_newobj();
|
74
|
+
OBJSETUP(src, rpm_cPatch, T_OBJECT);
|
75
|
+
rb_obj_call_init(src, 3, argv);
|
76
|
+
|
77
|
+
return src;
|
78
|
+
}
|
79
|
+
|
80
|
+
VALUE
|
81
|
+
rpm_icon_new(const char* fullname, unsigned int num, int no)
|
82
|
+
{
|
83
|
+
VALUE src, argv[3];
|
84
|
+
|
85
|
+
argv[0] = rb_str_new2(fullname);
|
86
|
+
argv[1] = UINT2NUM(num);
|
87
|
+
argv[2] = no ? Qtrue : Qfalse;
|
88
|
+
|
89
|
+
src = rb_newobj();
|
90
|
+
OBJSETUP(src, rpm_cIcon, T_OBJECT);
|
91
|
+
rb_obj_call_init(src, 3, argv);
|
92
|
+
|
93
|
+
return src;
|
94
|
+
}
|
95
|
+
|
96
|
+
VALUE
|
97
|
+
rpm_source_get_fullname(VALUE src)
|
98
|
+
{
|
99
|
+
return rb_ivar_get(src, id_full);
|
100
|
+
}
|
101
|
+
|
102
|
+
VALUE
|
103
|
+
rpm_source_get_filename(VALUE src)
|
104
|
+
{
|
105
|
+
VALUE fn = rb_ivar_get(src, id_fn);
|
106
|
+
|
107
|
+
if (NIL_P(fn)) {
|
108
|
+
VALUE full = rb_ivar_get(src, id_full);
|
109
|
+
const char* p = strrchr(RSTRING(full)->ptr, '/');
|
110
|
+
if (p == NULL) {
|
111
|
+
p = RSTRING(full)->ptr;
|
112
|
+
} else {
|
113
|
+
p++;
|
114
|
+
}
|
115
|
+
fn = rb_str_new2(p);
|
116
|
+
rb_ivar_set(src, id_fn, fn);
|
117
|
+
}
|
118
|
+
|
119
|
+
return fn;
|
120
|
+
}
|
121
|
+
|
122
|
+
VALUE
|
123
|
+
rpm_source_get_num(VALUE src)
|
124
|
+
{
|
125
|
+
return rb_ivar_get(src, id_num);
|
126
|
+
}
|
127
|
+
|
128
|
+
VALUE
|
129
|
+
rpm_source_is_no(VALUE src)
|
130
|
+
{
|
131
|
+
return rb_ivar_get(src, id_no);
|
132
|
+
}
|
133
|
+
|
134
|
+
void
|
135
|
+
Init_rpm_source(void)
|
136
|
+
{
|
137
|
+
rpm_cSource = rb_define_class_under(rpm_mRPM, "Source", rb_cObject);
|
138
|
+
rb_define_method(rpm_cSource, "initialize", source_initialize, -1);
|
139
|
+
rb_define_method(rpm_cSource, "fullname", rpm_source_get_fullname, 0);
|
140
|
+
rb_define_alias(rpm_cSource, "to_s", "fullname");
|
141
|
+
rb_define_method(rpm_cSource, "filename", rpm_source_get_filename, 0);
|
142
|
+
rb_define_method(rpm_cSource, "num", rpm_source_get_num, 0);
|
143
|
+
rb_define_method(rpm_cSource, "no?", rpm_source_is_no, 0);
|
144
|
+
|
145
|
+
rpm_cPatch = rb_define_class_under(rpm_mRPM, "Patch", rpm_cSource);
|
146
|
+
rpm_cIcon = rb_define_class_under(rpm_mRPM, "Icon", rpm_cSource);
|
147
|
+
|
148
|
+
id_full = rb_intern("fullname");
|
149
|
+
id_fn = rb_intern("filename");
|
150
|
+
id_num = rb_intern("num");
|
151
|
+
id_no = rb_intern("no");
|
152
|
+
}
|
data/ext/rpm/spec.c
ADDED
@@ -0,0 +1,346 @@
|
|
1
|
+
/* -*- mode: C; c-basic-offset: 4; tab-width: 4; -*- */
|
2
|
+
/* Ruby/RPM
|
3
|
+
*
|
4
|
+
* Copyright (C) 2002 Kenta MURATA <muraken2@nifty.com>.
|
5
|
+
*/
|
6
|
+
|
7
|
+
/* $Id: spec.c 44 2004-06-03 16:58:10Z kazuhiko $ */
|
8
|
+
|
9
|
+
#include "private.h"
|
10
|
+
|
11
|
+
VALUE rpm_cSpec;
|
12
|
+
|
13
|
+
static ID id_ba;
|
14
|
+
static ID id_br;
|
15
|
+
static ID id_bc;
|
16
|
+
static ID id_src;
|
17
|
+
static ID id_pkg;
|
18
|
+
static ID id_rest;
|
19
|
+
|
20
|
+
#if RPM_VERSION_CODE < RPM_VERSION(4,1,0)
|
21
|
+
static void
|
22
|
+
spec_free(Spec rspec)
|
23
|
+
{
|
24
|
+
freeSpec(rspec);
|
25
|
+
}
|
26
|
+
|
27
|
+
#else
|
28
|
+
static void
|
29
|
+
ts_free(rpmts ts)
|
30
|
+
{
|
31
|
+
ts = rpmtsFree(ts);
|
32
|
+
}
|
33
|
+
|
34
|
+
#endif
|
35
|
+
|
36
|
+
static VALUE
|
37
|
+
spec_s_open(VALUE klass, VALUE filename)
|
38
|
+
{
|
39
|
+
#if RPM_VERSION_CODE < RPM_VERSION(4,1,0)
|
40
|
+
Spec rspec;
|
41
|
+
#else
|
42
|
+
rpmts ts = NULL;
|
43
|
+
#endif
|
44
|
+
|
45
|
+
if (TYPE(filename) != T_STRING) {
|
46
|
+
rb_raise(rb_eTypeError, "illegal argument type");
|
47
|
+
}
|
48
|
+
|
49
|
+
#if RPM_VERSION_CODE < RPM_VERSION(4,1,0)
|
50
|
+
switch (parseSpec(&rspec, RSTRING(filename)->ptr, "/", NULL, 0, "", NULL, 1, 1)) {
|
51
|
+
case 0:
|
52
|
+
if (rspec != NULL) {
|
53
|
+
break;
|
54
|
+
}
|
55
|
+
|
56
|
+
case RPMERR_BADSPEC:
|
57
|
+
default:
|
58
|
+
rb_raise(rb_eRuntimeError, "specfile `%s' parsing failed", RSTRING(filename)->ptr);
|
59
|
+
}
|
60
|
+
return Data_Wrap_Struct(klass, NULL, spec_free, rspec);
|
61
|
+
#else
|
62
|
+
ts = rpmtsCreate();
|
63
|
+
switch (parseSpec(ts, RSTRING(filename)->ptr, "/", NULL, 0, "", NULL, 1, 1)) {
|
64
|
+
case 0:
|
65
|
+
if (ts != NULL) {
|
66
|
+
break;
|
67
|
+
}
|
68
|
+
|
69
|
+
case RPMERR_BADSPEC:
|
70
|
+
default:
|
71
|
+
rb_raise(rb_eRuntimeError, "specfile `%s' parsing failed", RSTRING(filename)->ptr);
|
72
|
+
}
|
73
|
+
return Data_Wrap_Struct(klass, NULL, ts_free, ts);
|
74
|
+
#endif
|
75
|
+
}
|
76
|
+
|
77
|
+
VALUE
|
78
|
+
rpm_spec_open(const char* filename)
|
79
|
+
{
|
80
|
+
return spec_s_open(rpm_cSpec, rb_str_new2(filename));
|
81
|
+
}
|
82
|
+
|
83
|
+
VALUE
|
84
|
+
rpm_spec_get_buildroot(VALUE spec)
|
85
|
+
{
|
86
|
+
if (RPM_SPEC(spec)->buildRootURL) {
|
87
|
+
return rb_str_new2(RPM_SPEC(spec)->buildRootURL);
|
88
|
+
}
|
89
|
+
return Qnil;
|
90
|
+
}
|
91
|
+
|
92
|
+
VALUE
|
93
|
+
rpm_spec_get_buildsubdir(VALUE spec)
|
94
|
+
{
|
95
|
+
if (RPM_SPEC(spec)->buildSubdir) {
|
96
|
+
return rb_str_new2(RPM_SPEC(spec)->buildSubdir);
|
97
|
+
}
|
98
|
+
return Qnil;
|
99
|
+
}
|
100
|
+
|
101
|
+
VALUE
|
102
|
+
rpm_spec_get_buildarchs(VALUE spec)
|
103
|
+
{
|
104
|
+
VALUE ba = rb_ivar_get(spec, id_ba);
|
105
|
+
|
106
|
+
if (NIL_P(ba)) {
|
107
|
+
register int i;
|
108
|
+
ba = rb_ary_new();
|
109
|
+
for (i = 0; i < RPM_SPEC(spec)->BACount; i++) {
|
110
|
+
rb_ary_push(ba, rb_str_new2(RPM_SPEC(spec)->BANames[i]));
|
111
|
+
}
|
112
|
+
rb_ivar_set(spec, id_ba, ba);
|
113
|
+
}
|
114
|
+
|
115
|
+
return ba;
|
116
|
+
}
|
117
|
+
|
118
|
+
VALUE
|
119
|
+
rpm_spec_get_buildrequires(VALUE spec)
|
120
|
+
{
|
121
|
+
VALUE br = rb_ivar_get(spec, id_br);
|
122
|
+
|
123
|
+
if (NIL_P(br)) {
|
124
|
+
const char** names;
|
125
|
+
const char** vers;
|
126
|
+
int_32* flags;
|
127
|
+
int_32 count;
|
128
|
+
rpmTagType nt, vt, type;
|
129
|
+
register int i;
|
130
|
+
|
131
|
+
br = rb_ary_new();
|
132
|
+
if (!headerGetEntryMinMemory(RPM_SPEC(spec)->buildRestrictions,
|
133
|
+
RPMTAG_REQUIRENAME, (hTYP_t)&nt,
|
134
|
+
(hPTR_t*)&names, (hCNT_t)&count)) {
|
135
|
+
goto leave;
|
136
|
+
}
|
137
|
+
|
138
|
+
get_entry(RPM_SPEC(spec)->buildRestrictions, RPMTAG_REQUIREVERSION,
|
139
|
+
&vt, (void*)&vers);
|
140
|
+
get_entry(RPM_SPEC(spec)->buildRestrictions, RPMTAG_REQUIREFLAGS,
|
141
|
+
&type, (void*)&flags);
|
142
|
+
|
143
|
+
for (i = 0; i < count; i++) {
|
144
|
+
rb_ary_push(br, rpm_require_new(names[i], rpm_version_new(vers[i]),
|
145
|
+
flags[i], spec));
|
146
|
+
}
|
147
|
+
|
148
|
+
release_entry(nt, names);
|
149
|
+
release_entry(vt, vers);
|
150
|
+
|
151
|
+
rb_ivar_set(spec, id_br, br);
|
152
|
+
}
|
153
|
+
|
154
|
+
leave:
|
155
|
+
return br;
|
156
|
+
}
|
157
|
+
|
158
|
+
VALUE
|
159
|
+
rpm_spec_get_buildconflicts(VALUE spec)
|
160
|
+
{
|
161
|
+
VALUE bc = rb_ivar_get(spec, id_bc);
|
162
|
+
|
163
|
+
if (NIL_P(bc)) {
|
164
|
+
const char** names;
|
165
|
+
const char** vers;
|
166
|
+
int_32* flags;
|
167
|
+
int_32 count;
|
168
|
+
rpmTagType nt, vt, type;
|
169
|
+
register int i;
|
170
|
+
|
171
|
+
bc = rb_ary_new();
|
172
|
+
if (!headerGetEntryMinMemory(RPM_SPEC(spec)->buildRestrictions,
|
173
|
+
RPMTAG_CONFLICTNAME, (hTYP_t)&nt,
|
174
|
+
(hPTR_t*)&names, (hCNT_t)&count)) {
|
175
|
+
goto leave;
|
176
|
+
}
|
177
|
+
|
178
|
+
get_entry(RPM_SPEC(spec)->buildRestrictions, RPMTAG_CONFLICTVERSION,
|
179
|
+
&vt, (void*)&vers);
|
180
|
+
get_entry(RPM_SPEC(spec)->buildRestrictions, RPMTAG_CONFLICTFLAGS,
|
181
|
+
&type, (void*)&flags);
|
182
|
+
|
183
|
+
for (i = 0; i < count; i++) {
|
184
|
+
rb_ary_push(bc, rpm_conflict_new(names[i], rpm_version_new(vers[i]),
|
185
|
+
flags[i], spec));
|
186
|
+
}
|
187
|
+
|
188
|
+
release_entry(nt, names);
|
189
|
+
release_entry(vt, vers);
|
190
|
+
|
191
|
+
rb_ivar_set(spec, id_bc, bc);
|
192
|
+
}
|
193
|
+
leave:
|
194
|
+
return bc;
|
195
|
+
}
|
196
|
+
|
197
|
+
VALUE
|
198
|
+
rpm_spec_get_build_restrictions(VALUE spec)
|
199
|
+
{
|
200
|
+
VALUE cache = rb_ivar_get(spec, id_rest);
|
201
|
+
|
202
|
+
if (NIL_P(cache)) {
|
203
|
+
cache = rpm_package_new_from_header(RPM_SPEC(spec)->buildRestrictions);
|
204
|
+
rb_ivar_set(spec, id_rest, cache);
|
205
|
+
}
|
206
|
+
|
207
|
+
return cache;
|
208
|
+
}
|
209
|
+
|
210
|
+
VALUE
|
211
|
+
rpm_spec_get_sources(VALUE spec)
|
212
|
+
{
|
213
|
+
VALUE src = rb_ivar_get(spec, id_src);
|
214
|
+
|
215
|
+
if (NIL_P(src)) {
|
216
|
+
struct Source* s = RPM_SPEC(spec)->sources;
|
217
|
+
|
218
|
+
src = rb_ary_new();
|
219
|
+
while (s != NULL) {
|
220
|
+
VALUE obj;
|
221
|
+
|
222
|
+
if (s->flags & RPMBUILD_ISSOURCE) {
|
223
|
+
obj = rpm_source_new(s->fullSource, s->num, s->flags & RPMBUILD_ISNO);
|
224
|
+
} else if (s->flags & RPMBUILD_ISPATCH) {
|
225
|
+
obj = rpm_patch_new(s->fullSource, s->num, s->flags & RPMBUILD_ISNO);
|
226
|
+
} else if (s->flags & RPMBUILD_ISICON) {
|
227
|
+
obj = rpm_icon_new(s->fullSource, s->num, s->flags & RPMBUILD_ISNO);
|
228
|
+
}
|
229
|
+
|
230
|
+
rb_ary_push(src, obj);
|
231
|
+
s = s->next;
|
232
|
+
}
|
233
|
+
|
234
|
+
rb_ivar_set(spec, id_src, src);
|
235
|
+
}
|
236
|
+
|
237
|
+
return src;
|
238
|
+
}
|
239
|
+
|
240
|
+
VALUE
|
241
|
+
rpm_spec_get_packages(VALUE spec)
|
242
|
+
{
|
243
|
+
VALUE pkg = rb_ivar_get(spec, id_pkg);
|
244
|
+
|
245
|
+
if (NIL_P(pkg)) {
|
246
|
+
Package p = RPM_SPEC(spec)->packages;
|
247
|
+
|
248
|
+
pkg = rb_ary_new();
|
249
|
+
while (p != NULL) {
|
250
|
+
if (p->fileList)
|
251
|
+
rb_ary_push(pkg, rpm_package_new_from_header(p->header));
|
252
|
+
p = p->next;
|
253
|
+
}
|
254
|
+
|
255
|
+
rb_ivar_set(spec, id_pkg, pkg);
|
256
|
+
}
|
257
|
+
|
258
|
+
return pkg;
|
259
|
+
}
|
260
|
+
|
261
|
+
VALUE
|
262
|
+
rpm_spec_build(int argc, VALUE* argv, VALUE spec)
|
263
|
+
{
|
264
|
+
int flags, test;
|
265
|
+
rpmRC rc;
|
266
|
+
|
267
|
+
switch (argc) {
|
268
|
+
case 0:
|
269
|
+
rb_raise(rb_eArgError, "argument too few(1..2)");
|
270
|
+
|
271
|
+
case 1:
|
272
|
+
flags = NUM2INT(argv[0]);
|
273
|
+
test = 0;
|
274
|
+
break;
|
275
|
+
|
276
|
+
case 2:
|
277
|
+
flags = NUM2INT(argv[0]);
|
278
|
+
test = RTEST(argv[1]);
|
279
|
+
break;
|
280
|
+
|
281
|
+
default:
|
282
|
+
rb_raise(rb_eArgError, "argument too many(0..1)");
|
283
|
+
}
|
284
|
+
|
285
|
+
#if RPM_VERSION_CODE < RPM_VERSION(4,1,0)
|
286
|
+
rc = buildSpec(RPM_SPEC(spec), flags,test);
|
287
|
+
#else
|
288
|
+
rpmts ts = NULL;
|
289
|
+
ts = rpmtsCreate();
|
290
|
+
rc = buildSpec(ts, RPM_SPEC(spec), flags,test);
|
291
|
+
ts_free(ts);
|
292
|
+
#endif
|
293
|
+
|
294
|
+
return INT2NUM(rc);
|
295
|
+
}
|
296
|
+
|
297
|
+
VALUE
|
298
|
+
rpm_spec_expand_macros(VALUE spec, VALUE name)
|
299
|
+
{
|
300
|
+
char buf[BUFSIZ];
|
301
|
+
char* tmp;
|
302
|
+
VALUE val;
|
303
|
+
|
304
|
+
if (TYPE(name) != T_STRING) {
|
305
|
+
rb_raise(rb_eTypeError, "illegal argument type");
|
306
|
+
}
|
307
|
+
|
308
|
+
sprintf(buf, "%%{%s}", RSTRING(name)->ptr);
|
309
|
+
tmp = strdup(buf);
|
310
|
+
expandMacros(RPM_SPEC(spec), RPM_SPEC(spec)->macros, buf, BUFSIZ);
|
311
|
+
if (strcmp(tmp, buf) == 0) {
|
312
|
+
val = Qnil;
|
313
|
+
} else {
|
314
|
+
val = rb_str_new2(buf);
|
315
|
+
}
|
316
|
+
free(tmp);
|
317
|
+
|
318
|
+
return val;
|
319
|
+
}
|
320
|
+
|
321
|
+
void
|
322
|
+
Init_rpm_spec(void)
|
323
|
+
{
|
324
|
+
rpm_cSpec = rb_define_class_under(rpm_mRPM, "Spec", rb_cData);
|
325
|
+
rb_define_singleton_method(rpm_cSpec, "open", spec_s_open, 1);
|
326
|
+
rb_define_singleton_method(rpm_cSpec, "new", spec_s_open, 1);
|
327
|
+
rb_define_method(rpm_cSpec, "buildroot", rpm_spec_get_buildroot, 0);
|
328
|
+
rb_define_method(rpm_cSpec, "buildsubdir", rpm_spec_get_buildsubdir, 0);
|
329
|
+
rb_define_method(rpm_cSpec, "buildarchs", rpm_spec_get_buildarchs, 0);
|
330
|
+
rb_define_method(rpm_cSpec, "buildrequires", rpm_spec_get_buildrequires, 0);
|
331
|
+
rb_define_method(rpm_cSpec, "buildconflicts", rpm_spec_get_buildconflicts, 0);
|
332
|
+
rb_define_method(rpm_cSpec, "build_restrictions", rpm_spec_get_build_restrictions, 0);
|
333
|
+
rb_define_method(rpm_cSpec, "sources", rpm_spec_get_sources, 0);
|
334
|
+
rb_define_method(rpm_cSpec, "packages", rpm_spec_get_packages, 0);
|
335
|
+
rb_define_method(rpm_cSpec, "build", rpm_spec_build, -1);
|
336
|
+
rb_define_method(rpm_cSpec, "expand_macros", rpm_spec_expand_macros, 1);
|
337
|
+
rb_undef_method(rpm_cSpec, "dup");
|
338
|
+
rb_undef_method(rpm_cSpec, "clone");
|
339
|
+
|
340
|
+
id_ba = rb_intern("buildarchs");
|
341
|
+
id_br = rb_intern("buildrequires");
|
342
|
+
id_bc = rb_intern("buildconflicts");
|
343
|
+
id_src = rb_intern("sources");
|
344
|
+
id_pkg = rb_intern("packages");
|
345
|
+
id_rest = rb_intern("build_restrictions");
|
346
|
+
}
|