11
11
import re
12
12
import shutil
13
13
from packaging import version
14
+ import sys
15
+
14
16
from .import utils
15
17
16
18
CHANGELOGS_DIR = Path (__file__ ).parent .parent / "changelogs"
17
- assert CHANGELOGS_DIR .is_dir ()
18
19
19
20
class Package :
20
21
PATTERNS = [
@@ -48,7 +49,7 @@ class PackageIndex:
48
49
def __init__ (self ,version ,searchdir = None ,flavor = "" ,architecture = 64 ):
49
50
self .version = version
50
51
self .flavor = flavor
51
- self .searchdir = searchdir
52
+ self .searchdir = Path ( searchdir ) if searchdir else CHANGELOGS_DIR
52
53
self .architecture = architecture
53
54
self .packages = {"tools" : {},"python" : {},"wheelhouse" : {}}
54
55
self ._load_index ()
@@ -102,6 +103,10 @@ def find_previous_version(target_version, searchdir=None, flavor="", architectur
102
103
return max (versions ,key = version .parse ,default = target_version )
103
104
104
105
def 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 )
105
110
version1 = version1 or find_previous_version (version2 ,searchdir ,flavor ,architecture )
106
111
flavor1 = flavor1 or flavor
107
112
@@ -140,8 +145,49 @@ def write_changelog(version2, version1=None, searchdir=None, flavor="", architec
140
145
f .write (changelog )
141
146
# Copy to winpython/changelogs back to basedir
142
147
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." )
144
177
145
178
if __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 ()