diff options
Diffstat (limited to 'third_party/waf/waflib/extras/unc.py')
-rw-r--r-- | third_party/waf/waflib/extras/unc.py | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/third_party/waf/waflib/extras/unc.py b/third_party/waf/waflib/extras/unc.py new file mode 100644 index 00000000000..e630c2a7d05 --- /dev/null +++ b/third_party/waf/waflib/extras/unc.py @@ -0,0 +1,110 @@ +#! /usr/bin/env python +# encoding: utf-8 +# Thomas Nagy, 2014 (ita) + +""" +This module enables automatic handling of network paths of the form \\server\share for both input +and output files. While a typical script may require the following:: + + import os + def build(bld): + + node = bld.root.make_node('\\\\COMPUTER\\share\\test.txt') + + # mark the server/share levels as folders + k = node.parent + while k: + k.cache_isdir = True + k = k.parent + + # clear the file if removed + if not os.path.isfile(node.abspath()): + node.sig = None + + # create the folder structure + if node.parent.height() > 2: + node.parent.mkdir() + + # then the task generator + def myfun(tsk): + tsk.outputs[0].write("data") + bld(rule=myfun, source='wscript', target=[nd]) + +this tool will make the process much easier, for example:: + + def configure(conf): + conf.load('unc') # do not import the module directly + + def build(bld): + def myfun(tsk): + tsk.outputs[0].write("data") + bld(rule=myfun, update_outputs=True, + source='wscript', + target='\\\\COMPUTER\\share\\test.txt') + bld(rule=myfun, update_outputs=True, + source='\\\\COMPUTER\\share\\test.txt', + target='\\\\COMPUTER\\share\\test2.txt') +""" + +import os +from waflib import Node, Utils, Context + +def find_resource(self, lst): + if isinstance(lst, str): + lst = [x for x in Node.split_path(lst) if x and x != '.'] + + if lst[0].startswith('\\\\'): + if len(lst) < 3: + return None + node = self.ctx.root.make_node(lst[0]).make_node(lst[1]) + node.cache_isdir = True + node.parent.cache_isdir = True + + ret = node.search_node(lst[2:]) + if not ret: + ret = node.find_node(lst[2:]) + if ret and os.path.isdir(ret.abspath()): + return None + return ret + + return self.find_resource_orig(lst) + +def find_or_declare(self, lst): + if isinstance(lst, str): + lst = [x for x in Node.split_path(lst) if x and x != '.'] + + if lst[0].startswith('\\\\'): + if len(lst) < 3: + return None + node = self.ctx.root.make_node(lst[0]).make_node(lst[1]) + node.cache_isdir = True + node.parent.cache_isdir = True + ret = node.find_node(lst[2:]) + if not ret: + ret = node.make_node(lst[2:]) + if not os.path.isfile(ret.abspath()): + ret.sig = None + ret.parent.mkdir() + return ret + + return self.find_or_declare_orig(lst) + +def abspath(self): + """For MAX_PATH limitations""" + ret = self.abspath_orig() + if not ret.startswith("\\"): + return "\\\\?\\" + ret + return ret + +if Utils.is_win32: + Node.Node.find_resource_orig = Node.Node.find_resource + Node.Node.find_resource = find_resource + + Node.Node.find_or_declare_orig = Node.Node.find_or_declare + Node.Node.find_or_declare = find_or_declare + + Node.Node.abspath_orig = Node.Node.abspath + Node.Node.abspath = abspath + + for k in list(Context.cache_modules.keys()): + Context.cache_modules["\\\\?\\" + k] = Context.cache_modules[k] |