diff --git a/dist/wt b/dist/wt index 82b73336a969a8c4e398e576f5a0bf55a3b6e839..1c09a9c7c89255ae26f2bcfcbc16b83399e2884b 100755 --- a/dist/wt +++ b/dist/wt @@ -706,55 +706,18 @@ end return M ]] - -if _VERSION < "Lua 5.2" then - io.stderr:write("error: wt requires Lua 5.2 or later\n") - os.exit(1) -end +_EMBEDDED_MODULES["wt.help"] = [[-- SPDX-FileCopyrightText: Amolith +-- +-- SPDX-License-Identifier: GPL-3.0-or-later local exit = require("wt.exit") local EXIT_SUCCESS = exit.EXIT_SUCCESS -local EXIT_USER_ERROR = exit.EXIT_USER_ERROR -local EXIT_SYSTEM_ERROR = exit.EXIT_SYSTEM_ERROR -local shell = require("wt.shell") -local run_cmd = shell.run_cmd -local run_cmd_silent = shell.run_cmd_silent -local get_cwd = shell.get_cwd -local die = shell.die - -local path_mod = require("wt.path") -local branch_to_path = path_mod.branch_to_path -local split_path = path_mod.split_path -local relative_path = path_mod.relative_path -local path_inside = path_mod.path_inside -local escape_pattern = path_mod.escape_pattern - -local git_mod = require("wt.git") -local find_project_root = git_mod.find_project_root -local detect_source_worktree = git_mod.detect_source_worktree -local branch_exists_local = git_mod.branch_exists_local -local find_branch_remotes = git_mod.find_branch_remotes -local detect_cloned_default_branch = git_mod.detect_cloned_default_branch -local get_default_branch = git_mod.get_default_branch -local parse_branch_remotes = git_mod.parse_branch_remotes -local parse_worktree_list = git_mod.parse_worktree_list -local branch_checked_out_at = git_mod.branch_checked_out_at - -local config_mod = require("wt.config") -local resolve_url_template = config_mod.resolve_url_template -local extract_project_name = config_mod.extract_project_name -local load_global_config = config_mod.load_global_config -local load_project_config = config_mod.load_project_config - -local hooks_mod = require("wt.hooks") -local load_hook_permissions = hooks_mod.load_hook_permissions -local save_hook_permissions = hooks_mod.save_hook_permissions -local summarize_hooks = hooks_mod.summarize_hooks -local run_hooks = hooks_mod.run_hooks +---@class wt.help +local M = {} ---Print usage information -local function print_usage() +function M.print_usage() print("wt - git worktree manager") print("") print("Usage: wt [options]") @@ -771,7 +734,7 @@ local function print_usage() end -- Per-command help text (using table.concat for performance) -local COMMAND_HELP = { +M.COMMAND_HELP = { c = table.concat({ "wt c [--remote name]... [--own]", "", @@ -885,16 +848,70 @@ local COMMAND_HELP = { ---Show help for a specific command ---@param cmd string -local function show_command_help(cmd) - local help = COMMAND_HELP[cmd] +function M.show_command_help(cmd) + local help = M.COMMAND_HELP[cmd] if help then print(help) else - print_usage() + M.print_usage() end os.exit(EXIT_SUCCESS) end +return M +]] + + +if _VERSION < "Lua 5.2" then + io.stderr:write("error: wt requires Lua 5.2 or later\n") + os.exit(1) +end + +local exit = require("wt.exit") +local EXIT_SUCCESS = exit.EXIT_SUCCESS +local EXIT_USER_ERROR = exit.EXIT_USER_ERROR +local EXIT_SYSTEM_ERROR = exit.EXIT_SYSTEM_ERROR + +local shell = require("wt.shell") +local run_cmd = shell.run_cmd +local run_cmd_silent = shell.run_cmd_silent +local get_cwd = shell.get_cwd +local die = shell.die + +local path_mod = require("wt.path") +local branch_to_path = path_mod.branch_to_path +local split_path = path_mod.split_path +local relative_path = path_mod.relative_path +local path_inside = path_mod.path_inside +local escape_pattern = path_mod.escape_pattern + +local git_mod = require("wt.git") +local find_project_root = git_mod.find_project_root +local detect_source_worktree = git_mod.detect_source_worktree +local branch_exists_local = git_mod.branch_exists_local +local find_branch_remotes = git_mod.find_branch_remotes +local detect_cloned_default_branch = git_mod.detect_cloned_default_branch +local get_default_branch = git_mod.get_default_branch +local parse_branch_remotes = git_mod.parse_branch_remotes +local parse_worktree_list = git_mod.parse_worktree_list +local branch_checked_out_at = git_mod.branch_checked_out_at + +local config_mod = require("wt.config") +local resolve_url_template = config_mod.resolve_url_template +local extract_project_name = config_mod.extract_project_name +local load_global_config = config_mod.load_global_config +local load_project_config = config_mod.load_project_config + +local hooks_mod = require("wt.hooks") +local load_hook_permissions = hooks_mod.load_hook_permissions +local save_hook_permissions = hooks_mod.save_hook_permissions +local summarize_hooks = hooks_mod.summarize_hooks +local run_hooks = hooks_mod.run_hooks + +local help_mod = require("wt.help") +local print_usage = help_mod.print_usage +local show_command_help = help_mod.show_command_help + ---@param args string[] local function cmd_clone(args) -- Parse arguments: [--remote name]... [--own] diff --git a/src/main.lua b/src/main.lua index e842874fa5c307e5d644ea150fd24ef7f2f904ed..0da5252b8c1aca0f00725e459be92424432cee87 100644 --- a/src/main.lua +++ b/src/main.lua @@ -50,147 +50,9 @@ local save_hook_permissions = hooks_mod.save_hook_permissions local summarize_hooks = hooks_mod.summarize_hooks local run_hooks = hooks_mod.run_hooks ----Print usage information -local function print_usage() - print("wt - git worktree manager") - print("") - print("Usage: wt [options]") - print("") - print("Commands:") - print(" c [--remote name]... [--own] Clone into bare worktree structure") - print(" n [--remote name]... Initialize fresh project") - print(" a [-b []] Add worktree with optional hooks") - print(" r [-b] [-f] Remove worktree, optionally delete branch") - print(" l List worktrees with status") - print(" f Fetch all remotes") - print(" init [--dry-run] [-y] Convert existing repo to bare structure") - print(" help Show this help message") -end - --- Per-command help text (using table.concat for performance) -local COMMAND_HELP = { - c = table.concat({ - "wt c [--remote name]... [--own]", - "", - "Clone a repository into bare worktree structure.", - "", - "Arguments:", - " Git URL to clone", - "", - "Options:", - " --remote Add configured remote from ~/.config/wt/config.lua", - " Can be specified multiple times", - " --own Treat as your own project: first remote becomes 'origin'", - " (default: 'origin' renamed to 'upstream', your remotes added)", - "", - "Examples:", - " wt c https://github.com/user/repo.git", - " wt c git@github.com:user/repo.git --remote github --own", - }, "\n"), - - n = table.concat({ - "wt n [--remote name]...", - "", - "Initialize a fresh project with bare worktree structure.", - "", - "Arguments:", - " Name of the new project directory", - "", - "Options:", - " --remote Add configured remote from ~/.config/wt/config.lua", - " Can be specified multiple times", - "", - "Examples:", - " wt n my-project", - " wt n my-project --remote github --remote gitlab", - }, "\n"), - - a = table.concat({ - "wt a [-b []]", - "", - "Add a worktree for a branch.", - "", - "Arguments:", - " Branch name to checkout or create", - "", - "Options:", - " -b Create a new branch", - " Base commit/branch for new branch (only with -b)", - "", - "If run from inside an existing worktree, hooks from .wt.lua will be applied.", - "", - "Examples:", - " wt a main # Checkout existing branch", - " wt a feature/new -b # Create new branch from HEAD", - " wt a feature/new -b main # Create new branch from main", - }, "\n"), - - r = table.concat({ - "wt r [-b] [-f]", - "", - "Remove a worktree.", - "", - "Arguments:", - " Branch name of worktree to remove", - "", - "Options:", - " -b Also delete the branch after removing worktree", - " -f Force removal even with uncommitted changes", - "", - "Examples:", - " wt r feature/old # Remove worktree, keep branch", - " wt r feature/old -b # Remove worktree and delete branch", - " wt r feature/old -f # Force remove with uncommitted changes", - }, "\n"), - - l = table.concat({ - "wt l", - "", - "List all worktrees with status information.", - "", - "Displays a table showing:", - " - Branch name", - " - Relative path from project root", - " - Commit status (ahead/behind remote)", - " - Working tree status (clean/dirty)", - }, "\n"), - - f = table.concat({ - "wt f", - "", - "Fetch from all configured remotes.", - "", - "Runs 'git fetch --all' in the bare repository.", - }, "\n"), - - init = table.concat({ - "wt init [--dry-run] [-y]", - "", - "Convert an existing git repository to bare worktree structure.", - "", - "Options:", - " --dry-run Show what would be done without making changes", - " -y Skip confirmation prompt", - "", - "This command:", - " 1. Moves .git/ to .bare/", - " 2. Creates .git file pointing to .bare/", - " 3. Creates a worktree for the current branch", - " 4. Removes orphaned files from project root", - }, "\n"), -} - ----Show help for a specific command ----@param cmd string -local function show_command_help(cmd) - local help = COMMAND_HELP[cmd] - if help then - print(help) - else - print_usage() - end - os.exit(EXIT_SUCCESS) -end +local help_mod = require("wt.help") +local print_usage = help_mod.print_usage +local show_command_help = help_mod.show_command_help ---@param args string[] local function cmd_clone(args) diff --git a/src/wt/help.lua b/src/wt/help.lua new file mode 100644 index 0000000000000000000000000000000000000000..ec03c790dbe674fb7d8e5433718d968d68da5224 --- /dev/null +++ b/src/wt/help.lua @@ -0,0 +1,153 @@ +-- SPDX-FileCopyrightText: Amolith +-- +-- SPDX-License-Identifier: GPL-3.0-or-later + +local exit = require("wt.exit") +local EXIT_SUCCESS = exit.EXIT_SUCCESS + +---@class wt.help +local M = {} + +---Print usage information +function M.print_usage() + print("wt - git worktree manager") + print("") + print("Usage: wt [options]") + print("") + print("Commands:") + print(" c [--remote name]... [--own] Clone into bare worktree structure") + print(" n [--remote name]... Initialize fresh project") + print(" a [-b []] Add worktree with optional hooks") + print(" r [-b] [-f] Remove worktree, optionally delete branch") + print(" l List worktrees with status") + print(" f Fetch all remotes") + print(" init [--dry-run] [-y] Convert existing repo to bare structure") + print(" help Show this help message") +end + +-- Per-command help text (using table.concat for performance) +M.COMMAND_HELP = { + c = table.concat({ + "wt c [--remote name]... [--own]", + "", + "Clone a repository into bare worktree structure.", + "", + "Arguments:", + " Git URL to clone", + "", + "Options:", + " --remote Add configured remote from ~/.config/wt/config.lua", + " Can be specified multiple times", + " --own Treat as your own project: first remote becomes 'origin'", + " (default: 'origin' renamed to 'upstream', your remotes added)", + "", + "Examples:", + " wt c https://github.com/user/repo.git", + " wt c git@github.com:user/repo.git --remote github --own", + }, "\n"), + + n = table.concat({ + "wt n [--remote name]...", + "", + "Initialize a fresh project with bare worktree structure.", + "", + "Arguments:", + " Name of the new project directory", + "", + "Options:", + " --remote Add configured remote from ~/.config/wt/config.lua", + " Can be specified multiple times", + "", + "Examples:", + " wt n my-project", + " wt n my-project --remote github --remote gitlab", + }, "\n"), + + a = table.concat({ + "wt a [-b []]", + "", + "Add a worktree for a branch.", + "", + "Arguments:", + " Branch name to checkout or create", + "", + "Options:", + " -b Create a new branch", + " Base commit/branch for new branch (only with -b)", + "", + "If run from inside an existing worktree, hooks from .wt.lua will be applied.", + "", + "Examples:", + " wt a main # Checkout existing branch", + " wt a feature/new -b # Create new branch from HEAD", + " wt a feature/new -b main # Create new branch from main", + }, "\n"), + + r = table.concat({ + "wt r [-b] [-f]", + "", + "Remove a worktree.", + "", + "Arguments:", + " Branch name of worktree to remove", + "", + "Options:", + " -b Also delete the branch after removing worktree", + " -f Force removal even with uncommitted changes", + "", + "Examples:", + " wt r feature/old # Remove worktree, keep branch", + " wt r feature/old -b # Remove worktree and delete branch", + " wt r feature/old -f # Force remove with uncommitted changes", + }, "\n"), + + l = table.concat({ + "wt l", + "", + "List all worktrees with status information.", + "", + "Displays a table showing:", + " - Branch name", + " - Relative path from project root", + " - Commit status (ahead/behind remote)", + " - Working tree status (clean/dirty)", + }, "\n"), + + f = table.concat({ + "wt f", + "", + "Fetch from all configured remotes.", + "", + "Runs 'git fetch --all' in the bare repository.", + }, "\n"), + + init = table.concat({ + "wt init [--dry-run] [-y]", + "", + "Convert an existing git repository to bare worktree structure.", + "", + "Options:", + " --dry-run Show what would be done without making changes", + " -y Skip confirmation prompt", + "", + "This command:", + " 1. Moves .git/ to .bare/", + " 2. Creates .git file pointing to .bare/", + " 3. Creates a worktree for the current branch", + " 4. Removes orphaned files from project root", + }, "\n"), +} + +---Show help for a specific command +---@param cmd string +function M.show_command_help(cmd) + local help = M.COMMAND_HELP[cmd] + if help then + print(help) + else + M.print_usage() + end + os.exit(EXIT_SUCCESS) +end + +return M