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 19.3.4
details: https://anonhg.NetBSD.org/pkgsrc/rev/c2c8d38084f8
branches: trunk
changeset: 403770:c2c8d38084f8
user: rillig <rillig%pkgsrc.org@localhost>
date: Fri Nov 01 19:56:52 2019 +0000
description:
pkgtools/pkglint: update to 19.3.4
Changes since 19.3.3:
In cases where the conditions for including buildlink3.mk files differ
between the package itself and its own buildlink3.mk file, explain how
to determine PKG_OPTIONS for dependencies.
Don't issue wrong warnings in options.mk files when the options are
handled in a .for loop.
diffstat:
pkgtools/pkglint/Makefile | 4 +-
pkgtools/pkglint/files/category.go | 2 +-
pkgtools/pkglint/files/category_test.go | 4 +-
pkgtools/pkglint/files/check_test.go | 3 +
pkgtools/pkglint/files/mklinechecker.go | 11 +--
pkgtools/pkglint/files/mktypes.go | 8 +-
pkgtools/pkglint/files/mktypes_test.go | 41 ++++++++++--
pkgtools/pkglint/files/options.go | 80 +++++++++++++++---------
pkgtools/pkglint/files/options_test.go | 98 +++++++++++++++++++++++++++++
pkgtools/pkglint/files/package.go | 24 ++++--
pkgtools/pkglint/files/package_test.go | 105 ++++++++++++++++++++++++++++++++
pkgtools/pkglint/files/pkglint.go | 27 +++----
pkgtools/pkglint/files/toplevel.go | 2 +-
pkgtools/pkglint/files/util.go | 31 +++++++++
pkgtools/pkglint/files/vardefs.go | 46 ++++++++-----
15 files changed, 388 insertions(+), 98 deletions(-)
diffs (truncated from 753 to 300 lines):
diff -r d2434772c9be -r c2c8d38084f8 pkgtools/pkglint/Makefile
--- a/pkgtools/pkglint/Makefile Fri Nov 01 19:42:16 2019 +0000
+++ b/pkgtools/pkglint/Makefile Fri Nov 01 19:56:52 2019 +0000
@@ -1,6 +1,6 @@
-# $NetBSD: Makefile,v 1.603 2019/10/26 11:43:36 rillig Exp $
+# $NetBSD: Makefile,v 1.604 2019/11/01 19:56:52 rillig Exp $
-PKGNAME= pkglint-19.3.3
+PKGNAME= pkglint-19.3.4
CATEGORIES= pkgtools
DISTNAME= tools
MASTER_SITES= ${MASTER_SITE_GITHUB:=golang/}
diff -r d2434772c9be -r c2c8d38084f8 pkgtools/pkglint/files/category.go
--- a/pkgtools/pkglint/files/category.go Fri Nov 01 19:42:16 2019 +0000
+++ b/pkgtools/pkglint/files/category.go Fri Nov 01 19:56:52 2019 +0000
@@ -161,6 +161,6 @@
recurseInto = append(recurseInto, joinPath(dir, msub.name))
}
}
- G.Todo = append(recurseInto, G.Todo...)
+ G.Todo.PushFront(recurseInto...)
}
}
diff -r d2434772c9be -r c2c8d38084f8 pkgtools/pkglint/files/category_test.go
--- a/pkgtools/pkglint/files/category_test.go Fri Nov 01 19:42:16 2019 +0000
+++ b/pkgtools/pkglint/files/category_test.go Fri Nov 01 19:56:52 2019 +0000
@@ -208,12 +208,12 @@
// It is only removed in Pkglint.Main, therefore it stays there even
// after the call to CheckdirCategory. This is a bit unrealistic,
// but close enough for this test.
- t.CheckDeepEquals(G.Todo, []string{"."})
+ t.CheckDeepEquals(G.Todo.entries, []string{"."})
CheckdirCategory(".")
t.CheckOutputEmpty()
- t.CheckDeepEquals(G.Todo, []string{"./package", "."})
+ t.CheckDeepEquals(G.Todo.entries, []string{"./package", "."})
}
// Ensures that a directory in the file system can be added at the very
diff -r d2434772c9be -r c2c8d38084f8 pkgtools/pkglint/files/check_test.go
--- a/pkgtools/pkglint/files/check_test.go Fri Nov 01 19:42:16 2019 +0000
+++ b/pkgtools/pkglint/files/check_test.go Fri Nov 01 19:56:52 2019 +0000
@@ -69,6 +69,7 @@
t.c = c
t.SetUpCommandLine("-Wall") // To catch duplicate warnings
+ G.Todo.Pop() // The "." was inserted by default.
t.seenSetUpCommandLine = false // This default call doesn't count.
// To improve code coverage and ensure that trace.Result works
@@ -693,6 +694,8 @@
//
// Arguments that name existing files or directories in the temporary test
// directory are transformed to their actual paths.
+//
+// Does not work in combination with SetUpOption.
func (t *Tester) Main(args ...string) int {
if t.seenFinish && !t.seenMain {
t.Errorf("Calling t.FinishSetup() before t.Main() is redundant " +
diff -r d2434772c9be -r c2c8d38084f8 pkgtools/pkglint/files/mklinechecker.go
--- a/pkgtools/pkglint/files/mklinechecker.go Fri Nov 01 19:42:16 2019 +0000
+++ b/pkgtools/pkglint/files/mklinechecker.go Fri Nov 01 19:56:52 2019 +0000
@@ -437,16 +437,9 @@
return
}
- needsRationale := func(mkline *MkLine) bool {
- if !mkline.IsVarassignMaybeCommented() {
- return false
- }
- vartype := G.Pkgsrc.VariableType(ck.MkLines, mkline.Varname())
- return vartype != nil && vartype.NeedsRationale()
- }
-
mkline := ck.MkLine
- if !needsRationale(mkline) {
+ vartype := G.Pkgsrc.VariableType(ck.MkLines, mkline.Varname())
+ if vartype == nil || !vartype.NeedsRationale() {
return
}
diff -r d2434772c9be -r c2c8d38084f8 pkgtools/pkglint/files/mktypes.go
--- a/pkgtools/pkglint/files/mktypes.go Fri Nov 01 19:42:16 2019 +0000
+++ b/pkgtools/pkglint/files/mktypes.go Fri Nov 01 19:56:52 2019 +0000
@@ -89,13 +89,15 @@
// MatchMatch tries to match the modifier to a :M or a :N pattern matching.
// Examples:
-// :Mpattern => true, true, "pattern"
-// :Npattern => true, false, "pattern"
+// :Mpattern => true, true, "pattern", true
+// :M* => true, true, "*", false
+// :M${VAR} => true, true, "${VAR}", false
+// :Npattern => true, false, "pattern", true
// :X => false
func (m MkVarUseModifier) MatchMatch() (ok bool, positive bool, pattern string, exact bool) {
if hasPrefix(m.Text, "M") || hasPrefix(m.Text, "N") {
// See devel/bmake/files/str.c:^Str_Match
- exact := !strings.ContainsAny(m.Text[1:], "*?[\\")
+ exact := !strings.ContainsAny(m.Text[1:], "*?[\\$")
return true, m.Text[0] == 'M', m.Text[1:], exact
}
return false, false, "", false
diff -r d2434772c9be -r c2c8d38084f8 pkgtools/pkglint/files/mktypes_test.go
--- a/pkgtools/pkglint/files/mktypes_test.go Fri Nov 01 19:42:16 2019 +0000
+++ b/pkgtools/pkglint/files/mktypes_test.go Fri Nov 01 19:56:52 2019 +0000
@@ -39,6 +39,16 @@
return &MkVarUse{varname, mods}
}
+// AddCommand adds a command directly to a list of commands,
+// creating all the intermediate nodes for the syntactic representation.
+// As soon as that representation is replaced with a semantic representation,
+// this method should no longer be necessary.
+func (list *MkShList) AddCommand(command *MkShCommand) *MkShList {
+ pipeline := NewMkShPipeline(false, []*MkShCommand{command})
+ andOr := NewMkShAndOr(pipeline)
+ return list.AddAndOr(andOr)
+}
+
func (s *Suite) Test_MkVarUse_Mod(c *check.C) {
t := s.Init(c)
@@ -53,14 +63,29 @@
test("${PATH:ts::Q}", ":ts::Q")
}
-// AddCommand adds a command directly to a list of commands,
-// creating all the intermediate nodes for the syntactic representation.
-// As soon as that representation is replaced with a semantic representation,
-// this method should no longer be necessary.
-func (list *MkShList) AddCommand(command *MkShCommand) *MkShList {
- pipeline := NewMkShPipeline(false, []*MkShCommand{command})
- andOr := NewMkShAndOr(pipeline)
- return list.AddAndOr(andOr)
+func (s *Suite) Test_MkVarUseModifier_MatchMatch(c *check.C) {
+ t := s.Init(c)
+
+ testFail := func(modifier string) {
+ mod := MkVarUseModifier{modifier}
+ ok, _, _, _ := mod.MatchMatch()
+ t.CheckEquals(ok, false)
+ }
+ test := func(modifier string, positive bool, pattern string, exact bool) {
+ mod := MkVarUseModifier{modifier}
+ actualOk, actualPositive, actualPattern, actualExact := mod.MatchMatch()
+ t.CheckDeepEquals(
+ []interface{}{actualOk, actualPositive, actualPattern, actualExact},
+ []interface{}{true, positive, pattern, exact})
+ }
+
+ testFail("")
+ testFail("X")
+
+ test("Mpattern", true, "pattern", true)
+ test("M*", true, "*", false)
+ test("M${VAR}", true, "${VAR}", false)
+ test("Npattern", false, "pattern", true)
}
func (s *Suite) Test_MkVarUseModifier_ChangesWords(c *check.C) {
diff -r d2434772c9be -r c2c8d38084f8 pkgtools/pkglint/files/options.go
--- a/pkgtools/pkglint/files/options.go Fri Nov 01 19:42:16 2019 +0000
+++ b/pkgtools/pkglint/files/options.go Fri Nov 01 19:56:52 2019 +0000
@@ -1,7 +1,5 @@
package pkglint
-import "path"
-
func CheckLinesOptionsMk(mklines *MkLines) {
ck := OptionsLinesChecker{
mklines,
@@ -42,10 +40,13 @@
mlex.Skip()
}
- for !mlex.EOF() {
- ck.handleLowerLine(mlex.CurrentMkLine())
- mlex.Skip()
- }
+ i := 0
+ mklines.ForEach(func(mkline *MkLine) {
+ if i >= mlex.index {
+ ck.handleLowerLine(mkline)
+ }
+ i++
+ })
ck.checkOptionsMismatch()
@@ -81,7 +82,10 @@
case mkline.IsVarassign():
switch mkline.Varcanon() {
- case "PKG_SUPPORTED_OPTIONS", "PKG_OPTIONS_GROUP.*", "PKG_OPTIONS_SET.*":
+ case "PKG_SUPPORTED_OPTIONS",
+ "PKG_SUPPORTED_OPTIONS.*",
+ "PKG_OPTIONS_GROUP.*",
+ "PKG_OPTIONS_SET.*":
for _, option := range mkline.ValueFields(mkline.Value()) {
if !containsVarRef(option) {
ck.declaredOptions[option] = mkline
@@ -113,48 +117,64 @@
}
func (ck *OptionsLinesChecker) handleLowerLine(mkline *MkLine) {
- if mkline.IsDirective() {
- directive := mkline.Directive()
- if directive == "if" || directive == "elif" {
- cond := mkline.Cond()
- if cond != nil {
- ck.handleLowerCondition(mkline, cond)
- }
- }
+ if !mkline.IsDirective() {
+ return
+ }
+
+ directive := mkline.Directive()
+ if directive != "if" && directive != "elif" {
+ return
}
+
+ cond := mkline.Cond()
+ if cond == nil {
+ return
+ }
+
+ ck.handleLowerCondition(mkline, cond)
}
func (ck *OptionsLinesChecker) handleLowerCondition(mkline *MkLine, cond *MkCond) {
- recordUsedOption := func(varuse *MkVarUse) {
+ recordOption := func(option string) {
+ if containsVarRef(option) {
+ return
+ }
+
+ ck.handledOptions[option] = mkline
+ ck.optionsInDeclarationOrder = append(ck.optionsInDeclarationOrder, option)
+ }
+
+ recordVarUse := func(varuse *MkVarUse) {
if varuse.varname != "PKG_OPTIONS" || len(varuse.modifiers) != 1 {
return
}
m, positive, pattern, exact := varuse.modifiers[0].MatchMatch()
- if !m || !positive || containsVarRef(pattern) {
+ if !m || !positive {
return
}
- if exact {
- option := pattern
- ck.handledOptions[option] = mkline
- ck.optionsInDeclarationOrder = append(ck.optionsInDeclarationOrder, option)
- return
- }
+ if optionVarUse := ToVarUse(pattern); optionVarUse != nil {
+ for _, option := range ck.mklines.ExpandLoopVar(optionVarUse.varname) {
+ recordOption(option)
+ }
- 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)
+ } else if exact {
+ recordOption(pattern)
+
+ } else {
+ for declaredOption := range ck.declaredOptions {
+ if pathMatches(pattern, declaredOption) {
+ recordOption(declaredOption)
+ }
}
}
}
cond.Walk(&MkCondCallback{
- Empty: recordUsedOption,
- Var: recordUsedOption})
+ Empty: recordVarUse,
+ Var: recordVarUse})
if cond.Empty != nil && cond.Empty.varname == "PKG_OPTIONS" && mkline.HasElseBranch() {
mkline.Notef("The positive branch of the .if/.else should be the one where the option is set.")
diff -r d2434772c9be -r c2c8d38084f8 pkgtools/pkglint/files/options_test.go
--- a/pkgtools/pkglint/files/options_test.go Fri Nov 01 19:42:16 2019 +0000
+++ b/pkgtools/pkglint/files/options_test.go Fri Nov 01 19:56:52 2019 +0000
@@ -387,3 +387,101 @@
t.CheckOutputLines(
"WARN: options.mk:4: Option \"opt-variant\" should be handled below in an .if block.")
}
+
Home |
Main Index |
Thread Index |
Old Index