File update.sh of Package myspell-dictionaries

#!/bin/bash
# DOWNLOAD='no' when improving this script or spec.in
DOWNLOAD='yes'
GIT_DIR='dictionaries'
VERBOSE='no'

declare -A provides_map=(
["myspell-af_ZA"]="myspell-african"
["myspell-ar"]="myspell-arabic"
["myspell-be_BY"]="myspell-belarusian"
["myspell-bg_BG"]="myspell-bulgarian libreoffice-thesaurus-bg"
["myspell-bn_BD"]="myspell-bengali"
["myspell-br_FR"]="myspell-breton"
["myspell-ca"]="myspell-catalan myspell-valencian libreoffice-thesaurus-ca"
["myspell-cs_CZ"]="myspell-czech libreoffice-thesaurus-cs"
["myspell-da_DK"]="myspell-danish libreoffice-thesaurus-da"
["myspell-de"]="myspell-german myspell-nswiss myspell-austrian"
["myspell-el_GR"]="myspell-greek libreoffice-thesaurus-el"
["myspell-en"]="myspell-american myspell-australian myspell-canadian myspell-british myspell-new-zaeland myspell-south-african-english libreoffice-thesaurus-en-AU libreoffice-thesaurus-en-GB libreoffice-thesaurus-US"
["myspell-es"]="myspell-spanish myspell-mexican myspell-spanish-argentine myspell-spanish-bolivian myspell-spanish-chilean myspell-spanish-colombian myspell-spanish-costa-rican myspell-spanish-dominican myspell-spanish-ecuadorian myspell-spanish-guatemalan myspell-spanish-honduran myspell-spanish-nicaraguan myspell-spanish-panamanian myspell-spanish-paraguayan myspell-spanish-peruvian myspell-spanish-puerto-rican myspell-spanish-salvadorean myspell-spanish-uruguayan myspell-spanish-venezuelan libreoffice-thesaurus-es libreoffice-thesaurus-es-AR libreoffice-thesaurus-VE"
["myspell-et_EE"]="myspell-estonian"
["myspell-fr_FR"]="myspell-french libreoffice-thesaurus-fr"
["myspell-gd_GB"]="myspell-gaelic"
["myspell-gl"]="myspell-galician"
["myspell-gu_IN"]="myspell-gujarati"
["myspell-he_IL"]="myspell-hebrew"
["myspell-hi_IN"]="myspell-hindi"
["myspell-hr_HR"]="myspell-croatian"
["myspell-hu_HU"]="myspell-hungarian libreoffice-thesaurus-hu"
["myspell-is"]="myspell-icelandic"
["myspell-it_IT"]="myspell-italian libreoffice-thesaurus-it"
["myspell-lt_LT"]="myspell-lithuanian"
["myspell-lv_LV"]="myspell-latvian"
["myspell-nl_NL"]="myspell-dutch"
["myspell-no"]="myspell-norsk-bokmaal myspell-norsk-nynorsk"
["myspell-oc_FR"]="myspell-occitan-lengadocian"
["myspell-pl_PL"]="myspell-polish libreoffice-thesaurus-pl"
["myspell-pt_BR"]="myspell-brazilian libreoffice-thesaurus-pt"
["myspell-pt_PT"]="myspell-portuguese"
["myspell-ro"]="myspell-romanian libreoffice-thesaurus-ro"
["myspell-ru_RU"]="myspell-russian libreoffice-thesaurus-ru"
["myspell-si_LK"]="myspell-sinhala"
["myspell-sk_SK"]="myspell-slovak libreoffice-thesaurus-sk"
["myspell-sl_SI"]="myspell-slovene libreoffice-thesaurus-sl"
["myspell-sr"]="myspell-serbian-latin myspell-serbian-cyrillic"
["myspell-sv_SE"]="myspell-swedish libreoffice-thesaurus-sv"
["myspell-sw_TZ"]="myspell-kiswahili"
["myspell-th_TH"]="myspell-thai"
["myspell-uk_UA"]="myspell-ukrainian"
["myspell-vi"]="myspell-vietnamese"
["myspell-zu_ZA"]="myspell-zulu"
)

# directories under $GIT_DIR, which holds dictionaries
function directories()
{
  ls $GIT_DIR/*/dictionaries.xcu | sed -e 's:dictionaries/::' -e 's:/dictionaries.xcu::' | tr '\n' ' '
}

# create central mapping dir <-> locales <-> files
function locale_to_file_map()
{
  cd $GIT_DIR
  rm -f locale_to_file_map.txt
  for dir in $dirs; do
    cat $dir/dictionaries.xcu \
       | grep -v '<!--' \
       | grep -A1 'Locations\|Locales' \
       | grep -v '\-\-\|Locations\|Locales' \
       | sed s:%origin%:$dir:g \
       | sed 's:.*<value>\(.*\)</value>.*:\1:' \
       | while read files; do 
           read locs
           echo $dir: $locs @ $files | tr '-' '_' >> locale_to_file_map.txt
         done
  done
  # add idx files for every dat (where doesn't exist)
  # we will generate them
  sed -i '/\.idx/!s/\([^ ]*\)\.dat/\1.dat \1.idx/g' locale_to_file_map.txt
  cd ..
}

# for given dir: which locales provides
function dir_locales()
{
  dir=$1
  grep "^$dir:" $GIT_DIR/locale_to_file_map.txt | sed 's/.*: //' | sed 's/ @.*//' | tr ' ' '\n' | sort -u | tr '\n' ' '
}

# for given dir: which dictionary relevant files (dic, aff, th*, hyph*) provides
function dir_files()
{
  dir=$1
  grep "$dir:" $GIT_DIR/locale_to_file_map.txt  | sed 's:.*@ ::' | tr ' ' '\n' | sort -u | tr '\n' ' '
}

# for given dictionary file: which locales provides
function file_locales()
{
  file=$1
  # there should be only one occurence of a file in locale_to_file_map.txt
  grep $file $GIT_DIR/locale_to_file_map.txt | sed -e 's/.*: //' -e 's/@.*//'
}

# for given dir: description of the dictionary
function description()
{
  dir=$1
  grep  '<name lang="en.*">' dictionaries/$dir/description.xml | sed -e 's:.*<name lang="en.*">::' -e 's:</name>.*::' | tr '\n' ' ' | sed 's:[ \t]*$::'
}

# all thesaurus dat files
function dat_files()
{
  grep '\.dat' $GIT_DIR/locale_to_file_map.txt | sed 's:.* \([^ ]\+\.dat\).*:\1:'
}

# for dat file return corresponding idx file name
function idx_file()
{
  dat_file=$1
  grep "$dat_file" $GIT_DIR/locale_to_file_map.txt | sed 's:.* \([^ ]\+\.idx\).*:\1:'
}

#
# prepare 'dictionaries' directory
#

# download present git version, remove .git, unify layout
if [ $DOWNLOAD == "yes" ]; then 
  echo '--- Download current git version'
  rm -rf $GIT_DIR
  git clone git://anongit.freedesktop.org/libreoffice/$GIT_DIR
  rm -rf $GIT_DIR/.git
  for dir in ca gd_GB; do
    cp --force $GIT_DIR/$dir/dictionaries/* dictionaries/$dir
    sed -i 's:dictionaries/::' dictionaries/$dir/dictionaries.xcu
  done
  date=`date +%Y%m%d`
elif [ ! -e $GIT_DIR ]; then
  echo "ERROR: DOWNLOAD=$DOWNLOAD and '$GIT_DIR' does not exist"
  echo "Run quilt setup or so."
  exit 1
else
  echo "--- Do not download, using '$GIT_DIR'"
  date=`rpmspec -q --qf "%{VERSION}\n" *.spec | head -n 1`
fi

# create dir <-> locales <-> files mapping
# in $GIT_DIR/locale_to_file_map.txt
dirs=$(directories)
[ "$VERBOSE" == "yes" ] && echo directiories: $dirs
locale_to_file_map

# create *.idx files from *.dat files
echo '--- Creating idx files'
if [ ! -x /usr/bin/th_gen_idx.pl ]; then
  echo "ERROR: /usr/bin/th_gen_idx.pl not found"
  echo "Install mythes-devel package."
  exit 1
fi
for datf in $(dat_files); do
  idxf=$(idx_file $datf)
  [ "$VERBOSE" == "yes" ] && echo "th_gen_idx.pl < $GIT_DIR/$datf > $GIT_DIR/$idxf"
  th_gen_idx.pl < $GIT_DIR/$datf > $GIT_DIR/$idxf
  if [ $? -ne 0 ]; then
    echo "ERROR: failed th_gen_idx.pl -o $GIT_DIR/$idxf < $GIT_DIR/$datf"
    exit 1
  fi
done

echo '--- Creating symlinks'
# create symlinks in $GIT_DIR/$dir, e. g. es_GT -> es_ANY 
for dir in $dirs; do
  files=$(dir_files $dir)
  [ "$VERBOSE" == "yes" ] && echo "DICTIONARY: $dir ($files)"
  for file in $files; do
    locales=$(file_locales $file)
    [ "$VERBOSE" == "yes" ] && echo " $file: $locales"
    for locale in $locales; do
      fname=`basename $file`
      # work around which is bug imho in dictionaries.xcu. 
      # It references file that doesn't exist.
      if [ ! -e "$GIT_DIR/$dir/$fname" ]; then
        [ "$VERBOSE" == "yes" ] && echo "WARNING: $GIT_DIR/$dir/$f doesn't exist"
        continue;
      fi

      prefix=""
      version=""
      if [[ $fname == th* ]]; then
        # nice collision with th_ for thesaurus
        if [ "$fname" != "th_TH.aff" ] && [ "$fname" != "th_TH.dic" ]; then
          prefix="th_"
          # it seems suffix have to be _v2, even if target is named _v3 :)
          version='_v2'
        fi
      fi
      if [[ $fname == hyph* ]]; then
        prefix="hyph_"
      fi
      ext=`echo $fname | sed 's:.*\.::'`
      linkname=$prefix$locale$version.$ext

      [ "$VERBOSE" == "yes" ] && echo -n " link: $linkname -> $fname .. "

      # regular file or link for this locale/extension exist yet, 
      # do not create symlink
      if ls $GIT_DIR/$dir/$linkname &> /dev/null; then
         [ "$VERBOSE" == "yes" ] && echo "regular file or link exists yet"
        continue;
      fi

      ln -sf $fname $GIT_DIR/$dir/$linkname
       [ "$VERBOSE" == "yes" ] && echo "created"
    done
  done
done

#
# generate myspell-dictionaries.spec
#
echo '--- Generating spec file'
cp myspell-dictionaries.spec.in myspell-dictionaries.spec

sed -i "s:@DO_NOT_EDIT_COMMENT@:DO NOT EDIT THIS SPEC FILE:" myspell-dictionaries.spec
sed -i "s:@VERSION@:$date:" myspell-dictionaries.spec

for subpackage in $dirs; do
  desc=$(description $subpackage)
  sum="MySpell $subpackage Dictionary"
  dir_locs=$(dir_locales $subpackage)
  sed -i "s#@METADATA@#%package -n myspell-$subpackage\n@METADATA@#" myspell-dictionaries.spec
  sed -i "s#@METADATA@#Summary:        $sum\n@METADATA@#" myspell-dictionaries.spec
  sed -i "s#@METADATA@#Group:          Productivity/Text/Spell\n@METADATA@#" myspell-dictionaries.spec
  sed -i "s#@METADATA@#Requires:       myspell-dictionaries\n@METADATA@#" myspell-dictionaries.spec
  sed -i "s#@METADATA@#Provides:       myspell-dictionary\n@METADATA@#" myspell-dictionaries.spec
  for l in $dir_locs; do
    sed -i "s#@METADATA@#Provides:       locale(libreoffice:$l)\n@METADATA@#" myspell-dictionaries.spec
    sed -i "s#@METADATA@#Provides:       locale(seamonkey-spellchecker:$l)\n@METADATA@#" myspell-dictionaries.spec
  done
  for p in ${provides_map["myspell-$subpackage"]}; do
    sed -i "s#@METADATA@#Provides:       $p\n@METADATA@#" myspell-dictionaries.spec
  done
  sed -i "s#@METADATA@#\n@METADATA@#" myspell-dictionaries.spec
  sed -i "s#@METADATA@#%description -n myspell-$subpackage\n@METADATA@#" myspell-dictionaries.spec
  sed -i "s#@METADATA@#$desc.\n@METADATA@#" myspell-dictionaries.spec
  sed -i "s#@METADATA@#\n@METADATA@#" myspell-dictionaries.spec
done
sed -i "s:@METADATA@::" myspell-dictionaries.spec

sed -i "s:@LANG_DIRS@:$dirs:" myspell-dictionaries.spec	

for subpackage in $dirs; do
  sed -i "s:@FILES@:%files -n myspell-$subpackage -f $subpackage.list\n@FILES@:" myspell-dictionaries.spec
  sed -i "s:@FILES@:\n@FILES@:" myspell-dictionaries.spec
done
sed -i "s:@FILES@::" myspell-dictionaries.spec

#
# creating source archive
#
if [ $DOWNLOAD == "yes" ]; then
  echo '--- Creating archive'
  tar cJf dictionaries.tar.xz dictionaries
  rm -r dictionaries
fi

echo --- Done

#
# advice at the end ..
#
echo
echo With osc diff, figure out if there is a new package. 
echo If yes, add its license in License: tag of both 
echo *.spec and *.spec.in
echo if this license is not there yet.
echo
openSUSE Build Service is sponsored by