# path.py - functions for handling file paths # # Copyright (C) 2015 Arthur de Jong # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # # The files produced as output from the software do not automatically fall # under the copyright of the software, unless explicitly stated otherwise. import os import re def pattern2re(pattern): res = '' if pattern.startswith('/'): pattern.lstrip('/') res += '\A/?' else: res += '\A(.*/)?' i, n = 0, len(pattern) while i < n: c = pattern[i] i += 1 if c == '*': if i < n and pattern[i] == '*': res = res + '.*' i += 1 else: res = res + '[^/]*' elif c == '?': res = res + '[^/]' elif c == '[': j = i if j < n and pattern[j] == '!': j += 1 if j < n and pattern[j] == ']': j += 1 while j < n and pattern[j] != ']': j += 1 if j >= n: res = res + '\\[' else: stuff = pattern[i:j].replace('\\', '\\\\') i = j + 1 if stuff[0] == '!': stuff = '^' + stuff[1:] elif stuff[0] == '^': stuff = '\\' + stuff res = '%s[%s]' % (res, stuff) else: res = res + re.escape(c) # TODO: do something special with patterns ending with / return re.compile(res + '\Z(?ms)') def parents(path): """Generator that yields parent directories of the specified path.""" path = os.path.dirname(path) while path not in ('', '/'): yield path path = os.path.dirname(path)