[Rt-commit] rt branch, 4.2/link-asstring-improvements, created. rt-4.1.6-310-g821977a

Kevin Falcone falcone at bestpractical.com
Wed Mar 6 19:29:30 EST 2013


The branch, 4.2/link-asstring-improvements has been created
        at  821977a39691a3e9861b7290cb0cff992541a7fd (commit)

- Log -----------------------------------------------------------------
commit 3ae7e31bab4f1f5451e20db94b5c6389fe1a04ed
Author: Kevin Falcone <falcone at bestpractical.com>
Date:   Tue Mar 5 17:10:14 2013 -0500

    Convert from convoluted code to using AsString
    
    All core objects already handle printing "Ticket 42" or
    http://bestpractical.com by checking locality.  AsString is an immediate
    win over the old behavior of printing (42).

diff --git a/share/html/Elements/RT__Ticket/ColumnMap b/share/html/Elements/RT__Ticket/ColumnMap
index dc6e769..66b5023 100644
--- a/share/html/Elements/RT__Ticket/ColumnMap
+++ b/share/html/Elements/RT__Ticket/ColumnMap
@@ -62,14 +62,13 @@ my $LinkCallback = sub {
     my $type            = $RT::Link::TYPEMAP{$method}{Type};
     my $other_mode      = ($mode eq "Target" ? "Base" : "Target");
     my $mode_uri        = $mode.'URI';
-    my $local_type      = 'Local'.$mode;
 
     return sub {
         map {
             \'<a href="',
             $_->$mode_uri->Resolver->HREF,
             \'">',
-            ( $_->$mode_uri->IsLocal ? $_->$local_type : $_->$mode ),
+            ( $_->$mode_uri->Resolver->AsString ),
             \'</a><br />',
         } @{ $_[0]->Links($other_mode,$type)->ItemsArrayRef }
     }

commit e72d6793aa7f2bfd87f75ef4ec436b43f6577cdf
Author: Kevin Falcone <falcone at bestpractical.com>
Date:   Tue Mar 5 17:09:46 2013 -0500

    Add some AsString sugar
    
    We have a number of proxy methods in URI that just pass to Resolver, add
    AsString to the list.

diff --git a/lib/RT/URI.pm b/lib/RT/URI.pm
index e36826f..32b1927 100644
--- a/lib/RT/URI.pm
+++ b/lib/RT/URI.pm
@@ -285,6 +285,17 @@ sub Resolver {
     return ($self->{'resolver'});
 }
 
+=head2 AsString
+
+Returns a friendly display form of the object if Local, or the full URI
+
+=cut
+
+sub AsString {
+    my $self = shift;
+    return $self->Resolver->AsString;
+}
+
 RT::Base->_ImportOverlays();
 
 1;

commit 6efaeb6357467c5f78a85d61ce0909f4c845b132
Author: Kevin Falcone <falcone at bestpractical.com>
Date:   Wed Mar 6 18:04:44 2013 -0500

    Switch to using the shorter and nicer proxied methods in RT::URI
    
    Now that I added AsString, clean up a bunch of ->Resolver
    There are possibly more candidates

diff --git a/lib/RT/Transaction.pm b/lib/RT/Transaction.pm
index e73a312..13635ec 100644
--- a/lib/RT/Transaction.pm
+++ b/lib/RT/Transaction.pm
@@ -847,7 +847,7 @@ sub _FormatUser {
             if ( $URI->FromURI( $self->NewValue ) ) {
                 $value = [
                     \'<a href="', $URI->AsHREF, \'">',
-                    $URI->Resolver->AsString,
+                    $URI->AsString,
                     \'</a>'
                 ];
             }
@@ -889,7 +889,7 @@ sub _FormatUser {
             if ( $URI->FromURI( $self->OldValue ) ) {
                 $value = [
                     \'<a href="', $URI->AsHREF, \'">',
-                    $URI->Resolver->AsString,
+                    $URI->AsString,
                     \'</a>'
                 ];
             }
diff --git a/share/html/Articles/Article/Elements/EditLinks b/share/html/Articles/Article/Elements/EditLinks
index cf9a27b..24c3e1a 100644
--- a/share/html/Articles/Article/Elements/EditLinks
+++ b/share/html/Articles/Article/Elements/EditLinks
@@ -65,7 +65,7 @@
 <li>
 <input type="checkbox" name="DeleteLink--<%$link->Type%>-<%$link->Target%>" />
 %     if ($link->TargetURI->IsLocal) {
-<a href="<%$member->Resolver->HREF%>"><% loc($member->Object->RecordType) %> <%$member->Object->Id%></a>: 
+<a href="<%$member->AsHREF%>"><% loc($member->Object->RecordType) %> <%$member->Object->Id%></a>: 
 %       if (UNIVERSAL::isa($member->Object, "RT::Article") or UNIVERSAL::can($member->Object, 'Name')) {
 <%$member->Object->Name%>
 %       } elsif (UNIVERSAL::isa($member->Object, "RT::Ticket") or UNIVERSAL::can($member->Object, 'Subject')) {
@@ -73,7 +73,7 @@
 %       }
 </a>
 %     } else {
-<a href="<%$member->Resolver->HREF%>"><%$link->Target%></a>
+<a href="<%$member->AsHREF%>"><%$link->Target%></a>
 %     }
 %   }
 % }
@@ -92,7 +92,7 @@
 <li>
 <input type="checkbox" name="DeleteLink-<%$link->Base%>-<%$link->Type%>-" />
 %     if ($link->BaseURI->IsLocal) {
-<a href="<%$member->Resolver->HREF%>"><% loc($member->Object->RecordType) %> <%$member->Object->Id%>: 
+<a href="<%$member->AsHREF%>"><% loc($member->Object->RecordType) %> <%$member->Object->Id%>: 
 %       if (UNIVERSAL::isa($member->Object, "RT::Article") or UNIVERSAL::can($member->Object, 'Name')) {
 <%$member->Object->Name%>
 %       } elsif (UNIVERSAL::isa($member->Object, "RT::Ticket") or UNIVERSAL::can($member->Object, 'Subject')) {
@@ -100,7 +100,7 @@
 %       }
 </a>
 %     } else {
-<a href="<%$member->Resolver->HREF%>"><%$link->Base%></a>
+<a href="<%$member->AsHREF%>"><%$link->Base%></a>
 %     }
 %   }
 % }
diff --git a/share/html/Articles/Article/Elements/ShowLinks b/share/html/Articles/Article/Elements/ShowLinks
index 12b0b2f..4d5aa30 100644
--- a/share/html/Articles/Article/Elements/ShowLinks
+++ b/share/html/Articles/Article/Elements/ShowLinks
@@ -53,7 +53,7 @@
 % my $member = $link->TargetURI;
 <li>
 % if ($link->TargetURI->IsLocal) {
-<a href="<%$member->Resolver->HREF%>"><% loc($member->Object->RecordType) %> <%$member->Object->Id%>: 
+<a href="<%$member->AsHREF%>"><% loc($member->Object->RecordType) %> <%$member->Object->Id%>: 
 % if (UNIVERSAL::isa($member->Object, "RT::Article") or UNIVERSAL::can($member->Object, 'Name')) {
 <%$member->Object->Name%>
 % } elsif (UNIVERSAL::isa($member->Object, "RT::Ticket") or UNIVERSAL::can($member->Object, 'Subject')) {
@@ -61,7 +61,7 @@
 % }
 </a>
 % } else {
-<a href="<%$member->Resolver->HREF%>"><%$link->Target%></a>
+<a href="<%$member->AsHREF%>"><%$link->Target%></a>
 % }
 </li>
 % }
@@ -74,7 +74,7 @@
 % my $member = $link->BaseURI;
 <li>
 % if ($member->IsLocal) {
-<a href="<%$member->Resolver->HREF%>"><% loc($member->Object->RecordType) %> <%$member->Object->Id%>: 
+<a href="<%$member->AsHREF%>"><% loc($member->Object->RecordType) %> <%$member->Object->Id%>: 
 % if (UNIVERSAL::isa($member->Object, "RT::Article") or UNIVERSAL::can($member->Object, 'Name')) {
 <%$member->Object->Name%>
 % } elsif (UNIVERSAL::isa($member->Object, "RT::Ticket") or UNIVERSAL::can($member->Object, 'Subject')) {
@@ -82,7 +82,7 @@
 % }
 </a>
 % } else {
-<a href="<%$member->Resolver->HREF%>"><%$link->Base%></a>
+<a href="<%$member->AsHREF%>"><%$link->Base%></a>
 % }
 </li>
 % }
diff --git a/share/html/Elements/RT__Ticket/ColumnMap b/share/html/Elements/RT__Ticket/ColumnMap
index 66b5023..31d4d0c 100644
--- a/share/html/Elements/RT__Ticket/ColumnMap
+++ b/share/html/Elements/RT__Ticket/ColumnMap
@@ -66,9 +66,9 @@ my $LinkCallback = sub {
     return sub {
         map {
             \'<a href="',
-            $_->$mode_uri->Resolver->HREF,
+            $_->$mode_uri->AsHREF,
             \'">',
-            ( $_->$mode_uri->Resolver->AsString ),
+            ( $_->$mode_uri->AsString ),
             \'</a><br />',
         } @{ $_[0]->Links($other_mode,$type)->ItemsArrayRef }
     }
diff --git a/share/html/Elements/ShowLink b/share/html/Elements/ShowLink
index 1f8568a..d8be261 100644
--- a/share/html/Elements/ShowLink
+++ b/share/html/Elements/ShowLink
@@ -63,7 +63,7 @@
 <%$URI->Resolver->AsString%>
 % }
 % } else {
-<%$URI->Resolver->AsString%>
+<%$URI->AsString%>
 % }
 </a>
 <%ARGS>
@@ -71,7 +71,7 @@ $URI => undef
 </%ARGS>
 
 <%INIT>
-my $href = $URI->Resolver->HREF;
+my $href = $URI->AsHREF;
 if ( $URI->IsLocal ) {
     my $base = RT->Config->Get('WebBaseURL');
     # URI->rel doesn't contain the leading '/'

commit 5ec0c45a2f6eb1907a29b617e043033927d69171
Author: Kevin Falcone <falcone at bestpractical.com>
Date:   Wed Mar 6 17:20:17 2013 -0500

    Support __Link.{Object}__
    
    This means that __RefersTo.{Article}__ now only prints Articles
    This works for any sort of Local object type, and will implicitly skip
    non local links.

diff --git a/share/html/Elements/RT__Ticket/ColumnMap b/share/html/Elements/RT__Ticket/ColumnMap
index 31d4d0c..eb098fe 100644
--- a/share/html/Elements/RT__Ticket/ColumnMap
+++ b/share/html/Elements/RT__Ticket/ColumnMap
@@ -64,13 +64,20 @@ my $LinkCallback = sub {
     my $mode_uri        = $mode.'URI';
 
     return sub {
+        my $ObjectType = $_[2]||'';
         map {
             \'<a href="',
             $_->$mode_uri->AsHREF,
             \'">',
             ( $_->$mode_uri->AsString ),
             \'</a><br />',
-        } @{ $_[0]->Links($other_mode,$type)->ItemsArrayRef }
+        } # if someone says __RefersTo.{Ticket}__ filter for only local links that are tickets
+          grep {
+                return 1 unless $ObjectType;
+                return ( $_->$mode_uri->IsLocal
+                         && ( $_->$mode_uri->Object->RecordType eq $ObjectType ));
+               }
+          @{ $_[0]->Links($other_mode,$type)->ItemsArrayRef }
     }
 };
 

commit a49f2fc7f15d37c7445936975da20c94d71f4ab7
Author: Kevin Falcone <falcone at bestpractical.com>
Date:   Wed Mar 6 18:16:47 2013 -0500

    Import Scalar::Util::blessed globally
    
    Since mason is all one namespace, we were doing this implicitly in all
    the various places we said use Scalar::Util qw(blessed).  Make it an
    explicit thing by shoving it into lib.

diff --git a/lib/RT/Interface/Web.pm b/lib/RT/Interface/Web.pm
index b2fb18b..fd6e839 100644
--- a/lib/RT/Interface/Web.pm
+++ b/lib/RT/Interface/Web.pm
@@ -1572,6 +1572,8 @@ package HTML::Mason::Commands;
 
 use vars qw/$r $m %session/;
 
+use Scalar::Util qw(blessed);
+
 sub Menu {
     return $HTML::Mason::Commands::m->notes('menu');
 }
diff --git a/share/html/Admin/Elements/EditRights b/share/html/Admin/Elements/EditRights
index 76e9013..b66309b 100644
--- a/share/html/Admin/Elements/EditRights
+++ b/share/html/Admin/Elements/EditRights
@@ -51,8 +51,6 @@ $Principals
 $AddPrincipal => undef
 </%args>
 <%init>
-use Scalar::Util qw(blessed);
-
 # Let callbacks get at principals and context before we do anything with them
 $m->callback( Principals => $Principals, Context => $Context );
 
diff --git a/share/html/Dashboards/Elements/ShowPortlet/dashboard b/share/html/Dashboards/Elements/ShowPortlet/dashboard
index f0af23a..b2eb0a3 100644
--- a/share/html/Dashboards/Elements/ShowPortlet/dashboard
+++ b/share/html/Dashboards/Elements/ShowPortlet/dashboard
@@ -56,7 +56,6 @@ $Depth => 0
 <%init>
 my $current_dashboard;
 
-use Scalar::Util 'blessed';
 if (blessed($Portlet) && $Portlet->isa('RT::Dashboard')) {
     $current_dashboard = $Portlet;
 }
diff --git a/share/html/Elements/Header b/share/html/Elements/Header
index 4589fe6..481b8d1 100644
--- a/share/html/Elements/Header
+++ b/share/html/Elements/Header
@@ -107,8 +107,6 @@
 % }
 <div id="header"><h1><% $Title %></h1></div>
 <%INIT>
-use Scalar::Util qw(blessed);
-
 $r->headers_out->{'Pragma'} = 'no-cache';
 $r->headers_out->{'Cache-control'} = 'no-cache';
 
diff --git a/share/html/Elements/Logo b/share/html/Elements/Logo
index a00f6bd..95dd8c1 100644
--- a/share/html/Elements/Logo
+++ b/share/html/Elements/Logo
@@ -67,7 +67,6 @@ if ( exists $ARGS{'show_name'} ) {
     $ShowName = delete $ARGS{'show_name'};
 }
 
-use Scalar::Util qw(blessed);
 my $user_logo = blessed $RT::System ? $RT::System->FirstAttribute('UserLogo') : undef;
 
 # If we have the attribute, but no content, we don't really have a user logo

commit 3c90d1c4ede5bcae782ea19f2ea2d2c558eeea64
Author: Kevin Falcone <falcone at bestpractical.com>
Date:   Tue Mar 5 19:21:22 2013 -0500

    Stop using UNIVERSAL::isa

diff --git a/share/html/Elements/ShowLink b/share/html/Elements/ShowLink
index d8be261..39f1b30 100644
--- a/share/html/Elements/ShowLink
+++ b/share/html/Elements/ShowLink
@@ -49,7 +49,7 @@
 % if ($URI->IsLocal) {
 % my $member = $URI->Object;
 % my $has_name = UNIVERSAL::can($member, 'Name') || (UNIVERSAL::can($member, '_Accessible') && $member->_Accessible('Name', 'read'));
-% if (UNIVERSAL::isa($member, "RT::Ticket")) {
+% if (blessed($member) && $member->isa("RT::Ticket")) {
 % my $inactive = $member->QueueObj->IsInactiveStatus($member->Status);
 
 <span class="<% $inactive ? 'ticket-inactive' : '' %>">

commit 8ee9185b841a6a13ece13cbb347b0114b2ff64fd
Author: Kevin Falcone <falcone at bestpractical.com>
Date:   Tue Mar 5 19:22:06 2013 -0500

    Stop checking for Name
    
    We can just make AsString smarter and include the Name, rather than
    going through contortions here.

diff --git a/share/html/Elements/ShowLink b/share/html/Elements/ShowLink
index 39f1b30..e32efd2 100644
--- a/share/html/Elements/ShowLink
+++ b/share/html/Elements/ShowLink
@@ -48,7 +48,6 @@
 <a href="<% $href %>">
 % if ($URI->IsLocal) {
 % my $member = $URI->Object;
-% my $has_name = UNIVERSAL::can($member, 'Name') || (UNIVERSAL::can($member, '_Accessible') && $member->_Accessible('Name', 'read'));
 % if (blessed($member) && $member->isa("RT::Ticket")) {
 % my $inactive = $member->QueueObj->IsInactiveStatus($member->Status);
 
@@ -57,8 +56,6 @@
 <%$member->Id%>: (<& /Elements/ShowUser, User => $member->OwnerObj &>) <%$member->Subject || ''%> [<% loc($member->Status) %>]
 </span>
 
-% } elsif ($has_name) {
-<%$URI->Resolver->AsString%>: <%$member->Name%>
 % } else {
 <%$URI->Resolver->AsString%>
 % }

commit 87625b25c0d0a120ef942306fa9668bdd8e1f881
Author: Kevin Falcone <falcone at bestpractical.com>
Date:   Tue Mar 5 19:22:44 2013 -0500

    We don't really care if this is local or not
    
    All the core AsString methods already handle Local vs non-local so just
    let that code make the decision about whether to return "Foo #3" or
    http://example.com.

diff --git a/share/html/Elements/ShowLink b/share/html/Elements/ShowLink
index e32efd2..9593230 100644
--- a/share/html/Elements/ShowLink
+++ b/share/html/Elements/ShowLink
@@ -46,7 +46,6 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <a href="<% $href %>">
-% if ($URI->IsLocal) {
 % my $member = $URI->Object;
 % if (blessed($member) && $member->isa("RT::Ticket")) {
 % my $inactive = $member->QueueObj->IsInactiveStatus($member->Status);
@@ -57,9 +56,6 @@
 </span>
 
 % } else {
-<%$URI->Resolver->AsString%>
-% }
-% } else {
 <%$URI->AsString%>
 % }
 </a>

commit 8d7d378fc20e153c6206e5a997752023bdf3aac0
Author: Kevin Falcone <falcone at bestpractical.com>
Date:   Tue Mar 5 19:40:13 2013 -0500

    AsString on Tickets and Articles now includes the Name
    
    This allows us to remove the ugly code in ShowLink and make it ugly in
    here instead.
    
    This means that Formats which say __RefersTo__ or __HasMember__ will
    now say "ticket #42: Ticket Subject" rather than the current state of
    the world where that renders as "ticket #42" which is not helpful.
    
    The code in rt.pm's AsString is ugly because it assumes that you might
    use this on some non-RT::Ticket object.  That never really happens, but
    all of this code pretends it might happen so I kept up the illusion.

diff --git a/lib/RT/URI/fsck_com_article.pm b/lib/RT/URI/fsck_com_article.pm
index 8d12a5d..19e913b 100644
--- a/lib/RT/URI/fsck_com_article.pm
+++ b/lib/RT/URI/fsck_com_article.pm
@@ -200,9 +200,12 @@ Return "Article 23"
 
 sub AsString {
     my $self = shift;
-    if ($self->IsLocal && $self->Object) {
-    return $self->loc('Article [_1]', $self->Object->id);
-
+    if ($self->IsLocal && ( my $object = $self->Object )) {
+        if ( $object->Name ) {
+            return $self->loc('Article #[_1]: [_2]', $object->id, $object->Name);
+        } else {
+            return $self->loc('Article #[_1]', $object->id);
+        }
     } else {
         return $self->SUPER::AsString(@_);
     }
diff --git a/lib/RT/URI/fsck_com_rt.pm b/lib/RT/URI/fsck_com_rt.pm
index 34249d0..4772959 100644
--- a/lib/RT/URI/fsck_com_rt.pm
+++ b/lib/RT/URI/fsck_com_rt.pm
@@ -215,8 +215,18 @@ Returns either a localized string 'ticket #23' or the full URI if the object is
 
 sub AsString {
     my $self = shift;
-    if ($self->IsLocal && $self->Object) {
-        return $self->loc("[_1] #[_2]", $self->ObjectType, $self->Object->Id);
+    if ($self->IsLocal && ( my $object = $self->Object )) {
+        my $name = "";
+        if ($object->isa('RT::Ticket')) {
+            $name = $object->Subject||'';
+        } elsif ( $object->_Accessible('Name', 'read') ) {
+            $name = $object->Name||'';
+        }
+        if ( $name ) {
+            return $self->loc("[_1] #[_2]: [_3]", $self->ObjectType, $object->Id, $name);
+        } else {
+            return $self->loc("[_1] #[_2]", $self->ObjectType, $object->Id);
+        }
     }
     else {
         return $self->URI;

commit 23484832380bbb2304524f47ba603eb7e5400786
Author: Kevin Falcone <falcone at bestpractical.com>
Date:   Tue Mar 5 20:21:34 2013 -0500

    Render as Ticket #42 instead of ticket #42
    
    It looks really odd that we say 'ticket' but every other link type is
    ucfirsted.  However, we rely on that hardcoded lowercase 'ticket'
    (hardcoded in ObjectType) in HREF and other link building code.

diff --git a/lib/RT/URI/fsck_com_rt.pm b/lib/RT/URI/fsck_com_rt.pm
index 4772959..c1df39f 100644
--- a/lib/RT/URI/fsck_com_rt.pm
+++ b/lib/RT/URI/fsck_com_rt.pm
@@ -222,10 +222,14 @@ sub AsString {
         } elsif ( $object->_Accessible('Name', 'read') ) {
             $name = $object->Name||'';
         }
+
+        # awful historical baggage, we rely on the lowercase ticket in a number of places
+        my $object_type = ($self->ObjectType eq 'ticket' ? 'Ticket' : $self->ObjectType);
+
         if ( $name ) {
-            return $self->loc("[_1] #[_2]: [_3]", $self->ObjectType, $object->Id, $name);
+            return $self->loc("[_1] #[_2]: [_3]", $object_type, $object->Id, $name);
         } else {
-            return $self->loc("[_1] #[_2]", $self->ObjectType, $object->Id);
+            return $self->loc("[_1] #[_2]", $object_type, $object->Id);
         }
     }
     else {

commit 821977a39691a3e9861b7290cb0cff992541a7fd
Author: Kevin Falcone <falcone at bestpractical.com>
Date:   Tue Mar 5 20:10:37 2013 -0500

    Fix up failing tests
    
    Article links now contain #
    Merge and other links in ticket history contain subjects
    ticket 33 is now Ticket 33

diff --git a/t/web/articles-links.t b/t/web/articles-links.t
index 713dc05..40996e3 100644
--- a/t/web/articles-links.t
+++ b/t/web/articles-links.t
@@ -44,7 +44,7 @@ $m->click('SubmitTicket');
 
 $m->follow_link_ok({text => 'Links'});
 
-$m->text_contains('Article ' . $article->id . ': instance of ticket #17421', 'Article appears with its name in the links table');
+$m->text_contains('Article #' . $article->id . ': instance of ticket #17421', 'Article appears with its name in the links table');
 
 my $refers_to = $ticket->RefersTo;
 is($refers_to->Count, 1, 'the ticket has a refers-to link');
diff --git a/t/web/command_line.t b/t/web/command_line.t
index c49f6be..4ffe311 100644
--- a/t/web/command_line.t
+++ b/t/web/command_line.t
@@ -401,9 +401,9 @@ expect_send("merge $merge_ticket_B $merge_ticket_A", 'Merging the tickets...');
 expect_like(qr/Merge completed/, 'Merged the tickets');
 
 expect_send("show ticket/$merge_ticket_A/history", 'Checking merge on first ticket');
-expect_like(qr/Merged into ticket #$merge_ticket_A by root/, 'Merge recorded in first ticket');
+expect_like(qr/Merged into Ticket #$merge_ticket_A: CLIMergeTest1-$$ by root/, 'Merge recorded in first ticket');
 expect_send("show ticket/$merge_ticket_B/history", 'Checking merge on second ticket');
-expect_like(qr/Merged into ticket #$merge_ticket_A by root/, 'Merge recorded in second ticket');
+expect_like(qr/Merged into Ticket #$merge_ticket_A: CLIMergeTest1-$$ by root/, 'Merge recorded in second ticket');
 
 {
     # create a user; give them privileges to take and steal
diff --git a/t/web/ticket_links.t b/t/web/ticket_links.t
index d739a85..994630e 100644
--- a/t/web/ticket_links.t
+++ b/t/web/ticket_links.t
@@ -165,7 +165,7 @@ for my $type ( "DependsOn", "MemberOf", "RefersTo" ) {
             $m->content_lacks('hello test reminder subject');
             if ($type eq 'RefersTo') {
                 $m->text_contains("$baseurl/test_ticket_reference");
-                $m->text_contains("Article " . $article->Id . ': test article');
+                $m->text_contains("Article #" . $article->Id . ': test article');
             }
         }
     }

-----------------------------------------------------------------------


More information about the Rt-commit mailing list