Add FR translation
[manu/RT-Extension-FollowUp.git] / inc / Module / Install / RTx.pm
1 #line 1
2 package Module::Install::RTx;
3
4 use 5.008;
5 use strict;
6 use warnings;
7 no warnings 'once';
8
9 use Module::Install::Base;
10 use base 'Module::Install::Base';
11 our $VERSION = '0.29';
12
13 use FindBin;
14 use File::Glob     ();
15 use File::Basename ();
16
17 my @DIRS = qw(etc lib html bin sbin po var);
18 my @INDEX_DIRS = qw(lib bin sbin);
19
20 sub RTx {
21     my ( $self, $name ) = @_;
22
23     my $original_name = $name;
24     my $RTx = 'RTx';
25     $RTx = $1 if $name =~ s/^(\w+)-//;
26     my $fname = $name;
27     $fname =~ s!-!/!g;
28
29     $self->name("$RTx-$name")
30         unless $self->name;
31     $self->all_from( -e "$name.pm" ? "$name.pm" : "lib/$RTx/$fname.pm" )
32         unless $self->version;
33     $self->abstract("RT $name Extension")
34         unless $self->abstract;
35
36     my @prefixes = (qw(/opt /usr/local /home /usr /sw ));
37     my $prefix   = $ENV{PREFIX};
38     @ARGV = grep { /PREFIX=(.*)/ ? ( ( $prefix = $1 ), 0 ) : 1 } @ARGV;
39
40     if ($prefix) {
41         $RT::LocalPath = $prefix;
42         $INC{'RT.pm'} = "$RT::LocalPath/lib/RT.pm";
43     } else {
44         local @INC = (
45             $ENV{RTHOME} ? ( $ENV{RTHOME}, "$ENV{RTHOME}/lib" ) : (),
46             @INC,
47             map { ( "$_/rt4/lib", "$_/lib/rt4", "$_/rt3/lib", "$_/lib/rt3", "$_/lib" )
48                 } grep $_, @prefixes
49         );
50         until ( eval { require RT; $RT::LocalPath } ) {
51             warn
52                 "Cannot find the location of RT.pm that defines \$RT::LocalPath in: @INC\n";
53             $_ = $self->prompt("Path to directory containing your RT.pm:") or exit;
54             $_ =~ s/\/RT\.pm$//;
55             push @INC, $_, "$_/rt3/lib", "$_/lib/rt3", "$_/lib";
56         }
57     }
58
59     my $lib_path = File::Basename::dirname( $INC{'RT.pm'} );
60     my $local_lib_path = "$RT::LocalPath/lib";
61     print "Using RT configuration from $INC{'RT.pm'}:\n";
62     unshift @INC, "$RT::LocalPath/lib" if $RT::LocalPath;
63     unshift @INC, $lib_path;
64
65     $RT::LocalVarPath  ||= $RT::VarPath;
66     $RT::LocalPoPath   ||= $RT::LocalLexiconPath;
67     $RT::LocalHtmlPath ||= $RT::MasonComponentRoot;
68     $RT::LocalLibPath  ||= "$RT::LocalPath/lib";
69
70     my $with_subdirs = $ENV{WITH_SUBDIRS};
71     @ARGV = grep { /WITH_SUBDIRS=(.*)/ ? ( ( $with_subdirs = $1 ), 0 ) : 1 }
72         @ARGV;
73
74     my %subdirs;
75     %subdirs = map { $_ => 1 } split( /\s*,\s*/, $with_subdirs )
76         if defined $with_subdirs;
77     unless ( keys %subdirs ) {
78         $subdirs{$_} = 1 foreach grep -d "$FindBin::Bin/$_", @DIRS;
79     }
80
81     # If we're running on RT 3.8 with plugin support, we really wany
82     # to install libs, mason templates and po files into plugin specific
83     # directories
84     my %path;
85     if ( $RT::LocalPluginPath ) {
86         die "Because of bugs in RT 3.8.0 this extension can not be installed.\n"
87             ."Upgrade to RT 3.8.1 or newer.\n" if $RT::VERSION =~ /^3\.8\.0/;
88         $path{$_} = $RT::LocalPluginPath . "/$original_name/$_"
89             foreach @DIRS;
90     } else {
91         foreach ( @DIRS ) {
92             no strict 'refs';
93             my $varname = "RT::Local" . ucfirst($_) . "Path";
94             $path{$_} = ${$varname} || "$RT::LocalPath/$_";
95         }
96
97         $path{$_} .= "/$name" for grep $path{$_}, qw(etc po var);
98     }
99
100     my %index = map { $_ => 1 } @INDEX_DIRS;
101     $self->no_index( directory => $_ ) foreach grep !$index{$_}, @DIRS;
102
103     my $args = join ', ', map "q($_)", map { ($_, $path{$_}) }
104         grep $subdirs{$_}, keys %path;
105
106     print "./$_\t=> $path{$_}\n" for sort keys %subdirs;
107
108     if ( my @dirs = map { ( -D => $_ ) } grep $subdirs{$_}, qw(bin html sbin) ) {
109         my @po = map { ( -o => $_ ) }
110             grep -f,
111             File::Glob::bsd_glob("po/*.po");
112         $self->postamble(<< ".") if @po;
113 lexicons ::
114 \t\$(NOECHO) \$(PERL) -MLocale::Maketext::Extract::Run=xgettext -e \"xgettext(qw(@dirs @po))\"
115 .
116     }
117
118     my $postamble = << ".";
119 install ::
120 \t\$(NOECHO) \$(PERL) -MExtUtils::Install -e \"install({$args})\"
121 .
122
123     if ( $subdirs{var} and -d $RT::MasonDataDir ) {
124         my ( $uid, $gid ) = ( stat($RT::MasonDataDir) )[ 4, 5 ];
125         $postamble .= << ".";
126 \t\$(NOECHO) chown -R $uid:$gid $path{var}
127 .
128     }
129
130     my %has_etc;
131     if ( File::Glob::bsd_glob("$FindBin::Bin/etc/schema.*") ) {
132
133         # got schema, load factory module
134         $has_etc{schema}++;
135         $self->load('RTxFactory');
136         $self->postamble(<< ".");
137 factory ::
138 \t\$(NOECHO) \$(PERL) -Ilib -I"$local_lib_path" -I"$lib_path" -Minc::Module::Install -e"RTxFactory(qw($RTx $name))"
139
140 dropdb ::
141 \t\$(NOECHO) \$(PERL) -Ilib -I"$local_lib_path" -I"$lib_path" -Minc::Module::Install -e"RTxFactory(qw($RTx $name drop))"
142
143 .
144     }
145     if ( File::Glob::bsd_glob("$FindBin::Bin/etc/acl.*") ) {
146         $has_etc{acl}++;
147     }
148     if ( -e 'etc/initialdata' ) { $has_etc{initialdata}++; }
149
150     $self->postamble("$postamble\n");
151     unless ( $subdirs{'lib'} ) {
152         $self->makemaker_args( PM => { "" => "" }, );
153     } else {
154         $self->makemaker_args( INSTALLSITELIB => $path{'lib'} );
155         $self->makemaker_args( INSTALLARCHLIB => $path{'lib'} );
156     }
157
158     $self->makemaker_args( INSTALLSITEMAN1DIR => "$RT::LocalPath/man/man1" );
159     $self->makemaker_args( INSTALLSITEMAN3DIR => "$RT::LocalPath/man/man3" );
160     $self->makemaker_args( INSTALLSITEARCH => "$RT::LocalPath/man" );
161
162     if (%has_etc) {
163         $self->load('RTxInitDB');
164         print "For first-time installation, type 'make initdb'.\n";
165         my $initdb = '';
166         $initdb .= <<"." if $has_etc{schema};
167 \t\$(NOECHO) \$(PERL) -Ilib -I"$local_lib_path" -I"$lib_path" -Minc::Module::Install -e"RTxInitDB(qw(schema))"
168 .
169         $initdb .= <<"." if $has_etc{acl};
170 \t\$(NOECHO) \$(PERL) -Ilib -I"$local_lib_path" -I"$lib_path" -Minc::Module::Install -e"RTxInitDB(qw(acl))"
171 .
172         $initdb .= <<"." if $has_etc{initialdata};
173 \t\$(NOECHO) \$(PERL) -Ilib -I"$local_lib_path" -I"$lib_path" -Minc::Module::Install -e"RTxInitDB(qw(insert))"
174 .
175         $self->postamble("initdb ::\n$initdb\n");
176         $self->postamble("initialize-database ::\n$initdb\n");
177     }
178 }
179
180 sub RTxInit {
181     unshift @INC, substr( delete( $INC{'RT.pm'} ), 0, -5 ) if $INC{'RT.pm'};
182     require RT;
183     RT::LoadConfig();
184     RT::ConnectToDatabase();
185
186     die "Cannot load RT" unless $RT::Handle and $RT::DatabaseType;
187 }
188
189 # stolen from RT::Handle so we work on 3.6 (cmp_versions came in with 3.8)
190 { my %word = (
191     a     => -4,
192     alpha => -4,
193     b     => -3,
194     beta  => -3,
195     pre   => -2,
196     rc    => -1,
197     head  => 9999,
198 );
199 sub cmp_version($$) {
200     my ($a, $b) = (@_);
201     my @a = grep defined, map { /^[0-9]+$/? $_ : /^[a-zA-Z]+$/? $word{$_}|| -10 : undef }
202         split /([^0-9]+)/, $a;
203     my @b = grep defined, map { /^[0-9]+$/? $_ : /^[a-zA-Z]+$/? $word{$_}|| -10 : undef }
204         split /([^0-9]+)/, $b;
205     @a > @b
206         ? push @b, (0) x (@a-@b)
207         : push @a, (0) x (@b-@a);
208     for ( my $i = 0; $i < @a; $i++ ) {
209         return $a[$i] <=> $b[$i] if $a[$i] <=> $b[$i];
210     }
211     return 0;
212 }}
213 sub requires_rt {
214     my ($self,$version) = @_;
215
216     # if we're exactly the same version as what we want, silently return
217     return if ($version eq $RT::VERSION);
218
219     my @sorted = sort cmp_version $version,$RT::VERSION;
220
221     if ($sorted[-1] eq $version) {
222         # should we die?
223         warn "\nWarning: prerequisite RT $version not found. Your installed version of RT ($RT::VERSION) is too old.\n\n";
224     }
225 }
226
227 1;
228
229 __END__
230
231 #line 348