1111import re
1212import shutil
1313from packaging import version
14+ import sys
15+
1416from . import utils
1517
1618CHANGELOGS_DIR = Path (__file__ ).parent .parent / "changelogs"
17- assert CHANGELOGS_DIR .is_dir ()
1819
1920class Package :
2021 PATTERNS = [
@@ -48,7 +49,7 @@ class PackageIndex:
4849 def __init__ (self , version , searchdir = None , flavor = "" , architecture = 64 ):
4950 self .version = version
5051 self .flavor = flavor
51- self .searchdir = searchdir
52+ self .searchdir = Path ( searchdir ) if searchdir else CHANGELOGS_DIR
5253 self .architecture = architecture
5354 self .packages = {"tools" : {}, "python" : {}, "wheelhouse" : {}}
5455 self ._load_index ()
@@ -102,6 +103,10 @@ def find_previous_version(target_version, searchdir=None, flavor="", architectur
102103 return max (versions , key = version .parse , default = target_version )
103104
104105def compare_package_indexes (version2 , version1 = None , searchdir = None , flavor = "" , flavor1 = None , architecture = 64 ):
106+ """Comparison by looking versions in a given Changelog directory"""
107+ if not searchdir or (not Path (searchdir ).is_dir () and not CHANGELOGS_DIR .is_dir ()):
108+ print (f"Error: changelogs directory { CHANGELOGS_DIR } does not exist." )
109+ sys .exit (1 )
105110 version1 = version1 or find_previous_version (version2 , searchdir , flavor , architecture )
106111 flavor1 = flavor1 or flavor
107112
@@ -140,8 +145,49 @@ def write_changelog(version2, version1=None, searchdir=None, flavor="", architec
140145 f .write (changelog )
141146 # Copy to winpython/changelogs back to basedir
142147 if basedir :
143- shutil .copyfile (output_file , basedir / output_file .name )
148+ shutil .copyfile (output_file , Path (basedir ) / output_file .name )
149+
150+ def compare_two_markdown_files (file1 , file2 ):
151+ """Compare two arbitrary markdown files with WinPython changelog format."""
152+ class DummyPackageIndex (PackageIndex ):
153+ def __init__ (self , filename ):
154+ self .packages = {"tools" : {}, "python" : {}, "wheelhouse" : {}}
155+ self ._load_index (filename )
156+
157+ def _load_index (self , filename ):
158+ with open (filename , "r" , encoding = utils .guess_encoding (filename )[0 ]) as f :
159+ self ._parse_index (f .read ())
160+
161+ pi1 = DummyPackageIndex (Path (file1 ))
162+ pi2 = DummyPackageIndex (Path (file2 ))
163+
164+ text = f"## Differences between { file1 } and { file2 } \n \n <details>\n \n "
165+ for key in PackageIndex .HEADERS :
166+ diff = compare_packages (pi1 .packages [key ], pi2 .packages [key ])
167+ if diff :
168+ text += f"\n { PackageIndex .HEADERS [key ]} \n \n { diff } "
169+ return text + "\n </details>\n \n * * *\n "
170+
171+ def print_usage ():
172+ print ("Usage:" )
173+ print (" python diff.py file1.md file2.md" )
174+ print (" - Compare two markdown changelog files directly." )
175+ print (" python diff.py <version2> <version1> [searchdir] [flavor] [architecture]" )
176+ print (" - Compare WinPython markdown changelogs by version." )
144177
145178if __name__ == "__main__" :
146- print (compare_package_indexes ("3.7.4.0" , "3.7.2.0" , r"C:\WinP\bd37\budot" , "Zero" , architecture = 32 ))
147- write_changelog ("3.7.4.0" , "3.7.2.0" , r"C:\WinP\bd37\budot" , "Ps2" , architecture = 64 )
179+ if len (sys .argv ) == 3 and all (arg .lower ().endswith ('.md' ) for arg in sys .argv [1 :]):
180+ # Usage: python diff.py file1.md file2.md
181+ file1 , file2 = sys .argv [1 ], sys .argv [2 ]
182+ print (compare_two_markdown_files (file1 , file2 ))
183+ elif len (sys .argv ) >= 3 :
184+ # Original usage (version comparison)
185+ # Example: python diff.py 3.7.4.0 3.7.2.0 "C:\WinP\bd37\budot" "Zero" 32
186+ version2 = sys .argv [1 ]
187+ version1 = sys .argv [2 ]
188+ searchdir = Path (sys .argv [3 ]) if len (sys .argv ) > 3 else CHANGELOGS_DIR
189+ flavor = sys .argv [4 ] if len (sys .argv ) > 4 else ""
190+ architecture = int (sys .argv [5 ]) if len (sys .argv ) > 5 else 64
191+ print (compare_package_indexes (version2 , version1 , searchdir , flavor , architecture = architecture ))
192+ else :
193+ print_usage ()
0 commit comments