[Bps-public-commit] RT-Extension-CommandByMail branch add-custom-role-command created. 3.01-4-ga1b4fb8

BPS Git Server git at git.bestpractical.com
Fri Dec 22 20:01:15 UTC 2023


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "RT-Extension-CommandByMail".

The branch, add-custom-role-command has been created
        at  a1b4fb8566a05696ed647adf84d5c07a73ed5bfb (commit)

- Log -----------------------------------------------------------------
commit a1b4fb8566a05696ed647adf84d5c07a73ed5bfb
Author: Ronaldo Richieri <ronaldo at bestpractical.com>
Date:   Fri Dec 22 16:58:35 2023 -0300

    Add full group support to Watchers commands
    
    Previously, the Watchers commands such as AddRequestor, DelCc, etc. would
    only work mainly with users.
    
    We now add full group support to these commands when updating the ticket.

diff --git a/lib/RT/Extension/CommandByMail.pm b/lib/RT/Extension/CommandByMail.pm
index 9386b51..a1027d2 100644
--- a/lib/RT/Extension/CommandByMail.pm
+++ b/lib/RT/Extension/CommandByMail.pm
@@ -484,23 +484,66 @@ sub ProcessCommands {
             $results{ $attribute }->{value} = $cmds{ lc $attribute };
         }
 
+
+        # Parses core WATCHERS and Custom Roles related commands
+        # First, add custom roles from this queue to the list of
+        # attributes we are going to parse
+        $custom_roles->LimitToObjectId( $queue->id );
+        my %custom_role_grouptype_to_name;
+        while ( my $custom_role = $custom_roles->Next ) {
+            $custom_role_grouptype_to_name{ $custom_role->GroupType }
+                = $custom_role->Name;
+            push @WATCHER_ATTRIBUTES, $custom_role->GroupType;
+        }
+        # Then, parse the commands
         foreach my $type ( @WATCHER_ATTRIBUTES ) {
-            my %tmp = _ParseAdditiveCommand( \%cmds, 1, $type );
+            my $command_suffix = $type;
+            $command_suffix = "CustomRole{". $custom_role_grouptype_to_name{ $type } ."}"
+                if $type =~ /^RT::CustomRole-/;
+            my %tmp = _ParseAdditiveCommand( \%cmds, 1, $command_suffix );
             next unless keys %tmp;
 
-            $tmp{'Default'} = [ do {
-                my $method = $type;
-                $method .= 's' if $type eq 'Requestor';
-                $args{'Ticket'}->$method->MemberEmailAddresses;
-            } ];
+            # Convert values to ID so we can better compare with the existing
+            # values when we are updating
+            # %tmp can be originally something like
+            #   ( 'Add' => [ 'user1 at example.com', 'group:group1', 'nonexistantuser at example.com' ] )
+            # after _ParseAdditiveCommand, found objects will be converted to
+            # PrincipalId's, so it will be turned into something like the following:
+            #   ( 'Add' => [ 1, 2, 'nonexistantuser at example' ] )
+            _ReplaceUserAndGroupById( \%tmp );
+
+            my $role_group;
+            if ( $type eq 'Requestor' )
+            {
+                $role_group = $ticket_as_user->Requestors;
+            }
+            elsif ( $type =~ /^RT::CustomRole-/ )
+            {
+                $role_group = $ticket_as_user->RoleGroup($type);
+            }
+            else
+            {
+                # AdminCc, Cc
+                $role_group = $ticket_as_user->$type;
+            }
+
+            my $members = $role_group->MembersObj( Recursively => 0 );
+
+            my @res;
+            while ( my $member = $members->Next ) {
+                push @res, $member->MemberId;
+            }
+
+            $tmp{'Default'} = [ @res ];
             my ($add, $del) = _CompileAdditiveForUpdate( %tmp );
+
             foreach my $text ( @$del ) {
-                my $user = RT::User->new($RT::SystemUser);
-                $user->LoadByEmail($text) if $text =~ /\@/;
-                $user->Load($text) unless $user->id;
+                # if we are removing a watcher, it is already has a user
+                # in the system, so emails will not be useful here
+                next if $text =~ /\@/;
                 my ( $val, $msg ) = $ticket_as_user->DeleteWatcher(
                     Type  => $type,
-                    PrincipalId => $user->PrincipalId,
+                    PrincipalId => $text,
                 );
                 push @{ $results{ 'Del'. $type } }, {
                     value   => $text,
@@ -509,15 +552,9 @@ sub ProcessCommands {
                 };
             }
             foreach my $text ( @$add ) {
-                my $user = RT::User->new($RT::SystemUser);
-                $user->LoadByEmail($text) if $text =~ /\@/;
-                $user->Load($text) unless $user->id;
                 my ( $val, $msg ) = $ticket_as_user->AddWatcher(
                     Type  => $type,
-                    $user->id
-                        ? (PrincipalId => $user->PrincipalId)
-                        : (Email => $text)
-                    ,
+                    $text =~ /\D/ ? (Email => $text) : (PrincipalId => $text),
                 );
                 push @{ $results{ 'Add'. $type } }, {
                     value   => $text,
@@ -642,59 +679,6 @@ sub ProcessCommands {
             }
         }
 
-        $custom_roles->LimitToObjectId( $queue->id );
-        while ( my $custom_role = $custom_roles->Next ) {
-            my %tmp = _ParseAdditiveCommand( \%cmds, 0, "CustomRole{". $custom_role->Name ."}" );
-            next unless keys %tmp;
-
-            # Convert values to ID so we can better compare with the existing
-            # values when we are updating
-            # %tmp can be originally something like
-            #   ( 'Add' => [ 'user1 at example.com', 'group:group1', 'nonexistantuser at example.com' ] )
-            # after _ParseAdditiveCommand, found objects will be converted to
-            # PrincipalId's, so it will be turned into something like the following:
-            #   ( 'Add' => [ 1, 2, 'nonexistantuser at example' ] )
-            _ReplaceUserAndGroupById( \%tmp );
-
-            my $role_group = $ticket_as_user->RoleGroup($custom_role->GroupType);
-            my $custom_role_members = $role_group->MembersObj( Recursively => 0 );
-
-            my @res;
-            while ( my $member = $custom_role_members->Next ) {
-                push @res, $member->MemberId;
-            }
-
-            $tmp{'Default'} = [ @res ];
-            my ($add, $del) = _CompileAdditiveForUpdate( %tmp );
-
-            foreach my $text ( @$del ) {
-                # if we are removing a watcher, it is already has a user
-                # in the system, so emails will not be useful here
-                next if $text =~ /\@/;
-                my ( $val, $msg ) = $ticket_as_user->DeleteWatcher(
-                    Type  => $custom_role->GroupType,
-                    PrincipalId => $text,
-                );
-                push @{ $results{ 'Del'. "CustomRole{". $custom_role->Name ."}" } }, {
-                    value   => $text,
-                    result  => $val,
-                    message => $msg
-                };
-            }
-            foreach my $text ( @$add ) {
-                my ( $val, $msg ) = $ticket_as_user->AddWatcher(
-                    Type  => $custom_role->GroupType,
-                    $text =~ /\D/ ? (Email => $text) : (PrincipalId => $text),
-                );
-                push @{ $results{ 'Add'. "CustomRole{". $custom_role->Name ."}" } }, {
-                    value   => $text,
-                    result  => $val,
-                    message => $msg
-                };
-
-            }
-        }
-
         foreach my $attribute (grep $_ eq 'Status', @REGULAR_ATTRIBUTES) {
             next unless defined $cmds{ lc $attribute };
             next if $ticket_as_user->$attribute() eq $cmds{ lc $attribute };

commit 0a87310fbb1849104d0b7bce0b43168e7d76ea82
Author: Ronaldo Richieri <ronaldo at bestpractical.com>
Date:   Fri Dec 22 16:58:28 2023 -0300

    Update POD with Custom Role support

diff --git a/META.yml b/META.yml
index e97b2dd..9913807 100644
--- a/META.yml
+++ b/META.yml
@@ -31,4 +31,5 @@ resources:
   repository: https://github.com/bestpractical/rt-extension-commandbymail
 version: '3.01'
 x_module_install_rtx_version: '0.43'
-x_requires_rt: 4.0.0
+x_requires_rt: 5.0.4
+x_rt_too_new: 6.2.0
diff --git a/README b/README
index 9d178f3..7f2bb21 100644
--- a/README
+++ b/README
@@ -2,7 +2,7 @@ NAME
     RT::Extension::CommandByMail - Change ticket metadata via email
 
 RT VERSION
-    Works with RT 4.0, 4.2, 4.4, 5.0
+    Works with RT 5.0.4 and above.
 
 SYNOPSIS
         (Send email with content that looks like the following.)
@@ -169,6 +169,20 @@ DESCRIPTION
         AddAdminCc: <address> Add new AdminCc watcher using the email address
         DelAdminCc: <address> Remove email address as AdminCc watcher
 
+   Custom Roles
+    Manage custom roles of the ticket. This commands can be used several
+    times and/or with Add and Del prefixes. If you have a Custom Role called
+    Customer for example, you can pass the command CustomRole.{Customer} to
+    set the members of that role. You can pass either a username or an email
+    address. For groups, you must prefix the group name with group:. For
+    example, CustomRole.{Customer}: group:MyGroupname.
+
+            CustomRole.{Customer}: set the members of the Customer Custom Role
+            AddCustomRole.{Customer}: add members to the Customer Custom Role
+            DelCustomRole.{Customer}: remove members from the Customer Custom Role
+
+    Replace Customer with the name of your Custom Role.
+
    Links
     Manage links. These commands are also could be used several times in one
     message.
diff --git a/lib/RT/Extension/CommandByMail.pm b/lib/RT/Extension/CommandByMail.pm
index 7dbac68..9386b51 100644
--- a/lib/RT/Extension/CommandByMail.pm
+++ b/lib/RT/Extension/CommandByMail.pm
@@ -19,7 +19,7 @@ RT::Extension::CommandByMail - Change ticket metadata via email
 
 =head1 RT VERSION
 
-Works with RT 4.0, 4.2, 4.4, 5.0
+Works with RT 5.0.4 and above.
 
 =head1 SYNOPSIS
 
@@ -219,6 +219,22 @@ to the current list.
     AddAdminCc: <address> Add new AdminCc watcher using the email address
     DelAdminCc: <address> Remove email address as AdminCc watcher
 
+=head3 Custom Roles
+
+Manage custom roles of the ticket.
+This commands can be used several times and/or with C<Add> and C<Del>
+prefixes. If you have a Custom Role called C<Customer> for example, you can
+pass the command C<CustomRole.{Customer}> to set the members of that role.
+You can pass either a username or an email address.
+For groups, you must prefix the group name with C<group:>. For example,
+C<CustomRole.{Customer}: group:MyGroupname>.
+
+        CustomRole.{Customer}: set the members of the Customer Custom Role
+        AddCustomRole.{Customer}: add members to the Customer Custom Role
+        DelCustomRole.{Customer}: remove members from the Customer Custom Role
+
+Replace C<Customer> with the name of your Custom Role.
+
 =head3 Links
 
 Manage links. These commands are also could be used several times in one

commit 6b3c85c32ab461b12078f0988cdea8292011f22e
Author: Ronaldo Richieri <ronaldo at bestpractical.com>
Date:   Fri Dec 22 10:15:12 2023 -0300

    Add Custom Role update support
    
    Add new commands that allows do update ticket custom roles:
    - CustomRole
    - AddCustomRole
    - DelCustomRole
    
    Also update minimal version of RT to 5.0.4 since it's required for
    one of the new code blocks.

diff --git a/Makefile.PL b/Makefile.PL
index 8bd1a56..370e8e9 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -31,5 +31,8 @@ no_index package => 'RT::Extension::CommandByMail::Test';
 
 author_tests('xt');
 
+requires_rt '5.0.4';
+rt_too_new '6.2.0';
+
 sign;
 WriteAll();
diff --git a/lib/RT/Extension/CommandByMail.pm b/lib/RT/Extension/CommandByMail.pm
index 88111f5..7dbac68 100644
--- a/lib/RT/Extension/CommandByMail.pm
+++ b/lib/RT/Extension/CommandByMail.pm
@@ -420,6 +420,12 @@ sub ProcessCommands {
 
     my $transaction;
 
+    # Prepare Custom Roles. We will restrict also later to the ticket
+    # queue or to the creation queue according to the operation we are
+    # doing (create / update)
+    my $custom_roles = RT::CustomRoles->new( $args{'CurrentUser'} );
+    $custom_roles->LimitToLookupType( 'RT::Queue-RT::Ticket' );
+
     # If we're updating.
     if ( $args{'Ticket'}->id ) {
         $ticket_as_user->Load( $args{'Ticket'}->id );
@@ -620,6 +626,59 @@ sub ProcessCommands {
             }
         }
 
+        $custom_roles->LimitToObjectId( $queue->id );
+        while ( my $custom_role = $custom_roles->Next ) {
+            my %tmp = _ParseAdditiveCommand( \%cmds, 0, "CustomRole{". $custom_role->Name ."}" );
+            next unless keys %tmp;
+
+            # Convert values to ID so we can better compare with the existing
+            # values when we are updating
+            # %tmp can be originally something like
+            #   ( 'Add' => [ 'user1 at example.com', 'group:group1', 'nonexistantuser at example.com' ] )
+            # after _ParseAdditiveCommand, found objects will be converted to
+            # PrincipalId's, so it will be turned into something like the following:
+            #   ( 'Add' => [ 1, 2, 'nonexistantuser at example' ] )
+            _ReplaceUserAndGroupById( \%tmp );
+
+            my $role_group = $ticket_as_user->RoleGroup($custom_role->GroupType);
+            my $custom_role_members = $role_group->MembersObj( Recursively => 0 );
+
+            my @res;
+            while ( my $member = $custom_role_members->Next ) {
+                push @res, $member->MemberId;
+            }
+
+            $tmp{'Default'} = [ @res ];
+            my ($add, $del) = _CompileAdditiveForUpdate( %tmp );
+
+            foreach my $text ( @$del ) {
+                # if we are removing a watcher, it is already has a user
+                # in the system, so emails will not be useful here
+                next if $text =~ /\@/;
+                my ( $val, $msg ) = $ticket_as_user->DeleteWatcher(
+                    Type  => $custom_role->GroupType,
+                    PrincipalId => $text,
+                );
+                push @{ $results{ 'Del'. "CustomRole{". $custom_role->Name ."}" } }, {
+                    value   => $text,
+                    result  => $val,
+                    message => $msg
+                };
+            }
+            foreach my $text ( @$add ) {
+                my ( $val, $msg ) = $ticket_as_user->AddWatcher(
+                    Type  => $custom_role->GroupType,
+                    $text =~ /\D/ ? (Email => $text) : (PrincipalId => $text),
+                );
+                push @{ $results{ 'Add'. "CustomRole{". $custom_role->Name ."}" } }, {
+                    value   => $text,
+                    result  => $val,
+                    message => $msg
+                };
+
+            }
+        }
+
         foreach my $attribute (grep $_ eq 'Status', @REGULAR_ATTRIBUTES) {
             next unless defined $cmds{ lc $attribute };
             next if $ticket_as_user->$attribute() eq $cmds{ lc $attribute };
@@ -681,6 +740,14 @@ sub ProcessCommands {
             $create_args{ 'CustomField-' . $cf->id } = [ _CompileAdditiveForCreate(%tmp) ];
         }
 
+        # Canonicalize custom roles
+        $custom_roles->LimitToObjectId( $queue->id );
+        while ( my $custom_role = $custom_roles->Next ) {
+            my %tmp = _ParseAdditiveCommand( \%cmds, 0, "CustomRole{". $custom_role->Name ."}" );
+            next unless keys %tmp;
+            $create_args{ $custom_role->GroupType } = [ _CompileAdditiveForCreate(%tmp) ];
+        }
+
         # Canonicalize watchers
         # First of all fetch default values
         foreach my $type ( @WATCHER_ATTRIBUTES ) {
@@ -771,6 +838,48 @@ sub ProcessCommands {
              Transaction => $transaction };
 }
 
+sub _ReplaceUserAndGroupById {
+    my $cmds = shift;
+
+    foreach my $key (keys %$cmds) {
+        my @values = @{ $cmds->{$key} };
+        next unless @values;
+
+        my @new_values;
+        # Check each value and see if it can be a user or a group
+        foreach my $value (@values) {
+            if ($value =~ /^group\:(.*)/) {
+                my $group_name = $1;
+                $group_name =~ s/^\s+|\s+$//g;
+
+                my $group = RT::Group->new(RT->SystemUser);
+                $group->LoadUserDefinedGroup($group_name);
+                if ($group->id) {
+                    push @new_values, $group->id;
+                    next;
+                } else {
+                    RT->Logger->error("Group '$1' not found");
+                    next;
+                }
+            }
+            my $user = RT::User->new(RT->SystemUser);
+            $user->LoadByEmail($value) if $value =~ /\@/;
+            $user->Load($value) unless $user->id;
+            if ($user->id) {
+                push @new_values, $user->id;
+                next;
+            } else {
+                next unless $value =~ /\@/;
+                RT->Logger->warning("User '$value' not found");
+            }
+            # If no user or group found, keep the original value in case
+            # it contains an email address
+            push @new_values, $value;
+        }
+        $cmds->{$key} = \@new_values;
+    }
+}
+
 sub _ParseAdditiveCommand {
     my ($cmds, $plural_forms, $base) = @_;
     my (%res);
@@ -871,6 +980,10 @@ sub _CanonicalizeCommand {
     # CustomField commands
     $key =~ s/^(add|del|)c(?:ustom)?-?f(?:ield)?\.?[({\[](.*)[)}\]]$/$1customfield{$2}/i;
     $key =~ s/^(?:transaction|txn)c(?:ustom)?-?f(?:ield)?\.?[({\[](.*)[)}\]]$/transactioncustomfield{$1}/i;
+
+    # CustomRole commands
+    $key =~ s/^(add|del|)c(?:ustom)?-?R(?:ole)?\.?[({\[](.*)[)}\]]$/$1customrole{$2}/i;
+
     return $key;
 }
 
@@ -878,6 +991,7 @@ sub _CheckCommand {
     my ($cmd, $val) = (lc shift, shift);
     return 1 if $cmd =~ /^(add|del|)customfield\{.*\}$/i;
     return 1 if $cmd =~ /^transactioncustomfield\{.*\}$/i;
+    return 1 if $cmd =~ /^(add|del|)customrole\{.*\}$/i;
     if ( grep $cmd eq lc $_, @REGULAR_ATTRIBUTES, @TIME_ATTRIBUTES, @DATE_ATTRIBUTES ) {
         return 1 unless ref $val;
         return (0, "Command '$cmd' doesn't support multiple values");

commit e9a90c41f8d4142ea4abdc0700c381aad9d64b4f
Author: Ronaldo Richieri <ronaldo at bestpractical.com>
Date:   Thu Dec 21 15:13:04 2023 -0300

    Update Module::Install

diff --git a/META.yml b/META.yml
index db25655..e97b2dd 100644
--- a/META.yml
+++ b/META.yml
@@ -10,7 +10,7 @@ configure_requires:
   ExtUtils::MakeMaker: 6.59
 distribution_type: module
 dynamic_config: 1
-generated_by: 'Module::Install version 1.19'
+generated_by: 'Module::Install version 1.21'
 license: gpl
 meta-spec:
   url: http://module-build.sourceforge.net/META-spec-v1.4.html
@@ -30,5 +30,5 @@ resources:
   license: http://opensource.org/licenses/gpl-license.php
   repository: https://github.com/bestpractical/rt-extension-commandbymail
 version: '3.01'
-x_module_install_rtx_version: '0.42'
+x_module_install_rtx_version: '0.43'
 x_requires_rt: 4.0.0
diff --git a/inc/Module/AutoInstall.pm b/inc/Module/AutoInstall.pm
index 8852e0b..b977d4d 100644
--- a/inc/Module/AutoInstall.pm
+++ b/inc/Module/AutoInstall.pm
@@ -8,7 +8,7 @@ use ExtUtils::MakeMaker ();
 
 use vars qw{$VERSION};
 BEGIN {
-	$VERSION = '1.19';
+	$VERSION = '1.21';
 }
 
 # special map on pre-defined feature sets
diff --git a/inc/Module/Install.pm b/inc/Module/Install.pm
index 7ba98c2..3dd721b 100644
--- a/inc/Module/Install.pm
+++ b/inc/Module/Install.pm
@@ -31,7 +31,7 @@ BEGIN {
 	# This is not enforced yet, but will be some time in the next few
 	# releases once we can make sure it won't clash with custom
 	# Module::Install extensions.
-	$VERSION = '1.19';
+	$VERSION = '1.21';
 
 	# Storage for the pseudo-singleton
 	$MAIN    = undef;
diff --git a/inc/Module/Install/AutoInstall.pm b/inc/Module/Install/AutoInstall.pm
index 0e3dada..b771ef6 100644
--- a/inc/Module/Install/AutoInstall.pm
+++ b/inc/Module/Install/AutoInstall.pm
@@ -6,7 +6,7 @@ use Module::Install::Base ();
 
 use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-	$VERSION = '1.19';
+	$VERSION = '1.21';
 	@ISA     = 'Module::Install::Base';
 	$ISCORE  = 1;
 }
diff --git a/inc/Module/Install/Base.pm b/inc/Module/Install/Base.pm
index 9fa42c2..67ce900 100644
--- a/inc/Module/Install/Base.pm
+++ b/inc/Module/Install/Base.pm
@@ -4,7 +4,7 @@ package Module::Install::Base;
 use strict 'vars';
 use vars qw{$VERSION};
 BEGIN {
-	$VERSION = '1.19';
+	$VERSION = '1.21';
 }
 
 # Suspend handler for "redefined" warnings
diff --git a/inc/Module/Install/Can.pm b/inc/Module/Install/Can.pm
index d65c753..93fc4f9 100644
--- a/inc/Module/Install/Can.pm
+++ b/inc/Module/Install/Can.pm
@@ -8,7 +8,7 @@ use Module::Install::Base ();
 
 use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-	$VERSION = '1.19';
+	$VERSION = '1.21';
 	@ISA     = 'Module::Install::Base';
 	$ISCORE  = 1;
 }
diff --git a/inc/Module/Install/Fetch.pm b/inc/Module/Install/Fetch.pm
index 3072b08..3c9390a 100644
--- a/inc/Module/Install/Fetch.pm
+++ b/inc/Module/Install/Fetch.pm
@@ -6,7 +6,7 @@ use Module::Install::Base ();
 
 use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-	$VERSION = '1.19';
+	$VERSION = '1.21';
 	@ISA     = 'Module::Install::Base';
 	$ISCORE  = 1;
 }
diff --git a/inc/Module/Install/Include.pm b/inc/Module/Install/Include.pm
index 13fdcd0..b9b926f 100644
--- a/inc/Module/Install/Include.pm
+++ b/inc/Module/Install/Include.pm
@@ -6,7 +6,7 @@ use Module::Install::Base ();
 
 use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-	$VERSION = '1.19';
+	$VERSION = '1.21';
 	@ISA     = 'Module::Install::Base';
 	$ISCORE  = 1;
 }
diff --git a/inc/Module/Install/Makefile.pm b/inc/Module/Install/Makefile.pm
index 13a4464..1e214a0 100644
--- a/inc/Module/Install/Makefile.pm
+++ b/inc/Module/Install/Makefile.pm
@@ -8,7 +8,7 @@ use Fcntl qw/:flock :seek/;
 
 use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-	$VERSION = '1.19';
+	$VERSION = '1.21';
 	@ISA     = 'Module::Install::Base';
 	$ISCORE  = 1;
 }
diff --git a/inc/Module/Install/Metadata.pm b/inc/Module/Install/Metadata.pm
index 11bf971..2ae8036 100644
--- a/inc/Module/Install/Metadata.pm
+++ b/inc/Module/Install/Metadata.pm
@@ -6,7 +6,7 @@ use Module::Install::Base ();
 
 use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-	$VERSION = '1.19';
+	$VERSION = '1.21';
 	@ISA     = 'Module::Install::Base';
 	$ISCORE  = 1;
 }
@@ -455,12 +455,8 @@ sub author_from {
 my %license_urls = (
     perl         => 'http://dev.perl.org/licenses/',
     apache       => 'http://apache.org/licenses/LICENSE-2.0',
-    apache_1_1   => 'http://apache.org/licenses/LICENSE-1.1',
     artistic     => 'http://opensource.org/licenses/artistic-license.php',
-    artistic_2   => 'http://opensource.org/licenses/artistic-license-2.0.php',
     lgpl         => 'http://opensource.org/licenses/lgpl-license.php',
-    lgpl2        => 'http://opensource.org/licenses/lgpl-2.1.php',
-    lgpl3        => 'http://opensource.org/licenses/lgpl-3.0.html',
     bsd          => 'http://opensource.org/licenses/bsd-license.php',
     gpl          => 'http://opensource.org/licenses/gpl-license.php',
     gpl2         => 'http://opensource.org/licenses/gpl-2.0.php',
@@ -471,6 +467,12 @@ my %license_urls = (
     unrestricted => undef,
     restrictive  => undef,
     unknown      => undef,
+
+    # these are not actually allowed in meta-spec v1.4 but are left here for compatibility:
+    apache_1_1   => 'http://apache.org/licenses/LICENSE-1.1',
+    artistic_2   => 'http://opensource.org/licenses/artistic-license-2.0.php',
+    lgpl2        => 'http://opensource.org/licenses/lgpl-2.1.php',
+    lgpl3        => 'http://opensource.org/licenses/lgpl-3.0.html',
 );
 
 sub license {
diff --git a/inc/Module/Install/RTx.pm b/inc/Module/Install/RTx.pm
index 2dd9489..2889ece 100644
--- a/inc/Module/Install/RTx.pm
+++ b/inc/Module/Install/RTx.pm
@@ -9,7 +9,7 @@ no warnings 'once';
 use Term::ANSIColor qw(:constants);
 use Module::Install::Base;
 use base 'Module::Install::Base';
-our $VERSION = '0.42';
+our $VERSION = '0.43';
 
 use FindBin;
 use File::Glob     ();
@@ -134,7 +134,7 @@ lexicons ::
     if( $extra_args->{'remove_files'} ){
         $self->include('Module::Install::RTx::Remove');
         our @remove_files;
-        eval { require "etc/upgrade/remove_files" }
+        eval { require "./etc/upgrade/remove_files" }
           or print "No remove file located, no files to remove\n";
         $remove_files = join ",", map {"q(\$(DESTDIR)$plugin_path/$name/$_)"} @remove_files;
     }
diff --git a/inc/Module/Install/Win32.pm b/inc/Module/Install/Win32.pm
index f7aa615..b6c1d37 100644
--- a/inc/Module/Install/Win32.pm
+++ b/inc/Module/Install/Win32.pm
@@ -6,7 +6,7 @@ use Module::Install::Base ();
 
 use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-	$VERSION = '1.19';
+	$VERSION = '1.21';
 	@ISA     = 'Module::Install::Base';
 	$ISCORE  = 1;
 }
diff --git a/inc/Module/Install/WriteAll.pm b/inc/Module/Install/WriteAll.pm
index 2db861a..d87eb9a 100644
--- a/inc/Module/Install/WriteAll.pm
+++ b/inc/Module/Install/WriteAll.pm
@@ -6,7 +6,7 @@ use Module::Install::Base ();
 
 use vars qw{$VERSION @ISA $ISCORE};
 BEGIN {
-	$VERSION = '1.19';
+	$VERSION = '1.21';
 	@ISA     = qw{Module::Install::Base};
 	$ISCORE  = 1;
 }
diff --git a/inc/YAML/Tiny.pm b/inc/YAML/Tiny.pm
index fb157a6..db3ae5c 100644
--- a/inc/YAML/Tiny.pm
+++ b/inc/YAML/Tiny.pm
@@ -2,12 +2,12 @@
 use 5.008001; # sane UTF-8 support
 use strict;
 use warnings;
-package YAML::Tiny; # git description: v1.72-7-g8682f63
+package YAML::Tiny; # git description: v1.73-12-ge02f827
 # XXX-INGY is 5.8.1 too old/broken for utf8?
 # XXX-XDG Lancaster consensus was that it was sufficient until
 # proven otherwise
 
-our $VERSION = '1.73';
+our $VERSION = '1.74';
 
 #####################################################################
 # The YAML::Tiny API.

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


hooks/post-receive
-- 
RT-Extension-CommandByMail


More information about the Bps-public-commit mailing list