From 02f521803e9b1561eff1ce99f9c771fe7485e580 Mon Sep 17 00:00:00 2001 From: Aly Raffauf Date: Sat, 18 Jul 2026 14:08:24 -0400 Subject: [PATCH] nix/tg: add man page generation and set as default package --- flake/packages.nix | 7 +++++-- go.mod | 2 ++ go.sum | 3 +++ internal/cli/man.go | 32 ++++++++++++++++++++++++++++++++ internal/cli/root.go | 1 + nix/tg.nix | 9 +++++++-- 6 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 internal/cli/man.go diff --git a/flake/packages.nix b/flake/packages.nix index 0b26395..5e784ad 100644 --- a/flake/packages.nix +++ b/flake/packages.nix @@ -1,7 +1,10 @@ _: { - perSystem = {pkgs, ...}: { + perSystem = {pkgs, ...}: let + tg = pkgs.callPackage ../nix/tg.nix {}; + in { packages = { - tg = pkgs.callPackage ../nix/tg.nix {}; + inherit tg; + default = tg; }; }; } diff --git a/go.mod b/go.mod index b73d913..f482cad 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,7 @@ require ( require ( github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect github.com/danieljoos/wincred v1.2.3 // indirect github.com/earthboundkid/versioninfo/v2 v2.24.1 // indirect github.com/fsnotify/fsnotify v1.10.1 // indirect @@ -41,6 +42,7 @@ require ( github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.70.0 // indirect github.com/prometheus/procfs v0.21.1 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sagikazarmark/locafero v0.12.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/spf13/afero v1.15.0 // indirect diff --git a/go.sum b/go.sum index 2055d09..38f4049 100644 --- a/go.sum +++ b/go.sum @@ -5,6 +5,8 @@ github.com/bluesky-social/indigo v0.0.0-20260629160527-dfe5578fd537/go.mod h1:Jq github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo= +github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/danieljoos/wincred v1.2.3 h1:v7dZC2x32Ut3nEfRH+vhoZGvN72+dQ/snVXo/vMFLdQ= github.com/danieljoos/wincred v1.2.3/go.mod h1:6qqX0WNrS4RzPZ1tnroDzq9kY3fu1KwE7MRLQK4X0bs= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -82,6 +84,7 @@ github.com/prometheus/procfs v0.21.1 h1:GljZCt+zSTS+NZq88cyQ1LjZ+RCHp3uVuabBWA5+ github.com/prometheus/procfs v0.21.1/go.mod h1:aB55Cww9pdSJVHk0hUf0inxWyyjPogFIjmHKYgMKmtY= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sagikazarmark/locafero v0.12.0 h1:/NQhBAkUb4+fH1jivKHWusDYFjMOOKU88eegjfxfHb4= github.com/sagikazarmark/locafero v0.12.0/go.mod h1:sZh36u/YSZ918v0Io+U9ogLYQJ9tLLBmM4eneO6WwsI= diff --git a/internal/cli/man.go b/internal/cli/man.go new file mode 100644 index 0000000..51e43fb --- /dev/null +++ b/internal/cli/man.go @@ -0,0 +1,32 @@ +package cli + +import ( + "fmt" + "os" + + "github.com/spf13/cobra" + "github.com/spf13/cobra/doc" +) + +// manCmd is hidden from `tg --help`: it is a build-time tool the Nix +// derivation invokes to generate man pages, not a user-facing command (cf. +// `gh`, which produces man pages via its Makefile rather than a visible +// subcommand). +var manCmd = &cobra.Command{ + Use: "man [directory]", + Short: "Generate man pages", + Args: cobra.ExactArgs(1), + Hidden: true, + RunE: func(_ *cobra.Command, args []string) error { + dir := args[0] + if err := os.MkdirAll(dir, 0o755); err != nil { + return fmt.Errorf("create man page directory: %w", err) + } + header := &doc.GenManHeader{ + Title: "tg", + Section: "1", + Source: "tg", + } + return doc.GenManTree(rootCmd, header, dir) + }, +} diff --git a/internal/cli/root.go b/internal/cli/root.go index 84717ed..7831d03 100644 --- a/internal/cli/root.go +++ b/internal/cli/root.go @@ -93,5 +93,6 @@ func init() { rootCmd.AddCommand(browseCmd) rootCmd.AddCommand(completionCmd) + rootCmd.AddCommand(manCmd) rootCmd.AddCommand(apiCmd) } diff --git a/nix/tg.nix b/nix/tg.nix index 27ea9fb..115d168 100644 --- a/nix/tg.nix +++ b/nix/tg.nix @@ -10,9 +10,8 @@ buildGoModule { pname = "tg"; version = "dev"; src = ../.; - vendorHash = "sha256-NKfVkBe863hXwjY1Jic+0rTnRD6v25pbzDx9W4W5OqU="; + vendorHash = "sha256-vAjC3nyJvXVvsBj+JXPN7dNPAdhwY64lqHLsOhTuVKc="; subPackages = ["cmd/tg"]; - env.CGO_ENABLED = "0"; nativeBuildInputs = [ installShellFiles @@ -23,6 +22,12 @@ buildGoModule { wrapProgram $out/bin/tg --prefix PATH : ${lib.makeBinPath [git]} '' + lib.optionalString (stdenv.buildPlatform.canExecute stdenv.hostPlatform) '' + # Man page dates stay reproducible because stdenv sets SOURCE_DATE_EPOCH, + # which cobra/doc reads when GenManHeader.Date is unset. + manPageDir=$(mktemp -d) + $out/bin/tg man "$manPageDir" + installManPage "$manPageDir"/* + installShellCompletion --cmd tg \ --bash <($out/bin/tg completion bash) \ --fish <($out/bin/tg completion fish) \ -- 2.51.2