Credits Script: Report duplicate authors

Also add duplicate identities found using this report to the canonical
authors list.

Ref !160527
This commit is contained in:
Damien Picard 2026-06-22 21:11:02 +02:00 • committed by Campbell Barton
parent 5dddefc8d6
commit 682da2d0e5
2 changed files with 71 additions and 0 deletions

View file

@ -402,6 +402,21 @@ def main() -> int:
credits.process(GitCommitIter(args.source_dir, commit_range), jobs=jobs)
# Report when a single name has multiple entries,
# as they may need deduplicating in git_data_canonical_authors.py.
unique_author_names = {}
for author in credits.users:
author_name, author_email = author.rsplit("<", 1)
author_name = author_name.rstrip()
author_email = "<" + author_email
unique_author_name = unique_author_names.setdefault(author_name, [])
unique_author_name.append(author_email)
for name, emails in sorted(unique_author_names.items()):
if len(emails) > 1:
print(f"More than one entry for {name}:")
for email in sorted(emails):
print(f' "{name} {email}",')
credits.write(
"credits.html",
is_main_credits=True,

View file

@ -60,6 +60,7 @@ def canonical_author_map() -> dict[str, str]:
),
"Alex Fuller <boberfly@gmail.com>": (
"Alex <boberfly@gmail.com>",
"Alex Fuller <>",
"Alex Fuller <boberfly@noreply.localhost>",
"Alex Fuller <mistaed>",
),
@ -76,6 +77,7 @@ def canonical_author_map() -> dict[str, str]:
"Alexandre Cardaillac <cardaillac.alexandre@gmail.com>",
),
"Ale\u0161 Jelov\u010dan <frogstomp>": (
"Ale\u0161 Jelov\u010dan <33534+frogstomp@noreply.localhost>",
"Ale\u0161 Jelov\u010dan <frogstomp@noreply.localhost>",
"frogstomp <email.frogstomp@gmail.com>",
),
@ -176,6 +178,7 @@ def canonical_author_map() -> dict[str, str]:
),
"Brady Johnston <brady.johnston@me.com>": (
"Brady Johnston <36021261+BradyAJohnston@users.noreply.github.com>",
"Brady Johnston <>",
"Brady Johnston <bradyajohnston@noreply.localhost>",
),
"Brecht Van Lommel <brecht@blender.org>": (
@ -199,6 +202,7 @@ def canonical_author_map() -> dict[str, str]:
"Campbell Barton <campbell@blender.org>": (
"Campbell Barton <campbellbarton>",
"Campbell Barton <ideasman42@gmail.com>",
"Campbell Barton <ideasman42@noreply.localhost>",
),
"Carlo Andreacchio <carlorules@gmail.com>": (
"Carlo Andreacchio <carloandreacchio@noreply.localhost>",
@ -247,13 +251,16 @@ def canonical_author_map() -> dict[str, str]:
"Cl\u00c3\u00a9ment Foucault <foucault.clem@gmail.com>",
"Cl\u00e9ment <clement@Clements-MacBook-Pro.local>",
"Cl\u00e9ment FOUCAULT <foucault.clem@gmail.com>",
"Cl\u00e9ment Foucault <>",
"Cl\u00e9ment Foucault <fclem>",
"Cl\u00e9ment Foucault <fclem@noreply.localhost>",
"fclem <foucault.clem@gmail.com>",
),
"Colin Basnett <cmbasnett@gmail.com>": (
"Colin Basnett <5035660+cmbasnett@users.noreply.github.com>",
"Colin Basnett <cmbasnett>",
"Colin Basnett <cmbasnett@noreply.localhost>",
"Colin Basnett <darknation@noreply.localhost>",
),
"Colin Marmond <kdblender@gmail.com>": (
"Colin <Kdaf>",
@ -270,6 +277,7 @@ def canonical_author_map() -> dict[str, str]:
"Dalai Felinto <dfelinto@noreply.localhost>",
),
"Damien Picard <dam.pic@free.fr>": (
"Damien Picard <>",
"Damien Picard <damien@les-fees-speciales.coop>",
"Damien Picard <pioverfour>",
"Damien Picard <pioverfour@noreply.localhost>",
@ -283,6 +291,9 @@ def canonical_author_map() -> dict[str, str]:
"ZanQdo <zanqdo@gmail.com>",
"zanqdo <zanqdo@gmail.com>",
),
"Dave Pagurek <davepagurek>": (
"Dave Pagurek <dave-pagurek@noreply.localhost>",
),
"David Friedli <hlorus>": (
"David <hlorus>",
),
@ -363,6 +374,9 @@ def canonical_author_map() -> dict[str, str]:
"Gaia Clary <gaiaclary>",
"gaiaclary <gaia.clary@machinimatrix.org>",
),
"Gaktan <Gaktan@users.noreply.github.com>": (
"Gaktan <gaktan@noreply.localhost>",
),
"Geedoubleu <gustavocalderon571@yahoo.com>": (
"Geedoubleu <contact.geedoubleu@gmail.com>",
),
@ -387,6 +401,9 @@ def canonical_author_map() -> dict[str, str]:
"mano-wii <germano.costa@ig.com.br>",
"mano-wii <grmncv@gmail.com>",
),
"Gianluca Giampuzzo <gianluca-7@noreply.localhost>": (
"Gianluca Giampuzzo <>",
),
"Gilberto Rodrigues <gilbertorodrigues@outlook.com>": (
"Gilberto Rodrigues <gilberto_rodrigues>",
"Gilberto.R <gilbertorodrigues@outlook.com>",
@ -422,10 +439,14 @@ def canonical_author_map() -> dict[str, str]:
"Henrik Dick (weasel) <>",
"Henrik Dick <weasel>",
),
"Henry Jiang <henryyjiang42@gmail.com>": (
"Henry Jiang <atrxi@noreply.localhost>",
),
"Himanshi Kalra <himanshikalra98@gmail.com>": (
"Himanshi Kalra <calra>",
),
"Howard Trickey <howard.trickey@gmail.com>": (
"Howard Trickey <5005+howardt@noreply.localhost>",
"Howard Trickey <howardt@noreply.localhost>",
"Howard Trickey <trickey@google.com>",
"howardt <howard.trickey@gmail.com>",
@ -461,6 +482,7 @@ def canonical_author_map() -> dict[str, str]:
"Iyad Ahmed <iyadahmed2001>",
),
"Jacques Lucke <jacques@blender.org>": (
"Jacques Lucke <>",
"Jacques Lucke <jacqueslucke@noreply.localhost>",
"Jacques Lucke <mail@jlucke.com>",
),
@ -485,6 +507,9 @@ def canonical_author_map() -> dict[str, str]:
"jeroen@blender.org <Jeroen Bakker>",
"jeroen@blender.org <jeroen@blender.org>",
),
"Jerry Wei <79512937+JerryWeii-27@users.noreply.github.com>": (
"Jerry Wei <jerry-wei@noreply.localhost>",
),
"Jesse Yurkovich <jesse.y@gmail.com>": (
"Jesse Y <deadpin>",
"Jesse Yurkovich <deadpin>",
@ -496,8 +521,12 @@ def canonical_author_map() -> dict[str, str]:
"Johannes J <johannesj@noreply.localhost>": (
"Johannes J <johannesj>",
),
"John Kinzel <john.kinzel426@gmail.com>": (
"John Kinzel <Germkiller42@gmail.com>",
),
"John Kiril Swenson <kirilswenson@gmail.com>": (
"John Kiril Swenson <eliphaz@noreply.localhost>",
"John Kiril Swenson <john@blender.org>",
"John Swenson <zeltuva@gmail.com>",
),
"Johnny Matthews <johnny.matthews@gmail.com>": (
@ -529,6 +558,7 @@ def canonical_author_map() -> dict[str, str]:
"joshua-maros <60271685+joshua-maros@users.noreply.github.com>",
),
"Julian Eisel <julian@blender.org>": (
"Julian Eisel <>",
"Julian Eisel <Severin>",
"Julian Eisel <eiseljulian@gmail.com>",
"Julian Eisel <julian@linux-chl2.site>",
@ -569,6 +599,7 @@ def canonical_author_map() -> dict[str, str]:
"K\u00e9vin Dietrich <kevin.dietrich@mailoo.org>": (
"Kevin Dietrich <kevin.dietrich@mailoo.org>",
"K\u00e9vin Dietrich <kevindietrich>",
"K\u00e9vin Dietrich <kevindietrich@noreply.localhost>",
),
"Laurynas Duburas <laduem@gmail.com>": (
"Laurynas Duburas <laurynas>",
@ -594,15 +625,20 @@ def canonical_author_map() -> dict[str, str]:
"Luca Rood <dev@lucarood.com>": (
"Luca Rood <LucaRood>",
),
"Lucas Boutrot <thornydre@gmail.com>": (
"Lucas Boutrot <thornydre>",
),
"Lucas Tadeu Teixeira <lucas@lucastadeu.com>": (
"Lucas Tadeu <yup_lucas@noreply.localhost>",
),
"Lukas Stockner <lukas@lukasstockner.de>": (
"Lukas Stockner <>",
"Lukas Stockner <lukas.stockner@freenet.de>",
"Lukas Stockner <lukasstockner97>",
),
"Lukas T\u00f6nne <lukas@blender.org>": (
"Lukas Toenne <lukas.toenne@googlemail.com>",
"Lukas T\u00f6nne <>",
"Lukas T\u00f6nne <lukas.toenne@gmail.com>",
"Lukas T\u00f6nne <lukastonne@noreply.localhost>",
),
@ -643,6 +679,7 @@ def canonical_author_map() -> dict[str, str]:
"Martijn Berger <mberger@martijns-mbp.lan>",
),
"Martijn Versteegh <martijn@aaltjegron.nl>": (
"Martijn Versteegh <23055+baardaap@noreply.localhost>",
"Martijn Versteegh <Baardaap>",
"Martijn Versteegh <baardaap@noreply.localhost>",
"Martijn Versteegh <blender@aaltjegron.nl>",
@ -697,6 +734,8 @@ def canonical_author_map() -> dict[str, str]:
"Miguel Porces <cmporces>",
),
"Miguel Pozo <pragma37@gmail.com>": (
"Miguel Pozo <>",
"Miguel Pozo <miguel@blender.org>",
"Miguel Pozo <pragma37>",
"Miguel Pozo <pragma37@noreply.localhost>",
),
@ -728,6 +767,9 @@ def canonical_author_map() -> dict[str, str]:
"Nathan Vegdahl <cessen@cessen.com>": (
"Nathan Vegdahl <cessen>",
),
"Nazir Galimov <nazir.galimov@gmail.com>": (
"Nazir Galimov <aicedor@noreply.localhost>",
),
"Nicholas Bishop <nicholasbishop@gmail.com>": (
"Nicholas Bishop <nicholas.bishop@floored.com>",
),
@ -803,6 +845,7 @@ def canonical_author_map() -> dict[str, str]:
"Pedro A <povmaniaco>",
),
"Philipp Oeser <philipp@blender.org>": (
"Philipp Oeser <>",
"Philipp Oeser <info@graphics-engineer.com>",
"Philipp Oeser <lichtwerk>",
"Philipp Oeser <lichtwerk@noreply.localhost>",
@ -848,6 +891,8 @@ def canonical_author_map() -> dict[str, str]:
"Red Mser <RedMser>": (
"RedMser <RedMser>",
"RedMser <redmser.jj2@gmail.com>",
"RedMser <redmser.jj2@gmx.de>",
"RedMser <redmser@noreply.localhost>",
),
"Richard Antalik <richardantalik@gmail.com>": (
"Richard Antalik <ISS>",
@ -884,6 +929,7 @@ def canonical_author_map() -> dict[str, str]:
),
"Sebastian Herholz <sebastian.herholz@intel.com>": (
"Sebastian Herholz <Sebastian.Herholz@gmail.com>",
"Sebastian Herholz <sebastian.herholz@gmail.com>",
"Sebastian Herholz <sherholz>",
"Sebastian Herholz <sherholz@noreply.localhost>",
"Sebastian Herhoz <sebastian.herholz@intel.com>",
@ -966,6 +1012,9 @@ def canonical_author_map() -> dict[str, str]:
"Thomas Szepe <HG1_public@gmx.net>": (
"HG1 <HG1_public@gmx.net>",
),
"Tibo Stans <192132910+stanzerelli@users.noreply.github.com>": (
"Tibo Stans <stanzerelli@noreply.localhost>",
),
"Tobias Kummer | Overmind Studios <tobiaskummer@googlemail.com>": (
"Tobias Kummer | Overmind Studios <tobiaskummer@noreply.localhost>",
"tobi <tobiaskummer@googlemail.com>",
@ -1084,6 +1133,7 @@ def canonical_author_map() -> dict[str, str]:
"Jon Denning <gfxcoder>",
),
"luz paz <luzpaz@proton.me>": (
"luz paz <>",
"luz paz <luzpaz-2@noreply.localhost>",
"luzpaz <luzpaz>",
"luzpaz-2 <luzpaz-2@noreply.localhost>",
@ -1097,6 +1147,12 @@ def canonical_author_map() -> dict[str, str]:
"ok_what <ip1149a@gmail.com>": (
"ok what <ok_what>",
),
"syzygial <syzygial.123@gmail.com>": (
"syzygial <syzygial@noreply.localhost>",
),
"unerr <unerr@noreply.codeberg.org>": (
"unerr <unerr@noreply.localhost>",
),
"\u4f73\u96ef \u7a0b <chiaki0meow@gmail.com>": (
"Chiaki_meow <chiaki0meow@gmail.com>",
"\u4f73\u96ef \u7a0b <chiaki_meow@sjtu.edu.cn>",