3737Run python synclic.py -h for help.
3838"""
3939
40-
4140TRACE = True
4241TRACE_ADD = True
4342TRACE_FETCH = True
4443TRACE_DEEP = False
4544
46-
4745# may be useful to change for testing
4846SPDX_DEFAULT_REPO = 'spdx/license-list-data'
4947
@@ -164,15 +162,15 @@ def __init__(self, external_base_dir):
164162 if not exists (self .new_dir ):
165163 mkdir (self .new_dir )
166164
167- def get_licenses (self , scancode_licenses ):
165+ def get_licenses (self , scancode_licenses , ** kwargs ):
168166 """
169167 Return a mapping of key -> ScanCode License objects either fetched
170168 externally or loaded from the existing `self.original_dir`
171169 """
172170 print ('Fetching and storing external licenses in:' , self .original_dir )
173171
174172 licenses = []
175- for lic , text in self .fetch_licenses (scancode_licenses ):
173+ for lic , text in self .fetch_licenses (scancode_licenses , ** kwargs ):
176174 try :
177175 with io .open (lic .text_file , 'w' , encoding = 'utf-8' )as tf :
178176 tf .write (text )
@@ -193,7 +191,7 @@ def get_licenses(self, scancode_licenses):
193191
194192 return load_licenses (self .update_dir , with_deprecated = True )
195193
196- def fetch_licenses (self , scancode_licenses ):
194+ def fetch_licenses (self , scancode_licenses , ** kwargs ):
197195 """
198196 Yield tuples of (License object, license text) fetched from this external source.
199197 """
@@ -338,14 +336,18 @@ class SpdxSource(ExternalLicensesSource):
338336 'notes' ,
339337 )
340338
341- def fetch_licenses (self , scancode_licenses , from_repo = SPDX_DEFAULT_REPO ):
339+ def fetch_licenses (self , scancode_licenses , commitish = None , from_repo = SPDX_DEFAULT_REPO ):
342340 """
343341 Yield License objects fetched from the latest SPDX license list.
342+ Use the latest tagged version or the `commitish` is provided.
344343 """
345- # get latest tag
346- tags_url = 'https://api.github.com/repos/{from_repo}/tags' .format (** locals ())
347- tags = get_response (tags_url , headers = {}, params = {})
348- tag = tags [0 ]['name' ]
344+ if not commitish :
345+ # get latest tag
346+ tags_url = 'https://api.github.com/repos/{from_repo}/tags' .format (** locals ())
347+ tags = get_response (tags_url , headers = {}, params = {})
348+ tag = tags [0 ]['name' ]
349+ else :
350+ tag = commitish
349351
350352 # fetch licenses and exceptions
351353 # note that exceptions data have -- weirdly enough -- a different schema
@@ -385,11 +387,15 @@ def build_license(self, mapping, scancode_licenses):
385387
386388 # these keys have a complicated history
387389 if key in set ([
388- 'gpl-1.0' , 'gpl-2.0' , 'gpl-3.0' ,
389- 'lgpl-2.0' , 'lgpl-2.1' , 'lgpl-3.0' ,
390- 'agpl-1.0' , 'agpl-2.0' , 'agpl-3.0' ,
391- 'gfdl-1.1' , 'gfdl-1.2' , 'gfdl-1.3' ,
392- 'nokia-qt-exception-1.1' , 'bzip2-1.0.5' ]):
390+ 'gpl-1.0' , 'gpl-2.0' , 'gpl-3.0' ,
391+ 'lgpl-2.0' , 'lgpl-2.1' , 'lgpl-3.0' ,
392+ 'agpl-1.0' , 'agpl-2.0' , 'agpl-3.0' ,
393+ 'gfdl-1.1' , 'gfdl-1.2' , 'gfdl-1.3' ,
394+ 'nokia-qt-exception-1.1' ,
395+ 'bzip2-1.0.5' ,
396+ 'bsd-2-clause-freebsd' ,
397+ 'bsd-2-clause-netbsd' ,
398+ ]):
393399 return
394400
395401 deprecated = mapping .get ('isDeprecatedLicenseId' , False )
@@ -484,7 +490,7 @@ def __init__(self, external_base_dir, api_base_url=None, api_key=None):
484490
485491 super (DejaSource , self ).__init__ (external_base_dir )
486492
487- def fetch_licenses (self , scancode_licenses ):
493+ def fetch_licenses (self , scancode_licenses , ** kwargs ):
488494 api_url = '/' .join ([self .api_base_url .rstrip ('/' ), 'licenses/' ])
489495 for licenses in call_deja_api (api_url , self .api_key , paginate = 100 ):
490496 for lic in licenses :
@@ -815,7 +821,9 @@ def update_external(_attrib, _sc_val, _ext_val):
815821 scancode_key = scancode_license .spdx_license_key
816822 external_key = external_license .spdx_license_key
817823 if scancode_key != external_key :
818- raise Exception ('Non mergeable licenses with different SPDX keys: %(scancode_key)s <> %(external_key)s' % locals ())
824+ raise Exception (
825+ f'Non mergeable licenses with different SPDX keys: scancode_license.spdx_license_key { scancode_key } <> external_license.spdx_license_key { external_key } '
826+ )
819827 else :
820828 scancode_key = scancode_license .key
821829 external_key = external_license .key
@@ -914,7 +922,7 @@ def update_external(_attrib, _sc_val, _ext_val):
914922
915923
916924def synchronize_licenses (scancode_licenses , external_source , use_spdx_key = False ,
917- match_text = False , match_approx = False ):
925+ match_text = False , match_approx = False , commitish = None ):
918926 """
919927 Update the `scancode_licenses` ScanCodeLicenses licenses and texts in-place
920928 (e.g. in their current storage directory) from an `external_source`
@@ -949,7 +957,7 @@ def synchronize_licenses(scancode_licenses, external_source, use_spdx_key=False,
949957
950958 # mappings of key -> License
951959 scancodes_by_key = scancode_licenses .by_key
952- externals_by_key = external_source .get_licenses (scancode_licenses )
960+ externals_by_key = external_source .get_licenses (scancode_licenses , commitish = commitish )
953961
954962 if use_spdx_key :
955963 scancodes_by_key = scancode_licenses .by_spdx_key
@@ -1123,8 +1131,9 @@ def synchronize_licenses(scancode_licenses, external_source, use_spdx_key=False,
11231131@click .option ('-a' , '--match-approx' , is_flag = True , default = False , help = 'Include approximate license detection matches when matching ScanCode license.' )
11241132@click .option ('-t' , '--trace' , is_flag = True , default = False , help = 'Print execution trace.' )
11251133@click .option ('--create-ext' , is_flag = True , default = False , help = 'Create new external licenses in the external source if possible.' )
1134+ @click .option ('--commitish' , type = str , default = None , help = 'An optional commitish to use for SPDX license data instead of the latest release.' )
11261135@click .help_option ('-h' , '--help' )
1127- def cli (license_dir , source , match_text , match_approx , trace , create_ext ):
1136+ def cli (license_dir , source , match_text , match_approx , trace , create_ext , commitish = None ):
11281137 """
11291138 Synchronize ScanCode licenses with an external license source.
11301139
@@ -1143,10 +1152,13 @@ def cli(license_dir, source, match_text, match_approx, trace, create_ext):
11431152 scancode_licenses = ScanCodeLicenses ()
11441153
11451154 use_spdx_key = source == 'spdx'
1146- added_to_external = synchronize_licenses (scancode_licenses , external_source ,
1147- use_spdx_key = use_spdx_key ,
1148- match_text = match_text ,
1149- match_approx = match_approx )
1155+ added_to_external = synchronize_licenses (
1156+ scancode_licenses , external_source ,
1157+ use_spdx_key = use_spdx_key ,
1158+ match_text = match_text ,
1159+ match_approx = match_approx ,
1160+ commitish = commitish ,
1161+ )
11501162 print ()
11511163 if create_ext and isinstance (external_source , DejaSource ):
11521164 api_url = external_source .api_base_url
0 commit comments