ruby-rpm 1.2.3 → 1.2.4
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +4 -0
- data/NEWS +6 -0
- data/Rakefile +1 -1
- data/ext/rpm/db.c +104 -19
- data/ext/rpm/extconf.h +10 -0
- data/ext/rpm/extconf.rb +30 -6
- data/ext/rpm/package.c +244 -9
- data/ext/rpm/private.h +34 -10
- data/ext/rpm/rpm.c +7 -1
- data/ext/rpm/ruby-rpm.h +1 -1
- data/ext/rpm/spec.c +73 -5
- data/ext/rpm/version.c +4 -5
- data/spec/fedora/ruby-rpm.spec +26 -11
- data/tests/runner.rb +0 -0
- data/tests/test_db.rb +19 -5
- metadata +61 -47
data/ChangeLog
CHANGED
data/NEWS
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
1.2.3: 2007-05-07
|
2
|
+
- Make RPM::Version hashable (r42)
|
3
|
+
- Treat zero epoch the same as no epoch in RPM::Version::<=> (r41)
|
4
|
+
- Force GC on close of RPM db to make sure garbage objects don't keep
|
5
|
+
db open
|
6
|
+
|
1
7
|
1.2.2: 2007-03-21
|
2
8
|
- Fix Dependency.satisfy? and add tests/test_dependency.rb (r25)
|
3
9
|
- Fix segfault when RPM::File.new is called with link_to = nil (r24)
|
data/Rakefile
CHANGED
data/ext/rpm/db.c
CHANGED
@@ -218,6 +218,7 @@ check_closed(VALUE db)
|
|
218
218
|
}
|
219
219
|
}
|
220
220
|
|
221
|
+
#ifndef RPMDB_OPAQUE
|
221
222
|
VALUE
|
222
223
|
rpm_db_get_root(VALUE db)
|
223
224
|
{
|
@@ -231,6 +232,7 @@ rpm_db_get_home(VALUE db)
|
|
231
232
|
check_closed(db);
|
232
233
|
return rb_str_new2(RPM_DB(db)->db_home);
|
233
234
|
}
|
235
|
+
#endif
|
234
236
|
|
235
237
|
VALUE
|
236
238
|
rpm_db_is_writable(VALUE db)
|
@@ -284,7 +286,7 @@ static VALUE
|
|
284
286
|
transaction_commit(VALUE tag, VALUE ts)
|
285
287
|
{
|
286
288
|
rpm_transaction_commit(0, NULL, ts);
|
287
|
-
|
289
|
+
|
288
290
|
/* not reached because rpm_transaction_commit() always call rb_throw() */
|
289
291
|
return Qnil;
|
290
292
|
}
|
@@ -430,6 +432,7 @@ rpm_transaction_upgrade(VALUE trans, VALUE pkg, VALUE key)
|
|
430
432
|
return Qnil;
|
431
433
|
}
|
432
434
|
|
435
|
+
#ifdef RPMTS_AVAILABLE
|
433
436
|
VALUE
|
434
437
|
rpm_transaction_available(VALUE trans, VALUE pkg, VALUE key)
|
435
438
|
{
|
@@ -454,12 +457,16 @@ rpm_transaction_available(VALUE trans, VALUE pkg, VALUE key)
|
|
454
457
|
rpmtransAvailablePackage(RPM_TRANSACTION(trans), RPM_HEADER(pkg),
|
455
458
|
RSTRING(key)->ptr);
|
456
459
|
#else
|
457
|
-
|
458
|
-
|
460
|
+
rb_raise(rb_eNotImpError, "need rpmtsAvailablePackage");
|
461
|
+
// FIXME: What is the analog for rpmtsAvailablePackage
|
462
|
+
// in newer RPM's ?
|
463
|
+
//rpmtsAvailablePackage(RPM_TRANSACTION(trans), RPM_HEADER(pkg),
|
464
|
+
// RSTRING(key)->ptr);
|
459
465
|
#endif
|
460
466
|
|
461
467
|
return Qnil;
|
462
468
|
}
|
469
|
+
#endif /* RPMTS_AVAILABLE */
|
463
470
|
|
464
471
|
VALUE
|
465
472
|
rpm_transaction_delete(VALUE trans, VALUE pkg)
|
@@ -468,7 +475,7 @@ rpm_transaction_delete(VALUE trans, VALUE pkg)
|
|
468
475
|
VALUE mi;
|
469
476
|
|
470
477
|
db = rb_ivar_get(trans, id_db);
|
471
|
-
|
478
|
+
|
472
479
|
if (TYPE(pkg) == T_STRING)
|
473
480
|
mi = rpm_db_init_iterator(db, INT2NUM(RPMDBI_LABEL), pkg);
|
474
481
|
else if (rb_obj_is_kind_of(pkg, rpm_cPackage) != Qfalse) {
|
@@ -479,9 +486,8 @@ rpm_transaction_delete(VALUE trans, VALUE pkg)
|
|
479
486
|
VALUE name = rpm_package_aref(pkg,INT2NUM(RPMDBI_LABEL));
|
480
487
|
mi = rpm_db_init_iterator(db, INT2NUM(RPMDBI_LABEL), name);
|
481
488
|
}
|
482
|
-
} else if ( rb_obj_is_kind_of(pkg, rpm_cDependency) ==Qfalse &&
|
489
|
+
} else if ( rb_obj_is_kind_of(pkg, rpm_cDependency) ==Qfalse &&
|
483
490
|
rb_respond_to(pkg,rb_intern("name")) && rb_respond_to(pkg,rb_intern("version"))){
|
484
|
-
VALUE name = rb_funcall(pkg,rb_intern("name"),0);
|
485
491
|
mi = rpm_db_init_iterator(db, INT2NUM(RPMDBI_LABEL),rb_funcall(pkg,rb_intern("name"),0));
|
486
492
|
rpm_mi_set_iterator_version(mi,rb_funcall(pkg,rb_intern("version"),0));
|
487
493
|
} else
|
@@ -504,6 +510,7 @@ rpm_transaction_delete(VALUE trans, VALUE pkg)
|
|
504
510
|
|
505
511
|
#if RPM_VERSION(4,1,0) <= RPM_VERSION_CODE
|
506
512
|
|
513
|
+
#if 0 /* XXX this shouldn't be needed at all */
|
507
514
|
/* from rpm-4.2.1/lib/rpmps.c */
|
508
515
|
static int
|
509
516
|
sameProblem(const rpmProblem p1, const rpmProblem p2)
|
@@ -521,9 +528,10 @@ sameProblem(const rpmProblem p1, const rpmProblem p2)
|
|
521
528
|
return 1;
|
522
529
|
if (p1->ulong1 != p2->ulong1)
|
523
530
|
return 1;
|
524
|
-
|
531
|
+
|
525
532
|
return 0;
|
526
533
|
}
|
534
|
+
#endif
|
527
535
|
|
528
536
|
static VALUE
|
529
537
|
version_new_from_EVR(const char* evr)
|
@@ -533,12 +541,12 @@ version_new_from_EVR(const char* evr)
|
|
533
541
|
char *end = NULL;
|
534
542
|
char *tmp_evr = NULL;
|
535
543
|
VALUE version = Qnil;
|
536
|
-
|
544
|
+
|
537
545
|
tmp_evr = strdup(evr);
|
538
546
|
if (tmp_evr==NULL) { return Qnil; }
|
539
547
|
|
540
548
|
e = tmp_evr;
|
541
|
-
if ( end=strchr(e, ':') ) {
|
549
|
+
if ( (end=strchr(e, ':')) ) {
|
542
550
|
/* epoch is found */
|
543
551
|
*end = '\0';
|
544
552
|
vr = end+1;
|
@@ -639,8 +647,64 @@ rpm_transaction_check(VALUE trans)
|
|
639
647
|
|
640
648
|
rc = rpmtsCheck(RPM_TRANSACTION(trans));
|
641
649
|
ps = rpmtsProblems(RPM_TRANSACTION(trans));
|
650
|
+
/* get rid of duplicate problems */
|
651
|
+
rpmpsTrim(ps, RPMPROB_FILTER_NONE);
|
642
652
|
num = rpmpsNumProblems(ps);
|
643
653
|
|
654
|
+
#ifdef RPMPS_OPAQUE
|
655
|
+
rpmpsi psi = rpmpsInitIterator(ps);
|
656
|
+
if (num > 0) {
|
657
|
+
list = rb_ary_new();
|
658
|
+
}
|
659
|
+
while (rpmpsNextIterator(psi) >= 0) {
|
660
|
+
rpmProblem p = rpmpsGetProblem(psi);
|
661
|
+
VALUE dep;
|
662
|
+
switch (rpmProblemGetType(p)) {
|
663
|
+
case RPMPROB_REQUIRES: {
|
664
|
+
char *buf = strdup (rpmProblemGetAltNEVR(p));
|
665
|
+
/* TODO: zaki: NULL check*/
|
666
|
+
char *end;
|
667
|
+
|
668
|
+
char *name = buf+2;
|
669
|
+
char *relation = NULL;
|
670
|
+
char *evr = "";
|
671
|
+
rpmsenseFlags sense_flags = 0;
|
672
|
+
|
673
|
+
end = strchr ( name, ' ');
|
674
|
+
if ( end ) {
|
675
|
+
*end = '\0';
|
676
|
+
relation = end + 1;
|
677
|
+
end = strchr ( relation, ' ');
|
678
|
+
if ( end ) {
|
679
|
+
*end = '\0';
|
680
|
+
evr = end + 1;
|
681
|
+
}
|
682
|
+
for ( ; (*relation) != '\0'; relation++ ) {
|
683
|
+
if ( (*relation) == '=' ) {
|
684
|
+
sense_flags |= RPMSENSE_EQUAL;
|
685
|
+
} else if ( (*relation) == '>' ) {
|
686
|
+
sense_flags |= RPMSENSE_GREATER;
|
687
|
+
} else if ( (*relation) == '<' ) {
|
688
|
+
sense_flags |= RPMSENSE_LESS;
|
689
|
+
}
|
690
|
+
}
|
691
|
+
}
|
692
|
+
|
693
|
+
dep = rpm_require_new(name,
|
694
|
+
rpm_version_new(evr),
|
695
|
+
sense_flags,
|
696
|
+
package_new_from_NEVR(
|
697
|
+
rpmProblemGetPkgNEVR(p)
|
698
|
+
));
|
699
|
+
free ( buf );
|
700
|
+
rb_ary_push(list, dep);
|
701
|
+
break;
|
702
|
+
}
|
703
|
+
default:
|
704
|
+
break;
|
705
|
+
}
|
706
|
+
}
|
707
|
+
#else
|
644
708
|
if (ps != NULL && 0 < num) {
|
645
709
|
rpmProblem p;
|
646
710
|
int i;
|
@@ -648,7 +712,6 @@ rpm_transaction_check(VALUE trans)
|
|
648
712
|
|
649
713
|
for (i = 0; i < num; i++) {
|
650
714
|
const char *altNEVR;
|
651
|
-
int j;
|
652
715
|
VALUE dep;
|
653
716
|
|
654
717
|
p = ps->probs + i;
|
@@ -657,6 +720,7 @@ rpm_transaction_check(VALUE trans)
|
|
657
720
|
if (p->ignoreProblem)
|
658
721
|
continue;
|
659
722
|
|
723
|
+
#if 0 /* XXX shouldn't be needed at all due to rpmpsTrim() */
|
660
724
|
/* Filter already appended problems. */
|
661
725
|
for (j = 0; j < i; j++) {
|
662
726
|
if (!sameProblem(p, ps->probs + j))
|
@@ -664,6 +728,7 @@ rpm_transaction_check(VALUE trans)
|
|
664
728
|
}
|
665
729
|
if (j < i)
|
666
730
|
continue;
|
731
|
+
#endif
|
667
732
|
|
668
733
|
if ( p->type == RPMPROB_REQUIRES ) {
|
669
734
|
char *buf = strdup ( altNEVR );
|
@@ -689,7 +754,7 @@ rpm_transaction_check(VALUE trans)
|
|
689
754
|
sense_flags |= RPMSENSE_EQUAL;
|
690
755
|
} else if ( (*relation) == '>' ) {
|
691
756
|
sense_flags |= RPMSENSE_GREATER;
|
692
|
-
} else if ( (*relation)
|
757
|
+
} else if ( (*relation) == '<' ) {
|
693
758
|
sense_flags |= RPMSENSE_LESS;
|
694
759
|
}
|
695
760
|
}
|
@@ -725,8 +790,9 @@ rpm_transaction_check(VALUE trans)
|
|
725
790
|
#endif
|
726
791
|
}
|
727
792
|
}
|
793
|
+
#endif /* RPMPS_OPAQUE */
|
728
794
|
ps = rpmpsFree(ps);
|
729
|
-
|
795
|
+
|
730
796
|
return list;
|
731
797
|
#endif
|
732
798
|
}
|
@@ -892,15 +958,15 @@ rpm_transaction_commit(int argc, VALUE* argv, VALUE trans)
|
|
892
958
|
|
893
959
|
if (rb_block_given_p() == Qtrue) {
|
894
960
|
rpmtsSetNotifyCallback(RPM_TRANSACTION(trans),
|
895
|
-
transaction_callback,(void *)trans);
|
961
|
+
(rpmCallbackFunction)transaction_callback,(void *)trans);
|
896
962
|
}else{
|
897
963
|
VALUE keys;
|
898
|
-
|
964
|
+
|
899
965
|
/* rpmcli.h:extern int rpmcliPackagesTotal; */
|
900
966
|
rpmcliPackagesTotal = 0;
|
901
|
-
|
967
|
+
|
902
968
|
keys = rpm_transaction_keys(trans);
|
903
|
-
|
969
|
+
|
904
970
|
if (!NIL_P(keys))
|
905
971
|
rpmcliPackagesTotal = NUM2INT(rb_funcall(keys,rb_intern("length"),0));
|
906
972
|
|
@@ -912,6 +978,20 @@ rpm_transaction_commit(int argc, VALUE* argv, VALUE trans)
|
|
912
978
|
|
913
979
|
{
|
914
980
|
VALUE list = rb_ary_new();
|
981
|
+
#ifdef RPMPS_OPAQUE
|
982
|
+
rpmpsi psi = rpmpsInitIterator(ps);
|
983
|
+
while (rpmpsNextIterator(psi) >= 0) {
|
984
|
+
rpmProblem p = rpmpsGetProblem(psi);
|
985
|
+
VALUE prb = rb_struct_new(rpm_sProblem,
|
986
|
+
INT2NUM(rpmProblemGetType(p)),
|
987
|
+
(VALUE)rpmProblemGetKey(p),
|
988
|
+
package_new_from_NEVR(
|
989
|
+
rpmProblemGetAltNEVR(p)+2
|
990
|
+
),
|
991
|
+
rb_str_new2(rpmProblemString(p)));
|
992
|
+
rb_ary_push(list, prb);
|
993
|
+
}
|
994
|
+
#else
|
915
995
|
if (ps != NULL && rpmpsNumProblems(ps) > 0) {
|
916
996
|
register int i;
|
917
997
|
|
@@ -927,10 +1007,11 @@ rpm_transaction_commit(int argc, VALUE* argv, VALUE trans)
|
|
927
1007
|
rb_ary_push(list, prb);
|
928
1008
|
}
|
929
1009
|
}
|
1010
|
+
#endif
|
930
1011
|
rb_ivar_set(trans, id_pl, list);
|
931
1012
|
}
|
932
1013
|
if (ps) ps = rpmpsFree(ps);
|
933
|
-
|
1014
|
+
|
934
1015
|
#endif
|
935
1016
|
|
936
1017
|
rb_ivar_set(trans, id_commited, Qtrue);
|
@@ -967,9 +1048,9 @@ rpm_db_init_iterator(VALUE db, VALUE key, VALUE val)
|
|
967
1048
|
}
|
968
1049
|
|
969
1050
|
mi = ALLOC_N(rpm_mi_t,1);
|
970
|
-
if (mi->mi = rpmdbInitIterator(RPM_DB(db), NUM2INT(rb_Integer(key)),
|
1051
|
+
if ((mi->mi = rpmdbInitIterator(RPM_DB(db), NUM2INT(rb_Integer(key)),
|
971
1052
|
NIL_P(val) ? NULL : RSTRING(val)->ptr,
|
972
|
-
|
1053
|
+
NIL_P(val) ? 0 : RSTRING(val)->len))){
|
973
1054
|
mi->db = (rpm_db_t*)DATA_PTR(db);
|
974
1055
|
db_ref(mi->db);
|
975
1056
|
return Data_Wrap_Struct(rpm_cMatchIterator, NULL, mi_free, mi);
|
@@ -1058,8 +1139,10 @@ Init_rpm_DB(void)
|
|
1058
1139
|
rb_define_singleton_method(rpm_cDB, "rebuild", db_s_rebuild, -1);
|
1059
1140
|
rb_define_method(rpm_cDB, "close", rpm_db_close, 0);
|
1060
1141
|
rb_define_method(rpm_cDB, "closed?", rpm_db_is_closed, 0);
|
1142
|
+
#ifndef RPMDB_OPAQUE
|
1061
1143
|
rb_define_method(rpm_cDB, "root", rpm_db_get_root, 0);
|
1062
1144
|
rb_define_method(rpm_cDB, "home", rpm_db_get_home, 0);
|
1145
|
+
#endif
|
1063
1146
|
rb_define_method(rpm_cDB, "writable?", rpm_db_is_writable, 0);
|
1064
1147
|
rb_define_method(rpm_cDB, "each_match", rpm_db_each_match, 2);
|
1065
1148
|
rb_define_method(rpm_cDB, "each", rpm_db_each, 0);
|
@@ -1095,7 +1178,9 @@ Init_rpm_transaction(void)
|
|
1095
1178
|
rb_define_method(rpm_cTransaction, "script_file=", rpm_transaction_set_script_file, 1);
|
1096
1179
|
rb_define_method(rpm_cTransaction, "install", rpm_transaction_install, 2);
|
1097
1180
|
rb_define_method(rpm_cTransaction, "upgrade", rpm_transaction_upgrade, 2);
|
1181
|
+
#ifdef RPMTS_AVAILABLE
|
1098
1182
|
rb_define_method(rpm_cTransaction, "available", rpm_transaction_available, 2);
|
1183
|
+
#endif
|
1099
1184
|
rb_define_method(rpm_cTransaction, "delete", rpm_transaction_delete, 1);
|
1100
1185
|
rb_define_method(rpm_cTransaction, "check", rpm_transaction_check, 0);
|
1101
1186
|
rb_define_method(rpm_cTransaction, "order", rpm_transaction_order, 0);
|
data/ext/rpm/extconf.h
ADDED
data/ext/rpm/extconf.rb
CHANGED
@@ -5,10 +5,15 @@
|
|
5
5
|
|
6
6
|
### $Id: extconf.rb 19 2004-03-28 10:01:23Z zaki $
|
7
7
|
|
8
|
+
# To build against an rpm installed in a nonstandard location, you need to
|
9
|
+
# set PKG_CONFIG_PATH and make sure the corresponding rpm executable is on
|
10
|
+
# PATH, e.g. if rpm was configured with --prefix=/dir you want
|
11
|
+
# PKG_CONFIG_PATH=/dir/lib/pkgconfig
|
12
|
+
# PATH=/dir/bin:$PATH
|
13
|
+
|
8
14
|
require 'mkmf'
|
9
15
|
|
10
16
|
dir_config('popt')
|
11
|
-
dir_config("rpm", "/usr/include/rpm", "/usr/lib")
|
12
17
|
|
13
18
|
def check_popt
|
14
19
|
if have_header('popt.h') and have_library('popt') then
|
@@ -39,9 +44,15 @@ end
|
|
39
44
|
|
40
45
|
def check_rpm
|
41
46
|
return false unless check_db
|
42
|
-
|
47
|
+
# Set things up manually
|
48
|
+
dir_config("rpm")
|
49
|
+
$libs = append_library($libs, 'rpmdb') if rpm_version < rpm_version([4,6,0])
|
43
50
|
$libs = append_library($libs, 'rpm')
|
44
|
-
if
|
51
|
+
if rpm_version >= rpm_version([4,6,0])
|
52
|
+
$defs << "-D_RPM_4_4_COMPAT"
|
53
|
+
return true
|
54
|
+
end
|
55
|
+
if have_header('rpm/rpmlib.h') and
|
45
56
|
have_library('rpmio') and
|
46
57
|
have_library('rpmbuild', 'getBuildTime') then
|
47
58
|
true
|
@@ -51,11 +62,18 @@ def check_rpm
|
|
51
62
|
end
|
52
63
|
end
|
53
64
|
|
65
|
+
# if no parameters, returns the installed rpm
|
66
|
+
# version, or the one specified by the array
|
67
|
+
# ie: [4,1,0]
|
68
|
+
def rpm_version(ver=[])
|
69
|
+
ver = `LANG=C rpm --version| cut -d' ' -f 3`.split(/\./) if ver.empty?
|
70
|
+
return (ver[0].to_i<<16) + (ver[1].to_i<<8) + (ver[2].to_i<<0)
|
71
|
+
end
|
72
|
+
|
54
73
|
def check_rpm_version
|
55
|
-
version_string=`LANG=C rpm --version| cut -d' ' -f 3`
|
56
|
-
ver=version_string.split(/\./)
|
57
74
|
# TODO: zaki: strict checking is requires
|
58
|
-
|
75
|
+
verflag = "-DRPM_VERSION_CODE=#{rpm_version}"
|
76
|
+
$defs << verflag
|
59
77
|
end
|
60
78
|
|
61
79
|
def check_debug
|
@@ -73,6 +91,12 @@ exit unless check_rpm_version
|
|
73
91
|
|
74
92
|
check_debug
|
75
93
|
|
94
|
+
HEADERS = [ "rpmlog", "rpmps", "rpmts", "rpmds" ]
|
95
|
+
HEADERS.each { |hdr| have_header("rpm/#{hdr}.h") }
|
96
|
+
|
97
|
+
$CFLAGS="#{$CFLAGS} -Werror -Wno-deprecated-declarations"
|
98
|
+
|
76
99
|
system 'gcc -MM *.c >depend 2>/dev/null'
|
77
100
|
|
101
|
+
create_header
|
78
102
|
create_makefile('rpmmodule')
|
data/ext/rpm/package.c
CHANGED
@@ -104,12 +104,29 @@ package_s_create(VALUE klass, VALUE name, VALUE version)
|
|
104
104
|
return pkg;
|
105
105
|
}
|
106
106
|
|
107
|
+
static rpmRC read_header_from_file(FD_t fd, const char *filename, Header *hdr)
|
108
|
+
{
|
109
|
+
rpmRC rc;
|
110
|
+
//#if RPM_VERSION_CODE < RPM_VERSION(4,6,0)
|
111
|
+
#if 0
|
112
|
+
/* filename is ignored */
|
113
|
+
Header sigs;
|
114
|
+
rc = rpmReadPackageInfo(fd, &sigs, hdr);
|
115
|
+
headerFree(sigs);
|
116
|
+
#else
|
117
|
+
rpmts ts = rpmtsCreate();
|
118
|
+
rc = rpmReadPackageFile(ts, fd, filename, hdr);
|
119
|
+
rpmtsFree(ts);
|
120
|
+
#endif
|
121
|
+
return rc;
|
122
|
+
}
|
123
|
+
|
107
124
|
static VALUE
|
108
125
|
package_s_open(VALUE klass, VALUE filename)
|
109
126
|
{
|
110
127
|
VALUE pkg = Qnil;
|
111
128
|
FD_t fd;
|
112
|
-
Header hdr
|
129
|
+
Header hdr;
|
113
130
|
rpmRC rc;
|
114
131
|
|
115
132
|
if (TYPE(filename) != T_STRING) {
|
@@ -121,7 +138,8 @@ package_s_open(VALUE klass, VALUE filename)
|
|
121
138
|
rb_raise(rb_eRuntimeError, "can not open file %s",
|
122
139
|
RSTRING(filename)->ptr);
|
123
140
|
}
|
124
|
-
|
141
|
+
|
142
|
+
rc = read_header_from_file(fd, RSTRING(filename)->ptr, &hdr);
|
125
143
|
Fclose(fd);
|
126
144
|
|
127
145
|
switch (rc) {
|
@@ -133,7 +151,7 @@ package_s_open(VALUE klass, VALUE filename)
|
|
133
151
|
/* MO_TODO: zaki: should I warn these two status to users? */
|
134
152
|
#endif
|
135
153
|
case RPMRC_OK:
|
136
|
-
headerFree(sigs);
|
154
|
+
//headerFree(sigs);
|
137
155
|
pkg = package_new_from_header(klass, hdr);
|
138
156
|
headerFree(hdr);
|
139
157
|
break;
|
@@ -175,7 +193,7 @@ package_s_load(VALUE klass, VALUE str)
|
|
175
193
|
Fseek(fd, 0, SEEK_SET);
|
176
194
|
hdr = headerRead(fd, HEADER_MAGIC_YES);
|
177
195
|
Fclose(fd);
|
178
|
-
|
196
|
+
unlink(RSTRING(temp)->ptr);
|
179
197
|
|
180
198
|
if (!hdr) {
|
181
199
|
rb_raise(rb_eArgError, "unable load RPM::Package");
|
@@ -190,15 +208,18 @@ package_s_load(VALUE klass, VALUE str)
|
|
190
208
|
VALUE
|
191
209
|
rpm_package_copy_tags(VALUE from,VALUE to,VALUE tags)
|
192
210
|
{
|
193
|
-
|
211
|
+
#if RPM_VERSION_CODE < RPM_VERSION(4,6,0)
|
212
|
+
#define rpmTag int_32
|
213
|
+
#endif
|
214
|
+
rpmTag *copy_tags;
|
194
215
|
int length = NUM2INT(rb_funcall(tags,rb_intern("length"),0));
|
195
216
|
int i;
|
196
217
|
|
197
|
-
copy_tags = ALLOCA_N(
|
218
|
+
copy_tags = ALLOCA_N(rpmTag,length);
|
198
219
|
for (i=0;i<length;i++)
|
199
220
|
copy_tags[i] = NUM2INT(rb_ary_entry(tags, i));
|
200
221
|
headerCopyTags(RPM_HEADER(from),RPM_HEADER(to),copy_tags);
|
201
|
-
|
222
|
+
return Qnil;
|
202
223
|
}
|
203
224
|
|
204
225
|
VALUE
|
@@ -302,6 +323,7 @@ rpm_package_delete_tag(VALUE pkg, VALUE tag)
|
|
302
323
|
return val;
|
303
324
|
}
|
304
325
|
|
326
|
+
#if RPM_VERSION_CODE < RPM_VERSION(4,6,0)
|
305
327
|
VALUE
|
306
328
|
rpm_package_aref(VALUE pkg, VALUE tag)
|
307
329
|
{
|
@@ -311,7 +333,6 @@ rpm_package_aref(VALUE pkg, VALUE tag)
|
|
311
333
|
rpmTagType type;
|
312
334
|
int_32 count;
|
313
335
|
register int i;
|
314
|
-
register const char* p;
|
315
336
|
int ary_p = 0;
|
316
337
|
int i18n_p = 0;
|
317
338
|
|
@@ -440,6 +461,141 @@ rpm_package_aref(VALUE pkg, VALUE tag)
|
|
440
461
|
leave:
|
441
462
|
return val;
|
442
463
|
}
|
464
|
+
#else
|
465
|
+
VALUE
|
466
|
+
rpm_package_aref(VALUE pkg, VALUE tag)
|
467
|
+
{
|
468
|
+
rpmTag tagval = NUM2INT(tag);
|
469
|
+
VALUE val = Qnil;
|
470
|
+
rpmtd tagc = rpmtdNew();
|
471
|
+
int ary_p = 0;
|
472
|
+
int i18n_p = 0;
|
473
|
+
|
474
|
+
if (!headerGet(RPM_HEADER(pkg), tagval, tagc, HEADERGET_MINMEM)) {
|
475
|
+
rpmtdFree(tagc);
|
476
|
+
goto leave;
|
477
|
+
}
|
478
|
+
switch (tagval) {
|
479
|
+
case RPMTAG_DIRINDEXES:
|
480
|
+
case RPMTAG_FILESIZES:
|
481
|
+
case RPMTAG_FILESTATES:
|
482
|
+
case RPMTAG_FILEMODES:
|
483
|
+
case RPMTAG_FILERDEVS:
|
484
|
+
case RPMTAG_FILEMTIMES:
|
485
|
+
case RPMTAG_FILEMD5S:
|
486
|
+
case RPMTAG_FILEFLAGS:
|
487
|
+
case RPMTAG_FILEUSERNAME:
|
488
|
+
case RPMTAG_FILEGROUPNAME:
|
489
|
+
case RPMTAG_PROVIDEFLAGS:
|
490
|
+
case RPMTAG_REQUIREFLAGS:
|
491
|
+
case RPMTAG_CONFLICTFLAGS:
|
492
|
+
case RPMTAG_OBSOLETEFLAGS:
|
493
|
+
ary_p = 1;
|
494
|
+
break;
|
495
|
+
|
496
|
+
case RPMTAG_GROUP:
|
497
|
+
case RPMTAG_SUMMARY:
|
498
|
+
case RPMTAG_DISTRIBUTION:
|
499
|
+
case RPMTAG_VENDOR:
|
500
|
+
case RPMTAG_LICENSE:
|
501
|
+
case RPMTAG_PACKAGER:
|
502
|
+
case RPMTAG_DESCRIPTION:
|
503
|
+
i18n_p = 1;
|
504
|
+
break;
|
505
|
+
default:
|
506
|
+
break;
|
507
|
+
}
|
508
|
+
|
509
|
+
switch (rpmtdType(tagc)) {
|
510
|
+
case RPM_BIN_TYPE:
|
511
|
+
val = rb_str_new2(rpmtdGetString(tagc));
|
512
|
+
break;
|
513
|
+
|
514
|
+
case RPM_CHAR_TYPE:
|
515
|
+
case RPM_INT8_TYPE:
|
516
|
+
if (rpmtdCount(tagc) == 1 && !ary_p) {
|
517
|
+
val = INT2NUM(*rpmtdGetChar(tagc));
|
518
|
+
} else {
|
519
|
+
val = rb_ary_new();
|
520
|
+
rpmtdInit(tagc);
|
521
|
+
while ( rpmtdNext(tagc) != -1 ) {
|
522
|
+
rb_ary_push(val, INT2NUM(*rpmtdGetChar(tagc)));
|
523
|
+
}
|
524
|
+
}
|
525
|
+
break;
|
526
|
+
|
527
|
+
case RPM_INT16_TYPE:
|
528
|
+
if (rpmtdCount(tagc) == 1 && !ary_p) {
|
529
|
+
val = INT2NUM(*rpmtdGetUint16(tagc));
|
530
|
+
} else {
|
531
|
+
val = rb_ary_new();
|
532
|
+
rpmtdInit(tagc);
|
533
|
+
while ( rpmtdNext(tagc) != -1 ) {
|
534
|
+
rb_ary_push(val, INT2NUM(*rpmtdGetUint16(tagc)));
|
535
|
+
}
|
536
|
+
}
|
537
|
+
break;
|
538
|
+
|
539
|
+
case RPM_INT32_TYPE:
|
540
|
+
if (rpmtdCount(tagc) == 1 && !ary_p) {
|
541
|
+
val = INT2NUM(*rpmtdGetUint32(tagc));
|
542
|
+
} else {
|
543
|
+
val = rb_ary_new();
|
544
|
+
rpmtdInit(tagc);
|
545
|
+
while ( rpmtdNext(tagc) != -1) {
|
546
|
+
rb_ary_push(val, INT2NUM(*rpmtdGetUint32(tagc)));
|
547
|
+
}
|
548
|
+
}
|
549
|
+
break;
|
550
|
+
|
551
|
+
case RPM_STRING_TYPE:
|
552
|
+
if (rpmtdCount(tagc) == 1 && !ary_p) {
|
553
|
+
val = rb_str_new2(rpmtdGetString(tagc));
|
554
|
+
} else {
|
555
|
+
val = rb_ary_new();
|
556
|
+
while ( rpmtdNext(tagc) != -1) {
|
557
|
+
rb_ary_push(val, rb_str_new2(rpmtdGetString(tagc)));
|
558
|
+
}
|
559
|
+
}
|
560
|
+
rpmtdFree(tagc);
|
561
|
+
break;
|
562
|
+
|
563
|
+
case RPM_STRING_ARRAY_TYPE:
|
564
|
+
{
|
565
|
+
if (i18n_p) {
|
566
|
+
rpmtd i18ntd = rpmtdNew();
|
567
|
+
|
568
|
+
if (!headerGet(RPM_HEADER(pkg), HEADER_I18NTABLE, i18ntd, HEADERGET_MINMEM)) {
|
569
|
+
goto strary;
|
570
|
+
}
|
571
|
+
|
572
|
+
val = rb_hash_new();
|
573
|
+
rpmtdInit(tagc);
|
574
|
+
while ( rpmtdNext(tagc) != -1) {
|
575
|
+
VALUE lang = rb_str_new2(rpmtdNextString(i18ntd));
|
576
|
+
VALUE str = rb_str_new2(rpmtdGetString(tagc));
|
577
|
+
rb_hash_aset(val, lang, str);
|
578
|
+
}
|
579
|
+
rpmtdFree(i18ntd);
|
580
|
+
} else {
|
581
|
+
strary:
|
582
|
+
val = rb_ary_new();
|
583
|
+
rpmtdInit(tagc);
|
584
|
+
while ( rpmtdNext(tagc) != -1) {
|
585
|
+
rb_ary_push(val, rb_str_new2(rpmtdGetString(tagc)));
|
586
|
+
}
|
587
|
+
}
|
588
|
+
rpmtdFree(tagc);
|
589
|
+
}
|
590
|
+
break;
|
591
|
+
|
592
|
+
default:
|
593
|
+
goto leave;
|
594
|
+
}
|
595
|
+
leave:
|
596
|
+
return val;
|
597
|
+
}
|
598
|
+
#endif
|
443
599
|
|
444
600
|
VALUE
|
445
601
|
rpm_package_sprintf(VALUE pkg, VALUE fmt)
|
@@ -579,6 +735,7 @@ rpm_package_get_files(VALUE pkg)
|
|
579
735
|
return files;
|
580
736
|
}
|
581
737
|
|
738
|
+
#if RPM_VERSION_CODE < RPM_VERSION(4,6,0)
|
582
739
|
VALUE
|
583
740
|
rpm_package_get_dependency(VALUE pkg,int nametag,int versiontag,int flagtag,VALUE (*dependency_new)(const char*,VALUE,int,VALUE))
|
584
741
|
{
|
@@ -617,6 +774,42 @@ rpm_package_get_dependency(VALUE pkg,int nametag,int versiontag,int flagtag,VALU
|
|
617
774
|
release_entry(flagtype, (void*)flags);
|
618
775
|
return deps;
|
619
776
|
}
|
777
|
+
#else
|
778
|
+
VALUE
|
779
|
+
rpm_package_get_dependency(VALUE pkg,int nametag,int versiontag,int flagtag,VALUE (*dependency_new)(const char*,VALUE,int,VALUE))
|
780
|
+
{
|
781
|
+
VALUE deps;
|
782
|
+
|
783
|
+
rpmtd nametd = rpmtdNew();
|
784
|
+
rpmtd versiontd = rpmtdNew();
|
785
|
+
rpmtd flagtd = rpmtdNew();
|
786
|
+
|
787
|
+
deps = rb_ary_new();
|
788
|
+
|
789
|
+
if (!headerGet(RPM_HEADER(pkg), nametag, nametd, HEADERGET_MINMEM)) {
|
790
|
+
goto leave;
|
791
|
+
}
|
792
|
+
if (!headerGet(RPM_HEADER(pkg), versiontag, versiontd, HEADERGET_MINMEM)) {
|
793
|
+
goto leave;
|
794
|
+
return deps;
|
795
|
+
}
|
796
|
+
if (!headerGet(RPM_HEADER(pkg), flagtag, flagtd, HEADERGET_MINMEM)) {
|
797
|
+
goto leave;
|
798
|
+
return deps;
|
799
|
+
}
|
800
|
+
|
801
|
+
rpmtdInit(nametd);
|
802
|
+
while ( rpmtdNext(nametd) != -1 ) {
|
803
|
+
rb_ary_push(deps,dependency_new(rpmtdGetString(nametd),rpm_version_new(rpmtdNextString(versiontd)),*rpmtdNextUint32(flagtd),pkg));
|
804
|
+
}
|
805
|
+
|
806
|
+
leave:
|
807
|
+
rpmtdFree(nametd);
|
808
|
+
rpmtdFree(versiontd);
|
809
|
+
rpmtdFree(flagtd);
|
810
|
+
return deps;
|
811
|
+
}
|
812
|
+
#endif
|
620
813
|
|
621
814
|
VALUE
|
622
815
|
rpm_package_get_provides(VALUE pkg)
|
@@ -642,6 +835,7 @@ rpm_package_get_obsoletes(VALUE pkg)
|
|
642
835
|
return rpm_package_get_dependency(pkg,RPMTAG_OBSOLETENAME,RPMTAG_OBSOLETEVERSION,RPMTAG_OBSOLETEFLAGS,rpm_obsolete_new);
|
643
836
|
}
|
644
837
|
|
838
|
+
#if RPM_VERSION_CODE < RPM_VERSION(4,6,0)
|
645
839
|
VALUE
|
646
840
|
rpm_package_get_changelog(VALUE pkg)
|
647
841
|
{
|
@@ -680,6 +874,47 @@ rpm_package_get_changelog(VALUE pkg)
|
|
680
874
|
}
|
681
875
|
return cl;
|
682
876
|
}
|
877
|
+
#else
|
878
|
+
VALUE
|
879
|
+
rpm_package_get_changelog(VALUE pkg)
|
880
|
+
{
|
881
|
+
VALUE cl;
|
882
|
+
rpmtd timetd = rpmtdNew();
|
883
|
+
rpmtd nametd = rpmtdNew();
|
884
|
+
rpmtd texttd = rpmtdNew();
|
885
|
+
|
886
|
+
cl = rb_ary_new();
|
887
|
+
|
888
|
+
if (!headerGet(RPM_HEADER(pkg), RPMTAG_CHANGELOGTIME, timetd, HEADERGET_MINMEM)) {
|
889
|
+
goto leave;
|
890
|
+
}
|
891
|
+
if (!headerGet(RPM_HEADER(pkg), RPMTAG_CHANGELOGNAME, nametd, HEADERGET_MINMEM)) {
|
892
|
+
goto leave;
|
893
|
+
}
|
894
|
+
if (!headerGet(RPM_HEADER(pkg), RPMTAG_CHANGELOGTEXT, texttd, HEADERGET_MINMEM)) {
|
895
|
+
goto leave;
|
896
|
+
}
|
897
|
+
|
898
|
+
rpmtdInit(timetd);
|
899
|
+
rpmtdInit(nametd);
|
900
|
+
rpmtdInit(texttd);
|
901
|
+
|
902
|
+
while ( rpmtdNext(timetd) != -1 ) {
|
903
|
+
VALUE chglog = rb_struct_new(
|
904
|
+
rpm_sChangeLog,
|
905
|
+
rb_time_new((time_t) rpmtdGetUint32(timetd), (time_t)0),
|
906
|
+
rb_str_new2(rpmtdNextString(nametd)),
|
907
|
+
rb_str_new2(rpmtdNextString(texttd)));
|
908
|
+
rb_ary_push(cl, chglog);
|
909
|
+
}
|
910
|
+
|
911
|
+
leave:
|
912
|
+
rpmtdFree(timetd);
|
913
|
+
rpmtdFree(nametd);
|
914
|
+
rpmtdFree(texttd);
|
915
|
+
return cl;
|
916
|
+
}
|
917
|
+
#endif
|
683
918
|
|
684
919
|
VALUE
|
685
920
|
rpm_package_dump(VALUE pkg)
|
@@ -699,7 +934,7 @@ rpm_package_dump(VALUE pkg)
|
|
699
934
|
munmap(buf, size);
|
700
935
|
|
701
936
|
Fclose(fd);
|
702
|
-
|
937
|
+
unlink(RSTRING(temp)->ptr);
|
703
938
|
|
704
939
|
return dump;
|
705
940
|
}
|
data/ext/rpm/private.h
CHANGED
@@ -6,6 +6,8 @@
|
|
6
6
|
|
7
7
|
/* $Id: private.h 17 2004-03-19 05:12:19Z zaki $ */
|
8
8
|
|
9
|
+
#include <extconf.h>
|
10
|
+
|
9
11
|
#define RPM_VERSION(maj,min,pl) (((maj) << 16) + ((min) << 8) + (pl))
|
10
12
|
|
11
13
|
#include <ctype.h>
|
@@ -20,16 +22,23 @@
|
|
20
22
|
#include <unistd.h>
|
21
23
|
#include <st.h>
|
22
24
|
|
23
|
-
#include <rpmcli.h>
|
24
|
-
#include <rpmlib.h>
|
25
|
-
#include <rpmdb.h>
|
26
|
-
#include <rpmbuild.h>
|
27
|
-
#
|
28
|
-
#
|
29
|
-
#
|
30
|
-
#include <
|
31
|
-
#
|
32
|
-
#
|
25
|
+
#include <rpm/rpmcli.h>
|
26
|
+
#include <rpm/rpmlib.h>
|
27
|
+
#include <rpm/rpmdb.h>
|
28
|
+
#include <rpm/rpmbuild.h>
|
29
|
+
#if HAVE_RPM_RPMLOG_H
|
30
|
+
# include <rpm/rpmlog.h>
|
31
|
+
#else
|
32
|
+
# include <rpm/rpmmessages.h>
|
33
|
+
#endif
|
34
|
+
#if HAVE_RPM_RPMTS_H
|
35
|
+
# include <rpm/rpmts.h>
|
36
|
+
#endif
|
37
|
+
#if HAVE_RPM_RPMPS_H
|
38
|
+
# include <rpm/rpmps.h>
|
39
|
+
#endif
|
40
|
+
#if HAVE_RPM_RPMDS_H
|
41
|
+
# include <rpm/rpmds.h>
|
33
42
|
#endif
|
34
43
|
|
35
44
|
#include "ruby-rpm.h"
|
@@ -49,6 +58,13 @@
|
|
49
58
|
#define RPM_TRANSACTION(v) (((rpm_trans_t*)DATA_PTR((v)))->ts)
|
50
59
|
#define RPM_SCRIPT_FD(v) (((rpm_trans_t*)DATA_PTR((v)))->script_fd)
|
51
60
|
|
61
|
+
#if RPM_VERSION_CODE >= RPM_VERSION(4,5,90)
|
62
|
+
#define RPMDB_OPAQUE 1
|
63
|
+
#define RPMPS_OPAQUE 1
|
64
|
+
#else
|
65
|
+
#define RPMTS_AVAILABLE 1
|
66
|
+
#endif
|
67
|
+
|
52
68
|
typedef struct {
|
53
69
|
rpmdb db;
|
54
70
|
int ref_count;
|
@@ -98,6 +114,7 @@ void Init_rpm_spec(void);
|
|
98
114
|
/* version.c */
|
99
115
|
void Init_rpm_version(void);
|
100
116
|
|
117
|
+
#if RPM_VERSION_CODE < RPM_VERSION(4,6,0)
|
101
118
|
static void inline
|
102
119
|
get_entry(Header hdr, rpmTag tag, rpmTagType* type, void** ptr)
|
103
120
|
{
|
@@ -106,6 +123,13 @@ get_entry(Header hdr, rpmTag tag, rpmTagType* type, void** ptr)
|
|
106
123
|
*ptr = NULL;
|
107
124
|
}
|
108
125
|
}
|
126
|
+
#else
|
127
|
+
static void inline
|
128
|
+
get_entry(Header hdr, rpmTag tag, rpmtd tc)
|
129
|
+
{
|
130
|
+
headerGet(hdr, tag, tc, HEADERGET_MINMEM);
|
131
|
+
}
|
132
|
+
#endif
|
109
133
|
|
110
134
|
static void inline
|
111
135
|
release_entry(rpmTagType type, void* ptr)
|
data/ext/rpm/rpm.c
CHANGED
@@ -204,6 +204,7 @@ Init_rpmmodule(void)
|
|
204
204
|
DEF_LOG(DEBUG);
|
205
205
|
#undef DEF_LOG
|
206
206
|
|
207
|
+
#if RPM_VERSION_CODE < RPM_VERSION(4,5,90)
|
207
208
|
#define DEF_MESS(name) \
|
208
209
|
rb_define_const(rpm_mRPM, "MESS_"#name, INT2NUM(RPMMESS_##name))
|
209
210
|
DEF_MESS(DEBUG);
|
@@ -214,6 +215,7 @@ Init_rpmmodule(void)
|
|
214
215
|
DEF_MESS(FATALERROR);
|
215
216
|
DEF_MESS(QUIET);
|
216
217
|
#undef DEF_MESS
|
218
|
+
#endif
|
217
219
|
|
218
220
|
#define DEFINE_DBI(name) \
|
219
221
|
rb_define_const(rpm_mRPM, "DBI_"#name, INT2NUM(RPMDBI_##name))
|
@@ -400,7 +402,9 @@ Init_rpmmodule(void)
|
|
400
402
|
#define DEFINE_SENSE(name) \
|
401
403
|
rb_define_const(rpm_mRPM, "SENSE_"#name, INT2NUM(RPMSENSE_##name))
|
402
404
|
DEFINE_SENSE(ANY);
|
405
|
+
#if RPM_VERSION_CODE < RPM_VERSION(4,5,90)
|
403
406
|
DEFINE_SENSE(SERIAL);
|
407
|
+
#endif
|
404
408
|
DEFINE_SENSE(LESS);
|
405
409
|
DEFINE_SENSE(GREATER);
|
406
410
|
DEFINE_SENSE(EQUAL);
|
@@ -453,7 +457,9 @@ Init_rpmmodule(void)
|
|
453
457
|
DEF_PROB(OLDPACKAGE);
|
454
458
|
DEF_PROB(DISKSPACE);
|
455
459
|
DEF_PROB(DISKNODES);
|
460
|
+
#if RPM_VERSION_CODE < RPM_VERSION(4,5,90)
|
456
461
|
DEF_PROB(BADPRETRANS);
|
462
|
+
#endif
|
457
463
|
#undef DEF_PROB
|
458
464
|
|
459
465
|
#define DEF_CALLBACK(name) \
|
@@ -513,7 +519,7 @@ Init_rpmmodule(void)
|
|
513
519
|
DEF_TRANS_FLAG(APPLYONLY);
|
514
520
|
#if RPM_VERSION_CODE < RPM_VERSION(4,1,0)
|
515
521
|
DEF_TRANS_FLAG(CHAINSAW);
|
516
|
-
#
|
522
|
+
#elif RPM_VERSION_CODE < RPM_VERSION(4,5,90)
|
517
523
|
DEF_TRANS_FLAG(ANACONDA);
|
518
524
|
#endif
|
519
525
|
/* NOMD5 is not in jbj's 4.4.6 any more - Mandriva uses that */
|
data/ext/rpm/ruby-rpm.h
CHANGED
data/ext/rpm/spec.c
CHANGED
@@ -53,7 +53,6 @@ spec_s_open(VALUE klass, VALUE filename)
|
|
53
53
|
break;
|
54
54
|
}
|
55
55
|
|
56
|
-
case RPMERR_BADSPEC:
|
57
56
|
default:
|
58
57
|
rb_raise(rb_eRuntimeError, "specfile `%s' parsing failed", RSTRING(filename)->ptr);
|
59
58
|
}
|
@@ -66,7 +65,6 @@ spec_s_open(VALUE klass, VALUE filename)
|
|
66
65
|
break;
|
67
66
|
}
|
68
67
|
|
69
|
-
case RPMERR_BADSPEC:
|
70
68
|
default:
|
71
69
|
rb_raise(rb_eRuntimeError, "specfile `%s' parsing failed", RSTRING(filename)->ptr);
|
72
70
|
}
|
@@ -83,9 +81,15 @@ rpm_spec_open(const char* filename)
|
|
83
81
|
VALUE
|
84
82
|
rpm_spec_get_buildroot(VALUE spec)
|
85
83
|
{
|
84
|
+
#if RPM_VERSION_CODE >= RPM_VERSION(4,5,90)
|
85
|
+
if (RPM_SPEC(spec)->buildRoot) {
|
86
|
+
return rb_str_new2(RPM_SPEC(spec)->buildRoot);
|
87
|
+
}
|
88
|
+
#else
|
86
89
|
if (RPM_SPEC(spec)->buildRootURL) {
|
87
90
|
return rb_str_new2(RPM_SPEC(spec)->buildRootURL);
|
88
91
|
}
|
92
|
+
#endif
|
89
93
|
return Qnil;
|
90
94
|
}
|
91
95
|
|
@@ -120,6 +124,7 @@ rpm_spec_get_buildrequires(VALUE spec)
|
|
120
124
|
{
|
121
125
|
VALUE br = rb_ivar_get(spec, id_br);
|
122
126
|
|
127
|
+
#if RPM_VERSION_CODE < RPM_VERSION(4,6,0)
|
123
128
|
if (NIL_P(br)) {
|
124
129
|
const char** names;
|
125
130
|
const char** vers;
|
@@ -153,13 +158,44 @@ rpm_spec_get_buildrequires(VALUE spec)
|
|
153
158
|
|
154
159
|
leave:
|
155
160
|
return br;
|
161
|
+
#else
|
162
|
+
rpmtd nametd = rpmtdNew();
|
163
|
+
rpmtd versiontd = rpmtdNew();
|
164
|
+
rpmtd flagtd = rpmtdNew();
|
165
|
+
|
166
|
+
if (NIL_P(br)) {
|
167
|
+
br = rb_ary_new();
|
168
|
+
if (!headerGet(RPM_SPEC(spec)->buildRestrictions,
|
169
|
+
RPMTAG_REQUIRENAME, nametd, HEADERGET_MINMEM)) {
|
170
|
+
goto leave;
|
171
|
+
}
|
172
|
+
|
173
|
+
get_entry(RPM_SPEC(spec)->buildRestrictions, RPMTAG_REQUIREVERSION,
|
174
|
+
versiontd);
|
175
|
+
get_entry(RPM_SPEC(spec)->buildRestrictions, RPMTAG_REQUIREFLAGS,
|
176
|
+
flagtd);
|
177
|
+
|
178
|
+
rpmtdInit(nametd);
|
179
|
+
while ( rpmtdNext(nametd) != -1 ) {
|
180
|
+
rb_ary_push(br, rpm_require_new(rpmtdGetString(nametd), rpm_version_new(rpmtdNextString(versiontd)), *rpmtdNextUint32(flagtd), spec));
|
181
|
+
}
|
182
|
+
rb_ivar_set(spec, id_br, br);
|
183
|
+
}
|
184
|
+
|
185
|
+
leave:
|
186
|
+
rpmtdFree(nametd);
|
187
|
+
rpmtdFree(versiontd);
|
188
|
+
rpmtdFree(flagtd);
|
189
|
+
|
190
|
+
return br;
|
191
|
+
#endif
|
156
192
|
}
|
157
193
|
|
158
194
|
VALUE
|
159
195
|
rpm_spec_get_buildconflicts(VALUE spec)
|
160
196
|
{
|
161
197
|
VALUE bc = rb_ivar_get(spec, id_bc);
|
162
|
-
|
198
|
+
#if RPM_VERSION_CODE < RPM_VERSION(4,6,0)
|
163
199
|
if (NIL_P(bc)) {
|
164
200
|
const char** names;
|
165
201
|
const char** vers;
|
@@ -192,6 +228,38 @@ rpm_spec_get_buildconflicts(VALUE spec)
|
|
192
228
|
}
|
193
229
|
leave:
|
194
230
|
return bc;
|
231
|
+
#else
|
232
|
+
rpmtd nametd = rpmtdNew();
|
233
|
+
rpmtd versiontd = rpmtdNew();
|
234
|
+
rpmtd flagtd = rpmtdNew();
|
235
|
+
|
236
|
+
if (NIL_P(bc)) {
|
237
|
+
bc = rb_ary_new();
|
238
|
+
if (!headerGet(RPM_SPEC(spec)->buildRestrictions,
|
239
|
+
RPMTAG_CONFLICTNAME, nametd, HEADERGET_MINMEM)) {
|
240
|
+
|
241
|
+
goto leave;
|
242
|
+
}
|
243
|
+
|
244
|
+
get_entry(RPM_SPEC(spec)->buildRestrictions, RPMTAG_CONFLICTVERSION,
|
245
|
+
versiontd);
|
246
|
+
get_entry(RPM_SPEC(spec)->buildRestrictions, RPMTAG_CONFLICTFLAGS,
|
247
|
+
flagtd);
|
248
|
+
|
249
|
+
rpmtdInit(nametd);
|
250
|
+
while ( rpmtdNext(nametd) != -1) {
|
251
|
+
rb_ary_push(bc, rpm_conflict_new(rpmtdGetString(nametd), rpm_version_new(rpmtdNextString(versiontd)), *rpmtdNextUint32(flagtd), spec));
|
252
|
+
}
|
253
|
+
|
254
|
+
rb_ivar_set(spec, id_bc, bc);
|
255
|
+
}
|
256
|
+
leave:
|
257
|
+
rpmtdFree(nametd);
|
258
|
+
rpmtdFree(versiontd);
|
259
|
+
rpmtdFree(flagtd);
|
260
|
+
|
261
|
+
return bc;
|
262
|
+
#endif
|
195
263
|
}
|
196
264
|
|
197
265
|
VALUE
|
@@ -214,10 +282,10 @@ rpm_spec_get_sources(VALUE spec)
|
|
214
282
|
|
215
283
|
if (NIL_P(src)) {
|
216
284
|
struct Source* s = RPM_SPEC(spec)->sources;
|
217
|
-
|
285
|
+
|
218
286
|
src = rb_ary_new();
|
219
287
|
while (s != NULL) {
|
220
|
-
VALUE obj;
|
288
|
+
VALUE obj = Qnil;
|
221
289
|
|
222
290
|
if (s->flags & RPMBUILD_ISSOURCE) {
|
223
291
|
obj = rpm_source_new(s->fullSource, s->num, s->flags & RPMBUILD_ISNO);
|
data/ext/rpm/version.c
CHANGED
@@ -191,7 +191,7 @@ rpm_version_cmp(VALUE ver, VALUE other)
|
|
191
191
|
VALUE vr,or;
|
192
192
|
VALUE vv,ov;
|
193
193
|
int sense = 0;
|
194
|
-
|
194
|
+
|
195
195
|
if (rb_obj_is_kind_of(other, rpm_cVersion) != Qtrue) {
|
196
196
|
rb_raise(rb_eTypeError, "illegal argument type");
|
197
197
|
}
|
@@ -289,7 +289,7 @@ rpm_version_to_vre(VALUE ver)
|
|
289
289
|
r = rb_ivar_get(ver, id_r);
|
290
290
|
e = rb_ivar_get(ver, id_e);
|
291
291
|
if (!NIL_P(e)) {
|
292
|
-
snprintf(buf,BUFSIZ,"%
|
292
|
+
snprintf(buf,BUFSIZ,"%ld:", (long) NUM2INT(e));
|
293
293
|
p += strlen(buf);
|
294
294
|
}
|
295
295
|
strcpy(p, RSTRING(v)->ptr);
|
@@ -304,14 +304,13 @@ VALUE
|
|
304
304
|
rpm_version_inspect(VALUE ver)
|
305
305
|
{
|
306
306
|
char buf[BUFSIZ];
|
307
|
-
char *p = buf;
|
308
307
|
VALUE v, r, e;
|
309
308
|
v = rb_ivar_get(ver, id_v);
|
310
309
|
r = rb_ivar_get(ver, id_r);
|
311
310
|
e = rb_ivar_get(ver, id_e);
|
312
311
|
|
313
312
|
if (!NIL_P(e)) {
|
314
|
-
snprintf(buf, BUFSIZ, "#<RPM::Version v=%s, r=%s, e=%
|
313
|
+
snprintf(buf, BUFSIZ, "#<RPM::Version v=%s, r=%s, e=%ld>", RSTRING(rb_inspect(v))->ptr, RSTRING(rb_inspect(r))->ptr, (long) NUM2INT(e));
|
315
314
|
} else {
|
316
315
|
snprintf(buf, BUFSIZ, "#<RPM::Version v=%s, r=%s>", RSTRING(rb_inspect(v))->ptr, RSTRING(rb_inspect(r))->ptr);
|
317
316
|
}
|
@@ -327,7 +326,7 @@ rpm_version_hash(VALUE ver)
|
|
327
326
|
v = rb_ivar_get(ver, id_v);
|
328
327
|
r = rb_ivar_get(ver, id_r);
|
329
328
|
e = rb_ivar_get(ver, id_e);
|
330
|
-
|
329
|
+
|
331
330
|
h = NIL_P(e) ? 0 : NUM2INT(e);
|
332
331
|
h = (h << 1) ^ NUM2LONG(rb_hash(r));
|
333
332
|
h = (h << 1) ^ NUM2LONG(rb_hash(v));
|
data/spec/fedora/ruby-rpm.spec
CHANGED
@@ -1,21 +1,30 @@
|
|
1
1
|
%{!?ruby_sitelib: %define ruby_sitelib %(ruby -rrbconfig -e "puts Config::CONFIG['sitelibdir']")}
|
2
2
|
%{!?ruby_sitearch: %define ruby_sitearch %(ruby -rrbconfig -e "puts Config::CONFIG['sitearchdir']")}
|
3
3
|
|
4
|
+
%define has_ruby_abi 0%{?fedora:%fedora} >= 5 || 0%{?rhel:%rhel} >= 5
|
5
|
+
|
4
6
|
Summary: Ruby bindings for RPM
|
5
7
|
Name: ruby-rpm
|
6
8
|
|
7
|
-
Version: 1.2.
|
8
|
-
Release:
|
9
|
+
Version: 1.2.4
|
10
|
+
Release: 3%{?dist}
|
9
11
|
Group: Development/Languages
|
10
|
-
License:
|
12
|
+
License: GPLv2+
|
11
13
|
URL: http://rubyforge.org/projects/ruby-rpm/
|
12
|
-
Source0:
|
13
|
-
BuildRoot: %{_tmppath}/%{name}-%{version}-root
|
14
|
-
|
15
|
-
|
16
|
-
BuildRequires: ruby
|
14
|
+
Source0: http://rubyforge.org/frs/download.php/26403/%{name}-1.2.3.tgz
|
15
|
+
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
16
|
+
%if %has_ruby_abi
|
17
|
+
Requires: ruby(abi) = 1.8
|
18
|
+
BuildRequires: ruby(abi) = 1.8
|
19
|
+
%endif
|
20
|
+
Provides: ruby(rpm) = %version
|
21
|
+
BuildRequires: ruby ruby-devel
|
17
22
|
BuildRequires: rpm-devel >= 4.2.1
|
18
23
|
BuildRequires: db4-devel
|
24
|
+
# In popt before F8, in popt-devel for F8 and later
|
25
|
+
%if 0%{?fedora:%fedora} >= 8
|
26
|
+
BuildRequires: popt-devel
|
27
|
+
%endif
|
19
28
|
|
20
29
|
%description
|
21
30
|
Provides bindings for accessing RPM packages and databases from Ruby. It
|
@@ -36,7 +45,7 @@ ruby install.rb config \
|
|
36
45
|
ruby install.rb setup
|
37
46
|
|
38
47
|
%install
|
39
|
-
|
48
|
+
rm -rf %{buildroot}
|
40
49
|
ruby install.rb config \
|
41
50
|
--bin-dir=%{buildroot}%{_bindir} \
|
42
51
|
--rb-dir=%{buildroot}%{ruby_sitelib} \
|
@@ -46,15 +55,21 @@ ruby install.rb install
|
|
46
55
|
chmod 0755 %{buildroot}%{ruby_sitearch}/rpmmodule.so
|
47
56
|
|
48
57
|
%clean
|
49
|
-
|
58
|
+
rm -rf %{buildroot}
|
50
59
|
|
51
60
|
%files
|
52
|
-
%defattr(-, root, root)
|
61
|
+
%defattr(-, root, root,-)
|
53
62
|
%doc NEWS README COPYING ChangeLog doc
|
54
63
|
%{ruby_sitelib}/rpm.rb
|
55
64
|
%{ruby_sitearch}/rpmmodule.so
|
56
65
|
|
57
66
|
%changelog
|
67
|
+
* Fri Oct 19 2007 David Lutterkort <dlutter@redhat.com> - 1.2.3-3
|
68
|
+
- Fix BR on popt-devel
|
69
|
+
|
70
|
+
* Mon Oct 8 2007 David Lutterkort <dlutter@redhat.com> - 1.2.3-2
|
71
|
+
- Bring in agreement with Fedora guidelines
|
72
|
+
|
58
73
|
* Tue Nov 14 2006 David Lutterkort <dlutter@redhat.com> - 1.2.1-1
|
59
74
|
- Adapted for Fedora
|
60
75
|
|
data/tests/runner.rb
CHANGED
File without changes
|
data/tests/test_db.rb
CHANGED
@@ -3,8 +3,14 @@ require 'fileutils'
|
|
3
3
|
require 'tmpdir'
|
4
4
|
require 'rpm'
|
5
5
|
|
6
|
+
def rpm_version(ver=[])
|
7
|
+
ver = `LANG=C rpm --version| cut -d' ' -f 3`.split(/\./) if ver.empty?
|
8
|
+
return (ver[0].to_i<<16) + (ver[1].to_i<<8) + (ver[2].to_i<<0)
|
9
|
+
end
|
10
|
+
|
6
11
|
class RPM_DB_Tests < Test::Unit::TestCase
|
7
12
|
def setup
|
13
|
+
@version = rpm_version
|
8
14
|
@work_dir = "#{Dir.tmpdir}/.ruby-rpm-test"
|
9
15
|
unless File.directory?(@work_dir) then
|
10
16
|
Dir.mkdir(@work_dir, 0777)
|
@@ -25,7 +31,9 @@ class RPM_DB_Tests < Test::Unit::TestCase
|
|
25
31
|
end # def test_initdb
|
26
32
|
|
27
33
|
def test_rebuild
|
28
|
-
|
34
|
+
# We add the "/" to work around an obscure bug in older
|
35
|
+
# RPM versions
|
36
|
+
RPM::DB.rebuild( @work_dir + "/")
|
29
37
|
assert( File.exist?( "#{@tmppath}/#{RPM['_dbpath']}/Packages" ) )
|
30
38
|
end
|
31
39
|
|
@@ -33,12 +41,18 @@ class RPM_DB_Tests < Test::Unit::TestCase
|
|
33
41
|
assert( @a )
|
34
42
|
end
|
35
43
|
|
36
|
-
def test_root
|
37
|
-
assert_equal( @a.root, @work_dir )
|
44
|
+
def test_root
|
45
|
+
assert_equal( @a.root, @work_dir ) if @version < rpm_version([4,6,0])
|
46
|
+
if @version >= rpm_version([4,6,0])
|
47
|
+
assert_raise(NoMethodError) { @a.root }
|
48
|
+
end
|
38
49
|
end
|
39
50
|
|
40
51
|
def test_home
|
41
|
-
assert_equal( @a.home, RPM['_dbpath'] )
|
52
|
+
assert_equal( @a.home, RPM['_dbpath'] ) if @version < rpm_version([4,6,0])
|
53
|
+
if @version >= rpm_version([4,6,0])
|
54
|
+
assert_raise(NoMethodError) { @a.home }
|
55
|
+
end
|
42
56
|
end
|
43
|
-
|
57
|
+
|
44
58
|
end # class RPM_DB_Tests < Test::Unit::TestCase
|
metadata
CHANGED
@@ -1,33 +1,31 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.2
|
3
|
-
specification_version: 1
|
4
2
|
name: ruby-rpm
|
5
3
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.2.
|
7
|
-
date: 2007-05-07 00:00:00 -07:00
|
8
|
-
summary: Ruby bindings for RPM
|
9
|
-
require_paths:
|
10
|
-
- lib
|
11
|
-
email: ruby-rpm-devel@rubyforge.org
|
12
|
-
homepage: http://rubyforge.org/projects/ruby-rpm/
|
13
|
-
rubyforge_project:
|
14
|
-
description: Provides bindings for accessing RPM packages and databases from Ruby. It includes the low-level C API to talk to rpm as well as Ruby classes to model the various objects that RPM deals with (such as packages, dependencies, and files).
|
15
|
-
autorequire: rpm
|
16
|
-
default_executable:
|
17
|
-
bindir: bin
|
18
|
-
has_rdoc: false
|
19
|
-
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">="
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 1.8.1
|
24
|
-
version:
|
4
|
+
version: 1.2.4
|
25
5
|
platform: ruby
|
26
|
-
signing_key:
|
27
|
-
cert_chain:
|
28
|
-
post_install_message:
|
29
6
|
authors: []
|
30
7
|
|
8
|
+
autorequire: rpm
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-11-10 00:00:00 +01:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: |
|
17
|
+
Provides bindings for accessing RPM packages and databases from Ruby. It
|
18
|
+
includes the low-level C API to talk to rpm as well as Ruby classes to
|
19
|
+
model the various objects that RPM deals with (such as packages,
|
20
|
+
dependencies, and files).
|
21
|
+
|
22
|
+
email: ruby-rpm-devel@rubyforge.org
|
23
|
+
executables: []
|
24
|
+
|
25
|
+
extensions:
|
26
|
+
- ext/rpm/extconf.rb
|
27
|
+
extra_rdoc_files: []
|
28
|
+
|
31
29
|
files:
|
32
30
|
- Rakefile
|
33
31
|
- ChangeLog
|
@@ -37,41 +35,57 @@ files:
|
|
37
35
|
- install.rb
|
38
36
|
- doc/refm.rd.ja
|
39
37
|
- lib/rpm.rb
|
40
|
-
- ext/rpm/
|
41
|
-
- ext/rpm/file.c
|
42
|
-
- ext/rpm/private.h
|
38
|
+
- ext/rpm/rpm.c
|
43
39
|
- ext/rpm/ruby-rpm.h
|
40
|
+
- ext/rpm/source.c
|
44
41
|
- ext/rpm/rpm40_compat.c
|
42
|
+
- ext/rpm/private.h
|
43
|
+
- ext/rpm/rpm40_compat.h
|
44
|
+
- ext/rpm/db.c
|
45
45
|
- ext/rpm/dependency.c
|
46
46
|
- ext/rpm/package.c
|
47
|
-
- ext/rpm/
|
48
|
-
- ext/rpm/
|
49
|
-
- ext/rpm/rpm.c
|
47
|
+
- ext/rpm/extconf.h
|
48
|
+
- ext/rpm/version.c
|
50
49
|
- ext/rpm/spec.c
|
51
|
-
- ext/rpm/
|
50
|
+
- ext/rpm/file.c
|
52
51
|
- ext/rpm/MANIFEST
|
53
52
|
- ext/rpm/extconf.rb
|
54
|
-
- tests/test_file.rb
|
55
53
|
- tests/test_db.rb
|
56
|
-
- tests/test_version.rb
|
57
|
-
- tests/test_rpm.rb
|
58
|
-
- tests/test_dependency.rb
|
59
|
-
- tests/test_source.rb
|
60
54
|
- tests/test_ts.rb
|
55
|
+
- tests/test_dependency.rb
|
61
56
|
- tests/runner.rb
|
62
|
-
-
|
57
|
+
- tests/test_version.rb
|
58
|
+
- tests/test_file.rb
|
59
|
+
- tests/test_source.rb
|
60
|
+
- tests/test_rpm.rb
|
63
61
|
- spec/fedora/ruby-rpm.spec
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
extra_rdoc_files: []
|
62
|
+
has_rdoc: true
|
63
|
+
homepage: http://rubyforge.org/projects/ruby-rpm/
|
64
|
+
licenses: []
|
69
65
|
|
70
|
-
|
66
|
+
post_install_message:
|
67
|
+
rdoc_options: []
|
71
68
|
|
72
|
-
|
73
|
-
-
|
69
|
+
require_paths:
|
70
|
+
- lib
|
71
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.8.1
|
76
|
+
version:
|
77
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: "0"
|
82
|
+
version:
|
74
83
|
requirements: []
|
75
84
|
|
76
|
-
|
77
|
-
|
85
|
+
rubyforge_project:
|
86
|
+
rubygems_version: 1.3.5
|
87
|
+
signing_key:
|
88
|
+
specification_version: 3
|
89
|
+
summary: Ruby bindings for RPM
|
90
|
+
test_files:
|
91
|
+
- tests/runner.rb
|