sync: make --suffix-keep-extension preserve 2 part extensions like .tar.gz

If a file has two (or more) extensions and the second (or subsequent)
extension is recognised as a valid mime type, then the suffix will go
before that extension. So `file.tar.gz` would be backed up to
`file-2019-01-01.tar.gz` whereas `file.badextension.gz` would be
backed up to `file.badextension-2019-01-01.gz`

Fixes #6892
This commit is contained in:
Nick Craig-Wood 2023-03-26 16:55:03 +01:00
parent 01fa15a7d9
commit 8fb9eb2fee
3 changed files with 30 additions and 4 deletions

View File

@ -1840,6 +1840,12 @@ would be backed up to `file.txt-2019-01-01` and with the flag it would
be backed up to `file-2019-01-01.txt`. This can be helpful to make be backed up to `file-2019-01-01.txt`. This can be helpful to make
sure the suffixed files can still be opened. sure the suffixed files can still be opened.
If a file has two (or more) extensions and the second (or subsequent)
extension is recognised as a valid mime type, then the suffix will go
before that extension. So `file.tar.gz` would be backed up to
`file-2019-01-01.tar.gz` whereas `file.badextension.gz` would be
backed up to `file.badextension-2019-01-01.gz`.
### --syslog ### ### --syslog ###
On capable OSes (not Windows or Plan9) send all log output to syslog. On capable OSes (not Windows or Plan9) send all log output to syslog.

View File

@ -618,9 +618,24 @@ func SuffixName(ctx context.Context, remote string) string {
return remote return remote
} }
if ci.SuffixKeepExtension { if ci.SuffixKeepExtension {
ext := path.Ext(remote) var (
base := remote[:len(remote)-len(ext)] base = remote
return base + ci.Suffix + ext exts = ""
first = true
ext = path.Ext(remote)
)
for ext != "" {
// Look second and subsequent extensions in mime types.
// If they aren't found then don't keep it as an extension.
if !first && mime.TypeByExtension(ext) == "" {
break
}
base = base[:len(base)-len(ext)]
exts = ext + exts
first = false
ext = path.Ext(base)
}
return base + ci.Suffix + exts
} }
return remote + ci.Suffix return remote + ci.Suffix
} }

View File

@ -371,9 +371,14 @@ func TestSuffixName(t *testing.T) {
{"test.txt", "-suffix", false, "test.txt-suffix"}, {"test.txt", "-suffix", false, "test.txt-suffix"},
{"test.txt", "-suffix", true, "test-suffix.txt"}, {"test.txt", "-suffix", true, "test-suffix.txt"},
{"test.txt.csv", "-suffix", false, "test.txt.csv-suffix"}, {"test.txt.csv", "-suffix", false, "test.txt.csv-suffix"},
{"test.txt.csv", "-suffix", true, "test.txt-suffix.csv"}, {"test.txt.csv", "-suffix", true, "test-suffix.txt.csv"},
{"test", "-suffix", false, "test-suffix"}, {"test", "-suffix", false, "test-suffix"},
{"test", "-suffix", true, "test-suffix"}, {"test", "-suffix", true, "test-suffix"},
{"test.html", "-suffix", true, "test-suffix.html"},
{"test.html.txt", "-suffix", true, "test-suffix.html.txt"},
{"test.csv.html.txt", "-suffix", true, "test-suffix.csv.html.txt"},
{"test.badext.csv.html.txt", "-suffix", true, "test.badext-suffix.csv.html.txt"},
{"test.badext", "-suffix", true, "test-suffix.badext"},
} { } {
ci.Suffix = test.suffix ci.Suffix = test.suffix
ci.SuffixKeepExtension = test.keepExt ci.SuffixKeepExtension = test.keepExt