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