Show SIG repositories on the SIGs page

Drop the old SIG Repos html file and redirect to
the SIG landing page. It's more user-friendly to
display all relevant SIG info from one place;

We continue to use sig-repos.yaml file
to populate the SIG table with the repository information;
this data file is also used by the election tools to
acknowledge contributions to SIG repos.

Change-Id: I2df3a70a4426687549cd21296d2866a27ca55edf
Assisted-By: Claude Code
Signed-off-by: Goutham Pacha Ravi <gouthampravi@gmail.com>
This commit is contained in:
Goutham Pacha Ravi 2025-11-17 11:58:55 -08:00
parent 1555895eac
commit f9eb858016
9 changed files with 44 additions and 38 deletions

View file

@ -8,3 +8,4 @@ redirect 301 /tc/goals/queens/ /tc/goals/selected/queens/
redirect 301 /tc/goals/rocky/ /tc/goals/selected/rocky/
redirect 301 /tc/goals/stein/ /tc/goals/selected/stein/
redirect 301 /tc/goals/train/ /tc/goals/selected/train/
redirect 301 /tc/reference/sig-repos.html /tc/reference/sigs/index.html

View file

@ -33,6 +33,7 @@ class SIGTable(Table):
option_spec = {'class': directives.class_option,
'name': directives.unchanged,
'datafile': directives.unchanged,
'reposfile': directives.unchanged,
}
def run(self):
@ -49,21 +50,37 @@ class SIGTable(Table):
return [error]
# Now find the real path to the file, relative to where we are.
rel_filename, filename = env.relfn2path(datafile)
_, filename = env.relfn2path(datafile)
LOG.info('loading sigtable')
LOG.info('reading %s' % filename)
with open(filename, 'r') as f:
with open(filename, 'r', encoding='utf-8') as f:
_teams_yaml = yaml.safe_load(f.read())
# Load repos data if reposfile is provided
_repos_yaml = {}
reposfile = self.options.get('reposfile')
if reposfile:
_, repos_filename = env.relfn2path(reposfile)
LOG.info('reading repos from %s' % repos_filename)
with open(repos_filename, 'r', encoding='utf-8') as f:
_repos_yaml = yaml.safe_load(f.read())
# Adjust headers and widths if repos are included
headers = list(self.HEADERS)
widths = list(self.WIDTHS)
if _repos_yaml:
headers.append('Repositories')
widths.append(60)
table = nodes.table()
# Set up the column specifications
# based on the widths.
tgroup = nodes.tgroup(cols=len(self.HEADERS))
tgroup = nodes.tgroup(cols=len(headers))
table += tgroup
tgroup.extend(nodes.colspec(colwidth=col_width)
for col_width in self.WIDTHS)
for col_width in widths)
# Set the headers
thead = nodes.thead()
@ -72,7 +89,7 @@ class SIGTable(Table):
thead += row_node
row_node.extend(
nodes.entry(h, nodes.paragraph(text=h))
for h in self.HEADERS
for h in headers
)
# The body of the table is made up of rows.
@ -88,7 +105,7 @@ class SIGTable(Table):
for team in sorted(all_teams.keys()):
trow = nodes.row()
# Iterate over the headers in the same order every time.
for h in self.HEADERS:
for h in headers:
if h.lower() == "name":
cell = "<a href=\"%s\">%s</a>" % (all_teams[team]['url'],
team)
@ -108,6 +125,16 @@ class SIGTable(Table):
cell = "".join(chairs)
entry = nodes.entry()
para = nodes.raw('', cell, format='html')
elif h.lower() == "repositories":
# Add repositories column if available
repos = []
if team in _repos_yaml:
for repo_item in _repos_yaml[team]:
repo = repo_item['repo']
repos.append('<a href="https://opendev.org/%s">%s</a>' % (repo, repo))
cell = '<br />'.join(repos) if repos else ''
entry = nodes.entry()
para = nodes.raw('', cell, format='html')
else:
# Get the cell value from the row data, replacing None
# in re match group with empty string.

View file

@ -1,16 +0,0 @@
.. -*- mode: rst -*-
.. This template renders a table showing repositories under the maintainership of OpenStack SIGs
.. list-table::
:header-rows: 1
:align: left
- * SIG
* Repositories
{%- for sig in data %}
- * {{ sig }}
* {%- for item in data[sig] %}
| `{{ item['repo'] }} <https://opendev.org/{{ item['repo'] }}>`_
{%- endfor %}
{%- endfor %}

View file

@ -8,3 +8,4 @@
/tc/goals/rocky/ 301 /tc/goals/selected/rocky/
/tc/goals/stein/ 301 /tc/goals/selected/stein/
/tc/goals/train/ 301 /tc/goals/selected/train/
/tc/reference/sig-repos.html 301 /tc/reference/sigs/index.html

View file

@ -234,7 +234,7 @@ The TC seats are elected by the Active Contributors ("AC"), who are
a subset of the Foundation Individual Members. Individual Members who
committed a change to a repository under the governance of the
OpenStack Technical Committee (see: :ref:`projects`,
:ref:`tc-repos` and :ref:`sig-repos`) over the
:ref:`tc-repos` and :doc:`SIG repositories </reference/sigs/index>`) over the
last two 6-month release cycles are automatically considered AC by their
technical contributions which are easy to mine and count. Specific
contributors who did not have a change recently accepted in one of the

View file

@ -65,7 +65,7 @@ co-leads. Since they are not directly in charge of producing OpenStack, only
limited accountability is required, and SIGs do not have any required named
liaisons.
SIGs :doc:`can own git repositories </reference/sig-repos>` and produce
SIGs :doc:`can own git repositories </reference/sigs/index>` and produce
software, but that software will be considered add-on software to the main
"OpenStack" software releases. Therefore
SIGs deliverables are not part of the coordinated release, and will not leverage

View file

@ -33,7 +33,6 @@ Reference documents which need to be revised over time.
house-rules
comparison-of-official-group-structures
working-groups
sig-repos
tc-guide
OpenStack-name-in-external-services
election-exceptions

View file

@ -1,9 +0,0 @@
.. _sig-repos:
===============================
Repositories maintained by SIGs
===============================
.. datatemplate:yaml::
:source: sigs-repos.yaml
:template: ../../templates/sigs_repos_table.tmpl

View file

@ -17,18 +17,21 @@ of the OpenStack software release itself). Contributions to a SIG
grant voting rights for the Technical Committee elections, in the
same way contributing to an OpenStack project team does.
.. toctree::
:maxdepth: 3
sig-guideline
.. sigtable::
:datafile: sigs.yaml
:reposfile: ../sigs-repos.yaml
.. toctree::
:hidden:
tact-sig
.. toctree::
:maxdepth: 4
sig-guideline
Retired SIGs
============