diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 928418b..63d8ae9 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -1,8 +1,18 @@ name: Go on: push: - branches: [master] + branches: [ main ] + paths: + - '**.go' + - 'go.mod' + - '.golangci.yml' + - '.github/workflows/go.yml' pull_request: + paths: + - '**.go' + - 'go.mod' + - '.golangci.yml' + - '.github/workflows/go.yml' env: GOPROXY: "https://proxy.golang.org" @@ -11,39 +21,39 @@ jobs: name: Lint runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - name: Init Go modules - run: go mod init gopkg.in/ini.v1 + - name: Checkout code + uses: actions/checkout@v2 + - name: Init Go Modules + run: | + go mod init gopkg.in/ini.v1 + go mod tidy - name: Run golangci-lint - uses: actions-contrib/golangci-lint@v1 + uses: golangci/golangci-lint-action@v2 + with: + version: latest + args: --timeout=30m test: name: Test strategy: matrix: - go-version: [1.13.x, 1.14.x, 1.15.x] - platform: [ubuntu-latest, macos-latest, windows-latest] + go-version: [ 1.15.x, 1.16.x, 1.17.x ] + platform: [ ubuntu-latest, macos-latest, windows-latest ] runs-on: ${{ matrix.platform }} steps: - name: Install Go - uses: actions/setup-go@v1 + uses: actions/setup-go@v2 with: go-version: ${{ matrix.go-version }} - name: Checkout code uses: actions/checkout@v2 - - name: Run unit tests + - name: Run tests with coverage run: | go mod init gopkg.in/ini.v1 + go mod tidy go test -v -race -coverprofile=coverage -covermode=atomic ./... - name: Upload coverage report to Codecov - uses: codecov/codecov-action@v1.0.6 + uses: codecov/codecov-action@v1.5.0 with: file: ./coverage flags: unittests - - name: Cache downloaded modules - uses: actions/cache@v1 - with: - path: ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- diff --git a/.github/workflows/lsif.yml b/.github/workflows/lsif.yml index dd4d948..49cefe8 100644 --- a/.github/workflows/lsif.yml +++ b/.github/workflows/lsif.yml @@ -1,17 +1,28 @@ name: LSIF -on: [push] +on: + push: + paths: + - '**.go' + - 'go.mod' + - '.github/workflows/lsif.yml' +env: + GOPROXY: "https://proxy.golang.org" + jobs: - build: + lsif-go: + if: github.repository == 'go-ini/ini' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - name: Generate LSIF data uses: sourcegraph/lsif-go-action@master + - name: Upload LSIF data to sourcegraph.com + continue-on-error: true + uses: docker://sourcegraph/src-cli:latest with: - verbose: 'true' - - name: Upload LSIF data - uses: sourcegraph/lsif-upload-action@master + args: lsif upload -github-token=${{ secrets.GITHUB_TOKEN }} + - name: Upload LSIF data to sourcegraph.unknwon.cn continue-on-error: true + uses: docker://sourcegraph/src-cli:latest with: - endpoint: https://sourcegraph.com - github_token: ${{ secrets.GITHUB_TOKEN }} + args: -endpoint=https://sourcegraph.unknwon.cn lsif upload -github-token=${{ secrets.GITHUB_TOKEN }} diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 0000000..b7256ba --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,21 @@ +linters-settings: + nakedret: + max-func-lines: 0 # Disallow any unnamed return statement + +linters: + enable: + - deadcode + - errcheck + - gosimple + - govet + - ineffassign + - staticcheck + - structcheck + - typecheck + - unused + - varcheck + - nakedret + - gofmt + - rowserrcheck + - unconvert + - goimports diff --git a/codecov.yml b/codecov.yml index fc947f2..31f646e 100644 --- a/codecov.yml +++ b/codecov.yml @@ -6,4 +6,4 @@ coverage: threshold: 1% comment: - layout: 'diff, files' + layout: 'diff' diff --git a/key.go b/key.go index 8baafd9..83a7f86 100644 --- a/key.go +++ b/key.go @@ -781,10 +781,8 @@ func (k *Key) parseUint64s(strs []string, addInvalid, returnOnInvalid bool) ([]u return vals, err } - type Parser func(str string) (interface{}, error) - // parseTimesFormat transforms strings to times in given format. func (k *Key) parseTimesFormat(format string, strs []string, addInvalid, returnOnInvalid bool) ([]time.Time, error) { vals := make([]time.Time, 0, len(strs)) @@ -801,7 +799,6 @@ func (k *Key) parseTimesFormat(format string, strs []string, addInvalid, returnO return vals, err } - // doParse transforms strings to different types func (k *Key) doParse(strs []string, addInvalid, returnOnInvalid bool, parser Parser) ([]interface{}, error) { vals := make([]interface{}, 0, len(strs)) diff --git a/parser.go b/parser.go index 6514716..b8b5aa8 100644 --- a/parser.go +++ b/parser.go @@ -131,7 +131,7 @@ func readKeyName(delimiters string, in []byte) (string, int, error) { // Check if key name surrounded by quotes. var keyQuote string if line[0] == '"' { - if len(line) > 6 && string(line[0:3]) == `"""` { + if len(line) > 6 && line[0:3] == `"""` { keyQuote = `"""` } else { keyQuote = `"` @@ -232,7 +232,7 @@ func (p *parser) readValue(in []byte, bufferSize int) (string, error) { } var valQuote string - if len(line) > 3 && string(line[0:3]) == `"""` { + if len(line) > 3 && line[0:3] == `"""` { valQuote = `"""` } else if line[0] == '`' { valQuote = "`" @@ -289,12 +289,8 @@ func (p *parser) readValue(in []byte, bufferSize int) (string, error) { hasSurroundedQuote(line, '"')) && !p.options.PreserveSurroundedQuote { line = line[1 : len(line)-1] } else if len(valQuote) == 0 && p.options.UnescapeValueCommentSymbols { - if strings.Contains(line, `\;`) { - line = strings.Replace(line, `\;`, ";", -1) - } - if strings.Contains(line, `\#`) { - line = strings.Replace(line, `\#`, "#", -1) - } + line = strings.ReplaceAll(line, `\;`, ";") + line = strings.ReplaceAll(line, `\#`, "#") } else if p.options.AllowPythonMultilineValues && lastChar == '\n' { return p.readPythonMultilines(line, bufferSize) }