UNPKG

@kinvolk/headlamp-plugin

Version:

The needed infrastructure for building Headlamp plugins.

105 lines (87 loc) 3.52 kB
import chalk from 'chalk'; import { getAllPlugins, getPluginInfo, getPluginPath } from '../utils/plugin.js'; import { getLatestTagForPlugin, hasChangesInPluginSinceLatestTag, getCommitsSinceTag } from '../utils/git.js'; interface ListOptions { changed?: boolean; verbose?: boolean; } export function listPlugins(options: ListOptions = {}): void { if (options.changed) { console.log(chalk.blue('🔍 Scanning for plugins with changes since latest tag...\n')); } else { console.log(chalk.blue('🔍 Scanning for Headlamp plugins...\n')); } const allPlugins = getAllPlugins(); if (allPlugins.length === 0) { console.log(chalk.yellow('No plugins found in the workspace.')); return; } let plugins = allPlugins; if (options.changed) { plugins = allPlugins.filter(pluginName => { try { return hasChangesInPluginSinceLatestTag(pluginName); } catch (error) { // If we can't determine, include it to be safe return true; } }); if (plugins.length === 0) { console.log(chalk.green('✅ No plugins have changes since their latest tag.')); return; } console.log(chalk.yellow(`Found ${plugins.length} plugin(s) with changes since latest tag:\n`)); } else { console.log(chalk.green(`Found ${plugins.length} plugin(s):\n`)); } plugins.forEach(pluginName => { try { const pluginPath = getPluginPath(pluginName); const info = getPluginInfo(pluginPath); const latestTag = getLatestTagForPlugin(pluginName); let statusLine = ` 📦 ${chalk.bold(pluginName)} (${chalk.dim(info.version)})`; if (options.changed || options.verbose) { if (latestTag) { const hasChanges = hasChangesInPluginSinceLatestTag(pluginName); if (hasChanges) { statusLine += ` ${chalk.yellow('• has changes since')} ${chalk.dim(latestTag)}`; if (options.verbose) { const commits = getCommitsSinceTag(pluginName, latestTag); if (commits.length > 0) { statusLine += chalk.dim(` (${commits.length} commit${commits.length !== 1 ? 's' : ''})`); } } } else if (!options.changed) { statusLine += ` ${chalk.green('• up to date with')} ${chalk.dim(latestTag)}`; } } else { statusLine += ` ${chalk.cyan('• no tags found')}`; } } console.log(statusLine); if (options.verbose && latestTag) { const commits = getCommitsSinceTag(pluginName, latestTag); if (commits.length > 0) { commits.slice(0, 3).forEach(commit => { console.log(` ${chalk.dim('└─')} ${chalk.dim(commit)}`); }); if (commits.length > 3) { console.log(` ${chalk.dim(`└─ ... and ${commits.length - 3} more commit${commits.length - 3 !== 1 ? 's' : ''}`)}`); } } } } catch (error) { console.log(` 📦 ${chalk.bold(pluginName)} ${chalk.red('(error reading info)')}`); } }); if (options.changed && plugins.length > 0) { console.log(chalk.dim('\nThese plugins have changes and may need a new release.')); } console.log(chalk.dim('\nUse "plugin-releaser bump <plugin> <version>" to update a plugin version')); console.log(chalk.dim('Use "plugin-releaser package <plugin>" to create a tarball')); console.log(chalk.dim('Use "plugin-releaser release <plugin> <version>" to create a GitHub release')); }