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)