mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-07 10:14:46 -04:00
Implement #1830 (Add Exherbo to http://calibre.kovidgoyal.net/download_linux (Get Calibre / Linux))
This commit is contained in:
parent
e7cc8d990d
commit
08615ee359
@ -1,26 +1,7 @@
|
||||
__license__ = 'GPL v3'
|
||||
__copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
|
||||
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__ = 'calibre'
|
||||
DOWNLOAD_DIR = '/var/www/calibre.kovidgoyal.net/htdocs/downloads'
|
||||
MOBILEREAD = 'https://dev.mobileread.com/dist/kovid/calibre/'
|
||||
|
||||
class OS(dict):
|
||||
"""Dictionary with a default value for unknown keys."""
|
||||
def __init__(self, dict):
|
||||
self.update(dict)
|
||||
if not dict.has_key('img'):
|
||||
self['img'] = self['name']
|
||||
|
||||
class Distribution(object):
|
||||
import re
|
||||
|
||||
DEPENDENCIES = [
|
||||
#(Generic, version, gentoo, ubuntu, fedora)
|
||||
@ -30,7 +11,7 @@ class Distribution(object):
|
||||
('libusb', '0.1.12', None, None, None),
|
||||
('Qt', '4.4.0', 'qt', 'libqt4-core libqt4-gui', 'qt4'),
|
||||
('PyQt', '4.4.2', 'PyQt4', 'python-qt4', 'PyQt4'),
|
||||
('mechanize for python', '0.1.11', 'dev-python/mechanize', 'python-mechanize', 'python-mechanize'),
|
||||
('python-mechanize', '0.1.11', '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'),
|
||||
@ -40,51 +21,59 @@ class Distribution(object):
|
||||
('help2man', '1.36.4', 'help2man', 'help2man', 'help2man'),
|
||||
]
|
||||
|
||||
DISTRO_MAP = {'gentoo':2, 'ubuntu':3, 'fedora':4, 'debian':3}
|
||||
|
||||
INSTALLERS = ('emerge -avn', 'apt-get install', 'yum install')
|
||||
AS_ROOT = (True, False, True)
|
||||
class CoolDistro:
|
||||
|
||||
TITLEMAP = {'gentoo':'Gentoo', 'ubuntu':'Ubuntu Intrepid Ibex',
|
||||
'fedora':'Fedora 10', 'debian':'Debian sid', 'generic': 'Install from source'}
|
||||
def __init__(self, name, title, prefix=''):
|
||||
self.title = title
|
||||
url = prefix + '/chrome/dl/images/%s_logo.png'
|
||||
self.img = url%name
|
||||
|
||||
MANUAL_MAP = {
|
||||
'fedora' : '''<li>You have to upgrade Qt to at least 4.4.0 and PyQt to at least 4.4.2</li>''',
|
||||
}
|
||||
def get_linux_data(version='1.0.0'):
|
||||
data = {'version':version, 'app':__appname__}
|
||||
data['title'] = 'Download calibre for linux'
|
||||
data['supported'] = []
|
||||
for name, title in [
|
||||
('ubuntu', 'Ubuntu Jaunty Jackalope'),
|
||||
('debian', 'Debian Sid'),
|
||||
('exherbo', 'Exherbo'),
|
||||
]:
|
||||
data['supported'].append(CoolDistro(name, title,
|
||||
prefix='http://calibre.kovidgoyal.net'))
|
||||
data['dependencies'] = DEPENDENCIES
|
||||
return data
|
||||
|
||||
def __init__(self, os):
|
||||
self.os = os
|
||||
self.img = os
|
||||
self.title = self.TITLEMAP[os]
|
||||
self.app = __appname__
|
||||
self.is_generic = os == 'generic'
|
||||
offset = 0
|
||||
if not self.is_generic:
|
||||
index = self.DISTRO_MAP[self.os]
|
||||
if os == 'debian':
|
||||
self.as_root = True
|
||||
else: self.as_root = self.AS_ROOT[index-2]
|
||||
prefix = ''
|
||||
if not self.as_root: prefix = 'sudo '
|
||||
cmd = prefix + self.INSTALLERS[index-2]
|
||||
pre = ' \\\n '.ljust(len(cmd)+4)
|
||||
for dep in self.DEPENDENCIES:
|
||||
if len(cmd) > 70+offset:
|
||||
offset += 70
|
||||
cmd += pre
|
||||
cmd += ' '
|
||||
if dep[index]: cmd += dep[index]
|
||||
self.command = cmd.strip()
|
||||
easy_install = 'easy_install'
|
||||
if os == 'debian':
|
||||
easy_install = 'easy_install-2.5'
|
||||
self.command += '\n'+prefix+easy_install+' -U calibre \n'+prefix+'calibre_postinstall'
|
||||
try:
|
||||
self.manual = Markup(self.MANUAL_MAP[os])
|
||||
except KeyError:
|
||||
self.manual = None
|
||||
if __name__ == '__main__':
|
||||
import os
|
||||
from calibre.utils.genshi.template import MarkupTemplate
|
||||
import cherrypy
|
||||
class Test:
|
||||
def index(self):
|
||||
raw = open(os.path.dirname(os.path.abspath(__file__))+'/templates/download.html').read()
|
||||
return MarkupTemplate(raw).generate(**get_linux_data()).render('xhtml')
|
||||
index.exposed = True
|
||||
t = Test()
|
||||
t.index()
|
||||
cherrypy.quickstart(t)
|
||||
else:
|
||||
self.img = 'linux'
|
||||
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
|
||||
|
||||
|
||||
|
||||
DOWNLOAD_DIR = '/var/www/calibre.kovidgoyal.net/htdocs/downloads'
|
||||
MOBILEREAD = 'https://dev.mobileread.com/dist/kovid/calibre/'
|
||||
|
||||
class OS(dict):
|
||||
"""Dictionary with a default value for unknown keys."""
|
||||
def __init__(self, dict):
|
||||
self.update(dict)
|
||||
if not dict.has_key('img'):
|
||||
self['img'] = self['name']
|
||||
|
||||
|
||||
class Download(Component):
|
||||
@ -130,12 +119,6 @@ class Download(Component):
|
||||
else:
|
||||
return self.linux_distro(req, os)
|
||||
|
||||
def linux_distro(self, req, os):
|
||||
version = self.version_from_filename()
|
||||
distro = Distribution(os)
|
||||
data = dict(distro=distro,title=distro.title, version=version)
|
||||
return 'distro.html', data, None
|
||||
|
||||
def top_level(self, req):
|
||||
operating_systems = [
|
||||
OS({'name' : 'windows', 'title' : 'Windows'}),
|
||||
@ -212,16 +195,7 @@ select Install.</li>
|
||||
return 'binary.html', data, None
|
||||
|
||||
def linux(self, req):
|
||||
operating_systems = [
|
||||
OS({'name' : 'binary', 'title': 'Binary Installer'}),
|
||||
OS({'name' : 'gentoo', 'title': 'Gentoo'}),
|
||||
OS({'name' : 'ubuntu', 'title': 'Ubuntu'}),
|
||||
OS({'name' : 'fedora', 'title': 'Fedora'}),
|
||||
OS({'name' : 'debian', 'title': 'Debian'}),
|
||||
OS({'name' : 'generic','title': 'Install from source', 'img':'linux'}),
|
||||
]
|
||||
data = dict(title='Choose linux distribution', width=100,
|
||||
operating_systems=operating_systems, font_size='x-large', top_level=False)
|
||||
data = get_linux_data(version=self.version_from_filename())
|
||||
return 'download.html', data, None
|
||||
|
||||
|
||||
@ -417,3 +391,4 @@ def main():
|
||||
subprocess.call(pi, shell=True)
|
||||
return 0
|
||||
'''
|
||||
|
||||
|
@ -6,36 +6,142 @@
|
||||
xmlns:xi="http://www.w3.org/2001/XInclude">
|
||||
<xi:include href="layout.html" />
|
||||
<head>
|
||||
<title>$title</title>
|
||||
<title>${title}</title>
|
||||
<style type="text/css">
|
||||
.distro_type {
|
||||
font-family: monospace;
|
||||
font-weight: bold;
|
||||
font-size: larger;
|
||||
text-align: center;
|
||||
border-bottom: solid 1pt black;
|
||||
}
|
||||
|
||||
.right {
|
||||
margin-left:2em;
|
||||
border-left: solid 1pt black;
|
||||
}
|
||||
|
||||
table#info {
|
||||
border-collapse: collapse;
|
||||
border-width: 1pt;
|
||||
border-style: solid;
|
||||
table-layout: fixed;
|
||||
width: 80%;
|
||||
}
|
||||
table#dependencies {
|
||||
border-collapse: collapse;
|
||||
border-width: 0pt;
|
||||
font-family:monospace;
|
||||
}
|
||||
.tdata {vertical-align: top;}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="ctxtnav" class="nav"></div>
|
||||
<p py:if="not top_level">If you have a 64bit computer, or an outdated operating system, the distribution
|
||||
specific installation may not work for you. In that case, first try the binary installer.
|
||||
If that also does not work, your only recourse is to try to install from source. In order
|
||||
to do that you will have to install all the dependencies as well as the -dev package of PyQt4.
|
||||
</p>
|
||||
|
||||
<div id="content" class="download">
|
||||
<h1>$title</h1>
|
||||
<center>
|
||||
<table cellspacing="40px">
|
||||
<tr>
|
||||
<td style="text-align:center; font-size: ${font_size}" py:for="os in operating_systems">
|
||||
<a href="download_${os['name']}" style="text-decoration:none; border:0;">
|
||||
<img width="${width}" height="${width+20}" src="${href.chrome('/dl/images/%s_logo.png'%(os['img'],))}" />
|
||||
</a>
|
||||
<a href="download_${os['name']}" style="text-decoration:none; border:0">
|
||||
<br />
|
||||
${os['title']}
|
||||
</a>
|
||||
<h1>${title}</h1>
|
||||
<p>
|
||||
The latest release of ${app} is ${version}. See the
|
||||
<a href="/wiki/Changelog">Changelog</a> for a list of new features.
|
||||
</p>
|
||||
<p>
|
||||
${app} is available in the software repositories of the following
|
||||
linux distributions:
|
||||
<table id="info">
|
||||
<col width="150" /><col width="*" />
|
||||
<tr class="distro_type">
|
||||
<td class="left">Supported distributions</td>
|
||||
<td class="right">Unsupported distributions</td>
|
||||
</tr>
|
||||
<tr class="tdata">
|
||||
<td class="left" style="overflow-y:scroll">
|
||||
<div py:for="distro in supported"
|
||||
style="text-align:center;margin-top:2ex;">
|
||||
<div>
|
||||
<img width="64px" height="64px"
|
||||
src="${distro.img}" alt="${distro.title}" />
|
||||
</div>
|
||||
${distro.title}
|
||||
</div>
|
||||
</td>
|
||||
<td class="right">
|
||||
<div style="margin-left:2em">
|
||||
<h3>Binary install</h3>
|
||||
<p>
|
||||
${app} has a binary installer that has been
|
||||
tested on a number of distributions on both
|
||||
32-bit and 64-bit x86 machines. To install,
|
||||
copy paste the following command into a terminal
|
||||
and press Enter:
|
||||
</p>
|
||||
<pre class="wiki">
|
||||
sudo python -c "import urllib2; exec urllib2.urlopen('http://calibre.kovidgoyal.net/download_linux_binary_installer').read(); main()"
|
||||
</pre>
|
||||
<h4>Note</h4>
|
||||
<ul>
|
||||
<li>
|
||||
When running the command line utilities,
|
||||
they will segfault after completion. This can
|
||||
be ignored.
|
||||
</li>
|
||||
<li>
|
||||
You must have help2man and xdg-utils installed
|
||||
on your system before running the installer.
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Source install</h3>
|
||||
<p>
|
||||
<ol>
|
||||
<li>
|
||||
Make sure your system has python ≥ ${dependencies[0][1]}
|
||||
</li>
|
||||
<li>
|
||||
Install the various dependencies listed below
|
||||
</li>
|
||||
<li>
|
||||
Run the following commands in a terminal:
|
||||
</li>
|
||||
</ol>
|
||||
<pre class="wiki">
|
||||
wget -O- http://calibre.kovidgoyal.net/downloads/${app}-${version}.tar.gz | tar xvz
|
||||
cd calibre*
|
||||
python setup.py build && sudo python setup.py install
|
||||
</pre>
|
||||
Note that if your distribution does not have a
|
||||
correctly compiled libunrar.so, ${app} will not
|
||||
support rar files.
|
||||
</p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<br />
|
||||
</p>
|
||||
<p>
|
||||
While you wait for the download to complete, please consider
|
||||
donating to support the development of ${app}.
|
||||
</p>
|
||||
<div>
|
||||
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
|
||||
<input type="hidden" name="cmd" value="_s-xclick" />
|
||||
<input type="image" src="https://www.paypal.com/en_US/i/btn/btn_donateCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!" />
|
||||
<img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1" />
|
||||
<input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----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-----END PKCS7-----" />
|
||||
</form>
|
||||
</div>
|
||||
<hr/>
|
||||
<h3>Dependencies</h3>
|
||||
${app} has the following dependencies (the listed version is the minimum version)
|
||||
<br/><br/>
|
||||
<table id="dependencies">
|
||||
<tr>
|
||||
<th style="margin-right:2em">Package</th><th>Version</th>
|
||||
</tr>
|
||||
|
||||
</center>
|
||||
<tr class="dependency" py:for="dep in dependencies">
|
||||
<td style="margin-right:2em">${dep[0]}</td><td>${dep[1]}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -58,7 +58,7 @@ class Checker(object):
|
||||
"specific sections. You must explicitly pass "
|
||||
"application config via "
|
||||
"cherrypy.tree.mount(..., config=app_config)")
|
||||
warnings.warn(msg)
|
||||
warnings.warn(msg[:5])
|
||||
return
|
||||
|
||||
def check_static_paths(self):
|
||||
|
Loading…
x
Reference in New Issue
Block a user