diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 00000000000..981de55b903 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,141 @@ +# Authors of apache/sedona + +## The List of Contributors sorted by number of commits (as of 2025-03-30 141a3682) + + 913 Jia Yu + 167 John Bampton + 130 Kristin Cowalcijk + 57 Nilesh Gajwani + 56 Furqaan Khan + 40 jinxuan wu + 36 Furqaanahmed Khan + 35 zongsizhang + 34 Kengo Seki + 33 dependabot[bot] + 28 Masha Basmanova + 27 Pranav Toggi + 27 Feng Zhang + 26 Martin Andersson + 23 Mohamed Sarwat + 20 zongsi zhang + 18 James Willis + 18 Junhao Liu + 17 Jinxuan Wu + 16 gregleleu + 14 Paweł Kociński + 13 Netanel Malka + 10 Adam Binford + 10 Douglas Dennis + 10 kanchanchy + 9 Matthew Powers + 8 Sachio Wakai + 8 Yitao Li + 8 Mo Sarwat + 7 zongsi.zhang + 6 Ana Caroline Ferreira + 6 Magdalena + 6 Paweł Tokaj + 5 Kontinuation + 5 Erni Durdevic + 4 Omkar Kaptan + 4 Dewey Dunnington + 3 Avshalom Orenstein + 3 Kanchan Chowdhury + 3 Kelly-Ann Dolor + 3 Tanel Kiis + 3 Wrussia + 3 Michael Merg + 2 Anton Peniaziev + 2 BarbieQkiller + 2 Brian Rice + 2 Dan + 2 Dan Corbiani + 2 Emmanuel Ferdman + 2 HuiWang + 2 Lucas C + 2 Merijn + 2 Paul Wu + 2 Pawel + 2 Pawel Kocinski + 2 Sebastian Eckweiler + 2 StepSecurity Bot + 2 Zhenghua Gao + 2 aggunr + 2 awadhesh singh + 2 chenpengchuan + 2 freamdx + 2 jiayuasu + 2 shantanuaggarwal2695 + 2 sshiv012 + 2 willbowditch + 2 Akshay Gogeri + 2 Kurtis Seebaldt + 1 AMRIT BHASKAR + 1 Alex Ott + 1 Amir Tallap + 1 Arindam Jain + 1 Artem + 1 Dane Springmeyer + 1 Dimitris Bilidas + 1 Elephantusparvus + 1 Guilhem de Viry + 1 Hannah Chi + 1 Haode Du + 1 HarryZhu + 1 Hemendu Roy + 1 Hersh Gupta + 1 Hongbo Miao + 1 Ilya Zverev + 1 James + 1 Jonathan Leitschuh + 1 Jordan Perr-Sauer + 1 Jozef Dúc + 1 Juan Ignacio Fulponi + 1 Julien + 1 Karthick Narendran + 1 Kartikey + 1 Keivan Shahida + 1 Kevin Bohinski + 1 Lenno Nagel + 1 Mariano Gonzalez + 1 Max Base + 1 Maxime Petazzoni + 1 Mikael Vaaltola + 1 Mohammad Lotfi Akbarabadi + 1 Niklas Løvenholdt Petersen (Maersk) + 1 Nikolay Gorylenko + 1 Oliver Kennedy + 1 Onkar Pandit + 1 Pavan + 1 Phoenix Daddy + 1 Pooja Kulkarni + 1 R B Krishna + 1 Rishabh Mishra + 1 Semen Komissarov + 1 Sergey Nuyanzin + 1 Sergii Mikhtoniuk + 1 Serhuela + 1 Shi-Hao Liu + 1 Sébastien Diemer + 1 Tejesh Reddy + 1 The Gitter Badger + 1 Tongxing Ren + 1 Varsha Ravindra + 1 Venkata Pankaj Kodavandlapalli + 1 Vinoo Ganesh + 1 Xiangyun Huang + 1 ashar + 1 davidkell + 1 gmaraswa + 1 golfalot + 1 mjohns-databricks + 1 naharon2210 + 1 ngaur9 + 1 ruanqizhen + 1 sagar1993 + 1 strump + 1 the-sea + 1 tmodi7 + 1 tociek + 1 ttomasz + 1 wendrickje diff --git a/tools/scripts/generate_authors.py b/tools/scripts/generate_authors.py new file mode 100644 index 00000000000..3d7c026e334 --- /dev/null +++ b/tools/scripts/generate_authors.py @@ -0,0 +1,90 @@ +import shutil +import re +from datetime import datetime +from collections import defaultdict +import subprocess # nosec B404 + + +def get_git_command(): + git_path = shutil.which("git") + if not git_path: + raise EnvironmentError("Git executable not found in system PATH.") + return git_path + + +def get_contributors(): + git = get_git_command() + try: + output = subprocess.check_output( + [git, "shortlog", "-sne", "--all"], encoding="utf-8" + ) # nosec B603 + except subprocess.CalledProcessError as e: + raise RuntimeError("Failed to get git shortlog output.") from e + + lines = output.strip().split("\n") + contributors = defaultdict(int) + + for line in lines: + if not line.strip(): + continue + + parts = line.strip().split("\t") + if len(parts) != 2: + continue + + count = int(parts[0].strip()) + name_email = parts[1].strip() + + name_match = re.match(r"^([^<]+)", name_email) + name = name_match.group(1).strip() if name_match else "" + + username_match = re.search(r"\(@([^)]+)\)", name_email) + username = f"@{username_match.group(1)}" if username_match else "" + + key = (name, username) + contributors[key] += count + + result = [] + for (name, username), count in contributors.items(): + result.append( + { + "count": count, + "name": name, + "username": username, + } + ) + + return result + + +def write_authors_file(contributors, filename="AUTHORS"): + today = datetime.now().strftime("%Y-%m-%d") + git = get_git_command() + try: + hash_output = subprocess.check_output( + [git, "rev-parse", "--short", "HEAD"], encoding="utf-8" + ).strip() # nosec + except subprocess.CalledProcessError as e: + raise RuntimeError("Failed to get git commit hash.") from e + + with open(filename, "w", encoding="utf-8") as f: + f.write("# Authors of apache/sedona\n\n") + f.write( + f"## The List of Contributors sorted by number of commits (as of {today} {hash_output})\n\n" + ) + + for contributor in contributors: + count = contributor["count"] + name = contributor["name"] + username = contributor["username"] + line = f"{count:6} {name}" + if username: + line += f" {username}" + f.write(line.rstrip() + "\n") + + +if __name__ == "__main__": + contributors = get_contributors() + contributors.sort(key=lambda x: x["count"], reverse=True) + write_authors_file(contributors) + print("AUTHORS file has been generated.")