This is an automated email from the ASF dual-hosted git repository.
dahn pushed a commit to branch staging-site
in repository https://gitbox.apache.org/repos/asf/cloudstack-www.git
The following commit(s) were added to refs/heads/staging-site by this push:
new e11806dda Automate generation of who.md file from list maintained by
ASF (#292)
e11806dda is described below
commit e11806dda6f1515defd82cb89961ac7c3f0f31ad
Author: Pearl Dsilva <[email protected]>
AuthorDate: Fri Aug 1 09:35:27 2025 -0400
Automate generation of who.md file from list maintained by ASF (#292)
---
README.md | 23 ++-
requirements.txt | 3 +
source/generate_who.py | 120 +++++++++++++++
src/pages/who.md | 397 +++++++++++++++++++++++++------------------------
4 files changed, 347 insertions(+), 196 deletions(-)
diff --git a/README.md b/README.md
index c1018d5a9..8858e6a1d 100644
--- a/README.md
+++ b/README.md
@@ -51,7 +51,7 @@ automation that can publish changes merged to 'main' branch
being automatically
published to the 'asf-site'. see the procedure below.
-## publishing procedure
+## Publishing procedure
- create a change
- test your change according to [the previous
chapter](#building-and-publishing)
@@ -75,3 +75,24 @@ git push
- wait for asf-site to be updated and published to the main site
- check again
- go to sleep
+
+
+## Updating the who.md file
+
+Every time new committers or PMC members are invited to CloudStack, the parent
list maintained at:
https://people.apache.org/committers-by-project.html#cloudstack is updated.
This can be used to automate the generation of who.md file which is used at
https://cloudstack.staged.apache.org/who/
+
+To generate the who.md file, follow the given steps:
+
+1. Install the necessary dependencies:
+
+```
+pip install -r requirements.txt
+```
+
+2. Run the `generate_who.py` script
+
+```
+python3 source/generate_who.py
+```
+
+NOTE: Currently, the PMC Chair's name needs to be manually updated in the
script.
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 000000000..559371ed8
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,3 @@
+requests>=2.25.0
+beautifulsoup4>=4.9.0
+GitPython>=3.1.0
diff --git a/source/generate_who.py b/source/generate_who.py
new file mode 100644
index 000000000..472a9d9df
--- /dev/null
+++ b/source/generate_who.py
@@ -0,0 +1,120 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+import os
+import git
+import requests
+from bs4 import BeautifulSoup
+import locale
+
+# Set locale to handle special characters properly (if necessary)
+locale.setlocale(locale.LC_COLLATE, 'en_US.UTF-8')
+
+def fetch_cloudstack_members():
+ url = "https://people.apache.org/committers-by-project.html#cloudstack"
+ response = requests.get(url)
+ response.encoding = 'utf-8'
+ if response.status_code != 200:
+ print("Failed to fetch the page")
+ return None, None
+
+ soup = BeautifulSoup(response.text, "html.parser")
+
+ pmc_section = soup.find("h2", {"id": "cloudstack-pmc"})
+ committers_section = soup.find("h2", {"id": "cloudstack"})
+
+ pmc_members = []
+ committers = []
+
+ if pmc_section:
+ pmc_table = pmc_section.find_next("table")
+ if pmc_table:
+ rows = pmc_table.find_all("tr")[1:] # Skip header row
+ for row in rows:
+ columns = row.find_all("td")
+ if len(columns) >= 2:
+ name = columns[1].text.strip()
+ svn_id = columns[0].text.strip()
+ pmc_members.append((name, svn_id))
+
+ if committers_section:
+ committers_table = committers_section.find_next("table")
+ if committers_table:
+ rows = committers_table.find_all("tr")[1:] # Skip header row
+ for row in rows:
+ columns = row.find_all("td")
+ if len(columns) >= 2:
+ name = columns[1].text.strip()
+ svn_id = columns[0].text.strip()
+ committers.append((name, svn_id))
+
+ return pmc_members, committers
+
+def get_repo_path():
+ try:
+ # Find the current working directory
+ current_dir = os.getcwd()
+
+ # Check if it's a Git repository
+ repo = git.Repo(current_dir)
+
+ # Get the absolute path of the repository
+ repo_path = repo.git.rev_parse("--show-toplevel")
+ return repo_path
+ except git.exc.InvalidGitRepositoryError:
+ print("Not a git repository.")
+ return None
+
+def generate_markdown(pmc_members, committers):
+ # Sort the members alphabetically by their names
+ pmc_members.sort(key=lambda x: locale.strxfrm(x[0].lower()))
+ committers.sort(key=lambda x: locale.strxfrm(x[0].lower()))
+ repo_path = get_repo_path()
+ with open(repo_path + "/src/pages/who.md", "w", encoding="utf-8") as f:
+ f.write("""---
+title: Apache CloudStack Project Membership
+---
+
+# Apache CloudStack Project Members
+
+PMC Information: https://projects.apache.org/committee.html?cloudstack
+
+Board Minutes: https://whimsy.apache.org/board/minutes/CloudStack.html
+
+""")
+
+ pmc_chair = "Nicolás Vázquez (nvazquez)"
+ f.write(f"**PMC Chair**: {pmc_chair}\n\n")
+
+ f.write("The following data is subject to change. The up-to-date
information can be found on <a
href=\"http://people.apache.org/committers-by-project.html#cloudstack-pmc\">the
Apache Peoples site</a>:\n\n")
+
+ f.write("**PMC members (also in the [Committers](#committers)
group)**:\n\n")
+ for name, id in pmc_members:
+ f.write(f"- {name} ({id})\n")
+
+ f.write("\n**<a name=\"committers\">Committers</a>**:\n\n")
+ for name, id in committers:
+ f.write(f"- {name} ({id})\n")
+ print("who.md file has been generated successfully!")
+
+def main():
+ pmc_members, committers = fetch_cloudstack_members()
+ if pmc_members and committers:
+ generate_markdown(pmc_members, committers)
+
+if __name__ == "__main__":
+ main()
diff --git a/src/pages/who.md b/src/pages/who.md
index b7950f296..7c169edc2 100644
--- a/src/pages/who.md
+++ b/src/pages/who.md
@@ -14,202 +14,209 @@ The following data is subject to change. The up-to-date
information can be found
**PMC members (also in the [Committers](#committers) group)**:
-- Abhishek Kumar (shwstppr)
-- Alena Prokharchyk (alena1108)
-- Alex Huang (ahuang)
-- Alex Karasulu (akarasulu)
-- Andrija Panic (andrijapanic)
-- Animesh (animesh)
-- Boris Schrijver (boris)
-- Boris Stoyanov (bstoyanov)
-- Bruno Demion (milamber)
-- Chip Childers (chipchilders)
-- Chiradeep Vittal (chiradeep)
-- Daan (dahn)
-- Daniel Augusto Veronezi Salvador (gutoveronezi)
-- David Nalley (ke4qqq)
-- Disheng Su (edison)
-- Erik Weber (erikw)
-- Gabriel Beims Bräscher (gabriel)
-- Giles Sirett (giles)
-- Go Chiba (gochiba)
-- Harikrishna Patnala (harikrishna)
-- Hugo Trippaers (hugo)
-- Ian Duffy (duffy)
-- Ilya Musayev (ilya)
-- Ivet Petrova (ivet)
-- Joe Brockmeier (jzb)
-- John Burwell (jburwell)
-- John Kinsella (jlk)
-- Karen Vuong (karenv)
-- Kevin Kluge (kluge)
-- Marcus Sorensen (mlsorensen)
-- Mark R. Hinkle (mrhinkle)
-- Matt Richard Hogstrom (hogstrom)
-- Mike Tutkowski (mtutkowski)
-- Mohammad Nour El-Din (mnour)
-- Nathan Johnson (nathanejohnson)
-- Nicolás Vázquez (nvazquez)
-- Nux (nux)
-- Olivier Lamy (olamy)
-- Paul Angus (paul_a)
-- Pierre-Luc Dion (pdion891)
-- Prasanna (tsp)
-- Rafael Weingärtner (rafael)
-- Rajani Karuturi (rajani)
-- Remi Bergsma (remi)
-- Rene Moser (resmo)
-- Rohit Yadav (rohit)
-- Sebastien Goasguen (sebgoa)
-- Simon Weller (sweller)
-- Suresh Anaparti (sureshanaparti)
-- Sven Vogel (svogel)
-- Syed Ahmed (syed)
-- Wei Zhou (weizhou)
-- Wido den Hollander (widodh)
-- Wilder Rodrigues (ekho)
-- Will Stevens (swill)
-- William Chan (willchan)
+- Abhishek Kumar (shwstppr)
+- Alena Prokharchyk (alena1108)
+- Alex Huang (ahuang)
+- Alex Karasulu (akarasulu)
+- Alexandre Mattioli (alexandremattioli)
+- Andrija Panic (andrijapanic)
+- Animesh (animesh)
+- Boris Schrijver (boris)
+- Boris Stoyanov (bstoyanov)
+- Bruno Demion (milamber)
+- Chip Childers (chipchilders)
+- Chiradeep Vittal (chiradeep)
+- Daan (dahn)
+- Daniel Augusto Veronezi Salvador (gutoveronezi)
+- David Nalley (ke4qqq)
+- Disheng Su (edison)
+- Erik Weber (erikw)
+- Gabriel Beims Bräscher (gabriel)
+- Giles Sirett (giles)
+- Go Chiba (gochiba)
+- Harikrishna Patnala (harikrishna)
+- Hugo Trippaers (hugo)
+- Ian Duffy (duffy)
+- Ilya Musayev (ilya)
+- Ivet Petrova (ivet)
+- João Jandre Paraquetti (joao)
+- Joe Brockmeier (jzb)
+- John Burwell (jburwell)
+- John Kinsella (jlk)
+- Karen Vuong (karenv)
+- Kevin Kluge (kluge)
+- Marcus Sorensen (mlsorensen)
+- Mark R. Hinkle (mrhinkle)
+- Matt Richard Hogstrom (hogstrom)
+- Mike Tutkowski (mtutkowski)
+- Mohammad Nour El-Din (mnour)
+- Nathan Johnson (nathanejohnson)
+- Nicolás Vázquez (nvazquez)
+- Nux (nux)
+- Olivier Lamy (olamy)
+- Paul Angus (paul_a)
+- Pearl Dsilva (pearl11594)
+- Pierre-Luc Dion (pdion891)
+- Prasanna (tsp)
+- Rafael Weingärtner (rafael)
+- Rajani Karuturi (rajani)
+- Remi Bergsma (remi)
+- Rene Moser (resmo)
+- Rohit Yadav (rohit)
+- Sebastien Goasguen (sebgoa)
+- Simon Weller (sweller)
+- Slavka Peleva (slavkap)
+- Suresh Anaparti (sureshanaparti)
+- Sven Vogel (svogel)
+- Syed Ahmed (syed)
+- Wei Zhou (weizhou)
+- Wido den Hollander (widodh)
+- Wilder Rodrigues (ekho)
+- Will Stevens (swill)
+- William Chan (willchan)
**<a name="committers">Committers</a>**:
-- Abhinandan Prateek (aprateek)
-- Abhishek Kumar (shwstppr)
-- Ahmad Emneina (ahmad)
-- Alena Prokharchyk (alena1108)
-- Alex Huang (ahuang)
-- Alex Karasulu (akarasulu)
-- Alexandre Mattioli (alexandremattioli)
-- Amogh Vasekar (amoghvk)
-- Andrija Panic (andrijapanic)
-- Anh Tu Nguyen (tuna)
-- Animesh (animesh)
-- Anthony Xu (anthonyxu)
-- Boris Schrijver (boris)
-- Boris Stoyanov (bstoyanov)
-- Brett Porter (brett)
-- Brian Federle (bfederle)
-- Bruno Demion (milamber)
-- Bryan Lima (bryan)
-- Chip Childers (chipchilders)
-- Chiradeep Vittal (chiradeep)
-- Chris Suich (csuich2)
-- Clayton Weise (claytonweise)
-- Daan (dahn)
-- Dag Sonstebo (dsonstebo)
-- Daniel Augusto Veronezi Salvador (gutoveronezi)
-- Darren Shepherd (darren)
-- Dave Cahill (dcahill)
-- David Jumani (davidjumani)
-- David Nalley (ke4qqq)
-- Demetrius Tsitrelis (demetriust)
-- Dennis Konrad (dkonrad)
-- Devdeep Singh (devdeep)
-- Disheng Su (edison)
-- Erik Weber (erikw)
-- Fabricio Duarte Junior (fabricio)
-- Frank Maximus (fmaximus)
-- Funs Kessen (snuf)
-- Gabriel Beims Bräscher (gabriel)
-- Gaurav Nandkumar Aradhye (gaurav)
-- Gavin Lee (gavinlee)
-- Geoff Higginbottom (higster)
-- Giles Sirett (giles)
-- Girish Prabhakar Shilamkar (girish)
-- Go Chiba (gochiba)
-- Harikrishna Patnala (harikrishna)
-- Hiroaki Kawai (kawai)
-- Hugo Trippaers (hugo)
-- Ian Duffy (duffy)
-- Ilya Musayev (ilya)
-- Isaac Chiang (isaacchiang)
-- Ivet Petrova (ivet)
-- Jason Bausewein (jbausewein)
-- Jayapal (jayapal)
-- Jessica Tomechak (jtomechak)
-- Jessica Wang (jessicawang)
-- Jim Jagielski (jim)
-- Jithin Raju (rajujith)
-- Joe Brockmeier (jzb)
-- John Bampton (johnbam)
-- John Burwell (jburwell)
-- John Kinsella (jlk)
-- João Jandre Paraquetti (joao)
-- Karen Vuong (karenv)
-- Kelcey Damage (kdamage)
-- Kelven Yang (kelveny)
-- Kevin Kluge (kluge)
-- Kiran Chavala (kiranchavala)
-- Kirk Kosinski (kirk)
-- Kishan (kishan)
-- Koushik Das (koushik)
-- Laszlo Hornyak (kocka)
-- Likitha Shetty (likithas)
-- Marc-Aurèle Brothier (marcaurele)
-- Marco Sinhoreli (msinhore)
-- Marcus Sorensen (mlsorensen)
-- Mark R. Hinkle (mrhinkle)
-- Matt Richard Hogstrom (hogstrom)
-- Mice Xia (mice)
-- Mike Tutkowski (mtutkowski)
-- Min Chen (mchen)
-- Mohammad Nour El-Din (mnour)
-- Murali Mohan Reddy (muralireddy)
-- Nathan Johnson (nathanejohnson)
-- Nguyen Mai Hoang (hoangnm)
-- Nicolás Vázquez (nvazquez)
-- Nitin (nitin)
-- Noa Resare (noa)
-- Nux (nux)
-- Olga Smola (olgasmola)
-- Olivier Lamy (olamy)
-- Paul Angus (paul_a)
-- Pearl Dsilva (pearl11594)
-- Phong Nguyen (pnguyen)
-- Pierre-Luc Dion (pdion891)
-- Pierre-Yves Ritschard (pyr)
-- Prachi Damle (prachidamle)
-- Pranav Saxena (pranavs)
-- Prasanna (tsp)
-- Radhika Nair (radhika)
-- Rafael Weingärtner (rafael)
-- Rajani Karuturi (rajani)
-- Rajesh Battala (rajeshbattala)
-- Rakesh Venkatesh (rakeshv)
-- Remi Bergsma (remi)
-- Rene Moser (resmo)
-- Rene Peinthor (rp9)
-- Rohit Yadav (rohit)
-- Sailaja Mada (sailajamada)
-- Saksham Srivastava (saksham)
-- Sam Robertson (slriv)
-- Sangeetha Hariharan (sangeethah)
-- Sanjay Tripathi (sanjaytripathi)
-- Sanjeev Neelarapu (sanjeev)
-- Santhosh (santhoshedukulla)
-- Sateesh Chodapuneedi (sateesh)
-- Sebastien Goasguen (sebgoa)
-- Sergey Levitskiy (serg38)
-- Sheng Yang (yasker)
-- Simon Weller (sweller)
-- Sina Kashipazha (soreana)
-- Slavka Peleva (slavkap)
-- Sonny Heng Chhen (schhen)
-- Sowmya Krishnan (sowmya)
-- Srikanteswararao Talluri (talluri)
-- Sudhap (sudhap)
-- Suresh Anaparti (sureshanaparti)
-- Sven Vogel (svogel)
-- Syed Ahmed (syed)
-- Toshiaki Hatano (haeena)
-- Venkata Swamy (swamy)
-- Vijayendra Bhamidipati (vijayendrabvs)
+- Abhinandan Prateek (aprateek)
+- Abhishek Kumar (shwstppr)
+- Ahmad Emneina (ahmad)
+- Alena Prokharchyk (alena1108)
+- Alex Huang (ahuang)
+- Alex Karasulu (akarasulu)
+- Alexandre Mattioli (alexandremattioli)
+- Amogh Vasekar (amoghvk)
+- Andrija Panic (andrijapanic)
+- Anh Tu Nguyen (tuna)
+- Animesh (animesh)
+- Anthony Xu (anthonyxu)
+- Bernardo De Marco Gonçalves (bernardodemarco)
+- Boris Schrijver (boris)
+- Boris Stoyanov (bstoyanov)
+- Brett Porter (brett)
+- Brian Federle (bfederle)
+- Bruno Demion (milamber)
+- Bryan Lima (bryan)
+- Chip Childers (chipchilders)
+- Chiradeep Vittal (chiradeep)
+- Chris Suich (csuich2)
+- Clayton Weise (claytonweise)
+- CodeBleu (codebleu)
+- Daan (dahn)
+- Dag Sonstebo (dsonstebo)
+- Daniel Augusto Veronezi Salvador (gutoveronezi)
+- Darren Shepherd (darren)
+- Dave Cahill (dcahill)
+- David Jumani (davidjumani)
+- David Nalley (ke4qqq)
+- Demetrius Tsitrelis (demetriust)
+- Dennis Konrad (dkonrad)
+- Devdeep Singh (devdeep)
+- Disheng Su (edison)
+- Erik Weber (erikw)
+- Fabricio Duarte Junior (fabricio)
+- Frank Maximus (fmaximus)
+- Funs Kessen (snuf)
+- Gabriel Beims Bräscher (gabriel)
+- Gaurav Nandkumar Aradhye (gaurav)
+- Gavin Lee (gavinlee)
+- Geoff Higginbottom (higster)
+- Giles Sirett (giles)
+- Girish Prabhakar Shilamkar (girish)
+- Go Chiba (gochiba)
+- Harikrishna Patnala (harikrishna)
+- Hiroaki Kawai (kawai)
+- Hugo Trippaers (hugo)
+- Ian Duffy (duffy)
+- Ilya Musayev (ilya)
+- Isaac Chiang (isaacchiang)
+- Ivet Petrova (ivet)
+- Jason Bausewein (jbausewein)
+- Jayapal (jayapal)
+- Jessica Tomechak (jtomechak)
+- Jessica Wang (jessicawang)
+- Jim Jagielski (jim)
+- Jithin Raju (rajujith)
+- João Jandre Paraquetti (joao)
+- Joe Brockmeier (jzb)
+- John Bampton (johnbam)
+- John Burwell (jburwell)
+- John Kinsella (jlk)
+- Karen Vuong (karenv)
+- Kelcey Damage (kdamage)
+- Kelven Yang (kelveny)
+- Kevin Kluge (kluge)
+- Kiran Chavala (kiranchavala)
+- Kirk Kosinski (kirk)
+- Kishan (kishan)
+- Koushik Das (koushik)
+- Laszlo Hornyak (kocka)
+- Likitha Shetty (likithas)
+- Marc-Aurèle Brothier (marcaurele)
+- Marco Sinhoreli (msinhore)
+- Marcus Sorensen (mlsorensen)
+- Mark R. Hinkle (mrhinkle)
+- Matt Richard Hogstrom (hogstrom)
+- Mice Xia (mice)
+- Mike Tutkowski (mtutkowski)
+- Min Chen (mchen)
+- Mohammad Nour El-Din (mnour)
+- Murali Mohan Reddy (muralireddy)
+- Nathan Johnson (nathanejohnson)
+- Nguyen Mai Hoang (hoangnm)
+- Nicolás Vázquez (nvazquez)
+- Nitin (nitin)
+- Noa Resare (noa)
+- Nux (nux)
+- Olga Smola (olgasmola)
+- Olivier Lamy (olamy)
+- Paul Angus (paul_a)
+- Pearl Dsilva (pearl11594)
+- Phong Nguyen (pnguyen)
+- Pierre-Luc Dion (pdion891)
+- Pierre-Yves Ritschard (pyr)
+- Prachi Damle (prachidamle)
+- Pranav Saxena (pranavs)
+- Prasanna (tsp)
+- Radhika Nair (radhika)
+- Rafael Weingärtner (rafael)
+- Rajani Karuturi (rajani)
+- Rajesh Battala (rajeshbattala)
+- Rakesh Venkatesh (rakeshv)
+- Remi Bergsma (remi)
+- Rene Moser (resmo)
+- Rene Peinthor (rp9)
+- Rohit Yadav (rohit)
+- Sailaja Mada (sailajamada)
+- Saksham Srivastava (saksham)
+- Sam Robertson (slriv)
+- Sangeetha Hariharan (sangeethah)
+- Sanjay Tripathi (sanjaytripathi)
+- Sanjeev Neelarapu (sanjeev)
+- Santhosh (santhoshedukulla)
+- Sateesh Chodapuneedi (sateesh)
+- Sebastien Goasguen (sebgoa)
+- Sergey Levitskiy (serg38)
+- Sheng Yang (yasker)
+- Simon Weller (sweller)
+- Sina Kashipazha (soreana)
+- Slavka Peleva (slavkap)
+- Sonny Heng Chhen (schhen)
+- Sowmya Krishnan (sowmya)
+- Srikanteswararao Talluri (talluri)
+- Sudhap (sudhap)
+- Suresh Anaparti (sureshanaparti)
+- Sven Vogel (svogel)
+- Swen Brueseke (sbrueseke)
+- Syed Ahmed (syed)
+- Toshiaki Hatano (haeena)
+- Venkata Swamy (swamy)
+- Vijayendra Bhamidipati (vijayendrabvs)
- Vishesh Jindal (vishesh)
-- Vladimir Petrov (vladi)
-- Wei Zhou (weizhou)
-- Wido den Hollander (widodh)
-- Wilder Rodrigues (ekho)
-- Will Stevens (swill)
-- William Chan (willchan)
-- Xin Zhang (frankzhang)
-- Yoshikazu Nojima (ynojima)
+- Vladimir Petrov (vladi)
+- Wei Zhou (weizhou)
+- Wido den Hollander (widodh)
+- Wilder Rodrigues (ekho)
+- Will Stevens (swill)
+- William Chan (willchan)
+- Xin Zhang (frankzhang)
+- Yoshikazu Nojima (ynojima)