Как отфильтровать, сгруппировать вывод по author, commit модуль pysvn python?

На вход скрипта подается номер начальной ревизии,финальная ревизии, ссылка на svn репозиторий, имя файла. Реализована фильтрации по имени файла и вывод одной строчкой автор, номер ревизии, коммит.

Как сгруппироать и отсортировать вывод по автору и его коммитам, чтобы автору соответствовали все его коммиты и имя автора не повторялось в выдаче?

автор имя

  • коммит
  • коммит

автор имя

  • коммит
  • коммит

    import pysvn
    import re
    
    svn_repo_path = 'http://svn.code.sf.net/p/keepass/code/trunk/'
    start_rev = 120
    end_rev = 139
    file_name = 'string'
    
    client = pysvn.Client()
    revision_start = pysvn.Revision(pysvn.opt_revision_kind.number, start_rev)
    revision_end = pysvn.Revision(pysvn.opt_revision_kind.number, end_rev)
    
    for log in client.log(
        svn_repo_path, 
        revision_start, 
        revision_end,
        discover_changed_paths=True,
        strict_node_history=True,
        limit=0,
        ):
    
        for chg_file in log["changed_paths"]:
            slice_url = re.search('[-._a-zA-Zа-яА-Я0-9]+$', chg_file["path"]) 
            search_word = re.search(file_name, slice_url.group(0), re.I) 
            if search_word != None:
                print(
                log.revision.number, 
                log["author"], 
                # log["message"],
                chg_file["path"],
                search_word.group(0)
                )

Ответы (1 шт):

Автор решения: overtone

Перед циклом for log in client.log можно создать переменную commits_per_author для сгруппированных диктов с автором и его коммитами, а в цикле добавлять туда элементы в таком виде:

if not commits_per_author.get(log["author"]):
    commits_per_author[log["author"]] = [log.revision.number]
else:
    commits_per_author[log["author"]].append(log.revision.number)

а чтобы избавиться от повторений и сгруппировать авторов и коммиты в более читаемом виде, можно добавить следующую ф-ию:

def combine_authors_and_commits(commits_per_author: dict) -> list[dict]:
    combined_authors_and_commits = []
    for item in commits_per_author.items():
        combined_authors_and_commits.append({
            "author": item[0],
            "commits": item[1]
        })

    return sorted(combined_authors_and_commits, key=lambda x: x["author"])

P.S. Я не очень понял, что из себя представляет коммит в коде, поэтому использовал для примера log.revision.number.

→ Ссылка