Skip to content

Commit

Permalink
Merge pull request #354 from dowy/issue/#309-clone-branch-with-hash-i…
Browse files Browse the repository at this point in the history
…n-name

plumbing: config, Branch name with hash can be cloned. Fixes #309
  • Loading branch information
mcuadros committed Nov 17, 2022
2 parents 71f6540 + 4efe4cb commit acd6c65
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 6 deletions.
17 changes: 11 additions & 6 deletions plumbing/format/config/encoder.go
Expand Up @@ -11,6 +11,10 @@ type Encoder struct {
w io.Writer
}

var (
subsectionReplacer = strings.NewReplacer(`"`, `\"`, `\`, `\\`)
valueReplacer = strings.NewReplacer(`"`, `\"`, `\`, `\\`, "\n", `\n`, "\t", `\t`, "\b", `\b`)
)
// NewEncoder returns a new encoder that writes to w.
func NewEncoder(w io.Writer) *Encoder {
return &Encoder{w}
Expand Down Expand Up @@ -48,8 +52,7 @@ func (e *Encoder) encodeSection(s *Section) error {
}

func (e *Encoder) encodeSubsection(sectionName string, s *Subsection) error {
//TODO: escape
if err := e.printf("[%s \"%s\"]\n", sectionName, s.Name); err != nil {
if err := e.printf("[%s \"%s\"]\n", sectionName, subsectionReplacer.Replace(s.Name)); err != nil {
return err
}

Expand All @@ -58,12 +61,14 @@ func (e *Encoder) encodeSubsection(sectionName string, s *Subsection) error {

func (e *Encoder) encodeOptions(opts Options) error {
for _, o := range opts {
pattern := "\t%s = %s\n"
if strings.Contains(o.Value, "\\") {
pattern = "\t%s = %q\n"
var value string
if strings.ContainsAny(o.Value, "#;\"\t\n\\") || strings.HasPrefix(o.Value, " ") || strings.HasSuffix(o.Value, " ") {
value = `"`+valueReplacer.Replace(o.Value)+`"`
} else {
value = o.Value
}

if err := e.printf(pattern, o.Key, o.Value); err != nil {
if err := e.printf("\t%s = %s\n", o.Key, value); err != nil {
return err
}
}
Expand Down
35 changes: 35 additions & 0 deletions plumbing/format/config/fixtures_test.go
Expand Up @@ -42,6 +42,41 @@ var fixtures = []*Fixture{
Text: "[core]\n\trepositoryformatversion = 0\n",
Config: New().AddOption("core", "", "repositoryformatversion", "0"),
},
{
Raw: `[section]
option1 = "has # hash"
option2 = "has \" quote"
option3 = "has \\ backslash"
option4 = "has ; semicolon"
option5 = "has \n line-feed"
option6 = "has \t tab"
option7 = " has leading spaces"
option8 = "has trailing spaces "
option9 = has no special characters
option10 = has unusual ` + "\x01\x7f\xc8\x80 characters\n",
Text: `[section]
option1 = "has # hash"
option2 = "has \" quote"
option3 = "has \\ backslash"
option4 = "has ; semicolon"
option5 = "has \n line-feed"
option6 = "has \t tab"
option7 = " has leading spaces"
option8 = "has trailing spaces "
option9 = has no special characters
option10 = has unusual ` + "\x01\x7f\xc8\x80 characters\n",
Config: New().
AddOption("section", "", "option1", `has # hash`).
AddOption("section", "", "option2", `has " quote`).
AddOption("section", "", "option3", `has \ backslash`).
AddOption("section", "", "option4", `has ; semicolon`).
AddOption("section", "", "option5", "has \n line-feed").
AddOption("section", "", "option6", "has \t tab").
AddOption("section", "", "option7", ` has leading spaces`).
AddOption("section", "", "option8", `has trailing spaces `).
AddOption("section", "", "option9", `has no special characters`).
AddOption("section", "", "option10", "has unusual \x01\x7f\u0200 characters"),
},
{
Raw: `
[sect1]
Expand Down

0 comments on commit acd6c65

Please sign in to comment.