mirror of
https://git.yoctoproject.org/git/poky
synced 2026-01-01 13:58:04 +00:00
These are optional per-recipe variables with the following meaning: UPSTREAM_VERSION_UNKNOWN - set if the upstream version check fails reliably, e.g. absent git tags, or weird version format used on our or on upstream side. If this variable is not set and version check fails, or if it is set and the version check succeeds, then the checkpkg selftest for the recipe will fail. UPSTREAM_CHECK_UNRELIABLE - set if the upstream check cannot be reliably performed due to transient network failures, or server behaving weirdly. This one should be used sparingly, as it completely excludes a recipe from upstream checking, and thus we don't get automatically notified about new upstream releases. Also the upstream status string in the checkpkg csv output is clarified with the following possible values: MATCH - recipe is providing the latest upstream version UPDATE - there is a new version released by upstream, recipe should be updated CHECK_IS_UNRELIABLE - an upstream check was skipped as requested by recipe via UPSTREAM_CHECK_UNRELIABLE UNKNOWN - upstream version check was performed, but the upstream verison could not be determined. The recipe acknowledges this via UPSTREAM_VERSION_UNKNOWN setting. UNKNWON_BROKEN - same as previous, but the recipe does not include the acknowledgement and should be fixed. KNOWN_BROKEN - upstream check worked, but recipe claims it shouldn't; to fix this remove UPSTREAM_VERSION_UNKNOWN from recipe. [YOCTO #11896] (From OE-Core rev: 2a44ac1add0338cd7ff012cda96bf113c9a01bd6) Signed-off-by: Alexander Kanavin <alexander.kanavin@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
469 lines
17 KiB
Plaintext
469 lines
17 KiB
Plaintext
include conf/distro/include/upstream_tracking.inc
|
|
include conf/distro/include/distro_alias.inc
|
|
include conf/distro/include/maintainers.inc
|
|
|
|
addhandler distro_eventhandler
|
|
distro_eventhandler[eventmask] = "bb.event.BuildStarted"
|
|
python distro_eventhandler() {
|
|
import oe.distro_check as dc
|
|
import csv
|
|
logfile = dc.create_log_file(e.data, "distrodata.csv")
|
|
|
|
lf = bb.utils.lockfile("%s.lock" % logfile)
|
|
with open(logfile, "a") as f:
|
|
writer = csv.writer(f)
|
|
writer.writerow(['Package', 'Description', 'Owner', 'License',
|
|
'VerMatch', 'Version', 'Upstream', 'Reason', 'Recipe Status',
|
|
'Distro 1', 'Distro 2', 'Distro 3'])
|
|
f.close()
|
|
bb.utils.unlockfile(lf)
|
|
|
|
return
|
|
}
|
|
|
|
addtask distrodata_np
|
|
do_distrodata_np[nostamp] = "1"
|
|
python do_distrodata_np() {
|
|
localdata = bb.data.createCopy(d)
|
|
pn = d.getVar("PN")
|
|
bb.note("Package Name: %s" % pn)
|
|
|
|
import oe.distro_check as dist_check
|
|
tmpdir = d.getVar('TMPDIR')
|
|
distro_check_dir = os.path.join(tmpdir, "distro_check")
|
|
datetime = localdata.getVar('DATETIME')
|
|
dist_check.update_distro_data(distro_check_dir, datetime, localdata)
|
|
|
|
if pn.find("-native") != -1:
|
|
pnstripped = pn.split("-native")
|
|
bb.note("Native Split: %s" % pnstripped)
|
|
localdata.setVar('OVERRIDES', "pn-" + pnstripped[0] + ":" + d.getVar('OVERRIDES'))
|
|
|
|
if pn.find("-cross") != -1:
|
|
pnstripped = pn.split("-cross")
|
|
bb.note("cross Split: %s" % pnstripped)
|
|
localdata.setVar('OVERRIDES', "pn-" + pnstripped[0] + ":" + d.getVar('OVERRIDES'))
|
|
|
|
if pn.find("-crosssdk") != -1:
|
|
pnstripped = pn.split("-crosssdk")
|
|
bb.note("cross Split: %s" % pnstripped)
|
|
localdata.setVar('OVERRIDES', "pn-" + pnstripped[0] + ":" + d.getVar('OVERRIDES'))
|
|
|
|
if pn.startswith("nativesdk-"):
|
|
pnstripped = pn.replace("nativesdk-", "")
|
|
bb.note("NativeSDK Split: %s" % pnstripped)
|
|
localdata.setVar('OVERRIDES', "pn-" + pnstripped + ":" + d.getVar('OVERRIDES'))
|
|
|
|
|
|
if pn.find("-initial") != -1:
|
|
pnstripped = pn.split("-initial")
|
|
bb.note("initial Split: %s" % pnstripped)
|
|
localdata.setVar('OVERRIDES', "pn-" + pnstripped[0] + ":" + d.getVar('OVERRIDES'))
|
|
|
|
"""generate package information from .bb file"""
|
|
pname = localdata.getVar('PN')
|
|
pcurver = localdata.getVar('PV')
|
|
pdesc = localdata.getVar('DESCRIPTION')
|
|
if pdesc is not None:
|
|
pdesc = pdesc.replace(',','')
|
|
pdesc = pdesc.replace('\n','')
|
|
|
|
pgrp = localdata.getVar('SECTION')
|
|
plicense = localdata.getVar('LICENSE').replace(',','_')
|
|
|
|
rstatus = localdata.getVar('RECIPE_COLOR')
|
|
if rstatus is not None:
|
|
rstatus = rstatus.replace(',','')
|
|
|
|
pupver = localdata.getVar('RECIPE_UPSTREAM_VERSION')
|
|
if pcurver == pupver:
|
|
vermatch="1"
|
|
else:
|
|
vermatch="0"
|
|
noupdate_reason = localdata.getVar('RECIPE_NO_UPDATE_REASON')
|
|
if noupdate_reason is None:
|
|
noupdate="0"
|
|
else:
|
|
noupdate="1"
|
|
noupdate_reason = noupdate_reason.replace(',','')
|
|
|
|
maintainer = localdata.getVar('RECIPE_MAINTAINER')
|
|
rlrd = localdata.getVar('RECIPE_UPSTREAM_DATE')
|
|
result = dist_check.compare_in_distro_packages_list(distro_check_dir, localdata)
|
|
|
|
bb.note("DISTRO: %s,%s,%s,%s,%s,%s,%s,%s,%s\n" % \
|
|
(pname, pdesc, maintainer, plicense, vermatch, pcurver, pupver, noupdate_reason, rstatus))
|
|
line = pn
|
|
for i in result:
|
|
line = line + "," + i
|
|
bb.note("%s\n" % line)
|
|
}
|
|
do_distrodata_np[vardepsexclude] = "DATETIME"
|
|
|
|
addtask distrodata
|
|
do_distrodata[nostamp] = "1"
|
|
python do_distrodata() {
|
|
import csv
|
|
logpath = d.getVar('LOG_DIR')
|
|
bb.utils.mkdirhier(logpath)
|
|
logfile = os.path.join(logpath, "distrodata.csv")
|
|
|
|
import oe.distro_check as dist_check
|
|
localdata = bb.data.createCopy(d)
|
|
tmpdir = d.getVar('TMPDIR')
|
|
distro_check_dir = os.path.join(tmpdir, "distro_check")
|
|
datetime = localdata.getVar('DATETIME')
|
|
dist_check.update_distro_data(distro_check_dir, datetime, localdata)
|
|
|
|
pn = d.getVar("PN")
|
|
bb.note("Package Name: %s" % pn)
|
|
|
|
if pn.find("-native") != -1:
|
|
pnstripped = pn.split("-native")
|
|
bb.note("Native Split: %s" % pnstripped)
|
|
localdata.setVar('OVERRIDES', "pn-" + pnstripped[0] + ":" + d.getVar('OVERRIDES'))
|
|
|
|
if pn.startswith("nativesdk-"):
|
|
pnstripped = pn.replace("nativesdk-", "")
|
|
bb.note("NativeSDK Split: %s" % pnstripped)
|
|
localdata.setVar('OVERRIDES', "pn-" + pnstripped + ":" + d.getVar('OVERRIDES'))
|
|
|
|
if pn.find("-cross") != -1:
|
|
pnstripped = pn.split("-cross")
|
|
bb.note("cross Split: %s" % pnstripped)
|
|
localdata.setVar('OVERRIDES', "pn-" + pnstripped[0] + ":" + d.getVar('OVERRIDES'))
|
|
|
|
if pn.find("-crosssdk") != -1:
|
|
pnstripped = pn.split("-crosssdk")
|
|
bb.note("cross Split: %s" % pnstripped)
|
|
localdata.setVar('OVERRIDES', "pn-" + pnstripped[0] + ":" + d.getVar('OVERRIDES'))
|
|
|
|
if pn.find("-initial") != -1:
|
|
pnstripped = pn.split("-initial")
|
|
bb.note("initial Split: %s" % pnstripped)
|
|
localdata.setVar('OVERRIDES', "pn-" + pnstripped[0] + ":" + d.getVar('OVERRIDES'))
|
|
|
|
"""generate package information from .bb file"""
|
|
pname = localdata.getVar('PN')
|
|
pcurver = localdata.getVar('PV')
|
|
pdesc = localdata.getVar('DESCRIPTION')
|
|
if pdesc is not None:
|
|
pdesc = pdesc.replace(',','')
|
|
pdesc = pdesc.replace('\n','')
|
|
|
|
pgrp = localdata.getVar('SECTION')
|
|
plicense = localdata.getVar('LICENSE').replace(',','_')
|
|
|
|
rstatus = localdata.getVar('RECIPE_COLOR')
|
|
if rstatus is not None:
|
|
rstatus = rstatus.replace(',','')
|
|
|
|
pupver = localdata.getVar('RECIPE_UPSTREAM_VERSION')
|
|
if pcurver == pupver:
|
|
vermatch="1"
|
|
else:
|
|
vermatch="0"
|
|
|
|
noupdate_reason = localdata.getVar('RECIPE_NO_UPDATE_REASON')
|
|
if noupdate_reason is None:
|
|
noupdate="0"
|
|
else:
|
|
noupdate="1"
|
|
noupdate_reason = noupdate_reason.replace(',','')
|
|
|
|
maintainer = localdata.getVar('RECIPE_MAINTAINER')
|
|
rlrd = localdata.getVar('RECIPE_UPSTREAM_DATE')
|
|
# do the comparison
|
|
result = dist_check.compare_in_distro_packages_list(distro_check_dir, localdata)
|
|
|
|
lf = bb.utils.lockfile("%s.lock" % logfile)
|
|
with open(logfile, "a") as f:
|
|
row = [pname, pdesc, maintainer, plicense, vermatch, pcurver, pupver, noupdate_reason, rstatus]
|
|
row.extend(result)
|
|
|
|
writer = csv.writer(f)
|
|
writer.writerow(row)
|
|
f.close()
|
|
bb.utils.unlockfile(lf)
|
|
}
|
|
do_distrodata[vardepsexclude] = "DATETIME"
|
|
|
|
addtask distrodataall after do_distrodata
|
|
do_distrodataall[recrdeptask] = "do_distrodataall do_distrodata"
|
|
do_distrodataall[recideptask] = "do_${BB_DEFAULT_TASK}"
|
|
do_distrodataall[nostamp] = "1"
|
|
do_distrodataall() {
|
|
:
|
|
}
|
|
|
|
addhandler checkpkg_eventhandler
|
|
checkpkg_eventhandler[eventmask] = "bb.event.BuildStarted bb.event.BuildCompleted"
|
|
python checkpkg_eventhandler() {
|
|
import csv
|
|
|
|
def parse_csv_file(filename):
|
|
package_dict = {}
|
|
|
|
with open(filename, "r") as f:
|
|
reader = csv.reader(f, delimiter='\t')
|
|
for row in reader:
|
|
pn = row[0]
|
|
|
|
if reader.line_num == 1:
|
|
header = row
|
|
continue
|
|
|
|
if not pn in package_dict.keys():
|
|
package_dict[pn] = row
|
|
f.close()
|
|
|
|
with open(filename, "w") as f:
|
|
writer = csv.writer(f, delimiter='\t')
|
|
writer.writerow(header)
|
|
for pn in package_dict.keys():
|
|
writer.writerow(package_dict[pn])
|
|
f.close()
|
|
|
|
del package_dict
|
|
|
|
if bb.event.getName(e) == "BuildStarted":
|
|
import oe.distro_check as dc
|
|
logfile = dc.create_log_file(e.data, "checkpkg.csv")
|
|
|
|
lf = bb.utils.lockfile("%s.lock" % logfile)
|
|
with open(logfile, "a") as f:
|
|
writer = csv.writer(f, delimiter='\t')
|
|
headers = ['Package', 'Version', 'Upver', 'License', 'Section',
|
|
'Home', 'Release', 'Depends', 'BugTracker', 'PE', 'Description',
|
|
'Status', 'Tracking', 'URI', 'MAINTAINER', 'NoUpReason']
|
|
writer.writerow(headers)
|
|
f.close()
|
|
bb.utils.unlockfile(lf)
|
|
elif bb.event.getName(e) == "BuildCompleted":
|
|
import os
|
|
filename = "tmp/log/checkpkg.csv"
|
|
if os.path.isfile(filename):
|
|
lf = bb.utils.lockfile("%s.lock"%filename)
|
|
parse_csv_file(filename)
|
|
bb.utils.unlockfile(lf)
|
|
return
|
|
}
|
|
|
|
addtask checkpkg
|
|
do_checkpkg[nostamp] = "1"
|
|
python do_checkpkg() {
|
|
localdata = bb.data.createCopy(d)
|
|
import csv
|
|
import re
|
|
import tempfile
|
|
import subprocess
|
|
import oe.recipeutils
|
|
from bb.utils import vercmp_string
|
|
from bb.fetch2 import FetchError, NoMethodError, decodeurl
|
|
|
|
def get_upstream_version_and_status():
|
|
|
|
# set if the upstream check fails reliably, e.g. absent git tags, or weird version format used on our or on upstream side.
|
|
upstream_version_unknown = localdata.getVar('UPSTREAM_VERSION_UNKNOWN')
|
|
# set if the upstream check cannot be reliably performed due to transient network failures, or server behaving weirdly.
|
|
# This one should be used sparingly, as it completely excludes a recipe from upstream checking.
|
|
upstream_check_unreliable = localdata.getVar('UPSTREAM_CHECK_UNRELIABLE')
|
|
|
|
if upstream_check_unreliable == "1":
|
|
return "N/A", "CHECK_IS_UNRELIABLE"
|
|
|
|
try:
|
|
uv = oe.recipeutils.get_recipe_upstream_version(localdata)
|
|
pupver = uv['version'] if uv['version'] else "N/A"
|
|
except Exception as e:
|
|
pupver = "N/A"
|
|
|
|
if pupver == "N/A":
|
|
pstatus = "UNKNOWN" if upstream_version_unknown else "UNKNOWN_BROKEN"
|
|
else:
|
|
src_uri = (localdata.getVar('SRC_URI') or '').split()
|
|
if src_uri:
|
|
uri_type, _, _, _, _, _ = decodeurl(src_uri[0])
|
|
else:
|
|
uri_type = "none"
|
|
pv, _, _ = oe.recipeutils.get_recipe_pv_without_srcpv(pversion, uri_type)
|
|
upv, _, _ = oe.recipeutils.get_recipe_pv_without_srcpv(pupver, uri_type)
|
|
|
|
cmp = vercmp_string(pv, upv)
|
|
if cmp == -1:
|
|
pstatus = "UPDATE" if not upstream_version_unknown else "KNOWN_BROKEN"
|
|
elif cmp == 0:
|
|
pstatus = "MATCH" if not upstream_version_unknown else "KNOWN_BROKEN"
|
|
else:
|
|
pstatus = "UNKNOWN" if upstream_version_unknown else "UNKNOWN_BROKEN"
|
|
|
|
return pupver, pstatus
|
|
|
|
|
|
"""initialize log files."""
|
|
logpath = d.getVar('LOG_DIR')
|
|
bb.utils.mkdirhier(logpath)
|
|
logfile = os.path.join(logpath, "checkpkg.csv")
|
|
|
|
"""generate package information from .bb file"""
|
|
pname = d.getVar('PN')
|
|
|
|
if pname.find("-native") != -1:
|
|
if d.getVar('BBCLASSEXTEND'):
|
|
return
|
|
pnstripped = pname.split("-native")
|
|
bb.note("Native Split: %s" % pnstripped)
|
|
localdata.setVar('OVERRIDES', "pn-" + pnstripped[0] + ":" + d.getVar('OVERRIDES'))
|
|
|
|
if pname.startswith("nativesdk-"):
|
|
if d.getVar('BBCLASSEXTEND'):
|
|
return
|
|
pnstripped = pname.replace("nativesdk-", "")
|
|
bb.note("NativeSDK Split: %s" % pnstripped)
|
|
localdata.setVar('OVERRIDES', "pn-" + pnstripped + ":" + d.getVar('OVERRIDES'))
|
|
|
|
if pname.find("-cross") != -1:
|
|
pnstripped = pname.split("-cross")
|
|
bb.note("cross Split: %s" % pnstripped)
|
|
localdata.setVar('OVERRIDES', "pn-" + pnstripped[0] + ":" + d.getVar('OVERRIDES'))
|
|
|
|
if pname.find("-initial") != -1:
|
|
pnstripped = pname.split("-initial")
|
|
bb.note("initial Split: %s" % pnstripped)
|
|
localdata.setVar('OVERRIDES', "pn-" + pnstripped[0] + ":" + d.getVar('OVERRIDES'))
|
|
|
|
pdesc = localdata.getVar('DESCRIPTION')
|
|
pgrp = localdata.getVar('SECTION')
|
|
pversion = localdata.getVar('PV')
|
|
plicense = localdata.getVar('LICENSE')
|
|
psection = localdata.getVar('SECTION')
|
|
phome = localdata.getVar('HOMEPAGE')
|
|
prelease = localdata.getVar('PR')
|
|
pdepends = localdata.getVar('DEPENDS')
|
|
pbugtracker = localdata.getVar('BUGTRACKER')
|
|
ppe = localdata.getVar('PE')
|
|
psrcuri = localdata.getVar('SRC_URI')
|
|
maintainer = localdata.getVar('RECIPE_MAINTAINER')
|
|
|
|
pupver, pstatus = get_upstream_version_and_status()
|
|
|
|
if psrcuri:
|
|
psrcuri = psrcuri.split()[0]
|
|
else:
|
|
psrcuri = "none"
|
|
pdepends = "".join(pdepends.split("\t"))
|
|
pdesc = "".join(pdesc.split("\t"))
|
|
no_upgr_reason = d.getVar('RECIPE_NO_UPDATE_REASON')
|
|
lf = bb.utils.lockfile("%s.lock" % logfile)
|
|
with open(logfile, "a") as f:
|
|
writer = csv.writer(f, delimiter='\t')
|
|
writer.writerow([pname, pversion, pupver, plicense, psection, phome,
|
|
prelease, pdepends, pbugtracker, ppe, pdesc, pstatus, pupver,
|
|
psrcuri, maintainer, no_upgr_reason])
|
|
f.close()
|
|
bb.utils.unlockfile(lf)
|
|
}
|
|
|
|
addtask checkpkgall after do_checkpkg
|
|
do_checkpkgall[recrdeptask] = "do_checkpkgall do_checkpkg"
|
|
do_checkpkgall[recideptask] = "do_${BB_DEFAULT_TASK}"
|
|
do_checkpkgall[nostamp] = "1"
|
|
do_checkpkgall() {
|
|
:
|
|
}
|
|
|
|
addhandler distro_check_eventhandler
|
|
distro_check_eventhandler[eventmask] = "bb.event.BuildStarted"
|
|
python distro_check_eventhandler() {
|
|
"""initialize log files."""
|
|
import oe.distro_check as dc
|
|
result_file = dc.create_log_file(e.data, "distrocheck.csv")
|
|
return
|
|
}
|
|
|
|
addtask distro_check
|
|
do_distro_check[nostamp] = "1"
|
|
do_distro_check[vardepsexclude] += "DATETIME"
|
|
python do_distro_check() {
|
|
"""checks if the package is present in other public Linux distros"""
|
|
import oe.distro_check as dc
|
|
import shutil
|
|
if bb.data.inherits_class('native', d) or bb.data.inherits_class('cross', d) or bb.data.inherits_class('sdk', d) or bb.data.inherits_class('crosssdk', d) or bb.data.inherits_class('nativesdk',d):
|
|
return
|
|
|
|
localdata = bb.data.createCopy(d)
|
|
tmpdir = d.getVar('TMPDIR')
|
|
distro_check_dir = os.path.join(tmpdir, "distro_check")
|
|
logpath = d.getVar('LOG_DIR')
|
|
bb.utils.mkdirhier(logpath)
|
|
result_file = os.path.join(logpath, "distrocheck.csv")
|
|
datetime = localdata.getVar('DATETIME')
|
|
dc.update_distro_data(distro_check_dir, datetime, localdata)
|
|
|
|
# do the comparison
|
|
result = dc.compare_in_distro_packages_list(distro_check_dir, d)
|
|
|
|
# save the results
|
|
dc.save_distro_check_result(result, datetime, result_file, d)
|
|
}
|
|
|
|
addtask distro_checkall after do_distro_check
|
|
do_distro_checkall[recrdeptask] = "do_distro_checkall do_distro_check"
|
|
do_distro_checkall[recideptask] = "do_${BB_DEFAULT_TASK}"
|
|
do_distro_checkall[nostamp] = "1"
|
|
do_distro_checkall() {
|
|
:
|
|
}
|
|
#
|
|
#Check Missing License Text.
|
|
#Use this task to generate the missing license text data for pkg-report system,
|
|
#then we can search those recipes which license text isn't exsit in common-licenses directory
|
|
#
|
|
addhandler checklicense_eventhandler
|
|
checklicense_eventhandler[eventmask] = "bb.event.BuildStarted"
|
|
python checklicense_eventhandler() {
|
|
"""initialize log files."""
|
|
import csv
|
|
import oe.distro_check as dc
|
|
logfile = dc.create_log_file(e.data, "missinglicense.csv")
|
|
lf = bb.utils.lockfile("%s.lock" % logfile)
|
|
with open(logfile, "a") as f:
|
|
writer = csv.writer(f, delimiter='\t')
|
|
writer.writerow(['Package', 'License', 'MissingLicense'])
|
|
f.close()
|
|
bb.utils.unlockfile(lf)
|
|
return
|
|
}
|
|
|
|
addtask checklicense
|
|
do_checklicense[nostamp] = "1"
|
|
python do_checklicense() {
|
|
import csv
|
|
import shutil
|
|
logpath = d.getVar('LOG_DIR')
|
|
bb.utils.mkdirhier(logpath)
|
|
pn = d.getVar('PN')
|
|
logfile = os.path.join(logpath, "missinglicense.csv")
|
|
generic_directory = d.getVar('COMMON_LICENSE_DIR')
|
|
license_types = d.getVar('LICENSE')
|
|
for license_type in ((license_types.replace('+', '').replace('|', '&')
|
|
.replace('(', '').replace(')', '').replace(';', '')
|
|
.replace(',', '').replace(" ", "").split("&"))):
|
|
if not os.path.isfile(os.path.join(generic_directory, license_type)):
|
|
lf = bb.utils.lockfile("%s.lock" % logfile)
|
|
with open(logfile, "a") as f:
|
|
writer = csv.writer(f, delimiter='\t')
|
|
writer.writerow([pn, license_types, license_type])
|
|
f.close()
|
|
bb.utils.unlockfile(lf)
|
|
return
|
|
}
|
|
|
|
addtask checklicenseall after do_checklicense
|
|
do_checklicenseall[recrdeptask] = "do_checklicenseall do_checklicense"
|
|
do_checklicenseall[recideptask] = "do_${BB_DEFAULT_TASK}"
|
|
do_checklicenseall[nostamp] = "1"
|
|
do_checklicenseall() {
|
|
:
|
|
}
|