mirror of
https://github.com/rclone/rclone
synced 2024-12-25 17:03:45 +01:00
encoder: add option to encode . and .. names
This commit is contained in:
parent
6c0a749a42
commit
d5cd026547
@ -92,8 +92,22 @@ func (mask MultiEncoder) Encode(in string) string {
|
||||
encodeRightSpace = uint(mask)&EncodeRightSpace != 0
|
||||
encodeRightPeriod = uint(mask)&EncodeRightPeriod != 0
|
||||
encodeInvalidUnicode = uint(mask)&EncodeInvalidUtf8 != 0
|
||||
encodeDot = uint(mask)&EncodeDot != 0
|
||||
)
|
||||
|
||||
if encodeDot {
|
||||
switch in {
|
||||
case ".":
|
||||
return "."
|
||||
case "..":
|
||||
return ".."
|
||||
case ".":
|
||||
return string(QuoteRune) + "."
|
||||
case "..":
|
||||
return string(QuoteRune) + "." + string(QuoteRune) + "."
|
||||
}
|
||||
}
|
||||
|
||||
// handle prefix only replacements
|
||||
prefix := ""
|
||||
if encodeLeftSpace && len(in) > 0 { // Leading SPACE
|
||||
@ -299,8 +313,22 @@ func (mask MultiEncoder) Decode(in string) string {
|
||||
encodeRightSpace = uint(mask)&EncodeRightSpace != 0
|
||||
encodeRightPeriod = uint(mask)&EncodeRightPeriod != 0
|
||||
encodeInvalidUnicode = uint(mask)&EncodeInvalidUtf8 != 0
|
||||
encodeDot = uint(mask)&EncodeDot != 0
|
||||
)
|
||||
|
||||
if encodeDot {
|
||||
switch in {
|
||||
case ".":
|
||||
return "."
|
||||
case "..":
|
||||
return ".."
|
||||
case string(QuoteRune) + ".":
|
||||
return "."
|
||||
case string(QuoteRune) + "." + string(QuoteRune) + ".":
|
||||
return ".."
|
||||
}
|
||||
}
|
||||
|
||||
// handle prefix only replacements
|
||||
prefix := ""
|
||||
if r, l1 := utf8.DecodeRuneInString(in); encodeLeftSpace && r == '␠' { // SYMBOL FOR SPACE
|
||||
|
@ -102,6 +102,49 @@ func TestEncodeInvalidUnicode(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestEncodeDot(t *testing.T) {
|
||||
for i, tc := range []testCase{
|
||||
{
|
||||
mask: 0,
|
||||
in: ".",
|
||||
out: ".",
|
||||
}, {
|
||||
mask: EncodeDot,
|
||||
in: ".",
|
||||
out: ".",
|
||||
}, {
|
||||
mask: 0,
|
||||
in: "..",
|
||||
out: "..",
|
||||
}, {
|
||||
mask: EncodeDot,
|
||||
in: "..",
|
||||
out: "..",
|
||||
}, {
|
||||
mask: EncodeDot,
|
||||
in: "...",
|
||||
out: "...",
|
||||
}, {
|
||||
mask: EncodeDot,
|
||||
in: ". .",
|
||||
out: ". .",
|
||||
},
|
||||
} {
|
||||
e := MultiEncoder(tc.mask)
|
||||
t.Run(strconv.FormatInt(int64(i), 10), func(t *testing.T) {
|
||||
got := e.Encode(tc.in)
|
||||
if got != tc.out {
|
||||
t.Errorf("Encode(%q) want %q got %q", tc.in, tc.out, got)
|
||||
}
|
||||
got2 := e.Decode(got)
|
||||
if got2 != tc.in {
|
||||
t.Errorf("Decode(%q) want %q got %q", got, tc.in, got2)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestDecodeHalf(t *testing.T) {
|
||||
for i, tc := range []testCase{
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user