1#!/usr/bin/env python3
2
3import os
4import sys
5import glob
6import shutil
7import errno
8
9def mkdir(d):
10    try:
11        os.makedirs(d)
12    except OSError as e:
13        if e.errno != errno.EEXIST:
14            raise e
15
16if len(sys.argv) < 5:
17    print("Incorrect number of arguments specified")
18    print("syntax: gen-lockedsig-cache <locked-sigs.inc> <input-cachedir> <output-cachedir> <nativelsbstring> [filterfile]")
19    sys.exit(1)
20
21filterlist = []
22if len(sys.argv) > 5:
23    print('Reading filter file %s' % sys.argv[5])
24    with open(sys.argv[5]) as f:
25        for l in f.readlines():
26            if ":" in l:
27                filterlist.append(l.rstrip())
28
29print('Reading %s' % sys.argv[1])
30sigs = []
31with open(sys.argv[1]) as f:
32    for l in f.readlines():
33        if ":" in l:
34            task, sig = l.split()[0].rsplit(':', 1)
35            if filterlist and not task in filterlist:
36                print('Filtering out %s' % task)
37            else:
38                sigs.append(sig)
39
40print('Gathering file list')
41files = set()
42for s in sigs:
43    p = sys.argv[2] + "/" + s[:2] + "/*" + s + "*"
44    files |= set(glob.glob(p))
45    p = sys.argv[2] + "/%s/" % sys.argv[4] + s[:2] + "/*" + s + "*"
46    files |= set(glob.glob(p))
47
48print('Processing files')
49for f in files:
50    sys.stdout.write('Processing %s... ' % f)
51    _, ext = os.path.splitext(f)
52    if not ext in ['.tgz', '.siginfo', '.sig']:
53        # Most likely a temp file, skip it
54        print('skipping')
55        continue
56    dst = os.path.join(sys.argv[3], os.path.relpath(f, sys.argv[2]))
57    destdir = os.path.dirname(dst)
58    mkdir(destdir)
59
60    src = os.path.realpath(f)
61    if os.path.exists(dst):
62        os.remove(dst)
63    if (os.stat(src).st_dev == os.stat(destdir).st_dev):
64        print('linking')
65        try:
66            os.link(src, dst)
67        except OSError as e:
68            print('hard linking failed, copying')
69            shutil.copyfile(src, dst)
70    else:
71        print('copying')
72        shutil.copyfile(src, dst)
73
74print('Done!')
75