def relpath(self, path, start='.'): # Since os.path.relpath() calls os.path.normpath() # (see http://docs.python.org/library/os.path.html#os.path.abspath ) # it also removes trailing slashes and converts forward and backward # slashes to the preferred slash os.sep. start = self.abspath(start) path = self.abspath(path) if not path.lower().startswith(start.lower()): # Then path is outside the directory given by start. return None # FIXME: os.relpath still returns a path here. rel_path = path[len(start):] if not rel_path: # Then the paths are the same. pass elif rel_path[0] == self.sep: # It is probably sufficient to remove just the first character # since os.path.normpath() collapses separators, but we use # lstrip() just to be sure. rel_path = rel_path.lstrip(self.sep) else: # We are in the case typified by the following example: # path = "/tmp/foobar", start = "/tmp/foo" -> rel_path = "bar" return None return rel_path
def relpath(self, path, start='.'): # Since os.path.relpath() calls os.path.normpath() # (see http://docs.python.org/library/os.path.html#os.path.abspath ) # it also removes trailing slashes and converts forward and backward # slashes to the preferred slash os.sep. start = self.abspath(start) path = self.abspath(path) if not path.lower().startswith(start.lower()): # path is outside the directory given by start; compute path from root return '../' * start.count('/') + path rel_path = path[len(start):] if not rel_path: # Then the paths are the same. pass elif rel_path[0] == self.sep: # It is probably sufficient to remove just the first character # since os.path.normpath() collapses separators, but we use # lstrip() just to be sure. rel_path = rel_path.lstrip(self.sep) else: # We are in the case typified by the following example: # path = "/tmp/foobar", start = "/tmp/foo" -> rel_path = "bar" # FIXME: We return a less-than-optimal result here. return '../' * start.count('/') + path return rel_path