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 <pearl1...@gmail.com>
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)

Reply via email to