~justas.sadzevicius/schooltool/versionator

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
#!/usr/bin/python
import os, sys
from optparse import OptionParser
import urllib
from subprocess import call, Popen, STDOUT, PIPE
import apt_pkg # apt-get install python-apt

import packages

versions_cfg = 'http://ftp.schooltool.org/schooltool/trunk/versions.cfg'

def silent_check_call(*args, **kw):
    assert 'stdout' not in kw
    assert 'stderr' not in kw
    kw['stdout'] = PIPE
    kw['stderr'] = STDOUT
    p = Popen(*args, **kw)
    stdout = p.communicate()[0]
    if p.returncode != 0:
        print stdout
        raise Exception("Call Failed %s" % args[0])

def check_call(*args, **kw):
    assert 0 == call(*args, **kw)

def cmp_version(v1, v2):
    v1 = v1.split('-')[0]
    v2 = v2.split('-')[0]
    packages.require_apt()
    return apt_pkg.VersionCompare(v1, v2)

def get_versions(pkg, apt_conf):
    versions = []
    for line in Popen(["apt-cache", "-c", apt_conf, 'show', pkg], stdout=PIPE, stderr=PIPE).communicate()[0].splitlines():
        if line.startswith('Version: '):
            versions.append(line[9:])
    return versions

def get_max_version(pkg, apt_conf):
    versions = get_versions(pkg, apt_conf)
    if not versions:
        return None
    versions.sort(cmp=cmp_version)
    versions.reverse()
    return versions[0]

def get_apt_conf(distro):
    return os.path.join(distro, 'etc/apt/apt.conf')

def apt_get_update(distro):
    apt_conf = get_apt_conf(distro)
    if not os.path.isfile(apt_conf):
        sys.exit('File %s does not exist' % apt_conf)

    def mkdir_p(dirname):
        d = os.path.join(distro, dirname)
        if not os.path.isdir(d):
            os.makedirs(d)

    def touch(filename):
        dirname = os.path.dirname(filename)
        mkdir_p(dirname)
        f = open(os.path.join(distro, filename), 'w')
        f.close()

    mkdir_p('etc/apt/preferences.d')
    mkdir_p('var/cache/apt/archives/partial')
    touch('var/lib/apt/lists/lock')
    mkdir_p('var/lib/apt/lists/partial')
    touch('var/lib/dpkg/lock')
    touch('var/lib/dpkg/status')
    check_call(['apt-get', '-c', apt_conf, 'update'])


if __name__ == '__main__':

    parser = OptionParser()
    parser.add_option("-k", "--kgs",
                      help="update schooltool.kgs.cfg instead",
                      action="store_true", dest="update_kgs")
    (options, args) = parser.parse_args()

    if options.update_kgs:
        print 'Downloading ' + versions_cfg + ' -> schooltool.kgs.cfg'
        kgs = urllib.urlopen(versions_cfg)
        open('schooltool.kgs.cfg', 'w').write(kgs.read())
    else:
        apt_get_update('lucid')
        apt_get_update('maverick')
        apt_get_update('unstable')