# Aap recipe for Scottish Gaelic Vim spell files.

# Use a freshly compiled Vim if it exists.
@if os.path.exists('../../../src/vim'):
    VIM = ../../../src/vim
@else:
    :progsearch VIM vim

SPELLDIR = ..
FILES    = gd_GB.aff gd_GB.dic

all: $SPELLDIR/gd.latin1.spl $SPELLDIR/gd.utf-8.spl ../README_gd.txt

$SPELLDIR/gd.latin1.spl : $FILES
        :sys env LANG=gd_GB.ISO8859-1
		$VIM -u NONE -e -c "mkspell! $SPELLDIR/gd gd_GB" -c q

$SPELLDIR/gd.utf-8.spl : $FILES
        :sys $VIM -u NONE -e -c "set enc=utf-8" -c "mkspell! $SPELLDIR/gd gd_GB" -c q

../README_gd.txt : README_gd_GB.txt
        :copy $source $target

#
# Fetching the files from OpenOffice.org.
#
OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
:attr {fetch = $OODIR/%file%} gd_GB.zip

# The files don't depend on the .zip file so that we can delete it.
# Only download the zip file if the targets don't exist.
gd_GB.aff gd_GB.dic: {buildcheck=}
        :assertpkg unzip patch
        :fetch gd_GB.zip
        :sys $UNZIP gd_GB.zip
        :delete gd_GB.zip
        @if not os.path.exists('gd_GB.orig.aff'):
            :copy gd_GB.aff gd_GB.orig.aff
        @if not os.path.exists('gd_GB.orig.dic'):
            :copy gd_GB.dic gd_GB.orig.dic
        @if os.path.exists('gd_GB.diff'):
            :sys patch <gd_GB.diff


# Generate diff files, so that others can get the OpenOffice files and apply
# the diffs to get the Vim versions.

diff:
        :assertpkg diff
        :sys {force} diff -a -C 1 gd_GB.orig.aff gd_GB.aff >gd_GB.diff
        :sys {force} diff -a -C 1 gd_GB.orig.dic gd_GB.dic >>gd_GB.diff


# Check for updated OpenOffice spell files.  When there are changes the
# ".new.aff" and ".new.dic" files are left behind for manual inspection.

check:
        :assertpkg unzip diff
        :fetch gd_GB.zip
        :mkdir tmp
        :cd tmp
        @try:
            @import stat
            :sys $UNZIP ../gd_GB.zip
            :sys {force} diff ../gd_GB.orig.aff gd_GB.aff >d
            @if os.stat('d')[stat.ST_SIZE] > 0:
                :copy gd_GB.aff ../gd_GB.new.aff
            :sys {force} diff ../gd_GB.orig.dic gd_GB.dic >d
            @if os.stat('d')[stat.ST_SIZE] > 0:
                :copy gd_GB.dic ../gd_GB.new.dic
        @finally:
            :cd ..
            :delete {r}{f}{q} tmp
            :delete gd_GB.zip


# vim: set sts=4 sw=4 :
