diff options
| -rwxr-xr-x | fixlang.php | 292 | ||||
| -rw-r--r-- | sunbird.spec | 8 | ||||
| -rwxr-xr-x | testfixlang.sh | 31 | 
3 files changed, 329 insertions, 2 deletions
diff --git a/fixlang.php b/fixlang.php new file mode 100755 index 0000000..51ff7d7 --- /dev/null +++ b/fixlang.php @@ -0,0 +1,292 @@ +#!/usr/bin/php +<?php + +/* +./fixlang.php  --xpi=gdata-provider.xpi \ +   --ref=calendar/locales/en-US/chrome/calendar/providers/gdata \ +   --output=toto \ +   --manifest=mani + +   calendar/locales/en-US/chrome/calendar/providers/gdata + +   calendar/locales/en-US/chrome/lightning/ +   calendar/locales/en-US/chrome/calendar/ + +Manifest: +locale gdata-provider 	en-US 	jar:chrome/gdata-provider-en-US.jar!/locale/en-US/ +locale calendar 	en-US 	jar:chrome/calendar-en-US.jar!/locale/en-US/calendar/ +locale lightning	en-US 	jar:chrome/lightning-en-US.jar!/locale/en-US/lightning/ + + */ +$tmp = "./FIXJAR"; +is_dir($tmp) or mkdir($tmp); + +$debug=false; +for ($i = 1 ; $i < $_SERVER["argc"] ; $i++) { +   $it = explode("=", $argv[$i], 2); +   $it[0] = preg_replace('/^--/', '', $it[0]); +   if (in_array($it[0], array('debug','xpi','gdata-provider','lightning','calendar','output','manifest'))) { +      $$it[0] = $it[1]; +   } +} + +function LoadDtd ($file, &$tab) { +   global $debug; +//$debug=(basename($file)=='global.dtd' ? 2 : 1); +   $tab=array(); + +   $fic=@fopen($file, "r"); +   if (!$fic) { +      die ("*** Cannot read $file\n"); +   } +   $prev=false; +   if ($debug) echo "\t\tLoading $file\n"; +   while ($buf=fgets($fic)) { +      $buf = rtrim($buf); +      if (empty($buf) || $buf=="\n") { +         if ($debug>1) echo "+ empty\n"; +      } else if ($prev!='comment' && preg_match('/^<!ENTITY (.+)"(.*)"( *)> *(<!--.*-->|)$/', $buf, $res)) { +         if ($debug>1) echo "+ Line  '".$res[1]."'\n"; +         $ind=trim($res[1]); +         $tab[$ind] = $res[1].'"'.$res[2].'">'; +         $prev=false; +      } else if ($prev!='comment' && preg_match('/^<!ENTITY (.*)"(.*)$/', $buf, $res)) { +         if ($debug>1) echo "+ Start '".$res[1]."'\n"; +         $ind=trim($res[1]); +         $tab[$ind] = $res[1].'"'.$res[2]; +         $prev=$ind; +      } else if (preg_match('/^<!--(.*)-->$/', $buf, $res)) { +         if ($debug>1) echo "+ Comment (".$res[1].")\n"; +      } else if (preg_match('/^[[:space:]]*<!--(.*)$/', $buf, $res)) { +         if (isset($tab['license'])) { +            $ind='comment'; +         } else { +            $ind='license'; +         } +         if ($debug>1) echo "+ Start '$ind' (".$res[1].")\n"; +         $tab[$ind] = $res[1]; +         $prev=$ind; +      } else if ($prev=="license" && preg_match('/^(.*)-->$/', $buf, $res)) { +         if ($debug>1) echo "+ End   'License'\n"; +         $tab[$prev] .= "\n".$res[1]; +         $prev=false; +      } else if ($prev=="comment" && preg_match('/^(.*)-->$/', $buf, $res)) { +         if ($debug>1) echo "+ End   'Comment'\n"; +         unset($tab['comment']); +         $prev=false; +      } else if ($prev && preg_match('/^(.*)">$/', $buf, $res)) { +         if ($debug>1) echo "+ End   '".$prev."'\n"; +         $tab[$prev] .= "\n".$res[1].'">'; +         $prev=false; +      } else if ($prev && preg_match('/^(.*)$/', $buf, $res)) { +         if ($debug>1) echo "+ Cont. '".$prev."'\n"; +         $tab[$prev] .= "\n".$res[1]; +      } else { +         die("*** - unkonwn ($buf) !\n"); +      } +   } +} + +function SaveDtd ($locpath, $loc, $ref) { +   global $debug; + +   $fic=@fopen($locpath, "w"); +   if (!$fic) { +      die ("*** Cannot create $locpath\n"); +   } +   if ($debug) echo "\tCreate $locpath\n"; +   if (isset($ref['license'])) { +      fputs($fic, "<!-- ".$ref['license']." -->\n"); +      unset($ref['license']); +   } +   // print_r($ref); print_r($loc); +   foreach($ref as $ind => $line) { +      if (isset($loc[$ind])) { +         fputs($fic, "<!ENTITY ".$loc[$ind]."\n"); +      } else { +         echo "\tAdding missing $ind to $locpath\n"; +         fputs($fic, "<!ENTITY ".$ref[$ind]."\n"); +      } +   } +   fclose($fic); +} + +function FixDtd ($locpath, $refpath) { +   global $debug; +   static $cache=array(); + +   if ($debug) echo "\tCheck DTD: $locpath $refpath\n"; + +   $key = basename($locpath); +   if (!isset($cache[$key])) { +      LoadDtd($refpath,$cache[$key]); +   } +   $ref = $cache[$key]; +   $loc = array(); +   LoadDtd($locpath, $loc); +   SaveDtd($locpath, $loc, $ref); +} + +function LoadProp ($file, &$tab) { +   global $debug; + +   $fic=@fopen($file, "r"); +   if (!$fic) { +      die ("*** Cannot read $file\n"); +   } +   if ($debug) echo "\t\tLoading $file\n"; +   $tab=array(); +   $tab['comment']=array(); + +   if ($fic) while ($buf=fgets($fic)) { +      $buf = rtrim($buf); +      if (empty($buf) || $buf=="\n") { +         if ($debug>1) echo "+ empty\n"; +      } else if (preg_match('/^#(.*)$/', $buf, $res)) { +         if ($debug>1) echo "+ comments\n"; +         $tab['comment'][]=$res[1]; +      } else if (preg_match('/^([A-Za-z0-9._{}@-]*)[[:space:]]*=[[:space:]]*(.*)/', $buf, $res)) { +         if ($debug>1) echo "+ Value '".$res[1]."'\n"; +         $ind=trim($res[1]); +         $tab[$ind] = $res[1].'='.$res[2]; +      } else { +         echo("\tIgnored ($buf) in $file !\n"); +      } +   } +} + +function SaveProp ($locpath, $loc, $ref) { +   global $debug; + +   $fic=@fopen($locpath, "w"); +   if (!$fic) { +      die ("*** Cannot create $locpath\n"); +   } +   if ($debug) echo "\tCreate $locpath\n"; +   if (isset($ref['license'])) { +      fputs($fic, "<!-- ".$ref['license']." -->\n"); +      unset($ref['license']); +   } +   foreach($ref['comment'] as $com) { +      fputs($fic, "#$com\n"); +   } +   unset($ref['comment']); +   // print_r($ref); print_r($loc); +   foreach($ref as $ind => $line) { +      if (isset($loc[$ind])) { +         fputs($fic, $loc[$ind]."\n"); +      } else { +         echo "\tAdding missing $ind to $locpath\n"; +         fputs($fic, $ref[$ind]."\n"); +      } +   } +   fclose($fic); +} + +function FixProp ($locpath, $refpath) { +   global $debug; +   static $cache=array(); + +   if ($debug) echo "\tCheck Properties: $locpath $refpath\n"; + +   $key = basename($locpath); +   if (!isset($cache[$key])) { +      LoadProp($refpath,$cache[$key]); +   } +   $ref = $cache[$key]; +   $loc = array(); +   LoadProp($locpath, $loc); +   SaveProp($locpath, $loc, $ref); +} + + +if (!isset($xpi) +    || !isset($manifest) || !is_file($manifest) +    || !isset($output) || !is_dir($output)) { +      echo "xpi=$xpi, ref=$ref\n"; +   die("usage php fixlang.php --xpi=pathto.xpi --<extname>=pathtorefdir --output=pathtooutputdir --manifest=pathto/chrome.manifest [ --debug=# ]\n"); +} +$zip = new ZipArchive(); +$zip2 = new ZipArchive(); +$zip3 = new ZipArchive(); +if (!$zip->open($xpi)) { +   die("*** Can't read $xpi\n"); +} +$ficman=@fopen($manifest, "a"); +if (!$ficman) { +   die("*** Can't read $manifest\n"); +} +for ($i=0 ; $i <$zip->numFiles; $i++) { +   $file=$zip->statIndex($i); +   if (preg_match('/^chrome\/(.*)-([a-z]{2}-[a-zA-Z]{2}).jar$/', $file['name'], $regs)) { +      $extn = $regs[1]; +      $lang = $regs[2]; +   } else if (preg_match('/^chrome\/(.*)-([a-z]{2}).jar$/', $file['name'], $regs)) { +      $extn = $regs[1]; +      $lang = $regs[2]; +   } else { +      continue; +   } +   if (isset($$extn) && is_dir($$extn)) { +      $ref=$$extn; +   } else { +      die("*** Missing --$extn options\n"); +   } +   if ($lang == 'en-US') { +      continue; +   } +   //if ($lang != 'et') continue; /// for debug +   if ($debug) echo "Working on $tmp/chrome/$extn-$lang.jar to $output/chrome/$extn-$lang.jar \n"; +   $zip->extractTo($tmp, "chrome/$extn-$lang.jar"); + +   if ($zip2->open($zipin="$tmp/chrome/$extn-$lang.jar")!==true) { +      die("*** Can't read $zipin\n"); +   } +   if ($zip3->open($zipout="$output/chrome/$extn-$lang.jar", ZIPARCHIVE::CREATE)!==true) { +      die("*** Can't write $zipout=\n"); +   } + +   for ($j=0 ; $j <$zip2->numFiles; $j++) { +      $file=$zip2->statIndex($j); + +      $zip2->extractTo($tmp, $file['name']); +      if (preg_match('/.dtd$/', $file['name'])) { +         $sub = basename(dirname($file['name'])); +         if (is_file("$ref/".basename($file['name']))) { +            FixDtd("$tmp/".$file['name'], "$ref/".basename($file['name'])); +         } else if (is_file("$ref/$sub/".basename($file['name']))) { +            FixDtd("$tmp/".$file['name'], "$ref/$sub/".basename($file['name'])); +         } else { +            echo "\tSkip check of $tmp/".$file['name']." ($sub)\n"; +         } + +      } else if (preg_match('/.properties$/', $file['name'])) { +         $sub = basename(dirname($file['name'])); +         if (is_file("$ref/".basename($file['name']))) { +            FixProp("$tmp/".$file['name'], "$ref/".basename($file['name'])); +         } else if (is_file("$ref/$sub/".basename($file['name']))) { +            FixProp("$tmp/".$file['name'], "$ref/$sub/".basename($file['name'])); +         } else if (basename($file['name'])=='wcap.properties') { +            FixProp("$tmp/".$file['name'], "$ref/providers/wcap/".basename($file['name'])); +         } else if (basename($file['name'])=='timezones.properties') { +            FixProp("$tmp/".$file['name'], "$ref/../calendar/".basename($file['name'])); +         } else { +            echo "\tSkip check of $tmp/".$file['name']." ($sub)\n"; +         } +      } else { +         if ($debug) echo "Copy  $tmp/".$file['name']."\n"; +      } + +      if ($zip3->addFile("$tmp/".$file['name'], $file['name'])) { +         if ($debug) echo "\tAdd "."$tmp/".$file['name']." in $zipout\n"; +      } else { +         die ("*** Can't add ".$file['name']." in $zipout\n"); +      } +      $base = dirname($file['name']); +   } +   fputs($ficman, "locale\t$extn\t$lang\tjar:chrome/$extn-$lang.jar!/$base/\n"); +   $zip2->close(); +   $zip3->close(); +} +fclose($ficman); +?> diff --git a/sunbird.spec b/sunbird.spec index 5dc4ff1..d87844b 100644 --- a/sunbird.spec +++ b/sunbird.spec @@ -15,7 +15,7 @@  %define version_internal 1.0b2  %define progdir %{_libdir}/%{name}-%{version_internal}pre  %define thunderbird_internal 3.1 -%define thunderbird_version  3.1.1 +%define thunderbird_version  3.1.2  %define libnotify_version 0.4  %define thundir %{_libdir}/thunderbird-%{thunderbird_internal} @@ -25,7 +25,7 @@  Name:           sunbird  Version:        1.0 -Release:        0.27%{?dist} +Release:        0.28%{?dist}  Summary:        Calendar application built upon Mozilla toolkit  Group:          Applications/Productivity @@ -317,6 +317,10 @@ fi  %changelog +* Fri Aug 06 2010 Remi Collet <rpms@famillecollet.com> 1.0-0.28 +- Rebuild against Thunderbird 3.1.2 +- add fixlang.php +  * Wed Jul 21 2010 Remi Collet <rpms@famillecollet.com> 1.0-0.27  - Rebuild against Thunderbird 3.1.1 diff --git a/testfixlang.sh b/testfixlang.sh new file mode 100755 index 0000000..54aa36d --- /dev/null +++ b/testfixlang.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +set -x  + +if [ ! -d /tmp/comm-1.9.2 ]; then +	tar xjf thunderbird-3.1.2.source.tar.bz2 -C /tmp && echo Sources extracted +fi + +DIR=/tmp/testfixlang +rm -rf $DIR +mkdir -p $DIR/chrome + +touch $DIR/gdata.mani + +php ./fixlang.php \ +    --xpi=gdata-provider.xpi \ +    --gdata-provider=/tmp/comm-1.9.2/calendar/locales/en-US/chrome/calendar/providers/gdata \ +    --manifest=/tmp/testfixlang/gdata.mani \ +    --output=$DIR \ +    --debug=0 + +touch $DIR/lightning.mani + +php ./fixlang.php \ +    --xpi=lightning.xpi \ +    --lightning=/tmp/comm-1.9.2/calendar/locales/en-US/chrome/lightning \ +    --calendar=/tmp/comm-1.9.2/calendar/locales/en-US/chrome/calendar \ +    --manifest=/tmp/testfixlang/lightning.mani \ +    --output=$DIR \ +    --debug=0 +  | 
