aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarel Kočí <cynerd@email.cz>2015-07-24 17:24:04 +0200
committerKarel Kočí <cynerd@email.cz>2015-07-24 17:24:04 +0200
commitaa993b1a62314c45e5127b97ec131c8dc048a6fa (patch)
treed989d4add426aa14416b745823c9cf6997847c00
parent4df04029a616013e1d795102eab790c628d6dac1 (diff)
downloadlinux-conf-perf-aa993b1a62314c45e5127b97ec131c8dc048a6fa.tar.gz
linux-conf-perf-aa993b1a62314c45e5127b97ec131c8dc048a6fa.tar.bz2
linux-conf-perf-aa993b1a62314c45e5127b97ec131c8dc048a6fa.zip
Fix big amount of bugs in recently commited code
Recently committed code wasn't tested, because most of the required infrastructure wasn't yet written. So bugs must be fixed after more parts of system are reimplemented.
-rw-r--r--scripts/configurations.py70
-rw-r--r--scripts/database.py4
-rw-r--r--scripts/utils.py15
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():