diff options
Diffstat (limited to 'setup.py')
-rwxr-xr-x | setup.py | 1087 |
1 files changed, 0 insertions, 1087 deletions
diff --git a/setup.py b/setup.py deleted file mode 100755 index a3be893..0000000 --- a/setup.py +++ /dev/null @@ -1,1087 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import os -import shutil -import sys -from subprocess import Popen, PIPE - - - -PONYSAY_VERSION = '2.9.1' - - - -manpages = [('en', 'English'), # must be first - ('es', 'Spanish')] - -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')] - -sharefiles = [('ucs', 'ucsmap')] - -commands = ['ponysay', 'ponythink'] - -shells = [('bash', '/usr/share/bash-completion/completions/ponysay', 'GNU Bash'), - ('fish', '/usr/share/fish/completions/ponysay.fish', 'Friendly interactive shell'), - ('zsh', '/usr/share/zsh/site-functions/_ponysay', 'zsh')] - -mansections = [('ponysay', '6'), - ('cowsay', '1'), - ('fortune', '6')] - -miscfiles = [('COPYING', '/usr/share/licenses/ponysay/COPYING'), - ('CREDITS', '/usr/share/licenses/ponysay/CREDITS')] - - - - -COPY = 'copy' -HARD = 'hard' -SYMBOLIC = 'symbolic' - -class Setup(): - def __init__(self): - usage_script = '\033[34;1msetup.py\033[21;39m' - usage_help = '(version | help)' - usage_proc = '[\033[4mconfigurations\033[24m] ([build] | prebuilt | install | (uninstall|clean)[-old] | view)' - - 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) - - - opts.add_argumentless(alternatives = ['--help']) - opts.add_argumentless(alternatives = ['--version']) - opts.add_argumented (alternatives = ['---DESTDIR'], arg="DESTDIR") - opts.add_argumented (alternatives = ['---PREFIX'], arg="PREFIX") - - - opts.add_argumentless(help = 'Install everything that is not explicity excluded', - alternatives = ['--everything', '--with-everything']) - - opts.add_argumentless(help = 'Install only the essentials\nNote that this can vary depending on version', - alternatives = ['--minimal']) - - opts.add_argumentless(help = 'Install nothing (except legal documents) that is not explicity included', - alternatives = ['--nothing', '--with-nothing']) - - - for command in commands: - opts.add_argumentless(help = 'Do not install the %s command' % (command), - alternatives = ['--without-' + command, '--without-' + command + '-command']) - - opts.add_argumented (help = 'Install the %s command, and set file name\nDefualt = /usr/bin/%s' % (command, command), - alternatives = ['--with-' + command, '--with-' + command + '-command'], arg='EXEC') - - - 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\nDefault = /var/cache/ponysay', - alternatives = [ '--with-shared-cache'], arg='CACHEDIR') - - - for shell in shells: - opts.add_argumentless(help = 'Do not install completion for ' + shell[2], - alternatives = ['--without-' + shell[0], '--without-' + shell[0] + '-completion']) - - opts.add_argumented (help = 'Set file name for the completion for ponysay in' + shell[2], - alternatives = ['--with-' + shell[0], '--with-' + shell[0] + '-completion'], arg='PONYSAY_%s_FILE' % (shell[0].upper())) - - - opts.add_argumentless(help = 'Only install explicitly included shell completions', - alternatives = ['--without-shell', '--without-shell-completion']) - - opts.add_argumented (help = 'Set share/ directory used for shell completions\nDefault = $SHAREDIR', - alternatives = ['--with-shell', '--with-shell-completion'], arg='SHAREDIR') - - - opts.add_argumentless(help = 'Do not install PDF manual\nDefault', - alternatives = ['--without-pdf', '--without-pdf-manual']) - - opts.add_argumented (help = 'Set directory for PDF manual\nDefault = $PREFIX/doc', - alternatives = ['--with-pdf', '--with-pdf-manual'], arg='DOCDIR') - - opts.add_argumentless(help = 'Do not compress PDF manual\nDefault', - alternatives = ['--without-pdf-compression', '--without-pdf-manual-compression']) - - opts.add_argumented (help = 'Select compression for PDF manual\nDefault = gz, xz is also recognised', - alternatives = ['--with-pdf-compression', '--with-pdf-manual-compression'], arg='COMPRESSION') - - opts.add_argumentless(help = 'Do not install info manual', - alternatives = ['--without-info', '--without-info-manual']) - - opts.add_argumented (help = 'Set directory for info manual\nDefault = $SHARE/info', - alternatives = ['--with-info', '--with-info-manual'], arg='INFODIR') - - opts.add_argumentless(help = 'Do not use install-info when installing info manual', - alternatives = ['--without-info-install', '--without-info-manual-install']) - - opts.add_argumented (help = 'Use install-info when installing info manual, and set description\nDefault', - alternatives = ['--with-info-install', '--with-info-manual-install'], arg='DESCRIPTION') - - opts.add_argumentless(help = 'Do not compress info manual', - alternatives = ['--without-info-compression', '--without-info-manual-compression']) - - opts.add_argumented (help = 'Select compression for info manual\nDefault = gz, xz is also recognised', - alternatives = ['--with-info-compression', '--with-info-manual-compression'], arg='COMPRESSION') - - - for man in manpages: - opts.add_argumentless(help = 'Do not install %s manpage manual' % (man[1]), - alternatives = ['--without-man-%s' % (man[0]), '--without-manpage-%s' % (man[0]), '--without-man-manual-%s' % (man[0]), - '--without-%s-man' % (man[0]), '--without-%s-manpage' % (man[0]), '--without-%s-man-manual' % (man[0])]) - - opts.add_argumented (help = 'Set directory for %s manpage\nDefault = $SHARE/man' % (man[1]), - alternatives = ['--with-man-%s' % (man[0]), '--with-manpage-%s' % (man[0]), '--with-man-manual-%s' % (man[0]), - '--with-%s-man' % (man[0]), '--with-%s-manpage' % (man[0]), '--with-%s-man-manual' % (man[0])], arg='MANDIR') - - - opts.add_argumentless(help = 'Do not install any manpages', - alternatives = ['--without-man', '--without-manpage', '--without-man-manual']) - - opts.add_argumented (help = 'Set directory for all man pages\nDefault = $SHARE/man', - alternatives = ['--with-man', '--with-manpage', '--with-man-manual'], arg='MANDIR') - - for man in manpages: - opts.add_argumentless(help = 'Do not compress %s manpage' % (man[1]), - alternatives = ['--without-man-%s-compression' % (man[0]), '--without-manpage-%s-compression' % (man[0]), '--without-man-manual-%s-compression' % (man[0]), - '--without-%s-man-compression' % (man[0]), '--without-%s-manpage-compression' % (man[0]), '--without-%s-man-manual-compression' % (man[0])]) - - opts.add_argumented (help = 'Select compression for %s manpage\nDefault = gz, xz is also recognised' % (man[1]), - alternatives = ['--with-man-%s-compression' % (man[0]), '--with-manpage-%s-compression' % (man[0]), '--with-man-manual-%s-compression' % (man[0]), - '--with-%s-man-compression' % (man[0]), '--with-%s-manpage-compression' % (man[0]), '--with-%s-man-manual-compression' % (man[0])], - arg='COMPRESSION') - - opts.add_argumentless(help = 'Do not compress any installed manpage', - alternatives = ['--without-man-compression', '--without-manpage-compression', '--without-man-manual-compression']) - - opts.add_argumented (help = 'Select compression for installed manpages\nDefault = gz, xz is also recognised', - alternatives = ['--with-man-compression', '--with-manpage-compression', '--with-man-manual-compression'], arg='COMPRESSION') - - for man in mansections: - opts.add_argumented (help = 'Change the section for the %s manpage\nDefault = %s' % man, - alternatives = ['--man-section-%s' % (man[0]), '--%s-manpage-section' % (man[0]), - '--man-section-%s' % (man[0]), '--%s-manpage-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\nDefault = $SHAREDIR/ponysay/%s' % (dir[1], dir[0]), - alternatives = [ '--with-' + dir[0]], arg=dir[2]) - - opts.add_argumentless(help = 'Do not install UCS pony name map', - alternatives = ['--without-ucs', '--without-ucs-names']) - - opts.add_argumented (help = 'Set file for the UCS pony name map\nDefault = $SHAREDIR/ponysay/ucsmap', - alternatives = ['--with-ucs', '--with-ucs-names'], arg='UCSFILE') - - - opts.add_argumentless(help = 'Let the installer set the env name for python in ponysay\nDefault', - 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\nDefault = /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\nDefault = $PREFIX/bin', - alternatives = ['--bin-dir'], arg='BINDIR') - - opts.add_argumented (help = 'Set the system\'s directory for non-executable libraries\nDefault = $PREFIX/lib/ponysay\nNot used.', - alternatives = ['--lib-dir'], arg='LIBDIR') - - opts.add_argumented (help = 'Set the system\'s directory for non-command executables\nDefault = $PREFIX/libexec/ponysay\nNot used.', - alternatives = ['--libexec-dir'], arg='LIBDIR') - - opts.add_argumented (help = 'Set the system\'s directory for resource files\nDefault = $PREFIX/share', - alternatives = ['--share-dir'], arg='SHAREDIR') - - opts.add_argumented (help = 'Set the system\'s directory for cache directories\nDefault = /var/cache', - alternatives = ['--cache-dir'], arg='CACHEDIR') - - - opts.add_argumented (help = 'Set off environment for installation\nEmpty by default', - alternatives = ['--dest-dir'], arg='DESTDIR') - - - opts.add_argumented (help = 'Set how to link identical files\nDefault = symbolic, copy and hard are also recognised', - alternatives = ['--linking'], arg='TYPE') - - - - opts.parse() - - - self.linking = SYMBOLIC - if opts.opts['--linking'] is not None: - self.linking = opts.opts['--linking'][0] - - - if (opts.opts['---DESTDIR'] is not None) and (opts.opts['--dest-dir'] is None): - destdir = opts.opts['---DESTDIR'][0] - if len(destdir) > 0: - opts.opts['--dest-dir'] = [destdir] - - if (opts.opts['---PREFIX'] is not None) and (opts.opts['--prefix'] is None): - prefix = opts.opts['---PREFIX'][0] - if len(prefix) > 0: - opts.opts['--prefix'] = [prefix] - - - if (len(opts.files) > 1) or (opts.opts['--help'] is not None) or ((len(opts.files) == 1) and (opts.files[0] == 'help')): - 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] - if method == 'clean': self.clean() - elif method == 'clean-old': self.cleanOld() - else: - conf = self.configure(opts.opts) - self.viewconf(conf) - - if method == 'build': - self.build(conf) - - elif method == 'prebuilt': - self.applyDestDir(conf) - self.install(conf) - - elif method == 'install': - self.build(conf) - self.applyDestDir(conf) - self.install(conf) - self.clean() - - elif method == 'uninstall': - self.uninstall(conf) - - elif method == 'uninstall-old': - self.uninstallOld(conf) - - elif not method == 'view': - opts.help() - - - ''' - 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: - if conf[command] is not None: print(GREEN % ('Installing command ' + command + ' as ', conf[command])) - 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]: - if conf[shell] is not None: print(GREEN % ('Installing auto-completion for ' + shell + ' as ', conf[shell])) - 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')) - if conf['info-install'] is not None: print(GREEN % ('Installing info manual with install-info with description: ', conf['info-install'])) - 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')) - for man in mansections: print(GREEN % ('References to manpage for ' + man[0] + ' points to section ', conf['man-section-' + man[0]])) - 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')) - for miscfile in miscfiles: print(GREEN % ('Installing ' + miscfile[0] + ' to ', conf[miscfile[0]])) - print('Prefered linking style: ' + self.linking) - - print() - - - ''' - Compile ponysay - ''' - def build(self, conf): - print('\033[1;34m::\033[39mCompiling...\033[21m') - - 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() - out = out.decode('utf8', 'replace') + err.decode('utf8', 'replace') - out = out.replace('\n', '') - env = out.split(' ')[1].split('.')[0] - if int(env) < 3: env = 'python3' - else: env = 'python' - 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', 'wb+') - filein = open('ponysay.py', 'rb') - data = filein.read().decode('utf-8', 'replace') - - if '#!/usr/bin/env python3' in data: - data = data.replace('#!/usr/bin/env python3', '#!/usr/bin/env ' + env) - else: - 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]) - for sharefile in sharefiles: - data = data.replace('/usr/share/ponysay/' + sharefile[1], conf[sharefile[0]]) - data = data.replace('\nVERSION = \'dev\'', '\nVERSION = \'%s\'' % (PONYSAY_VERSION)) - - fileout.write(data.encode('utf-8')) - 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, 'wb+') - filein = open(src, 'rb') - data = filein.read().decode('utf-8', 'replace') - - 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.encode('utf-8')) - 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 - compress(src, dest, ext) - - 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) - - if conf['pdf-compression'] is not None: - ext = conf['pdf-compression'] - if ext is not None: - compress('ponysay.pdf', 'ponysay.pdf.' + ext, ext) - - 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: - if conf[command] is not None: - dest = src + '.' + command - (fileout, filein) = (None, None) - try: - fileout = open(dest, 'wb+') - filein = open(src, 'rb') - data = filein.read().decode('utf-8', 'replace') - - 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.encode('utf-8')) - finally: - if fileout is not None: fileout.close() - if filein is not None: filein .close() - - if conf['quotes'] is not None: - self.removeLists([], ['quotes']) - os.mkdir('quotes') - ponymap = None - try: - ponymap = open('ponyquotes/ponies', 'rb') - ponies = [line for line in ponymap.read().decode('utf-8', 'replace').split('\n')] - for _ponies in ponies: - for pony in _ponies.split('+'): - if len(pony) > 0: - 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('.'):]) - finally: - if ponymap is not None: - ponymap.close() - print() - - - ''' - Install compiled ponysay - ''' - def install(self, conf): - print('\033[1;34m::\033[39mInstalling...\033[21m') - - dests = [] - for command in commands: - 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: - os.chmod(dest, 0o755) - else: - os.chmod(dests[0], 0o755) - if conf['shared-cache'] is not None: - dir = conf['shared-cache'] - 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) - os.mkdir(dir) - print('Setting permission mode mask for ' + dir + ' to 6777') - Popen('chmod -R 6777 -- \'' + dir.replace('\'', '\'\\\'\'') + '\'', shell=True).wait() - print('Setting group for ' + dir + ' users') - Popen('chown -R :users -- \'' + dir.replace('\'', '\'\\\'\'') + '\'', shell=True).wait() - 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] - 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] - if conf[key] is not None: - src = 'manuals/manpage' + lang + '.0.' + ('install' if conf[key + '-compression'] is None else conf[key + '-compression']) - dests = [] - for command in commands: - if conf[command] is not None: - dest = '%s/%s/%s.%s%s' % (conf[key], sub, command, section, '' if conf[key + '-compression'] is None else '.' + conf[key + '-compression']) - dests.append(dest) - self.cp(False, src, dests) - for dir in sharedirs: - 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]]]) - for file in miscfiles: - self.cp(False, file[0], [conf[file[0]]]) - print() - - - ''' - Uninstall ponysay - ''' - def uninstall(self, conf): - print('\033[1;34m::\033[39mUninstalling...\033[21m') - - (files, dirs, infos) = ([], [], []) - - 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) - for man in [item[0] for item in manpages]: - key = 'man-' + man - section = conf['man-section-ponysay'] - if man is manpages[0]: sub = 'man' + section - else: sub = man[0] + '/man' + section - if conf[key] is not None: - for command in commands: - if conf[command] is not None: - files.append('%s/%s/%s.%s%s' % (conf[key], sub, command, section, '' if conf[key + '-compression'] is None else '.' + conf[key + '-compression'])) - for dir in sharedirs: - 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]]) - for file in miscfiles: - files.append(conf[file[0]]) - - for info in infos: - cmdarr = ['install-info', '--delete', '--dir-file=' + conf['info'] + '/dir', info] - cmd = ' '.join(['\'%s\'' % (elem.replace('\'', '\'\\\'\'')) for elem in cmdarr]) - print('Uninstalling info manual ' + info + ' with install-info') - os.system(cmd) - - self.removeLists(files, dirs) - print() - - - ''' - 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 - - self.removeLists(files, dirs) - print() - - - ''' - Remove compiled files - ''' - def clean(self): - print('\033[1;34m::\033[39mCleaning...\033[21m') - - files = ['ponysay.info', 'ponysay.info.gz', 'ponysay.info.xz', 'ponysay.pdf.gz', 'ponysay.pdf.xz', 'ponysay.install'] - dirs = ['quotes'] - for comp in ['install', 'gz', 'xz']: - for man in manpages: - if man is manpages[0]: man = '' - else: man = '.' + man[0] - for sec in range(0, 9): - files.append('manuals/manpage%s.%s.%s' % (man, str(sec), comp)) - for shell in [item[0] for item in shells]: - for command in commands: - files.append('completion/%s-completion.%s.%s' % (shell, 'sh' if shell == 'bash' else shell, command)) - - self.removeLists(files, dirs) - print() - - - ''' - 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 = [] - 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)) - - self.removeLists(files, dirs) - print() - - - ''' - Removes listed files and directories - ''' - def removeLists(self, files, dirs): - for file in files: - if os.path.isfile(file) or os.path.islink(file): - print('Unlinking file %s' % (file)) - os.unlink(file) - dir = file - while True: - dir = dir[:dir.rfind('/')] - if ('/ponysay/' in (dir + '/')) and (len(os.listdir(dir)) == 0): - print('Removing newly empty directory %s' % (dir)) - os.rmdir(dir) - else: - break; - for dir in dirs: - if os.path.isdir(dir) or os.path.islink(dir): - print('Cascadingly removing directory %s' % (dir)) - if os.path.islink(dir): os.unlink(dir) - else: shutil.rmtree(dir) - while True: - dir = dir[:dir.rfind('/')] - if ('/ponysay/' in (dir + '/')) and (len(os.listdir(dir)) == 0): - print('Removing newly empty directory %s' % (dir)) - os.rmdir(dir) - else: - break; - - - ''' - Copys a files or directory to multiple destinations - ''' - def cp(self, recursive, source, destinations): - if os.path.islink(source) and (self.linking != COPY) and os.path.isdir(os.path.realpath(source)): - target = os.readlink(source) - for dest in destinations: - print('Creating symbolic link %s with target directory %s' % (dest, target)) - if os.path.exists(dest): - self.removeLists([], [dest]) - self.symlink(target, dest) - if os.path.islink(source) and (self.linking != COPY) and os.path.isfile(os.path.realpath(source)): - target = os.readlink(source) - if self.linking == HARD: - for dest in destinations: - print('Creating hard link %s with target file %s' % (dest, target)) - if os.path.exists(dest): - self.removeLists([], [dest]) - mytarget = os.path.abspath(os.path.join(os.path.dirname(dest), target)) - if os.path.exists(mytarget): - os.link(mytarget, dest) - else: - print('\033[31mTarget did not exists, using symlink instead\033[39m') - self.symlink(target, dest) - else: - for dest in destinations: - print('Creating symbolic link %s with target file %s' % (dest, target)) - if os.path.exists(dest): - self.removeLists([], [dest]) - self.symlink(target, dest) - 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) - links = [] - for file in os.listdir(source): - src = source + '/' + file - if os.path.exists(src) and os.path.islink(src): - links.append((os.path.isdir(src), src, [dest + '/' + file])) - else: - self.cp(os.path.isdir(src), src, [dest + '/' + file]) - for link in links: - self.cp(link[0], link[1], link[2]) - if self.linking != COPY: - for dest in destinations[1:]: - print('Creating symbolic link %s with target directory %s' % (dest, target)) - if os.path.exists(dest): - self.removeLists([], [dest]) - self.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)) - if os.path.exists(dest): - os.unlink(dest) - os.link(target, dest) - elif self.linking == SYMBOLIC: - for dest in destinations[1:]: - print('Creating symbolic link %s with target file %s' % (dest, target)) - if os.path.exists(dest): - os.unlink(dest) - self.symlink(target, dest) - - - ''' - Create a symlink with a relative path - ''' - def symlink(self, target, dest): - if target.startswith('./') or target.startswith('../'): - os.symlink(target, dest) - elif '/' not in target: - os.symlink('./' + target, dest) - else: - targets = target.split('/') - dests = dest.split('/') - - while (len(targets) > 1) and (len(dests) > 1) and (targets[0] == dests[0]): - targets = targets[1:] - dests = dests[1:] - - if (len(dests) == 1): - targets = ['.'] + targets - else: - targets = (['..'] * (len(dests) - 1)) + targets - - os.symlink('/'.join(targets), dest) - - - ''' - Parses configurations - ''' - def configure(self, opts): - (defaults, conf) = ({}, {}) - - for command in commands: - conf[command] = '/usr/bin/' + command - 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' - conf['info-install'] = 'My Little Ponies for your terminal' - 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: - conf[sharedir[0]] = '/usr/share/ponysay/' + sharedir[0] - for sharefile in sharefiles: - conf[sharefile[0]] = '/usr/share/ponysay/' + sharefile[1] - conf['custom-env-python'] = 'python3' - for miscfile in miscfiles: - conf[miscfile[0]] = miscfile[1] - - - if opts['--private'] is not None: - if opts['--prefix'] is None: - opts['--prefix'] = [os.environ['HOME'] + '/.local'] - - prefix = '/usr' - if opts['--prefix'] is not None: - prefix = opts['--prefix'][0] - for key in conf: - if conf[key] not in (None, False, True): - if conf[key].startswith('/usr'): - conf[key] = prefix + conf[key][4:] - conf['~prefix~'] = prefix - - if opts['--opt'] is not None: - if opts['--bin-dir'] is None: opts['--bin-dir'] = ['/opt/ponysay/bin'] - if opts['--lib-dir'] is None: opts['--lib-dir'] = ['/opt/ponysay/lib'] - if opts['--libexec-dir'] is None: opts['--libexec-dir'] = ['/opt/ponysay/libexec'] - if opts['--share-dir'] is None: opts['--share-dir'] = ['/usr/share'] - if opts['--with-shared-cache'] is None: opts['--with-shared-cache'] = ['/var/opt/ponysay/cache'] - for sharedir in sharedirs: - conf[sharedir[0]] = '/opt/ponysay/share/' + sharedir[0] - for sharefile in sharefiles: - conf[sharefile[0]] = '/opt/ponysay/share/' + sharefile[1] - - for dir in ['bin', 'lib', 'libexec', 'share']: - if opts['--' + dir + '-dir'] is not None: - d = opts['--' + dir + '-dir'][0] - if dir == 'lib': - dir += '/ponysay' - for key in conf: - if conf[key] not in [None, True, False]: - if conf[key].startswith(prefix + '/' + dir): - conf[key] = d + conf[key][5 + len(dir):] - if opts['--cache-dir'] is not None: - dir = opts['--cache-dir'][0] - for key in conf: - 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] - - - if opts['--nothing'] is not None: - opts['--minimal'] = opts['--nothing'] - - for key in ['custom-env-python']: - conf[key] = None - - - if opts['--everything'] is None: - for key in ['pdf', 'pdf-compression']: - conf[key] = None - - nomanen = opts['--minimal'] is not None - for manpage in manpages: - if (manpage is not manpages[0]) or nomanen: - for key in ['man-' + manpage[0]]: - conf[key] = None - - if (opts['--private'] is not None) or (opts['--minimal'] is not None): - for key in ['info-install', 'shared-cache']: - conf[key] = None - - if opts['--minimal'] is not None: - for key in ['info'] + [item[0] for item in shells]: - conf[key] = None - for sharedir in sharedirs: - if sharedir is not sharedirs[0]: - conf[sharedir[0]] = None - for sharefile in sharefiles: - conf[sharefile[0]] = None - - if opts['--nothing'] is not None: - for command in commands: - conf[command] = None - conf[sharedirs[0][0]] = None - - - 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]] - ]: - 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]); - - - for key in conf: - if '--with-' + key not in opts: - continue - 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: - conf['man-section-' + mansection[0]] = opts['--man-section-' + mansection[0]][0] - else: - conf['man-section-' + mansection[0]] = mansection[1] - - - - self.destDir = None if opts['--dest-dir'] is None else opts['--dest-dir'][0] - - return conf - - - def applyDestDir(self, conf): - if self.destDir is not None: - for key in conf: - if conf[key] not in (None, False, True): - if conf[key].startswith('/'): - conf[key] = self.destDir + conf[key] - - - def unapplyDestDir(self, conf): - if self.destDir is not None: - for key in conf: - if conf[key] not in (None, False, True): - if conf[key].startswith(self.destDir): - conf[key] = conf[key][len(self.destDir):] - - - -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 = [] - (argqueue, optqueue, get) = ([], [], False) - - for arg in argv[1:]: - if get: - get = False - if (arg is argv[-1]) or ((len(arg) > 2) and (arg[:2] in ('--', '++'))): - 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:]) - else: - sys.stderr.write('%s: fatal: unrecognised option %s. see --help or the manual\n' % (self.__program, arg)) - exit(-1) - elif (arg in self.optmap) and (self.optmap[arg][1] == ARGUMENTED): - optqueue.append(arg) - get = True - else: - sys.stderr.write('%s: fatal: unrecognised option %s. see --help or the manual\n' % (self.__program, arg)) - exit(-1) - else: - self.files.append(arg) - - (i, n) = (0, len(optqueue)) - if len(argqueue) < n: - argqueue.append(None) - 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): - self.opts[opt] = [arg] - else: - sys.stderr.write('%s: fatal: duplicate option %s\n' % (self.__program, arg)) - exit(-1) - - ''' - 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() - |