mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Linux: Create calibre-uninstall command also Fix #3542 (Fix/enhance non-root develop/install)
This commit is contained in:
parent
18dc1ce656
commit
ad947b1b7b
@ -74,6 +74,11 @@ class Develop(Command):
|
|||||||
opts = self.opts
|
opts = self.opts
|
||||||
if not opts.prefix:
|
if not opts.prefix:
|
||||||
opts.prefix = sys.prefix
|
opts.prefix = sys.prefix
|
||||||
|
for x in ('prefix', 'libdir', 'bindir', 'sharedir', 'staging_root',
|
||||||
|
'staging_libdir', 'staging_bindir', 'staging_sharedir'):
|
||||||
|
o = getattr(opts, x, None)
|
||||||
|
if o:
|
||||||
|
setattr(opts, x, os.path.abspath(o))
|
||||||
self.libdir = getattr(opts, 'libdir', None)
|
self.libdir = getattr(opts, 'libdir', None)
|
||||||
if self.libdir is None:
|
if self.libdir is None:
|
||||||
self.libdir = self.j(opts.prefix, 'lib')
|
self.libdir = self.j(opts.prefix, 'lib')
|
||||||
@ -226,6 +231,8 @@ class Install(Develop):
|
|||||||
dest = self.staging_libdir
|
dest = self.staging_libdir
|
||||||
if os.path.exists(dest):
|
if os.path.exists(dest):
|
||||||
shutil.rmtree(dest)
|
shutil.rmtree(dest)
|
||||||
|
self.info('Installing code to', dest)
|
||||||
|
self.manifest.append(dest)
|
||||||
for x in os.walk(self.SRC):
|
for x in os.walk(self.SRC):
|
||||||
reldir = os.path.relpath(x[0], self.SRC)
|
reldir = os.path.relpath(x[0], self.SRC)
|
||||||
destdir = os.path.join(dest, reldir)
|
destdir = os.path.join(dest, reldir)
|
||||||
@ -237,8 +244,9 @@ class Install(Develop):
|
|||||||
dest = self.staging_sharedir
|
dest = self.staging_sharedir
|
||||||
if os.path.exists(dest):
|
if os.path.exists(dest):
|
||||||
shutil.rmtree(dest)
|
shutil.rmtree(dest)
|
||||||
|
self.info('Installing resources to', dest)
|
||||||
shutil.copytree(self.RESOURCES, dest)
|
shutil.copytree(self.RESOURCES, dest)
|
||||||
self.manifest.extend([self.staging_libdir, self.staging_sharedir])
|
self.manifest.append(dest)
|
||||||
|
|
||||||
def success(self):
|
def success(self):
|
||||||
self.info('\n\ncalibre successfully installed. You can start'
|
self.info('\n\ncalibre successfully installed. You can start'
|
||||||
|
@ -3,7 +3,7 @@ __copyright__ = '2008, Kovid Goyal <kovid at kovidgoyal.net>'
|
|||||||
|
|
||||||
''' Post installation script for linux '''
|
''' Post installation script for linux '''
|
||||||
|
|
||||||
import sys, os, shutil, cPickle, textwrap
|
import sys, os, shutil, cPickle, textwrap, stat
|
||||||
from subprocess import check_call
|
from subprocess import check_call
|
||||||
|
|
||||||
from calibre import __version__, __appname__, prints
|
from calibre import __version__, __appname__, prints
|
||||||
@ -40,13 +40,14 @@ UNINSTALL = '''\
|
|||||||
#!{python}
|
#!{python}
|
||||||
euid = {euid}
|
euid = {euid}
|
||||||
|
|
||||||
import os
|
import os, subprocess, shutil
|
||||||
|
|
||||||
if os.geteuid() != euid:
|
if os.geteuid() != euid:
|
||||||
print 'WARNING: uninstaller must be run as', euid, 'to remove all files'
|
print 'WARNING: uninstaller must be run as', euid, 'to remove all files'
|
||||||
|
|
||||||
for x in {manifest!r}:
|
for x in {manifest!r}:
|
||||||
if not os.path.exists(x): continue
|
if not os.path.exists(x): continue
|
||||||
|
print 'Removing', x
|
||||||
try:
|
try:
|
||||||
if os.path.isdir(x):
|
if os.path.isdir(x):
|
||||||
shutil.rmtree(x)
|
shutil.rmtree(x)
|
||||||
@ -55,6 +56,24 @@ for x in {manifest!r}:
|
|||||||
except Exception, e:
|
except Exception, e:
|
||||||
print 'Failed to delete', x
|
print 'Failed to delete', x
|
||||||
print '\t', e
|
print '\t', e
|
||||||
|
|
||||||
|
icr = {icon_resources!r}
|
||||||
|
for context, name, size in icr:
|
||||||
|
cmd = ['xdg-icon-resource', 'uninstall', '--context', context, '--size', size, name]
|
||||||
|
if (context, name) != icr[-1]:
|
||||||
|
cmd.insert(2, '--noupdate')
|
||||||
|
ret = subprocess.call(cmd)
|
||||||
|
if ret != 0:
|
||||||
|
print 'WARNING: Failed to remove icon', name
|
||||||
|
|
||||||
|
mr = {menu_resources!r}
|
||||||
|
for f in mr:
|
||||||
|
cmd = ['xdg-desktop-menu', 'uninstall', f]
|
||||||
|
ret = subprocess.call(cmd)
|
||||||
|
if ret != 0:
|
||||||
|
print 'WARNING: Failed to remove menu item', f
|
||||||
|
|
||||||
|
os.remove(os.path.abspath(__file__))
|
||||||
'''
|
'''
|
||||||
|
|
||||||
class PostInstall:
|
class PostInstall:
|
||||||
@ -113,6 +132,7 @@ class PostInstall:
|
|||||||
self.setup_udev_rules()
|
self.setup_udev_rules()
|
||||||
self.install_man_pages()
|
self.install_man_pages()
|
||||||
self.setup_desktop_integration()
|
self.setup_desktop_integration()
|
||||||
|
self.create_uninstaller()
|
||||||
|
|
||||||
from calibre.utils.config import config_dir
|
from calibre.utils.config import config_dir
|
||||||
if os.path.exists(config_dir):
|
if os.path.exists(config_dir):
|
||||||
@ -129,6 +149,22 @@ class PostInstall:
|
|||||||
self.info('*', *args, **kwargs)
|
self.info('*', *args, **kwargs)
|
||||||
print
|
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:
|
||||||
|
with open(dest, 'wb') as f:
|
||||||
|
f.write(raw)
|
||||||
|
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.task_failed('Creating uninstaller failed')
|
||||||
|
|
||||||
|
|
||||||
def setup_completion(self):
|
def setup_completion(self):
|
||||||
try:
|
try:
|
||||||
@ -311,15 +347,16 @@ class PostInstall:
|
|||||||
os.chdir(tdir)
|
os.chdir(tdir)
|
||||||
render_svg(QFile(I('mimetypes/lrf.svg')), os.path.join(tdir, 'calibre-lrf.png'))
|
render_svg(QFile(I('mimetypes/lrf.svg')), os.path.join(tdir, 'calibre-lrf.png'))
|
||||||
check_call('xdg-icon-resource install --noupdate --context mimetypes --size 128 calibre-lrf.png application-lrf', shell=True)
|
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'))
|
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)
|
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'))
|
self.icon_resources.append(('mimetypes', 'application-lrs',
|
||||||
|
'128'))
|
||||||
QFile(I('library.png')).copy(os.path.join(tdir, 'calibre-gui.png'))
|
QFile(I('library.png')).copy(os.path.join(tdir, 'calibre-gui.png'))
|
||||||
check_call('xdg-icon-resource install --noupdate --size 128 calibre-gui.png calibre-gui', shell=True)
|
check_call('xdg-icon-resource install --noupdate --size 128 calibre-gui.png calibre-gui', shell=True)
|
||||||
self.icon_resources.append(('apps', 'calibre-gui'))
|
self.icon_resources.append(('apps', 'calibre-gui', '128'))
|
||||||
render_svg(QFile(I('viewer.svg')), os.path.join(tdir, 'calibre-viewer.png'))
|
render_svg(QFile(I('viewer.svg')), os.path.join(tdir, 'calibre-viewer.png'))
|
||||||
check_call('xdg-icon-resource install --size 128 calibre-viewer.png calibre-viewer', shell=True)
|
check_call('xdg-icon-resource install --size 128 calibre-viewer.png calibre-viewer', shell=True)
|
||||||
self.icon_resources.append(('apps', 'calibre-viewer'))
|
self.icon_resources.append(('apps', 'calibre-viewer', '128'))
|
||||||
|
|
||||||
f = open('calibre-lrfviewer.desktop', 'wb')
|
f = open('calibre-lrfviewer.desktop', 'wb')
|
||||||
f.write(VIEWER)
|
f.write(VIEWER)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user