1#!/usr/bin/php -q 2<?php 3 4//////////////////////////////////////////////////////////////////////////// 5// $Id: grab-stats.php 8819 2005-02-08 11:35:07Z tokul $ 6// 7// Description: Grab GUI messages statistics 8// 9//////////////////////////////////////////////////////////////////////////// 10 11 12dl('mysql.so'); 13include("grab-functions.php"); 14include("grab-config.php"); 15 16 17// ************* PRELIMINARY TASKS, DATA INIT ************* 18set_time_limit(0); 19 20// get for which revision we grab stats 21if ($argv[1]=="") { 22 $rev="HEAD"; 23} else { 24 $rev=$argv[1]; 25}; 26 27$podir = "$basedir/$rev/locales/locale"; 28$potdir = "$basedir/$rev/locales/po"; 29$teamnames = "$basedir/$rev/locales/teamnames"; 30$essential_f = "$basedir/$rev/locales/essential_files"; 31$essential_p = "$basedir/$rev/locales/essential_packages"; 32$packages_f = "$basedir/$rev/locales/guistats_packages"; 33$excludes_f = "$basedir/$rev/locales/guistats_excludes"; 34 35 36// preliminary checks 37if (!is_dir($podir)) { 38 send_err("Cannot acces $podir directory!"); 39 exit(); 40} 41if (!is_dir($potdir)) { 42 send_err("Cannot acces $potdir directory!"); 43 exit(); 44} 45if (!is_readable($teamnames)) { 46 send_err("Cannot acces $teamnames file!"); 47 exit(); 48} 49if (!is_readable($essential_f)) { 50 send_err("Cannot acces $essential_f file!"); 51 exit(); 52} 53if (!is_readable($essential_p)) { 54 send_err("Cannot acces $essential_p file!"); 55 exit(); 56} 57if (!is_readable($packages_f)) { 58 send_err("Cannot acces $packages_f file!"); 59 exit(); 60} 61if (!is_readable($excludes_f)) { 62 send_err("Cannot acces $excludes_f file!"); 63 exit(); 64} 65 66// data initialization 67$currdate = date("Y-m-d",mktime()); 68$teams = get_config1($teamnames); 69$ess_f = get_config1($essential_f); 70$ess_p = get_config1($essential_p); 71$packages = get_config2($packages_f); 72$excludes = get_config2($excludes_f); 73// customize the fake kdelibs package name 74$packages = array_map("my_replace",$packages); 75 76// open database connection 77$dbh=initdb($sql_host,$sql_user,$sql_pass,$sql_db); 78 79 80// ************* DATA PROCESSING ************* 81 82// erase old GUI statistics data 83debug(40,"emptying database tables"); 84$res=@mysql_query("DELETE FROM sum WHERE rev='$rev'",$dbh); 85if (!$res) { 86 send_err("SQL error: delete sum!"); 87 exit(); 88} 89$res=@mysql_query("DELETE FROM stats WHERE rev='$rev'",$dbh); 90if (!$res) { 91 send_err("SQL error: delete stats!"); 92 exit(); 93} 94$res=@mysql_query("DELETE FROM teams WHERE rev='$rev'",$dbh); 95if (!$res) { 96 send_err("SQL error: delete teams!"); 97 exit(); 98} 99$res=@mysql_query("DELETE FROM essential WHERE sdate='$currdate' AND rev='$rev'",$dbh); 100if (!$res) { 101 send_err("SQL error: delete essential!"); 102 exit(); 103} 104 105 106 107// map team code - team name in database 108debug(40,"save in database team names"); 109foreach ($teams as $teamcode => $teamname) { 110 $res=@mysql_query("INSERT INTO teams SET rev='$rev', " . 111 " teamcode='$teamcode', teamname='$teamname'" 112 ,$dbh); 113 if (!$res) { 114 send_err("SQL error: insert teams teamcode=$teamcode"); 115 } 116} 117 118// intialize associative array with essential files 119$essential_f=array(); 120foreach (array_keys($ess_f) as $file) { 121 $essential_f[$file]=array(0,0); 122} 123$essential_p=array(); 124foreach (array_keys($ess_p) as $package) { 125 $essential_p[$package]=array(0,0); 126} 127// grab POT messages data 128debug(40,"grabing POT statistics"); 129$teamdir=$potdir; // note: it's a fake team 130// process packages directories 131foreach ($packages as $package) { 132 debug(15,"level2: statistics in templates:$package"); 133 $total_error =0; 134 $total_translated =0; 135 $total_fuzzy =0; 136 $total_untranslated=0; 137 138 if (($package!=$kdefake && is_dir("$teamdir/$package")) || ($package==$kdefake && is_dir($teamdir))) { 139 $files=array(); 140 $fullpotdir= ($package==$kdefake) ? "$potdir" : "$potdir/$package"; 141 if ($dh=@opendir($fullpotdir)) { 142 $files=array(); 143 while ($file=readdir($dh)) { 144 if (preg_match("/\.pot$/",$file) && !in_array(substr($file,0,strlen($file)-1),$excludes)) { 145 array_push($files,$file); 146 } 147 } 148 closedir($dh); 149 } else { 150 // directory have no POT files: likely to be an CVS mess 151 $res=@mysql_query("INSERT INTO sum SET rev='$rev', " . 152 " team='templates', package='$package', " . 153 " translated='0', fuzzy='0', " . 154 " untranslated='0', total='0', " . 155 " error='0'" 156 ,$dbh); 157 if (!$res) { 158 send_err("SQL error: sum POT grabbing package=$package"); 159 exit(); 160 } 161 } 162 163 foreach ($files as $filename) { 164 $potfile = ($package==$kdefake) ? "$potdir/$filename" : "$potdir/$package/$filename"; 165 $have_po=0; 166 if (is_readable($potfile)) { 167 debug(20,"level3: [templates:$package] POT: $filename"); 168 $have_pot=1; 169 list($error,$translated,$fuzzy,$untranslated)=getstats($potfile); 170 } else { 171 debug(20,"level3: [templates:$package] POT: $filename (NO ACCESS!)"); 172 // file permissions are strange!! 173 $error=0; 174 $translated=0; 175 $fuzzy=0; 176 $untranslated=0; 177 $have_pot=0; 178 } 179 $total=$translated+$fuzzy+$untranslated; 180 $res=@mysql_query("INSERT INTO stats SET rev='$rev', " . 181 " team='templates', package='$package', " . 182 " filename='$filename', translated='$translated', " . 183 " fuzzy='$fuzzy', untranslated='$untranslated', total='$total', " . 184 " error='$error', have_po='$have_po', have_pot='$have_pot'" 185 ,$dbh); 186 if (!$res) { 187 send_err("SQL error: stats POT grabbing 1 package=$package; filename=$filename"); 188 exit(); 189 } 190 191 // fake essential files stats: percentage & total untranslated in fact 192 $filename=substr($filename,0,strlen($filename)-1); 193 $percentage=$ess_f[$filename]; 194 if (in_array($filename,array_keys($ess_f))) { 195 $essential_f[$filename]=array($percentage,$total); 196 } 197 // sumarize for entire package 198 $total_error += $error; 199 $total_translated += $translated; 200 $total_fuzzy += $fuzzy; 201 $total_untranslated += $untranslated; 202 } 203 } else { 204 // the team's package dir doesn't exist or is not accessible 205 debug(20,"level3: statistics in templates:$package (NODIR)"); 206 // insert null values to catch directory access errors 207 $res=@mysql_query("INSERT INTO sum SET rev='$rev', " . 208 " team='templates', package='$package', " . 209 " translated='0', fuzzy='0', " . 210 " untranslated='0', total='0', error='0'" 211 ,$dbh); 212 if (!$res) { 213 send_err("SQL error: sum POT grabbing 2 package=$package"); 214 exit(); 215 } 216 } 217 // write sumary in "sum" table 218 $total_total=$total_translated+$total_fuzzy+$total_untranslated; 219 $res=@mysql_query("INSERT INTO sum SET rev='$rev', " . 220 " team='templates', package='$package', " . 221 " translated='$total_translated', fuzzy='$total_fuzzy', " . 222 " untranslated='$total_untranslated', total='$total_total', " . 223 " error='$total_error'" 224 ,$dbh); 225 if (!$res) { 226 send_err("SQL error: sum POT grabbing 2 package=$package"); 227 exit(); 228 } 229 230 // build essential packages stats 231 if (in_array($package,array_keys($ess_p))) { 232 $total_translated=$ess_p[$package]; 233 $essential_p[$package]=array($total_translated,$total_total); 234 } 235} 236 237// insert in database associative array for essential files 238foreach (array_keys($ess_f) as $file) { 239 list($translated,$total)=$essential_f[$file]; 240 $res=@mysql_query("INSERT INTO essential SET rev='$rev', " . 241 " sdate='$currdate', team='templates', " . 242 " filename='$file', translated='$translated', " . 243 " total='$total' " 244 ,$dbh); 245 if (!$res) { 246 send_err("SQL error: essential POT grabbing 1 filename=$file"); 247 exit(); 248 } 249} 250foreach (array_keys($ess_p) as $package) { 251 list($translated,$total)=$essential_p[$package]; 252 $res=@mysql_query("INSERT INTO essential SET rev='$rev', " . 253 " sdate='$currdate', team='templates', " . 254 " filename='$package', translated='$translated', " . 255 " total='$total' " 256 ,$dbh); 257 if (!$res) { 258 send_err("SQL error: essential POT grabbing 2 filename=$package"); 259 } 260} 261 262 263 264// grab PO messages data 265debug(40,"grabing PO statistics"); 266foreach ($teams as $teamcode => $teamname) { 267 debug(10,"level1: statistics in $teamcode"); 268 $teamdir="$podir/$teamcode/LC_MESSAGES"; 269 270 // intialize associative array with essential files 271 $essential_f=array(); 272 foreach (array_keys($ess_f) as $file) { 273 $essential_f[$file]=array(0,0); 274 } 275 $essential_p=array(); 276 foreach (array_keys($ess_p) as $package) { 277 $essential_p[$package]=array(0,0); 278 } 279 280 // process packages directories 281 foreach ($packages as $package) { 282 debug(15,"level2: statistics in $teamcode:$package"); 283 $total_error =0; 284 $total_translated =0; 285 $total_fuzzy =0; 286 $total_untranslated=0; 287 288 if (($package!=$kdefake && is_dir("$teamdir/$package")) || ($package==$kdefake && is_dir($teamdir))) { 289 // fill the array with POT files for current package 290 $files=array(); 291 $fullpotdir= ($package==$kdefake) ? "$potdir" : "$potdir/$package"; 292 if ($dh=@opendir($fullpotdir)) { 293 $files=array(); 294 while ($file=readdir($dh)) { 295 if (preg_match("/\.pot$/",$file) && !in_array($file,$excludes)) { 296 array_push($files,$file); 297 } 298 } 299 closedir($dh); 300 } 301 302 // 1) check if POT files have corresponding translated PO files 303 foreach ($files as $file) { 304 $pofile2 = $pofile = substr($file,0,strlen($file)-1); 305 $pofile = ($package==$kdefake) ? "$teamdir/$pofile" : "$teamdir/$package/$pofile"; 306 $potfile = ($package==$kdefake) ? "$potdir/$file" : "$potdir/$package/$file"; 307 if (is_readable($pofile)) { 308 debug(20, "level3: [$teamcode:$package] PO: $pofile2"); 309 $file2=substr($file,0,strlen($file)-1); 310 $filename=substr($file,0,strlen($file)-1); 311 $have_po=1; 312 $have_pot=1; 313 list($error,$translated,$fuzzy,$untranslated)=getstats($pofile); 314 } else { 315 debug(20,"level3: [$teamcode:$package] POT: $file"); 316 $file2=$file; 317 $filename=$file; 318 $have_po=0; 319 $have_pot=1; 320 list($error,$translated,$fuzzy,$untranslated)=getstats($potfile); 321 } 322 $total=$translated+$fuzzy+$untranslated; 323 $res=@mysql_query("INSERT INTO stats SET rev='$rev', " . 324 " team='$teamcode', package='$package', " . 325 " filename='$filename', translated='$translated', " . 326 " fuzzy='$fuzzy', untranslated='$untranslated', total='$total', " . 327 " error='$error', have_po='$have_po', have_pot='$have_pot'" 328 ,$dbh); 329 if (!$res) { 330 send_err("SQL error: stats PO grabbing 1 team=$teamcode; filename='$filename"); 331 exit(); 332 } 333 334 // build essential files stats 335 $filename=substr($file,0,strlen($file)-1); 336 if (in_array($filename,array_keys($ess_f))) { 337 $essential_f[$filename]=array($translated,$total); 338 } 339 // sumarize for entire package 340 $total_error += $error; 341 $total_translated += $translated; 342 $total_fuzzy += $fuzzy; 343 $total_untranslated += $untranslated; 344 } 345 346 // fill the array with PO files for current package 347 $files=array(); 348 $fullpodir= ($package==$kdefake) ? "$teamdir" : "$teamdir/$package"; 349 if ($dh=@opendir($fullpodir)) { 350 $files=array(); 351 while ($file=readdir($dh)) { 352 if (preg_match("/\.po$/",$file) && !in_array($file."t",$excludes)) { 353 array_push($files,$file); 354 } 355 } 356 closedir($dh); 357 } 358 359 // 2) check what POs don't have corresponding POTs 360 foreach ($files as $file) { 361 $pofile = ($package==$kdefake) ? "$teamdir/$file" : "$teamdir/$package/$file"; 362 $potfile = ($package==$kdefake) ? "$potdir/${file}t" : "$potdir/$package/${file}t"; 363 if (!is_readable($potfile)) { 364 debug(20,"level3: [$teamcode:$package] NOPOT: $file"); 365 list($error,$translated,$fuzzy,$untranslated)=getstats($pofile); 366 $total=$translated+$fuzzy+$untranslated; 367 $res=@mysql_query("INSERT INTO stats SET rev='$rev', " . 368 " team='$teamcode', package='$package', " . 369 " filename='$file', translated='$translated', " . 370 " fuzzy='$fuzzy', untranslated='$untranslated', " . 371 " total='$total', error='$error', have_po='1', " . 372 "have_pot='0'" 373 ,$dbh); 374 if (!$res) { 375 send_err("SQL error: stats PO grabbing 2 team=$teamcode; package=$package"); 376 exit(); 377 } 378 } 379 } 380 } else { 381 // the team's package dir doesn't exist or is not accessible 382 debug(20,"level3: statistics in $teamcode:$package (NODIR)"); 383 } 384 // write sumary in "sum" table 385 $total_total=$total_translated+$total_fuzzy+$total_untranslated; 386 $res=@mysql_query("INSERT INTO sum SET rev='$rev', " . 387 " team='$teamcode', package='$package', " . 388 " translated='$total_translated', fuzzy='$total_fuzzy', " . 389 " untranslated='$total_untranslated', total='$total_total', " . 390 " error='$total_error'" 391 ,$dbh); 392 if (!$res) { 393 send_err("SQL error: sum PO grabbing team=$teamcode; package=$package"); 394 exit(); 395 } 396 397 // build essential packages stats 398 if (in_array($package,array_keys($ess_p))) { 399 $essential_p[$package]=array($total_translated,$total_total); 400 } 401 } 402 403 // insert in database associative array for essential files 404 foreach (array_keys($ess_f) as $file) { 405 list($translated,$total)=$essential_f[$file]; 406 $res=@mysql_query("INSERT INTO essential SET rev='$rev', " . 407 " sdate='$currdate', team='$teamcode', " . 408 " filename='$file', translated='$translated', " . 409 " total='$total' " 410 ,$dbh); 411 if (!$res) { 412 send_err("SQL error: essential PO grabbing 1 team=$teamcode; filename=$file"); 413 exit(); 414 } 415 } 416 foreach (array_keys($ess_p) as $package) { 417 list($translated,$total)=$essential_p[$package]; 418 $res=@mysql_query("INSERT INTO essential SET rev='$rev', " . 419 " sdate='$currdate', team='$teamcode', " . 420 " filename='$package', translated='$translated', " . 421 " total='$total' " 422 ,$dbh); 423 if (!$res) { 424 send_err("SQL error: essential PO grabbing 2 team=$teamcode; filename=$package"); 425 exit(); 426 } 427 } 428} 429 430closedb($dbh); 431 432// send_ok("Success grabbing statistics for $rev branch."); 433 434?> 435