summaryrefslogtreecommitdiff
path: root/repo/www/helpers.py
blob: 80115b7fede6fb6131851e2fe61a8a8e4ef5612a (plain)
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
from collections import defaultdict
from dataclasses import dataclass, field
from os import path
from typing import List, Set


@dataclass
class Directory:
    files: List[str] = field(default_factory=list)
    subfolders: Set[str] = field(default_factory=set)


def _find_files(extensions, repository):
    patterns = (f'**.{ext}' for ext in extensions)
    zero = '\x00'
    return repository.git.ls_files('-z', *patterns).strip(zero).split(zero)


def _fill_directories(files, top_dir):
    directories = defaultdict(Directory)

    for f in files:
        fdir, fname = path.split(f)

        directories[fdir].files.append(fname)

        while fdir:
            parent, child = path.split(fdir)
            directories[parent].subfolders.add(child)
            fdir = parent

    return directories


def compute_directories(extensions, repository):
    files = _find_files(extensions, repository)
    top_dir = path.relpath(repository.working_dir, path.curdir)
    return _fill_directories(files, top_dir)