Skip to content

Commit 9ff758c

Browse files
committed
fix(serverHandler): treat dot symbol prior in filename sorting
1 parent 8e5b43c commit 9ff758c

File tree

6 files changed

+49
-11
lines changed

6 files changed

+49
-11
lines changed

src/serverHandler/sort.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func (sInfos sortableFileInfos) Less(i, j int) bool {
3131
return prevIsDir
3232
}
3333

34-
return util.CompareNumInStr(sInfos.names[i], sInfos.names[j])
34+
return util.CompareNumInFilename(sInfos.names[i], sInfos.names[j])
3535
}
3636

3737
func (sInfos sortableFileInfos) Swap(i, j int) {

src/util/compareNumInStr.go renamed to src/util/compareNumInFilename.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func extractPrefixDigits(input []byte) []byte {
3535
return buf[:prefixLen]
3636
}
3737

38-
func CompareNumInStr(prev, next []byte) bool {
38+
func CompareNumInFilename(prev, next []byte) bool {
3939
if len(prev) == 0 {
4040
return true
4141
} else if len(next) == 0 {
@@ -64,13 +64,20 @@ func CompareNumInStr(prev, next []byte) bool {
6464
}
6565

6666
if prevDigitsLen == 0 { // prevDigitsLen and nextDigitsLen is 0
67-
return bytes.Compare(prev, next) < 0
67+
switch {
68+
case prev[0] == '.':
69+
return true
70+
case next[0] == '.':
71+
return false
72+
default:
73+
return bytes.Compare(prev, next) < 0
74+
}
6875
}
6976

7077
compareResult := bytes.Compare(prevDigits, nextDigits)
7178
if compareResult != 0 {
7279
return compareResult < 0
7380
} else {
74-
return CompareNumInStr(prev[prevDigitsLen:], next[nextDigitsLen:])
81+
return CompareNumInFilename(prev[prevDigitsLen:], next[nextDigitsLen:])
7582
}
7683
}

src/util/compareNumInStr_test.go renamed to src/util/compareNumInFilename_test.go

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,42 +2,48 @@ package util
22

33
import "testing"
44

5-
func TestCompareNumInStr(t *testing.T) {
5+
func TestCompareNumInFilename(t *testing.T) {
66
var prev, next string
77

88
prev = "2"
99
next = "3"
10-
if CompareNumInStr([]byte(prev), []byte(next)) != true {
10+
if !CompareNumInFilename([]byte(prev), []byte(next)) {
1111
t.Error(prev, next)
1212
}
1313

1414
prev = "2"
1515
next = "20"
16-
if CompareNumInStr([]byte(prev), []byte(next)) != true {
16+
if !CompareNumInFilename([]byte(prev), []byte(next)) {
1717
t.Error(prev, next)
1818
}
1919

2020
prev = "1.1"
2121
next = "1.10"
22-
if CompareNumInStr([]byte(prev), []byte(next)) != true {
22+
if !CompareNumInFilename([]byte(prev), []byte(next)) {
2323
t.Error(prev, next)
2424
}
2525

2626
prev = "1.2"
2727
next = "1.10"
28-
if CompareNumInStr([]byte(prev), []byte(next)) != true {
28+
if !CompareNumInFilename([]byte(prev), []byte(next)) {
2929
t.Error(prev, next)
3030
}
3131

3232
prev = "1.3.2"
3333
next = "1.3.10"
34-
if CompareNumInStr([]byte(prev), []byte(next)) != true {
34+
if !CompareNumInFilename([]byte(prev), []byte(next)) {
3535
t.Error(prev, next)
3636
}
3737

3838
prev = "name"
3939
next = "name-suffix"
40-
if CompareNumInStr([]byte(prev), []byte(next)) != true {
40+
if !CompareNumInFilename([]byte(prev), []byte(next)) {
41+
t.Error(prev, next)
42+
}
43+
44+
prev = "name.txt"
45+
next = "name-1.txt"
46+
if !CompareNumInFilename([]byte(prev), []byte(next)) {
4147
t.Error(prev, next)
4248
}
4349
}

test/case/009.sort.bash

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#!/bin/bash
2+
3+
source "$root"/lib.bash
4+
5+
"$ghfs" -l 3003 -r "$fs"/vhost1 -a :/hello-index.txt:"$fs"/vhost1/hello/index.txt &
6+
sleep 0.05 # wait server ready
7+
8+
line1=$(curl_get_body http://127.0.0.1:3003/ | grep -n './file1.txt' | cut -d ':' -f1)
9+
line2=$(curl_get_body http://127.0.0.1:3003/ | grep -n './file1-1.txt' | cut -d ':' -f1)
10+
line3=$(curl_get_body http://127.0.0.1:3003/ | grep -n './file2.txt' | cut -d ':' -f1)
11+
line4=$(curl_get_body http://127.0.0.1:3003/ | grep -n './file10.txt' | cut -d ':' -f1)
12+
line5=$(curl_get_body http://127.0.0.1:3003/ | grep -n './hello-index.txt' | cut -d ':' -f1)
13+
14+
[ -z "$line1" ] && fail 'line1 is empty'
15+
[ -z "$line2" ] && fail 'line2 is empty'
16+
[ -z "$line3" ] && fail 'line3 is empty'
17+
[ -z "$line4" ] && fail 'line4 is empty'
18+
[ -z "$line5" ] && fail 'line5 is empty'
19+
20+
[ ! "$line1" -lt "$line2" ] && fail "line1 is not before line2"
21+
[ ! "$line2" -lt "$line3" ] && fail "line2 is not before line3"
22+
[ ! "$line3" -lt "$line4" ] && fail "line3 is not before line4"
23+
[ ! "$line4" -lt "$line5" ] && fail "line4 is not before line5"
24+
25+
kill %1
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)