+++ /dev/null
-#! /usr/bin/env python
-# encoding: utf-8
-# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
-
-import copy,re,os
-from waflib import Logs,Utils
-re_imp=re.compile('^(#)*?([^#=]*?)\ =\ (.*?)$',re.M)
-class ConfigSet(object):
- __slots__=('table','parent')
- def __init__(self,filename=None):
- self.table={}
- if filename:
- self.load(filename)
- def __contains__(self,key):
- if key in self.table:return True
- try:return self.parent.__contains__(key)
- except AttributeError:return False
- def keys(self):
- keys=set()
- cur=self
- while cur:
- keys.update(cur.table.keys())
- cur=getattr(cur,'parent',None)
- keys=list(keys)
- keys.sort()
- return keys
- def __str__(self):
- return"\n".join(["%r %r"%(x,self.__getitem__(x))for x in self.keys()])
- def __getitem__(self,key):
- try:
- while 1:
- x=self.table.get(key,None)
- if not x is None:
- return x
- self=self.parent
- except AttributeError:
- return[]
- def __setitem__(self,key,value):
- self.table[key]=value
- def __delitem__(self,key):
- self[key]=[]
- def __getattr__(self,name):
- if name in self.__slots__:
- return object.__getattr__(self,name)
- else:
- return self[name]
- def __setattr__(self,name,value):
- if name in self.__slots__:
- object.__setattr__(self,name,value)
- else:
- self[name]=value
- def __delattr__(self,name):
- if name in self.__slots__:
- object.__delattr__(self,name)
- else:
- del self[name]
- def derive(self):
- newenv=ConfigSet()
- newenv.parent=self
- return newenv
- def detach(self):
- tbl=self.get_merged_dict()
- try:
- delattr(self,'parent')
- except AttributeError:
- pass
- else:
- keys=tbl.keys()
- for x in keys:
- tbl[x]=copy.deepcopy(tbl[x])
- self.table=tbl
- def get_flat(self,key):
- s=self[key]
- if isinstance(s,str):return s
- return' '.join(s)
- def _get_list_value_for_modification(self,key):
- try:
- value=self.table[key]
- except KeyError:
- try:value=self.parent[key]
- except AttributeError:value=[]
- if isinstance(value,list):
- value=value[:]
- else:
- value=[value]
- else:
- if not isinstance(value,list):
- value=[value]
- self.table[key]=value
- return value
- def append_value(self,var,val):
- current_value=self._get_list_value_for_modification(var)
- if isinstance(val,str):
- val=[val]
- current_value.extend(val)
- def prepend_value(self,var,val):
- if isinstance(val,str):
- val=[val]
- self.table[var]=val+self._get_list_value_for_modification(var)
- def append_unique(self,var,val):
- if isinstance(val,str):
- val=[val]
- current_value=self._get_list_value_for_modification(var)
- for x in val:
- if x not in current_value:
- current_value.append(x)
- def get_merged_dict(self):
- table_list=[]
- env=self
- while 1:
- table_list.insert(0,env.table)
- try:env=env.parent
- except AttributeError:break
- merged_table={}
- for table in table_list:
- merged_table.update(table)
- return merged_table
- def store(self,filename):
- try:
- os.makedirs(os.path.split(filename)[0])
- except OSError:
- pass
- buf=[]
- merged_table=self.get_merged_dict()
- keys=list(merged_table.keys())
- keys.sort()
- try:
- fun=ascii
- except NameError:
- fun=repr
- for k in keys:
- if k!='undo_stack':
- buf.append('%s = %s\n'%(k,fun(merged_table[k])))
- Utils.writef(filename,''.join(buf))
- def load(self,filename):
- tbl=self.table
- code=Utils.readf(filename,m='rU')
- for m in re_imp.finditer(code):
- g=m.group
- tbl[g(2)]=eval(g(3))
- Logs.debug('env: %s'%str(self.table))
- def update(self,d):
- for k,v in d.items():
- self[k]=v
- def stash(self):
- orig=self.table
- tbl=self.table=self.table.copy()
- for x in tbl.keys():
- tbl[x]=copy.deepcopy(tbl[x])
- self.undo_stack=self.undo_stack+[orig]
- def revert(self):
- self.table=self.undo_stack.pop(-1)