home *** CD-ROM | disk | FTP | other *** search
Wrap
# Source Generated with Decompyle++ # File: in.pyc (Python 2.6) __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>' import sys import os import cPickle import textwrap import stat from subprocess import check_call from calibre import __appname__, prints, guess_type from calibre.constants import islinux, isfreebsd from calibre.customize.ui import all_input_formats from calibre.ptempfile import TemporaryDirectory from calibre import CurrentDir entry_points = { 'console_scripts': [ 'ebook-device = calibre.devices.prs500.cli.main:main', 'ebook-meta = calibre.ebooks.metadata.cli:main', 'ebook-convert = calibre.ebooks.conversion.cli:main', 'markdown-calibre = calibre.ebooks.markdown.markdown:main', 'web2disk = calibre.web.fetch.simple:main', 'calibre-server = calibre.library.server.main:main', 'lrf2lrs = calibre.ebooks.lrf.lrfparser:main', 'lrs2lrf = calibre.ebooks.lrf.lrs.convert_from:main', 'librarything = calibre.ebooks.metadata.library_thing:main', 'calibre-debug = calibre.debug:main', 'calibredb = calibre.library.cli:main', 'calibre-parallel = calibre.utils.ipc.worker:main', 'calibre-customize = calibre.customize.ui:main', 'calibre-complete = calibre.utils.complete:main', 'pdfmanipulate = calibre.ebooks.pdf.manipulate.cli:main', 'fetch-ebook-metadata = calibre.ebooks.metadata.fetch:main', 'epub-fix = calibre.ebooks.epub.fix.main:main', 'calibre-smtp = calibre.utils.smtp:main'], 'gui_scripts': [ __appname__ + ' = calibre.gui2.main:main', 'lrfviewer = calibre.gui2.lrf_renderer.main:main', 'ebook-viewer = calibre.gui2.viewer.main:main'] } UNINSTALL = "#!{python}\neuid = {euid}\n\nimport os, subprocess, shutil\n\nif os.geteuid() != euid:\n print 'WARNING: uninstaller must be run as', euid, 'to remove all files'\n\nfor x in {manifest!r}:\n if not os.path.exists(x): continue\n print 'Removing', x\n try:\n if os.path.isdir(x):\n shutil.rmtree(x)\n else:\n os.unlink(x)\n except Exception, e:\n print 'Failed to delete', x\n print '\t', e\n\nicr = {icon_resources!r}\nfor context, name, size in icr:\n cmd = ['xdg-icon-resource', 'uninstall', '--context', context, '--size', size, name]\n if (context, name) != icr[-1]:\n cmd.insert(2, '--noupdate')\n ret = subprocess.call(cmd)\n if ret != 0:\n print 'WARNING: Failed to remove icon', name\n\nmr = {menu_resources!r}\nfor f in mr:\n cmd = ['xdg-desktop-menu', 'uninstall', f]\n ret = subprocess.call(cmd)\n if ret != 0:\n print 'WARNING: Failed to remove menu item', f\n\nos.remove(os.path.abspath(__file__))\n" class PostInstall: def task_failed(self, msg): self.warn(msg, 'with error:') import traceback tb = '\n\t'.join(traceback.format_exc().splitlines()) self.info('\t' + tb) print def warning(self, *args, **kwargs): print '\n' + '____________________', 'WARNING', '____________________' prints(*args, **kwargs) print '_' * 50 self.warnings.append((args, kwargs)) sys.stdout.flush() def __init__(self, opts, info = prints, warn = None, manifest = None): self.opts = opts self.info = info self.warn = warn self.warnings = [] if self.warn is None: self.warn = self.warning if not self.opts.staging_bindir: self.opts.staging_bindir = os.path.join(self.opts.staging_root, 'bin') if not self.opts.staging_sharedir: self.opts.staging_sharedir = os.path.join(self.opts.staging_root, 'share', 'calibre') self.opts.staging_etc = None if self.opts.staging_root == '/usr' else os.path.join(self.opts.staging_root, 'etc') scripts = cPickle.loads(P('scripts.pickle', data = True)) if getattr(sys, 'frozen_path', False): self.info('Creating symlinks...') for exe in scripts.keys(): dest = os.path.join(self.opts.staging_bindir, exe) if os.path.lexists(dest): os.unlink(dest) tgt = os.path.join(getattr(sys, 'frozen_path'), exe) self.info('\tSymlinking %s to %s' % (tgt, dest)) os.symlink(tgt, dest) self.manifest = manifest self.icon_resources = [] self.menu_resources = [] self.mime_resources = [] if islinux: self.setup_completion() self.install_man_pages() if islinux: self.setup_desktop_integration() self.create_uninstaller() config_dir = config_dir import calibre.utils.config if os.path.exists(config_dir): os.chdir(config_dir) if islinux: for f in os.listdir('.'): if os.stat(f).st_uid == 0: None if os.path.isdir(f) else os.unlink(f) continue if os.stat(config_dir).st_uid == 0: os.rmdir(config_dir) if warn is None and self.warnings: self.info('There were %d warnings' % len(self.warnings)) for args, kwargs in self.warnings: self.info('*', *args, **kwargs) print def create_uninstaller(self): dest = os.path.join(self.opts.staging_bindir, 'calibre-uninstall') raw = UNINSTALL.format(python = os.path.abspath(sys.executable), euid = os.geteuid(), manifest = self.manifest, icon_resources = self.icon_resources, menu_resources = self.menu_resources) try: try: f = _[1] f.write(raw) finally: pass os.chmod(dest, stat.S_IRWXU | stat.S_IRGRP | stat.S_IROTH) if os.geteuid() == 0: os.chown(dest, 0, 0) except: if self.opts.fatal_errors: raise self.opts.fatal_errors self.task_failed('Creating uninstaller failed') def setup_completion(self): try: self.info('Setting up bash completion...') metaop = option_parser meta_filetypes = filetypes import calibre.ebooks.metadata.cli lrf2lrsop = option_parser import calibre.ebooks.lrf.lrfparser lrfviewerop = option_parser import calibre.gui2.lrf_renderer.main viewer_op = option_parser import calibre.gui2.viewer.main fem_op = option_parser import calibre.ebooks.metadata.fetch guiop = option_parser import calibre.gui2.main smtp_op = option_parser import calibre.utils.smtp fix_op = option_parser import calibre.ebooks.epub.fix.main any_formats = [ 'epub', 'htm', 'html', 'xhtml', 'xhtm', 'rar', 'zip', 'txt', 'lit', 'rtf', 'pdf', 'prc', 'mobi', 'fb2', 'odt', 'lrf'] bc = os.path.join(os.path.dirname(self.opts.staging_sharedir), 'bash-completion') if os.path.exists(bc): f = os.path.join(bc, 'calibre') else: f = os.path.join(self.opts.staging_etc, 'bash_completion.d/calibre') if not os.path.exists(os.path.dirname(f)): os.makedirs(os.path.dirname(f)) self.manifest.append(f) self.info('Installing bash completion to', f) try: f = _[1] f.write('# calibre Bash Shell Completion\n') f.write(opts_and_exts('calibre', guiop, any_formats)) f.write(opts_and_exts('lrf2lrs', lrf2lrsop, [ 'lrf'])) f.write(opts_and_exts('ebook-meta', metaop, list(meta_filetypes()))) f.write(opts_and_exts('lrfviewer', lrfviewerop, [ 'lrf'])) f.write(opts_and_exts('ebook-viewer', viewer_op, any_formats)) f.write(opts_and_words('fetch-ebook-metadata', fem_op, [])) f.write(opts_and_words('calibre-smtp', smtp_op, [])) f.write(opts_and_exts('epub-fix', fix_op, [ 'epub'])) f.write(textwrap.dedent('\n _ebook_device_ls()\n {\n local pattern search listing prefix\n pattern="$1"\n search="$1"\n if [[ -n "{$pattern}" ]]; then\n if [[ "${pattern:(-1)}" == "/" ]]; then\n pattern=""\n else\n pattern="$(basename ${pattern} 2> /dev/null)"\n search="$(dirname ${search} 2> /dev/null)"\n fi\n fi\n\n if [[ "x${search}" == "x" || "x${search}" == "x." ]]; then\n search="/"\n fi\n\n listing="$(ebook-device ls ${search} 2>/dev/null)"\n\n prefix="${search}"\n if [[ "x${prefix:(-1)}" != "x/" ]]; then\n prefix="${prefix}/"\n fi\n\n echo $(compgen -P "${prefix}" -W "${listing}" "${pattern}")\n }\n\n _ebook_device()\n {\n local cur prev\n cur="${COMP_WORDS[COMP_CWORD]}"\n prev="${COMP_WORDS[COMP_CWORD-1]}"\n COMPREPLY=()\n case "${prev}" in\n ls|rm|mkdir|touch|cat )\n COMPREPLY=( $(_ebook_device_ls "${cur}") )\n return 0\n ;;\n cp )\n if [[ ${cur} == prs500:* ]]; then\n COMPREPLY=( $(_ebook_device_ls "${cur:7}") )\n return 0\n else\n _filedir\n return 0\n fi\n ;;\n prs500 )\n COMPREPLY=( $(compgen -W "cp ls rm mkdir touch cat info books df" "${cur}") )\n return 0\n ;;\n * )\n if [[ ${cur} == prs500:* ]]; then\n COMPREPLY=( $(_ebook_device_ls "${cur:7}") )\n return 0\n else\n if [[ ${prev} == prs500:* ]]; then\n _filedir\n return 0\n else\n COMPREPLY=( $(compgen -W "prs500:" "${cur}") )\n return 0\n fi\n return 0\n fi\n ;;\n esac\n }\n complete -o nospace -F _ebook_device ebook-device\n\n complete -o nospace -C calibre-complete ebook-convert\n ')) finally: pass except TypeError: err = None if 'resolve_entities' in str(err): print 'You need python-lxml >= 2.0.5 for calibre' sys.exit(1) raise except: if self.opts.fatal_errors: raise self.opts.fatal_errors self.task_failed('Setting up completion failed') def install_man_pages(self): try: create_man_page = create_man_page import calibre.utils.help2man if isfreebsd: manpath = os.path.join(self.opts.staging_root, 'man/man1') else: manpath = os.path.join(self.opts.staging_sharedir, 'man/man1') if not os.path.exists(manpath): os.makedirs(manpath) self.info('Installing MAN pages...') for src in entry_points['console_scripts']: (prog, right) = src.split('=') prog = prog.strip() module = __import__(right.split(':')[0].strip(), fromlist = [ 'a']) parser = getattr(module, 'option_parser', None) if parser is None: continue parser = parser() raw = create_man_page(prog, parser) if isfreebsd: manfile = os.path.join(manpath, prog + '.1') else: manfile = os.path.join(manpath, prog + '.1' + __appname__ + '.bz2') self.info('\tInstalling MAN page for', prog) open(manfile, 'wb').write(raw) self.manifest.append(manfile) except: if self.opts.fatal_errors: raise self.opts.fatal_errors self.task_failed('Installing MAN pages failed') def setup_desktop_integration(self): try: self.info('Setting up desktop integration...') try: tdir = _[1] CurrentDir(tdir).__enter__() try: render_img('mimetypes/lrf.svg', 'calibre-lrf.png') check_call('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png application-lrf', shell = True) self.icon_resources.append(('mimetypes', 'application-lrf', '128')) check_call('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png text-lrs', shell = True) self.icon_resources.append(('mimetypes', 'application-lrs', '128')) render_img('lt.png', 'calibre-gui.png') check_call('xdg-icon-resource install --noupdate --size 128 calibre-gui.png calibre-gui', shell = True) self.icon_resources.append(('apps', 'calibre-gui', '128')) render_img('viewer.svg', 'calibre-viewer.png') check_call('xdg-icon-resource install --size 128 calibre-viewer.png calibre-viewer', shell = True) self.icon_resources.append(('apps', 'calibre-viewer', '128')) mimetypes = set([]) for x in all_input_formats(): mt = guess_type('dummy.' + x)[0] if mt and 'chemical' not in mt: mimetypes.add(mt) continue CurrentDir(tdir).__exit__ def write_mimetypes(f): f.write('MimeType=%s;\n' % ';'.join(mimetypes)) f = open('calibre-lrfviewer.desktop', 'wb') f.write(VIEWER) f.close() f = open('calibre-ebook-viewer.desktop', 'wb') f.write(EVIEWER) write_mimetypes(f) f.close() f = open('calibre-gui.desktop', 'wb') f.write(GUI) write_mimetypes(f) f.close() des = ('calibre-gui.desktop', 'calibre-lrfviewer.desktop', 'calibre-ebook-viewer.desktop') for x in des: cmd = [ 'xdg-desktop-menu', 'install', './' + x] check_call(' '.join(cmd), shell = True) self.menu_resources.append(x) f = open('calibre-mimetypes', 'wb') f.write(MIME) f.close() self.mime_resources.append('calibre-mimetypes') check_call('xdg-mime install ./calibre-mimetypes', shell = True) finally: pass finally: pass except Exception: if self.opts.fatal_errors: raise self.opts.fatal_errors self.task_failed('Setting up desktop integration failed') def option_parser(): OptionParser = OptionParser import calibre.utils.config parser = OptionParser() parser.add_option('--make-errors-fatal', action = 'store_true', default = False, dest = 'fatal_errors', help = 'If set die on errors.') parser.add_option('--root', dest = 'staging_root', default = '/usr', help = 'Prefix under which to install files') parser.add_option('--bindir', default = None, dest = 'staging_bindir', help = 'Location where calibre launcher scripts were installed. Typically /usr/bin') parser.add_option('--sharedir', default = None, dest = 'staging_sharedir', help = 'Location where calibre resources were installed, typically /usr/share/calibre') return parser def options(option_parser): parser = option_parser() options = parser.option_list for group in parser.option_groups: options += group.option_list opts = [] for opt in options: opts.extend(opt._short_opts) opts.extend(opt._long_opts) return opts def opts_and_words(name, op, words): opts = '|'.join(options(op)) words = []([ w.replace("'", "\\'") for w in words ]) fname = name.replace('-', '_') return ('_' + fname + '()' + '\n{\n local cur opts\n local IFS=$\'|\\t\'\n COMPREPLY=()\n cur="${COMP_WORDS[COMP_CWORD]}"\n opts="%s"\n words="%s"\n\n case "${cur}" in\n -* )\n COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )\n COMPREPLY=( $( echo ${COMPREPLY[@]} | sed \'s/ /\\\\ /g\' | tr \'\\n\' \'\\t\' ) )\n return 0\n ;;\n * )\n COMPREPLY=( $(compgen -W "${words}" -- ${cur}) )\n COMPREPLY=( $( echo ${COMPREPLY[@]} | sed \'s/ /\\\\ /g\' | tr \'\\n\' \'\\t\' ) )\n return 0\n ;;\n esac\n\n}\ncomplete -F _' % (opts, words) + fname + ' ' + name + '\n\n').encode('utf-8') def opts_and_exts(name, op, exts): opts = ' '.join(options(op)) []([ i.upper() for i in exts ]) exts = '|'.join(exts) fname = name.replace('-', '_') return '_' + fname + '()' + '\n{\n local cur prev opts\n COMPREPLY=()\n cur="${COMP_WORDS[COMP_CWORD]}"\n prev="${COMP_WORDS[COMP_CWORD-1]}"\n opts="%s"\n pics="@(jpg|jpeg|png|gif|bmp|JPG|JPEG|PNG|GIF|BMP)"\n\n case "${prev}" in\n --cover )\n _filedir "${pics}"\n return 0\n ;;\n esac\n\n case "${cur}" in\n --cover )\n _filedir "${pics}"\n return 0\n ;;\n -* )\n COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )\n return 0\n ;;\n * )\n _filedir \'@(%s)\'\n return 0\n ;;\n esac\n\n}\ncomplete -o filenames -F _' % (opts, exts) + fname + ' ' + name + '\n\n' VIEWER = '[Desktop Entry]\nVersion=1.0\nType=Application\nName=LRF Viewer\nGenericName=Viewer for LRF files\nComment=Viewer for LRF files (SONY ebook format files)\nTryExec=lrfviewer\nExec=lrfviewer %F\nIcon=calibre-viewer\nMimeType=application/x-sony-bbeb;\nCategories=Graphics;Viewer;\n' EVIEWER = '[Desktop Entry]\nVersion=1.0\nType=Application\nName=E-book Viewer\nGenericName=Viewer for E-books\nComment=Viewer for E-books in all the major formats\nTryExec=ebook-viewer\nExec=ebook-viewer %F\nIcon=calibre-viewer\nCategories=Graphics;Viewer;\n' GUI = '[Desktop Entry]\nVersion=1.0\nType=Application\nName=calibre\nGenericName=E-book library management\nComment=E-book library management: Convert, view, share, catalogue all your e-books\nTryExec=calibre\nExec=calibre\nIcon=calibre-gui\nCategories=Office;\n' MIME = '<?xml version="1.0"?>\n<mime-info xmlns=\'http://www.freedesktop.org/standards/shared-mime-info\'>\n <mime-type type="application/x-sony-bbeb">\n <comment>SONY E-book compiled format</comment>\n <glob pattern="*.lrf"/>\n </mime-type>\n <mime-type type="application/epub+zip">\n <comment>EPUB ebook format</comment>\n <glob pattern="*.epub"/>\n </mime-type>\n <mime-type type="text/lrs">\n <comment>SONY E-book source format</comment>\n <glob pattern="*.lrs"/>\n </mime-type>\n</mime-info>\n' def render_img(image, dest, width = 128, height = 128): QImage = QImage Qt = Qt import PyQt4.Qt img = QImage(I(image)).scaled(width, height, Qt.IgnoreAspectRatio, Qt.SmoothTransformation) img.save(dest) def main(): p = option_parser() (opts, args) = p.parse_args() PostInstall(opts) return 0 if __name__ == '__main__': sys.exit(main())