mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-15 20:51:40 +00:00
Adds TG's mapmerge2, a new TGM-compatible merger that handles things like dictionary expansion much better than the old tool, as well as supporting a git merge hook for map files. This PR does not remove the old merger as this one is more annoying to setup.
51 lines
1.8 KiB
Python
51 lines
1.8 KiB
Python
#!/usr/bin/env python3
|
|
import os
|
|
import pygit2
|
|
import dmm
|
|
from mapmerge import merge_map
|
|
|
|
def main(repo):
|
|
if repo.index.conflicts:
|
|
print("You need to resolve merge conflicts first.")
|
|
return 1
|
|
|
|
changed = 0
|
|
for path, status in repo.status().items():
|
|
if path.endswith(".dmm") and (status & (pygit2.GIT_STATUS_INDEX_MODIFIED | pygit2.GIT_STATUS_INDEX_NEW)):
|
|
# read the index
|
|
index_entry = repo.index[path]
|
|
index_map = dmm.DMM.from_bytes(repo[index_entry.id].read_raw())
|
|
|
|
try:
|
|
head_blob = repo[repo[repo.head.target].tree[path].id]
|
|
except KeyError:
|
|
# New map, no entry in HEAD
|
|
print(f"Converting new map: {path}")
|
|
assert (status & pygit2.GIT_STATUS_INDEX_NEW)
|
|
merged_map = index_map
|
|
else:
|
|
# Entry in HEAD, merge the index over it
|
|
print(f"Merging map: {path}")
|
|
assert not (status & pygit2.GIT_STATUS_INDEX_NEW)
|
|
head_map = dmm.DMM.from_bytes(head_blob.read_raw())
|
|
merged_map = merge_map(index_map, head_map)
|
|
|
|
# write to the index
|
|
blob_id = repo.create_blob(merged_map.to_bytes())
|
|
repo.index.add(pygit2.IndexEntry(path, blob_id, index_entry.mode))
|
|
changed += 1
|
|
|
|
# write to the working directory if that's clean
|
|
if status & (pygit2.GIT_STATUS_WT_DELETED | pygit2.GIT_STATUS_WT_MODIFIED):
|
|
print(f"Warning: {path} has unindexed changes, not overwriting them")
|
|
else:
|
|
merged_map.to_file(os.path.join(repo.workdir, path))
|
|
|
|
if changed:
|
|
repo.index.write()
|
|
print(f"Merged {changed} maps.")
|
|
return 0
|
|
|
|
if __name__ == '__main__':
|
|
exit(main(pygit2.Repository(pygit2.discover_repository(os.getcwd()))))
|