utils/getdeveloperlib.py: use relative paths for files

Using absolute paths within getdeveloperlib isn't very sensible, it
makes a lot more sense to handle everything as relative paths from the
top-level Buildroot source directory.

parse_developers() is changed to no longer take the base path as
argument: it is automatically calculated based on the location of
utils/getdeveloperlib.py. Then, the rest of the logic is adjusted to
use relative paths, and prepend them with the base "brpath" when
needed.

This commit allows pkg-stats to report correct developers information
even when executed from an out of tree directory.

Before this patch:

$ ~/buildroot/support/scripts/pkg-stats -p ipmitool --json out.json
$ cat out.json | jq '.packages.ipmitool.developers'
[]

$ cat out.json | jq '.defconfigs.stm32f469_disco'
{
  "name": "stm32f469_disco",
  "path": "configs/stm32f469_disco_defconfig",
  "developers": []
}

After this patch:

$ ~/buildroot/support/scripts/pkg-stats -p ipmitool --json out.json
$ cat out.json | jq '.packages.ipmitool.developers'
[
  "Floris Bos <bos@je-eigen-domein.nl>",
  "Heiko Thiery <heiko.thiery@gmail.com>"
]
$ cat out.json | jq '.defconfigs.stm32f469_disco'
{
  "name": "stm32f469_disco",
  "path": "configs/stm32f469_disco_defconfig",
  "developers": [
    "Christophe Priouzeau <christophe.priouzeau@st.com>"
  ]
}

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Tested-by: Heiko Thiery <heiko.thiery@gmail.com>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
This commit is contained in:
Thomas Petazzoni
2020-11-19 15:53:54 +01:00
parent 57ecb6c8eb
commit 40bb37bd70
3 changed files with 13 additions and 20 deletions

View File

@@ -1079,7 +1079,7 @@ def __main__():
print("Build package list ...") print("Build package list ...")
packages = get_pkglist(args.npackages, package_list) packages = get_pkglist(args.npackages, package_list)
print("Getting developers ...") print("Getting developers ...")
developers = parse_developers(brpath) developers = parse_developers()
print("Build defconfig list ...") print("Build defconfig list ...")
defconfigs = get_defconfig_list() defconfigs = get_defconfig_list()
for d in defconfigs: for d in defconfigs:

View File

@@ -45,10 +45,6 @@ def __main__():
print("No action specified") print("No action specified")
return return
# getdeveloperlib expects to be executed from the toplevel buildroot
# directory, which is one level up from this script
os.chdir(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..'))
devs = getdeveloperlib.parse_developers() devs = getdeveloperlib.parse_developers()
if devs is None: if devs is None:
sys.exit(1) sys.exit(1)
@@ -75,7 +71,6 @@ def __main__():
# Handle the files action # Handle the files action
if args.files is not None: if args.files is not None:
args.files = [os.path.abspath(f) for f in args.files]
for dev in devs: for dev in devs:
for f in args.files: for f in args.files:
if dev.hasfile(f): if dev.hasfile(f):

View File

@@ -6,6 +6,8 @@ import subprocess
import sys import sys
import unittest import unittest
brpath = os.path.normpath(os.path.join(os.path.dirname(__file__), ".."))
# #
# Patch parsing functions # Patch parsing functions
# #
@@ -94,14 +96,14 @@ def get_all_test_cases(suite):
yield (suite.__module__, suite.__class__.__name__) yield (suite.__module__, suite.__class__.__name__)
def list_unittests(path): def list_unittests():
"""Use the unittest module to retreive all test cases from a given """Use the unittest module to retreive all test cases from a given
directory""" directory"""
loader = unittest.TestLoader() loader = unittest.TestLoader()
suite = loader.discover(path) suite = loader.discover(os.path.join(brpath, "support", "testing"))
tests = {} tests = {}
for module, test in get_all_test_cases(suite): for module, test in get_all_test_cases(suite):
module_path = os.path.join(path, *module.split('.')) module_path = os.path.join("support", "testing", *module.split('.'))
tests.setdefault(module_path, []).append('%s.%s' % (module, test)) tests.setdefault(module_path, []).append('%s.%s' % (module, test))
return tests return tests
@@ -124,9 +126,7 @@ class Developer:
self.defconfigs = parse_developer_defconfigs(files) self.defconfigs = parse_developer_defconfigs(files)
def hasfile(self, f): def hasfile(self, f):
f = os.path.abspath(f)
for fs in self.files: for fs in self.files:
fs = os.path.abspath(fs)
if f.startswith(fs): if f.startswith(fs):
return True return True
return False return False
@@ -158,7 +158,7 @@ def parse_developer_packages(fnames):
patterns, and return a list of those packages.""" patterns, and return a list of those packages."""
packages = set() packages = set()
for fname in fnames: for fname in fnames:
for root, dirs, files in os.walk(fname): for root, dirs, files in os.walk(os.path.join(brpath, fname)):
for f in files: for f in files:
path = os.path.join(root, f) path = os.path.join(root, f)
if fname_get_package_infra(path): if fname_get_package_infra(path):
@@ -223,7 +223,7 @@ def parse_developer_runtime_tests(fnames):
# List all files recursively # List all files recursively
for fname in fnames: for fname in fnames:
if os.path.isdir(fname): if os.path.isdir(fname):
for root, _dirs, files in os.walk(fname): for root, _dirs, files in os.walk(os.path.join(brpath, fname)):
all_files += [os.path.join(root, f) for f in files] all_files += [os.path.join(root, f) for f in files]
else: else:
all_files.append(fname) all_files.append(fname)
@@ -237,15 +237,13 @@ def parse_developer_runtime_tests(fnames):
return runtimes return runtimes
def parse_developers(basepath=None): def parse_developers():
"""Parse the DEVELOPERS file and return a list of Developer objects.""" """Parse the DEVELOPERS file and return a list of Developer objects."""
developers = [] developers = []
linen = 0 linen = 0
if basepath is None:
basepath = os.getcwd()
global unittests global unittests
unittests = list_unittests(os.path.join(basepath, 'support/testing')) unittests = list_unittests()
with open(os.path.join(basepath, "DEVELOPERS"), "r") as f: with open(os.path.join(brpath, "DEVELOPERS"), "r") as f:
files = [] files = []
name = None name = None
for line in f: for line in f:
@@ -259,11 +257,11 @@ def parse_developers(basepath=None):
name = line[2:].strip() name = line[2:].strip()
elif line.startswith("F:"): elif line.startswith("F:"):
fname = line[2:].strip() fname = line[2:].strip()
dev_files = glob.glob(os.path.join(basepath, fname)) dev_files = glob.glob(os.path.join(brpath, fname))
if len(dev_files) == 0: if len(dev_files) == 0:
print("WARNING: '%s' doesn't match any file" % fname, print("WARNING: '%s' doesn't match any file" % fname,
file=sys.stderr) file=sys.stderr)
files += dev_files files += [os.path.relpath(f, brpath) for f in dev_files]
elif line == "": elif line == "":
if not name: if not name:
continue continue