Browse Source

chore: refine author list generation

Now applies a slightly narrower definition of "author", being one that
has touched code in a file that exists today (tracking renames).
Jakob Borg 5 months ago
parent
commit
a4db309b39
3 changed files with 182 additions and 248 deletions
  1. 24 77
      AUTHORS
  2. 0 0
      gui/default/syncthing/core/aboutModalView.html
  3. 158 171
      script/authors.go

+ 24 - 77
AUTHORS

@@ -13,103 +13,96 @@
 # contents of this file.
 # contents of this file.
 #
 #
 
 
-Aaron Bieber (qbit) <[email protected]>
+Jakob Borg (calmh) <[email protected]> <[email protected]> <[email protected]>
+Audrius Butkevicius (AudriusButkevicius) <[email protected]> <[email protected]>
+Simon Frei (imsodin) <[email protected]>
+Tomasz Wilczyński <[email protected]> <[email protected]>
+Alexander Graf (alex2108) <[email protected]>
+Alexandre Viau (aviau) <[email protected]> <[email protected]>
+Anderson Mesquita (andersonvom) <[email protected]>
+André Colomb (acolomb) <[email protected]> <[email protected]>
+Antony Male (canton7) <[email protected]>
+Ben Schulz (uok) <[email protected]> <[email protected]>
+bt90 <[email protected]>
+Caleb Callaway (cqcallaw) <[email protected]>
+Daniel Harte (norgeous) <[email protected]> <[email protected]> <[email protected]>
+Emil Lundberg <[email protected]>
+Eric P <[email protected]>
+Evgeny Kuznetsov <[email protected]>
+greatroar <[email protected]>
+Lars K.W. Gohlke (lkwg82) <[email protected]>
+Lode Hoste (Zillode) <[email protected]>
+Michael Ploujnikov (plouj) <[email protected]>
+Ross Smith II (rasa) <[email protected]>
+Stefan Tatschner (rumpelsepp) <[email protected]> <[email protected]> <[email protected]>
+Wulf Weich (wweich) <[email protected]> <[email protected]> <[email protected]>
 Adam Piggott (ProactiveServices) <[email protected]> <[email protected]> <[email protected]> <[email protected]>
 Adam Piggott (ProactiveServices) <[email protected]> <[email protected]> <[email protected]> <[email protected]>
 Adel Qalieh (adelq) <[email protected]> <[email protected]>
 Adel Qalieh (adelq) <[email protected]> <[email protected]>
-Alan Pope <[email protected]>
-Alberto Donato <[email protected]>
 Aleksey Vasenev <[email protected]>
 Aleksey Vasenev <[email protected]>
 Alessandro G. (alessandro.g89) <[email protected]>
 Alessandro G. (alessandro.g89) <[email protected]>
 Alex Ionescu <[email protected]>
 Alex Ionescu <[email protected]>
 Alex Lindeman <[email protected]>
 Alex Lindeman <[email protected]>
 Alex Xu <[email protected]>
 Alex Xu <[email protected]>
-Alexander Graf (alex2108) <[email protected]>
 Alexander Seiler <[email protected]>
 Alexander Seiler <[email protected]>
 Alexandre Alves <[email protected]>
 Alexandre Alves <[email protected]>
-Alexandre Viau (aviau) <[email protected]> <[email protected]>
 Aman Gupta <[email protected]>
 Aman Gupta <[email protected]>
-Anatoli Babenia <[email protected]>
-Anderson Mesquita (andersonvom) <[email protected]>
 Andreas Sommer <[email protected]>
 Andreas Sommer <[email protected]>
 andresvia <[email protected]>
 andresvia <[email protected]>
-Andrew Dunham (andrew-d) <[email protected]>
-Andrew Meyer <[email protected]>
 Andrew Rabert (nvllsvm) <[email protected]> <[email protected]>
 Andrew Rabert (nvllsvm) <[email protected]> <[email protected]>
 Andrey D (scienmind) <[email protected]> <[email protected]>
 Andrey D (scienmind) <[email protected]> <[email protected]>
-André Colomb (acolomb) <[email protected]> <[email protected]>
 andyleap <[email protected]>
 andyleap <[email protected]>
 Anjan Momi <[email protected]>
 Anjan Momi <[email protected]>
 Anthony Goeckner <[email protected]>
 Anthony Goeckner <[email protected]>
 Antoine Lamielle (0x010C) <[email protected]> <[email protected]>
 Antoine Lamielle (0x010C) <[email protected]> <[email protected]>
-Antony Male (canton7) <[email protected]>
 Anur <[email protected]>
 Anur <[email protected]>
 Aranjedeath <[email protected]>
 Aranjedeath <[email protected]>
 Arkadiusz Tymiński <[email protected]>
 Arkadiusz Tymiński <[email protected]>
 Aroun <[email protected]>
 Aroun <[email protected]>
 Arthur Axel fREW Schmidt (frioux) <[email protected]> <[email protected]>
 Arthur Axel fREW Schmidt (frioux) <[email protected]> <[email protected]>
 Artur Zubilewicz <[email protected]>
 Artur Zubilewicz <[email protected]>
-Audrius Butkevicius (AudriusButkevicius) <[email protected]> <[email protected]>
 Aurélien Rainone <[email protected]>
 Aurélien Rainone <[email protected]>
 BAHADIR YILMAZ <[email protected]>
 BAHADIR YILMAZ <[email protected]>
 Bart De Vries (mogwa1) <[email protected]>
 Bart De Vries (mogwa1) <[email protected]>
 Beat Reichenbach <[email protected]>
 Beat Reichenbach <[email protected]>
-Ben Curthoys (bencurthoys) <[email protected]>
-Ben Schulz (uok) <[email protected]> <[email protected]>
 Ben Shepherd (benshep) <[email protected]>
 Ben Shepherd (benshep) <[email protected]>
 Ben Sidhom (bsidhom) <[email protected]>
 Ben Sidhom (bsidhom) <[email protected]>
 Benedikt Heine (bebehei) <[email protected]>
 Benedikt Heine (bebehei) <[email protected]>
-Benedikt Morbach <[email protected]>
-Benjamin Nater <[email protected]>
 Benno Fünfstück <[email protected]>
 Benno Fünfstück <[email protected]>
 Benny Ng (tpng) <[email protected]>
 Benny Ng (tpng) <[email protected]>
 boomsquared <[email protected]>
 boomsquared <[email protected]>
 Boqin Qin <[email protected]>
 Boqin Qin <[email protected]>
 Boris Rybalkin <[email protected]>
 Boris Rybalkin <[email protected]>
-Brandon Philips (philips) <[email protected]>
 Brendan Long (brendanlong) <[email protected]>
 Brendan Long (brendanlong) <[email protected]>
-Brian R. Becker (brbecker) <[email protected]>
-bt90 <[email protected]>
-Caleb Callaway (cqcallaw) <[email protected]>
-Carsten Hagemann (carstenhag) <[email protected]> <[email protected]>
 Catfriend1 <[email protected]>
 Catfriend1 <[email protected]>
 Cathryne Linenweaver (Cathryne) <[email protected]> <[email protected]> <[email protected]>
 Cathryne Linenweaver (Cathryne) <[email protected]> <[email protected]> <[email protected]>
 Cedric Staniewski (xduugu) <[email protected]>
 Cedric Staniewski (xduugu) <[email protected]>
-chenrui <[email protected]>
 Chih-Hsuan Yen <[email protected]> <[email protected]>
 Chih-Hsuan Yen <[email protected]> <[email protected]>
 Choongkyu <[email protected]> <[email protected]>
 Choongkyu <[email protected]> <[email protected]>
 Chris Howie (cdhowie) <[email protected]>
 Chris Howie (cdhowie) <[email protected]>
 Chris Joel (cdata) <[email protected]>
 Chris Joel (cdata) <[email protected]>
-Chris Tonkinson <[email protected]>
 Christian Kujau <[email protected]>
 Christian Kujau <[email protected]>
 Christian Prescott <[email protected]>
 Christian Prescott <[email protected]>
 chucic <[email protected]>
 chucic <[email protected]>
 cjc7373 <[email protected]>
 cjc7373 <[email protected]>
 Colin Kennedy (moshen) <[email protected]>
 Colin Kennedy (moshen) <[email protected]>
 Cromefire_ <[email protected]> <[email protected]>
 Cromefire_ <[email protected]> <[email protected]>
-cui fliter <[email protected]>
 Cyprien Devillez <[email protected]>
 Cyprien Devillez <[email protected]>
 d-volution <[email protected]>
 d-volution <[email protected]>
-Dale Visser <[email protected]>
 Dan <[email protected]>
 Dan <[email protected]>
 Daniel Barczyk <[email protected]>
 Daniel Barczyk <[email protected]>
 Daniel Bergmann (brgmnn) <[email protected]> <[email protected]>
 Daniel Bergmann (brgmnn) <[email protected]> <[email protected]>
-Daniel Harte (norgeous) <[email protected]> <[email protected]> <[email protected]>
 Daniel Martí (mvdan) <[email protected]>
 Daniel Martí (mvdan) <[email protected]>
 Daniel Padrta <[email protected]>
 Daniel Padrta <[email protected]>
 Darshil Chanpura (dtchanpura) <[email protected]> <[email protected]>
 Darshil Chanpura (dtchanpura) <[email protected]> <[email protected]>
 dashangcun <[email protected]>
 dashangcun <[email protected]>
 David Rimmer (dinosore) <[email protected]>
 David Rimmer (dinosore) <[email protected]>
-deepsource-autofix[bot] <62050782+deepsource-autofix[bot]@users.noreply.github.com>
 DeflateAwning <[email protected]>
 DeflateAwning <[email protected]>
 Denis A. (dva) <[email protected]>
 Denis A. (dva) <[email protected]>
 Dennis Wilson (snnd) <[email protected]>
 Dennis Wilson (snnd) <[email protected]>
-dependabot-preview[bot] <dependabot-preview[bot]@users.noreply.github.com> <27856297+dependabot-preview[bot]@users.noreply.github.com>
-dependabot[bot] <dependabot[bot]@users.noreply.github.com> <49699333+dependabot[bot]@users.noreply.github.com>
 derekriemer <[email protected]>
 derekriemer <[email protected]>
 DerRockWolf <[email protected]>
 DerRockWolf <[email protected]>
 desbma <[email protected]>
 desbma <[email protected]>
 Devon G. Redekopp <[email protected]>
 Devon G. Redekopp <[email protected]>
-diemade <[email protected]>
 digital <[email protected]>
 digital <[email protected]>
 Dimitri Papadopoulos Orfanos <[email protected]>
 Dimitri Papadopoulos Orfanos <[email protected]>
 Dmitry Saveliev (dsaveliev) <[email protected]>
 Dmitry Saveliev (dsaveliev) <[email protected]>
@@ -119,14 +112,11 @@ Dominik Heidler (asdil12) <[email protected]>
 Elias Jarlebring (jarlebring) <[email protected]>
 Elias Jarlebring (jarlebring) <[email protected]>
 Elliot Huffman <[email protected]>
 Elliot Huffman <[email protected]>
 Emil Hessman (ceh) <[email protected]>
 Emil Hessman (ceh) <[email protected]>
-Emil Lundberg <[email protected]>
 Eng Zer Jun <[email protected]>
 Eng Zer Jun <[email protected]>
 entity0xfe <[email protected]> <[email protected]>
 entity0xfe <[email protected]> <[email protected]>
 Eric Lesiuta <[email protected]>
 Eric Lesiuta <[email protected]>
-Eric P <[email protected]>
 Erik Meitner (WSGCSysadmin) <[email protected]>
 Erik Meitner (WSGCSysadmin) <[email protected]>
 Evan Spensley <[email protected]>
 Evan Spensley <[email protected]>
-Evgeny Kuznetsov <[email protected]>
 Federico Castagnini (facastagnini) <[email protected]>
 Federico Castagnini (facastagnini) <[email protected]>
 Felix <[email protected]>
 Felix <[email protected]>
 Felix Ableitner (Nutomic) <[email protected]>
 Felix Ableitner (Nutomic) <[email protected]>
@@ -140,7 +130,6 @@ ghjklw <[email protected]>
 Gilli Sigurdsson (gillisig) <[email protected]>
 Gilli Sigurdsson (gillisig) <[email protected]>
 Gleb Sinyavskiy <[email protected]>
 Gleb Sinyavskiy <[email protected]>
 Graham Miln (grahammiln) <[email protected]> <[email protected]>
 Graham Miln (grahammiln) <[email protected]> <[email protected]>
-greatroar <[email protected]>
 Greg <[email protected]>
 Greg <[email protected]>
 guangwu <[email protected]>
 guangwu <[email protected]>
 gudvinr <[email protected]>
 gudvinr <[email protected]>
@@ -155,50 +144,35 @@ Hugo Locurcio <[email protected]>
 Iain Barnett <[email protected]>
 Iain Barnett <[email protected]>
 Ian Johnson (anonymouse64) <[email protected]> <[email protected]>
 Ian Johnson (anonymouse64) <[email protected]> <[email protected]>
 ignacy123 <[email protected]>
 ignacy123 <[email protected]>
-Ikko Ashimine <[email protected]>
-Ilya Brin <[email protected]>
 Iskander Sharipov (Alex) <[email protected]>
 Iskander Sharipov (Alex) <[email protected]>
 Jaakko Hannikainen (jgke) <[email protected]>
 Jaakko Hannikainen (jgke) <[email protected]>
-Jacek Szafarkiewicz (hadogenes) <[email protected]>
 Jack Croft <[email protected]>
 Jack Croft <[email protected]>
 Jacob <[email protected]>
 Jacob <[email protected]>
 Jake Peterson (acogdev) <[email protected]>
 Jake Peterson (acogdev) <[email protected]>
-Jakob Borg (calmh) <[email protected]> <[email protected]> <[email protected]>
 James O'Beirne <[email protected]>
 James O'Beirne <[email protected]>
 James Patterson (jpjp) <[email protected]> <[email protected]>
 James Patterson (jpjp) <[email protected]> <[email protected]>
-janost <[email protected]>
 Jaroslav Lichtblau <[email protected]>
 Jaroslav Lichtblau <[email protected]>
 Jaroslav Malec (dzarda) <[email protected]>
 Jaroslav Malec (dzarda) <[email protected]>
-jaseg <[email protected]>
 Jaspitta <[email protected]>
 Jaspitta <[email protected]>
-Jauder Ho <[email protected]>
 Jaya Chithra (jayachithra) <[email protected]>
 Jaya Chithra (jayachithra) <[email protected]>
 Jaya Kumar <[email protected]>
 Jaya Kumar <[email protected]>
 Jeffery To <[email protected]>
 Jeffery To <[email protected]>
 jelle van der Waa <[email protected]>
 jelle van der Waa <[email protected]>
 Jens Diemer (jedie) <[email protected]> <[email protected]>
 Jens Diemer (jedie) <[email protected]> <[email protected]>
-Jerry Jacobs (xor-gate) <[email protected]> <[email protected]>
-Jesse Lucas <[email protected]>
 Jochen Voss (seehuhn) <[email protected]>
 Jochen Voss (seehuhn) <[email protected]>
-Johan Andersson <[email protected]>
 Johan Vromans (sciurius) <[email protected]>
 Johan Vromans (sciurius) <[email protected]>
 John Rinehart (fuzzybear3965) <[email protected]>
 John Rinehart (fuzzybear3965) <[email protected]>
 Jonas Thelemann <[email protected]>
 Jonas Thelemann <[email protected]>
 Jonathan <[email protected]> <[email protected]>
 Jonathan <[email protected]> <[email protected]>
-Jonathan Cross <[email protected]>
-Jonta <[email protected]>
 Jose Manuel Delicado (jmdaweb) <[email protected]> <[email protected]>
 Jose Manuel Delicado (jmdaweb) <[email protected]> <[email protected]>
 jtagcat <[email protected]> <[email protected]>
 jtagcat <[email protected]> <[email protected]>
 Julian Lehrhuber <[email protected]>
 Julian Lehrhuber <[email protected]>
 Jörg Thalheim <[email protected]>
 Jörg Thalheim <[email protected]>
 Jędrzej Kula <[email protected]>
 Jędrzej Kula <[email protected]>
-K.B.Dharun Krishna <[email protected]>
-Kalle Laine <[email protected]>
 Kapil Sareen <[email protected]>
 Kapil Sareen <[email protected]>
 Karol Różycki (krozycki) <[email protected]>
 Karol Różycki (krozycki) <[email protected]>
 Kebin Liu <[email protected]>
 Kebin Liu <[email protected]>
 Keith Harrison <[email protected]>
 Keith Harrison <[email protected]>
-Keith Turner <[email protected]>
 Kelong Cong (kc1212) <[email protected]> <[email protected]>
 Kelong Cong (kc1212) <[email protected]> <[email protected]>
 Ken'ichi Kamada (kamadak) <[email protected]>
 Ken'ichi Kamada (kamadak) <[email protected]>
 Kevin Allen (ironmig) <[email protected]>
 Kevin Allen (ironmig) <[email protected]>
@@ -207,30 +181,23 @@ Kevin White, Jr. (kwhite17) <[email protected]>
 klemens <[email protected]>
 klemens <[email protected]>
 Kurt Fitzner (Kudalufi) <[email protected]> <[email protected]>
 Kurt Fitzner (Kudalufi) <[email protected]> <[email protected]>
 kylosus <[email protected]>
 kylosus <[email protected]>
-Lars K.W. Gohlke (lkwg82) <[email protected]>
 Lars Lehtonen <[email protected]>
 Lars Lehtonen <[email protected]>
-Laurent Arnoud <[email protected]>
 Laurent Etiemble (letiemble) <[email protected]> <[email protected]>
 Laurent Etiemble (letiemble) <[email protected]> <[email protected]>
 Leo Arias (elopio) <[email protected]>
 Leo Arias (elopio) <[email protected]>
 Liu Siyuan (liusy182) <[email protected]> <[email protected]>
 Liu Siyuan (liusy182) <[email protected]> <[email protected]>
-Lode Hoste (Zillode) <[email protected]>
 Lord Landon Agahnim (LordLandon) <[email protected]>
 Lord Landon Agahnim (LordLandon) <[email protected]>
 LSmithx2 <[email protected]>
 LSmithx2 <[email protected]>
-luchenhan <[email protected]>
 Lukas Lihotzki <[email protected]>
 Lukas Lihotzki <[email protected]>
 Luke Hamburg <[email protected]>
 Luke Hamburg <[email protected]>
 luzpaz <[email protected]>
 luzpaz <[email protected]>
 Majed Abdulaziz (majedev) <[email protected]>
 Majed Abdulaziz (majedev) <[email protected]>
 Marc Laporte (marclaporte) <[email protected]> <[email protected]>
 Marc Laporte (marclaporte) <[email protected]> <[email protected]>
-Marc Pujol (kilburn) <[email protected]>
 Marcin Dziadus (marcindziadus) <[email protected]>
 Marcin Dziadus (marcindziadus) <[email protected]>
-marco-m <[email protected]>
 Marcus B Spencer <[email protected]> <[email protected]>
 Marcus B Spencer <[email protected]> <[email protected]>
 Marcus Legendre <[email protected]>
 Marcus Legendre <[email protected]>
 Mario Majila <[email protected]>
 Mario Majila <[email protected]>
 Mark Pulford (mpx) <[email protected]>
 Mark Pulford (mpx) <[email protected]>
 Martchus <[email protected]>
 Martchus <[email protected]>
-Martin Polehla <[email protected]>
 Mateusz Naściszewski (mateon1) <[email protected]>
 Mateusz Naściszewski (mateon1) <[email protected]>
 Mateusz Ż <[email protected]>
 Mateusz Ż <[email protected]>
 mathias4833 <[email protected]>
 mathias4833 <[email protected]>
@@ -241,15 +208,10 @@ Matteo Ruina <[email protected]>
 Maurizio Tomasi <[email protected]>
 Maurizio Tomasi <[email protected]>
 Max <[email protected]>
 Max <[email protected]>
 Max Schulze (kralo) <[email protected]> <[email protected]>
 Max Schulze (kralo) <[email protected]> <[email protected]>
-maxice8 <[email protected]>
 MaximAL <[email protected]>
 MaximAL <[email protected]>
-Maxime Thirouin <[email protected]>
 Maximilian <[email protected]> <[email protected]>
 Maximilian <[email protected]> <[email protected]>
-mclang <[email protected]>
 Michael Jephcote (Rewt0r) <[email protected]> <[email protected]>
 Michael Jephcote (Rewt0r) <[email protected]> <[email protected]>
-Michael Ploujnikov (plouj) <[email protected]>
 Michael Rienstra <[email protected]>
 Michael Rienstra <[email protected]>
-Michael Tilli (pyfisch) <[email protected]>
 MichaIng <[email protected]>
 MichaIng <[email protected]>
 Migelo <[email protected]>
 Migelo <[email protected]>
 Mike Boone <[email protected]>
 Mike Boone <[email protected]>
@@ -258,7 +220,6 @@ MikolajTwarog <[email protected]>
 Mingxuan Lin <[email protected]>
 Mingxuan Lin <[email protected]>
 mv1005 <[email protected]>
 mv1005 <[email protected]>
 Nate Morrison (nrm21) <[email protected]>
 Nate Morrison (nrm21) <[email protected]>
-Naveen <[email protected]>
 nf <[email protected]>
 nf <[email protected]>
 Nicholas Rishel (PrototypeNM1) <[email protected]> <[email protected]>
 Nicholas Rishel (PrototypeNM1) <[email protected]> <[email protected]>
 Nick Busey <[email protected]>
 Nick Busey <[email protected]>
@@ -273,7 +234,6 @@ NoLooseEnds <[email protected]>
 Oliver Freyermuth <[email protected]>
 Oliver Freyermuth <[email protected]>
 orangekame3 <[email protected]>
 orangekame3 <[email protected]>
 otbutz <[email protected]>
 otbutz <[email protected]>
-Otiel <[email protected]>
 overkill <[email protected]>
 overkill <[email protected]>
 Oyebanji Jacob Mayowa <[email protected]>
 Oyebanji Jacob Mayowa <[email protected]>
 Pablo <[email protected]>
 Pablo <[email protected]>
@@ -281,7 +241,6 @@ Pascal Jungblut (pascalj) <[email protected]> <[email protected]>
 Paul Brit <[email protected]>
 Paul Brit <[email protected]>
 Paul Donald <[email protected]>
 Paul Donald <[email protected]>
 Pawel Palenica (qepasa) <[email protected]>
 Pawel Palenica (qepasa) <[email protected]>
-Paweł Rozlach <[email protected]>
 perewa <[email protected]>
 perewa <[email protected]>
 Peter Badida <[email protected]>
 Peter Badida <[email protected]>
 Peter Dave Hello <[email protected]>
 Peter Dave Hello <[email protected]>
@@ -291,19 +250,15 @@ Phani Rithvij <[email protected]>
 Phil Davis <[email protected]>
 Phil Davis <[email protected]>
 Philippe Schommers (filoozoom) <[email protected]>
 Philippe Schommers (filoozoom) <[email protected]>
 Phill Luby (pluby) <[email protected]>
 Phill Luby (pluby) <[email protected]>
-Pier Paolo Ramon <[email protected]>
 Piotr Bejda (piobpl) <[email protected]>
 Piotr Bejda (piobpl) <[email protected]>
 polyfloyd <[email protected]>
 polyfloyd <[email protected]>
-Pramodh KP (pramodhkp) <[email protected]> <[email protected]>
 Quentin Hibon <[email protected]>
 Quentin Hibon <[email protected]>
 Rahmi Pruitt <[email protected]>
 Rahmi Pruitt <[email protected]>
 red_led <[email protected]>
 red_led <[email protected]>
-Richard Hartmann <[email protected]>
 Robert Carosi (nov1n) <[email protected]>
 Robert Carosi (nov1n) <[email protected]>
 Roberto Santalla <[email protected]>
 Roberto Santalla <[email protected]>
 Robin Schoonover <[email protected]>
 Robin Schoonover <[email protected]>
 Roman Zaynetdinov (zaynetro) <[email protected]>
 Roman Zaynetdinov (zaynetro) <[email protected]>
-Ross Smith II (rasa) <[email protected]>
 rubenbe <[email protected]>
 rubenbe <[email protected]>
 Ruslan Yevdokymov <[email protected]>
 Ruslan Yevdokymov <[email protected]>
 Ryan Qian <[email protected]>
 Ryan Qian <[email protected]>
@@ -315,18 +270,14 @@ Sergey Mishin (ralder) <[email protected]>
 Sertonix <[email protected]>
 Sertonix <[email protected]>
 Severin von Wnuck-Lipinski <[email protected]>
 Severin von Wnuck-Lipinski <[email protected]>
 Shaarad Dalvi <[email protected]> <[email protected]>
 Shaarad Dalvi <[email protected]> <[email protected]>
-Simon Frei (imsodin) <[email protected]>
 Simon Mwepu <[email protected]>
 Simon Mwepu <[email protected]>
 Simon Pickup <[email protected]>
 Simon Pickup <[email protected]>
 Sly_tom_cat <[email protected]>
 Sly_tom_cat <[email protected]>
 Sonu Kumar Saw <[email protected]>
 Sonu Kumar Saw <[email protected]>
 Stefan Kuntz (Stefan-Code) <[email protected]> <[email protected]>
 Stefan Kuntz (Stefan-Code) <[email protected]> <[email protected]>
-Stefan Tatschner (rumpelsepp) <[email protected]> <[email protected]> <[email protected]>
 Steven Eckhoff <[email protected]>
 Steven Eckhoff <[email protected]>
 Suhas Gundimeda (snugghash) <[email protected]> <[email protected]>
 Suhas Gundimeda (snugghash) <[email protected]> <[email protected]>
 Sven Bachmann <[email protected]>
 Sven Bachmann <[email protected]>
-Syncthing Automation <[email protected]>
-Syncthing Release Automation <[email protected]>
 Sébastien WENSKE <[email protected]>
 Sébastien WENSKE <[email protected]>
 Taylor Khan (nelsonkhan) <[email protected]>
 Taylor Khan (nelsonkhan) <[email protected]>
 Terrance <[email protected]>
 Terrance <[email protected]>
@@ -335,14 +286,11 @@ Thomas <[email protected]>
 Thomas Hipp <[email protected]>
 Thomas Hipp <[email protected]>
 Tim Abell (timabell) <[email protected]>
 Tim Abell (timabell) <[email protected]>
 Tim Howes (timhowes) <[email protected]>
 Tim Howes (timhowes) <[email protected]>
-Tim Nordenfur <[email protected]>
 Tobias Frölich <[email protected]>
 Tobias Frölich <[email protected]>
 Tobias Klauser <[email protected]>
 Tobias Klauser <[email protected]>
 Tobias Nygren (tnn2) <[email protected]>
 Tobias Nygren (tnn2) <[email protected]>
 Tobias Tom (tobiastom) <[email protected]>
 Tobias Tom (tobiastom) <[email protected]>
 Tom Jakubowski <[email protected]>
 Tom Jakubowski <[email protected]>
-Tomasz Wilczyński <[email protected]> <[email protected]>
-Tommy Thorn <[email protected]>
 Tommy van der Vorst <[email protected]> <[email protected]>
 Tommy van der Vorst <[email protected]> <[email protected]>
 Tully Robinson (tojrobinson) <[email protected]>
 Tully Robinson (tojrobinson) <[email protected]>
 Tyler Brazier (tylerbrazier) <[email protected]>
 Tyler Brazier (tylerbrazier) <[email protected]>
@@ -360,10 +308,9 @@ WangXi <[email protected]>
 Will Rouesnel <[email protected]>
 Will Rouesnel <[email protected]>
 William A. Kennington III (wkennington) <[email protected]>
 William A. Kennington III (wkennington) <[email protected]>
 wouter bolsterlee <[email protected]>
 wouter bolsterlee <[email protected]>
-Wulf Weich (wweich) <[email protected]> <[email protected]> <[email protected]>
 xarx00 <[email protected]>
 xarx00 <[email protected]>
 Xavier O. (damajor) <[email protected]>
 Xavier O. (damajor) <[email protected]>
-xjtdy888 (xjtdy888) <[email protected]>
+xjtdy888 (xjtdy888) <[email protected]> <[email protected]>
 Yannic A. (eipiminus1) <[email protected]> <[email protected]>
 Yannic A. (eipiminus1) <[email protected]> <[email protected]>
 佛跳墙 <[email protected]>
 佛跳墙 <[email protected]>
 落心 <[email protected]>
 落心 <[email protected]>

File diff suppressed because it is too large
+ 0 - 0
gui/default/syncthing/core/aboutModalView.html


+ 158 - 171
script/authors.go

@@ -14,14 +14,14 @@ package main
 
 
 import (
 import (
 	"bytes"
 	"bytes"
+	"cmp"
 	"fmt"
 	"fmt"
-	"io"
 	"log"
 	"log"
 	"math"
 	"math"
 	"os"
 	"os"
 	"os/exec"
 	"os/exec"
 	"regexp"
 	"regexp"
-	"sort"
+	"slices"
 	"strings"
 	"strings"
 )
 )
 
 
@@ -64,59 +64,33 @@ type author struct {
 
 
 func main() {
 func main() {
 	// Read authors from the AUTHORS file
 	// Read authors from the AUTHORS file
-	authors := getAuthors()
-
-	// Grab the set of thus known email addresses
-	listed := make(stringSet)
-	names := make(map[string]int)
-	for i, a := range authors {
-		names[a.name] = i
-		for _, e := range a.emails {
-			listed.add(e)
-		}
-	}
+	authorSet := getAuthors()
 
 
 	// Grab the set of all known authors based on the git log, and add any
 	// Grab the set of all known authors based on the git log, and add any
 	// missing ones to the authors list.
 	// missing ones to the authors list.
-	all := allAuthors()
-	for email, name := range all {
-		if listed.has(email) {
-			continue
-		}
+	addAuthors(authorSet)
 
 
-		if _, ok := names[name]; ok && name != "" {
-			// We found a match on name
-			authors[names[name]].emails = append(authors[names[name]].emails, email)
-			listed.add(email)
-			continue
-		}
+	authors := authorSet.filteredAuthors()
 
 
-		authors = append(authors, author{
-			name:   name,
-			emails: []string{email},
-		})
-		names[name] = len(authors) - 1
-		listed.add(email)
-	}
-
-	// Write author names in GUI about modal
+	// Write authors to the about dialog
 
 
-	getContributions(authors)
-	sort.Sort(byContributions(authors))
+	slices.SortFunc(authors, func(a, b author) int {
+		return cmp.Or(
+			-cmp.Compare(a.log10commits, b.log10commits),
+			cmp.Compare(strings.ToLower(a.name), strings.ToLower(b.name)))
+	})
 
 
 	var lines []string
 	var lines []string
 	for _, author := range authors {
 	for _, author := range authors {
-		if authorBotsRe.MatchString(author.name) {
-			// Only humans are eligible, pending future legislation to the
-			// contrary.
-			continue
-		}
 		lines = append(lines, author.name)
 		lines = append(lines, author.name)
 	}
 	}
 	replacement := strings.Join(lines, ", ")
 	replacement := strings.Join(lines, ", ")
 
 
 	authorsRe := regexp.MustCompile(`(?s)id="contributor-list">.*?</div>`)
 	authorsRe := regexp.MustCompile(`(?s)id="contributor-list">.*?</div>`)
-	bs := readAll(htmlFile)
+	bs, err := os.ReadFile(htmlFile)
+	if err != nil {
+		log.Fatal(err)
+	}
 	bs = authorsRe.ReplaceAll(bs, []byte("id=\"contributor-list\">\n"+replacement+"\n          </div>"))
 	bs = authorsRe.ReplaceAll(bs, []byte("id=\"contributor-list\">\n"+replacement+"\n          </div>"))
 
 
 	if err := os.WriteFile(htmlFile, bs, 0o644); err != nil {
 	if err := os.WriteFile(htmlFile, bs, 0o644); err != nil {
@@ -125,8 +99,6 @@ func main() {
 
 
 	// Write AUTHORS file
 	// Write AUTHORS file
 
 
-	sort.Sort(byName(authors))
-
 	out, err := os.Create("AUTHORS")
 	out, err := os.Create("AUTHORS")
 	if err != nil {
 	if err != nil {
 		log.Fatal(err)
 		log.Fatal(err)
@@ -141,16 +113,22 @@ func main() {
 		for _, email := range author.emails {
 		for _, email := range author.emails {
 			fmt.Fprintf(out, " <%s>", email)
 			fmt.Fprintf(out, " <%s>", email)
 		}
 		}
-		fmt.Fprintf(out, "\n")
+		fmt.Fprint(out, "\n")
 	}
 	}
 	out.Close()
 	out.Close()
 }
 }
 
 
-func getAuthors() []author {
-	bs := readAll("AUTHORS")
-	lines := strings.Split(string(bs), "\n")
-	var authors []author
+func getAuthors() *authorSet {
+	bs, err := os.ReadFile("AUTHORS")
+	if err != nil {
+		log.Fatal(err)
+	}
 
 
+	lines := strings.Split(string(bs), "\n")
+	authors := &authorSet{
+		emails:  make(map[string]int),
+		commits: make(map[string]stringSet),
+	}
 	for _, line := range lines {
 	for _, line := range lines {
 		if len(line) == 0 || line[0] == '#' {
 		if len(line) == 0 || line[0] == '#' {
 			continue
 			continue
@@ -159,7 +137,9 @@ func getAuthors() []author {
 		fields := strings.Fields(line)
 		fields := strings.Fields(line)
 		var author author
 		var author author
 		for _, field := range fields {
 		for _, field := range fields {
-			if m := nicknameRe.FindStringSubmatch(field); len(m) > 1 {
+			if field == "#" {
+				break
+			} else if m := nicknameRe.FindStringSubmatch(field); len(m) > 1 {
 				author.nickname = m[1]
 				author.nickname = m[1]
 			} else if m := emailRe.FindStringSubmatch(field); len(m) > 1 {
 			} else if m := emailRe.FindStringSubmatch(field); len(m) > 1 {
 				author.emails = append(author.emails, m[1])
 				author.emails = append(author.emails, m[1])
@@ -172,53 +152,11 @@ func getAuthors() []author {
 			}
 			}
 		}
 		}
 
 
-		authors = append(authors, author)
+		authors.add(author)
 	}
 	}
 	return authors
 	return authors
 }
 }
 
 
-func readAll(path string) []byte {
-	fd, err := os.Open(path)
-	if err != nil {
-		log.Fatal(err)
-	}
-	defer fd.Close()
-
-	bs, err := io.ReadAll(fd)
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	return bs
-}
-
-// Add number of commits per author to the author list.
-func getContributions(authors []author) {
-	buf := new(bytes.Buffer)
-	cmd := exec.Command("git", "log", "--pretty=format:%ae")
-	cmd.Stdout = buf
-	err := cmd.Run()
-	if err != nil {
-		log.Fatal(err)
-	}
-
-next:
-	for _, line := range strings.Split(buf.String(), "\n") {
-		for i := range authors {
-			for _, email := range authors[i].emails {
-				if email == line {
-					authors[i].commits++
-					continue next
-				}
-			}
-		}
-	}
-
-	for i := range authors {
-		authors[i].log10commits = int(math.Log10(float64(authors[i].commits + 1)))
-	}
-}
-
 // list of commits that we don't include in our author file; because they
 // list of commits that we don't include in our author file; because they
 // are legacy things that don't affect code, are committed with incorrect
 // are legacy things that don't affect code, are committed with incorrect
 // address, or for other reasons.
 // address, or for other reasons.
@@ -230,102 +168,95 @@ var excludeCommits = stringSetFromStrings([]string{
 	"9bdcadf6345aba3a939e9e58d85b89dbe9d44bc9",
 	"9bdcadf6345aba3a939e9e58d85b89dbe9d44bc9",
 	"b933e9666abdfcd22919dd458c930d944e1e1b7f",
 	"b933e9666abdfcd22919dd458c930d944e1e1b7f",
 	"b84d960a81c1282a79e2b9477558de4f1af6faae",
 	"b84d960a81c1282a79e2b9477558de4f1af6faae",
+	"4dfb9d7c83ed172f12ae19408517961f4a49beeb",
 })
 })
 
 
 // allAuthors returns the set of authors in the git commit log, except those
 // allAuthors returns the set of authors in the git commit log, except those
 // in excluded commits.
 // in excluded commits.
-func allAuthors() map[string]string {
-	// Format is hash, email, name, newline, body. The body is indented with
-	// one space, to differentiate from the hash lines.
-	args := append([]string{"log", "--format=%H %ae %an%n%w(,1,1)%b"})
-	cmd := exec.Command("git", args...)
-	bs, err := cmd.Output()
+func addAuthors(authors *authorSet) {
+	// All existing source-tracked files
+	bs, err := exec.Command("git", "ls-tree", "-r", "HEAD", "--name-only").CombinedOutput()
 	if err != nil {
 	if err != nil {
-		log.Fatal("git:", err)
+		fmt.Println(string(bs))
+		log.Fatal("git ls-tree:", err)
 	}
 	}
+	files := strings.Split(string(bs), "\n")
+	files = slices.DeleteFunc(files, func(s string) bool {
+		return !(strings.HasPrefix(s, "assets/") ||
+			strings.HasPrefix(s, "cmd/") ||
+			strings.HasPrefix(s, "etc/") ||
+			strings.HasPrefix(s, "gui/") ||
+			strings.HasPrefix(s, "internal/") ||
+			strings.HasPrefix(s, "lib/") ||
+			strings.HasPrefix(s, "proto/") ||
+			strings.HasPrefix(s, "script/") ||
+			strings.HasPrefix(s, "test/") ||
+			strings.HasPrefix(s, "Dockerfile") ||
+			s == "build.go")
+	})
 
 
 	coAuthoredPrefix := "Co-authored-by: "
 	coAuthoredPrefix := "Co-authored-by: "
-	names := make(map[string]string)
-	skipCommit := false
-	for _, line := range bytes.Split(bs, []byte{'\n'}) {
-		if len(line) == 0 {
-			continue
+	for _, file := range files {
+		// All commits affecting those files, following any renames to their
+		// origin. Format is hash, email, name, newline, body. The body is
+		// indented with one space, to differentiate from the hash lines.
+		args := []string{"log", "--format=%H %ae %an%n%w(,1,1)%b", "--follow", "--", file}
+		bs, err = exec.Command("git", args...).CombinedOutput()
+		if err != nil {
+			fmt.Println(string(bs))
+			log.Fatal("git log:", err)
 		}
 		}
 
 
-		switch line[0] {
-		case ' ':
-			// Look for Co-authored-by: lines in the commit body.
-			if skipCommit {
+		skipCommit := false
+		var hash, email, name string
+		for _, line := range bytes.Split(bs, []byte{'\n'}) {
+			if len(line) == 0 {
 				continue
 				continue
 			}
 			}
 
 
-			line = line[1:]
-			if bytes.HasPrefix(line, []byte(coAuthoredPrefix)) {
-				// Co-authored-by: Name Name <[email protected]>
-				line = line[len(coAuthoredPrefix):]
-				if name, email, ok := strings.Cut(string(line), "<"); ok {
-					name = strings.TrimSpace(name)
-					email = strings.Trim(strings.TrimSpace(email), "<>")
-					if email == "@" {
-						// GitHub special for users who hide their email.
-						continue
-					}
-					if names[email] == "" {
-						names[email] = name
+			switch line[0] {
+			case ' ':
+				// Look for Co-authored-by: lines in the commit body.
+				if skipCommit {
+					continue
+				}
+
+				line = line[1:]
+				if bytes.HasPrefix(line, []byte(coAuthoredPrefix)) {
+					// Co-authored-by: Name Name <[email protected]>
+					line = line[len(coAuthoredPrefix):]
+					if name, email, ok := strings.Cut(string(line), "<"); ok {
+						name = strings.TrimSpace(name)
+						email = strings.Trim(strings.TrimSpace(email), "<>")
+						if email == "@" {
+							// GitHub special for users who hide their email.
+							continue
+						}
+						authors.setName(email, name)
+						authors.addCommit(email, hash)
 					}
 					}
 				}
 				}
-			}
 
 
-		default: // hash email name
-			fields := strings.SplitN(string(line), " ", 3)
-			if len(fields) != 3 {
-				continue
-			}
-			hash, email, name := fields[0], fields[1], fields[2]
+			default: // hash email name
+				fields := strings.SplitN(string(line), " ", 3)
+				if len(fields) != 3 {
+					continue
+				}
+				hash, email, name = fields[0], fields[1], fields[2]
 
 
-			if excludeCommits.has(hash) {
-				skipCommit = true
-				continue
-			}
-			skipCommit = false
+				if excludeCommits.has(hash) {
+					skipCommit = true
+					continue
+				}
+				skipCommit = false
 
 
-			if names[email] == "" {
-				names[email] = name
+				authors.setName(email, name)
+				authors.addCommit(email, hash)
 			}
 			}
 		}
 		}
 	}
 	}
-
-	return names
-}
-
-type byContributions []author
-
-func (l byContributions) Len() int { return len(l) }
-
-// Sort first by log10(commits), then by name. This means that we first get
-// an alphabetic list of people with >= 1000 commits, then a list of people
-// with >= 100 commits, and so on.
-func (l byContributions) Less(a, b int) bool {
-	if l[a].log10commits != l[b].log10commits {
-		return l[a].log10commits > l[b].log10commits
-	}
-	return l[a].name < l[b].name
-}
-
-func (l byContributions) Swap(a, b int) { l[a], l[b] = l[b], l[a] }
-
-type byName []author
-
-func (l byName) Len() int { return len(l) }
-
-func (l byName) Less(a, b int) bool {
-	aname := strings.ToLower(l[a].name)
-	bname := strings.ToLower(l[b].name)
-	return aname < bname
 }
 }
 
 
-func (l byName) Swap(a, b int) { l[a], l[b] = l[b], l[a] }
-
 // A simple string set type
 // A simple string set type
 
 
 type stringSet map[string]struct{}
 type stringSet map[string]struct{}
@@ -347,12 +278,68 @@ func (s stringSet) has(e string) bool {
 	return ok
 	return ok
 }
 }
 
 
-func (s stringSet) except(other stringSet) stringSet {
-	diff := make(stringSet)
-	for e := range s {
-		if !other.has(e) {
-			diff.add(e)
+// A set of authors
+
+type authorSet struct {
+	authors []author
+	emails  map[string]int       // email to author index
+	commits map[string]stringSet // email to commit hashes
+}
+
+func (a *authorSet) add(author author) {
+	for _, e := range author.emails {
+		if idx, ok := a.emails[e]; ok {
+			emails := append(author.emails, a.authors[idx].emails...)
+			slices.Sort(emails)
+			emails = slices.Compact(emails)
+			a.authors[idx].name = author.name
+			a.authors[idx].emails = emails
+
+			for _, e := range emails {
+				a.emails[e] = idx
+			}
+			return
 		}
 		}
 	}
 	}
-	return diff
+
+	for _, e := range author.emails {
+		a.emails[e] = len(a.authors)
+	}
+	a.authors = append(a.authors, author)
+}
+
+func (a *authorSet) setName(email, name string) {
+	idx, ok := a.emails[email]
+	if !ok {
+		a.emails[email] = len(a.authors)
+		a.authors = append(a.authors, author{name: name, emails: []string{email}})
+	} else if a.authors[idx].name == "" {
+		a.authors[idx].name = name
+	}
+}
+
+func (a *authorSet) addCommit(email, hash string) {
+	ss, ok := a.commits[email]
+	if !ok {
+		ss = make(stringSet)
+		a.commits[email] = ss
+	}
+	ss.add(hash)
+}
+
+func (a *authorSet) filteredAuthors() []author {
+	authors := make([]author, len(a.authors))
+	copy(authors, a.authors)
+	for i, author := range authors {
+		for _, e := range author.emails {
+			authors[i].commits += len(a.commits[e])
+		}
+	}
+	authors = slices.DeleteFunc(authors, func(a author) bool {
+		return a.commits == 0 || authorBotsRe.MatchString(a.name)
+	})
+	for i := range authors {
+		authors[i].log10commits = int(math.Log10(float64(authors[i].commits)))
+	}
+	return authors
 }
 }

Some files were not shown because too many files changed in this diff