[Rt-devel] [RFC][PATCH] DBIx-SB tests on other DBs
Ruslan U. Zakirov
Ruslan.Zakirov at miet.ru
Mon May 16 19:24:16 EDT 2005
Heya, guys.
Attach new patch that uses ENV vars to define DB connect options, for
example if you want run mysql tests then you can use:
> SB_TEST_MYSQL="test" SB_MYSQL_USER="root" SB_MYSQL_PASS="" make test
I expect it would be merged before 1.30 because:
1) it has no functionality changes;
2) mysql tests are disabled by default;
3) I'm waiting for some feedback.
--
Regadrds. Ruslan.
Ruslan U. Zakirov wrote:
> Hello.
> Ok, here is what I've done to allow us run SB tests on mysql, postgres
> and other DBs.
>
> All comments are wellcome, but some are required.
> For now I didn't finish several things:
> 1) connect_* functions in utils.pl.
> This functions should connect handle to test DBs of your RDBMS. I wrote
> only simple 'connect_mysql' that connects to DB 'test' with user 'root'
> and empty password. I use it for local testings, but for CPAN we should
> use configurable connect_* functions. Because configuration should be
> asked or entered once across all tests, I think we should use ENV
> variables or write config options into t/ dir. Please, suggest prefered
> way and if you choose ENV then suggest generic naming.
>
> 2) I wrote mysql schemas for current test suite, please, wrote schemas
> for other DBs and send them back with report about test suite success or
> fails.
>
> Wait for your comments. Best regards, Ruslan.
> _______________________________________________
> Rt-devel mailing list
> Rt-devel at lists.bestpractical.com
> http://lists.bestpractical.com/cgi-bin/mailman/listinfo/rt-devel
>
-------------- next part --------------
==== Patch <-> level 1
Source: [No source]
Target: fac90757-c5f0-0310-a953-bfb799f65e4e:/DBIx-SearchBuilder/local:1628
Log:
mysql tests 2
=== SearchBuilder/Handle.pm
==================================================================
--- SearchBuilder/Handle.pm (revision 1628)
+++ SearchBuilder/Handle.pm (patch - level 1)
@@ -85,7 +85,7 @@
DisconnectHandleOnDestroy => undef,
@_);
- my $dsn = $self->DSN;
+ my $dsn = $self->DSN || '';
# Setting this actually breaks old RT versions in subtle ways. So we need to explicitly call it
=== t/01basics.t
==================================================================
--- t/01basics.t (revision 1628)
+++ t/01basics.t (patch - level 1)
@@ -6,7 +6,9 @@
BEGIN { require "t/utils.pl" }
our (@AvailableDrivers);
-my $total = scalar(@AvailableDrivers) * 4;
+use constant TESTS_PER_DRIVER => 4;
+
+my $total = scalar(@AvailableDrivers) * TESTS_PER_DRIVER;
plan tests => $total;
foreach my $d ( @AvailableDrivers ) {
=== t/01records.t
==================================================================
--- t/01records.t (revision 1628)
+++ t/01records.t (patch - level 1)
@@ -6,105 +6,116 @@
use File::Spec;
use Test::More;
BEGIN { require "t/utils.pl" }
+our (@AvailableDrivers);
-eval "use DBD::SQLite";
-if ($@) {
-plan skip_all => "DBD::SQLite required for testing database interaction"
-} else{
-plan tests => 30;
-}
+use constant TESTS_PER_DRIVER => 30;
-my $handle = get_handle('SQLite');
-connect_handle( $handle );
-isa_ok($handle->dbh, 'DBI::db');
+my $total = scalar(@AvailableDrivers) * TESTS_PER_DRIVER;
+plan tests => $total;
-my $ret = $handle->SimpleQuery(TestApp::Address->schema);
-isa_ok($ret,'DBI::st', "Inserted the schema. got a statement handle back");
+foreach my $d ( @AvailableDrivers ) {
+SKIP: {
+ unless( has_schema( 'TestApp::Address', $d ) ) {
+ skip "No schema for '$d' driver", TESTS_PER_DRIVER;
+ }
+ unless( should_test( $d ) ) {
+ skip "ENV is not defined for driver '$d'", TESTS_PER_DRIVER;
+ }
+ my $handle = get_handle( $d );
+ connect_handle( $handle );
+ isa_ok($handle->dbh, 'DBI::db');
-my $rec = TestApp::Address->new($handle);
-isa_ok($rec, 'DBIx::SearchBuilder::Record');
+ my $ret = init_schema( 'TestApp::Address', $handle );
+ isa_ok($ret,'DBI::st', "Inserted the schema. got a statement handle back");
-# _Accessible testings
-is( $rec->_Accessible('id' => 'read'), 1, 'id is accessible for read' );
-is( $rec->_Accessible('id' => 'write'), undef, 'id is not accessible for write' );
-is( $rec->_Accessible('unexpected_field' => 'read'), undef, "field doesn't exist and can't be accessible for read" );
+ my $rec = TestApp::Address->new($handle);
+ isa_ok($rec, 'DBIx::SearchBuilder::Record');
-can_ok($rec,'Create');
+ # _Accessible testings
+ is( $rec->_Accessible('id' => 'read'), 1, 'id is accessible for read' );
+ is( $rec->_Accessible('id' => 'write'), undef, 'id is not accessible for write' );
+ is( $rec->_Accessible('unexpected_field' => 'read'), undef, "field doesn't exist and can't be accessible for read" );
-my ($id) = $rec->Create( Name => 'Jesse', Phone => '617 124 567');
-ok($id,"Created record ". $id);
-ok($rec->Load($id), "Loaded the record");
+ can_ok($rec,'Create');
+ my ($id) = $rec->Create( Name => 'Jesse', Phone => '617 124 567');
+ ok($id,"Created record ". $id);
+ ok($rec->Load($id), "Loaded the record");
-is($rec->id, $id, "The record has its id");
-is ($rec->Name, 'Jesse', "The record's name is Jesse");
-my ($val, $msg) = $rec->SetName('Obra');
-ok($val, $msg) ;
-is($rec->Name, 'Obra', "We did actually change the name");
+ is($rec->id, $id, "The record has its id");
+ is ($rec->Name, 'Jesse', "The record's name is Jesse");
-# Validate immutability of the field id
-($val, $msg) = $rec->Setid( $rec->id + 1 );
-ok(!$val, $msg);
-is($msg, 'Immutable field', 'id is immutable field');
-is($rec->id, $id, "The record still has its id");
+ my ($val, $msg) = $rec->SetName('Obra');
+ ok($val, $msg) ;
+ is($rec->Name, 'Obra', "We did actually change the name");
-# Check some non existant field
-ok( !eval{ $rec->SomeUnexpectedField }, "The record has no 'SomeUnexpectedField'");
-{
- # test produce DBI warning
- local $SIG{__WARN__} = sub {return};
- is( $rec->_Value( 'SomeUnexpectedField' ), undef, "The record has no 'SomeUnexpectedField'");
-}
-($val, $msg) = $rec->SetSomeUnexpectedField( 'foo' );
-ok(!$val, $msg);
-is($msg, 'Nonexistant field?', "Field doesn't exist");
-($val, $msg) = $rec->_Set('SomeUnexpectedField', 'foo');
-ok(!$val, "$msg");
+ # Validate immutability of the field id
+ ($val, $msg) = $rec->Setid( $rec->id + 1 );
+ ok(!$val, $msg);
+ is($msg, 'Immutable field', 'id is immutable field');
+ is($rec->id, $id, "The record still has its id");
+ # Check some non existant field
+ ok( !eval{ $rec->SomeUnexpectedField }, "The record has no 'SomeUnexpectedField'");
+ {
+ # test produce DBI warning
+ local $SIG{__WARN__} = sub {return};
+ is( $rec->_Value( 'SomeUnexpectedField' ), undef, "The record has no 'SomeUnexpectedField'");
+ }
+ ($val, $msg) = $rec->SetSomeUnexpectedField( 'foo' );
+ ok(!$val, $msg);
+ is($msg, 'Nonexistant field?', "Field doesn't exist");
+ ($val, $msg) = $rec->_Set('SomeUnexpectedField', 'foo');
+ ok(!$val, "$msg");
-# Validate truncation on update
-($val,$msg) = $rec->SetName('1234567890123456789012345678901234567890');
+ # Validate truncation on update
-ok($val, $msg) ;
+ ($val,$msg) = $rec->SetName('1234567890123456789012345678901234567890');
-is($rec->Name, '12345678901234', "Truncated on update");
+ ok($val, $msg) ;
+ is($rec->Name, '12345678901234', "Truncated on update");
-# Test unicode truncation:
-my $univalue = "這是個測試";
-($val,$msg) = $rec->SetName($univalue.$univalue);
+ # Test unicode truncation:
+ my $univalue = "這是個測試";
-ok($val, $msg) ;
+ ($val,$msg) = $rec->SetName($univalue.$univalue);
-is($rec->Name, '這是個測');
+ ok($val, $msg) ;
+ is($rec->Name, '這是個測');
-# make sure we do _not_ truncate things which should not be truncated
-($val,$msg) = $rec->SetEmployeeId('1234567890');
-ok($val, $msg) ;
+ # make sure we do _not_ truncate things which should not be truncated
+ ($val,$msg) = $rec->SetEmployeeId('1234567890');
-is($rec->EmployeeId, '1234567890', "Did not truncate id on create");
+ ok($val, $msg) ;
-# make sure we do truncation on create
-my $newrec = TestApp::Address->new($handle);
-my $newid = $newrec->Create( Name => '1234567890123456789012345678901234567890',
- EmployeeId => '1234567890' );
+ is($rec->EmployeeId, '1234567890', "Did not truncate id on create");
-$newrec->Load($newid);
+ # make sure we do truncation on create
+ my $newrec = TestApp::Address->new($handle);
+ my $newid = $newrec->Create( Name => '1234567890123456789012345678901234567890',
+ EmployeeId => '1234567890' );
-ok ($newid, "Created a new record");
-is($newrec->Name, '12345678901234', "Truncated on create");
-is($newrec->EmployeeId, '1234567890', "Did not truncate id on create");
+ $newrec->Load($newid);
+ ok ($newid, "Created a new record");
+ is($newrec->Name, '12345678901234', "Truncated on create");
+ is($newrec->EmployeeId, '1234567890', "Did not truncate id on create");
+}} # SKIP, foreach blocks
+1;
+
+
+
package TestApp::Address;
use base qw/DBIx::SearchBuilder::Record/;
@@ -133,9 +144,20 @@
}
+sub schema_mysql {
+<<EOF;
+CREATE TEMPORARY TABLE Address (
+ id integer AUTO_INCREMENT,
+ Name varchar(36),
+ Phone varchar(18),
+ EmployeeId int(8),
+ PRIMARY KEY (id))
+EOF
-sub schema {
+}
+sub schema_sqlite {
+
<<EOF;
CREATE TABLE Address (
id integer primary key,
=== t/02records_object.t
==================================================================
--- t/02records_object.t (revision 1628)
+++ t/02records_object.t (patch - level 1)
@@ -4,44 +4,54 @@
use strict;
use warnings;
use File::Spec;
+use Test::More;
BEGIN { require "t/utils.pl" }
+our (@AvailableDrivers);
-use Test::More;
-eval "use DBD::SQLite";
-if ($@) {
-plan skip_all => "DBD::SQLite required for testing database interaction"
-} else{
-plan tests => 9;
-}
-my $handle = get_handle('SQLite');
-connect_handle( $handle );
-isa_ok($handle->dbh, 'DBI::db');
+use constant TESTS_PER_DRIVER => 8;
-foreach( @{ TestApp->schema } ) {
- my $ret = $handle->SimpleQuery($_);
+my $total = scalar(@AvailableDrivers) * TESTS_PER_DRIVER;
+plan tests => $total;
+
+foreach my $d ( @AvailableDrivers ) {
+SKIP: {
+ unless( has_schema( 'TestApp', $d ) ) {
+ skip "No schema for '$d' driver", TESTS_PER_DRIVER;
+ }
+ unless( should_test( $d ) ) {
+ skip "ENV is not defined for driver '$d'", TESTS_PER_DRIVER;
+ }
+
+ my $handle = get_handle( $d );
+ connect_handle( $handle );
+ isa_ok($handle->dbh, 'DBI::db');
+
+ my $ret = init_schema( 'TestApp', $handle );
isa_ok($ret,'DBI::st', "Inserted the schema. got a statement handle back");
-}
+ my $emp = TestApp::Employee->new($handle);
+ my $e_id = $emp->Create( Name => 'RUZ' );
+ ok($e_id, "Got an ide for the new emplyee");
+ my $phone = TestApp::Phone->new($handle);
+ isa_ok( $phone, 'TestApp::Phone', "it's atestapp::phone");
+ my $p_id = $phone->Create( Employee => $e_id, Phone => '+7(903)264-03-51');
+ # XXX: test fails if next string is commented
+ is($p_id, 1, "Loaded record $p_id");
+ $phone->Load( $p_id );
-my $emp = TestApp::Employee->new($handle);
-my $e_id = $emp->Create( Name => 'RUZ' );
-ok($e_id, "Got an ide for the new emplyee");
-my $phone = TestApp::Phone->new($handle);
-isa_ok( $phone, 'TestApp::Phone', "it's atestapp::phone");
-my $p_id = $phone->Create( Employee => $e_id, Phone => '+7(903)264-03-51');
-# XXX: test fails if next string is commented
-is($p_id, 1, "Loaded record $p_id");
-$phone->Load( $p_id );
+ my $obj = $phone->EmployeeObj($handle);
+ ok($obj, "Employee #$e_id has phone #$p_id");
+ is($obj->id, $e_id);
+ is($obj->Name, 'RUZ');
-my $obj = $phone->EmployeeObj($handle);
-ok($obj, "Employee #$e_id has phone #$p_id");
-is($obj->id, $e_id);
-is($obj->Name, 'RUZ');
+}} # SKIP, foreach blocks
+1;
+
package TestApp;
-sub schema {
+sub schema_sqlite {
[
q{
CREATE TABLE Employees (
@@ -55,7 +65,21 @@
Phone varchar(18)
) }
]
+}
+sub schema_mysql {
+[ q{
+CREATE TEMPORARY TABLE Employees (
+ id integer AUTO_INCREMENT primary key,
+ Name varchar(36)
+)
+}, q{
+CREATE TEMPORARY TABLE Phones (
+ id integer AUTO_INCREMENT primary key,
+ Employee integer NOT NULL,
+ Phone varchar(18)
+)
+} ]
}
package TestApp::Employee;
=== t/utils.pl
==================================================================
--- t/utils.pl (revision 1628)
+++ t/utils.pl (patch - level 1)
@@ -2,6 +2,14 @@
use strict;
+=head1 VARIABLES
+
+=head2 @SupportedDrivers
+
+Array of all supported DBD drivers.
+
+=cut
+
our @SupportedDrivers = qw(
Informix
mysql
@@ -13,8 +21,24 @@
Sybase
);
+=head2 @AvailableDrivers
+
+Array that lists only drivers from supported list
+that user has installed.
+
+=cut
+
our @AvailableDrivers = grep { eval "require DBD::". $_ } @SupportedDrivers;
+=head1 FUNCTIONS
+
+=head2 get_handle
+
+Returns new DB specific handle. Takes one argument DB C<$type>.
+Other arguments uses to construct handle.
+
+=cut
+
sub get_handle
{
my $type = shift;
@@ -22,19 +46,32 @@
eval "require $class";
die $@ if $@;
my $handle;
- {
-# no strict 'refs';
- $handle = $class->new( @_ );
- }
+ $handle = $class->new( @_ );
return $handle;
}
+=head2 handle_to_driver
+
+Returns driver name which gets from C<$handle> object argument.
+
+=cut
+
+sub handle_to_driver
+{
+ my $driver = ref($_[0]);
+ $driver =~ s/^.*:://;
+ return $driver;
+}
+
+=head2 connect_handle
+
+Connects C<$handle> object to DB.
+
+=cut
+
sub connect_handle
{
- my $class = lc ref($_[0]);
- $class =~ s/^.*:://;
- my $call = "connect_$class";
-
+ my $call = "connect_". lc handle_to_driver( $_[0] );
return unless defined &$call;
goto &$call;
}
@@ -42,8 +79,74 @@
sub connect_sqlite
{
my $handle = shift;
- return $handle->Connect( Driver => 'SQLite', Database => File::Spec->catfile(File::Spec->tmpdir(), "sb-test.$$"));
+ return $handle->Connect(
+ Driver => 'SQLite',
+ Database => File::Spec->catfile(File::Spec->tmpdir(), "sb-test.$$")
+ );
}
+sub connect_mysql
+{
+ my $handle = shift;
+ return $handle->Connect(
+ Driver => 'mysql',
+ Database => $ENV{'SB_TEST_MYSQL'},
+ User => $ENV{'SB_TEST_MYSQL_USER'} || 'root',
+ Pass => $ENV{'SB_TEST_MYSQL_PASS'} || '',
+ );
+}
+=head2 should_test
+
+Checks environment for C<SB_TEST_*> variables.
+Returns true if specified DB back-end should be tested.
+Takes one argument C<$driver> name.
+
+=cut
+
+sub should_test
+{
+ my $driver = shift;
+ return 1 if lc $driver eq 'sqlite';
+ my $env = 'SB_TEST_'. uc $driver;
+ return $ENV{$env};
+}
+
+=head2 had_schema
+
+Returns true if C<$class> has schema for C<$driver>.
+
+=cut
+
+sub has_schema
+{
+ my ($class, $driver) = @_;
+ my $call = $class ."::schema_". lc $driver;
+ return 1 if defined &$call;
+ return 0;
+}
+
+=head2 init_schema
+
+Takes C<$class> and C<$handle> and inits schema by calling
+C<schema_$driver> method of the C<$class>.
+Returns last C<DBI::st> on success or last return value of the
+SimpleQuery method on error.
+
+=cut
+
+sub init_schema
+{
+ my ($class, $handle) = @_;
+ my $call = "schema_". lc handle_to_driver( $handle );
+ my $schema = $class->$call();
+ $schema = ref( $schema )? $schema : [$schema];
+ my $ret;
+ foreach my $query( @$schema ) {
+ $ret = $handle->SimpleQuery( $query );
+ return $ret unless UNIVERSAL::isa( $ret, 'DBI::st' );
+ }
+ return $ret;
+}
+
1;
==== BEGIN SVK PATCH BLOCK ====
Version: svk 1.0_01 (linux)
eJyFV/tT20gS1uWEAWfzWsIlF7LHhJhgWCB6WZYJcSBIfgDhZSBhN8SRpTF2EDaRZFgSs1sjyW/z
TLJ7qexd3S9X9xfsn3dVNzbkKtniclS5KKm/7ulufd09HdIX743R+WCQyntoKh9bnhoZmZNNJdWL
nzx8HqppM6t7fHkNbkHNw+a17JqHy2fkDYilpqyvQTMYpLGycKIsNRU+GuEaNhKymc0YnkDTWNzU
IfTQeWEskB9j8mMsVs3TWJjdhJm4ns2a2DzNMwIWxhsuKVrWgPGGKsaO+RpwxkNzJ3g1rUMFn7fj
odl8DMq6knqYS2sq1JtWTy01lbizlPLmpzi2caLv9MRPUXTD06YV9qOnybQGPczvDr0bkTOqBoc3
N5pe/j+zzInZplTe3NR24ib8wVShZsrNo1gmzyt+OZDwKQzk/DLD0FyAgn5a4OkkfmLYpIdtfLQZ
gkC/XUW/3bhCEHuQINE/6fZ/nyPQv7x72hj3aR6bbp/alhOywMpqQuHlpF/gYIJJMiql8kk1CVla
8GHXToL2fRY0zeTNuxSdkI20YgybzdR+mmj+czTbROOgs7p6Ftz/eUapBpw5hceziRc4W2doCZ8f
0tDKmWnNGN7UPsX+z9RzX0y9r5megKzKrMr6ocz6OMpH8TKHky7wHJVgBYH3+PiT1NuMney4Qbwg
yKvvSdSNvl2b2yasbtShYNqbcsYEi1JsMRafkxbi4kJ0WVrgzvwozVNpWuAEioFKwk/5fTwvQz6g
cEIiycpQDSSSX/Sbb1hQec6vCpzKUDzPBeQEJQRkhfcJMJnw09iyhxf8J47/GvtHzl5BUSJD1Miq
XiLfechO21ULH7ahTMvbGwXyl0Qhplvz6Cq6hJQQoqstv4w788Y7styHXLbbvvyzaYlWO5IsYJHo
mtP2YZhEgaL0oxVDS9akNeg67kUkuo8WrCW7rTBVaEV8yHolWeYTm7Cuox0Jv++ybqIeyy/Zr1zW
qvPMCsScQUKyu8LOisdemypc9jid2Hbgq/p60Pn+eXGOKwhPinPE8+If0fWiItqviLHijwiUglJl
wltKkPX1/vIFFCjzofJPnrKJ316o3JysXmErDPJWIBqsXhArExero1L1ClOdiVevdNb+gkCNxW+J
+doyEq3Vm/WBvrpExOvrot3J702v1sND+98sH6ie/fhUPXz+4MJ07eWfDm6HD1RCPHiwUOtZqLGD
h72o63AeR9J9uLl69Pja0bfqcU/HkYqI0NH2k6PHXceLq8c999+4Y2+/6XyzgoH9b/TIz38mJt/2
oNG3Grr+zot6341hx4R36Ud/7cTQgmj1Yo82JetchXAmfl5zf/i2fPmDUL75IdT2Qdkn5j5ske+z
BfHvPaXzv0pTf3ttk+/HCPTNBz6b04F3bHxLTmuint6CuoEp+XsymllT1hRZk3UwcO+e253M6lBW
UirwAtAPXrtjU9G5Efy/PZfRoGF4417Q1zfY394OemayfR61D6g9g+27ca80s6zCZDrjbr/nbm9P
Z9Jm+6d/u7vgNhhMaFll3XC76fjGjvFSA6+lR3OzC+MLK+NLi7Px6MzEgvRImllsn1uIPpqSVoA3
rWLYmfXSZHuSp4QkJjjrD8hJX5KBDAOTAcXHwaQKE1zgi/Xib9Z5MinIMs9TfqionJ9SFZXlZVmg
EqqMewDv4QT6pF6O2t51WANo4AFx+Tl4UCNrN0uktUh2vifrK6i1dL5A1lyFmIHrpRPXi4rrxW0t
tVShM2+2WLkCaW2XyNIsclkbqP3werNwXFYO18d1p618h0QjRemnj4VTIlEQV820TRYnKq3IH7Je
Stb6E2vbZe1cRXkJS7qsrna7+4YVPG+9cpYaZXObEG1vyJnts81QYbrXAWjIkVqsV3ecrTa7myvc
DhXniXDhKRou3ka9xXlcPltY7Cl9LRVvD5RGpDJ3pZSarExdKp87pd0apl3RtUfcLF9xSDREIH95
uLU2Ha7eLYjV0a/Ku+Xu8r19qrwyW7/WWbm4Wg/erdC2VNOJUnclfSYBz+6Jwmc8bLCvSbz/kq5B
uc8ZZ6SyOU1t8i6TNUGTe5h5H4n3Kd/imENNvp3NNvcuOJNhTX4onOIP4PnIJwI+zCwo+AJQZQM0
xFOZgT7+iwwTGha4gCDTCsfh+ZpIMDIlsNiWQimUwCkUqyoemqZOx3hBfttZcNmBW8RhuBt97amR
toHa+kjUb7moEvGsO8JeRuciUweRtcLUioh2kITM45ksEUXnwrfKk9R5NGu12FePXShWFNFuVbSD
Vgt6Xo7aT/HX9Dik3V+M2JORTQJdRFN/sfQOuyPMYrQTSk3adChVE+07YctttTpLDaVHTtd84UUr
+i5cJNElrFiMX7Sft9kdodR04dklewC1Otv4rO4CRl6zBy7ZhkXa4bnCC+zG7HRhilh3rtodBUKs
fEM8LHRarsLj6VLcFfmxvNESma/Q70TclUXrznJVPZQqNGpBW8s1lxOuAbFCY3CYLZGFmUPJlouR
6gYui1YrajMOaU2E7YeSXAnX1hwMEC1fzI5Z4VIHkopu7Mt0LTVXfHLJiSMMtaLFVcflREhrg0Sr
Nol2sC0nujc6VWoXqylx7zGaKTwr4wRE6oOWy36AJ1p/aP96uN4aqb+cLY6gyP41F/oONUSR0tfF
i/Z6q/3AaUDKbfN7G9Ief8XparU70HTtqRPdvxayY5P7lD1d7BYPW8SDVHR/1BZLO8XwAYjWXxbF
BXvy4NVkvccW6xuHpHPNCh0msHohfBipRw/HS40IDlJz++v40ywe/AE9OgCx8qVWyyDtr3AI4f2g
G8/R0g+oxV6MHntJeyp6fMfCPzt8PIHCx7fwPNbKGInEo1t29HjBIq2sLR4PtznZqaMbKPymVTru
jpbOi29Aq3P1QHozg1P/WjzcQJft89LxNmopPL2fgrJKg+Xxhej4w2kpxrjd47ou74BsEhhAHXa7
7ys500zJJtDShmmAbEbbAUk9u+HOGVAHKdkA6Ua9axpUQ0szE4vR2Rn3ggEycBuID4GxCZV0Mq2A
YbAor0MI8D6R24AZc2I0OOyeNVO4YRjAzBqmnlPw6pCNg8bmAbZTaSWFMeDkfnjfbZhZbK9n2Avw
5HG3e3BLeN0XexhvNJn4o5XY/HTf7lJ8KSYt9O2CfB70NRaNubnxWOy0ibjdEymIGwWAma20ns3g
IQgmRgeCYEvW0/jaqucgSMjK+hDMqCABsSxIawp8CfqwQt8wyO2qcUNJwQ0ZSwzvYD+4D8biwz0j
I1SjH+G1ILGDU7HmnhjdgGYqq+LYNNkQH0ZHRgwTB5IBRk7Bl94tWctBdyy9sanB+RzUdzIA6npW
7/H2PxgB36/q8HQ+g5deMAZe69D0Ls00GmhsfHpkJG3I3sG+3TO7WbMX0bIfJnEnYnmoCn6OCiQZ
JcEEWCaQ5BICZJv7EL60n0xnEza+Kt638kPBIJP3MMzJlrfYXPxGRpYyzaYua718Ht+5N2UzhXdE
HW7hh1wurXoYX/4uDvKHoc/3JNyUZe30ku5h+XxSVgL4uusfUnxJaohiaWpIDvjYoQS+swYCSd4H
OfgfmlnDVg==
==== END SVK PATCH BLOCK ====
More information about the Rt-devel
mailing list