nix build
./result/bin/onechat
+``onechat version`` prints ``yyyy-mm-dd-gitshort`` for a Nix build, adds
+``-dirty`` for a dirty tree, and prints ``dev`` for a direct Go build.
+
Format and check all files:
.. code:: console
--- /dev/null
+package main
+
+import (
+ "io"
+ "os"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+)
+
+func TestVersionCommandPrintsBuildVersion(t *testing.T) {
+ original := version
+ version = "test-version"
+ t.Cleanup(func() {
+ version = original
+ })
+
+ require.Equal(t, "test-version\n", commandOutput(t, "version"))
+}
+
+func TestHelpListsVersionCommand(t *testing.T) {
+ require.Contains(t, commandOutput(t, "help"), " version show the build version\n")
+}
+
+func commandOutput(t *testing.T, args ...string) string {
+ t.Helper()
+
+ reader, writer, err := os.Pipe()
+ require.NoError(t, err)
+
+ originalArgs, originalStdout := os.Args, os.Stdout
+ os.Args = append([]string{"onechat"}, args...)
+ os.Stdout = writer
+ t.Cleanup(func() {
+ os.Args, os.Stdout = originalArgs, originalStdout
+
+ require.NoError(t, reader.Close())
+ })
+
+ err = run()
+ require.NoError(t, err)
+
+ require.NoError(t, writer.Close())
+
+ output, err := io.ReadAll(reader)
+ require.NoError(t, err)
+
+ return string(output)
+}
}:
let
forEachSystem = nixpkgs.lib.genAttrs (import systems);
+ date = self.lastModifiedDate;
+ revision = self.shortRev or self.dirtyShortRev or "unknown";
+ version = "${builtins.substring 0 4 date}-${builtins.substring 4 2 date}-${builtins.substring 6 2 date}-${revision}";
in
{
packages = forEachSystem (
system:
let
pkgs = nixpkgs.legacyPackages.${system};
- onechat = pkgs.callPackage ./nix/package.nix { src = self; };
+ onechat = pkgs.callPackage ./nix/package.nix {
+ src = self;
+ inherit version;
+ };
in
{
inherit onechat;
-n print the plan without model calls
login log in to ChatGPT with a device code
probe LOG COUNT [BUILDS] measure the compactor on a log, with real calls
+ version show the build version
help show this help
Chat needs a running daemon. ONECHAT_DIR sets the data directory.
`
+// version is set by the package build and stays dev for direct Go builds.
+var version = "dev"
+
func main() {
err := run()
if err != nil {
if err != nil {
return fmt.Errorf("write command help: %w", err)
}
+ case len(args) == 1 && args[0] == "version":
+ _, err := fmt.Println(version)
+ if err != nil {
+ return fmt.Errorf("write build version: %w", err)
+ }
case len(args) == 1 && args[0] == "login":
err := chatgptLogin(ctx, os.Stdout)
if err != nil {
lib,
buildGoModule,
src,
+ version,
}:
buildGoModule {
pname = "onechat";
- version = "0.1.0";
- inherit src;
+ inherit src version;
subPackages = [ "." ];
+ ldflags = [ "-X main.version=${version}" ];
vendorHash = "sha256-35kAjo+7gbOOzNbKJyMYUcAF11HK7WzO3m9ZcrOsqY0=";
# The flake check runs the full replay.
installCheckPhase = ''
runHook preInstallCheck
[[ "$("$out/bin/onechat" help)" == "Usage: onechat "* ]]
+ [[ "$("$out/bin/onechat" version)" == "${version}" ]]
runHook postInstallCheck
'';