#!/usr/bin/env python3

import os
import sys
import glob
import shutil
import errno

def mkdir(d):
    try:
        os.makedirs(d)
    except OSError as e:
        if e.errno != errno.EEXIST:
            raise e

if len(sys.argv) < 5:
    print("Incorrect number of arguments specified")
    print("syntax: gen-lockedsig-cache <locked-sigs.inc> <input-cachedir> <output-cachedir> <nativelsbstring> [filterfile]")
    sys.exit(1)

filterlist = []
if len(sys.argv) > 5:
    print('Reading filter file %s' % sys.argv[5])
    with open(sys.argv[5]) as f:
        for l in f.readlines():
            if ":" in l:
                filterlist.append(l.rstrip())

print('Reading %s' % sys.argv[1])
sigs = []
with open(sys.argv[1]) as f:
    for l in f.readlines():
        if ":" in l:
            task, sig = l.split()[0].rsplit(':', 1)
            if filterlist and not task in filterlist:
                print('Filtering out %s' % task)
            else:
                sigs.append(sig)

print('Gathering file list')
files = set()
for s in sigs:
    p = sys.argv[2] + "/" + s[:2] + "/*" + s + "*"
    files |= set(glob.glob(p))
    p = sys.argv[2] + "/%s/" % sys.argv[4] + s[:2] + "/*" + s + "*"
    files |= set(glob.glob(p))

print('Processing files')
for f in files:
    sys.stdout.write('Processing %s... ' % f)
    _, ext = os.path.splitext(f)
    if not ext in ['.tgz', '.siginfo', '.sig']:
        # Most likely a temp file, skip it
        print('skipping')
        continue
    dst = os.path.join(sys.argv[3], os.path.relpath(f, sys.argv[2]))
    destdir = os.path.dirname(dst)
    mkdir(destdir)

    src = os.path.realpath(f)
    if os.path.exists(dst):
        os.remove(dst)
    if (os.stat(src).st_dev == os.stat(destdir).st_dev):
        print('linking')
        try:
            os.link(src, dst)
        except OSError as e:
            print('hard linking failed, copying')
            shutil.copyfile(src, dst)
    else:
        print('copying')
        shutil.copyfile(src, dst)

print('Done!')
