@@ -1298,6 +1298,30 @@ def _install_plugin(src: InstInfo) -> Union[InstInfo, None]:
1298
1298
return staged_src
1299
1299
1300
1300
1301
+ def location_from_name (plugin_name : str ) -> (str , str ):
1302
+ """Maybe the location was passed in place of the plugin name. Check
1303
+ if this looks like a filepath or URL and return that as well as the
1304
+ plugin name."""
1305
+ if not Path (plugin_name ).exists ():
1306
+ # No path included, return the name only.
1307
+ return (None , plugin_name )
1308
+
1309
+ # Directory containing the plugin? The plugin name should match the dir.
1310
+ if os .path .isdir (plugin_name ):
1311
+ return (Path (plugin_name ).parent , Path (plugin_name ).name )
1312
+
1313
+ # Possibly the entrypoint itself was passed?
1314
+ elif os .path .isfile (plugin_name ):
1315
+ if Path (plugin_name ).with_suffix ('' ).name != Path (plugin_name ).parent .name or \
1316
+ not Path (plugin_name ).parent .parent .exists ():
1317
+ # If the directory is not named for the plugin, we can't infer what
1318
+ # should be done.
1319
+ # FIXME: return InstInfo with entrypoint rather than source str.
1320
+ return (None , plugin_name )
1321
+ # We have to make inferences as to the naming here.
1322
+ return (Path (plugin_name ).parent .parent , Path (plugin_name ).with_suffix ('' ).name )
1323
+
1324
+
1301
1325
def install (plugin_name : str ) -> Union [str , None ]:
1302
1326
"""Downloads plugin from source repos, installs and activates plugin.
1303
1327
Returns the location of the installed plugin or "None" in the case of
@@ -1310,33 +1334,48 @@ def install(plugin_name: str) -> Union[str, None]:
1310
1334
else :
1311
1335
name = plugin_name
1312
1336
commit = None
1313
- log .debug (f"Searching for { name } " )
1314
- if search (name ):
1315
- global LAST_FOUND
1316
- src = LAST_FOUND
1317
- src .commit = commit
1318
- log .debug (f'Retrieving { src .name } from { src .source_loc } ' )
1319
- try :
1320
- installed = _install_plugin (src )
1321
- except FileExistsError as err :
1322
- log .error (f'File exists: { err .filename } ' )
1323
- return None
1324
- LAST_FOUND = None
1325
- if not installed :
1326
- log .warning (f'{ plugin_name } : installation aborted' )
1337
+ # Is the install request specifying a path to the plugin?
1338
+ direct_location , name = location_from_name (name )
1339
+ if direct_location :
1340
+ logging .debug (f"install of { name } requested from { direct_location } " )
1341
+ src = InstInfo (name , direct_location , None )
1342
+ if not src .get_inst_details ():
1343
+ src = None
1344
+ # Treating a local git repo as a directory allows testing
1345
+ # uncommitted changes.
1346
+ if src and src .srctype == Source .LOCAL_REPO :
1347
+ src .srctype = Source .DIRECTORY
1348
+ if not direct_location or not src :
1349
+ log .debug (f"direct_location { direct_location } , src: { src } " )
1350
+ log .debug (f"Searching for { name } " )
1351
+ if search (name ):
1352
+ global LAST_FOUND
1353
+ src = LAST_FOUND
1354
+ src .commit = commit
1355
+ log .debug (f'Retrieving { src .name } from { src .source_loc } ' )
1356
+ else :
1327
1357
return None
1328
1358
1329
- # Match case of the containing directory
1330
- for dirname in os .listdir (RECKLESS_CONFIG .reckless_dir ):
1331
- if dirname .lower () == installed .name .lower ():
1332
- inst_path = Path (RECKLESS_CONFIG .reckless_dir )
1333
- inst_path = inst_path / dirname / installed .entry
1334
- RECKLESS_CONFIG .enable_plugin (inst_path )
1335
- enable (installed .name )
1336
- return f"{ installed .source_loc } "
1337
- log .error (('dynamic activation failed: '
1338
- f'{ installed .name } not found in reckless directory' ))
1359
+ try :
1360
+ installed = _install_plugin (src )
1361
+ except FileExistsError as err :
1362
+ log .error (f'File exists: { err .filename } ' )
1339
1363
return None
1364
+ LAST_FOUND = None
1365
+ if not installed :
1366
+ log .warning (f'{ plugin_name } : installation aborted' )
1367
+ return None
1368
+
1369
+ # Match case of the containing directory
1370
+ for dirname in os .listdir (RECKLESS_CONFIG .reckless_dir ):
1371
+ if dirname .lower () == installed .name .lower ():
1372
+ inst_path = Path (RECKLESS_CONFIG .reckless_dir )
1373
+ inst_path = inst_path / dirname / installed .entry
1374
+ RECKLESS_CONFIG .enable_plugin (inst_path )
1375
+ enable (installed .name )
1376
+ return f"{ installed .source_loc } "
1377
+ log .error (('dynamic activation failed: '
1378
+ f'{ installed .name } not found in reckless directory' ))
1340
1379
return None
1341
1380
1342
1381
@@ -1386,6 +1425,8 @@ def search(plugin_name: str) -> Union[InstInfo, None]:
1386
1425
if srctype in [Source .DIRECTORY , Source .LOCAL_REPO ,
1387
1426
Source .GITHUB_REPO , Source .OTHER_URL ]:
1388
1427
found = _source_search (plugin_name , source )
1428
+ if found :
1429
+ log .debug (f"{ found } , { found .srctype } " )
1389
1430
if not found :
1390
1431
continue
1391
1432
log .info (f"found { found .name } in source: { found .source_loc } " )
0 commit comments