| | |
| | |
| | |
| | |
| | |
| | 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); |
| | } |
| | } |
| |
|