Skip to content

Commit 8cdfc8d

Browse files
authored
chore(lint): Increasing lint difficulty level (#370)
Adding lots of linters
1 parent d2726de commit 8cdfc8d

27 files changed

+1792
-1349
lines changed

.github/workflows/build.yml

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ on:
66
push:
77
branches:
88
- main
9-
- chore/lint-*
9+
- chore/lint*
1010
pull_request:
1111

1212
permissions:
@@ -26,7 +26,7 @@ jobs:
2626

2727
strategy:
2828
matrix:
29-
go: [ '1.22', '1.21', '1.20' ]
29+
go: [ '1.22', '1.21' ]
3030
include:
3131
- go: '1.22'
3232
lint: true
@@ -54,11 +54,7 @@ jobs:
5454
run: go build -v ./...
5555

5656
- name: Test
57-
# We need GCC because of the "go test -race"
58-
# env:
59-
# CGO_ENABLED: 0
6057
run: |
61-
apt-get update && apt-get install gcc -y
6258
go test -parallel 20 -v -race -coverprofile=coverage.txt -covermode=atomic ./...
6359
bash <(curl -s https://codecov.io/bash)
6460

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ ftpserver
33
.idea
44
.vscode
55
debug
6-
__debug_bin
6+
__debug_bin*
77
*.toml

.golangci.yml

Lines changed: 75 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -160,61 +160,128 @@ linters-settings:
160160
linters:
161161
disable-all: true
162162
enable:
163+
# https://golangci-lint.run/usage/linters/
163164
- asciicheck
165+
- asasalint
166+
- bidichk
164167
- bodyclose
165168
# - deadcode -> unused
169+
- containedctx
170+
# - contextcheck -> creates an odd error here: https://github.com/fclairamb/ftpserverlib/blob/4d7c663e9e0b2650673fc2e0fcdb443895f2a1b9/server.go#L234
171+
# - copyloopvar -> unknown in v1.56.2 ???
172+
# - cyclop -> Delaying it for now (too much work)
173+
- decorder
166174
- depguard
167175
- dogsled
168176
- dupl
177+
- dupword
178+
- durationcheck
169179
- errcheck
170180
- exhaustive
181+
- errchkjson
182+
- errname
183+
- errorlint
184+
- execinquery
185+
- exhaustive
186+
# - exhaustruct --> Not convinced it's useful
171187
# - exhaustivestruct
172188
- exportloopref
173189
- funlen
174-
# - gci
190+
- forbidigo
191+
- forcetypeassert
192+
- gci
193+
- ginkgolinter
175194
- gochecknoinits
176-
# - gochecknoglobals
195+
- gochecksumtype
196+
- gochecknoglobals
177197
- gocognit
178198
- goconst
179199
- gocritic
180200
- gocyclo
201+
# - godot --> lots of not so useful changes
181202
- godox
182203
- goerr113
183204
- gofmt
205+
# - gofumpt -> conflicts with wsl
184206
- goimports
207+
- gosimple
185208
# - golint --> revive
186209
- revive
187-
# - gomnd
210+
# - gomnd --> too much work
211+
# - gomoddirectives
212+
# - gomodguard
188213
- goprintffuncname
189214
- gosec
215+
- gosmopolitan
190216
- gosimple
191217
- govet
218+
- grouper
192219
- ineffassign
220+
- importas
221+
- inamedparam
222+
# - intrange --> upcoming
223+
# - interfacebloat
193224
# - interfacer --> (deprecated)
225+
# - ireturn --> I can't even see how to fix those like ClientHandler::getFileHandle
194226
- lll
227+
- loggercheck
228+
- maintidx
229+
- makezero
230+
- mirror
195231
# - maligned --> govet:fieldalignment
196232
- megacheck
197233
- misspell
234+
- musttag
198235
- nakedret
199236
# - nestif
200237
- nlreturn
201238
- prealloc
239+
- nestif
202240
- nilerr
241+
- nilnil
203242
- nolintlint
243+
- nlreturn
204244
- rowserrcheck
245+
- noctx
246+
- nonamedreturns
205247
# - scopelint --> exportloopref
248+
- nosprintfhostport
206249
- exportloopref
207250
- staticcheck
208251
# - structcheck -> unused
209252
- stylecheck
253+
# - paralleltest -> buggy, doesn't work with subtests
210254
- typecheck
255+
- perfsprint
256+
- prealloc
257+
- predeclared
258+
- reassign
259+
- promlinter
260+
- protogetter
261+
- rowserrcheck
262+
- sloglint
263+
- spancheck
264+
- sqlclosecheck
265+
- stylecheck
266+
- tagalign
267+
- tagliatelle
268+
- tenv
269+
- testableexamples
270+
- testifylint
271+
# - testpackage -> too late for that
272+
- thelper
273+
- tparallel
211274
- unconvert
212275
- unparam
213276
- unused
277+
- usestdlibvars
278+
- varnamelen
279+
- wastedassign
214280
# - varcheck -> unused
215281
- whitespace
216-
# - wrapcheck
282+
# - wrapcheck -> too much effort for now
217283
- wsl
284+
# - zerologlint -> Will most probably never use it
218285
fast: false
219286

220287
issues:
@@ -224,3 +291,7 @@ issues:
224291
# Default value for this option is true.
225292
exclude-use-default: false
226293

294+
exclude-rules:
295+
- path: _test\.go
296+
linters:
297+
- gochecknoglobals

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ If you're interested in a fully featured FTP server, you should use [sftpgo](htt
4747
The easiest way to test this library is to use [ftpserver](https://github.com/fclairamb/ftpserver).
4848

4949
## The driver
50-
The simplest way to get a good understanding of how the driver shall be implemented, you can have a look at the [tests driver](https://github.com/fclairamb/ftpserverlib/blob/master/driver_test.go).
50+
The simplest way to get a good understanding of how the driver shall be implemented is to look at the [tests driver](https://github.com/fclairamb/ftpserverlib/blob/master/driver_test.go).
5151

5252
### The base API
5353

asciiconverter.go

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ type convertMode int8
1010
const (
1111
convertModeToCRLF convertMode = iota
1212
convertModeToLF
13+
14+
bufferSize = 4096
1315
)
1416

1517
type asciiConverter struct {
@@ -19,7 +21,7 @@ type asciiConverter struct {
1921
}
2022

2123
func newASCIIConverter(r io.Reader, mode convertMode) *asciiConverter {
22-
reader := bufio.NewReaderSize(r, 4096)
24+
reader := bufio.NewReaderSize(r, bufferSize)
2325

2426
return &asciiConverter{
2527
reader: reader,
@@ -28,30 +30,32 @@ func newASCIIConverter(r io.Reader, mode convertMode) *asciiConverter {
2830
}
2931
}
3032

31-
func (c *asciiConverter) Read(p []byte) (n int, err error) {
33+
func (c *asciiConverter) Read(bytes []byte) (int, error) {
3234
var data []byte
35+
var readBytes int
36+
var err error
3337

3438
if len(c.remaining) > 0 {
3539
data = c.remaining
3640
c.remaining = nil
3741
} else {
3842
data, _, err = c.reader.ReadLine()
3943
if err != nil {
40-
return n, err
44+
return readBytes, err
4145
}
4246
}
4347

44-
n = len(data)
45-
if n > 0 {
46-
maxSize := len(p) - 2
47-
if n > maxSize {
48-
copy(p, data[:maxSize])
48+
readBytes = len(data)
49+
if readBytes > 0 {
50+
maxSize := len(bytes) - 2
51+
if readBytes > maxSize {
52+
copy(bytes, data[:maxSize])
4953
c.remaining = data[maxSize:]
5054

5155
return maxSize, nil
5256
}
5357

54-
copy(p[:n], data[:n])
58+
copy(bytes[:readBytes], data[:readBytes])
5559
}
5660

5761
// we can have a partial read if the line is too long
@@ -64,22 +68,22 @@ func (c *asciiConverter) Read(p []byte) (n int, err error) {
6468
// client transfers it in ASCII mode
6569
err = c.reader.UnreadByte()
6670
if err != nil {
67-
return n, err
71+
return readBytes, err
6872
}
6973

7074
lastByte, err := c.reader.ReadByte()
7175

7276
if err == nil && lastByte == '\n' {
7377
switch c.mode {
7478
case convertModeToCRLF:
75-
p[n] = '\r'
76-
p[n+1] = '\n'
77-
n += 2
79+
bytes[readBytes] = '\r'
80+
bytes[readBytes+1] = '\n'
81+
readBytes += 2
7882
case convertModeToLF:
79-
p[n] = '\n'
80-
n++
83+
bytes[readBytes] = '\n'
84+
readBytes++
8185
}
8286
}
8387

84-
return n, err
88+
return readBytes, err //nolint:wrapcheck // here wrapping errors brings nothing
8589
}

asciiconverter_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@ func TestASCIIConvert(t *testing.T) {
1212
lines := []byte("line1\r\nline2\r\n\r\nline4")
1313
src := bytes.NewBuffer(lines)
1414
dst := bytes.NewBuffer(nil)
15-
c := newASCIIConverter(src, convertModeToLF)
16-
_, err := io.Copy(dst, c)
15+
converter := newASCIIConverter(src, convertModeToLF)
16+
_, err := io.Copy(dst, converter)
1717
require.NoError(t, err)
1818
require.Equal(t, []byte("line1\nline2\n\nline4"), dst.Bytes())
1919

2020
lines = []byte("line1\nline2\n\nline4")
2121
dst = bytes.NewBuffer(nil)
22-
c = newASCIIConverter(bytes.NewBuffer(lines), convertModeToCRLF)
23-
_, err = io.Copy(dst, c)
22+
converter = newASCIIConverter(bytes.NewBuffer(lines), convertModeToCRLF)
23+
_, err = io.Copy(dst, converter)
2424
require.NoError(t, err)
2525
require.Equal(t, []byte("line1\r\nline2\r\n\r\nline4"), dst.Bytes())
2626

@@ -31,8 +31,8 @@ func TestASCIIConvert(t *testing.T) {
3131
}
3232

3333
dst = bytes.NewBuffer(nil)
34-
c = newASCIIConverter(bytes.NewBuffer(buf), convertModeToCRLF)
35-
_, err = io.Copy(dst, c)
34+
converter = newASCIIConverter(bytes.NewBuffer(buf), convertModeToCRLF)
35+
_, err = io.Copy(dst, converter)
3636
require.NoError(t, err)
3737
require.Equal(t, buf, dst.Bytes())
3838
}

0 commit comments

Comments
 (0)