1
0
mirror of https://github.com/openSUSE/osc.git synced 2025-11-02 04:22:15 +01:00

Extend 'git-obs pr dump' to create metadata about submodules and their diff

This commit is contained in:
2025-08-01 13:34:44 +02:00
parent 35f25dc9b8
commit 7ff0cdc6b4
2 changed files with 90 additions and 0 deletions

View File

@@ -379,3 +379,49 @@ class Git:
if porcelain:
cmd += ["--porcelain"]
return self._run_git(cmd)
# SUBMODULES
def get_submodules(self) -> dict:
SUBMODULE_RE = re.compile(r"^submodule\.(?P<submodule>[^=]*)\.(?P<key>[^\.=]*)=(?P<value>.*)$")
STATUS_RE = re.compile(r"^.(?P<commit>[a-f0-9]+) (?P<submodule>[^ ]+).*$")
result = {}
try:
lines = self._run_git(["config", "--blob", "HEAD:.gitmodules", "--list"], mute_stderr=True).splitlines()
except subprocess.CalledProcessError:
# .gitmodules file is missing
return {}
for line in lines:
match = SUBMODULE_RE.match(line)
if not match:
continue
submodule = match.groupdict()["submodule"]
key = match.groupdict()["key"]
value = match.groupdict()["value"]
if key == "url":
assert value.startswith("../../")
submodule_entry = result.setdefault(submodule, {})
submodule_entry[key] = value
lines = self._run_git(["submodule", "status"]).splitlines()
for line in lines:
match = STATUS_RE.match(line)
if not match:
continue
submodule = match.groupdict()["submodule"]
commit = match.groupdict()["commit"]
result[submodule]["commit"] = commit
remote_url = self.get_remote_url()
for submodule_entry in result.values():
clone_url = self.urljoin(remote_url, submodule_entry["url"])
owner, repo = self.get_owner_repo_from_url(clone_url)
submodule_entry["clone_url"] = clone_url
submodule_entry["owner"] = owner
submodule_entry["repo"] = repo
return result