mirror of
				https://github.com/SillyTavern/SillyTavern.git
				synced 2025-06-05 21:59:27 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			97 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // Plugin manager script.
 | |
| // Usage:
 | |
| // 1. node plugins.js update
 | |
| // 2. node plugins.js install <plugin-git-url>
 | |
| // More operations coming soon.
 | |
| import fs from 'node:fs';
 | |
| import path from 'node:path';
 | |
| import process from 'node:process';
 | |
| import { fileURLToPath } from 'node:url';
 | |
| 
 | |
| import { default as git, CheckRepoActions } from 'simple-git';
 | |
| import { color } from './src/util.js';
 | |
| 
 | |
| const __dirname = import.meta.dirname ?? path.dirname(fileURLToPath(import.meta.url));
 | |
| process.chdir(__dirname);
 | |
| const pluginsPath = './plugins';
 | |
| 
 | |
| const command = process.argv[2];
 | |
| 
 | |
| if (!command) {
 | |
|     console.log('Usage: node plugins.js <command>');
 | |
|     console.log('Commands:');
 | |
|     console.log('  update - Update all installed plugins');
 | |
|     console.log('  install <plugin-git-url> - Install plugin from a Git URL');
 | |
|     process.exit(1);
 | |
| }
 | |
| 
 | |
| if (command === 'update') {
 | |
|     console.log(color.magenta('Updating all plugins'));
 | |
|     updatePlugins();
 | |
| }
 | |
| 
 | |
| if (command === 'install') {
 | |
|     const pluginName = process.argv[3];
 | |
|     console.log('Installing a new plugin', color.green(pluginName));
 | |
|     installPlugin(pluginName);
 | |
| }
 | |
| 
 | |
| async function updatePlugins() {
 | |
|     const directories = fs.readdirSync(pluginsPath)
 | |
|         .filter(file => !file.startsWith('.'))
 | |
|         .filter(file => fs.statSync(path.join(pluginsPath, file)).isDirectory());
 | |
| 
 | |
|     console.log(`Found ${color.cyan(directories.length)} directories in ./plugins`);
 | |
| 
 | |
|     for (const directory of directories) {
 | |
|         try {
 | |
|             console.log(`Updating plugin ${color.green(directory)}...`);
 | |
|             const pluginPath = path.join(pluginsPath, directory);
 | |
|             const pluginRepo = git(pluginPath);
 | |
| 
 | |
|             const isRepo = await pluginRepo.checkIsRepo(CheckRepoActions.IS_REPO_ROOT);
 | |
|             if (!isRepo) {
 | |
|                 console.log(`Directory ${color.yellow(directory)} is not a Git repository`);
 | |
|                 continue;
 | |
|             }
 | |
| 
 | |
|             await pluginRepo.fetch();
 | |
|             const commitHash = await pluginRepo.revparse(['HEAD']);
 | |
|             const trackingBranch = await pluginRepo.revparse(['--abbrev-ref', '@{u}']);
 | |
|             const log = await pluginRepo.log({
 | |
|                 from: commitHash,
 | |
|                 to: trackingBranch,
 | |
|             });
 | |
| 
 | |
|             if (log.total === 0) {
 | |
|                 console.log(`Plugin ${color.blue(directory)} is already up to date`);
 | |
|                 continue;
 | |
|             }
 | |
| 
 | |
|             await pluginRepo.pull();
 | |
|             const latestCommit = await pluginRepo.revparse(['HEAD']);
 | |
|             console.log(`Plugin ${color.green(directory)} updated to commit ${color.cyan(latestCommit)}`);
 | |
|         } catch (error) {
 | |
|             console.error(color.red(`Failed to update plugin ${directory}: ${error.message}`));
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     console.log(color.magenta('All plugins updated!'));
 | |
| }
 | |
| 
 | |
| async function installPlugin(pluginName) {
 | |
|     try {
 | |
|         const pluginPath = path.join(pluginsPath, path.basename(pluginName, '.git'));
 | |
| 
 | |
|         if (fs.existsSync(pluginPath)) {
 | |
|             return console.log(color.yellow(`Directory already exists at ${pluginPath}`));
 | |
|         }
 | |
| 
 | |
|         await git().clone(pluginName, pluginPath, { '--depth': 1 });
 | |
|         console.log(`Plugin ${color.green(pluginName)} installed to ${color.cyan(pluginPath)}`);
 | |
|     }
 | |
|     catch (error) {
 | |
|         console.error(color.red(`Failed to install plugin ${pluginName}`), error);
 | |
|     }
 | |
| }
 |