File: _pathcompat.py

package info (click to toggle)
python-fs 2.4.16-7
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,944 kB
  • sloc: python: 13,048; makefile: 226; sh: 3
file content (41 lines) | stat: -rw-r--r-- 1,309 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# mypy: ignore-errors
try:
    from os.path import commonpath
except ImportError:
    # Return the longest common sub-path of the sequence of paths given as input.
    # The paths are not normalized before comparing them (this is the
    # responsibility of the caller). Any trailing separator is stripped from the
    # returned path.

    def commonpath(paths):
        """Given a sequence of path names, returns the longest common sub-path."""

        if not paths:
            raise ValueError("commonpath() arg is an empty sequence")

        paths = tuple(paths)
        if isinstance(paths[0], bytes):
            sep = b"/"
            curdir = b"."
        else:
            sep = "/"
            curdir = "."

        split_paths = [path.split(sep) for path in paths]

        try:
            (isabs,) = set(p[:1] == sep for p in paths)
        except ValueError:
            raise ValueError("Can't mix absolute and relative paths")

        split_paths = [[c for c in s if c and c != curdir] for s in split_paths]
        s1 = min(split_paths)
        s2 = max(split_paths)
        common = s1
        for i, c in enumerate(s1):
            if c != s2[i]:
                common = s1[:i]
                break

        prefix = sep if isabs else sep[:0]
        return prefix + sep.join(common)