summaryrefslogtreecommitdiff
path: root/jam-files/boost-build/util/path.py
diff options
context:
space:
mode:
Diffstat (limited to 'jam-files/boost-build/util/path.py')
-rw-r--r--jam-files/boost-build/util/path.py904
1 files changed, 0 insertions, 904 deletions
diff --git a/jam-files/boost-build/util/path.py b/jam-files/boost-build/util/path.py
deleted file mode 100644
index 222b96bf..00000000
--- a/jam-files/boost-build/util/path.py
+++ /dev/null
@@ -1,904 +0,0 @@
-# Status: this module is ported on demand by however needs something
-# from it. Functionality that is not needed by Python port will
-# be dropped.
-
-# Copyright (C) Vladimir Prus 2002. Permission to copy, use, modify, sell and
-# distribute this software is granted provided this copyright notice appears in
-# all copies. This software is provided "as is" without express or implied
-# warranty, and with no claim as to its suitability for any purpose.
-
-# Performs various path manipulations. Path are always in a 'normilized'
-# representation. In it, a path may be either:
-#
-# - '.', or
-#
-# - ['/'] [ ( '..' '/' )* (token '/')* token ]
-#
-# In plain english, path can be rooted, '..' elements are allowed only
-# at the beginning, and it never ends in slash, except for path consisting
-# of slash only.
-
-import os.path
-from utility import to_seq
-from glob import glob as builtin_glob
-
-from b2.util import bjam_signature
-
-@bjam_signature((["path", "root"],))
-def root (path, root):
- """ If 'path' is relative, it is rooted at 'root'. Otherwise, it's unchanged.
- """
- if os.path.isabs (path):
- return path
- else:
- return os.path.join (root, path)
-
-@bjam_signature((["native"],))
-def make (native):
- """ Converts the native path into normalized form.
- """
- # TODO: make os selection here.
- return make_UNIX (native)
-
-def make_UNIX (native):
-
- # VP: I have no idea now 'native' can be empty here! But it can!
- assert (native)
-
- return os.path.normpath (native)
-
-@bjam_signature((["path"],))
-def native (path):
- """ Builds a native representation of the path.
- """
- # TODO: make os selection here.
- return native_UNIX (path)
-
-def native_UNIX (path):
- return path
-
-
-def pwd ():
- """ Returns the current working directory.
- # TODO: is it a good idea to use the current dir? Some use-cases
- may not allow us to depend on the current dir.
- """
- return make (os.getcwd ())
-
-def is_rooted (path):
- """ Tests if a path is rooted.
- """
- return path and path [0] == '/'
-
-
-###################################################################
-# Still to port.
-# Original lines are prefixed with "# "
-#
-# # Copyright (C) Vladimir Prus 2002. Permission to copy, use, modify, sell and
-# # distribute this software is granted provided this copyright notice appears in
-# # all copies. This software is provided "as is" without express or implied
-# # warranty, and with no claim as to its suitability for any purpose.
-#
-# # Performs various path manipulations. Path are always in a 'normilized'
-# # representation. In it, a path may be either:
-# #
-# # - '.', or
-# #
-# # - ['/'] [ ( '..' '/' )* (token '/')* token ]
-# #
-# # In plain english, path can be rooted, '..' elements are allowed only
-# # at the beginning, and it never ends in slash, except for path consisting
-# # of slash only.
-#
-# import modules ;
-# import sequence ;
-# import regex ;
-# import errors : error ;
-#
-#
-# os = [ modules.peek : OS ] ;
-# if [ modules.peek : UNIX ]
-# {
-# local uname = [ modules.peek : JAMUNAME ] ;
-# switch $(uname)
-# {
-# case CYGWIN* :
-# os = CYGWIN ;
-#
-# case * :
-# os = UNIX ;
-# }
-# }
-#
-# #
-# # Tests if a path is rooted.
-# #
-# rule is-rooted ( path )
-# {
-# return [ MATCH "^(/)" : $(path) ] ;
-# }
-#
-# #
-# # Tests if a path has a parent.
-# #
-# rule has-parent ( path )
-# {
-# if $(path) != / {
-# return 1 ;
-# } else {
-# return ;
-# }
-# }
-#
-# #
-# # Returns the path without any directory components.
-# #
-# rule basename ( path )
-# {
-# return [ MATCH "([^/]+)$" : $(path) ] ;
-# }
-#
-# #
-# # Returns parent directory of the path. If no parent exists, error is issued.
-# #
-# rule parent ( path )
-# {
-# if [ has-parent $(path) ] {
-#
-# if $(path) = . {
-# return .. ;
-# } else {
-#
-# # Strip everything at the end of path up to and including
-# # the last slash
-# local result = [ regex.match "((.*)/)?([^/]+)" : $(path) : 2 3 ] ;
-#
-# # Did we strip what we shouldn't?
-# if $(result[2]) = ".." {
-# return $(path)/.. ;
-# } else {
-# if ! $(result[1]) {
-# if [ is-rooted $(path) ] {
-# result = / ;
-# } else {
-# result = . ;
-# }
-# }
-# return $(result[1]) ;
-# }
-# }
-# } else {
-# error "Path '$(path)' has no parent" ;
-# }
-# }
-#
-# #
-# # Returns path2 such that "[ join path path2 ] = .".
-# # The path may not contain ".." element or be rooted.
-# #
-# rule reverse ( path )
-# {
-# if $(path) = .
-# {
-# return $(path) ;
-# }
-# else
-# {
-# local tokens = [ regex.split $(path) "/" ] ;
-# local tokens2 ;
-# for local i in $(tokens) {
-# tokens2 += .. ;
-# }
-# return [ sequence.join $(tokens2) : "/" ] ;
-# }
-# }
-#
-# #
-# # Auxillary rule: does all the semantic of 'join', except for error cheching.
-# # The error checking is separated because this rule is recursive, and I don't
-# # like the idea of checking the same input over and over.
-# #
-# local rule join-imp ( elements + )
-# {
-# return [ NORMALIZE_PATH $(elements:J="/") ] ;
-# }
-#
-# #
-# # Contanenates the passed path elements. Generates an error if
-# # any element other than the first one is rooted.
-# #
-# rule join ( elements + )
-# {
-# if ! $(elements[2])
-# {
-# return $(elements[1]) ;
-# }
-# else
-# {
-# for local e in $(elements[2-])
-# {
-# if [ is-rooted $(e) ]
-# {
-# error only first element may be rooted ;
-# }
-# }
-# return [ join-imp $(elements) ] ;
-# }
-# }
-
-
-def glob (dirs, patterns):
- """ Returns the list of files matching the given pattern in the
- specified directory. Both directories and patterns are
- supplied as portable paths. Each pattern should be non-absolute
- path, and can't contain "." or ".." elements. Each slash separated
- element of pattern can contain the following special characters:
- - '?', which match any character
- - '*', which matches arbitrary number of characters.
- A file $(d)/e1/e2/e3 (where 'd' is in $(dirs)) matches pattern p1/p2/p3
- if and only if e1 matches p1, e2 matches p2 and so on.
-
- For example:
- [ glob . : *.cpp ]
- [ glob . : */build/Jamfile ]
- """
-# {
-# local result ;
-# if $(patterns:D)
-# {
-# # When a pattern has a directory element, we first glob for
-# # directory, and then glob for file name is the found directories.
-# for local p in $(patterns)
-# {
-# # First glob for directory part.
-# local globbed-dirs = [ glob $(dirs) : $(p:D) ] ;
-# result += [ glob $(globbed-dirs) : $(p:D="") ] ;
-# }
-# }
-# else
-# {
-# # When a pattern has not directory, we glob directly.
-# # Take care of special ".." value. The "GLOB" rule simply ignores
-# # the ".." element (and ".") element in directory listings. This is
-# # needed so that
-# #
-# # [ glob libs/*/Jamfile ]
-# #
-# # don't return
-# #
-# # libs/../Jamfile (which is the same as ./Jamfile)
-# #
-# # On the other hand, when ".." is explicitly present in the pattern
-# # we need to return it.
-# #
-# for local dir in $(dirs)
-# {
-# for local p in $(patterns)
-# {
-# if $(p) != ".."
-# {
-# result += [ sequence.transform make
-# : [ GLOB [ native $(dir) ] : $(p) ] ] ;
-# }
-# else
-# {
-# result += [ path.join $(dir) .. ] ;
-# }
-# }
-# }
-# }
-# return $(result) ;
-# }
-#
-
-# TODO: (PF) I replaced the code above by this. I think it should work but needs to be tested.
- result = []
- dirs = to_seq (dirs)
- patterns = to_seq (patterns)
-
- splitdirs = []
- for dir in dirs:
- splitdirs += dir.split (os.pathsep)
-
- for dir in splitdirs:
- for pattern in patterns:
- p = os.path.join (dir, pattern)
- import glob
- result.extend (glob.glob (p))
- return result
-
-#
-# Find out the absolute name of path and returns the list of all the parents,
-# starting with the immediate one. Parents are returned as relative names.
-# If 'upper_limit' is specified, directories above it will be pruned.
-#
-def all_parents(path, upper_limit=None, cwd=None):
-
- if not cwd:
- cwd = os.getcwd()
-
- path_abs = os.path.join(cwd, path)
-
- if upper_limit:
- upper_limit = os.path.join(cwd, upper_limit)
-
- result = []
- while path_abs and path_abs != upper_limit:
- (head, tail) = os.path.split(path)
- path = os.path.join(path, "..")
- result.append(path)
- path_abs = head
-
- if upper_limit and path_abs != upper_limit:
- raise BaseException("'%s' is not a prefix of '%s'" % (upper_limit, path))
-
- return result
-
-# Search for 'pattern' in parent directories of 'dir', up till and including
-# 'upper_limit', if it is specified, or till the filesystem root otherwise.
-#
-def glob_in_parents(dir, patterns, upper_limit=None):
-
- result = []
- parent_dirs = all_parents(dir, upper_limit)
-
- for p in parent_dirs:
- result = glob(p, patterns)
- if result: break
-
- return result
-
-#
-# #
-# # Assuming 'child' is a subdirectory of 'parent', return the relative
-# # path from 'parent' to 'child'
-# #
-# rule relative ( child parent )
-# {
-# if $(parent) = "."
-# {
-# return $(child) ;
-# }
-# else
-# {
-# local split1 = [ regex.split $(parent) / ] ;
-# local split2 = [ regex.split $(child) / ] ;
-#
-# while $(split1)
-# {
-# if $(split1[1]) = $(split2[1])
-# {
-# split1 = $(split1[2-]) ;
-# split2 = $(split2[2-]) ;
-# }
-# else
-# {
-# errors.error $(child) is not a subdir of $(parent) ;
-# }
-# }
-# return [ join $(split2) ] ;
-# }
-# }
-#
-# # Returns the minimal path to path2 that is relative path1.
-# #
-# rule relative-to ( path1 path2 )
-# {
-# local root_1 = [ regex.split [ reverse $(path1) ] / ] ;
-# local split1 = [ regex.split $(path1) / ] ;
-# local split2 = [ regex.split $(path2) / ] ;
-#
-# while $(split1) && $(root_1)
-# {
-# if $(split1[1]) = $(split2[1])
-# {
-# root_1 = $(root_1[2-]) ;
-# split1 = $(split1[2-]) ;
-# split2 = $(split2[2-]) ;
-# }
-# else
-# {
-# split1 = ;
-# }
-# }
-# return [ join . $(root_1) $(split2) ] ;
-# }
-
-# Returns the list of paths which are used by the operating system
-# for looking up programs
-def programs_path ():
- raw = []
- names = ['PATH', 'Path', 'path']
-
- for name in names:
- raw.append(os.environ.get (name, ''))
-
- result = []
- for elem in raw:
- if elem:
- for p in elem.split(os.path.pathsep):
- result.append(make(p))
-
- return result
-
-# rule make-NT ( native )
-# {
-# local tokens = [ regex.split $(native) "[/\\]" ] ;
-# local result ;
-#
-# # Handle paths ending with slashes
-# if $(tokens[-1]) = ""
-# {
-# tokens = $(tokens[1--2]) ; # discard the empty element
-# }
-#
-# result = [ path.join $(tokens) ] ;
-#
-# if [ regex.match "(^.:)" : $(native) ]
-# {
-# result = /$(result) ;
-# }
-#
-# if $(native) = ""
-# {
-# result = "." ;
-# }
-#
-# return $(result) ;
-# }
-#
-# rule native-NT ( path )
-# {
-# local result = [ MATCH "^/?(.*)" : $(path) ] ;
-# result = [ sequence.join [ regex.split $(result) "/" ] : "\\" ] ;
-# return $(result) ;
-# }
-#
-# rule make-CYGWIN ( path )
-# {
-# return [ make-NT $(path) ] ;
-# }
-#
-# rule native-CYGWIN ( path )
-# {
-# local result = $(path) ;
-# if [ regex.match "(^/.:)" : $(path) ] # win absolute
-# {
-# result = [ MATCH "^/?(.*)" : $(path) ] ; # remove leading '/'
-# }
-# return [ native-UNIX $(result) ] ;
-# }
-#
-# #
-# # split-VMS: splits input native path into
-# # device dir file (each part is optional),
-# # example:
-# #
-# # dev:[dir]file.c => dev: [dir] file.c
-# #
-# rule split-path-VMS ( native )
-# {
-# local matches = [ MATCH ([a-zA-Z0-9_-]+:)?(\\[[^\]]*\\])?(.*)?$ : $(native) ] ;
-# local device = $(matches[1]) ;
-# local dir = $(matches[2]) ;
-# local file = $(matches[3]) ;
-#
-# return $(device) $(dir) $(file) ;
-# }
-#
-# #
-# # Converts a native VMS path into a portable path spec.
-# #
-# # Does not handle current-device absolute paths such
-# # as "[dir]File.c" as it is not clear how to represent
-# # them in the portable path notation.
-# #
-# # Adds a trailing dot (".") to the file part if no extension
-# # is present (helps when converting it back into native path).
-# #
-# rule make-VMS ( native )
-# {
-# if [ MATCH ^(\\[[a-zA-Z0-9]) : $(native) ]
-# {
-# errors.error "Can't handle default-device absolute paths: " $(native) ;
-# }
-#
-# local parts = [ split-path-VMS $(native) ] ;
-# local device = $(parts[1]) ;
-# local dir = $(parts[2]) ;
-# local file = $(parts[3]) ;
-# local elems ;
-#
-# if $(device)
-# {
-# #
-# # rooted
-# #
-# elems = /$(device) ;
-# }
-#
-# if $(dir) = "[]"
-# {
-# #
-# # Special case: current directory
-# #
-# elems = $(elems) "." ;
-# }
-# else if $(dir)
-# {
-# dir = [ regex.replace $(dir) "\\[|\\]" "" ] ;
-# local dir_parts = [ regex.split $(dir) \\. ] ;
-#
-# if $(dir_parts[1]) = ""
-# {
-# #
-# # Relative path
-# #
-# dir_parts = $(dir_parts[2--1]) ;
-# }
-#
-# #
-# # replace "parent-directory" parts (- => ..)
-# #
-# dir_parts = [ regex.replace-list $(dir_parts) : - : .. ] ;
-#
-# elems = $(elems) $(dir_parts) ;
-# }
-#
-# if $(file)
-# {
-# if ! [ MATCH (\\.) : $(file) ]
-# {
-# #
-# # Always add "." to end of non-extension file
-# #
-# file = $(file). ;
-# }
-# elems = $(elems) $(file) ;
-# }
-#
-# local portable = [ path.join $(elems) ] ;
-#
-# return $(portable) ;
-# }
-#
-# #
-# # Converts a portable path spec into a native VMS path.
-# #
-# # Relies on having at least one dot (".") included in the file
-# # name to be able to differentiate it ftom the directory part.
-# #
-# rule native-VMS ( path )
-# {
-# local device = "" ;
-# local dir = $(path) ;
-# local file = "" ;
-# local native ;
-# local split ;
-#
-# #
-# # Has device ?
-# #
-# if [ is-rooted $(dir) ]
-# {
-# split = [ MATCH ^/([^:]+:)/?(.*) : $(dir) ] ;
-# device = $(split[1]) ;
-# dir = $(split[2]) ;
-# }
-#
-# #
-# # Has file ?
-# #
-# # This is no exact science, just guess work:
-# #
-# # If the last part of the current path spec
-# # includes some chars, followed by a dot,
-# # optionally followed by more chars -
-# # then it is a file (keep your fingers crossed).
-# #
-# split = [ regex.split $(dir) / ] ;
-# local maybe_file = $(split[-1]) ;
-#
-# if [ MATCH ^([^.]+\\..*) : $(maybe_file) ]
-# {
-# file = $(maybe_file) ;
-# dir = [ sequence.join $(split[1--2]) : / ] ;
-# }
-#
-# #
-# # Has dir spec ?
-# #
-# if $(dir) = "."
-# {
-# dir = "[]" ;
-# }
-# else if $(dir)
-# {
-# dir = [ regex.replace $(dir) \\.\\. - ] ;
-# dir = [ regex.replace $(dir) / . ] ;
-#
-# if $(device) = ""
-# {
-# #
-# # Relative directory
-# #
-# dir = "."$(dir) ;
-# }
-# dir = "["$(dir)"]" ;
-# }
-#
-# native = [ sequence.join $(device) $(dir) $(file) ] ;
-#
-# return $(native) ;
-# }
-#
-#
-# rule __test__ ( ) {
-#
-# import assert ;
-# import errors : try catch ;
-#
-# assert.true is-rooted "/" ;
-# assert.true is-rooted "/foo" ;
-# assert.true is-rooted "/foo/bar" ;
-# assert.result : is-rooted "." ;
-# assert.result : is-rooted "foo" ;
-# assert.result : is-rooted "foo/bar" ;
-#
-# assert.true has-parent "foo" ;
-# assert.true has-parent "foo/bar" ;
-# assert.true has-parent "." ;
-# assert.result : has-parent "/" ;
-#
-# assert.result "." : basename "." ;
-# assert.result ".." : basename ".." ;
-# assert.result "foo" : basename "foo" ;
-# assert.result "foo" : basename "bar/foo" ;
-# assert.result "foo" : basename "gaz/bar/foo" ;
-# assert.result "foo" : basename "/gaz/bar/foo" ;
-#
-# assert.result "." : parent "foo" ;
-# assert.result "/" : parent "/foo" ;
-# assert.result "foo/bar" : parent "foo/bar/giz" ;
-# assert.result ".." : parent "." ;
-# assert.result ".." : parent "../foo" ;
-# assert.result "../../foo" : parent "../../foo/bar" ;
-#
-#
-# assert.result "." : reverse "." ;
-# assert.result ".." : reverse "foo" ;
-# assert.result "../../.." : reverse "foo/bar/giz" ;
-#
-# assert.result "foo" : join "foo" ;
-# assert.result "/foo" : join "/" "foo" ;
-# assert.result "foo/bar" : join "foo" "bar" ;
-# assert.result "foo/bar" : join "foo/giz" "../bar" ;
-# assert.result "foo/giz" : join "foo/bar/baz" "../../giz" ;
-# assert.result ".." : join "." ".." ;
-# assert.result ".." : join "foo" "../.." ;
-# assert.result "../.." : join "../foo" "../.." ;
-# assert.result "/foo" : join "/bar" "../foo" ;
-# assert.result "foo/giz" : join "foo/giz" "." ;
-# assert.result "." : join lib2 ".." ;
-# assert.result "/" : join "/a" ".." ;
-#
-# assert.result /a/b : join /a/b/c .. ;
-#
-# assert.result "foo/bar/giz" : join "foo" "bar" "giz" ;
-# assert.result "giz" : join "foo" ".." "giz" ;
-# assert.result "foo/giz" : join "foo" "." "giz" ;
-#
-# try ;
-# {
-# join "a" "/b" ;
-# }
-# catch only first element may be rooted ;
-#
-# local CWD = "/home/ghost/build" ;
-# assert.result : all-parents . : . : $(CWD) ;
-# assert.result . .. ../.. ../../.. : all-parents "Jamfile" : "" : $(CWD) ;
-# assert.result foo . .. ../.. ../../.. : all-parents "foo/Jamfile" : "" : $(CWD) ;
-# assert.result ../Work .. ../.. ../../.. : all-parents "../Work/Jamfile" : "" : $(CWD) ;
-#
-# local CWD = "/home/ghost" ;
-# assert.result . .. : all-parents "Jamfile" : "/home" : $(CWD) ;
-# assert.result . : all-parents "Jamfile" : "/home/ghost" : $(CWD) ;
-#
-# assert.result "c/d" : relative "a/b/c/d" "a/b" ;
-# assert.result "foo" : relative "foo" "." ;
-#
-# local save-os = [ modules.peek path : os ] ;
-# modules.poke path : os : NT ;
-#
-# assert.result "foo/bar/giz" : make "foo/bar/giz" ;
-# assert.result "foo/bar/giz" : make "foo\\bar\\giz" ;
-# assert.result "foo" : make "foo/." ;
-# assert.result "foo" : make "foo/bar/.." ;
-# assert.result "/D:/My Documents" : make "D:\\My Documents" ;
-# assert.result "/c:/boost/tools/build/new/project.jam" : make "c:\\boost\\tools\\build\\test\\..\\new\\project.jam" ;
-#
-# assert.result "foo\\bar\\giz" : native "foo/bar/giz" ;
-# assert.result "foo" : native "foo" ;
-# assert.result "D:\\My Documents\\Work" : native "/D:/My Documents/Work" ;
-#
-# modules.poke path : os : UNIX ;
-#
-# assert.result "foo/bar/giz" : make "foo/bar/giz" ;
-# assert.result "/sub1" : make "/sub1/." ;
-# assert.result "/sub1" : make "/sub1/sub2/.." ;
-# assert.result "sub1" : make "sub1/." ;
-# assert.result "sub1" : make "sub1/sub2/.." ;
-# assert.result "/foo/bar" : native "/foo/bar" ;
-#
-# modules.poke path : os : VMS ;
-#
-# #
-# # Don't really need to poke os before these
-# #
-# assert.result "disk:" "[dir]" "file" : split-path-VMS "disk:[dir]file" ;
-# assert.result "disk:" "[dir]" "" : split-path-VMS "disk:[dir]" ;
-# assert.result "disk:" "" "" : split-path-VMS "disk:" ;
-# assert.result "disk:" "" "file" : split-path-VMS "disk:file" ;
-# assert.result "" "[dir]" "file" : split-path-VMS "[dir]file" ;
-# assert.result "" "[dir]" "" : split-path-VMS "[dir]" ;
-# assert.result "" "" "file" : split-path-VMS "file" ;
-# assert.result "" "" "" : split-path-VMS "" ;
-#
-# #
-# # Special case: current directory
-# #
-# assert.result "" "[]" "" : split-path-VMS "[]" ;
-# assert.result "disk:" "[]" "" : split-path-VMS "disk:[]" ;
-# assert.result "" "[]" "file" : split-path-VMS "[]file" ;
-# assert.result "disk:" "[]" "file" : split-path-VMS "disk:[]file" ;
-#
-# #
-# # Make portable paths
-# #
-# assert.result "/disk:" : make "disk:" ;
-# assert.result "foo/bar/giz" : make "[.foo.bar.giz]" ;
-# assert.result "foo" : make "[.foo]" ;
-# assert.result "foo" : make "[.foo.bar.-]" ;
-# assert.result ".." : make "[.-]" ;
-# assert.result ".." : make "[-]" ;
-# assert.result "." : make "[]" ;
-# assert.result "giz.h" : make "giz.h" ;
-# assert.result "foo/bar/giz.h" : make "[.foo.bar]giz.h" ;
-# assert.result "/disk:/my_docs" : make "disk:[my_docs]" ;
-# assert.result "/disk:/boost/tools/build/new/project.jam" : make "disk:[boost.tools.build.test.-.new]project.jam" ;
-#
-# #
-# # Special case (adds '.' to end of file w/o extension to
-# # disambiguate from directory in portable path spec).
-# #
-# assert.result "Jamfile." : make "Jamfile" ;
-# assert.result "dir/Jamfile." : make "[.dir]Jamfile" ;
-# assert.result "/disk:/dir/Jamfile." : make "disk:[dir]Jamfile" ;
-#
-# #
-# # Make native paths
-# #
-# assert.result "disk:" : native "/disk:" ;
-# assert.result "[.foo.bar.giz]" : native "foo/bar/giz" ;
-# assert.result "[.foo]" : native "foo" ;
-# assert.result "[.-]" : native ".." ;
-# assert.result "[.foo.-]" : native "foo/.." ;
-# assert.result "[]" : native "." ;
-# assert.result "disk:[my_docs.work]" : native "/disk:/my_docs/work" ;
-# assert.result "giz.h" : native "giz.h" ;
-# assert.result "disk:Jamfile." : native "/disk:Jamfile." ;
-# assert.result "disk:[my_docs.work]Jamfile." : native "/disk:/my_docs/work/Jamfile." ;
-#
-# modules.poke path : os : $(save-os) ;
-#
-# }
-
-#
-
-
-#def glob(dir, patterns):
-# result = []
-# for pattern in patterns:
-# result.extend(builtin_glob(os.path.join(dir, pattern)))
-# return result
-
-def glob(dirs, patterns, exclude_patterns=None):
- """Returns the list of files matching the given pattern in the
- specified directory. Both directories and patterns are
- supplied as portable paths. Each pattern should be non-absolute
- path, and can't contain '.' or '..' elements. Each slash separated
- element of pattern can contain the following special characters:
- - '?', which match any character
- - '*', which matches arbitrary number of characters.
- A file $(d)/e1/e2/e3 (where 'd' is in $(dirs)) matches pattern p1/p2/p3
- if and only if e1 matches p1, e2 matches p2 and so on.
- For example:
- [ glob . : *.cpp ]
- [ glob . : */build/Jamfile ]
- """
-
- assert(isinstance(patterns, list))
- assert(isinstance(dirs, list))
-
- if not exclude_patterns:
- exclude_patterns = []
- else:
- assert(isinstance(exclude_patterns, list))
-
- real_patterns = [os.path.join(d, p) for p in patterns for d in dirs]
- real_exclude_patterns = [os.path.join(d, p) for p in exclude_patterns
- for d in dirs]
-
- inc = [os.path.normpath(name) for p in real_patterns
- for name in builtin_glob(p)]
- exc = [os.path.normpath(name) for p in real_exclude_patterns
- for name in builtin_glob(p)]
- return [x for x in inc if x not in exc]
-
-def glob_tree(roots, patterns, exclude_patterns=None):
- """Recursive version of GLOB. Builds the glob of files while
- also searching in the subdirectories of the given roots. An
- optional set of exclusion patterns will filter out the
- matching entries from the result. The exclusions also apply
- to the subdirectory scanning, such that directories that
- match the exclusion patterns will not be searched."""
-
- if not exclude_patterns:
- exclude_patterns = []
-
- result = glob(roots, patterns, exclude_patterns)
- subdirs = [s for s in glob(roots, ["*"]) if s != "." and s != ".." and os.path.isdir(s)]
- if subdirs:
- result.extend(glob_tree(subdirs, patterns, exclude_patterns))
-
- return result
-
-def glob_in_parents(dir, patterns, upper_limit=None):
- """Recursive version of GLOB which glob sall parent directories
- of dir until the first match is found. Returns an empty result if no match
- is found"""
-
- assert(isinstance(dir, str))
- assert(isinstance(patterns, list))
-
- result = []
-
- absolute_dir = os.path.join(os.getcwd(), dir)
- absolute_dir = os.path.normpath(absolute_dir)
- while absolute_dir:
- new_dir = os.path.split(absolute_dir)[0]
- if new_dir == absolute_dir:
- break
- result = glob([new_dir], patterns)
- if result:
- break
- absolute_dir = new_dir
-
- return result
-
-
-# The relpath functionality is written by
-# Cimarron Taylor
-def split(p, rest=[]):
- (h,t) = os.path.split(p)
- if len(h) < 1: return [t]+rest
- if len(t) < 1: return [h]+rest
- return split(h,[t]+rest)
-
-def commonpath(l1, l2, common=[]):
- if len(l1) < 1: return (common, l1, l2)
- if len(l2) < 1: return (common, l1, l2)
- if l1[0] != l2[0]: return (common, l1, l2)
- return commonpath(l1[1:], l2[1:], common+[l1[0]])
-
-def relpath(p1, p2):
- (common,l1,l2) = commonpath(split(p1), split(p2))
- p = []
- if len(l1) > 0:
- p = [ '../' * len(l1) ]
- p = p + l2
- if p:
- return os.path.join( *p )
- else:
- return "."