summaryrefslogtreecommitdiff
blob: 8d903c0912676d174b98d04a5c0995fdcdc10895 (plain)
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
def readEnvFile(fname):
    """Reads a bash file with void environment and returns the environment
    at the end of the execution."""
    proc = sp.Popen('. '+fname+' &> /dev/null; env', \
      shell=True, stdout=sp.PIPE, env={})
    lines = proc.stdout.read().split('\n')[:-1]
    env = dict([l.split('=', 1) for l in lines])

    for k in ('SHLVL', 'PWD', '_'):
        if env.has_key(k):
            del env[k]
    return env

def parseConf(fname):
    input = file(fname).read()
    
    tests = {}
    for line in input.split('\n'):
        line = line.strip()
        spl = [i.strip() for i in shlex.split(line)]
        if len(spl) < 2:
            continue
        if line[0] == '#':
            continue
        env = {}
        skip = []
        change = {}
        descr = None
        fileenv = {}

        # Interpret arguments
        for var in spl[2:]:

            # if begins with '-': skip implementation
            if var[0] == '-':
                skip.append(var[1:])

            # if key:value, substitute pkg-config dependency
            elif ':' in var and not '=' in var:
                c_0, c_1 = var.split(':', 1)
                change[c_0] = c_1

            # if descr|text set description (for future use)
            elif var[:6] == 'descr|':
                descr = var[6:]

            # if @file: read bash script and set env
            elif var[0] == '@':
                fileenvNew = readEnvFile(pjoin(cfg.curdir, var[1:]))
                fileenv = dict( fileenv.items() + fileenvNew.items() )
                del fileenvNew

            # Otherwise, assume key=value syntax
            else:
                e_0, e_1 = var.split('=', 1)
                env[e_0] = e_1

        # Set environment (argument overrides bash file)
        env = dict( fileenv.items() + env.items() )

        try:
            # Insert test
            avail = available_packages(spl[1])[-1]
            tests[spl[0]] = {'package':avail , 'emergeenv':env, 'skip':skip, \
              'requires':change, 'descr':descr}
        except:
            # Or trigger an non-fatal error
            sys.stderr.write('Error: package ' + spl[1] + ' not found\n')
    return tests