From 9a3de4a8aee1ef2fd67c620cedd4a8c6bc88274d Mon Sep 17 00:00:00 2001
From: Kovid Goyal
Date: Sun, 28 Oct 2007 04:53:50 +0000
Subject: [PATCH] Initial implemetation of trac download plugin
---
src/libprs500/trac/__init__.py | 18 ++
src/libprs500/trac/download/__init__.py | 16 ++
src/libprs500/trac/download/download.py | 207 ++++++++++++++++++
.../download/htdocs/images/debian_logo.png | Bin 0 -> 23898 bytes
.../download/htdocs/images/fedora_logo.png | Bin 0 -> 37495 bytes
.../download/htdocs/images/gentoo_logo.png | Bin 0 -> 28862 bytes
.../download/htdocs/images/linux_logo.png | Bin 0 -> 12936 bytes
.../trac/download/htdocs/images/osx_logo.png | Bin 0 -> 6997 bytes
.../download/htdocs/images/ubuntu_logo.png | Bin 0 -> 3415 bytes
.../download/htdocs/images/windows_logo.png | Bin 0 -> 97605 bytes
.../download/htdocs/stylesheet/download.css | 0
.../trac/download/templates/binary.html | 24 ++
.../trac/download/templates/distro.html | 47 ++++
.../trac/download/templates/download.html | 34 +++
src/libprs500/trac/setup.py | 32 +++
15 files changed, 378 insertions(+)
create mode 100644 src/libprs500/trac/__init__.py
create mode 100644 src/libprs500/trac/download/__init__.py
create mode 100644 src/libprs500/trac/download/download.py
create mode 100644 src/libprs500/trac/download/htdocs/images/debian_logo.png
create mode 100644 src/libprs500/trac/download/htdocs/images/fedora_logo.png
create mode 100644 src/libprs500/trac/download/htdocs/images/gentoo_logo.png
create mode 100644 src/libprs500/trac/download/htdocs/images/linux_logo.png
create mode 100644 src/libprs500/trac/download/htdocs/images/osx_logo.png
create mode 100644 src/libprs500/trac/download/htdocs/images/ubuntu_logo.png
create mode 100644 src/libprs500/trac/download/htdocs/images/windows_logo.png
create mode 100644 src/libprs500/trac/download/htdocs/stylesheet/download.css
create mode 100644 src/libprs500/trac/download/templates/binary.html
create mode 100644 src/libprs500/trac/download/templates/distro.html
create mode 100644 src/libprs500/trac/download/templates/download.html
create mode 100644 src/libprs500/trac/setup.py
diff --git a/src/libprs500/trac/__init__.py b/src/libprs500/trac/__init__.py
new file mode 100644
index 0000000000..f2a5caf07b
--- /dev/null
+++ b/src/libprs500/trac/__init__.py
@@ -0,0 +1,18 @@
+## Copyright (C) 2007 Kovid Goyal kovid@kovidgoyal.net
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License along
+## with this program; if not, write to the Free Software Foundation, Inc.,
+## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+'''
+To test
+sudo tracd --port 8000 --auth libprs500,/var/www/localhost/htdocs/libprs500/passwd,libprs500 /var/www/localhost/htdocs/libprs500
+'''
diff --git a/src/libprs500/trac/download/__init__.py b/src/libprs500/trac/download/__init__.py
new file mode 100644
index 0000000000..b7d93c9623
--- /dev/null
+++ b/src/libprs500/trac/download/__init__.py
@@ -0,0 +1,16 @@
+## Copyright (C) 2007 Kovid Goyal kovid@kovidgoyal.net
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License along
+## with this program; if not, write to the Free Software Foundation, Inc.,
+## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+from download import *
\ No newline at end of file
diff --git a/src/libprs500/trac/download/download.py b/src/libprs500/trac/download/download.py
new file mode 100644
index 0000000000..3221b2c1cc
--- /dev/null
+++ b/src/libprs500/trac/download/download.py
@@ -0,0 +1,207 @@
+## Copyright (C) 2007 Kovid Goyal kovid@kovidgoyal.net
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License along
+## with this program; if not, write to the Free Software Foundation, Inc.,
+## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+import re
+from pkg_resources import resource_filename
+
+from trac.core import Component, implements
+from trac.web.chrome import INavigationContributor, ITemplateProvider, add_stylesheet
+from trac.web.main import IRequestHandler
+from trac.util import Markup
+
+
+__appname__ = 'libprs500'
+
+class Distribution(object):
+
+ DEPENDENCIES = [
+ #(Generic, version, gentoo, ubuntu, fedora)
+ ('python', '2.5', None, None, None),
+ ('setuptools', '0.6c5', 'setuptools', 'python-setuptools', 'python-setuptools'),
+ ('Python Imaging Library', '1.1.6', 'imaging', 'python-imaging', 'python-imaging'),
+ ('libusb', '0.1.12', None, None, None),
+ ('Qt', '4.3.1', 'qt', 'libqt4-core libqt4-gui', 'qt4'),
+ ('PyQt', '4.3.1', 'PyQt4', 'python-qt4', 'PyQt4'),
+ ('fonttools', '2.0-beta1', 'fonttools', 'fonttools', 'fonttools'),
+ ('unrtf', '0.20.1', 'unrtf', 'unrtf', 'unrtf'),
+ ('mechanize for python', '0.1.7b', 'dev-python/mechanize', 'python-mechanize', 'python-mechanize'),
+ ('ImageMagick', '6.3.5', 'imagemagick', 'imagemagick', 'imagemagick'),
+ ('xdg-utils', '1.0.2', 'xdg-utils', 'xdg-utils', 'xdg-utils'),
+ ('dbus-python', '0.82.2', 'dbus-python', 'python-dbus', 'dbus-python'),
+ ('convertlit', '1.8', 'convertlit', None, None)
+ ]
+
+ DISTRO_MAP = {'gentoo':2, 'ubuntu':3, 'fedora':4, 'debian':3}
+
+ INSTALLERS = ('emerge -av', 'apt-get install', 'yum install')
+ AS_ROOT = (True, False, True)
+
+ TITLEMAP = {'gentoo':'Gentoo', 'ubuntu':'Ubuntu Gutsy Gibbon',
+ 'fedora':'Fedora 7', 'debian':'Debian Sid', 'generic': 'Generic Unix'}
+
+ MANUAL_MAP = {
+ 'ubuntu' : 'You will have to install convertlit manually to be able to convert LIT files.',
+ 'fedora' : '''You have to upgrade Qt to at least 4.3.1 and PyQt to at least 4.3.1'''\
+ '''You will have to install convertlit manually to be able to convert LIT files.''',
+ 'debian' : 'Add the following to /etc/apt/sources.listdeb http://www.debian-multimedia.org sid main
Thenapt-get install clit
',
+ }
+
+ def __init__(self, os):
+ self.os = os
+ self.title = self.TITLEMAP[os]
+ self.is_generic = os == 'generic'
+ offset = 0
+ if not self.is_generic:
+ index = self.DISTRO_MAP[self.os]
+ self.as_root = True if os == 'debian' else self.AS_ROOT[index-2]
+ prefix = '' if self.as_root else 'sudo '
+ cmd = prefix + self.INSTALLERS[index-2]
+ pre = ' \\\n '.ljust(len(cmd)+3)
+ for dep in self.DEPENDENCIES:
+ if len(cmd) > 70+offset:
+ offset += 70
+ cmd += pre
+ cmd += ' ' + dep[index] if dep[index] else ''
+ self.command = cmd.strip()
+ if os == 'debian':
+ self.command += '\n'+prefix + 'cp -R /usr/share/pycentral/fonttools/site-packages/FontTools* /usr/lib/python2.5/site-packages/'
+ self.command += '\n'+prefix+'easy_install -U TTFQuery libprs500 \nlibprs500_postinstall'
+ try:
+ self.manual = Markup(self.MANUAL_MAP[os])
+ except KeyError:
+ self.manual = None
+
+
+class Download(Component):
+ implements(INavigationContributor, IRequestHandler, ITemplateProvider)
+
+ request_pat = re.compile(r'\/download$|\/download_\S+')
+
+ # INavigationContributor methods
+ def get_active_navigation_item(self, req):
+ return 'download'
+
+ def get_navigation_items(self, req):
+ yield 'mainnav', 'download', Markup('Get %s'%(__appname__,))
+
+ def get_templates_dirs(self):
+ return [resource_filename(__name__, 'templates')]
+
+ def get_htdocs_dirs(self):
+ return [('dl', resource_filename(__name__, 'htdocs'))]
+
+ # IRequestHandler methods
+ def match_request(self, req):
+ return self.__class__.request_pat.match(req.path_info)
+
+ def process_request(self, req):
+ add_stylesheet(req, 'dl/css/download.css')
+ if req.path_info == '/download':
+ return self.top_level(req)
+ else:
+ match = re.match(r'\/download_(\S+)', req.path_info)
+ if match:
+ os = match.group(1)
+ if os == 'windows':
+ return self.windows(req)
+ elif os == 'osx':
+ return self.osx(req)
+ elif os == 'linux':
+ return self.linux(req)
+ else:
+ return self.linux_distro(req, os)
+
+ def linux_distro(self, req, os):
+ distro = Distribution(os)
+ data = dict(distro=distro,title=distro.title)
+ return 'distro.html', data, None
+
+ def top_level(self, req):
+ operating_systems = [
+ {'name' : 'windows', 'title' : 'Windows'},
+ {'name' : 'osx', 'title' : 'OS X'},
+ {'name' : 'linux', 'title' : 'Linux'},
+ ]
+ data = dict(title='Get ' + __appname__,
+ operating_systems=operating_systems, width=200,
+ font_size='xx-large')
+ return 'download.html', data, None
+
+ def version_from_filename(self, file):
+ return re.search(r'\S+-(\d+\.\d+\.\d+)\.', file).group(1)
+
+ def windows(self, req):
+ file = 'libprs500-0.4.14.exe'
+ version = self.version_from_filename(file)
+ data = dict(version = version, name='windows',
+ installer_name='Windows installer',
+ title='Download %s for windows'%(__appname__),
+ compatibility='%s works on Windows XP and Windows Vista.'%(__appname__,),
+ path='downloads/'+file,
+ note=Markup(\
+'''
+If you are using the SONY PRS-500 and %(appname)s does not detect your reader, read on:
+
+
+If you are using 64-bit windows, you're out of luck.
+
+
+There may be a conflict with the USB driver from SONY. In windows, you cannot install two drivers
+for one device. In order to resolve the conflict:
+
+- Start Device Manager by clicking Start->Run, typing devmgmt.msc and pressing enter.
+- Uninstall all PRS500 related drivers. You will find them in two locations:
+
+- Under "Libusb-Win32"
+- Under "Universal Serial ..." (... depends on the version of windows)
+
+You can uninstall a driver by right clicking on it and selecting uninstall.
+
+- Once the drivers have been uninstalled, uninstall %(appname)s. Reboot. Reinstall %(appname)s.
+
+
+
+'''%dict(appname=__appname__)))
+ return 'binary.html', data, None
+
+ def osx(self, req):
+ file = 'libprs500-0.4.14.dmg'
+ version = self.version_from_filename(file)
+ data = dict(version = version, name='osx',
+ installer_name='OS X universal dmg',
+ title='Download %s for OS X'%(__appname__),
+ compatibility='%s works on OS X Tiger and above.'%(__appname__,),
+ path='downloads/'+file,
+ note=Markup(\
+'''
+
+- Before trying to use the command line tools, you must run the app at least once. This will ask you for you password and then setup the symbolic links for the command line tools.
+- The app cannot be run from within the dmg. You must drag it to a folder on your filesystem (The Desktop, Applications, wherever).
+- In order for the conversion of RTF to LRF to support WMF images (common in older RTF files) you need to install ImageMagick.
+
+'''))
+ return 'binary.html', data, None
+
+ def linux(self, req):
+ operating_systems = [
+ {'name' : 'gentoo', 'title': 'Gentoo'},
+ {'name' : 'ubuntu', 'title': 'Ubuntu'},
+ {'name' : 'fedora', 'title': 'Fedora'},
+ {'name' : 'debian', 'title': 'Debian'},
+ {'name' : 'generic','title': 'Generic', 'img':'linux'},
+ ]
+ data = dict(title='Choose linux distribution', width=100,
+ operating_systems=operating_systems, font_size='x-large')
+ return 'download.html', data, None
+
\ No newline at end of file
diff --git a/src/libprs500/trac/download/htdocs/images/debian_logo.png b/src/libprs500/trac/download/htdocs/images/debian_logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..1ed96d3a11f5d365a660ff4aee36a985d8615377
GIT binary patch
literal 23898
zcmV)HK)t_-P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iFQ5
z02(!Q4oFD=03ZNKL_t(|+U&h~m|SI<{{MO3v((nrThg5!LI?&D_Cz3vq$9Y12?ILa
zUp5h35(QxdSzJcD+ie6
zd}#=CG^7=bvLIoBR?rZ@Efy_5S9Eq21TmHGS14G#Ai;uj1!fCuwcw8eRR)@TQ5ZNj
z4i|^epy3f4Hd!#vhey1H3%b;jOFk86+P?s$06IfagmAtCK@5H!gX{WRXqVaaTNg74
zh*^+T@DT%t27tg)8x9O%s*hmQk|jwN%m>DWbhRmIYAd3!01Z#tutq}|!nvN3E)7$i
z=zER822a$|5awBx^P*@I_Oea=V}aGCpxFjj?Fy`U7S!nIy^O#k230zCKRl=m5XkW7a}Cm~A)nAqDe+2hⅈ1n;~
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