Andreas Sandberg has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/37036 )
Change subject: util: Add a library to parser MAINTAINERS.yaml
......................................................................
util: Add a library to parser MAINTAINERS.yaml
Add a very simple library to parse MAINTAINERS.yaml. There are
currently no tools that use the library, but it can be tested using
`python3 -m "maint.lib.maintainers"` from within the util directory.
Change-Id: Id2edff94451f27e0b601994d198d0647325e4b35
Signed-off-by: Andreas Sandberg <andreas.sandb...@arm.com>
---
A util/maint/lib/__init__.py
A util/maint/lib/maintainers.py
2 files changed, 128 insertions(+), 0 deletions(-)
diff --git a/util/maint/lib/__init__.py b/util/maint/lib/__init__.py
new file mode 100644
index 0000000..e5a0d9b
--- /dev/null
+++ b/util/maint/lib/__init__.py
@@ -0,0 +1 @@
+#!/usr/bin/env python3
diff --git a/util/maint/lib/maintainers.py b/util/maint/lib/maintainers.py
new file mode 100644
index 0000000..cffcee5
--- /dev/null
+++ b/util/maint/lib/maintainers.py
@@ -0,0 +1,127 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2017-2018 Arm Limited
+# All rights reserved
+#
+# The license below extends only to copyright in the software and shall
+# not be construed as granting a license to any other intellectual
+# property including but not limited to intellectual property relating
+# to a hardware implementation of the functionality of the software
+# licensed hereunder. You may use the software subject to the license
+# terms below provided that you ensure that this notice is replicated
+# unmodified and in its entirety in all distributions of the software,
+# modified or unmodified, in source code or in binary form.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met: redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer;
+# redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution;
+# neither the name of the copyright holders nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import email.utils
+import enum
+import os
+from typing import Any, Dict, Iterator, List, Mapping, Optional, TextIO, \
+ Tuple, Union
+
+import yaml
+
+class Status(enum.Enum):
+ MAINTAINED = enum.auto()
+ ORPHANED = enum.auto()
+
+ @classmethod
+ def from_str(cls, key: str) -> 'Status':
+ _status_dict = {
+ 'maintained': cls.MAINTAINED,
+ 'orphaned': cls.ORPHANED,
+ }
+ return _status_dict[key]
+
+ def __str__(self) -> str:
+ return {
+ Status.MAINTAINED: 'maintained',
+ Status.ORPHANED: 'orphaned',
+ }[self]
+
+class Subsystem(object):
+ tag: str
+ status: Status
+ maintainers: List[Tuple[str, str]] # Name, email
+ description: str
+
+ def __init__(self, tag: str,
+ maintainers: Optional[Iterator[Tuple[str, str]]],
+ description: str = '',
+ status: Status = Status.ORPHANED):
+ self.tag = tag
+ self.status = status
+ self.maintainers = list(maintainers) if maintainers is not None
else []
+ self.description = description if description is not None else ''
+
+class Maintainers(object):
+ DEFAULT_MAINTAINERS = os.path.join(os.path.dirname(__file__),
+ '../../../MAINTAINERS')
+
+ _subsystems: Dict[str, Subsystem] # tag -> Subsystem
+
+ def __init__(self, path_or_file: Optional[Union[TextIO, str]] = None):
+ maintainers = Maintainers._load_maintainers_file(path_or_file)
+ self._subsystems = {}
+ for tag, maint in maintainers.items():
+ self._subsystems[tag] = Maintainers._parse_subsystem(tag,
maint)
+
+ @classmethod
+ def _load_maintainers_file(cls,
+ path_or_file: Optional[Union[TextIO, str]])
\
+ -> Mapping[str, Any]:
+ if path_or_file is None:
+ path_or_file = cls.DEFAULT_MAINTAINERS
+
+ if isinstance(path_or_file, str):
+ with open(path_or_file, 'r') as fin:
+ return yaml.load(fin)
+ else:
+ return yaml.load(path_or_file)
+
+ @classmethod
+ def _parse_subsystem(cls, tag: str, ydict: Mapping[str, Any]) ->
Subsystem:
+ raw_maintainers = ydict.get('maintainers', None)
+ maintainers = map(email.utils.parseaddr, raw_maintainers) \
+ if raw_maintainers is not None else []
+ status = Status.from_str(ydict.get('status', 'orphaned'))
+ return Subsystem(tag, maintainers=maintainers, status=status,
+ description=ydict.get('desc', ''))
+
+ def __iter__(self) -> Iterator[Tuple[str, Subsystem]]:
+ return iter(self._subsystems.items())
+
+def _main():
+ maintainers = Maintainers()
+ for tag, subsys in maintainers:
+ print(f'{tag}: {subsys.description}')
+ print(f' Status: {subsys.status}')
+ print(f' Maintainers:')
+ for maint in subsys.maintainers:
+ print(f' - {maint[0]} <{maint[1]}>')
+ print()
+
+if __name__ == '__main__':
+ _main()
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/37036
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: Id2edff94451f27e0b601994d198d0647325e4b35
Gerrit-Change-Number: 37036
Gerrit-PatchSet: 1
Gerrit-Owner: Andreas Sandberg <andreas.sandb...@arm.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s