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.7.21
details: https://anonhg.NetBSD.org/pkgsrc/rev/f0f9c09d229d
branches: trunk
changeset: 338275:f0f9c09d229d
user: rillig <rillig%pkgsrc.org@localhost>
date: Wed Aug 21 16:45:16 2019 +0000
description:
pkgtools/pkglint: update to 5.7.21
Changes since 5.7.20:
* PKG_OPTIONS that are handled using patterns are correctly identified.
* Simple R packages should follow the canonical variable order.
* Fixed some edge cases for aligning variable assignments.
* Improved detection of allowed values for USE_LANGUAGES.
diffstat:
pkgtools/pkglint/Makefile | 4 +-
pkgtools/pkglint/files/check_test.go | 12 +
pkgtools/pkglint/files/mkline_test.go | 7 +-
pkgtools/pkglint/files/mklinechecker.go | 11 +-
pkgtools/pkglint/files/mklinechecker_test.go | 5 +-
pkgtools/pkglint/files/mkshparser.go | 6 +-
pkgtools/pkglint/files/mkshparser_test.go | 39 ++++-
pkgtools/pkglint/files/mktypes.go | 8 +-
pkgtools/pkglint/files/options.go | 30 ++-
pkgtools/pkglint/files/options_test.go | 63 ++++++
pkgtools/pkglint/files/package.go | 2 +
pkgtools/pkglint/files/package_test.go | 17 +-
pkgtools/pkglint/files/varalignblock.go | 33 +--
pkgtools/pkglint/files/varalignblock_test.go | 254 ++++++++++++++++++++++++++-
pkgtools/pkglint/files/vardefs.go | 29 ++-
pkgtools/pkglint/files/vardefs_test.go | 38 +++-
pkgtools/pkglint/files/vartype.go | 4 +
pkgtools/pkglint/files/vartypecheck.go | 67 +++++-
pkgtools/pkglint/files/vartypecheck_test.go | 63 +++++-
19 files changed, 604 insertions(+), 88 deletions(-)
diffs (truncated from 1133 to 300 lines):
diff -r 2ab8eac91297 -r f0f9c09d229d pkgtools/pkglint/Makefile
--- a/pkgtools/pkglint/Makefile Wed Aug 21 16:31:18 2019 +0000
+++ b/pkgtools/pkglint/Makefile Wed Aug 21 16:45:16 2019 +0000
@@ -1,6 +1,6 @@
-# $NetBSD: Makefile,v 1.593 2019/08/16 21:00:17 rillig Exp $
+# $NetBSD: Makefile,v 1.594 2019/08/21 16:45:16 rillig Exp $
-PKGNAME= pkglint-5.7.20
+PKGNAME= pkglint-5.7.21
CATEGORIES= pkgtools
DISTNAME= tools
MASTER_SITES= ${MASTER_SITE_GITHUB:=golang/}
diff -r 2ab8eac91297 -r f0f9c09d229d pkgtools/pkglint/files/check_test.go
--- a/pkgtools/pkglint/files/check_test.go Wed Aug 21 16:31:18 2019 +0000
+++ b/pkgtools/pkglint/files/check_test.go Wed Aug 21 16:45:16 2019 +0000
@@ -309,6 +309,18 @@
t.CreateFileLines("mk/bsd.fast.prefs.mk",
MkCvsID)
+ // This file is used for initializing the allowed values for
+ // USE_LANGUAGES; see VarTypeRegistry.compilerLanguages.
+ t.CreateFileLines("mk/compiler.mk",
+ "_CXX_STD_VERSIONS=\tc++ c++14",
+ ".if ${USE_LANGUAGES:Mada} || \\",
+ " ${USE_LANGUAGES:Mc} || \\",
+ " ${USE_LANGUAGES:Mc99} || \\",
+ " ${USE_LANGUAGES:Mobjc} || \\",
+ " ${USE_LANGUAGES:Mfortran} || \\",
+ " ${USE_LANGUAGES:Mfortran77}",
+ ".endif")
+
// Category Makefiles require this file for the common definitions.
t.CreateFileLines("mk/misc/category.mk")
diff -r 2ab8eac91297 -r f0f9c09d229d pkgtools/pkglint/files/mkline_test.go
--- a/pkgtools/pkglint/files/mkline_test.go Wed Aug 21 16:31:18 2019 +0000
+++ b/pkgtools/pkglint/files/mkline_test.go Wed Aug 21 16:45:16 2019 +0000
@@ -457,9 +457,10 @@
"\tvalue",
true)
- // In commented multilines, the continuation lines may or may not start
- // with a comment character. Bmake doesn't care, but for human readers
- // it is confusing to omit the leading comment character.
+ // In commented multilines, bmake doesn't care whether the
+ // continuation lines does or doesn't start with a comment character.
+ // For human readers though, it is confusing to omit the leading
+ // comment character.
//
// For determining whether a multiline is aligned, the initial comment
// character is ignored.
diff -r 2ab8eac91297 -r f0f9c09d229d pkgtools/pkglint/files/mklinechecker.go
--- a/pkgtools/pkglint/files/mklinechecker.go Wed Aug 21 16:31:18 2019 +0000
+++ b/pkgtools/pkglint/files/mklinechecker.go Wed Aug 21 16:45:16 2019 +0000
@@ -599,7 +599,7 @@
if len(mods) == 3 {
if m, _, from, to, options := mods[0].MatchSubst(); m && from == "^" && matches(to, `^\w+$`) && options == "1" {
magic := to
- if m, positive, pattern := mods[1].MatchMatch(); m && positive && pattern == magic+"*" {
+ if m, positive, pattern, _ := mods[1].MatchMatch(); m && positive && pattern == magic+"*" {
if m, _, from, to, options = mods[2].MatchSubst(); m && from == "^"+magic && to == "" && options == "" {
fix := ck.MkLine.Autofix()
fix.Notef("The modifier %q can be written as %q.", varuse.Mod(), ":[1]")
@@ -1583,7 +1583,8 @@
pattern +
condStr(fromEmpty, ")", "}")
- to := "${" + varname + "} " + op + " " + pattern
+ quote := condStr(matches(pattern, `[^\-/0-9@A-Za-z]`), "\"", "")
+ to := "${" + varname + "} " + op + " " + quote + pattern + quote
// TODO: Check in more cases whether the parentheses are really necessary.
// In a !!${VAR} expression, parentheses are necessary.
@@ -1599,11 +1600,11 @@
modifiers := varuse.modifiers
for _, modifier := range modifiers {
- if m, positive, pattern := modifier.MatchMatch(); m && (positive || len(modifiers) == 1) {
+ if m, positive, pattern, exact := modifier.MatchMatch(); m && (positive || len(modifiers) == 1) {
ck.checkVartype(varname, opUseMatch, pattern, "")
vartype := G.Pkgsrc.VariableType(ck.MkLines, varname)
- if matches(pattern, `^[\w-/]+$`) && vartype != nil && !vartype.List() {
+ if exact && matches(pattern, `^[\w-/]+$`) && vartype != nil && !vartype.List() {
fix := ck.MkLine.Autofix()
fix.Notef("%s should be compared using %s instead of matching against %q.",
@@ -1649,7 +1650,7 @@
ck.checkCompareVarStr(varname, op, str)
case 1:
- if m, _, pattern := varmods[0].MatchMatch(); m {
+ if m, _, pattern, _ := varmods[0].MatchMatch(); m {
ck.checkVartype(varname, opUseMatch, pattern, "")
// After applying the :M or :N modifier, every expression may end up empty,
diff -r 2ab8eac91297 -r f0f9c09d229d pkgtools/pkglint/files/mklinechecker_test.go
--- a/pkgtools/pkglint/files/mklinechecker_test.go Wed Aug 21 16:31:18 2019 +0000
+++ b/pkgtools/pkglint/files/mklinechecker_test.go Wed Aug 21 16:45:16 2019 +0000
@@ -2184,6 +2184,9 @@
mklines := t.SetUpFileMkLines("options.mk",
MkCvsID,
"GOPATH=\t${WRKDIR}",
+ "",
+ "CONFIGURE_ENV+=\tNAME=${R_PKGNAME} VER=${R_PKGVER}",
+ "",
"do-build:",
"\tcd ${WRKSRC} && GOPATH=${GOPATH} PATH=${PATH} :")
@@ -2197,7 +2200,7 @@
// of pkgsrc, and these may contain special characters.
t.CheckOutputLines(
- "WARN: ~/options.mk:4: The variable PATH should be quoted as part of a shell word.")
+ "WARN: ~/options.mk:7: The variable PATH should be quoted as part of a shell word.")
}
func (s *Suite) Test_MkLineChecker_checkVarUseQuoting__mstar(c *check.C) {
diff -r 2ab8eac91297 -r f0f9c09d229d pkgtools/pkglint/files/mkshparser.go
--- a/pkgtools/pkglint/files/mkshparser.go Wed Aug 21 16:31:18 2019 +0000
+++ b/pkgtools/pkglint/files/mkshparser.go Wed Aug 21 16:45:16 2019 +0000
@@ -11,12 +11,12 @@
lexer := NewShellLexer(tokens, rest)
parser := shyyParserImpl{}
- succeeded := parser.Parse(lexer)
+ zeroMeansSuccess := parser.Parse(lexer)
switch {
- case succeeded == 0 && lexer.error == "":
+ case zeroMeansSuccess == 0 && lexer.error == "":
return lexer.result, nil
- case succeeded == 0:
+ case zeroMeansSuccess == 0:
return nil, fmt.Errorf("splitIntoShellTokens couldn't parse %q", rest)
default:
return nil, &ParseError{append([]string{lexer.current}, lexer.remaining...)}
diff -r 2ab8eac91297 -r f0f9c09d229d pkgtools/pkglint/files/mkshparser_test.go
--- a/pkgtools/pkglint/files/mkshparser_test.go Wed Aug 21 16:31:18 2019 +0000
+++ b/pkgtools/pkglint/files/mkshparser_test.go Wed Aug 21 16:45:16 2019 +0000
@@ -19,6 +19,7 @@
t.CheckEquals(err, expError)
} else {
t.CheckDeepEquals(err, expError)
+ t.CheckDeepEquals(err.Error(), expError.Error()) // Just for code coverage
t.CheckDeepEquals(program, expProgram)
}
@@ -48,6 +49,12 @@
nil,
nil,
nil...)
+
+ test(
+ "case ;;",
+ nil,
+ &ParseError{[]string{";;"}},
+ nil...)
}
type ShSuite struct {
@@ -396,11 +403,17 @@
b.Words("*"),
b.List(), sepNone))))
- // The default case may be omitted if PATTERNS can never be empty.
+ // The default case may even be omitted.
s.test("case $$expr in ${PATTERNS:@p@ (${p}) action ;; @} esac",
b.List().AddCommand(b.Case(
b.Token("$$expr"),
b.CaseItemVar("${PATTERNS:@p@ (${p}) action ;; @}"))))
+
+ // Only variables that end with a :@ modifier may be used in this
+ // construct. All others are tokenized as normal words and lead
+ // to a syntax error in the shell parser.
+ s.testFail("case $$expr in ${PATTERNS} esac",
+ []string{}...)
}
func (s *ShSuite) Test_ShellParser__if_clause(c *check.C) {
@@ -589,6 +602,21 @@
}
}
+func (s *ShSuite) testFail(program string, expectedRemaining ...string) {
+ t := s.t
+
+ tokens, rest := splitIntoShellTokens(dummyLine, program)
+ t.CheckEquals(rest, "")
+ lexer := ShellLexer{remaining: tokens, atCommandStart: true}
+ parser := shyyParserImpl{}
+
+ zeroMeansSuccess := parser.Parse(&lexer)
+
+ if t.CheckEquals(zeroMeansSuccess, 1) && t.Check(lexer.error, check.Not(check.Equals), "") {
+ t.CheckDeepEquals(lexer.remaining, expectedRemaining)
+ }
+}
+
func (s *ShSuite) Test_ShellLexer_Lex__redirects(c *check.C) {
t := s.t
@@ -708,6 +736,15 @@
tkIN,
tkWORD,
tkESAC)
+
+ test(
+ "case $$expr in ${PATTERNS:Mpattern} esac",
+
+ tkCASE,
+ tkWORD,
+ tkIN,
+ tkWORD,
+ tkWORD) // No tkESAC since there is no :@ modifier.
}
type MkShBuilder struct {
diff -r 2ab8eac91297 -r f0f9c09d229d pkgtools/pkglint/files/mktypes.go
--- a/pkgtools/pkglint/files/mktypes.go Wed Aug 21 16:31:18 2019 +0000
+++ b/pkgtools/pkglint/files/mktypes.go Wed Aug 21 16:45:16 2019 +0000
@@ -92,11 +92,13 @@
// :Mpattern => true, true, "pattern"
// :Npattern => true, false, "pattern"
// :X => false
-func (m MkVarUseModifier) MatchMatch() (ok bool, positive bool, pattern string) {
+func (m MkVarUseModifier) MatchMatch() (ok bool, positive bool, pattern string, exact bool) {
if hasPrefix(m.Text, "M") || hasPrefix(m.Text, "N") {
- return true, m.Text[0] == 'M', m.Text[1:]
+ // See devel/bmake/files/str.c:^Str_Match
+ exact := !strings.ContainsAny(m.Text[1:], "*?[\\")
+ return true, m.Text[0] == 'M', m.Text[1:], exact
}
- return false, false, ""
+ return false, false, "", false
}
func (m MkVarUseModifier) IsToLower() bool { return m.Text == "tl" }
diff -r 2ab8eac91297 -r f0f9c09d229d pkgtools/pkglint/files/options.go
--- a/pkgtools/pkglint/files/options.go Wed Aug 21 16:31:18 2019 +0000
+++ b/pkgtools/pkglint/files/options.go Wed Aug 21 16:45:16 2019 +0000
@@ -1,5 +1,7 @@
package pkglint
+import "path"
+
func CheckLinesOptionsMk(mklines *MkLines) {
ck := OptionsLinesChecker{
mklines,
@@ -125,13 +127,27 @@
func (ck *OptionsLinesChecker) handleLowerCondition(mkline *MkLine, cond *MkCond) {
recordUsedOption := func(varuse *MkVarUse) {
- if varuse.varname == "PKG_OPTIONS" && len(varuse.modifiers) == 1 {
- if m, positive, pattern := varuse.modifiers[0].MatchMatch(); m && positive {
- option := pattern
- if !containsVarRef(option) {
- ck.handledOptions[option] = mkline
- ck.optionsInDeclarationOrder = append(ck.optionsInDeclarationOrder, option)
- }
+ if varuse.varname != "PKG_OPTIONS" || len(varuse.modifiers) != 1 {
+ return
+ }
+
+ m, positive, pattern, exact := varuse.modifiers[0].MatchMatch()
+ if !m || !positive || containsVarRef(pattern) {
+ return
+ }
+
+ if exact {
+ option := pattern
+ ck.handledOptions[option] = mkline
+ ck.optionsInDeclarationOrder = append(ck.optionsInDeclarationOrder, option)
+ return
+ }
+
+ for declaredOption := range ck.declaredOptions {
+ matched, err := path.Match(pattern, declaredOption)
+ if err == nil && matched {
+ ck.handledOptions[declaredOption] = mkline
+ ck.optionsInDeclarationOrder = append(ck.optionsInDeclarationOrder, declaredOption)
}
}
}
diff -r 2ab8eac91297 -r f0f9c09d229d pkgtools/pkglint/files/options_test.go
--- a/pkgtools/pkglint/files/options_test.go Wed Aug 21 16:31:18 2019 +0000
+++ b/pkgtools/pkglint/files/options_test.go Wed Aug 21 16:45:16 2019 +0000
@@ -324,3 +324,66 @@
". endif",
".endif")
}
+
+// A few packages (such as www/w3m) define several options that are
+// handled by a single .if block in the lower part.
+func (s *Suite) Test_CheckLinesOptionsMk__combined_option_handling(c *check.C) {
+ t := s.Init(c)
+
+ t.SetUpOption("opt-variant1", "")
+ t.SetUpOption("opt-variant2", "")
+ t.SetUpOption("other", "")
Home |
Main Index |
Thread Index |
Old Index