2012-08-23 07:20:49 +02:00
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
2012-08-26 02:44:51 +02:00
import shutil
2012-08-23 07:20:49 +02:00
import sys
from subprocess import Popen , PIPE
2012-08-23 18:22:54 +02:00
2012-08-27 00:59:03 +02:00
PONYSAY_VERSION = ' 2.5-rc1 '
2012-08-23 18:22:54 +02:00
2012-08-26 02:44:51 +02:00
manpages = [ ( ' en ' , ' English ' ) , # must be first
( ' es ' , ' Spanish ' ) ]
2012-08-25 21:47:53 +02:00
2012-08-26 02:44:51 +02:00
sharedirs = [ ( ' ponies ' , ' xterm ponies ' , ' PONYDIR ' ) , # must be first
( ' ttyponies ' , ' tty ponies ' , ' TTYPONYDIR ' ) ,
( ' extraponies ' , ' extra xterm ponies ' , ' XPONYDIR ' ) ,
( ' extrattyponies ' , ' extra tty ponies ' , ' XTTYPONYDIR ' ) ,
( ' quotes ' , ' pony quotes ' , ' QUOTEDIR ' ) ,
( ' balloons ' , ' balloon styles ' , ' BALLOONDIR ' ) ]
2012-08-25 21:47:53 +02:00
2012-08-25 23:05:14 +02:00
sharefiles = [ ( ' ucs ' , ' ucsmap ' ) ]
2012-08-26 02:44:51 +02:00
2012-08-25 23:05:14 +02:00
commands = [ ' ponysay ' , ' ponythink ' ]
2012-08-26 02:44:51 +02:00
2012-08-25 23:05:14 +02:00
shells = [ ( ' bash ' , ' /usr/share/bash-completion/completions/ponysay ' , ' GNU Bash ' ) ,
2012-08-25 21:47:53 +02:00
( ' fish ' , ' /usr/share/fish/completions/ponysay.fish ' , ' Friendly interactive shell ' ) ,
2012-08-25 23:05:14 +02:00
( ' zsh ' , ' /usr/share/zsh/site-functions/_ponysay ' , ' zsh ' ) ]
2012-08-26 02:44:51 +02:00
mansections = [ ( ' ponysay ' , ' 6 ' ) ,
( ' cowsay ' , ' 1 ' ) ,
( ' fortune ' , ' 6 ' ) ]
2012-08-25 21:47:53 +02:00
2012-08-26 04:30:57 +02:00
miscfiles = [ ( ' COPYING ' , ' /usr/share/licenses/ponysay/COPYING ' ) ,
( ' CREDITS ' , ' /usr/share/licenses/ponysay/CREDITS ' ) ]
2012-08-25 21:47:53 +02:00
2012-08-26 04:22:14 +02:00
COPY = ' copy '
HARD = ' hard '
SYMBOLIC = ' symbolic '
2012-08-23 07:20:49 +02:00
class Setup ( ) :
def __init__ ( self ) :
usage_script = ' \033 [34;1msetup.py \033 [21;39m '
2012-08-23 18:22:54 +02:00
usage_help = ' (version | help) '
2012-08-26 07:09:39 +02:00
usage_proc = ' [ \033 [4mconfigurations \033 [24m] ([build] | prebuilt | install | (uninstall|clean)[-old] | view) '
2012-08-23 07:20:49 +02:00
usage = ' %s %s \n %s %s ' % ( usage_script , usage_help , usage_script , usage_proc )
usage = usage . replace ( ' \033 [ ' , ' \0 ' )
for sym in ( ' [ ' , ' ] ' , ' ( ' , ' ) ' , ' | ' , ' ... ' ) :
usage = usage . replace ( sym , ' \033 [2m ' + sym + ' \033 [22m ' )
usage = usage . replace ( ' \0 ' , ' \033 [ ' )
opts = ArgParser ( program = ' setup.py ' ,
description = ' installer for ponysay ' ,
usage = usage )
2012-08-25 21:47:53 +02:00
2012-08-23 18:22:54 +02:00
opts . add_argumentless ( alternatives = [ ' --help ' ] )
opts . add_argumentless ( alternatives = [ ' --version ' ] )
2012-08-23 07:20:49 +02:00
opts . add_argumentless ( help = ' Install everything that is not explicity excluded ' , alternatives = [ ' --everything ' , ' --with-everything ' ] )
2012-08-25 21:26:35 +02:00
opts . add_argumentless ( help = ' Install only the essentials \n Note that this can vary depending on version ' , alternatives = [ ' --minimal ' ] )
2012-08-26 17:32:48 +02:00
opts . add_argumentless ( help = ' Install nothing (except legal documents) that is not explicity included ' , alternatives = [ ' --nothing ' , ' --with-nothing ' ] )
2012-08-23 18:22:54 +02:00
2012-08-25 21:47:53 +02:00
for command in commands :
2012-08-25 23:41:43 +02:00
opts . add_argumentless ( help = ' Do not install the %s command ' % ( command ) , alternatives = [ ' --without- ' + command ] )
opts . add_argumented ( help = ' Install the %s command, and set file name \n Defualt = /usr/bin/ %s ' % ( command , command ) , alternatives = [ ' --with- ' + command ] , arg = ' EXEC ' )
2012-08-23 07:20:49 +02:00
opts . add_argumentless ( help = ' Do not install a user shared cache ' , alternatives = [ ' --without-shared-cache ' ] )
opts . add_argumented ( help = ' Install a user shared cache at CACHEDIR \n Default = /var/cache/ponysay ' , alternatives = [ ' --with-shared-cache ' ] , arg = ' CACHEDIR ' )
2012-08-25 21:47:53 +02:00
for shell in shells :
opts . add_argumentless ( help = ' Do not install completion for ' + shell [ 2 ] , alternatives = [ ' --without- ' + shell [ 0 ] ] )
opts . add_argumented ( help = ' Set file name for the completion for ponysay in ' + shell [ 2 ] , alternatives = [ ' --with- ' + shell [ 0 ] ] , arg = ' PONYSAY_ %s _FILE ' % ( shell [ 0 ] . upper ( ) ) )
2012-08-25 23:05:14 +02:00
opts . add_argumentless ( help = ' Only install explicitly included shell completions ' , alternatives = [ ' --without-shell ' ] )
opts . add_argumented ( help = ' Set share/ directory used for shell completions \n Default = $SHAREDIR ' , alternatives = [ ' --with-shell ' ] , arg = ' SHAREDIR ' )
2012-08-23 07:20:49 +02:00
opts . add_argumentless ( help = ' Do not install PDF manual \n Default ' , alternatives = [ ' --without-pdf ' ] )
opts . add_argumented ( help = ' Set directory for PDF manual \n Default = $PREFIX/doc ' , alternatives = [ ' --with-pdf ' ] , arg = ' DOCDIR ' )
opts . add_argumentless ( help = ' Do not compress PDF manual \n Default ' , alternatives = [ ' --without-pdf-compression ' ] )
opts . add_argumented ( help = ' Select compression for PDF manual \n Default = gz, xz is also recognised ' , alternatives = [ ' --with-pdf-compression ' ] , arg = ' COMPRESSION ' )
opts . add_argumentless ( help = ' Do not install info manual ' , alternatives = [ ' --without-info ' ] )
opts . add_argumented ( help = ' Set directory for info manual \n Default = $SHARE/info ' , alternatives = [ ' --with-info ' ] , arg = ' INFODIR ' )
opts . add_argumentless ( help = ' Do not use install-info when installing info manual ' , alternatives = [ ' --without-info-install ' ] )
2012-08-26 17:32:48 +02:00
opts . add_argumented ( help = ' Use install-info when installing info manual, and set description \n Default ' , alternatives = [ ' --with-info-install ' ] , arg = ' DESCRIPTION ' )
2012-08-23 07:20:49 +02:00
opts . add_argumentless ( help = ' Do not compress info manual ' , alternatives = [ ' --without-info-compression ' ] )
opts . add_argumented ( help = ' Select compression for info manual \n Default = gz, xz is also recognised ' , alternatives = [ ' --with-info-compression ' ] , arg = ' COMPRESSION ' )
2012-08-25 21:47:53 +02:00
for man in manpages :
opts . add_argumentless ( help = ' Do not install %s manpage manual ' % ( man [ 1 ] ) , alternatives = [ ' --without-man- ' + man [ 0 ] ] )
opts . add_argumented ( help = ' Set directory for %s manpage \n Default = $SHARE/man ' % ( man [ 1 ] ) , alternatives = [ ' --with-man- ' + man [ 0 ] ] , arg = ' MANDIR ' )
2012-08-23 07:20:49 +02:00
opts . add_argumentless ( help = ' Do not install any manpages ' , alternatives = [ ' --without-man ' ] )
opts . add_argumented ( help = ' Set directory for all man pages \n Default = $SHARE/man ' , alternatives = [ ' --with-man ' ] , arg = ' MANDIR ' )
2012-08-25 21:47:53 +02:00
for man in manpages :
opts . add_argumentless ( help = ' Do not compress %s manpage ' % ( man [ 1 ] ) , alternatives = [ ' --without-man- %s -compression ' % ( man [ 0 ] ) ] )
opts . add_argumented ( help = ' Select compression for %s manpage \n Default = gz, xz is also recognised ' % ( man [ 1 ] ) ,
alternatives = [ ' --with-man- %s -compression ' % ( man [ 0 ] ) ] , arg = ' COMPRESSION ' )
2012-08-23 07:20:49 +02:00
opts . add_argumentless ( help = ' Do not compress any installed manpage ' , alternatives = [ ' --without-man-compression ' ] )
opts . add_argumented ( help = ' Select compression for installed manpages \n Default = gz, xz is also recognised ' , alternatives = [ ' --with-man-compression ' ] , arg = ' COMPRESSION ' )
2012-08-25 21:47:53 +02:00
for man in mansections :
opts . add_argumented ( help = ' Change the section for the %s manpage \n Default = %s ' % man , alternatives = [ ' --man-section- ' + man [ 0 ] ] , arg = ' SECTION ' )
for dir in sharedirs :
opts . add_argumentless ( help = ' Do not install ' + dir [ 0 ] , alternatives = [ ' --without- ' + dir [ 0 ] ] )
opts . add_argumented ( help = ' Set directory for %s \n Default = $SHAREDIR/ponysay/ %s ' % ( dir [ 1 ] , dir [ 0 ] ) , alternatives = [ ' --with- ' + dir [ 0 ] ] , arg = dir [ 2 ] )
2012-08-23 07:20:49 +02:00
opts . add_argumentless ( help = ' Do not install UCS pony name map ' , alternatives = [ ' --without-ucs ' ] )
opts . add_argumented ( help = ' Set file for the UCS pony name map \n Default = $SHAREDIR/ponysay/ucsmap ' , alternatives = [ ' --with-ucs ' ] , arg = ' UCSFILE ' )
2012-08-26 17:32:48 +02:00
opts . add_argumentless ( help = ' Let the installer set the env name for python in ponysay \n Default ' , alternatives = [ ' --without-custom-env-python ' ] )
opts . add_argumented ( help = ' Set the env name for python in ponysay ' , alternatives = [ ' --with-custom-env-python ' ] , arg = ' PYTHON ' )
opts . add_argumented ( help = ' Set a prefix to all implicit directories \n Default = /usr ' , alternatives = [ ' --prefix ' ] , arg = ' PREFIX ' )
opts . add_argumentless ( help = ' Change all implicit configurations to fit local user a installation for the current user ' , alternatives = [ ' --private ' ] )
opts . add_argumentless ( help = ' Change all implicit directories to fit installation to /opt ' , alternatives = [ ' --opt ' ] )
opts . add_argumented ( help = ' Set the system \' s directory for command executables \n Default = $PREFIX/bin ' , alternatives = [ ' --bin-dir ' ] , arg = ' BINDIR ' )
opts . add_argumented ( help = ' Set the system \' s directory for non-command executables \n Default = $PREFIX/lib/ponysay \n Not used. ' , alternatives = [ ' --lib-dir ' ] , arg = ' LIBDIR ' )
opts . add_argumented ( help = ' Set the system \' s directory for resource files \n Default = $PREFIX/share ' , alternatives = [ ' --share-dir ' ] , arg = ' SHAREDIR ' )
opts . add_argumented ( help = ' Set the system \' s directory for cache directories \n Default = /var/cache ' , alternatives = [ ' --cache-dir ' ] , arg = ' CACHEDIR ' )
2012-08-23 07:20:49 +02:00
2012-08-26 17:32:48 +02:00
opts . add_argumented ( help = ' Set off environment for installation \n Empty by default ' , alternatives = [ ' --dest-dir ' ] , arg = ' DESTDIR ' )
2012-08-23 18:22:54 +02:00
2012-08-27 01:47:58 +02:00
opts . add_argumented ( help = ' Set how to link identical files \n Default = symbolic, copy and hard are also recognised ' , alternatives = [ ' --linking ' ] , arg = ' TYPE ' )
2012-08-26 04:22:14 +02:00
2012-08-25 21:47:53 +02:00
2012-08-23 07:20:49 +02:00
opts . parse ( )
2012-08-23 18:22:54 +02:00
2012-08-25 21:47:53 +02:00
2012-08-27 01:47:58 +02:00
self . linking = SYMBOLIC
2012-08-26 04:22:14 +02:00
if opts . opts [ ' --linking ' ] is not None :
self . linking = opts . opts [ ' --linking ' ] [ 0 ]
2012-08-25 21:47:53 +02:00
if ( len ( opts . files ) > 1 ) or ( opts . opts [ ' --help ' ] is not None ) or ( ( len ( opts . files ) == 1 ) and ( opts . files [ 0 ] == ' help ' ) ) :
2012-08-23 18:22:54 +02:00
opts . help ( )
elif ( opts . opts [ ' --version ' ] is not None ) or ( ( len ( opts . files ) == 1 ) and ( opts . files [ 0 ] == ' version ' ) ) :
print ( ' Ponysay %s installer ' % ( PONYSAY_VERSION ) )
else :
if len ( opts . files ) == 0 :
opts . files = [ ' build ' ]
method = opts . files [ 0 ]
2012-08-26 00:50:35 +02:00
if method == ' clean ' : self . clean ( )
elif method == ' clean-old ' : self . cleanOld ( )
2012-08-26 00:17:58 +02:00
else :
conf = self . configure ( opts . opts )
self . viewconf ( conf )
2012-08-26 00:50:35 +02:00
if method == ' build ' : self . build ( conf )
elif method == ' prebuilt ' : self . install ( conf )
elif method == ' install ' : self . build ( conf ) ; self . install ( conf ) ; self . clean ( )
elif method == ' uninstall ' : self . uninstall ( conf )
elif method == ' uninstall-old ' : self . uninstallOld ( conf )
2012-08-26 07:09:39 +02:00
elif not method == ' view ' :
2012-08-26 00:17:58 +02:00
opts . help ( )
2012-08-25 23:05:14 +02:00
'''
Display configurations
'''
def viewconf ( self , conf ) :
RED = ' \033 [31m %s \033 [39m '
GREEN = ' %s \033 [32m %s \033 [39m '
YELLOW = ' \033 [33m %s \033 [39m '
for command in commands :
2012-08-26 02:44:51 +02:00
if conf [ command ] is not None : print ( GREEN % ( ' Installing command ' + command + ' as ' , conf [ command ] ) )
2012-08-25 23:05:14 +02:00
else : print ( RED % ( ' Skipping installion of command ' + command ) )
if conf [ ' shared-cache ' ] is not None : print ( GREEN % ( ' Installing shared cache at ' , conf [ ' shared-cache ' ] ) )
else : print ( RED % ( ' Skipping installation of shared cache ' ) )
for shell in [ item [ 0 ] for item in shells ] :
2012-08-25 23:41:43 +02:00
if conf [ shell ] is not None : print ( GREEN % ( ' Installing auto-completion for ' + shell + ' as ' , conf [ shell ] ) )
2012-08-25 23:05:14 +02:00
else : print ( RED % ( ' Skipping installation of auto-completion for ' + shell ) )
if conf [ ' pdf ' ] is not None : print ( GREEN % ( ' Installing PDF manual to ' , conf [ ' pdf ' ] ) )
else : print ( RED % ( ' Skipping installation of PDF manual ' ) )
if conf [ ' pdf-compression ' ] is not None : print ( GREEN % ( ' Compressing PDF manual with ' , conf [ ' pdf-compression ' ] ) )
else : print ( RED % ( ' Skipping compression of PDF manual ' ) )
if conf [ ' info ' ] is not None : print ( GREEN % ( ' Installing info manual to ' , conf [ ' info ' ] ) )
else : print ( RED % ( ' Skipping installation of info manual ' ) )
2012-08-25 23:41:43 +02:00
if conf [ ' info-install ' ] is not None : print ( GREEN % ( ' Installing info manual with install-info with description: ' , conf [ ' info-install ' ] ) )
2012-08-25 23:05:14 +02:00
else : print ( RED % ( ' Skipping installation of info manual with install-info ' ) )
if conf [ ' info-compression ' ] is not None : print ( GREEN % ( ' Compressing info manual with ' , conf [ ' info-compression ' ] ) )
else : print ( RED % ( ' Skipping compression of info manual ' ) )
for man in manpages :
key = ' man- ' + man [ 0 ]
if conf [ key ] is not None : print ( GREEN % ( ' Installing ' + man [ 1 ] + ' manpage to ' , conf [ key ] ) )
else : print ( RED % ( ' Skipping installation of ' + man [ 1 ] + ' manpage ' ) )
key + = ' -compression '
if conf [ key ] is not None : print ( GREEN % ( ' Compressing ' + man [ 1 ] + ' manpage with ' , conf [ key ] ) )
else : print ( RED % ( ' Skipping compression of ' + man [ 1 ] + ' manpage ' ) )
2012-08-26 14:50:01 +02:00
for man in mansections : print ( GREEN % ( ' References to manpage for ' + man [ 0 ] + ' points to section ' , conf [ ' man-section- ' + man [ 0 ] ] ) )
2012-08-25 23:05:14 +02:00
for dir in sharedirs :
if conf [ dir [ 0 ] ] is not None : print ( GREEN % ( ' Installing ' + dir [ 1 ] + ' to ' , conf [ dir [ 0 ] ] ) )
else : print ( RED % ( ' Skipping installation of ' + dir [ 1 ] ) )
for file in sharefiles :
if conf [ file [ 0 ] ] is not None : print ( GREEN % ( ' Installing ' + file [ 1 ] + ' as ' , conf [ file [ 0 ] ] ) )
else : print ( RED % ( ' Skipping installation of ' + file [ 1 ] ) )
if conf [ ' custom-env-python ' ] is not None : print ( GREEN % ( ' Using custom env reference in python script shebang: ' , conf [ ' custom-env-python ' ] ) )
else : print ( YELLOW % ( ' Looking for best env reference in python script shebang ' ) )
2012-08-26 07:09:39 +02:00
for miscfile in miscfiles : print ( GREEN % ( ' Installing ' + miscfile [ 0 ] + ' to ' , conf [ miscfile [ 0 ] ] ) )
2012-08-25 23:05:14 +02:00
print ( )
2012-08-23 18:22:54 +02:00
2012-08-26 00:17:58 +02:00
'''
Compile ponysay
'''
def build ( self , conf ) :
print ( ' \033 [1;34m:: \033 [39mCompiling... \033 [21m ' )
2012-08-26 06:02:58 +02:00
def compressCommand ( ext ) :
if ext == ' gz ' : return ' gzip -9 -f '
if ext == ' xz ' : return ' xz -9e -f '
def compress ( source , destination , ext ) :
print ( ' %s < %s > %s ' % ( compressCommand ( ext ) , source , destination ) )
( fileout , filein ) = ( None , None )
try :
fileout = open ( destination , ' w+ ' )
filein = open ( source , ' r ' )
Popen ( compressCommand ( ext ) . split ( ' ' ) , stdout = fileout , stdin = filein ) . communicate ( )
finally :
if fileout is not None : fileout . close ( )
if filein is not None : filein . close ( )
env = conf [ ' custom-env-python ' ]
if env is None :
( out , err ) = Popen ( [ ' env ' , ' python ' , ' --version ' ] , stdout = PIPE , stderr = PIPE ) . communicate ( )
2012-08-26 07:09:39 +02:00
out = out . decode ( ' utf8 ' , ' replace ' ) + err . decode ( ' utf8 ' , ' replace ' )
2012-08-26 06:02:58 +02:00
out = out . replace ( ' \n ' , ' ' )
2012-08-26 07:09:39 +02:00
env = out . split ( ' ' ) [ 1 ] . split ( ' . ' ) [ 0 ]
2012-08-26 06:02:58 +02:00
if int ( env ) < 3 : env = ' python3 '
2012-08-26 07:09:39 +02:00
else : env = ' python '
2012-08-26 06:02:58 +02:00
mane = False
for command in commands :
if conf [ command ] is not None :
mane = True
break
if mane :
( fileout , filein ) = ( None , None )
try :
fileout = open ( ' ponysay.install ' , ' w+ ' )
filein = open ( ' ponysay ' , ' r ' )
data = ' ' . join ( filein . readlines ( ) )
data = data . replace ( ' #!/usr/bin/env python ' , ' #!/usr/bin/env ' + env )
for sharedir in [ item [ 0 ] for item in sharedirs ] :
data = data . replace ( ' /usr/share/ponysay/ ' + sharedir , conf [ sharedir ] )
2012-08-26 06:17:13 +02:00
for sharefile in sharefiles :
data = data . replace ( ' /usr/share/ponysay/ ' + sharefile [ 1 ] , conf [ sharefile [ 0 ] ] )
2012-08-26 15:27:33 +02:00
data = data . replace ( ' \n VERSION = \' dev \' ' , ' \n VERSION = \' %s \' ' % ( PONYSAY_VERSION ) )
2012-08-26 06:02:58 +02:00
fileout . write ( data )
finally :
if fileout is not None : fileout . close ( )
if filein is not None : filein . close ( )
for man in manpages :
key = ' man- ' + man [ 0 ]
section = conf [ ' man-section-ponysay ' ]
if man is manpages [ 0 ] : lang = ' '
else : lang = ' . ' + man [ 0 ]
if conf [ key ] is not None :
src = ' manuals/manpage ' + lang + ' .0 '
dest = src + ' .install '
( fileout , filein ) = ( None , None )
try :
fileout = open ( dest , ' w+ ' )
filein = open ( src , ' r ' )
data = ' ' . join ( filein . readlines ( ) )
data = data . replace ( ' \n .TH PONYSAY 0 ' , ' \n .TH PONYSAY ' + conf [ ' man-section-ponysay ' ] )
for section in [ item [ 0 ] for item in mansections ] :
data = data . replace ( ' \n .BR %s (0) ' % ( section ) , ' \n .BR %s ( %s ) ' % ( section , conf [ ' man-section- ' + section ] ) )
fileout . write ( data )
finally :
if fileout is not None : fileout . close ( )
if filein is not None : filein . close ( )
src = dest
ext = conf [ key + ' -compression ' ]
if ext is not None :
dest = ' manuals/manpage ' + lang + ' .0. ' + ext
2012-08-26 07:09:39 +02:00
compress ( src , dest , ext )
2012-08-26 06:02:58 +02:00
if conf [ ' info ' ] is not None :
print ( ' makeinfo manuals/ponysay.texinfo ' )
os . system ( ' makeinfo manuals/ponysay.texinfo ' )
ext = conf [ ' info-compression ' ]
if ext is not None :
compress ( ' ponysay.info ' , ' ponysay.info. ' + ext , ext )
2012-08-26 15:27:33 +02:00
if conf [ ' pdf-compression ' ] is not None :
ext = conf [ ' pdf-compression ' ]
if ext is not None :
compress ( ' ponysay.pdf ' , ' ponysay.pdf. ' + ext , ext )
2012-08-26 06:02:58 +02:00
for shell in [ item [ 0 ] for item in shells ] :
if conf [ shell ] is not None :
src = ' completion/ %s -completion. %s ' % ( shell , ' sh ' if shell == ' bash ' else shell )
for command in commands :
2012-08-26 15:27:33 +02:00
if conf [ command ] is not None :
dest = src + ' . ' + command
2012-08-26 06:02:58 +02:00
( fileout , filein ) = ( None , None )
try :
fileout = open ( dest , ' w+ ' )
filein = open ( src , ' r ' )
data = ' ' . join ( filein . readlines ( ) )
data = data . replace ( ' /usr/bin/ponysay ' , conf [ command ] )
data = data . replace ( ' /ponysay ' , ' \0 ' )
data = data . replace ( ' ponysay ' , command )
for sharedir in [ item [ 0 ] for item in sharedirs ] :
data = data . replace ( ' /usr/share/ponysay/ ' + sharedir , conf [ sharedir ] )
data = data . replace ( ' \0 ' , ' /ponysay ' )
fileout . write ( data )
finally :
if fileout is not None : fileout . close ( )
if filein is not None : filein . close ( )
if conf [ ' quotes ' ] is not None :
2012-08-26 07:09:39 +02:00
self . removeLists ( [ ] , [ ' quotes ' ] )
2012-08-26 06:02:58 +02:00
os . mkdir ( ' quotes ' )
2012-08-26 07:09:39 +02:00
ponymap = None
2012-08-26 06:02:58 +02:00
try :
2012-08-26 07:09:39 +02:00
ponymap = open ( ' ponyquotes/ponies ' , ' r ' )
ponies = [ line . replace ( ' \n ' , ' ' ) for line in ponymap . readlines ( ) ]
for _ponies in ponies :
for pony in _ponies . split ( ' + ' ) :
print ( ' Generating quote files for \033 [34m ' + pony + ' \033 [39m ' )
for file in os . listdir ( ' ponyquotes ' ) :
if file . startswith ( pony + ' . ' ) :
if os . path . isfile ( ' ponyquotes/ ' + file ) :
shutil . copy ( ' ponyquotes/ ' + file , ' quotes/ ' + _ponies + file [ file . find ( ' . ' ) : ] )
2012-08-26 06:02:58 +02:00
finally :
2012-08-26 07:09:39 +02:00
if ponymap is not None :
ponymap . close ( )
2012-08-26 15:27:33 +02:00
print ( )
2012-08-26 00:17:58 +02:00
'''
Install compiled ponysay
'''
def install ( self , conf ) :
print ( ' \033 [1;34m:: \033 [39mInstalling... \033 [21m ' )
2012-08-26 04:22:14 +02:00
for command in commands :
dests = [ ]
if conf [ command ] is not None :
dests . append ( conf [ command ] )
if len ( dests ) > 0 :
self . cp ( False , ' ponysay.install ' , dests )
print ( ' Setting mode for ponysay.install copies to 755 ' )
if self . linking == COPY :
for dest in dests :
2012-08-26 07:09:39 +02:00
os . chmod ( dest , 0o755 )
2012-08-26 04:22:14 +02:00
else :
2012-08-26 07:09:39 +02:00
os . chmod ( dests [ 0 ] , 0o755 )
2012-08-26 04:22:14 +02:00
if conf [ ' shared-cache ' ] is not None :
dir = conf [ ' shared-cache ' ]
2012-08-26 15:27:33 +02:00
if not os . path . exists ( dir ) :
pdir = dir [ : dir . rfind ( ' / ' ) + 1 ]
if not os . path . exists ( pdir ) :
print ( ' Creating intermediate-level directories needed for ' + dir )
os . makedirs ( pdir )
print ( ' Creating directory ' + dir + ' with mode mask 777 ' )
os . mkdir ( dir , 0o777 )
2012-08-26 04:22:14 +02:00
for shell in [ item [ 0 ] for item in shells ] :
if conf [ shell ] is not None :
for command in commands :
if conf [ command ] is not None :
src = ' completion/ %s -completion. %s . %s ' % ( shell , ' sh ' if shell == ' bash ' else shell , command )
dest = conf [ shell ] . replace ( ' ponysay ' , command )
self . cp ( False , src , [ dest ] )
if conf [ ' pdf ' ] is not None :
src = ' ponysay.pdf ' + ( ' ' if conf [ ' pdf-compression ' ] is None else ' . ' + conf [ ' pdf-compression ' ] )
dest = conf [ ' pdf ' ] + ' / ' + src
self . cp ( False , src , [ dest ] )
if conf [ ' info ' ] is not None :
installinfo = [ ]
dests = [ ]
ext = ( ' ' if conf [ ' info-compression ' ] is None else ' . ' + conf [ ' info-compression ' ] )
src = ' ponysay.info ' + ext
for command in commands :
if conf [ command ] is not None :
dests . append ( conf [ ' info ' ] + ' / ' + command + ' .info ' + ext )
if conf [ ' info-install ' ] is not None :
cmdarr = [ ' install-info ' , ' --entry=Miscellaneous ' , ' --description= ' + conf [ ' info-install ' ] , ' --dir-file= ' + conf [ ' info ' ] + ' /dir ' , dest ]
cmd = ' ' . join ( [ ' \' %s \' ' % ( elem . replace ( ' \' ' , ' \' \\ \' \' ' ) ) for elem in cmdarr ] )
installinfo . append ( ( cmd , ' Installing info manual ' + dest + ' with install-info ' ) )
self . cp ( False , src , dests )
for pair in installinfo :
print ( pair [ 1 ] )
os . system ( pair [ 0 ] )
for man in manpages :
key = ' man- ' + man [ 0 ]
2012-08-26 06:02:58 +02:00
section = conf [ ' man-section-ponysay ' ]
if man is manpages [ 0 ] : sub = ' man ' + section
else : sub = man [ 0 ] + ' /man ' + section
if man is manpages [ 0 ] : lang = ' '
else : lang = ' . ' + man [ 0 ]
2012-08-26 04:22:14 +02:00
if conf [ key ] is not None :
2012-08-26 06:02:58 +02:00
src = ' manuals/manpage ' + lang + ' .0. ' + ( ' install ' if conf [ key + ' -compression ' ] is None else conf [ key + ' -compression ' ] )
2012-08-26 04:22:14 +02:00
dests = [ ]
for command in commands :
if conf [ command ] is not None :
2012-08-26 06:02:58 +02:00
dest = ' %s / %s / %s . %s %s ' % ( conf [ key ] , sub , command , section , ' ' if conf [ key + ' -compression ' ] is None else ' . ' + conf [ key + ' -compression ' ] )
2012-08-26 04:22:14 +02:00
dests . append ( dest )
self . cp ( False , src , dests )
2012-08-26 15:27:33 +02:00
for dir in sharedirs :
2012-08-26 04:22:14 +02:00
if conf [ dir [ 0 ] ] is not None :
self . cp ( True , dir [ 0 ] , [ conf [ dir [ 0 ] ] ] )
for file in sharefiles :
if conf [ file [ 0 ] ] is not None :
self . cp ( False , ' share/ ' + file [ 1 ] , [ conf [ file [ 0 ] ] ] )
2012-08-26 04:30:57 +02:00
for file in miscfiles :
self . cp ( False , file [ 0 ] , [ conf [ file [ 0 ] ] ] )
2012-08-26 15:27:33 +02:00
print ( )
2012-08-26 00:17:58 +02:00
'''
Uninstall ponysay
'''
def uninstall ( self , conf ) :
print ( ' \033 [1;34m:: \033 [39mUninstalling... \033 [21m ' )
2012-08-26 15:27:33 +02:00
( files , dirs , infos ) = ( [ ] , [ ] , [ ] )
2012-08-26 02:44:51 +02:00
for command in commands :
if conf [ command ] is not None :
files . append ( conf [ command ] )
if conf [ ' shared-cache ' ] is not None :
dirs . append ( conf [ ' shared-cache ' ] )
for shell in [ item [ 0 ] for item in shells ] :
if conf [ shell ] is not None :
for command in commands :
if conf [ command ] is not None :
files . append ( conf [ shell ] . replace ( ' ponysay ' , command ) )
if conf [ ' pdf ' ] is not None :
files . append ( conf [ ' pdf ' ] + ' /ponysay.pdf ' + ( ' ' if conf [ ' pdf-compression ' ] is None else ' . ' + conf [ ' pdf-compression ' ] ) )
if conf [ ' info ' ] is not None :
for command in commands :
if conf [ command ] is not None :
file = conf [ ' info ' ] + ' / ' + command + ' .info ' + ( ' ' if conf [ ' info-compression ' ] is None else ' . ' + conf [ ' info-compression ' ] )
files . append ( file )
if conf [ ' info-install ' ] is not None :
infos . append ( file )
2012-08-26 15:27:33 +02:00
for man in [ item [ 0 ] for item in manpages ] :
2012-08-26 02:44:51 +02:00
key = ' man- ' + man
2012-08-26 06:02:58 +02:00
section = conf [ ' man-section-ponysay ' ]
if man is manpages [ 0 ] : sub = ' man ' + section
else : sub = man [ 0 ] + ' /man ' + section
2012-08-26 02:44:51 +02:00
if conf [ key ] is not None :
for command in commands :
if conf [ command ] is not None :
2012-08-26 06:02:58 +02:00
files . append ( ' %s / %s / %s . %s %s ' % ( conf [ key ] , sub , command , section , ' ' if conf [ key + ' -compression ' ] is None else ' . ' + conf [ key + ' -compression ' ] ) )
2012-08-26 15:27:33 +02:00
for dir in sharedirs :
2012-08-26 02:44:51 +02:00
if conf [ dir [ 0 ] ] is not None :
dirs . append ( conf [ dir [ 0 ] ] )
for file in sharefiles :
if conf [ file [ 0 ] ] is not None :
files . append ( conf [ file [ 0 ] ] )
2012-08-26 04:30:57 +02:00
for file in miscfiles :
files . append ( conf [ file [ 0 ] ] )
2012-08-26 02:44:51 +02:00
for info in infos :
cmdarr = [ ' install-info ' , ' --delete ' , ' --dir-file= ' + conf [ ' info ' ] + ' /dir ' , info ]
cmd = ' ' . join ( [ ' \' %s \' ' % ( elem . replace ( ' \' ' , ' \' \\ \' \' ' ) ) for elem in cmdarr ] )
2012-08-26 04:22:14 +02:00
print ( ' Uninstalling info manual ' + info + ' with install-info ' )
2012-08-26 02:44:51 +02:00
os . system ( cmd )
self . removeLists ( files , dirs )
2012-08-26 15:27:33 +02:00
print ( )
2012-08-26 00:17:58 +02:00
'''
Uninstall file ponysay no longer uses
'''
def uninstallOld ( self , conf ) :
print ( ' \033 [1;34m:: \033 [39mUninstalling old files... \033 [21m ' )
instdir = conf [ ' ~prefix~ ' ] + ' /usr '
files = [ instdir + f for f in [ ' bin/ponysaylist.pl ' , ' bin/ponysaytruncater ' , ' bin/ponysay.py ' , ' bin/ponythink.py ' ] ]
dirs = [ instdir + d for d in [ ' lib/ponysay ' , ' share/ponies ' , ' share/ttyponies ' ] ]
#$(instdir)/lib/ponysay/truncater
#$(instdir)/lib/ponysay/list.pl
#$(instdir)/lib/ponysay/linklist.pl
#$(instdir)/lib/ponysay/pq4ps
#$(instdir)/lib/ponysay/pq4ps.pl
#$(instdir)/lib/ponysay/pq4ps-list
#$(instdir)/lib/ponysay/pq4ps-list.pl
2012-08-26 00:50:35 +02:00
self . removeLists ( files , dirs )
2012-08-26 15:27:33 +02:00
print ( )
2012-08-26 00:17:58 +02:00
'''
Remove compiled files
'''
def clean ( self ) :
print ( ' \033 [1;34m:: \033 [39mCleaning... \033 [21m ' )
2012-08-26 19:23:04 +02:00
files = [ ' ponysay.info ' , ' ponysay.info.gz ' , ' ponysay.info.xz ' , ' ponysay.pdf.gz ' , ' ponysay.pdf.xz ' , ' ponysay.install ' ]
2012-08-26 00:17:58 +02:00
dirs = [ ' quotes ' ]
2012-08-26 04:22:14 +02:00
for comp in [ ' install ' , ' gz ' , ' xz ' ] :
2012-08-26 00:17:58 +02:00
for man in manpages :
if man is manpages [ 0 ] : man = ' '
2012-08-26 00:50:35 +02:00
else : man = ' . ' + man [ 0 ]
2012-08-26 07:09:39 +02:00
files . append ( ' manuals/manpage ' + man + ' .0. ' + comp )
2012-08-26 00:50:35 +02:00
for shell in [ item [ 0 ] for item in shells ] :
2012-08-26 07:09:39 +02:00
for command in commands :
files . append ( ' completion/ %s -completion. %s . %s ' % ( shell , ' sh ' if shell == ' bash ' else shell , command ) )
2012-08-26 00:17:58 +02:00
2012-08-26 00:50:35 +02:00
self . removeLists ( files , dirs )
2012-08-26 15:27:33 +02:00
print ( )
2012-08-26 00:17:58 +02:00
'''
Remove compiled files ponysay is no longer compiling
'''
def cleanOld ( self ) :
print ( ' \033 [1;34m:: \033 [39mCleaning old files... \033 [21m ' )
files = [ ' truncater ' , ' ponysaytruncater ' , ' ponysay.py.install ' , ' ponysay.install~ ' ]
dirs = [ ]
2012-08-26 04:22:14 +02:00
for shell in [ item [ 0 ] for item in shells ] :
files . append ( ' completion/ %s -completion. %s .install ' % ( shell , ' sh ' if shell == ' bash ' else shell ) )
files . append ( ' completion/ %s -completion-think. %s ' % ( shell , ' sh ' if shell == ' bash ' else shell ) )
2012-08-26 00:17:58 +02:00
2012-08-26 00:50:35 +02:00
self . removeLists ( files , dirs )
2012-08-26 15:27:33 +02:00
print ( )
2012-08-26 00:17:58 +02:00
'''
Removes listed files and directories
'''
def removeLists ( self , files , dirs ) :
2012-08-26 02:44:51 +02:00
for file in files :
2012-08-26 15:27:33 +02:00
if os . path . isfile ( file ) or os . path . islink ( file ) :
2012-08-26 02:44:51 +02:00
print ( ' Unlinking file %s ' % ( file ) )
os . unlink ( file )
dir = file
while True :
2012-08-26 15:27:33 +02:00
dir = dir [ : dir . rfind ( ' / ' ) ]
if ( ' /ponysay/ ' in ( dir + ' / ' ) ) and ( len ( os . listdir ( dir ) ) == 0 ) :
print ( ' Removing newly empty directory %s ' % ( dir ) )
2012-08-26 02:44:51 +02:00
os . rmdir ( dir )
else :
break ;
for dir in dirs :
2012-08-26 15:27:33 +02:00
if os . path . isdir ( dir ) or os . path . islink ( dir ) :
2012-08-26 02:44:51 +02:00
print ( ' Cascadingly removing directory %s ' % ( dir ) )
if os . path . islink ( dir ) : os . unlink ( dir )
else : shutil . rmtree ( dir )
while True :
2012-08-26 15:27:33 +02:00
dir = dir [ : dir . rfind ( ' / ' ) ]
if ( ' /ponysay/ ' in ( dir + ' / ' ) ) and ( len ( os . listdir ( dir ) ) == 0 ) :
print ( ' Removing newly empty directory %s ' % ( dir ) )
2012-08-26 02:44:51 +02:00
os . rmdir ( dir )
else :
break ;
2012-08-26 00:17:58 +02:00
2012-08-26 04:22:14 +02:00
'''
Copys a files or directory to multiple destinations
'''
def cp ( self , recursive , source , destinations ) :
for dest in destinations :
dir = dest [ : dest . rfind ( ' / ' ) + 1 ]
if not os . path . exists ( dir ) :
print ( ' Making directory ' + dir + ' with parents ' )
os . makedirs ( dir )
if recursive :
target = destinations [ 0 ]
for dest in destinations if self . linking == COPY else [ target ] :
print ( ' Copying directory %s to %s ' % ( source , dest ) )
if not os . path . exists ( dest ) :
os . mkdir ( dest )
for file in os . listdir ( source ) :
src = source + ' / ' + file
self . cp ( os . path . isdir ( src ) , src , [ dest + ' / ' + file ] )
if self . linking != COPY :
for dest in destinations [ 1 : ] :
print ( ' Creating symbolic link %s with target directory %s ' % ( dest , target ) )
2012-08-26 15:27:33 +02:00
if os . path . exists ( dest ) :
os . removeLists ( [ ] , [ dest ] )
2012-08-26 04:22:14 +02:00
os . symlink ( target , dest )
else :
target = destinations [ 0 ]
for dest in destinations if self . linking == COPY else [ target ] :
print ( ' Copying file %s to %s ' % ( source , dest ) )
shutil . copyfile ( source , dest )
if self . linking == HARD :
for dest in destinations [ 1 : ] :
print ( ' Creating hard link %s with target file %s ' % ( dest , target ) )
2012-08-26 15:27:33 +02:00
if os . path . exists ( dest ) :
os . unlink ( dest )
2012-08-26 04:22:14 +02:00
os . link ( target , dest )
elif self . linking == SYMBOLIC :
for dest in destinations [ 1 : ] :
print ( ' Creating symbolic link %s with target file %s ' % ( dest , target ) )
2012-08-26 15:27:33 +02:00
if os . path . exists ( dest ) :
os . unlink ( dest )
2012-08-26 04:22:14 +02:00
os . symlink ( target , dest )
2012-08-23 18:22:54 +02:00
'''
Parses configurations
'''
def configure ( self , opts ) :
( defaults , conf ) = ( { } , { } )
for command in commands :
2012-08-25 23:41:43 +02:00
conf [ command ] = ' /usr/bin/ ' + command
2012-08-23 18:22:54 +02:00
conf [ ' shared-cache ' ] = ' /var/cache/ponysay '
for shell in shells :
conf [ shell [ 0 ] ] = shell [ 1 ]
conf [ ' pdf ' ] = ' /usr/doc '
conf [ ' pdf-compression ' ] = ' gz '
conf [ ' info ' ] = ' /usr/share/info '
2012-08-25 21:26:35 +02:00
conf [ ' info-install ' ] = ' My Little Ponies for your terminal '
2012-08-23 18:22:54 +02:00
conf [ ' info-compression ' ] = ' gz '
for manpage in manpages :
conf [ ' man- ' + manpage [ 0 ] ] = ' /usr/share/man '
conf [ ' man- ' + manpage [ 0 ] + ' -compression ' ] = ' gz '
for sharedir in sharedirs :
2012-08-25 21:47:53 +02:00
conf [ sharedir [ 0 ] ] = ' /usr/share/ponysay/ ' + sharedir [ 0 ]
2012-08-23 18:22:54 +02:00
for sharefile in sharefiles :
conf [ sharefile [ 0 ] ] = ' /usr/share/ponysay/ ' + sharefile [ 1 ]
conf [ ' custom-env-python ' ] = ' python3 '
2012-08-26 04:30:57 +02:00
for miscfile in miscfiles :
conf [ miscfile [ 0 ] ] = miscfile [ 1 ]
2012-08-23 18:22:54 +02:00
2012-08-25 21:26:35 +02:00
2012-08-24 22:04:01 +02:00
if opts [ ' --private ' ] is not None :
if opts [ ' --prefix ' ] is None :
2012-08-25 23:41:43 +02:00
opts [ ' --prefix ' ] = [ os . environ [ ' HOME ' ] + ' /.local ' ]
2012-08-24 22:04:01 +02:00
prefix = ' /usr '
if opts [ ' --prefix ' ] is not None :
prefix = opts [ ' --prefix ' ] [ 0 ]
for key in conf :
2012-08-25 23:41:43 +02:00
if conf [ key ] not in ( None , False , True ) :
if conf [ key ] . startswith ( ' /usr ' ) :
conf [ key ] = prefix + conf [ key ] [ 4 : ]
2012-08-26 00:17:58 +02:00
conf [ ' ~prefix~ ' ] = prefix
2012-08-25 21:26:35 +02:00
if opts [ ' --opt ' ] is not None :
2012-08-25 23:41:43 +02:00
if opts [ ' --bin-dir ' ] is None : opts [ ' --bin-dir ' ] = [ ' /opt/ponysay/bin ' ]
if opts [ ' --lib-dir ' ] is None : opts [ ' --lib-dir ' ] = [ ' /opt/ponysay/lib ' ]
2012-08-26 06:02:58 +02:00
if opts [ ' --share-dir ' ] is None : opts [ ' --share-dir ' ] = [ ' /usr/share ' ]
2012-08-25 23:41:43 +02:00
if opts [ ' --with-shared-cache ' ] is None : opts [ ' --with-shared-cache ' ] = [ ' /var/opt/ponysay/cache ' ]
2012-08-26 06:02:58 +02:00
for sharedir in sharedirs :
conf [ sharedir [ 0 ] ] = ' /opt/ponysay/share/ ' + sharedir [ 0 ]
for sharefile in sharefiles :
conf [ sharefile [ 0 ] ] = ' /opt/ponysay/share/ ' + sharefile [ 1 ]
2012-08-25 21:26:35 +02:00
2012-08-25 23:05:14 +02:00
for dir in [ ' bin ' , ' lib ' , ' share ' ] :
2012-08-24 22:04:01 +02:00
if opts [ ' -- ' + dir + ' -dir ' ] is not None :
d = opts [ ' -- ' + dir + ' -dir ' ] [ 0 ]
2012-08-26 17:32:48 +02:00
if dir == ' lib ' :
dir + = ' /ponysay '
2012-08-24 22:04:01 +02:00
for key in conf :
2012-08-25 23:05:14 +02:00
if conf [ key ] not in [ None , True , False ] :
if conf [ key ] . startswith ( prefix + ' / ' + dir ) :
conf [ key ] = d + conf [ key ] [ 5 + len ( dir ) : ]
2012-08-24 22:04:01 +02:00
if opts [ ' --cache-dir ' ] is not None :
dir = opts [ ' --cache-dir ' ] [ 0 ]
for key in conf :
2012-08-25 23:41:43 +02:00
if conf [ key ] not in ( None , False , True ) :
if conf [ key ] . startswith ( ' /var/cache ' ) :
conf [ key ] = dir + conf [ key ] [ 10 : ]
for key in conf :
defaults [ key ] = conf [ key ]
2012-08-24 22:04:01 +02:00
2012-08-25 21:26:35 +02:00
if opts [ ' --nothing ' ] is not None :
opts [ ' --minimal ' ] = opts [ ' --nothing ' ]
2012-08-25 23:05:14 +02:00
for key in [ ' custom-env-python ' ] :
2012-08-23 18:22:54 +02:00
conf [ key ] = None
2012-08-25 23:41:43 +02:00
if opts [ ' --everything ' ] is None :
2012-08-25 23:05:14 +02:00
for key in [ ' pdf ' , ' pdf-compression ' ] :
2012-08-25 21:26:35 +02:00
conf [ key ] = None
nomanen = opts [ ' --minimal ' ] is not None
for manpage in manpages :
2012-08-25 23:41:43 +02:00
if ( manpage is not manpages [ 0 ] ) or nomanen :
for key in [ ' man- ' + manpage [ 0 ] ] :
2012-08-25 21:26:35 +02:00
conf [ key ] = None
2012-08-23 18:22:54 +02:00
2012-08-25 21:26:35 +02:00
if ( opts [ ' --private ' ] is not None ) or ( opts [ ' --minimal ' ] is not None ) :
2012-08-25 23:05:14 +02:00
for key in [ ' info-install ' , ' shared-cache ' ] :
2012-08-24 22:04:01 +02:00
conf [ key ] = None
2012-08-25 21:26:35 +02:00
if opts [ ' --minimal ' ] is not None :
2012-08-26 14:50:01 +02:00
for key in [ ' info ' ] + [ item [ 0 ] for item in shells ] :
2012-08-25 21:26:35 +02:00
conf [ key ] = None
2012-08-25 21:47:53 +02:00
for sharedir in sharedirs :
if sharedir is not sharedirs [ 0 ] :
conf [ sharedir [ 0 ] ] = None
2012-08-25 23:41:43 +02:00
for sharefile in sharefiles :
conf [ sharefile [ 0 ] ] = None
2012-08-25 21:26:35 +02:00
if opts [ ' --nothing ' ] is not None :
for command in commands :
2012-08-26 14:50:01 +02:00
conf [ command ] = None
2012-08-25 23:41:43 +02:00
conf [ sharedirs [ 0 ] [ 0 ] ] = None
2012-08-25 21:26:35 +02:00
2012-08-24 22:04:01 +02:00
2012-08-25 23:05:14 +02:00
for coll in [ [ ' shell ' , ' /usr/share ' , [ item [ 0 ] for item in shells ] ] ,
[ ' man ' , ' /usr/share/man ' , [ ' man- ' + item [ 0 ] for item in manpages ] ] ,
[ ' man-compression ' , ' gz ' , [ ' man- ' + item [ 0 ] + ' -compression ' for item in manpages ] ]
] :
2012-08-23 18:22:54 +02:00
if opts [ ' --without- ' + coll [ 0 ] ] is not None :
for item in coll [ 2 ] :
conf [ item ] = None
if opts [ ' --with- ' + coll [ 0 ] ] is not None :
for item in coll [ 2 ] :
defaults [ item ] = conf [ item ] = defaults [ item ] . replace ( coll [ 1 ] , coll [ 1 ] if opts [ ' --with- ' + coll [ 0 ] ] [ 0 ] is None else opts [ ' --with- ' + coll [ 0 ] ] [ 0 ] ) ;
2012-08-25 23:41:43 +02:00
2012-08-23 18:22:54 +02:00
for key in conf :
2012-08-26 14:50:01 +02:00
if ' --with- ' + key not in opts :
2012-08-26 07:09:39 +02:00
continue
2012-08-23 18:22:54 +02:00
if opts [ ' --with- ' + key ] is not None :
if defaults [ key ] in ( False , True ) :
conf [ key ] = True
else :
conf [ key ] = defaults [ key ] if opts [ ' --with- ' + key ] [ 0 ] is None else opts [ ' --with- ' + key ] [ 0 ]
if opts [ ' --without- ' + key ] is not None :
conf [ key ] = False if defaults [ key ] in ( False , True ) else None
for mansection in mansections :
if opts [ ' --man-section- ' + mansection [ 0 ] ] is not None :
2012-08-26 14:50:01 +02:00
conf [ ' man-section- ' + mansection [ 0 ] ] = opts [ ' --man-section- ' + mansection [ 0 ] ] [ 0 ]
2012-08-23 18:22:54 +02:00
else :
conf [ ' man-section- ' + mansection [ 0 ] ] = mansection [ 1 ]
2012-08-24 22:04:01 +02:00
if opts [ ' --dest-dir ' ] is not None :
destdir = opts [ ' --dest-dir ' ] [ 0 ]
for key in conf :
2012-08-25 23:41:43 +02:00
if conf [ key ] not in ( None , False , True ) :
if conf . startswith ( ' / ' ) :
conf [ key ] = destdir + conf [ key ]
2012-08-25 21:26:35 +02:00
2012-08-23 18:22:54 +02:00
return conf
2012-08-23 07:20:49 +02:00
ARGUMENTLESS = 0
ARGUMENTED = 1
'''
Simple argument parser , a strip down of the one in ponysay and slitly modified
'''
class ArgParser ( ) :
'''
Constructor .
The short description is printed on same line as the program name
'''
def __init__ ( self , program , description , usage , longdescription = None ) :
self . __program = program
self . __description = description
self . __usage = usage
self . __longdescription = longdescription
self . __arguments = [ ]
( self . opts , self . optmap ) = ( { } , { } )
'''
Add option that takes no arguments
'''
def add_argumentless ( self , alternatives , help = None ) :
ARGUMENTLESS
self . __arguments . append ( ( ARGUMENTLESS , alternatives , None , help ) )
( stdalt , self . opts [ stdalt ] ) = ( alternatives [ 0 ] , None )
for alt in alternatives : self . optmap [ alt ] = ( stdalt , ARGUMENTLESS )
'''
Add option that takes one argument
'''
def add_argumented ( self , alternatives , arg , help = None ) :
self . __arguments . append ( ( ARGUMENTED , alternatives , arg , help ) )
( stdalt , self . opts [ stdalt ] ) = ( alternatives [ 0 ] , None )
for alt in alternatives : self . optmap [ alt ] = ( stdalt , ARGUMENTED )
'''
Parse arguments
'''
def parse ( self , argv = sys . argv ) :
self . argcount = len ( argv ) - 1
self . files = [ ]
2012-08-23 18:22:54 +02:00
( argqueue , optqueue , get ) = ( [ ] , [ ] , False )
2012-08-26 00:50:35 +02:00
for arg in argv [ 1 : ] :
2012-08-23 18:22:54 +02:00
if get :
get = False
2012-08-26 07:09:39 +02:00
if ( arg is argv [ - 1 ] ) or ( ( len ( arg ) > 2 ) and ( arg [ : 2 ] in ( ' -- ' , ' ++ ' ) ) ) :
2012-08-23 18:22:54 +02:00
argqueue . append ( None )
else :
argqueue . append ( arg )
continue
if ( len ( arg ) > 2 ) and ( arg [ : 2 ] in ( ' -- ' , ' ++ ' ) ) :
if ( arg in self . optmap ) and ( self . optmap [ arg ] [ 1 ] == ARGUMENTLESS ) :
optqueue . append ( arg )
argqueue . append ( None )
elif ' = ' in arg :
arg_opt = arg [ : arg . index ( ' = ' ) ]
if ( arg_opt in self . optmap ) and ( self . optmap [ arg_opt ] [ 1 ] == ARGUMENTED ) :
optqueue . append ( arg_opt )
argqueue . append ( arg [ arg . index ( ' = ' ) + 1 : ] )
2012-08-23 07:20:49 +02:00
else :
2012-08-26 04:22:14 +02:00
sys . stderr . write ( ' %s : fatal: unrecognised option %s . see --help or the manual \n ' % ( self . __program , arg ) )
exit ( - 1 )
2012-08-23 18:22:54 +02:00
elif ( arg in self . optmap ) and ( self . optmap [ arg ] [ 1 ] == ARGUMENTED ) :
optqueue . append ( arg )
get = True
2012-08-23 07:20:49 +02:00
else :
2012-08-23 18:22:54 +02:00
sys . stderr . write ( ' %s : fatal: unrecognised option %s . see --help or the manual \n ' % ( self . __program , arg ) )
exit ( - 1 )
2012-08-23 07:20:49 +02:00
else :
self . files . append ( arg )
( i , n ) = ( 0 , len ( optqueue ) )
2012-08-23 18:22:54 +02:00
if len ( argqueue ) < n :
argqueue . append ( None )
2012-08-23 07:20:49 +02:00
while i < n :
( opt , arg , i ) = ( optqueue [ i ] , argqueue [ i ] , i + 1 )
opt = self . optmap [ opt ] [ 0 ]
if ( opt not in self . opts ) or ( self . opts [ opt ] is None ) :
2012-08-26 17:34:21 +02:00
self . opts [ opt ] = [ arg ]
else :
2012-08-26 18:13:29 +02:00
sys . stderr . write ( ' %s : fatal: duplicate option %s \n ' % ( self . __program , arg ) )
2012-08-26 17:34:21 +02:00
exit ( - 1 )
2012-08-23 07:20:49 +02:00
'''
Prints a colourful help message
'''
def help ( self ) :
print ( ' \033 [1m %s \033 [21m - %s \n ' % ( self . __program , self . __description ) )
if self . __longdescription is not None :
print ( self . __longdescription )
print ( )
print ( ' \n \033 [1mUSAGE: \033 [21m ' , end = ' ' )
first = True
for line in self . __usage . split ( ' \n ' ) :
if first : first = False
else : print ( ' or ' , end = ' ' )
print ( ' \t %s ' % ( line ) )
print ( ' \n \033 [1mCONFIGURATIONS: \033 [21m \n ' )
for opt in self . __arguments :
( opt_type , opt_alts , opt_arg , opt_help ) = opt [ 0 : 4 ]
if opt_help is not None :
for opt_alt in opt_alts :
if opt_alt is opt_alts [ - 1 ] :
print ( ' \t %s \033 [4m %s \033 [24m ' % ( opt_alt , opt_arg ) if opt_type == ARGUMENTED else ' \t ' + opt_alt )
else :
print ( ' \t \033 [2m ' + opt_alt + ' \033 [22m ' )
first = True
for line in opt_help . split ( ' \n ' ) :
print ( ( ' \t \t \033 [32;1m %s \033 [21;39m ' if first else ' \t \t %s ' ) % ( line ) )
first = False
print ( )
print ( )
if __name__ == ' __main__ ' :
Setup ( )