Как найти дочерние элементы каждого узла с помощью журнала gitPython

Программы на Python
Ответить
Anonymous
 Как найти дочерние элементы каждого узла с помощью журнала git

Сообщение Anonymous »

Сейчас я работаю над GitGarden, инструментом CLI, который отображает ваши репозитории как растения. Я хочу, чтобы в моей программе имитировалось ветвление/разветвление репозиториев Github, подобно тому, как ветвится деревья в реальной жизни. Для этого мне нужно определить, является ли каждый узел расщеплением (ответвлением) или слиянием (возвращением к основному стволу). Я успешно отметил слияния в своих протестированных репозиториях, но не разделения. Как я могу это сделать?
Здесь я получаю git-коммиты для репозитория с помощью журнала git:

Код: Выделить всё

def get_git_commits(limit=None):
cmd = [
"git", "log",
"--all",
"--date=iso",
"--pretty=format:%H%x1f%an%x1f%ad%x1f%s%x1f%b%x1f%P%x1e"
]

if limit:
cmd.insert(2, f"-{limit}")

result = subprocess.run(
cmd,
capture_output=True,
text=True,
check=True
)

commits = []
for record in result.stdout.strip("\n\x1e").split("\x1e"):
fields = record.split("\x1f")
commits.append({
"hash": fields[0],
"author": fields[1],
"date": fields[2],
"subject": fields[3],
"body": fields[4],
"parents": fields[5].split() if fields[5] else []
})

return commits
Здесь я получаю дочерние элементы каждого узла:

Код: Выделить всё

commits = get_git_commits(limit)
commits.reverse()

children = {c["hash"]: [] for c in commits}
for c in commits:
for parent in c["parents"]:
if parent in children:
children[parent].append(c["hash"])
И здесь я печатаю соответствующие значения при визуализации дерева:

Код: Выделить всё

is_merge = len(commit["parents"]) > 1
is_split = len(children[commit["hash"]]) > 1

if is_merge:
canvas[y][x] = f"{GREEN}MERGE"
elif is_split:
canvas[y][x] = f"{GREEN}SPLIT"
Остальная часть дерева печатается с помощью символа "|", но я не думаю, что это здесь уместно.

Подробнее здесь: https://stackoverflow.com/questions/798 ... ng-git-log
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»