#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#

addtask lint before do_build
do_lint[nostamp] = "1"
python do_lint() {
    pkgname = d.getVar("PN")

    ##############################
    # Test that DESCRIPTION exists
    #
    description = d.getVar("DESCRIPTION", False)
    if description[1:10] == '{SUMMARY}':
        bb.warn("%s: DESCRIPTION is not set" % pkgname)


    ##############################
    # Test that HOMEPAGE exists
    #
    homepage = d.getVar("HOMEPAGE", False)
    if homepage == '':
        bb.warn("%s: HOMEPAGE is not set" % pkgname)
    elif not homepage.startswith("http://") and not homepage.startswith("https://"):
        bb.warn("%s: HOMEPAGE doesn't start with http:// or https://" % pkgname)


    ##############################
    # Test for valid SECTION
    #
    section = d.getVar("SECTION", False)
    if section == '':
        bb.warn("%s: SECTION is not set" % pkgname)
    elif not section.islower():
        bb.warn("%s: SECTION should only use lower case" % pkgname)


    ##############################
    # Check that all patches have Signed-off-by and Upstream-Status
    #
    srcuri = d.getVar("SRC_URI", False).split()
    fpaths = (d.getVar('FILESPATH') or '').split(':')

    def findPatch(patchname):
        for dir in fpaths:
            patchpath = dir + patchname
            if os.path.exists(patchpath):
                 return patchpath

    def findKey(path, key):
        ret = True
        f = open('%s' % path, mode = 'r')
        line = f.readline()
        while line:
            if line.find(key) != -1:
                ret = False
            line = f.readline()
        f.close()
        return ret

    def checkPN(pkgname, varname, str):
        if str.find("{PN}") != -1:
            bb.warn("%s: should use BPN instead of PN in %s" % (pkgname, varname))
        if str.find("{P}") != -1:
            bb.warn("%s: should use BP instead of P in %s" % (pkgname, varname))

    length = len("file://")
    for item in srcuri:
        if item.startswith("file://"):
            item = item[length:]
            if item.endswith(".patch") or item.endswith(".diff"):
                path = findPatch(item)
                if findKey(path, "Signed-off-by"):
                    bb.warn("%s: %s doesn't have Signed-off-by" % (pkgname, item))
                if findKey(path, "Upstream-Status"):
                    bb.warn("%s: %s doesn't have Upstream-Status" % (pkgname, item))


    ##############################
    # Check for ${PN} or ${P} usage in SRC_URI or S
    # Should use ${BPN} or ${BP} instead to avoid breaking multilib
    #
    for s in srcuri:
        if not s.startswith("file://"):
            checkPN(pkgname, 'SRC_URI', s)

    checkPN(pkgname, 'S', d.getVar('S', False))
}
