Skip to content

Commit

Permalink
Escape using json package. Add tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
leaanthony committed Jul 29, 2024
1 parent 80808e6 commit 6ca8c4f
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 7 deletions.
22 changes: 15 additions & 7 deletions v2/pkg/git/git.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package git
import (
"encoding/json"
"fmt"
"html/template"
"runtime"
"strings"

Expand Down Expand Up @@ -37,17 +36,26 @@ func Name() (string, error) {
if err != nil {
return "", fmt.Errorf(errMsg, err)
}
name := strings.TrimSpace(stdout)
return EscapeName(name)
}

name := template.JSEscapeString(strings.TrimSpace(stdout))
func EscapeName(str string) (string, error) {
b, err := json.Marshal(str)
if err != nil {
return "", err
}
// Remove the surrounding quotes
escaped := string(b[1 : len(b)-1])

// Check if username is JSON compliant
var js json.RawMessage
jsonVal := fmt.Sprintf(`{"name": "%s"}`, name)
if json.Unmarshal([]byte(jsonVal), &js) != nil {
return "", fmt.Errorf(errMsg, err)
jsonVal := fmt.Sprintf(`{"name": "%s"}`, escaped)
err = json.Unmarshal([]byte(jsonVal), &js)
if err != nil {
return "", fmt.Errorf("failed to retrieve git user name: %w", err)
}

return name, err
return escaped, nil
}

func InitRepo(projectDir string) error {
Expand Down
49 changes: 49 additions & 0 deletions v2/pkg/git/git_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package git

import (
"encoding/json"
"fmt"
"testing"
)

func TestEscapeName1(t *testing.T) {
type args struct {
str string
}
tests := []struct {
name string
args args
want string
wantErr bool
}{
{
name: "Escape Apostrophe",
args: args{
str: `John O'Keefe`,
},
want: `John O'Keefe`,
},
{
name: "Escape backslash",
args: args{
str: `MYDOMAIN\USER`,
},
want: `MYDOMAIN\\USER`,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := EscapeName(tt.args.str)
var js json.RawMessage
jsonVal := fmt.Sprintf(`{"name": "%s"}`, got)
err = json.Unmarshal([]byte(jsonVal), &js)
if (err != nil) != tt.wantErr {
t.Errorf("EscapeName() error = %v, wantErr %v", err, tt.wantErr)
return
}
if got != tt.want {
t.Errorf("EscapeName() got = %v, want %v", got, tt.want)
}
})
}
}

0 comments on commit 6ca8c4f

Please sign in to comment.