pkgsrc-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[pkgsrc/trunk]: pkgsrc/pkgtools/pkglint pkgtools/pkglint: update to 5.6.6
details: https://anonhg.NetBSD.org/pkgsrc/rev/c138cf94e5b0
branches: trunk
changeset: 387034:c138cf94e5b0
user: rillig <rillig%pkgsrc.org@localhost>
date: Wed Nov 07 20:58:22 2018 +0000
description:
pkgtools/pkglint: update to 5.6.6
Changes since 5.6.5:
- Removed plist-clash since it had crashed unconditionally whenever it
was called. This means that in the last 3 years, nobody can have
used it in the originally intended way.
- Fixed interactions between the --source, --explain, --show-autofix,
--autofix and --only options.
- Fixed "defined but not used" and "used but not defined" for variables
from the pkgsrc infrastructure.
- Lots of small fixes and improvements found by the large pkglint code
review (12% done).
diffstat:
pkgtools/pkglint/Makefile | 16 +-
pkgtools/pkglint/PLIST | 3 +-
pkgtools/pkglint/files/alternatives.go | 29 +-
pkgtools/pkglint/files/alternatives_test.go | 2 +-
pkgtools/pkglint/files/autofix.go | 463 ++++++++++------
pkgtools/pkglint/files/autofix_test.go | 579 +++++++++++++++-----
pkgtools/pkglint/files/buildlink3.go | 343 ++++++-----
pkgtools/pkglint/files/buildlink3_test.go | 256 ++++++---
pkgtools/pkglint/files/category.go | 172 +++---
pkgtools/pkglint/files/category_test.go | 129 ++++-
pkgtools/pkglint/files/check_test.go | 343 +++++++----
pkgtools/pkglint/files/distinfo.go | 177 +++--
pkgtools/pkglint/files/distinfo_test.go | 174 ++++-
pkgtools/pkglint/files/expecter.go | 78 +-
pkgtools/pkglint/files/expecter_test.go | 36 +
pkgtools/pkglint/files/files.go | 74 +-
pkgtools/pkglint/files/files_test.go | 130 ++--
pkgtools/pkglint/files/fuzzer_test.go | 28 +-
pkgtools/pkglint/files/getopt/getopt.go | 128 ++--
pkgtools/pkglint/files/getopt/getopt_test.go | 87 +-
pkgtools/pkglint/files/histogram/histogram.go | 14 +-
pkgtools/pkglint/files/histogram/histogram_test.go | 28 +
pkgtools/pkglint/files/intqa/see.go | 6 +
pkgtools/pkglint/files/intqa/testnames.go | 330 +++++++++++
pkgtools/pkglint/files/licenses.go | 30 +-
pkgtools/pkglint/files/licenses/licenses.go | 80 +-
pkgtools/pkglint/files/licenses/licenses_test.go | 40 +-
pkgtools/pkglint/files/licenses_test.go | 2 +-
pkgtools/pkglint/files/line.go | 77 +-
pkgtools/pkglint/files/line_test.go | 52 +-
pkgtools/pkglint/files/linechecker.go | 3 +-
pkgtools/pkglint/files/linechecker_test.go | 10 +-
pkgtools/pkglint/files/lines.go | 33 +
pkgtools/pkglint/files/logging.go | 64 +-
pkgtools/pkglint/files/logging_test.go | 129 +--
pkgtools/pkglint/files/mkline.go | 91 ++-
pkgtools/pkglint/files/mkline_test.go | 335 +----------
pkgtools/pkglint/files/mklinechecker.go | 134 ++--
pkgtools/pkglint/files/mklinechecker_test.go | 158 +++-
pkgtools/pkglint/files/mklines.go | 143 +++-
pkgtools/pkglint/files/mklines_test.go | 311 +++++++++--
pkgtools/pkglint/files/mklines_varalign_test.go | 24 +-
pkgtools/pkglint/files/mkparser.go | 44 +-
pkgtools/pkglint/files/mkparser_test.go | 19 +-
pkgtools/pkglint/files/mkshparser.go | 1 -
pkgtools/pkglint/files/mkshtypes.go | 2 +-
pkgtools/pkglint/files/mktypes.go | 104 +++-
pkgtools/pkglint/files/mktypes_test.go | 32 +-
pkgtools/pkglint/files/options.go | 18 +-
pkgtools/pkglint/files/package.go | 288 +++-------
pkgtools/pkglint/files/package_test.go | 122 +----
pkgtools/pkglint/files/parser.go | 10 +-
pkgtools/pkglint/files/patches.go | 47 +-
pkgtools/pkglint/files/patches_test.go | 33 +-
pkgtools/pkglint/files/pkglint.go | 361 ++++++++-----
pkgtools/pkglint/files/pkglint_test.go | 185 +++++-
pkgtools/pkglint/files/pkgsrc.go | 197 ++++--
pkgtools/pkglint/files/pkgsrc_test.go | 218 ++++++-
pkgtools/pkglint/files/plist.go | 45 +-
pkgtools/pkglint/files/plist_test.go | 55 +-
pkgtools/pkglint/files/regex/regex.go | 10 +-
pkgtools/pkglint/files/shell.go | 53 +-
pkgtools/pkglint/files/shell_test.go | 212 ++++---
pkgtools/pkglint/files/shtokenizer.go | 28 +-
pkgtools/pkglint/files/shtokenizer_test.go | 6 +-
pkgtools/pkglint/files/substcontext.go | 41 +-
pkgtools/pkglint/files/substcontext_test.go | 52 +-
pkgtools/pkglint/files/testnames_test.go | 134 +----
pkgtools/pkglint/files/textproc/lexer.go | 205 +++++++
pkgtools/pkglint/files/textproc/lexer_test.go | 295 ++++++++++
pkgtools/pkglint/files/textproc/prefixreplacer.go | 47 +-
pkgtools/pkglint/files/tools.go | 13 +-
pkgtools/pkglint/files/tools_test.go | 95 +-
pkgtools/pkglint/files/toplevel.go | 12 +-
pkgtools/pkglint/files/toplevel_test.go | 6 +-
pkgtools/pkglint/files/trace/tracing.go | 57 +-
pkgtools/pkglint/files/trace/tracing_test.go | 93 ++-
pkgtools/pkglint/files/util.go | 103 ++-
pkgtools/pkglint/files/util_test.go | 50 +-
pkgtools/pkglint/files/vardefs.go | 81 +-
pkgtools/pkglint/files/vardefs_test.go | 49 +-
pkgtools/pkglint/files/vartype.go | 10 +-
pkgtools/pkglint/files/vartype_test.go | 2 +-
pkgtools/pkglint/files/vartypecheck.go | 489 +++++++++--------
pkgtools/pkglint/files/vartypecheck_test.go | 387 +++++++------
85 files changed, 5929 insertions(+), 3723 deletions(-)
diffs (truncated from 18005 to 300 lines):
diff -r f1db3071f6ba -r c138cf94e5b0 pkgtools/pkglint/Makefile
--- a/pkgtools/pkglint/Makefile Wed Nov 07 16:50:27 2018 +0000
+++ b/pkgtools/pkglint/Makefile Wed Nov 07 20:58:22 2018 +0000
@@ -1,7 +1,6 @@
-# $NetBSD: Makefile,v 1.553 2018/11/04 18:38:05 bsiegert Exp $
+# $NetBSD: Makefile,v 1.554 2018/11/07 20:58:22 rillig Exp $
-PKGNAME= pkglint-5.6.5
-PKGREVISION= 1
+PKGNAME= pkglint-5.6.6
DISTFILES= # none
CATEGORIES= pkgtools
@@ -17,7 +16,6 @@
GO_SRCPATH= netbsd.org/pkglint
CHECK_RELRO_SKIP+= bin/pkglint
-CHECK_RELRO_SKIP+= bin/plist-clash
SUBST_CLASSES+= pkglint
SUBST_STAGE.pkglint= post-configure
@@ -25,11 +23,21 @@
SUBST_SED.pkglint+= -e s\|@VERSION@\|${PKGNAME:S/pkglint-//}\|g
SUBST_SED.pkglint+= -e s\|@BMAKE@\|${MAKE:T:Q}\|g
+TOOLS_CREATE+= goyacc
+TOOLS_PATH.goyacc= ${WRKDIR}/bin/goyacc
+USE_TOOLS+= goyacc
+
do-extract:
${RUN} ${MKDIR} ${WRKDIR}/pkglint
${RUN} cd ${FILESDIR} && ${PAX} -rw . ${WRKDIR}/pkglint
+ ${RUN} ${PKGSRC_SETENV} ${MAKE_ENV} ${GO} get golang.org/x/tools/cmd/goyacc
+ ${RUN} ${PKGSRC_SETENV} ${MAKE_ENV} ${GO} install golang.org/x/tools/cmd/goyacc
+
+pre-build:
+ ${RUN} ${PKGSRC_SETENV} ${MAKE_ENV} ${GO} generate ${GO_BUILD_PATTERN}
pre-install:
+ ${RUN} rm -f ${WRKDIR}/bin/goyacc
${RUN} rm -rf ${WRKDIR}/pkg
post-install: do-install-man
diff -r f1db3071f6ba -r c138cf94e5b0 pkgtools/pkglint/PLIST
--- a/pkgtools/pkglint/PLIST Wed Nov 07 16:50:27 2018 +0000
+++ b/pkgtools/pkglint/PLIST Wed Nov 07 20:58:22 2018 +0000
@@ -1,5 +1,4 @@
-@comment $NetBSD: PLIST,v 1.6 2015/11/25 13:29:07 rillig Exp $
+@comment $NetBSD: PLIST,v 1.7 2018/11/07 20:58:22 rillig Exp $
bin/pkglint
-bin/plist-clash
man/cat1/pkglint.0
man/man1/pkglint.1
diff -r f1db3071f6ba -r c138cf94e5b0 pkgtools/pkglint/files/alternatives.go
--- a/pkgtools/pkglint/files/alternatives.go Wed Nov 07 16:50:27 2018 +0000
+++ b/pkgtools/pkglint/files/alternatives.go Wed Nov 07 20:58:22 2018 +0000
@@ -2,26 +2,31 @@
import "strings"
-func CheckfileAlternatives(filename string, plistFiles map[string]bool) {
- lines := Load(filename, NotEmpty|LogErrors)
+func CheckfileAlternatives(fileName string) {
+ lines := Load(fileName, NotEmpty|LogErrors)
if lines == nil {
return
}
- for _, line := range lines {
- if m, wrapper, space, implementation := match3(line.Text, `^(\S+)([ \t]+)(\S+)`); m {
- if plistFiles != nil {
- if plistFiles[wrapper] {
+ var plist PlistContent
+ if G.Pkg != nil {
+ plist = G.Pkg.Plist
+ }
+
+ for _, line := range lines.Lines {
+ if m, wrapper, space, alternative := match3(line.Text, `^([^\t ]+)([ \t]+)([^\t ]+)`); m {
+ if plist.Files != nil {
+ if plist.Files[wrapper] {
line.Errorf("Alternative wrapper %q must not appear in the PLIST.", wrapper)
}
- relImplementation := strings.Replace(implementation, "@PREFIX@/", "", 1)
+ relImplementation := strings.Replace(alternative, "@PREFIX@/", "", 1)
plistName := replaceAll(relImplementation, `@(\w+)@`, "${$1}")
- if !plistFiles[plistName] && !G.Pkg.vars.Defined("ALTERNATIVES_SRC") {
- if plistName != implementation {
- line.Errorf("Alternative implementation %q must appear in the PLIST as %q.", implementation, plistName)
+ if !plist.Files[plistName] && !G.Pkg.vars.Defined("ALTERNATIVES_SRC") {
+ if plistName != alternative {
+ line.Errorf("Alternative implementation %q must appear in the PLIST as %q.", alternative, plistName)
} else {
- line.Errorf("Alternative implementation %q must appear in the PLIST.", implementation)
+ line.Errorf("Alternative implementation %q must appear in the PLIST.", alternative)
}
}
}
@@ -36,7 +41,7 @@
} else {
line.Errorf("Invalid ALTERNATIVES line %q.", line.Text)
Explain(
- "Run \"" + confMake + " help topic=alternatives\" for more information.")
+ sprintf("Run %q for more information.", makeHelp("alternatives")))
}
}
}
diff -r f1db3071f6ba -r c138cf94e5b0 pkgtools/pkglint/files/alternatives_test.go
--- a/pkgtools/pkglint/files/alternatives_test.go Wed Nov 07 16:50:27 2018 +0000
+++ b/pkgtools/pkglint/files/alternatives_test.go Wed Nov 07 20:58:22 2018 +0000
@@ -38,7 +38,7 @@
G.Pkg = NewPackage(".")
- CheckfileAlternatives("ALTERNATIVES", G.Pkg.PlistFiles)
+ CheckfileAlternatives("ALTERNATIVES")
t.CheckOutputLines(
"ERROR: ALTERNATIVES: Must not be empty.")
diff -r f1db3071f6ba -r c138cf94e5b0 pkgtools/pkglint/files/autofix.go
--- a/pkgtools/pkglint/files/autofix.go Wed Nov 07 16:50:27 2018 +0000
+++ b/pkgtools/pkglint/files/autofix.go Wed Nov 07 20:58:22 2018 +0000
@@ -4,7 +4,6 @@
"fmt"
"io/ioutil"
"netbsd.org/pkglint/regex"
- "netbsd.org/pkglint/trace"
"os"
"strconv"
"strings"
@@ -16,13 +15,20 @@
// until they are written to disk by SaveAutofixChanges.
type Autofix struct {
line Line
- linesBefore []string // Newly inserted lines, including \n
- lines []*RawLine // Original lines, available for diff
- linesAfter []string // Newly inserted lines, including \n
- modified bool // Modified in memory, but not necessarily written back to disk
+ linesBefore []string // Newly inserted lines, including \n
+ linesAfter []string // Newly inserted lines, including \n
+ // Whether an actual fix has been applied (or, without --show-autofix,
+ // whether a fix is applicable)
+ modified bool
+
+ autofixShortTerm
+}
+
+// autofixShortTerm is the part of the Autofix that is reset after each call to Apply.
+type autofixShortTerm struct {
actions []autofixAction // Human-readable description of the actual autofix actions
level *LogLevel //
- diagFormat string // Is printed only if it couldn't be fixed automatically
+ diagFormat string // Is logged only if it couldn't be fixed automatically
diagArgs []interface{} //
explanation []string // Is printed together with the diagnostic
}
@@ -32,50 +38,72 @@
lineno int
}
+// SilentAutofixFormat is used in exceptional situations when an
+// autofix action is not directly related to a diagnostic.
+//
+// To prevent confusion, the code using this magic value must ensure
+// to log a diagnostic by other means.
+const SilentAutofixFormat = "SilentAutofixFormat"
+
+// AutofixFormat is a special value that is used for logging
+// diagnostics like "Replacing \"old\" with \"new\".".
+//
+// Since these are not really diagnostics, duplicates are not suppressed.
+const AutofixFormat = "AutofixFormat"
+
func NewAutofix(line Line) *Autofix {
- return &Autofix{
- line: line,
- lines: append([]*RawLine{}, line.raw...)}
+ return &Autofix{line: line}
+}
+
+// Errorf remembers the error for logging it later when Apply is called.
+func (fix *Autofix) Errorf(format string, args ...interface{}) {
+ fix.setDiag(Error, format, args)
+}
+
+// Warnf remembers the warning for logging it later when Apply is called.
+func (fix *Autofix) Warnf(format string, args ...interface{}) {
+ fix.setDiag(Warn, format, args)
}
-// Custom runs a custom fix action, unless the fix is skipped anyway
-// because of the --only option.
-//
-// The fixer function must always call Describef.
-//
-// If printAutofix or autofix is true, the fix should be done in
-// memory as far as possible (e.g. changes to the text of the line).
-//
-// If autofix is true, the fix should be done persistently
-// (e.g. direct changes to the file system). Except if the fix only
-// affects the current line, then SaveAutofixChanges will do that.
-func (fix *Autofix) Custom(fixer func(printAutofix, autofix bool)) {
+// Notef remembers the note for logging it later when Apply is called.
+func (fix *Autofix) Notef(format string, args ...interface{}) {
+ fix.setDiag(Note, format, args)
+}
+
+// Explain remembers the explanation for logging it later when Apply is called.
+func (fix *Autofix) Explain(explanation ...string) {
+ // Since a silent fix doesn't have a diagnostic, its explanation would
+ // not provide any clue as to what diagnostic it belongs. That would
+ // be confusing, therefore this case is not allowed.
+ G.Assertf(
+ fix.diagFormat != SilentAutofixFormat,
+ "Autofix: Silent fixes cannot have an explanation.")
+
+ fix.explanation = explanation
+}
+
+// ReplaceAfter replaces "from" with "to", a single time.
+func (fix *Autofix) Replace(from string, to string) {
+ fix.ReplaceAfter("", from, to)
+}
+
+// ReplaceAfter replaces the text "prefix+from" with "prefix+to", a single time.
+// In the diagnostic, only the replacement of "from" with "to" is mentioned.
+func (fix *Autofix) ReplaceAfter(prefix, from string, to string) {
+ fix.assertRealLine()
if fix.skip() {
return
}
- fixer(G.opts.PrintAutofix, G.opts.Autofix)
-}
-
-func (fix *Autofix) Replace(from string, to string) {
- fix.ReplaceAfter("", from, to)
-}
-
-// ReplaceAfter replaces the text "prefix+from" with "prefix+to",
-// but in the diagnostic, only the replacement of "from" with "to"
-// is mentioned.
-func (fix *Autofix) ReplaceAfter(prefix, from string, to string) {
- if fix.skip() {
- return
- }
-
- for _, rawLine := range fix.lines {
+ for _, rawLine := range fix.line.raw {
if rawLine.Lineno != 0 {
- if replaced := strings.Replace(rawLine.textnl, prefix+from, prefix+to, 1); replaced != rawLine.textnl {
- if G.opts.PrintAutofix || G.opts.Autofix {
+ replaced := strings.Replace(rawLine.textnl, prefix+from, prefix+to, 1)
+ if replaced != rawLine.textnl {
+ if G.Opts.ShowAutofix || G.Opts.Autofix {
rawLine.textnl = replaced
}
fix.Describef(rawLine.Lineno, "Replacing %q with %q.", from, to)
+ return
}
}
}
@@ -87,12 +115,13 @@
// Placeholders like `$1` are _not_ expanded in the `toText`.
// (If you know how to do the expansion correctly, feel free to implement it.)
func (fix *Autofix) ReplaceRegex(from regex.Pattern, toText string, howOften int) {
+ fix.assertRealLine()
if fix.skip() {
return
}
done := 0
- for _, rawLine := range fix.lines {
+ for _, rawLine := range fix.line.raw {
if rawLine.Lineno != 0 {
var froms []string // The strings that have actually changed
@@ -105,8 +134,9 @@
return toText
}
- if replaced := replaceAllFunc(rawLine.textnl, from, replace); replaced != rawLine.textnl {
- if G.opts.PrintAutofix || G.opts.Autofix {
+ replaced := replaceAllFunc(rawLine.textnl, from, replace)
+ if replaced != rawLine.textnl {
+ if G.Opts.ShowAutofix || G.Opts.Autofix {
rawLine.textnl = replaced
}
for _, fromText := range froms {
@@ -117,8 +147,166 @@
}
}
+// Custom runs a custom fix action, unless the fix is skipped anyway
+// because of the --only option.
+//
+// The fixer function must check whether it can actually fix something,
+// and if so, call Describef to describe the actual fix.
+//
Home |
Main Index |
Thread Index |
Old Index