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.1
details: https://anonhg.NetBSD.org/pkgsrc/rev/d75bcb397e20
branches: trunk
changeset: 402562:d75bcb397e20
user: rillig <rillig%pkgsrc.org@localhost>
date: Fri Oct 11 23:30:02 2019 +0000
description:
pkgtools/pkglint: update to 19.3.1
Changes since 19.3.0:
* In buildlink3.mk files, the package identifier doesn't have to match
the PKGBASE from the package Makefile exactly. The PKGBASE may have a
leading "lib" (for libiconv and libgettext), as well as a trailing
number (for emacs20 and netatalk22).
* GITHUB_RELEASE is added to the variables that should appear in a fixed
order in the package Makefile.
* In the MASTER_SITE URLs, the transport protocol is irrelevant for
matching direct URLs to the predefined MASTER_SITE_* variables.
diffstat:
pkgtools/pkglint/Makefile | 4 +-
pkgtools/pkglint/files/buildlink3.go | 29 ++++-
pkgtools/pkglint/files/buildlink3_test.go | 65 +++++++++++++
pkgtools/pkglint/files/mkshparser_test.go | 134 ++++++++++++++++++++++++---
pkgtools/pkglint/files/package.go | 2 +
pkgtools/pkglint/files/pkgsrc.go | 4 +-
pkgtools/pkglint/files/pkgsrc_test.go | 10 +-
pkgtools/pkglint/files/shell.y | 2 +-
pkgtools/pkglint/files/vartypecheck.go | 28 +++--
pkgtools/pkglint/files/vartypecheck_test.go | 24 +++++
10 files changed, 255 insertions(+), 47 deletions(-)
diffs (truncated from 495 to 300 lines):
diff -r 9f734438c52a -r d75bcb397e20 pkgtools/pkglint/Makefile
--- a/pkgtools/pkglint/Makefile Fri Oct 11 20:02:10 2019 +0000
+++ b/pkgtools/pkglint/Makefile Fri Oct 11 23:30:02 2019 +0000
@@ -1,6 +1,6 @@
-# $NetBSD: Makefile,v 1.599 2019/10/01 21:37:59 rillig Exp $
+# $NetBSD: Makefile,v 1.600 2019/10/11 23:30:02 rillig Exp $
-PKGNAME= pkglint-19.3.0
+PKGNAME= pkglint-19.3.1
CATEGORIES= pkgtools
DISTNAME= tools
MASTER_SITES= ${MASTER_SITE_GITHUB:=golang/}
diff -r 9f734438c52a -r d75bcb397e20 pkgtools/pkglint/files/buildlink3.go
--- a/pkgtools/pkglint/files/buildlink3.go Fri Oct 11 20:02:10 2019 +0000
+++ b/pkgtools/pkglint/files/buildlink3.go Fri Oct 11 23:30:02 2019 +0000
@@ -119,8 +119,6 @@
// introduces the uppercase package identifier.
func (ck *Buildlink3Checker) checkSecondParagraph(mlex *MkLinesLexer) bool {
pkgbase := ck.pkgbase
- pkgbaseLine := ck.pkgbaseLine
-
m := mlex.NextRegexp(`^\.if !defined\(([^\t ]+)_BUILDLINK3_MK\)$`)
if m == nil {
return false
@@ -136,16 +134,29 @@
ucPkgbase := strings.ToUpper(strings.Replace(pkgbase, "-", "_", -1))
if ucPkgbase != pkgupper && !containsVarRef(pkgbase) {
pkgupperLine.Errorf("Package name mismatch between multiple-inclusion guard %q (expected %q) and package name %q (from %s).",
- pkgupper, ucPkgbase, pkgbase, pkgupperLine.RefTo(pkgbaseLine))
+ pkgupper, ucPkgbase, pkgbase, pkgupperLine.RefTo(ck.pkgbaseLine))
}
- if G.Pkg != nil {
- if mkbase := G.Pkg.EffectivePkgbase; mkbase != "" && mkbase != pkgbase {
- pkgbaseLine.Errorf("Package name mismatch between %q in this file and %q from %s.",
- pkgbase, mkbase, pkgbaseLine.RefTo(G.Pkg.EffectivePkgnameLine))
- }
+ ck.checkPkgbaseMismatch(pkgbase)
+
+ return true
+}
+
+func (ck *Buildlink3Checker) checkPkgbaseMismatch(bl3base string) {
+ if G.Pkg == nil {
+ return
}
- return true
+ mkbase := G.Pkg.EffectivePkgbase
+ if mkbase == "" || mkbase == bl3base || strings.TrimPrefix(mkbase, "lib") == bl3base {
+ return
+ }
+
+ if hasPrefix(mkbase, bl3base) && matches(mkbase[len(bl3base):], `^\d+$`) {
+ return
+ }
+
+ ck.pkgbaseLine.Errorf("Package name mismatch between %q in this file and %q from %s.",
+ bl3base, mkbase, ck.pkgbaseLine.RefTo(G.Pkg.EffectivePkgnameLine))
}
// Third paragraph: Package information.
diff -r 9f734438c52a -r d75bcb397e20 pkgtools/pkglint/files/buildlink3_test.go
--- a/pkgtools/pkglint/files/buildlink3_test.go Fri Oct 11 20:02:10 2019 +0000
+++ b/pkgtools/pkglint/files/buildlink3_test.go Fri Oct 11 23:30:02 2019 +0000
@@ -164,6 +164,71 @@
t.CheckOutputEmpty()
}
+func (s *Suite) Test_CheckLinesBuildlink3Mk__name_mismatch__lib(c *check.C) {
+ t := s.Init(c)
+
+ t.SetUpPackage("converters/libiconv")
+ t.CreateFileLines("converters/libiconv/buildlink3.mk",
+ MkCvsID,
+ "",
+ "BUILDLINK_TREE+=\ticonv",
+ "",
+ ".if !defined(ICONV_BUILDLINK3_MK)",
+ "ICONV_BUILDLINK3_MK:=",
+ "",
+ "BUILDLINK_API_DEPENDS.iconv+=\tlibiconv>=1.0",
+ "BUILDLINK_ABI_DEPENDS.iconv+=\tlibiconv>=1.0",
+ "",
+ ".endif\t# ICONV_BUILDLINK3_MK",
+ "",
+ "BUILDLINK_TREE+=\t-iconv")
+ t.FinishSetUp()
+
+ G.Check(t.File("converters/libiconv"))
+
+ // Up to 2019-10-12, pkglint complained about a mismatch
+ // between the package name from buildlink3.mk (iconv) and the
+ // one from the package Makefile (libiconv).
+ //
+ // This mismatch is not important enough to warrant a global
+ // renaming of the buildlink3 identifier, therefore the warning
+ // is suppressed in cases like this.
+ t.CheckOutputEmpty()
+}
+
+func (s *Suite) Test_CheckLinesBuildlink3Mk__name_mismatch__version(c *check.C) {
+ t := s.Init(c)
+
+ t.SetUpPackage("editors/emacs22",
+ "PKGNAME=\temacs22-22.0")
+ t.CreateFileLines("editors/emacs22/buildlink3.mk",
+ MkCvsID,
+ "",
+ "BUILDLINK_TREE+=\temacs",
+ "",
+ ".if !defined(EMACS_BUILDLINK3_MK)",
+ "EMACS_BUILDLINK3_MK:=",
+ "",
+ "BUILDLINK_API_DEPENDS.emacs+=\temacs22>=1.0",
+ "BUILDLINK_ABI_DEPENDS.emacs+=\temacs22>=1.0",
+ "",
+ ".endif\t# EMACS_BUILDLINK3_MK",
+ "",
+ "BUILDLINK_TREE+=\t-emacs")
+ t.FinishSetUp()
+
+ G.Check(t.File("editors/emacs22"))
+
+ // Up to 2019-10-12, pkglint complained about a mismatch
+ // between the package name from buildlink3.mk (emacs) and the
+ // one from the package Makefile (emacs22).
+ //
+ // This mismatch is not important enough to warrant a global
+ // renaming of the buildlink3 identifier, therefore the warning
+ // is suppressed in cases like this.
+ t.CheckOutputEmpty()
+}
+
func (s *Suite) Test_CheckLinesBuildlink3Mk__name_mismatch_multiple_inclusion(c *check.C) {
t := s.Init(c)
diff -r 9f734438c52a -r d75bcb397e20 pkgtools/pkglint/files/mkshparser_test.go
--- a/pkgtools/pkglint/files/mkshparser_test.go Fri Oct 11 20:02:10 2019 +0000
+++ b/pkgtools/pkglint/files/mkshparser_test.go Fri Oct 11 23:30:02 2019 +0000
@@ -331,12 +331,24 @@
b.Words("a", "b", "c"),
b.List().AddCommand(b.SimpleCommand("echo", "$var")).AddSemicolon())))
+ s.test("for var \n in ; do echo $var ; done",
+ b.List().AddCommand(b.For(
+ "var",
+ nil,
+ b.List().AddCommand(b.SimpleCommand("echo", "$var")).AddSemicolon())))
+
s.test("for var in in esac ; do echo $var ; done",
b.List().AddCommand(b.For(
"var",
b.Words("in", "esac"),
b.List().AddCommand(b.SimpleCommand("echo", "$var")).AddSemicolon())))
+ s.test("for var in \n do : ; done",
+ b.List().AddCommand(b.For(
+ "var",
+ nil,
+ b.List().AddCommand(b.SimpleCommand(":")).AddSemicolon())))
+
// No semicolon necessary between the two "done".
s.test("for i in 1; do for j in 1; do echo $$i$$j; done done",
b.List().AddCommand(b.For(
@@ -385,6 +397,20 @@
b.Words("pattern"),
b.List().AddCommand(b.SimpleCommand("case-item-action")), sepNone))))
+ s.test("case selector in pattern) \n case-item-action ; esac",
+ b.List().AddCommand(b.Case(
+ b.Token("selector"),
+ b.CaseItem(
+ b.Words("pattern"),
+ b.List().AddCommand(b.SimpleCommand("case-item-action")), sepSemicolon))))
+
+ s.test("case selector in pattern) action \n esac",
+ b.List().AddCommand(b.Case(
+ b.Token("selector"),
+ b.CaseItem(
+ b.Words("pattern"),
+ b.List().AddCommand(b.SimpleCommand("action")), sepNone))))
+
s.test("case $$expr in (if|then|else) ;; esac",
b.List().AddCommand(b.Case(
b.Token("$$expr"),
@@ -433,6 +459,14 @@
b.List().AddCommand(b.If(
b.List().AddCommand(b.SimpleCommand("cond2")).AddSemicolon(),
b.List().AddCommand(b.SimpleCommand("action")).AddSemicolon())))))
+
+ s.test("if cond1; then action1; elif cond2; then action2; else action3; fi",
+ b.List().AddCommand(b.If(
+ b.List().AddCommand(b.SimpleCommand("cond1")).AddSemicolon(),
+ b.List().AddCommand(b.SimpleCommand("action1")).AddSemicolon(),
+ b.List().AddCommand(b.SimpleCommand("cond2")).AddSemicolon(),
+ b.List().AddCommand(b.SimpleCommand("action2")).AddSemicolon(),
+ b.List().AddCommand(b.SimpleCommand("action3")).AddSemicolon())))
}
func (s *ShSuite) Test_ShellParser__while_clause(c *check.C) {
@@ -526,7 +560,23 @@
s.test("echo >> ${PLIST_SRC}",
b.List().AddCommand(b.SimpleCommand("echo", ">>${PLIST_SRC}")))
- s.test("echo 1>output 2>>append 3>|clobber 4>&5 6<input >>append",
+ s.test("echo 1>output 2>>append 3>|clobber 4>&5 6<input >>append <&input <>diamond <<-here",
+ b.List().AddCommand(&MkShCommand{Simple: &MkShSimpleCommand{
+ Assignments: nil,
+ Name: b.Token("echo"),
+ Args: nil,
+ Redirections: []*MkShRedirection{
+ {1, ">", b.Token("output")},
+ {2, ">>", b.Token("append")},
+ {3, ">|", b.Token("clobber")},
+ {4, ">&", b.Token("5")},
+ {6, "<", b.Token("input")},
+ {-1, ">>", b.Token("append")},
+ {-1, "<&", b.Token("input")},
+ {-1, "<>", b.Token("diamond")},
+ {-1, "<<-", b.Token("here")}}}}))
+
+ s.test("echo 1> output 2>> append 3>| clobber 4>& 5 6< input >> append <& input <> diamond <<- here",
b.List().AddCommand(&MkShCommand{Simple: &MkShSimpleCommand{
Assignments: nil,
Name: b.Token("echo"),
@@ -537,20 +587,10 @@
{3, ">|", b.Token("clobber")},
{4, ">&", b.Token("5")},
{6, "<", b.Token("input")},
- {-1, ">>", b.Token("append")}}}}))
-
- s.test("echo 1> output 2>> append 3>| clobber 4>& 5 6< input >> append",
- b.List().AddCommand(&MkShCommand{Simple: &MkShSimpleCommand{
- Assignments: nil,
- Name: b.Token("echo"),
- Args: nil,
- Redirections: []*MkShRedirection{
- {1, ">", b.Token("output")},
- {2, ">>", b.Token("append")},
- {3, ">|", b.Token("clobber")},
- {4, ">&", b.Token("5")},
- {6, "<", b.Token("input")},
- {-1, ">>", b.Token("append")}}}}))
+ {-1, ">>", b.Token("append")},
+ {-1, "<&", b.Token("input")},
+ {-1, "<>", b.Token("diamond")},
+ {-1, "<<-", b.Token("here")}}}}))
s.test("${MAKE} print-summary-data 2>&1 > /dev/stderr",
b.List().AddCommand(&MkShCommand{Simple: &MkShSimpleCommand{
@@ -560,11 +600,60 @@
Redirections: []*MkShRedirection{
{2, ">&", b.Token("1")},
{-1, ">", b.Token("/dev/stderr")}}}}))
+
+ s.test("1> output command",
+ b.List().AddCommand(&MkShCommand{Simple: &MkShSimpleCommand{
+ Name: b.Token("command"),
+ Redirections: []*MkShRedirection{
+ {1, ">", b.Token("output")}}}}))
+
+ s.test("ENV=value 1> output command",
+ b.List().AddCommand(&MkShCommand{Simple: &MkShSimpleCommand{
+ Assignments: []*ShToken{b.Token("ENV=value")},
+ Name: b.Token("command"),
+ Redirections: []*MkShRedirection{
+ {1, ">", b.Token("output")}}}}))
+}
+
+func (s *ShSuite) Test_ShellParser__redirect_list(c *check.C) {
+ b := s.init(c)
+
+ s.test("(:) 1>out",
+ b.List().AddCommand(
+ b.Redirected(
+ b.Subshell(b.List().AddCommand(b.SimpleCommand(":"))),
+ b.Redirection(1, ">", "out"))))
+
+ s.test("(:) 1>out 2>out",
+ b.List().AddCommand(
+ b.Redirected(
+ b.Subshell(b.List().AddCommand(b.SimpleCommand(":"))),
+ b.Redirection(1, ">", "out"),
+ b.Redirection(2, ">", "out"))))
}
func (s *ShSuite) Test_ShellParser__io_here(c *check.C) {
- // In pkgsrc Makefiles, the IO here-documents cannot be used since all the text
- // is joined into a single line. Therefore there are no tests here.
+ // In pkgsrc Makefiles, the IO here-documents cannot be used since
+ // all the text is joined into a single line. Therefore these test
+ // cases only show that pkglint can indeed not parse <<EOF
+ // redirections.
+ b := s.init(c)
+
+ s.test("<<EOF\ntext\nEOF",
+ b.List().
+ AddCommand(b.SimpleCommand("<<EOF")).
+ AddNewline().
+ AddCommand(b.SimpleCommand("text")). // This is wrong.
Home |
Main Index |
Thread Index |
Old Index