diff options
Diffstat (limited to 'Master/bin/x86_64-linux/getnonfreefonts')
-rwxr-xr-x | Master/bin/x86_64-linux/getnonfreefonts | 426 |
1 files changed, 274 insertions, 152 deletions
diff --git a/Master/bin/x86_64-linux/getnonfreefonts b/Master/bin/x86_64-linux/getnonfreefonts index 21dd7a0fff8..f91af05f4f5 100755 --- a/Master/bin/x86_64-linux/getnonfreefonts +++ b/Master/bin/x86_64-linux/getnonfreefonts @@ -1,7 +1,7 @@ -#!/bin/sh +#!/usr/bin/env perl ## getnonfreefonts -## Copyright 2005 Reinhard Kotucha <reinhard.kotucha@web.de> +## Copyright 2006 Reinhard Kotucha <reinhard.kotucha@web.de> # # This work may be distributed and/or modified under the # conditions of the LaTeX Project Public License, either version 1.3 @@ -11,156 +11,278 @@ # # The current maintainer is Reinhard Kotucha. +my $TL_version='2006'; -# invoke the right shell (code from Thomas Esser): -test -f /bin/ksh && test -z "$RUNNING_KSH" \ - && { UNAMES=`uname -s`; test "x$UNAMES" = xULTRIX; } 2>/dev/null \ - && { RUNNING_KSH=true; export RUNNING_KSH; exec /bin/ksh $0 ${1+"$@"}; } -unset RUNNING_KSH - -test -f /bin/bsh && test -z "$RUNNING_BSH" \ - && { UNAMES=`uname -s`; test "x$UNAMES" = xAIX; } 2>/dev/null \ - && { RUNNING_BSH=true; export RUNNING_BSH; exec /bin/bsh $0 ${1+"$@"}; } -unset RUNNING_BSH - - -URL="${URL-ftp://tug.org/tex/getnonfreefonts/getfont}" - -die () { echo "$1." 1>&2; exit 1; } - -OLDIFS=$IFS -IFS=: -BINDIRS=`echo $PATH` -IFS=$OLDIFS - -for BINDIR in $BINDIRS; do - if test "$BINDIR" != "."; then - for FTP_CLIENT in wget lftp ncftpget curl snarf gftp; do - test -x $BINDIR/$FTP_CLIENT && FTP=$FTP_CLIENT && break - done - fi -done - -test -n "$FTP" || die "No ftp client found" - -export FTP - -case $0 in - *-sys) SYS=true; GETFONT=getfont-sys;; - *) SYS=false; GETFONT=getfont;; -esac -export SYS GETFONT - -ALL=true -RUNSHELL=false - -ARGS_FROM_GETNONFREEFONTS="$@" -export ARGS_FROM_GETNONFREEFONTS - -for ARG in "$@"; do - case $ARG in - -*) - case $ARG in - -shell|--shell) RUNSHELL=true;; - -ftp-client=*|--ftp-client=*) - FTP=`echo "$ARG" | sed 's/.*=//'`;; - -url=*|--url=*) - URL=`echo "$ARG" | sed 's/.*=//'`;; - -h|-help|--help) ALL=false;; - esac;; - *) ALL=false;; - esac -done - -export URL - -tmpdir=${TMPDIR-${TEMP-${TMP-/tmp}}}/getnonfreefonts.$$ -(umask 077; mkdir "${tmpdir}") || die "Can't mkdir ${tmpdir}" -trap 'rm -rf ${tmpdir}' 0 1 2 3 7 13 15 - -download () { - echo "Downloading: $1" - case ${FTP} in - wget) wget "$1" || die "$1: Download failed";; - lftp) lftp -c "get $1" || die "$1: Download failed";; - ncftpget) ncftpget "$1" || die "$1: Download failed";; - curl) curl -O "$1" || die "$1: Download failed";; - snarf) snarf "$1" || die "$1: Download failed";; - gftp) gftp -d "$1" || die "$1: Download failed";; - *) die "This can't happen";; - esac +my $getfont_url="ftp://tug.org/tex/getnonfreefonts/getfont$TL_version"; + +use File::Copy; +use Getopt::Long; +$Getopt::Long::autoabbrev=0; + +$opt_lsfonts=0; +$opt_force=0; + +sub usage { + print <<'EOF'; +Usage: + getnonfreefonts[-sys] [-a|--all] [-f|--force] [-l|--lsfonts] + [-v|--verbose] [font1] [font2] ... + + getnonfreefonts installs fonts in $TEXMFHOME. + getnonfreefonts-sys installs fonts in $TEXMFLOCAL. + + Options: + -a|--all Install all fonts. + + -d|--debug Provide additional messages for debugging. + + -f|--force Install fonts even if they are installed already. + + -h|--help Print this message. + + -l|--lsfonts List all fonts available. + + -v|--verbose Be more verbose. + +EOF +; +} + +unless (@ARGV) { + usage; + exit 1; +} + +GetOptions + "all|a", + "debug|d", + "force|f", + "help|h", + "lsfonts|l", + "verbose|v", + "version", + "sys"; + +$^W=1 if $opt_debug; + +my $sys=($0=~/-sys$/)? 1:0; +$sys=1 if $opt_sys; + +@allpackages=@ARGV; + +sub message { + my $message=shift; + if ($message=~/^\[/) { + print "$message\n"; + } else { + printf "%-60s", $message; + } +} + + +sub debug_msg { + my $message=shift; + if ($opt_debug) { + print STDERR "DEBUG: $message.\n"; + } } -cd "${tmpdir}" || die "Can't cd ${tmpdir}" - -echo ------------------------------------------------------- -echo "FTP client: ${FTP}" -echo "Temporary dir: ${tmpdir}" -echo "URL: ${URL}" -echo ------------------------------------------------------- - -download ${URL} - -chmod 700 getfont -ln -s getfont getfont-sys -PATH=${tmpdir}:${PATH} -export PATH - -UPDMAP_NEEDED=false - -if ${RUNSHELL}; then - if ${SYS}; then - PS1='[getfont-sys]\$ ' - else - PS1='[getfont]\$ ' - fi - export PS1 - echo ------------------------------------------------------- - echo "FTP client: ${FTP}" - echo "Temporary dir: ${tmpdir}" - echo "URL: ${URL}" - echo "SYS: ${SYS}" - echo "ARGS: ${ARGS_FROM_GETNONFREEFONTS}" - echo ------------------------------------------------------- - echo "Run program \"getfont\" or \"getfont-sys\" for each font you want to install." - echo; echo "Supported fonts are:" - for f in `getfont --lsfonts`; do - echo " $f" - done - echo; echo "Type \"getfont --help\" for more information." - echo "Type \"exit\" to leave this shell."; echo - -# Start the shell. We start a shell even if someone has -# SHELL=/sbin/shutdown in his environment. - - test -z ${SHELL} || SHELL="/bin/sh" - case ${SHELL} in - /bin/bash) /bin/bash;; - /bin/ksh) /bin/ksh;; - /bin/ksh) /bin/ksh;; - *) /bin/sh;; - esac - - echo "Please run \"updmap\" or \"updmap-sys\" now if necessary." -else # no shell - if ${ALL} ; then - for font in `getfont --lsfonts`; do - ${GETFONT} ${ARGS_FROM_GETNONFREEFONTS} ${font} && UPDMAP_NEEDED=true - done - else - ${GETFONT} ${ARGS_FROM_GETNONFREEFONTS} && UPDMAP_NEEDED=true - fi - - if ${UPDMAP_NEEDED}; then - if ${SYS}; then - updmap-sys - else - updmap - fi - fi -fi - -cd / -rm -rf "${tmpdir}" - -exit 0 + +sub expand_var { + my $var=shift; + + if (-d "/usr/bin") { + open KPSEWHICH, 'kpsewhich --expand-var=\$' . "$var |"; + } else { + open KPSEWHICH, 'kpsewhich --expand-var=$' . "$var |"; + } + while (<KPSEWHICH>) { + chop; + return $_; + } + close KPSEWHICH; +} + + + +# get TMP|TEMP|TMPDIR environment variable + +if ($opt_debug) { + for my $var ("TMP","TEMP","TMPDIR") { + if (defined $ENV{$var}) { + debug_msg "Environment variable $var='$ENV{$var}'"; + } else { + debug_msg "Environment variable $var not set"; + } + } +} + +print "$TL_version\n" and exit 0 if $opt_version; + + +if (defined $ENV{'TMP'}) { + $SYSTMP="$ENV{'TMP'}"; +} elsif (defined $ENV{'TEMP'}) { + $SYSTMP="$ENV{'TEMP'}"; +} elsif (defined $ENV{'TMPDIR'}) { + $SYSTMP="$ENV{'TMPDIR'}"; +} else { + $SYSTMP="/tmp"; +} + +debug_msg "Internal variable SYSTMP set to '$SYSTMP'"; + +# Windows usually uses backslashes though forward slashes are probably +# allowed. Perl always needs forward slashes. + +# We convert backslashes to forward slashes if it looks like a Windows +# directory. +$SYSTMP=~s/\\/\//g if ($SYSTMP=~/^.:\\/); # c:\abc\def +$SYSTMP=~s/\\/\//g if ($SYSTMP=~/^\\\\/); # \\abc\def + +debug_msg "Internal variable SYSTMP converted to '$SYSTMP'"; + +die "! ERROR: The temporary directory '$SYSTMP' doesn't exist.\n" + unless (-d "$SYSTMP"); + +die "! ERROR: The temporary directory '$SYSTMP' is not writable.\n" + unless (-w "$SYSTMP"); + + +# Determine INSTALLROOT. + +if ($opt_debug) { + my @path=split ':', $ENV{PATH}; + for my $dir (@path) { + debug_msg "Search for kpsewhich in '$dir'"; + opendir DIR, "$dir"; + my @kpsewichs=grep /^kpsewhich/, readdir DIR; + closedir DIR; + for (@kpsewichs) { + debug_msg "Found $dir/$_" if /^kpsewhich/; + } + } +} + + +if ($sys) { + $INSTALLROOT=expand_var 'TEXMFLOCAL'; +} else { + $INSTALLROOT=expand_var 'TEXMFHOME'; +} + +($sys)? debug_msg "sys=true":debug_msg "sys=false"; + +debug_msg "INSTALLROOT='$INSTALLROOT'"; + +$INSTALLROOT=~s/\\/\//g if ($INSTALLROOT=~/^.:\\/); # c:\abc\def +$INSTALLROOT=~s/\\/\//g if ($INSTALLROOT=~/^\\\\/); # \\abc\def + +debug_msg "Internal variable INSTALLROOT converted to '$INSTALLROOT'"; + +die "! ERROR: The install directory '$INSTALLROOT' doesn't exist.\n" + unless (-d "$INSTALLROOT"); + +die "! ERROR: The install directory '$INSTALLROOT' is not writable.\n" + unless (-w "$INSTALLROOT"); + + +if ($opt_help) { + print "\nThis is getnonfreefonts"; + print '-sys' if ($sys); + print ", version $TL_version.\n\n"; + + usage; + print <<"ENDUSAGE"; + Directories: + temporary: '$SYSTMP/getfont-<PID>' + install: '$INSTALLROOT' + +ENDUSAGE +exit 0; +} + + +my $tmpdir="$SYSTMP/getfont-$$"; +debug_msg "Internal variable tmpdir set to '$tmpdir'"; + +mkdir "$tmpdir" or die "! ERROR: Can't mkdir '$tmpdir'."; +chdir "$tmpdir" or die "! ERROR: Can't cd '$tmpdir'."; + +sub remove_tmpdir { + chdir "$SYSTMP" or die "! ERROR: Can't cd '$SYSTMP'.\n"; + opendir TMPDIR, "$tmpdir" + or print "! ERROR: Can't read directory '$tmpdir'.\n"; + + @alltmps=readdir TMPDIR; + closedir TMPDIR; + + foreach $file (@alltmps) { + next if $file=~/^\./; + unlink "$tmpdir/$file"; + } + rmdir "$tmpdir" or die "! ERROR: Can't remove directory '$tmpdir'.\n"; +} + +# Signal handlers for UNIX, maybe ignored by Windows. + +$SIG{INT} =\&remove_tmpdir; +$SIG{QUIT}=\&remove_tmpdir; +$SIG{BUS} =\&remove_tmpdir; +$SIG{PIPE}=\&remove_tmpdir; +$SIG{TERM}=\&remove_tmpdir; +$SIG{ABRT}=\&remove_tmpdir; +$SIG{SEGV}=\&remove_tmpdir; + +# Download the script from tug.org. + +debug_msg "Running 'wget $getfont_url'"; + +system ('wget', "$getfont_url"); + +# Download the fonts. + +my @getfont=('perl', "./getfont$TL_version", '--getnonfreefonts'); +push @getfont, "--installroot=$INSTALLROOT"; +push @getfont, '--lsfonts' if $opt_lsfonts; +push @getfont, '--force' if $opt_force; +push @getfont, '--debug' if $opt_debug; +push @getfont, '--verbose' if $opt_verbose; +push @getfont, '--sys' if $sys; +push @getfont, '--all' if $opt_all; +push @getfont, @allpackages; + +debug_msg "Running '@getfont'"; + +system @getfont; + +# Evaluate the exit status. It will be 2 if something had been +# installed and in this case we need to run texhash/updmap. + +my $exit_code=$?; +my $exit_status=int($exit_code/256); + +if ($sys) { + debug_msg "Info: Execute updmap-sys if exit status is 2"; +} else { + debug_msg "Info: Execute updmap if exit status is 2"; +} + +debug_msg "Exit status of getfont$TL_version is $exit_status"; + +if ($exit_status==2) { + print "\n"; + system 'texhash', "$INSTALLROOT"; + $updmap_command=($sys)? 'updmap-sys':'updmap'; + @updmap=("$updmap_command"); + push @updmap, '--quiet' unless $opt_verbose; + print "\n"; + message "Updating map files ($updmap_command)..."; + system @updmap; + + message $?? '[failed]':'[done]'; +} + +remove_tmpdir; + +__END__ |