diff --git a/.golangci.yaml b/.golangci.yaml index 0bd3d29..b3d9be3 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -1,9 +1,5 @@ linters: enable: - gofmt - - # I'd really want to use Revive for this but that doesn't work: - # https://github.com/golangci/golangci-lint/issues/3653 - - unparam - + - revive - usestdlibvars diff --git a/m/ansiTokenizer_test.go b/m/ansiTokenizer_test.go index 0e264fa..ef08e4b 100644 --- a/m/ansiTokenizer_test.go +++ b/m/ansiTokenizer_test.go @@ -41,6 +41,7 @@ func TestTokenize(t *testing.T) { }() myReader := NewReaderFromStream(fileName, file) + //revive:disable-next-line:empty-block for !myReader.done.Load() { } diff --git a/m/highlight.go b/m/highlight.go index ec0f8f2..43fad85 100644 --- a/m/highlight.go +++ b/m/highlight.go @@ -12,6 +12,8 @@ import ( ) // Files larger than this won't be highlighted +// +//revive:disable-next-line:var-naming const MAX_HIGHLIGHT_SIZE int64 = 1024 * 1024 // Read and highlight a file using Chroma: https://github.com/alecthomas/chroma diff --git a/m/linewrapper.go b/m/linewrapper.go index e28b6a2..9540fd3 100644 --- a/m/linewrapper.go +++ b/m/linewrapper.go @@ -8,6 +8,8 @@ import ( ) // From: https://www.compart.com/en/unicode/U+00A0 +// +//revive:disable-next-line:var-naming const NO_BREAK_SPACE = '\xa0' func getWrapWidth(line []twin.Cell, maxWrapWidth int) int { diff --git a/m/pager.go b/m/pager.go index 50e0572..3799027 100644 --- a/m/pager.go +++ b/m/pager.go @@ -24,8 +24,11 @@ const ( type StatusBarOption int const ( + //revive:disable-next-line:var-naming STATUSBAR_STYLE_INVERSE StatusBarOption = iota + //revive:disable-next-line:var-naming STATUSBAR_STYLE_PLAIN + //revive:disable-next-line:var-naming STATUSBAR_STYLE_BOLD ) @@ -33,7 +36,9 @@ const ( type UnprintableStyle int const ( + //revive:disable-next-line:var-naming UNPRINTABLE_STYLE_HIGHLIGHT UnprintableStyle = iota + //revive:disable-next-line:var-naming UNPRINTABLE_STYLE_WHITESPACE ) @@ -475,7 +480,7 @@ func (p *Pager) StartPaging(screen twin.Screen, chromaStyle *chroma.Style, chrom unprintableStyle = p.UnprintableStyle consumeLessTermcapEnvs(chromaStyle, chromaFormatter) - styleUi(chromaStyle, chromaFormatter, p.StatusBarStyle) + styleUI(chromaStyle, chromaFormatter, p.StatusBarStyle) p.screen = screen p.linePrefix = getLineColorPrefix(chromaStyle, chromaFormatter) diff --git a/m/pager_test.go b/m/pager_test.go index ab493bc..b20c83e 100644 --- a/m/pager_test.go +++ b/m/pager_test.go @@ -15,6 +15,8 @@ import ( "gotest.tools/v3/assert" ) +//revive:disable:empty-block + const blueBackgroundClearToEol0 = "\x1b[44m\x1b[0K" // With 0 before the K, should clear to EOL const blueBackgroundClearToEol = "\x1b[44m\x1b[K" // No 0 before the K, should also clear to EOL diff --git a/m/reader.go b/m/reader.go index 51ef1f4..1550146 100644 --- a/m/reader.go +++ b/m/reader.go @@ -465,58 +465,58 @@ func NewReaderFromFilename(filename string, style chroma.Style, formatter chroma } // createStatusUnlocked() assumes that its caller is holding the lock -func (r *Reader) createStatusUnlocked(lastLineOneBased int) string { +func (reader *Reader) createStatusUnlocked(lastLineOneBased int) string { prefix := "" - if r.name != nil { - prefix = path.Base(*r.name) + ": " + if reader.name != nil { + prefix = path.Base(*reader.name) + ": " } - if len(r.lines) == 0 { + if len(reader.lines) == 0 { return prefix + "" } - if len(r.lines) == 1 { + if len(reader.lines) == 1 { return prefix + "1 line 100%" } - percent := int(100 * float64(lastLineOneBased) / float64(len(r.lines))) + percent := int(100 * float64(lastLineOneBased) / float64(len(reader.lines))) return fmt.Sprintf("%s%s lines %d%%", prefix, - formatNumber(uint(len(r.lines))), + formatNumber(uint(len(reader.lines))), percent) } // GetLineCount returns the number of lines available for viewing -func (r *Reader) GetLineCount() int { - r.Lock() - defer r.Unlock() +func (reader *Reader) GetLineCount() int { + reader.Lock() + defer reader.Unlock() - return len(r.lines) + return len(reader.lines) } // GetLine gets a line. If the requested line number is out of bounds, nil is returned. -func (r *Reader) GetLine(lineNumberOneBased int) *Line { - r.Lock() - defer r.Unlock() +func (reader *Reader) GetLine(lineNumberOneBased int) *Line { + reader.Lock() + defer reader.Unlock() if lineNumberOneBased < 1 { return nil } - if lineNumberOneBased > len(r.lines) { + if lineNumberOneBased > len(reader.lines) { return nil } - return r.lines[lineNumberOneBased-1] + return reader.lines[lineNumberOneBased-1] } // GetLines gets the indicated lines from the input // // Overflow state will be didFit if we returned all lines we currently have, or // didOverflow otherwise. -func (r *Reader) GetLines(firstLineOneBased int, wantedLineCount int) (*InputLines, overflowState) { - r.Lock() - defer r.Unlock() - return r.getLinesUnlocked(firstLineOneBased, wantedLineCount) +func (reader *Reader) GetLines(firstLineOneBased int, wantedLineCount int) (*InputLines, overflowState) { + reader.Lock() + defer reader.Unlock() + return reader.getLinesUnlocked(firstLineOneBased, wantedLineCount) } func nonWrappingAdd(a int, b int) int { @@ -531,16 +531,16 @@ func nonWrappingAdd(a int, b int) int { return a + b } -func (r *Reader) getLinesUnlocked(firstLineOneBased int, wantedLineCount int) (*InputLines, overflowState) { +func (reader *Reader) getLinesUnlocked(firstLineOneBased int, wantedLineCount int) (*InputLines, overflowState) { if firstLineOneBased < 1 { firstLineOneBased = 1 } - if len(r.lines) == 0 || wantedLineCount == 0 { + if len(reader.lines) == 0 || wantedLineCount == 0 { return &InputLines{ lines: nil, firstLineOneBased: firstLineOneBased, - statusText: r.createStatusUnlocked(firstLineOneBased), + statusText: reader.createStatusUnlocked(firstLineOneBased), }, didFit // Empty files always fit } @@ -548,8 +548,8 @@ func (r *Reader) getLinesUnlocked(firstLineOneBased int, wantedLineCount int) (* firstLineZeroBased := firstLineOneBased - 1 lastLineZeroBased := nonWrappingAdd(firstLineZeroBased, wantedLineCount-1) - if lastLineZeroBased >= len(r.lines) { - lastLineZeroBased = len(r.lines) - 1 + if lastLineZeroBased >= len(reader.lines) { + lastLineZeroBased = len(reader.lines) - 1 } // Prevent reading past the end of the available lines @@ -561,19 +561,19 @@ func (r *Reader) getLinesUnlocked(firstLineOneBased int, wantedLineCount int) (* firstLineOneBased = 1 } - return r.getLinesUnlocked(firstLineOneBased, wantedLineCount) + return reader.getLinesUnlocked(firstLineOneBased, wantedLineCount) } - returnLines := r.lines[firstLineZeroBased : lastLineZeroBased+1] + returnLines := reader.lines[firstLineZeroBased : lastLineZeroBased+1] overflow := didFit - if len(returnLines) != len(r.lines) { + if len(returnLines) != len(reader.lines) { overflow = didOverflow // We're not returning all available lines } return &InputLines{ lines: returnLines, firstLineOneBased: firstLineOneBased, - statusText: r.createStatusUnlocked(lastLineZeroBased + 1), + statusText: reader.createStatusUnlocked(lastLineZeroBased + 1), }, overflow } diff --git a/m/reader_test.go b/m/reader_test.go index 06345fe..2d10f3d 100644 --- a/m/reader_test.go +++ b/m/reader_test.go @@ -15,6 +15,8 @@ import ( "gotest.tools/v3/assert" ) +//revive:disable:empty-block + func testGetLineCount(t *testing.T, reader *Reader) { if strings.Contains(*reader.name, "compressed") { // We are no good at counting lines of compressed files, never mind @@ -139,8 +141,10 @@ func getTestFiles() []string { // Wait for reader to finish reading and highlighting. Used by tests. func (r *Reader) _wait() error { // Wait for our goroutine to finish + //revive:disable-next-line:empty-block for !r.done.Load() { } + //revive:disable-next-line:empty-block for !r.highlightingDone.Load() { } @@ -213,7 +217,7 @@ func testHighlightingLineCount(t *testing.T, filenameWithPath string) { } rawLinesCount := rawLinefeedsCount if !rawFileEndsWithNewline { - rawLinesCount += 1 + rawLinesCount++ } // Then load the same file using one of our Readers @@ -329,15 +333,15 @@ func TestCompressedFiles(t *testing.T) { } func TestFilterNotInstalled(t *testing.T) { - // FIXME: Test what happens if we try to use a filter that is not installed + t.Skip("FIXME: Test what happens if we try to use a filter that is not installed") } func TestFilterFailure(t *testing.T) { - // FIXME: Test what happens if the filter command fails because of bad command line options + t.Skip("FIXME: Test what happens if the filter command fails because of bad command line options") } func TestFilterPermissionDenied(t *testing.T) { - // FIXME: Test what happens if the filter command fails because it can't access the requested file + t.Skip("FIXME: Test what happens if the filter command fails because it can't access the requested file") } func TestFilterFileNotFound(t *testing.T) { @@ -357,7 +361,7 @@ func TestFilterFileNotFound(t *testing.T) { } func TestFilterNotAFile(t *testing.T) { - // FIXME: Test what happens if the filter command fails because the target is not a file + t.Skip("FIXME: Test what happens if the filter command fails because the target is not a file") } // How long does it take to read a file? @@ -376,6 +380,7 @@ func BenchmarkReaderDone(b *testing.B) { } // Wait for the reader to finish + //revive:disable-next-line:empty-block for !readMe.done.Load() { } if readMe.err != nil { @@ -390,8 +395,8 @@ func BenchmarkReadLargeFile(b *testing.B) { const largeSizeBytes = 35_000_000 // First, create it from something... - input_filename := getSamplesDir() + "/../m/pager.go" - contents, err := os.ReadFile(input_filename) + inputFilename := getSamplesDir() + "/../m/pager.go" + contents, err := os.ReadFile(inputFilename) if err != nil { panic(err) } @@ -436,8 +441,8 @@ func BenchmarkReadLargeFile(b *testing.B) { // Count lines in pager.go func BenchmarkCountLines(b *testing.B) { // First, get some sample lines... - input_filename := getSamplesDir() + "/../m/pager.go" - contents, err := os.ReadFile(input_filename) + inputFilename := getSamplesDir() + "/../m/pager.go" + contents, err := os.ReadFile(inputFilename) if err != nil { panic(err) } diff --git a/m/screenLines_test.go b/m/screenLines_test.go index 7f95533..ead4cb3 100644 --- a/m/screenLines_test.go +++ b/m/screenLines_test.go @@ -10,6 +10,8 @@ import ( "gotest.tools/v3/assert" ) +//revive:disable:empty-block + func testHorizontalCropping(t *testing.T, contents string, firstIndex int, lastIndex int, expected string, expectedOverflow overflowState) { pager := NewPager(nil) pager.ShowLineNumbers = false diff --git a/m/scrollPosition.go b/m/scrollPosition.go index 6f1bfbb..99707e1 100644 --- a/m/scrollPosition.go +++ b/m/scrollPosition.go @@ -60,23 +60,23 @@ func canonicalFromPager(pager *Pager) scrollPositionCanonical { } // Create a new position, scrolled towards the end of the file -func (s scrollPosition) PreviousLine(scrollDistance int) scrollPosition { +func (sp scrollPosition) PreviousLine(scrollDistance int) scrollPosition { return scrollPosition{ internalDontTouch: scrollPositionInternal{ - name: s.internalDontTouch.name, - lineNumberOneBased: s.internalDontTouch.lineNumberOneBased, - deltaScreenLines: s.internalDontTouch.deltaScreenLines - scrollDistance, + name: sp.internalDontTouch.name, + lineNumberOneBased: sp.internalDontTouch.lineNumberOneBased, + deltaScreenLines: sp.internalDontTouch.deltaScreenLines - scrollDistance, }, } } // Create a new position, scrolled towards the end of the file -func (s scrollPosition) NextLine(scrollDistance int) scrollPosition { +func (sp scrollPosition) NextLine(scrollDistance int) scrollPosition { return scrollPosition{ internalDontTouch: scrollPositionInternal{ - name: s.internalDontTouch.name, - lineNumberOneBased: s.internalDontTouch.lineNumberOneBased, - deltaScreenLines: s.internalDontTouch.deltaScreenLines + scrollDistance, + name: sp.internalDontTouch.name, + lineNumberOneBased: sp.internalDontTouch.lineNumberOneBased, + deltaScreenLines: sp.internalDontTouch.deltaScreenLines + scrollDistance, }, } } @@ -168,7 +168,7 @@ func (si *scrollPositionInternal) emptyBottomLinesCount(pager *Pager) int { } // Move to the next line - lineNumberOneBased += 1 + lineNumberOneBased++ } return unclaimedViewportLines diff --git a/m/search.go b/m/search.go index 9ba4fe9..6b3ae09 100644 --- a/m/search.go +++ b/m/search.go @@ -70,9 +70,9 @@ func (p *Pager) findFirstHit(startPosition scrollPosition, backwards bool) *scro } if backwards { - searchPosition -= 1 + searchPosition-- } else { - searchPosition += 1 + searchPosition++ } } } diff --git a/m/styledStringSplitter.go b/m/styledStringSplitter.go index 75af102..9c13ff6 100644 --- a/m/styledStringSplitter.go +++ b/m/styledStringSplitter.go @@ -138,7 +138,7 @@ func (s *styledStringSplitter) consumeControlSequence(charAfterEsc rune) error { if charAfterEsc == ']' && s.input[startIndex:s.nextByteIndex] == "8;;" { // Special case, here comes the URL - return s.handleUrl() + return s.handleURL() } continue @@ -196,9 +196,9 @@ func (s *styledStringSplitter) handleOsc(sequence string) error { if endMarker == esc { if s.nextChar() == '\\' { return nil - } else { - return fmt.Errorf("Expected ESC \\ after ESC]133;X, got %q", s.lastChar()) } + + return fmt.Errorf("Expected ESC \\ after ESC]133;X, got %q", s.lastChar()) } } @@ -206,7 +206,7 @@ func (s *styledStringSplitter) handleOsc(sequence string) error { } // We just got ESC]8; and should now read the URL. URLs end with ASCII 7 BEL or ESC \. -func (s *styledStringSplitter) handleUrl() error { +func (s *styledStringSplitter) handleURL() error { // Valid URL characters. // Ref: https://stackoverflow.com/a/1547940/473672 const validChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@!$&'()*+,;=" diff --git a/m/styling.go b/m/styling.go index 33776e8..7723929 100644 --- a/m/styling.go +++ b/m/styling.go @@ -11,7 +11,7 @@ import ( ) // From LESS_TERMCAP_so, overrides statusbarStyle from the Chroma style if set -var standoutStyle *twin.Style = nil +var standoutStyle *twin.Style var manPageBold = twin.StyleDefault.WithAttr(twin.AttrBold) var manPageUnderline = twin.StyleDefault.WithAttr(twin.AttrUnderline) @@ -75,7 +75,7 @@ func consumeLessTermcapEnvs(chromaStyle *chroma.Style, chromaFormatter *chroma.F } } -func styleUi(chromaStyle *chroma.Style, chromaFormatter *chroma.Formatter, statusbarOption StatusBarOption) { +func styleUI(chromaStyle *chroma.Style, chromaFormatter *chroma.Formatter, statusbarOption StatusBarOption) { if chromaStyle == nil || chromaFormatter == nil { return }