tools: Add litex_contributors.py script to easily update CONTRIBUTORS file.

This commit is contained in:
Florent Kermarrec 2021-06-17 23:04:28 +02:00
parent 7179d88e8c
commit a4be067d91
1 changed files with 76 additions and 0 deletions

View File

@ -0,0 +1,76 @@
#!/usr/bin/env python3
#
# This file is part of LiteX.
#
# Copyright (c) 2021 Florent Kermarrec <florent@enjoy-digital.fr>
# SPDX-License-Identifier: BSD-2-Clause
# Small tool to easily update CONTRIBUTORS.
import os
import sys
import csv
import argparse
# Helpers ------------------------------------------------------------------------------------------
def make_unique(sequence):
seen = set()
return [x for x in sequence if not (x in seen or seen.add(x))]
class Author:
def __init__(self, email, year):
self.email = email
self.years = [year]
def add_year(self, year):
self.years.append(year)
self.years = make_unique(self.years)
# Use Git Log + Processing to create the list of Contibutors ---------------------------------------
def list_contributors(path):
# Create .csv with git log.
os.system(f"git log --follow --pretty=format:\"%an,%ae,%aI\" {path} | sort | uniq > contribs.csv")
# Read .csv and process it.
authors = {}
with open("contribs.csv", newline='') as csvfile:
reader = csv.reader(csvfile, delimiter=",")
for line in reader:
name = line[0]
email = line[1]
year = line[2][:4]
if name in authors.keys():
authors[name].add_year(int(year))
else:
authors[name] = Author(email, int(year))
# Export Contributors.
for name, info in authors.items():
r = "Copyright (c) "
if len(info.years) > 1:
years = f"{info.years[0]}-{info.years[-1]}"
else:
years = f"{info.years[0]}"
r += years + " "*(9-len(years))
r += " "
r += name
r += " <"
r += info.email
r += ">"
print(r)
# Run ----------------------------------------------------------------------------------------------
def main():
parser = argparse.ArgumentParser(description="Small tool to easily update CONTRIBUTORS.")
parser.add_argument("--path", default="./", help="Git Path.")
args = parser.parse_args()
list_contributors(args.path)
if __name__ == "__main__":
main()