Use rune count to count properly multi-byte UTF-8 characters

Signed-off-by: MrJack <36191829+biagiopietro@users.noreply.github.com>
MrJack 5 months ago
parent 9fee687b40
commit ff54bb328f

@ -21,6 +21,7 @@ import (
"errors"
"fmt"
"time"
"unicode/utf8"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -120,8 +121,8 @@ func (r *Rollback) prepareRollback(name string) (*release.Release, *release.Rele
return nil, nil, false, errInvalidRevision
}
if len(r.Description) > MaxDescriptionLength {
return nil, nil, false, fmt.Errorf("description must be %d characters or less, got %d", MaxDescriptionLength, len(r.Description))
if utf8.RuneCountInString(r.Description) > MaxDescriptionLength {
return nil, nil, false, fmt.Errorf("description must be %d characters or less, got %d", MaxDescriptionLength, utf8.RuneCountInString(r.Description))
}
currentReleasei, err := r.cfg.Releases.Last(name)

@ -276,3 +276,39 @@ func TestRollback_DescriptionAtMaxLength(t *testing.T) {
is.Equal(strings.Repeat("a", MaxDescriptionLength), newRelease.Info.Description)
}
func TestRollback_DescriptionMultiByteCharacters(t *testing.T) {
is := assert.New(t)
req := require.New(t)
rollAction := rollbackAction(t)
rel1 := releaseStub()
rel1.Name = "test-release-desc-utf8"
rel1.Version = 1
rel1.Info.Status = common.StatusSuperseded
rel1.ApplyMethod = "csa"
req.NoError(rollAction.cfg.Releases.Create(rel1))
rel2 := releaseStub()
rel2.Name = "test-release-desc-utf8"
rel2.Version = 2
rel2.Info.Status = common.StatusDeployed
rel2.ApplyMethod = "csa"
req.NoError(rollAction.cfg.Releases.Create(rel2))
// "é" is 2 bytes in UTF-8 but 1 rune
rollAction.Description = strings.Repeat("é", MaxDescriptionLength)
rollAction.Version = 1
rollAction.ServerSideApply = "false"
err := rollAction.Run("test-release-desc-utf8")
req.NoError(err)
newReleasei, err := rollAction.cfg.Releases.Get("test-release-desc-utf8", 3)
req.NoError(err)
newRelease, err := releaserToV1Release(newReleasei)
req.NoError(err)
is.Equal(strings.Repeat("é", MaxDescriptionLength), newRelease.Info.Description)
}

@ -21,6 +21,7 @@ import (
"io"
"strconv"
"time"
"unicode/utf8"
"github.com/spf13/cobra"
@ -67,8 +68,8 @@ func newRollbackCmd(cfg *action.Configuration, out io.Writer) *cobra.Command {
}
// Validate description length
if len(client.Description) > action.MaxDescriptionLength {
return fmt.Errorf("description must be %d characters or less, got %d", action.MaxDescriptionLength, len(client.Description))
if utf8.RuneCountInString(client.Description) > action.MaxDescriptionLength {
return fmt.Errorf("description must be %d characters or less, got %d", action.MaxDescriptionLength, utf8.RuneCountInString(client.Description))
}
dryRunStrategy, err := cmdGetDryRunFlagStrategy(cmd, false)

Loading…
Cancel
Save