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