1*b1cdbd2cSJim Jagielski:
2*b1cdbd2cSJim Jagielskieval 'exec perl -wS $0 ${1+"$@"}'
3*b1cdbd2cSJim Jagielski    if 0;
4*b1cdbd2cSJim Jagielski#**************************************************************
5*b1cdbd2cSJim Jagielski#
6*b1cdbd2cSJim Jagielski#  Licensed to the Apache Software Foundation (ASF) under one
7*b1cdbd2cSJim Jagielski#  or more contributor license agreements.  See the NOTICE file
8*b1cdbd2cSJim Jagielski#  distributed with this work for additional information
9*b1cdbd2cSJim Jagielski#  regarding copyright ownership.  The ASF licenses this file
10*b1cdbd2cSJim Jagielski#  to you under the Apache License, Version 2.0 (the
11*b1cdbd2cSJim Jagielski#  "License"); you may not use this file except in compliance
12*b1cdbd2cSJim Jagielski#  with the License.  You may obtain a copy of the License at
13*b1cdbd2cSJim Jagielski#
14*b1cdbd2cSJim Jagielski#    http://www.apache.org/licenses/LICENSE-2.0
15*b1cdbd2cSJim Jagielski#
16*b1cdbd2cSJim Jagielski#  Unless required by applicable law or agreed to in writing,
17*b1cdbd2cSJim Jagielski#  software distributed under the License is distributed on an
18*b1cdbd2cSJim Jagielski#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
19*b1cdbd2cSJim Jagielski#  KIND, either express or implied.  See the License for the
20*b1cdbd2cSJim Jagielski#  specific language governing permissions and limitations
21*b1cdbd2cSJim Jagielski#  under the License.
22*b1cdbd2cSJim Jagielski#
23*b1cdbd2cSJim Jagielski#**************************************************************
24*b1cdbd2cSJim Jagielski
25*b1cdbd2cSJim Jagielski
26*b1cdbd2cSJim Jagielski
27*b1cdbd2cSJim Jagielskiuse strict;
28*b1cdbd2cSJim Jagielskiuse Class::Struct;
29*b1cdbd2cSJim Jagielskiuse Getopt::Long;
30*b1cdbd2cSJim Jagielskiuse File::Temp;
31*b1cdbd2cSJim Jagielskiuse File::Path;
32*b1cdbd2cSJim Jagielski
33*b1cdbd2cSJim Jagielskimy @files;
34*b1cdbd2cSJim Jagielskimy @file_names;
35*b1cdbd2cSJim Jagielskimy $module_name = '';
36*b1cdbd2cSJim Jagielskimy @current;
37*b1cdbd2cSJim Jagielskimy @buffer;
38*b1cdbd2cSJim Jagielskimy $last_file;
39*b1cdbd2cSJim Jagielskimy $last_path;
40*b1cdbd2cSJim Jagielskimy $last_localize_file;
41*b1cdbd2cSJim Jagielskimy $first_run = "1";
42*b1cdbd2cSJim Jagielskimy $sdf_filename;
43*b1cdbd2cSJim Jagielskimy $merge_dir;
44*b1cdbd2cSJim Jagielskimy $state = "none";
45*b1cdbd2cSJim Jagielski
46*b1cdbd2cSJim Jagielski$SIG{INT}  = 'inthandler';
47*b1cdbd2cSJim Jagielski$SIG{QUIT} = 'quithandler';
48*b1cdbd2cSJim Jagielski
49*b1cdbd2cSJim Jagielskistruct ( sdf_obj =>
50*b1cdbd2cSJim Jagielski{
51*b1cdbd2cSJim Jagielski    module      => '$',
52*b1cdbd2cSJim Jagielski    file        => '$',
53*b1cdbd2cSJim Jagielski    dir         => '$',
54*b1cdbd2cSJim Jagielski    FILEHANDLE  => '$',
55*b1cdbd2cSJim Jagielski    line        => '$',
56*b1cdbd2cSJim Jagielski    endoffile   => '$'
57*b1cdbd2cSJim Jagielski}
58*b1cdbd2cSJim Jagielski);
59*b1cdbd2cSJim Jagielski
60*b1cdbd2cSJim Jagielskiparse_options();
61*b1cdbd2cSJim Jagielskimy $lock_file   = $merge_dir."/lock.mk";
62*b1cdbd2cSJim Jagielskiacquire_lock();
63*b1cdbd2cSJim Jagielskiread_sdf_file_names();
64*b1cdbd2cSJim Jagielskiinit();
65*b1cdbd2cSJim Jagielskimy $reference;
66*b1cdbd2cSJim Jagielskimy $path ;
67*b1cdbd2cSJim Jagielskimy $localize_file;
68*b1cdbd2cSJim Jagielskiwhile( hasLines() )
69*b1cdbd2cSJim Jagielski{
70*b1cdbd2cSJim Jagielski    @current = ();
71*b1cdbd2cSJim Jagielski    foreach ( @files )
72*b1cdbd2cSJim Jagielski    {
73*b1cdbd2cSJim Jagielski        push @current , $_;
74*b1cdbd2cSJim Jagielski    }
75*b1cdbd2cSJim Jagielski
76*b1cdbd2cSJim Jagielski    $reference = getNextIdentifier( );
77*b1cdbd2cSJim Jagielski
78*b1cdbd2cSJim Jagielski    @current = ();
79*b1cdbd2cSJim Jagielski    foreach ( @files )
80*b1cdbd2cSJim Jagielski    {
81*b1cdbd2cSJim Jagielski        if( $_->module eq $reference->module && $_->dir eq $reference->dir )
82*b1cdbd2cSJim Jagielski        {
83*b1cdbd2cSJim Jagielski            push @current , $_ ;
84*b1cdbd2cSJim Jagielski        }
85*b1cdbd2cSJim Jagielski    }
86*b1cdbd2cSJim Jagielski    write_lines();
87*b1cdbd2cSJim Jagielski}
88*b1cdbd2cSJim Jagielskiif( $#current+1 ne 0 )
89*b1cdbd2cSJim Jagielski{
90*b1cdbd2cSJim Jagielski    ( $path , $localize_file ) = make_paths();
91*b1cdbd2cSJim Jagielski    add_to_buffer();
92*b1cdbd2cSJim Jagielski    write_buffer( $path , $localize_file );
93*b1cdbd2cSJim Jagielski}
94*b1cdbd2cSJim Jagielskirelease_lock();
95*b1cdbd2cSJim Jagielskiexit( 0 );
96*b1cdbd2cSJim Jagielski
97*b1cdbd2cSJim Jagielski##########################################################################################
98*b1cdbd2cSJim Jagielskisub acquire_lock
99*b1cdbd2cSJim Jagielski{
100*b1cdbd2cSJim Jagielski    if( -e $lock_file ){
101*b1cdbd2cSJim Jagielski        $state = "blocked";
102*b1cdbd2cSJim Jagielski        print "WARNING: Lock file '$lock_file' 'found, waiting ....\n";
103*b1cdbd2cSJim Jagielski        my $cnt = 0;
104*b1cdbd2cSJim Jagielski        sleep 10 , while( -e $lock_file && $cnt++ < 180 );
105*b1cdbd2cSJim Jagielski        exit( 0 );
106*b1cdbd2cSJim Jagielski    }else
107*b1cdbd2cSJim Jagielski    {
108*b1cdbd2cSJim Jagielski        $state = "locked";
109*b1cdbd2cSJim Jagielski        print "Writing lock file '$lock_file'\n";
110*b1cdbd2cSJim Jagielski        open FILE, ">$lock_file" or die "Can't create lock file '$lock_file'";
111*b1cdbd2cSJim Jagielski        print FILE "L10N_LOCK=YES" ;
112*b1cdbd2cSJim Jagielski        close ( FILE );
113*b1cdbd2cSJim Jagielski    }
114*b1cdbd2cSJim Jagielski}
115*b1cdbd2cSJim Jagielskisub release_lock
116*b1cdbd2cSJim Jagielski{
117*b1cdbd2cSJim Jagielski    print "Deleting lock file '$lock_file'\n";
118*b1cdbd2cSJim Jagielski    unlink $lock_file, if( -e $lock_file );
119*b1cdbd2cSJim Jagielski    $state = "none";
120*b1cdbd2cSJim Jagielski}
121*b1cdbd2cSJim Jagielskisub inthandler
122*b1cdbd2cSJim Jagielski{
123*b1cdbd2cSJim Jagielski    release_lock() , if( $state eq "locked" );
124*b1cdbd2cSJim Jagielski    exit( -1 );
125*b1cdbd2cSJim Jagielski}
126*b1cdbd2cSJim Jagielskisub quithandler
127*b1cdbd2cSJim Jagielski{
128*b1cdbd2cSJim Jagielski    release_lock() , if( $state eq "locked" );
129*b1cdbd2cSJim Jagielski    exit( 0 );
130*b1cdbd2cSJim Jagielski}
131*b1cdbd2cSJim Jagielski
132*b1cdbd2cSJim Jagielskisub init
133*b1cdbd2cSJim Jagielski{
134*b1cdbd2cSJim Jagielski    foreach my $file ( @file_names )
135*b1cdbd2cSJim Jagielski    {
136*b1cdbd2cSJim Jagielski        my $obj = new sdf_obj;
137*b1cdbd2cSJim Jagielski        open my $FILEHANDLE , "<$file" or die "Can't open file '$file'";
138*b1cdbd2cSJim Jagielski        $obj->FILEHANDLE ( $FILEHANDLE ) ;
139*b1cdbd2cSJim Jagielski        getNextSdfObj( $obj );
140*b1cdbd2cSJim Jagielski        push @files, $obj ;
141*b1cdbd2cSJim Jagielski        print "Open file '$file'\n";
142*b1cdbd2cSJim Jagielski    }
143*b1cdbd2cSJim Jagielski}
144*b1cdbd2cSJim Jagielski
145*b1cdbd2cSJim Jagielski# get the next module/file
146*b1cdbd2cSJim Jagielskisub getNextIdentifier
147*b1cdbd2cSJim Jagielski{
148*b1cdbd2cSJim Jagielski    my @sorted = sort {
149*b1cdbd2cSJim Jagielski        return $a->module.$a->dir cmp $b->module.$b->dir;
150*b1cdbd2cSJim Jagielski    } @current ;
151*b1cdbd2cSJim Jagielski    return shift @sorted;
152*b1cdbd2cSJim Jagielski}
153*b1cdbd2cSJim Jagielski
154*b1cdbd2cSJim Jagielski# update the obj with the next line
155*b1cdbd2cSJim Jagielskisub getNextSdfObj
156*b1cdbd2cSJim Jagielski{
157*b1cdbd2cSJim Jagielski    my $obj             = shift;
158*b1cdbd2cSJim Jagielski    my $line = readline ( $obj->FILEHANDLE );
159*b1cdbd2cSJim Jagielski    if ( $line eq undef )
160*b1cdbd2cSJim Jagielski    {
161*b1cdbd2cSJim Jagielski        $obj->endoffile( "true" );
162*b1cdbd2cSJim Jagielski    }
163*b1cdbd2cSJim Jagielski    else
164*b1cdbd2cSJim Jagielski    {
165*b1cdbd2cSJim Jagielski        $line =~ /^(([^\t]*)\t([^\t]*)[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t*)/o ;
166*b1cdbd2cSJim Jagielski        if( defined $1 && defined $2 && defined $3 )
167*b1cdbd2cSJim Jagielski        {
168*b1cdbd2cSJim Jagielski            $obj->line  ( $1 );
169*b1cdbd2cSJim Jagielski            $obj->module( $2 );
170*b1cdbd2cSJim Jagielski            $obj->file  ( $3 );
171*b1cdbd2cSJim Jagielski            $obj->dir   ( getDir( $3 ) );
172*b1cdbd2cSJim Jagielski        }
173*b1cdbd2cSJim Jagielski        else
174*b1cdbd2cSJim Jagielski        {
175*b1cdbd2cSJim Jagielski            $obj->line  ( "" );
176*b1cdbd2cSJim Jagielski            $obj->module( "" );
177*b1cdbd2cSJim Jagielski            $obj->file  ( "" );
178*b1cdbd2cSJim Jagielski            $obj->dir   ( "" );
179*b1cdbd2cSJim Jagielski        }
180*b1cdbd2cSJim Jagielski    }
181*b1cdbd2cSJim Jagielski    return $obj;
182*b1cdbd2cSJim Jagielski}
183*b1cdbd2cSJim Jagielskisub getNextSdfObjModule
184*b1cdbd2cSJim Jagielski{
185*b1cdbd2cSJim Jagielski    my $obj             = shift;
186*b1cdbd2cSJim Jagielski    while( !$obj->endoffile )
187*b1cdbd2cSJim Jagielski    {
188*b1cdbd2cSJim Jagielski        my $line = readline ( $obj->FILEHANDLE );
189*b1cdbd2cSJim Jagielski        if ( $line eq undef )
190*b1cdbd2cSJim Jagielski        {
191*b1cdbd2cSJim Jagielski            $obj->endoffile( "true" );
192*b1cdbd2cSJim Jagielski        }
193*b1cdbd2cSJim Jagielski        else
194*b1cdbd2cSJim Jagielski        {
195*b1cdbd2cSJim Jagielski            $line =~ /^(([^\t]*)\t([^\t]*).*)/o ;
196*b1cdbd2cSJim Jagielski            if( defined $1 && defined $2 && defined $3 )
197*b1cdbd2cSJim Jagielski            {
198*b1cdbd2cSJim Jagielski                $obj->line  ( $1 );
199*b1cdbd2cSJim Jagielski                $obj->module( $2 );
200*b1cdbd2cSJim Jagielski                $obj->file  ( $3 );
201*b1cdbd2cSJim Jagielski                $obj->dir   ( getDir( $3 ) );
202*b1cdbd2cSJim Jagielski            }
203*b1cdbd2cSJim Jagielski            else
204*b1cdbd2cSJim Jagielski            {
205*b1cdbd2cSJim Jagielski                $obj->line  ( "" );
206*b1cdbd2cSJim Jagielski                $obj->module( "" );
207*b1cdbd2cSJim Jagielski                $obj->file  ( "" );
208*b1cdbd2cSJim Jagielski                $obj->dir   ( "" );
209*b1cdbd2cSJim Jagielski            }
210*b1cdbd2cSJim Jagielski            return $obj , if( $obj->module eq $module_name )
211*b1cdbd2cSJim Jagielski        }
212*b1cdbd2cSJim Jagielski    }
213*b1cdbd2cSJim Jagielski    #return $obj;
214*b1cdbd2cSJim Jagielski}
215*b1cdbd2cSJim Jagielskisub getDir
216*b1cdbd2cSJim Jagielski{
217*b1cdbd2cSJim Jagielski    my $path     = shift ;
218*b1cdbd2cSJim Jagielski    $path        =~ s/\//\\/g;
219*b1cdbd2cSJim Jagielski    my @tmp_path = split /\\/ , $path;
220*b1cdbd2cSJim Jagielski    pop @tmp_path;
221*b1cdbd2cSJim Jagielski    $path        = join  '\\' , @tmp_path;
222*b1cdbd2cSJim Jagielski    return $path;
223*b1cdbd2cSJim Jagielski}
224*b1cdbd2cSJim Jagielski
225*b1cdbd2cSJim Jagielskisub hasLines
226*b1cdbd2cSJim Jagielski{
227*b1cdbd2cSJim Jagielski    my $hasLines  = "";
228*b1cdbd2cSJim Jagielski    my @tmpfiles;
229*b1cdbd2cSJim Jagielski    foreach ( @files )
230*b1cdbd2cSJim Jagielski    {
231*b1cdbd2cSJim Jagielski        push @tmpfiles , $_, if( !$_->endoffile );
232*b1cdbd2cSJim Jagielski    }
233*b1cdbd2cSJim Jagielski    @files = @tmpfiles;
234*b1cdbd2cSJim Jagielski    return $#files+1;
235*b1cdbd2cSJim Jagielski}
236*b1cdbd2cSJim Jagielski
237*b1cdbd2cSJim Jagielskisub make_paths
238*b1cdbd2cSJim Jagielski{
239*b1cdbd2cSJim Jagielski    my $localizeFile = $merge_dir."\\".$current[ 0 ]->module."\\".$current[ 0 ]->file;
240*b1cdbd2cSJim Jagielski    my $path = getDir( $localizeFile );
241*b1cdbd2cSJim Jagielski    $path =~ s/\\/\//g;
242*b1cdbd2cSJim Jagielski
243*b1cdbd2cSJim Jagielski    $localizeFile = $path."/localize.sdf";
244*b1cdbd2cSJim Jagielski
245*b1cdbd2cSJim Jagielski    return ( $path , $localizeFile );
246*b1cdbd2cSJim Jagielski}
247*b1cdbd2cSJim Jagielskisub write_lines
248*b1cdbd2cSJim Jagielski{
249*b1cdbd2cSJim Jagielski    if( $first_run ){
250*b1cdbd2cSJim Jagielski        add_to_buffer();
251*b1cdbd2cSJim Jagielski        my( $path , $localize_file ) = make_paths();
252*b1cdbd2cSJim Jagielski        $last_path = $path;
253*b1cdbd2cSJim Jagielski        $last_localize_file = $localize_file;
254*b1cdbd2cSJim Jagielski        mkpath $path;
255*b1cdbd2cSJim Jagielski        write_buffer( $path , $localize_file );
256*b1cdbd2cSJim Jagielski        $first_run = '';
257*b1cdbd2cSJim Jagielski    }
258*b1cdbd2cSJim Jagielski    else
259*b1cdbd2cSJim Jagielski    {
260*b1cdbd2cSJim Jagielski        return , if ( $#current+1 eq 0 );
261*b1cdbd2cSJim Jagielski        my( $path , $localize_file ) = make_paths();
262*b1cdbd2cSJim Jagielski        if( $path eq $last_path )
263*b1cdbd2cSJim Jagielski        {
264*b1cdbd2cSJim Jagielski            add_to_buffer();
265*b1cdbd2cSJim Jagielski        }
266*b1cdbd2cSJim Jagielski        else
267*b1cdbd2cSJim Jagielski        {
268*b1cdbd2cSJim Jagielski            mkpath $path;
269*b1cdbd2cSJim Jagielski            write_buffer( $last_path , $last_localize_file );
270*b1cdbd2cSJim Jagielski            add_to_buffer();
271*b1cdbd2cSJim Jagielski            $last_path = $path;
272*b1cdbd2cSJim Jagielski            $last_localize_file = $localize_file;
273*b1cdbd2cSJim Jagielski        }
274*b1cdbd2cSJim Jagielski    }
275*b1cdbd2cSJim Jagielski}
276*b1cdbd2cSJim Jagielskisub add_to_buffer
277*b1cdbd2cSJim Jagielski{
278*b1cdbd2cSJim Jagielski	my $plainline;
279*b1cdbd2cSJim Jagielski	my $afile;
280*b1cdbd2cSJim Jagielski	my $amodule;
281*b1cdbd2cSJim Jagielski    foreach my $elem ( @current )
282*b1cdbd2cSJim Jagielski    {
283*b1cdbd2cSJim Jagielski		do {
284*b1cdbd2cSJim Jagielski        $amodule=$elem->module;
285*b1cdbd2cSJim Jagielski        $afile=$elem->file;
286*b1cdbd2cSJim Jagielski		$plainline=$elem->line;
287*b1cdbd2cSJim Jagielski        push @buffer, $plainline;
288*b1cdbd2cSJim Jagielski        getNextSdfObj( $elem );
289*b1cdbd2cSJim Jagielski		} while ( !$elem->endoffile && $amodule eq $elem->module && $afile eq $elem->file );
290*b1cdbd2cSJim Jagielski    }
291*b1cdbd2cSJim Jagielski}
292*b1cdbd2cSJim Jagielskisub write_buffer
293*b1cdbd2cSJim Jagielski{
294*b1cdbd2cSJim Jagielski    my $path            = shift;
295*b1cdbd2cSJim Jagielski    my $localize_file   = shift;
296*b1cdbd2cSJim Jagielski    my $cnt             = $#buffer+1;
297*b1cdbd2cSJim Jagielski    print "Write to $path $cnt lines\n";
298*b1cdbd2cSJim Jagielski    open FILE , ">>$localize_file" or die "Can't open file '$localize_file'\n";
299*b1cdbd2cSJim Jagielski    foreach ( @buffer )
300*b1cdbd2cSJim Jagielski    {
301*b1cdbd2cSJim Jagielski        print FILE $_."\n";
302*b1cdbd2cSJim Jagielski    }
303*b1cdbd2cSJim Jagielski    @buffer = ();
304*b1cdbd2cSJim Jagielski}
305*b1cdbd2cSJim Jagielskisub parse_options
306*b1cdbd2cSJim Jagielski{
307*b1cdbd2cSJim Jagielski    my $success = GetOptions( 'sdf_files=s' => \$sdf_filename , 'merge_dir=s' => \$merge_dir ); #, 'module=s' => \$module_name );
308*b1cdbd2cSJim Jagielski    if( ! ( $sdf_filename && $merge_dir && $success ) )
309*b1cdbd2cSJim Jagielski    {
310*b1cdbd2cSJim Jagielski        usage();
311*b1cdbd2cSJim Jagielski        exit( -1 );
312*b1cdbd2cSJim Jagielski    }
313*b1cdbd2cSJim Jagielski}
314*b1cdbd2cSJim Jagielski
315*b1cdbd2cSJim Jagielskisub usage
316*b1cdbd2cSJim Jagielski{
317*b1cdbd2cSJim Jagielski    print "Usage: fast_merge -sdf_files <file containing sdf file names> -merge_dir <directory>\n" ;
318*b1cdbd2cSJim Jagielski}
319*b1cdbd2cSJim Jagielski
320*b1cdbd2cSJim Jagielskisub read_sdf_file_names
321*b1cdbd2cSJim Jagielski{
322*b1cdbd2cSJim Jagielski    open FILE , "<$sdf_filename" or die "Can't open file '$sdf_filename'\n";
323*b1cdbd2cSJim Jagielski    while (  <FILE> )
324*b1cdbd2cSJim Jagielski    {
325*b1cdbd2cSJim Jagielski        push @file_names , split " " , $_ ;
326*b1cdbd2cSJim Jagielski    }
327*b1cdbd2cSJim Jagielski    close ( FILE );
328*b1cdbd2cSJim Jagielski}
329*b1cdbd2cSJim Jagielski
330*b1cdbd2cSJim Jagielski
331