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