diff options
-rw-r--r-- | scripts/configurations.py | 70 | ||||
-rw-r--r-- | scripts/database.py | 4 | ||||
-rw-r--r-- | scripts/utils.py | 15 |
3 files changed, 47 insertions, 42 deletions
diff --git a/scripts/configurations.py b/scripts/configurations.py index 1de764b..bc73331 100644 --- a/scripts/configurations.py +++ b/scripts/configurations.py @@ -1,8 +1,10 @@ import os import sys import tempfile +import shutil import subprocess import time +import hashlib import utils from conf import conf @@ -38,7 +40,8 @@ def __exec_sat__(file, args): """Executes SAT solver and returns configuration.""" picosat_cmd = [sf(conf.picosat), file] picosat_cmd += conf.picosat_args - stdout = utils.callsubprocess('picosat', conf.picosat_cmd, conf.picosat_output, ".") + stdout = utils.callsubprocess('picosat', picosat_cmd, conf.picosat_output, + True, allowed_exit_codes = [10]) rtn = [] solut = [] @@ -55,18 +58,23 @@ def __exec_sat__(file, args): elif line[0] == 'v': for sl in line[2:].split(): solut.append(int(sl)) + try: + solut.remove(0) + rtn.append(solut) + except ValueError: + pass return rtn -def __write_temp_config_file__(conf): +def __write_temp_config_file__(con): # Ensure smap existence utils.build_symbol_map() # Load variable count with open(sf(conf.variable_count_file)) as f: f.readline() - var_num = int(f,readline()) + var_num = int(f.readline()) # Write temporally file wfile = tempfile.NamedTemporaryFile(delete=False) - for s in conf: + for s in con: if s < 0: nt = True s *= -1 @@ -76,12 +84,13 @@ def __write_temp_config_file__(conf): break; if 'NONAMEGEN' in utils.smap[s]: # ignore generated names continue - wfile.write('CONFIG_' + utils.smap[s] + '=') + wfile.write(bytes('CONFIG_' + utils.smap[s] + '=', + sys.getdefaultencoding())) if not nt: - wfile.write('y') + wfile.write(bytes('y', sys.getdefaultencoding())) else: - wfile.write('n') - wfile.write('\n') + wfile.write(bytes('n', sys.getdefaultencoding())) + wfile.write(bytes('\n', sys.getdefaultencoding())) wfile.close() return wfile.name @@ -93,9 +102,9 @@ def __load_config_file__(file): continue indx = ln.index('=') if (ln[indx + 1] == 'y'): - rtn[line[7:indx]] = True + rtn[ln[7:indx]] = True else: - rtn[line[7:indx]] = True + rtn[ln[7:indx]] = True return rtn def __calchash__(file): @@ -109,11 +118,11 @@ def __calchash__(file): except FileNotFoundError: pass - conf = __load_config_file__(file) + con = __load_config_file__(file) cstr = "" for c in csort: try: - if conf[c]: + if con[c]: cstr += '+' else: cstr += '-' @@ -121,8 +130,8 @@ def __calchash__(file): cstr += '0' # Add missing - csortfile = open(conf.hashconfigsort, 'a'); - for key, val in conf: + csortfile = open(sf(conf.hashconfigsort), 'a'); + for key, val in con.items(): try: csort.index(key) except ValueError: @@ -133,30 +142,26 @@ def __calchash__(file): cstr += '+' else: cstr += '-' - close(csortfile) + csortfile.close() hsh = hashlib.md5(bytes(cstr, 'UTF-8')) return hsh.hexdigest() -def __register_conf__(conf): - with open(sf(conf.variable_count_file)) as f: - var_num = int(f.readline()) - +def __register_conf__(con): dtb = database.database() - # Solution to configuration - wfile = __write_temp_config_file__(conf) - hsh = __calchash__(wfile.name) - filen = os.path.join(sf(conf.configuration_folder, hsh)) + # Solution to configuration + wfile = __write_temp_config_file__(con) + hsh = __calchash__(wfile) + filen = os.path.join(sf(conf.configurations_folder), hsh) hshf = hsh if os.path.isfile(filen): if compare(filen, wfile): print("I: Generated existing configuration.") - continue else: print("W: Generated configuration with collision hash.") # TODO this might have to be tweaked raise Exception() - os.rename(wfile.name, filen) + shutil.move(wfile, filen) dtb.add_configuration(hsh, hshf) @@ -170,12 +175,15 @@ def generate(): if not os.path.isfile(sf(conf.required_file)): raise exceptions.MissingFile(conf.required_file,"Run allconfig.") - tfile = __buildtempcnf__(var_num, (conf.rules_file, conf.required_file), ()) + # Load variable clount + with open(sf(conf.variable_count_file)) as f: + var_num = f.readline() + tfile = __buildtempcnf__(var_num, (sf(conf.rules_file), sf(conf.required_file)), ()) try: - confs = __exec_sat__(tfile) + confs = __exec_sat__(tfile, []) os.remove(tfile) - for conf in confs: - __register_conf__(conf) + for con in confs: + __register_conf__(con) except exceptions.NoSolution: os.remove(tfile) raise exceptions.NoSolution() @@ -186,13 +194,13 @@ def compare(file1, file2): conf2 = __load_config_file__(file2) # This is not exactly best comparison method - for key, val in conf1: + for key, val in conf1.items(): try: if conf2[key] != val: return False except ValueError: return False - for key, val in conf2: + for key, val in conf2.items(): try: if conf1[key] != val: return False diff --git a/scripts/database.py b/scripts/database.py index 0c4abe9..2e96b44 100644 --- a/scripts/database.py +++ b/scripts/database.py @@ -8,11 +8,11 @@ from conf import conf def __git_describe__(): return utils.callsubprocess('git_describe', - conf.git_describe_cmd, False).rstrip() + conf.git_describe_cmd, False, True)[0] def __git_commit__(): return utils.callsubprocess('git_rev_parse', - conf.git_commit_cmd, False).rstrip() + conf.git_commit_cmd, False, True)[0] def __timestamp__(): return datetime.datetime.now().strftime('%y-%m-%d-%H-%M-%S') diff --git a/scripts/utils.py b/scripts/utils.py index 2c20262..e3038e4 100644 --- a/scripts/utils.py +++ b/scripts/utils.py @@ -54,28 +54,25 @@ def build_conf_map(): except KeyError: pass - -def callsubprocess(process_name, process, show_output = True, regular = "", - env=os.environ): +def callsubprocess(process_name, process, show_output = True, + return_output = False, env=os.environ, allowed_exit_codes = [0]): sprc = subprocess.Popen(process, stdout = subprocess.PIPE, env = env) - rtn = "" with open(os.path.join(sf(conf.log_folder), process_name + '-' + time.strftime("%y-%m-%d-%H-%M-%S") + ".log"), "a") as f: - f.write('::' + time.strftime("%y-%m-%d-%H-%M-%S-%f") + '::') + f.write('::' + time.strftime("%y-%m-%d-%H-%M-%S-%f") + '::\n') for linen in sprc.stdout: line = linen.decode(sys.getdefaultencoding()) f.write(line) if show_output: print(line, end="") - if re.search(regular, line): - rtn += line + if return_output: + rtn.append(line.rstrip()) rtncode = sprc.wait() - if rtncode != 0: + if rtncode not in allowed_exit_codes: raise exceptions.ProcessFailed(process, rtncode) - return rtn def get_kernel_env(): |