Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
488cfd1080 |
@@ -64,7 +64,7 @@ func VersionCommands(cli *Instance) *cobra.Command {
|
|||||||
promoteCmd := &cobra.Command{
|
promoteCmd := &cobra.Command{
|
||||||
Use: "promote <secret-name> <version>",
|
Use: "promote <secret-name> <version>",
|
||||||
Short: "Promote a specific version to current",
|
Short: "Promote a specific version to current",
|
||||||
Long: "Rewrites the secret's current file to name the specified " +
|
Long: "Updates the current symlink to point to the specified " +
|
||||||
"version. The versions' own times are left unchanged; secret " +
|
"version. The versions' own times are left unchanged; secret " +
|
||||||
"list then gives the time of the promote as the secret's last " +
|
"list then gives the time of the promote as the secret's last " +
|
||||||
"update.",
|
"update.",
|
||||||
@@ -293,7 +293,7 @@ func (cli *Instance) PromoteVersion(
|
|||||||
version, vault.ErrVersionNotFound, secretName)
|
version, vault.ErrVersionNotFound, secretName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rewrite the secret's current file to name the version
|
// Update the current symlink using the proper function
|
||||||
err = secret.SetCurrentVersion(cli.fs, secretDir, version)
|
err = secret.SetCurrentVersion(cli.fs, secretDir, version)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to update current version: %w", err)
|
return fmt.Errorf("failed to update current version: %w", err)
|
||||||
|
|||||||
@@ -6,8 +6,6 @@
|
|||||||
// - TestListVersionsNonExistentSecret: Tests error handling for missing secrets
|
// - TestListVersionsNonExistentSecret: Tests error handling for missing secrets
|
||||||
// - TestPromoteVersionCommand: Tests `secret version promote` command
|
// - TestPromoteVersionCommand: Tests `secret version promote` command
|
||||||
// - TestPromoteNonExistentVersion: Tests error handling for invalid promotion
|
// - TestPromoteNonExistentVersion: Tests error handling for invalid promotion
|
||||||
// - TestPromoteHelpSaysCurrentFileIsRewritten: Tests `secret version promote
|
|
||||||
// --help` text
|
|
||||||
// - TestGetSecretWithVersion: Tests `secret get --version` flag functionality
|
// - TestGetSecretWithVersion: Tests `secret get --version` flag functionality
|
||||||
// - TestGetSecretWritesBinaryValue: Tests `secret get` output of binary values
|
// - TestGetSecretWritesBinaryValue: Tests `secret get` output of binary values
|
||||||
// - TestGetSecretReturnsWriteError: Tests `secret get` when stdout fails
|
// - TestGetSecretReturnsWriteError: Tests `secret get` when stdout fails
|
||||||
@@ -272,23 +270,6 @@ func TestPromoteNonExistentVersion(t *testing.T) {
|
|||||||
require.ErrorIs(t, err, vault.ErrVersionNotFound)
|
require.ErrorIs(t, err, vault.ErrVersionNotFound)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TestPromoteHelpSaysCurrentFileIsRewritten is a regression test for
|
|
||||||
// https://git.eeqj.de/sneak/secret/issues/153: `secret version promote
|
|
||||||
// --help` said it updates a symlink, but promote rewrites the secret's
|
|
||||||
// `current` file, which is a plain file.
|
|
||||||
//
|
|
||||||
//nolint:paralleltest // executes the CLI in-process and sets the environment
|
|
||||||
func TestPromoteHelpSaysCurrentFileIsRewritten(t *testing.T) {
|
|
||||||
env := map[string]string{secret.EnvStateDir: t.TempDir()}
|
|
||||||
|
|
||||||
output, err := ExecuteCommandInProcess(
|
|
||||||
[]string{"version", "promote", "--help"}, "", env)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
assert.NotContains(t, output, "symlink")
|
|
||||||
assert.Contains(t, output, "current file")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestGetSecretWithVersion(t *testing.T) {
|
func TestGetSecretWithVersion(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
|
|||||||
@@ -421,20 +421,14 @@ func checkGPGAvailable() error {
|
|||||||
|
|
||||||
// withGPGStderr appends gpg's stderr, which says why gpg failed, to err
|
// withGPGStderr appends gpg's stderr, which says why gpg failed, to err
|
||||||
// from cmd.Output. cmd.Output keeps that stderr in the *exec.ExitError.
|
// from cmd.Output. cmd.Output keeps that stderr in the *exec.ExitError.
|
||||||
// err is returned unchanged when gpg wrote nothing to stderr.
|
|
||||||
func withGPGStderr(err error) error {
|
func withGPGStderr(err error) error {
|
||||||
var exitErr *exec.ExitError
|
var exitErr *exec.ExitError
|
||||||
|
|
||||||
if !errors.As(err, &exitErr) {
|
if errors.As(err, &exitErr) {
|
||||||
return err
|
return fmt.Errorf("%w: %s", err, strings.TrimSpace(string(exitErr.Stderr)))
|
||||||
}
|
}
|
||||||
|
|
||||||
stderr := strings.TrimSpace(string(exitErr.Stderr))
|
return err
|
||||||
if stderr == "" {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return fmt.Errorf("%w: %s", err, stderr)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// gpgEncryptDefault is the default implementation of GPG encryption
|
// gpgEncryptDefault is the default implementation of GPG encryption
|
||||||
|
|||||||
@@ -115,14 +115,3 @@ func TestGPGDecryptErrorHasGPGReason(t *testing.T) {
|
|||||||
_, err := secret.GPGDecryptFunc([]byte("not an OpenPGP message"))
|
_, err := secret.GPGDecryptFunc([]byte("not an OpenPGP message"))
|
||||||
require.ErrorContains(t, err, "gpg: no valid OpenPGP data found")
|
require.ErrorContains(t, err, "gpg: no valid OpenPGP data found")
|
||||||
}
|
}
|
||||||
|
|
||||||
// TestGPGDecryptErrorWithoutGPGStderr checks that when gpg fails without
|
|
||||||
// writing to stderr, the error ends with the exit status and nothing after it.
|
|
||||||
//
|
|
||||||
//nolint:paralleltest // installFakeGPG uses t.Setenv
|
|
||||||
func TestGPGDecryptErrorWithoutGPGStderr(t *testing.T) {
|
|
||||||
installFakeGPG(t)
|
|
||||||
|
|
||||||
_, err := secret.GPGDecryptFunc([]byte("not an OpenPGP message"))
|
|
||||||
require.EqualError(t, err, "GPG decryption failed: exit status 1")
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user