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