1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
|
#!/usr/bin/python
# Upgrade script for the gPodder Win32 release
# Injects new data into an old win32 release to build a new release
# Thomas Perl <thp.io/about>; 2011-04-08
# Required files:
# - An old win32 release
# - The source tarball of the new release
# - The (binary) Debian package of the new release
# - The source tarball of the most recent mygpoclient
# - The source tarball of the most recent feedparser
import os
import subprocess
import sys
import re
import glob
if len(sys.argv) != 6:
print """
Usage: %s <oldzip> <newsource> <deb> <mygpoclient> <feedparser>
With:
<oldzip>, e.g. gpodder-2.12-win32.zip
<newsource>, e.g. gpodder-2.14.tar.gz
<deb>, e.g. gpodder_2.14-1_all.deb
<mygpoclient>, e.g. mygpoclient-1.5.tar.gz
<feedparser>, e.g. feedparser-5.0.1.tar.gz
""" % sys.argv[0]
sys.exit(1)
progname, old_zip, source_tgz, deb, mygpoclient_tgz, feedparser_tgz = sys.argv
print '-'*80
print 'gPodder Win32 Release Builder'
print '-'*80
m = re.match(r'gpodder-(\d+).(\d+)-win32.zip', old_zip)
if not m:
print 'Unknown filename scheme for', old_zip
sys.exit(1)
old_version = '.'.join(m.groups())
print 'Old version:', old_version
m = re.match(r'gpodder-(\d+).(\d+).tar.gz', source_tgz)
if not m:
print 'Unknown filename scheme for', source_tgz
sys.exit(1)
new_version = '.'.join(m.groups())
print 'New version:', new_version
m = re.match(r'gpodder_(\d+).(\d+)-(.*)_all.deb$', deb)
if not m:
print 'Unknown filename scheme for', deb
sys.exit(1)
deb_version = '.'.join(m.groups()[:2]) + '-' + m.group(3)
print 'Debian version:', deb_version
m = re.match(r'mygpoclient-(\d+).(\d+).tar.gz', mygpoclient_tgz)
if not m:
print 'Unknown filename scheme for', mygpoclient_tgz
sys.exit(1)
mygpoclient_version = '.'.join(m.groups())
print 'mygpoclient version:', mygpoclient_version
m = re.match(r'feedparser-(\d+).(\d+).(\d+).tar.gz', feedparser_tgz)
if not m:
print 'Unknown filename scheme for', feedparser_tgz
sys.exit(1)
feedparser_version = '.'.join(m.groups())
print 'feedparser version:', feedparser_version
print '-'*80
print 'Press any key to continue, Ctrl+C to abort.',
raw_input()
if not deb_version.startswith(new_version):
print 'New version and Debian version mismatch:'
print new_version, '<->', deb_version
sys.exit(1)
def sh(*args, **kwargs):
print '->', ' '.join(args[0])
try:
ret = subprocess.call(*args, **kwargs)
except Exception, e:
print e
ret = -1
if ret != 0:
print 'EXIT STATUS:', ret
sys.exit(1)
old_dir, _ = os.path.splitext(old_zip)
new_dir = old_dir.replace(old_version, new_version)
target_file = new_dir + '.zip'
source_dir = source_tgz[:-len('.tar.gz')]
deb_dir, _ = os.path.splitext(deb)
mygpoclient_dir = mygpoclient_tgz[:-len('.tar.gz')]
feedparser_dir = feedparser_tgz[:-len('.tar.gz')]
print 'Cleaning up...'
sh(['rm', '-rf', old_dir, new_dir, source_dir, deb_dir,
mygpoclient_dir, feedparser_dir])
print 'Extracting...'
sh(['unzip', '-q', old_zip])
sh(['tar', 'xzf', source_tgz])
sh(['dpkg', '-X', deb, deb_dir], stdout=subprocess.PIPE)
sh(['tar', 'xzf', mygpoclient_tgz])
sh(['tar', 'xzf', feedparser_tgz])
print 'Renaming win32 folder...'
sh(['mv', old_dir, new_dir])
copy_files_direct = [
'ChangeLog',
'COPYING',
'README',
'data/credits.txt',
'data/gpodder.png',
'data/images/*',
'data/ui/*.ui',
'data/ui/desktop/*.ui',
]
print 'Replacing data files...'
for pattern in copy_files_direct:
from_files = glob.glob(os.path.join(source_dir, pattern))
to_files = glob.glob(os.path.join(new_dir, pattern))
to_folder = os.path.dirname(os.path.join(new_dir, pattern))
if to_files:
sh(['rm']+to_files)
if not os.path.exists(to_folder):
sh(['mkdir', to_folder])
if from_files:
sh(['cp']+from_files+[to_folder])
print 'Copying translations...'
sh(['cp', '-r', os.path.join(deb_dir, 'usr', 'share', 'locale'), os.path.join(new_dir, 'share')])
print 'Copying icons...'
sh(['cp', '-r', os.path.join(deb_dir, 'usr', 'share', 'icons'), os.path.join(new_dir, 'icons')])
print 'Replacing Python package gpodder...'
sh(['rm', '-rf', os.path.join(new_dir, 'lib', 'site-packages', 'gpodder')])
sh(['cp', '-r', os.path.join(source_dir, 'src', 'gpodder'), os.path.join(new_dir, 'lib', 'site-packages')])
print 'Replacing Python package mygpoclient...'
sh(['rm', '-rf', os.path.join(new_dir, 'lib', 'site-packages', 'mygpoclient')])
sh(['cp', '-r', os.path.join(mygpoclient_dir, 'mygpoclient'), os.path.join(new_dir, 'lib', 'site-packages')])
print 'Replacing Python module feedparser...'
sh(['rm', '-f', os.path.join(new_dir, 'lib', 'site-packages', 'feedparser.py')])
sh(['cp', os.path.join(feedparser_dir, 'feedparser', 'feedparser.py'), os.path.join(new_dir, 'lib', 'site-packages')])
print 'Building release...'
sh(['rm', '-f', target_file])
sh(['zip', '-qr', target_file, new_dir])
print 'Cleaning up...'
sh(['rm', '-rf', old_dir, new_dir, source_dir, deb_dir,
mygpoclient_dir, feedparser_dir])
print '-'*80 + '\n'
print 'Successfully built gpodder', new_version, 'win32 release:'
print ' ', target_file, '\n'
|