diff --git a/capella_diff_tools/__main__.py b/capella_diff_tools/__main__.py
index c7b33c7..7be3f35 100644
--- a/capella_diff_tools/__main__.py
+++ b/capella_diff_tools/__main__.py
@@ -6,7 +6,6 @@
import datetime
import logging
-import os
import pathlib
import sys
import typing as t
@@ -65,7 +64,7 @@ def main(
"""
logging.basicConfig(level="DEBUG")
model.pop("revision", None)
- model["path"] = _ensure_git(model["path"])
+ _ensure_git(model)
old_model = capellambse.MelodyModel(**model, revision=old_version)
new_model = capellambse.MelodyModel(**model, revision=new_version)
@@ -73,6 +72,7 @@ def main(
"model": model,
"old_revision": _get_revision_info(old_model, old_version),
"new_revision": _get_revision_info(new_model, new_version),
+ "commit_log": _get_commit_log(new_model, old_version, new_version),
}
objects = compare.compare_all_objects(old_model, new_model)
diagrams = compare.compare_all_diagrams(old_model, new_model)
@@ -92,18 +92,19 @@ def main(
report_file.write(report.generate_html(result))
-def _ensure_git(path: str | os.PathLike[str]) -> str:
- proto, path = fh.split_protocol(path)
+def _ensure_git(model: dict[str, t.Any]) -> None:
+ proto, path = fh.split_protocol(model["path"])
if proto == "file":
assert isinstance(path, pathlib.Path)
- path = "git+" + path.resolve().as_uri()
+ path = path.resolve()
+ if "entrypoint" not in model and path.is_file():
+ model["entrypoint"] = path.name
+ path = path.parent
+ model["path"] = "git+" + path.as_uri()
+ elif proto != "git":
+ raise click.UsageError("The 'model' must point to a git repository")
- proto, _ = fh.split_protocol(path)
- if proto != "git":
- raise click.Abort("The 'model' must point to a git repository")
-
- assert isinstance(path, str)
- return path
+ assert isinstance(model["path"], str)
def _get_revision_info(
@@ -132,6 +133,36 @@ def _get_revision_info(
}
+def _get_commit_log(
+ model: capellambse.MelodyModel,
+ old_version: str,
+ new_version: str,
+) -> list[types.RevisionInfo]:
+ res = model._loader.resources["\x00"]
+ assert isinstance(res, fh.git.GitFileHandler)
+ commits: list[types.RevisionInfo] = []
+ rawlog = res._git(
+ "log",
+ "-z",
+ "--reverse",
+ "--format=format:%H%x00%aN%x00%aI%x00%B",
+ f"{old_version}..{new_version}",
+ encoding="utf-8",
+ ).split("\x00")
+ log = capellambse.helpers.ntuples(4, rawlog)
+ for hash, author, date_str, description in log:
+ commits.append(
+ {
+ "hash": hash,
+ "revision": hash,
+ "author": author,
+ "date": datetime.datetime.fromisoformat(date_str),
+ "description": description.rstrip(),
+ }
+ )
+ return commits
+
+
class CustomYAMLDumper(yaml.SafeDumper):
"""A custom YAML dumper that can serialize markupsafe.Markup."""
diff --git a/capella_diff_tools/report.html.jinja b/capella_diff_tools/report.html.jinja
index e621356..90a8ca1 100644
--- a/capella_diff_tools/report.html.jinja
+++ b/capella_diff_tools/report.html.jinja
@@ -58,7 +58,7 @@
Repository: {{ data["metadata"]["model"]["path"] | e }}
Entry point: {{ data["metadata"]["model"]["entrypoint"] | e }}
The review of changes covers the following commits:
+The review of changes covers the following range of commits:
| {{ data["metadata"]["new_revision"]["date"] | e }} | |||||
| Commit message | -{{ data["metadata"]["old_revision"]["description"] | e }} | -{{ data["metadata"]["new_revision"]["description"] | e }} | +Summary | +{{ data["metadata"]["old_revision"]["description"].split("\n") | first | e }} | +{{ data["metadata"]["new_revision"]["description"].split("\n") | first | e }} |
|---|---|---|---|---|---|
| Commit ID (hash) | @@ -96,6 +96,48 @@
Detailed information about the contained commits:
+ +| {{ commit.hash | e }} | +{{ commit.date | e }} | +{{ commit.author | e }} | +{{ commit.description | e }} | +
| {{ data.metadata.old_revision.hash }} | +{{ data.metadata.old_revision.date }} | +{{ data.metadata.old_revision.author }} | +{{ data.metadata.old_revision.description }} | +
| + Error: The supplied report does not contain the commit log. + Detailed information is only available for the first and last commit. + | +|||
| {{ data.metadata.new_revision.hash }} | +{{ data.metadata.new_revision.date }} | +{{ data.metadata.new_revision.author }} | +{{ data.metadata.new_revision.description }} | +
| Commit ID (hash) | +Date & time | +Author | +Commit message | +
|---|---|---|---|