diff options
Diffstat (limited to 'waflib/Node.py')
-rw-r--r-- | waflib/Node.py | 478 |
1 files changed, 478 insertions, 0 deletions
diff --git a/waflib/Node.py b/waflib/Node.py new file mode 100644 index 0000000..dc979d6 --- /dev/null +++ b/waflib/Node.py @@ -0,0 +1,478 @@ +#! /usr/bin/env python +# encoding: utf-8 +# WARNING! Do not edit! https://waf.io/book/index.html#_obtaining_the_waf_file + +import os,re,sys,shutil +from waflib import Utils,Errors +exclude_regs=''' +**/*~ +**/#*# +**/.#* +**/%*% +**/._* +**/*.swp +**/CVS +**/CVS/** +**/.cvsignore +**/SCCS +**/SCCS/** +**/vssver.scc +**/.svn +**/.svn/** +**/BitKeeper +**/.git +**/.git/** +**/.gitignore +**/.bzr +**/.bzrignore +**/.bzr/** +**/.hg +**/.hg/** +**/_MTN +**/_MTN/** +**/.arch-ids +**/{arch} +**/_darcs +**/_darcs/** +**/.intlcache +**/.DS_Store''' +def ant_matcher(s,ignorecase): + reflags=re.I if ignorecase else 0 + ret=[] + for x in Utils.to_list(s): + x=x.replace('\\','/').replace('//','/') + if x.endswith('/'): + x+='**' + accu=[] + for k in x.split('/'): + if k=='**': + accu.append(k) + else: + k=k.replace('.','[.]').replace('*','.*').replace('?','.').replace('+','\\+') + k='^%s$'%k + try: + exp=re.compile(k,flags=reflags) + except Exception as e: + raise Errors.WafError('Invalid pattern: %s'%k,e) + else: + accu.append(exp) + ret.append(accu) + return ret +def ant_sub_filter(name,nn): + ret=[] + for lst in nn: + if not lst: + pass + elif lst[0]=='**': + ret.append(lst) + if len(lst)>1: + if lst[1].match(name): + ret.append(lst[2:]) + else: + ret.append([]) + elif lst[0].match(name): + ret.append(lst[1:]) + return ret +def ant_sub_matcher(name,pats): + nacc=ant_sub_filter(name,pats[0]) + nrej=ant_sub_filter(name,pats[1]) + if[]in nrej: + nacc=[] + return[nacc,nrej] +class Node(object): + dict_class=dict + __slots__=('name','parent','children','cache_abspath','cache_isdir') + def __init__(self,name,parent): + self.name=name + self.parent=parent + if parent: + if name in parent.children: + raise Errors.WafError('node %s exists in the parent files %r already'%(name,parent)) + parent.children[name]=self + def __setstate__(self,data): + self.name=data[0] + self.parent=data[1] + if data[2]is not None: + self.children=self.dict_class(data[2]) + def __getstate__(self): + return(self.name,self.parent,getattr(self,'children',None)) + def __str__(self): + return self.abspath() + def __repr__(self): + return self.abspath() + def __copy__(self): + raise Errors.WafError('nodes are not supposed to be copied') + def read(self,flags='r',encoding='latin-1'): + return Utils.readf(self.abspath(),flags,encoding) + def write(self,data,flags='w',encoding='latin-1'): + Utils.writef(self.abspath(),data,flags,encoding) + def read_json(self,convert=True,encoding='utf-8'): + import json + object_pairs_hook=None + if convert and sys.hexversion<0x3000000: + try: + _type=unicode + except NameError: + _type=str + def convert(value): + if isinstance(value,list): + return[convert(element)for element in value] + elif isinstance(value,_type): + return str(value) + else: + return value + def object_pairs(pairs): + return dict((str(pair[0]),convert(pair[1]))for pair in pairs) + object_pairs_hook=object_pairs + return json.loads(self.read(encoding=encoding),object_pairs_hook=object_pairs_hook) + def write_json(self,data,pretty=True): + import json + indent=2 + separators=(',',': ') + sort_keys=pretty + newline=os.linesep + if not pretty: + indent=None + separators=(',',':') + newline='' + output=json.dumps(data,indent=indent,separators=separators,sort_keys=sort_keys)+newline + self.write(output,encoding='utf-8') + def exists(self): + return os.path.exists(self.abspath()) + def isdir(self): + return os.path.isdir(self.abspath()) + def chmod(self,val): + os.chmod(self.abspath(),val) + def delete(self,evict=True): + try: + try: + if os.path.isdir(self.abspath()): + shutil.rmtree(self.abspath()) + else: + os.remove(self.abspath()) + except OSError: + if os.path.exists(self.abspath()): + raise + finally: + if evict: + self.evict() + def evict(self): + del self.parent.children[self.name] + def suffix(self): + k=max(0,self.name.rfind('.')) + return self.name[k:] + def height(self): + d=self + val=-1 + while d: + d=d.parent + val+=1 + return val + def listdir(self): + lst=Utils.listdir(self.abspath()) + lst.sort() + return lst + def mkdir(self): + if self.isdir(): + return + try: + self.parent.mkdir() + except OSError: + pass + if self.name: + try: + os.makedirs(self.abspath()) + except OSError: + pass + if not self.isdir(): + raise Errors.WafError('Could not create the directory %r'%self) + try: + self.children + except AttributeError: + self.children=self.dict_class() + def find_node(self,lst): + if isinstance(lst,str): + lst=[x for x in Utils.split_path(lst)if x and x!='.'] + if lst and lst[0].startswith('\\\\')and not self.parent: + node=self.ctx.root.make_node(lst[0]) + node.cache_isdir=True + return node.find_node(lst[1:]) + cur=self + for x in lst: + if x=='..': + cur=cur.parent or cur + continue + try: + ch=cur.children + except AttributeError: + cur.children=self.dict_class() + else: + try: + cur=ch[x] + continue + except KeyError: + pass + cur=self.__class__(x,cur) + if not cur.exists(): + cur.evict() + return None + if not cur.exists(): + cur.evict() + return None + return cur + def make_node(self,lst): + if isinstance(lst,str): + lst=[x for x in Utils.split_path(lst)if x and x!='.'] + cur=self + for x in lst: + if x=='..': + cur=cur.parent or cur + continue + try: + cur=cur.children[x] + except AttributeError: + cur.children=self.dict_class() + except KeyError: + pass + else: + continue + cur=self.__class__(x,cur) + return cur + def search_node(self,lst): + if isinstance(lst,str): + lst=[x for x in Utils.split_path(lst)if x and x!='.'] + cur=self + for x in lst: + if x=='..': + cur=cur.parent or cur + else: + try: + cur=cur.children[x] + except(AttributeError,KeyError): + return None + return cur + def path_from(self,node): + c1=self + c2=node + c1h=c1.height() + c2h=c2.height() + lst=[] + up=0 + while c1h>c2h: + lst.append(c1.name) + c1=c1.parent + c1h-=1 + while c2h>c1h: + up+=1 + c2=c2.parent + c2h-=1 + while not c1 is c2: + lst.append(c1.name) + up+=1 + c1=c1.parent + c2=c2.parent + if c1.parent: + lst.extend(['..']*up) + lst.reverse() + return os.sep.join(lst)or'.' + else: + return self.abspath() + def abspath(self): + try: + return self.cache_abspath + except AttributeError: + pass + if not self.parent: + val=os.sep + elif not self.parent.name: + val=os.sep+self.name + else: + val=self.parent.abspath()+os.sep+self.name + self.cache_abspath=val + return val + if Utils.is_win32: + def abspath(self): + try: + return self.cache_abspath + except AttributeError: + pass + if not self.parent: + val='' + elif not self.parent.name: + val=self.name+os.sep + else: + val=self.parent.abspath().rstrip(os.sep)+os.sep+self.name + self.cache_abspath=val + return val + def is_child_of(self,node): + p=self + diff=self.height()-node.height() + while diff>0: + diff-=1 + p=p.parent + return p is node + def ant_iter(self,accept=None,maxdepth=25,pats=[],dir=False,src=True,remove=True,quiet=False): + dircont=self.listdir() + dircont.sort() + try: + lst=set(self.children.keys()) + except AttributeError: + self.children=self.dict_class() + else: + if remove: + for x in lst-set(dircont): + self.children[x].evict() + for name in dircont: + npats=accept(name,pats) + if npats and npats[0]: + accepted=[]in npats[0] + node=self.make_node([name]) + isdir=node.isdir() + if accepted: + if isdir: + if dir: + yield node + elif src: + yield node + if isdir: + node.cache_isdir=True + if maxdepth: + for k in node.ant_iter(accept=accept,maxdepth=maxdepth-1,pats=npats,dir=dir,src=src,remove=remove,quiet=quiet): + yield k + def ant_glob(self,*k,**kw): + src=kw.get('src',True) + dir=kw.get('dir') + excl=kw.get('excl',exclude_regs) + incl=k and k[0]or kw.get('incl','**') + remove=kw.get('remove',True) + maxdepth=kw.get('maxdepth',25) + ignorecase=kw.get('ignorecase',False) + quiet=kw.get('quiet',False) + pats=(ant_matcher(incl,ignorecase),ant_matcher(excl,ignorecase)) + if kw.get('generator'): + return Utils.lazy_generator(self.ant_iter,(ant_sub_matcher,maxdepth,pats,dir,src,remove,quiet)) + it=self.ant_iter(ant_sub_matcher,maxdepth,pats,dir,src,remove,quiet) + if kw.get('flat'): + return' '.join(x.path_from(self)for x in it) + return list(it) + def is_src(self): + cur=self + x=self.ctx.srcnode + y=self.ctx.bldnode + while cur.parent: + if cur is y: + return False + if cur is x: + return True + cur=cur.parent + return False + def is_bld(self): + cur=self + y=self.ctx.bldnode + while cur.parent: + if cur is y: + return True + cur=cur.parent + return False + def get_src(self): + cur=self + x=self.ctx.srcnode + y=self.ctx.bldnode + lst=[] + while cur.parent: + if cur is y: + lst.reverse() + return x.make_node(lst) + if cur is x: + return self + lst.append(cur.name) + cur=cur.parent + return self + def get_bld(self): + cur=self + x=self.ctx.srcnode + y=self.ctx.bldnode + lst=[] + while cur.parent: + if cur is y: + return self + if cur is x: + lst.reverse() + return self.ctx.bldnode.make_node(lst) + lst.append(cur.name) + cur=cur.parent + lst.reverse() + if lst and Utils.is_win32 and len(lst[0])==2 and lst[0].endswith(':'): + lst[0]=lst[0][0] + return self.ctx.bldnode.make_node(['__root__']+lst) + def find_resource(self,lst): + if isinstance(lst,str): + lst=[x for x in Utils.split_path(lst)if x and x!='.'] + node=self.get_bld().search_node(lst) + if not node: + node=self.get_src().find_node(lst) + if node and node.isdir(): + return None + return node + def find_or_declare(self,lst): + if isinstance(lst,str)and os.path.isabs(lst): + node=self.ctx.root.make_node(lst) + else: + node=self.get_bld().make_node(lst) + node.parent.mkdir() + return node + def find_dir(self,lst): + if isinstance(lst,str): + lst=[x for x in Utils.split_path(lst)if x and x!='.'] + node=self.find_node(lst) + if node and not node.isdir(): + return None + return node + def change_ext(self,ext,ext_in=None): + name=self.name + if ext_in is None: + k=name.rfind('.') + if k>=0: + name=name[:k]+ext + else: + name=name+ext + else: + name=name[:-len(ext_in)]+ext + return self.parent.find_or_declare([name]) + def bldpath(self): + return self.path_from(self.ctx.bldnode) + def srcpath(self): + return self.path_from(self.ctx.srcnode) + def relpath(self): + cur=self + x=self.ctx.bldnode + while cur.parent: + if cur is x: + return self.bldpath() + cur=cur.parent + return self.srcpath() + def bld_dir(self): + return self.parent.bldpath() + def h_file(self): + return Utils.h_file(self.abspath()) + def get_bld_sig(self): + try: + cache=self.ctx.cache_sig + except AttributeError: + cache=self.ctx.cache_sig={} + try: + ret=cache[self] + except KeyError: + p=self.abspath() + try: + ret=cache[self]=self.h_file() + except EnvironmentError: + if self.isdir(): + st=os.stat(p) + ret=cache[self]=Utils.h_list([p,st.st_ino,st.st_mode]) + return ret + raise + return ret +pickle_lock=Utils.threading.Lock() +class Nod3(Node): + pass |