Как отфильтровать, сгруппировать вывод по 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 шт):
Перед циклом 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.