ruby-rpm 1.2.3 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|