Skip to content

allow to compare two markdown files directly #1637

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 7, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 51 additions & 5 deletions winpython/diff.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,11 @@
import re
import shutil
from packaging import version
import sys

from . import utils

CHANGELOGS_DIR = Path(__file__).parent.parent / "changelogs"
assert CHANGELOGS_DIR.is_dir()

class Package:
PATTERNS = [
Expand Down Expand Up @@ -48,7 +49,7 @@ class PackageIndex:
def __init__(self, version, searchdir=None, flavor="", architecture=64):
self.version = version
self.flavor = flavor
self.searchdir = searchdir
self.searchdir = Path(searchdir) if searchdir else CHANGELOGS_DIR
self.architecture = architecture
self.packages = {"tools": {}, "python": {}, "wheelhouse": {}}
self._load_index()
Expand Down Expand Up @@ -102,6 +103,10 @@ def find_previous_version(target_version, searchdir=None, flavor="", architectur
return max(versions, key=version.parse, default=target_version)

def compare_package_indexes(version2, version1=None, searchdir=None, flavor="", flavor1=None, architecture=64):
"""Comparison by looking versions in a given Changelog directory"""
if not searchdir or (not Path(searchdir).is_dir() and not CHANGELOGS_DIR.is_dir()):
print(f"Error: changelogs directory {CHANGELOGS_DIR} does not exist.")
sys.exit(1)
version1 = version1 or find_previous_version(version2, searchdir, flavor, architecture)
flavor1 = flavor1 or flavor

Expand Down Expand Up @@ -140,8 +145,49 @@ def write_changelog(version2, version1=None, searchdir=None, flavor="", architec
f.write(changelog)
# Copy to winpython/changelogs back to basedir
if basedir:
shutil.copyfile(output_file, basedir / output_file.name)
shutil.copyfile(output_file, Path(basedir) / output_file.name)

def compare_two_markdown_files(file1, file2):
"""Compare two arbitrary markdown files with WinPython changelog format."""
class DummyPackageIndex(PackageIndex):
def __init__(self, filename):
self.packages = {"tools": {}, "python": {}, "wheelhouse": {}}
self._load_index(filename)

def _load_index(self, filename):
with open(filename, "r", encoding=utils.guess_encoding(filename)[0]) as f:
self._parse_index(f.read())

pi1 = DummyPackageIndex(Path(file1))
pi2 = DummyPackageIndex(Path(file2))

text = f"## Differences between {file1} and {file2}\n\n<details>\n\n"
for key in PackageIndex.HEADERS:
diff = compare_packages(pi1.packages[key], pi2.packages[key])
if diff:
text += f"\n{PackageIndex.HEADERS[key]}\n\n{diff}"
return text + "\n</details>\n\n* * *\n"

def print_usage():
print("Usage:")
print(" python diff.py file1.md file2.md")
print(" - Compare two markdown changelog files directly.")
print(" python diff.py <version2> <version1> [searchdir] [flavor] [architecture]")
print(" - Compare WinPython markdown changelogs by version.")

if __name__ == "__main__":
print(compare_package_indexes("3.7.4.0", "3.7.2.0", r"C:\WinP\bd37\budot", "Zero", architecture=32))
write_changelog("3.7.4.0", "3.7.2.0", r"C:\WinP\bd37\budot", "Ps2", architecture=64)
if len(sys.argv) == 3 and all(arg.lower().endswith('.md') for arg in sys.argv[1:]):
# Usage: python diff.py file1.md file2.md
file1, file2 = sys.argv[1], sys.argv[2]
print(compare_two_markdown_files(file1, file2))
elif len(sys.argv) >= 3:
# Original usage (version comparison)
# Example: python diff.py 3.7.4.0 3.7.2.0 "C:\WinP\bd37\budot" "Zero" 32
version2 = sys.argv[1]
version1 = sys.argv[2]
searchdir = Path(sys.argv[3]) if len(sys.argv) > 3 else CHANGELOGS_DIR
flavor = sys.argv[4] if len(sys.argv) > 4 else ""
architecture = int(sys.argv[5]) if len(sys.argv) > 5 else 64
print(compare_package_indexes(version2, version1, searchdir, flavor, architecture=architecture))
else:
print_usage()