diff options
Diffstat (limited to 'maintainers')
26 files changed, 4557 insertions, 288 deletions
diff --git a/maintainers/maintainer-list.nix b/maintainers/maintainer-list.nix index 20d90e7d637..94007a0274c 100644 --- a/maintainers/maintainer-list.nix +++ b/maintainers/maintainer-list.nix @@ -48,6 +48,12 @@ See `./scripts/check-maintainer-github-handles.sh` for an example on how to work with this data. */ { + _0qq = { + email = "0qqw0qqw@gmail.com"; + github = "0qq"; + githubId = 64707304; + name = "Dmitry Kulikov"; + }; _0x4A6F = { email = "mail-maintainer@0x4A6F.dev"; name = "Joachim Ernst"; @@ -58,12 +64,46 @@ fingerprint = "F466 A548 AD3F C1F1 8C88 4576 8702 7528 B006 D66D"; }]; }; + _0xbe7a = { + email = "nix@be7a.de"; + name = "Bela Stoyan"; + github = "0xbe7a"; + githubId = 6232980; + keys = [{ + longkeyid = "rsa4096/0x6510870A77F49A99"; + fingerprint = "2536 9E86 1AA5 9EB7 4C47 B138 6510 870A 77F4 9A99"; + }]; + }; _1000101 = { email = "b1000101@pm.me"; github = "1000101"; githubId = 791309; name = "Jan Hrnko"; }; + _3699n = { + email = "nicholas@nvk.pm"; + github = "3699n"; + githubId = 7414843; + name = "Nicholas von Klitzing"; + }; + _3noch = { + email = "eacameron@gmail.com"; + github = "3noch"; + githubId = 882455; + name = "Elliot Cameron"; + }; + _414owen = { + email = "owen@owen.cafe"; + github = "414owen"; + githubId = 1714287; + name = "Owen Shepherd"; + }; + _6AA4FD = { + email = "f6442954@gmail.com"; + github = "6AA4FD"; + githubId = 12578560; + name = "Quinn Bohner"; + }; a1russell = { email = "adamlr6+pub@gmail.com"; github = "a1russell"; @@ -88,12 +128,24 @@ githubId = 2258953; name = "Aaron Schif"; }; + aaschmid = { + email = "service@aaschmid.de"; + github = "aaschmid"; + githubId = 567653; + name = "Andreas Schmid"; + }; abaldeau = { email = "andreas@baldeau.net"; github = "baldo"; githubId = 178750; name = "Andreas Baldeau"; }; + abathur = { + email = "travis.a.everett+nixpkgs@gmail.com"; + github = "abathur"; + githubId = 2548365; + name = "Travis A. Everett"; + }; abbe = { email = "ashish.is@lostca.se"; github = "wahjava"; @@ -158,6 +210,12 @@ githubId = 124545; name = "Anthony Cowley"; }; + adamlwgriffiths = { + email = "adam.lw.griffiths@gmail.com"; + github = "adamlwgriffiths"; + githubId = 1239156; + name = "Adam Griffiths"; + }; adamt = { email = "mail@adamtulinius.dk"; github = "adamtulinius"; @@ -176,8 +234,14 @@ githubId = 1773511; name = "Adrien Devresse"; }; + addict3d = { + email = "nickbathum@gmail.com"; + github = "addict3d"; + githubId = 49227; + name = "Nick Bathum"; + }; adisbladis = { - email = "adis@blad.is"; + email = "adisbladis@gmail.com"; github = "adisbladis"; githubId = 63286; name = "Adam Hose"; @@ -236,8 +300,14 @@ githubId = 335271; name = "James Alexander Feldman-Crough"; }; + afontain = { + email = "antoine.fontaine@epfl.ch"; + github = "necessarily-equal"; + githubId = 59283660; + name = "Antoine Fontaine"; + }; aforemny = { - email = "alexanderforemny@googlemail.com"; + email = "aforemny@posteo.de"; github = "aforemny"; githubId = 610962; name = "Alexander Foremny"; @@ -248,6 +318,12 @@ githubId = 4296804; name = "Alex Franchuk"; }; + agbrooks = { + email = "andrewgrantbrooks@gmail.com"; + github = "agbrooks"; + githubId = 19290901; + name = "Andrew Brooks"; + }; aherrmann = { email = "andreash87@gmx.ch"; github = "aherrmann"; @@ -320,6 +396,12 @@ githubId = 786394; name = "Alexander Krupenkin "; }; + akshgpt7 = { + email = "akshgpt7@gmail.com"; + github = "akshgpt7"; + githubId = 20405311; + name = "Aksh Gupta"; + }; albakham = { email = "dev@geber.ga"; github = "albakham"; @@ -368,6 +450,12 @@ githubId = 782180; name = "Alex Vorobiev"; }; + alex-eyre = { + email = "A.Eyre@sms.ed.ac.uk"; + github = "alex-eyre"; + githubId = 38869148; + name = "Alex Eyre"; + }; algorith = { email = "dries_van_daele@telenet.be"; name = "Dries Van Daele"; @@ -378,6 +466,12 @@ githubId = 2822871; name = "Alistair Bill"; }; + alirezameskin = { + email = "alireza.meskin@gmail.com"; + github = "alirezameskin"; + githubId = 36147; + name = "Alireza Meskin"; + }; alkeryn = { email = "plbraundev@gmail.com"; github = "Alkeryn"; @@ -426,12 +520,24 @@ fingerprint = "B422 CFB1 C9EF 73F7 E1E2 698D F53E 3233 42F7 A6D3A"; }]; }; + amanjeev = { + email = "aj@amanjeev.com"; + github = "amanjeev"; + githubId = 160476; + name = "Amanjeev Sethi"; + }; amar1729 = { email = "amar.paul16@gmail.com"; github = "amar1729"; githubId = 15623522; name = "Amar Paul"; }; + ambroisie = { + email = "bruno.nixpkgs@belanyi.fr"; + github = "ambroisie"; + githubId = 12465195; + name = "Bruno BELANYI"; + }; ambrop72 = { email = "ambrop7@gmail.com"; github = "ambrop72"; @@ -508,11 +614,11 @@ githubId = 638836; name = "Andreas Rammhold"; }; - andreabedini = { - email = "andrea@kzn.io"; - github = "andreabedini"; - githubId = 69135; - name = "Andrea Bedini"; + andreasfelix = { + email = "fandreas@physik.hu-berlin.de"; + github = "andreasfelix"; + githubId = 24651767; + name = "Felix Andreas"; }; andres = { email = "ksnixos@andres-loeh.de"; @@ -520,6 +626,12 @@ githubId = 293191; name = "Andres Loeh"; }; + andresilva = { + email = "andre.beat@gmail.com"; + github = "andresilva"; + githubId = 123550; + name = "André Silva"; + }; andrestylianos = { email = "andre.stylianos@gmail.com"; github = "andrestylianos"; @@ -550,6 +662,12 @@ githubId = 3808928; name = "Anders Sildnes"; }; + andys8 = { + email = "andys8@users.noreply.github.com"; + github = "andys8"; + githubId = 13085980; + name = "Andy"; + }; aneeshusa = { email = "aneeshusa@gmail.com"; github = "aneeshusa"; @@ -562,6 +680,28 @@ githubId = 11699655; name = "Stanislas Lange"; }; + angustrau = { + name = "Angus Trau"; + email = "nix@angus.ws"; + github = "angustrau"; + githubId = 13267947; + }; + anhdle14 = { + name = "Le Anh Duc"; + email = "anhdle14@icloud.com"; + github = "anhdle14"; + githubId = 9645992; + keys = [{ + longkeyid = "rsa4096/0x0299AFF9ECBB5169"; + fingerprint = "AA4B 8EC3 F971 D350 482E 4E20 0299 AFF9 ECBB 5169"; + }]; + }; + anhduy = { + email = "vo@anhduy.io"; + github = "voanhduy1512"; + githubId = 1771266; + name = "Vo Anh Duy"; + }; ankhers = { email = "me@ankhers.dev"; github = "ankhers"; @@ -628,6 +768,16 @@ githubId = 1078530; name = "Alexandre Peyroux"; }; + applePrincess = { + email = "appleprincess@appleprincess.io"; + github = "applePrincess"; + githubId = 17154507; + name = "Lein Matsumaru"; + keys = [{ + longkeyid = "rsa4096/0xAAA50652F0479205"; + fingerprint = "BF8B F725 DA30 E53E 7F11 4ED8 AAA5 0652 F047 9205"; + }]; + }; ar1a = { email = "aria@ar1as.space"; github = "ar1a"; @@ -640,18 +790,36 @@ githubId = 56009; name = "Arcadio Rubio García"; }; + archseer = { + email = "blaz@mxxn.io"; + github = "archseer"; + githubId = 1372918; + name = "Blaž Hrastnik"; + }; arcnmx = { email = "arcnmx@users.noreply.github.com"; github = "arcnmx"; githubId = 13426784; name = "arcnmx"; }; + arcticlimer = { + email = "vinigm.nho@gmail.com"; + github = "arcticlimer"; + githubId = 59743220; + name = "Vinícius Müller"; + }; ardumont = { email = "eniotna.t@gmail.com"; github = "ardumont"; githubId = 718812; name = "Antoine R. Dumont"; }; + arezvov = { + email = "alex@rezvov.ru"; + github = "arezvov"; + githubId = 58516559; + name = "Alexander Rezvov"; + }; arianvp = { email = "arian.vanputten@gmail.com"; github = "arianvp"; @@ -670,6 +838,12 @@ githubId = 1296771; name = "Anders Riutta"; }; + armijnhemel = { + email = "armijn@tjaldur.nl"; + github = "armijnhemel"; + githubId = 10587952; + name = "Armijn Hemel"; + }; arnarg = { email = "arnarg@fastmail.com"; github = "arnarg"; @@ -704,6 +878,12 @@ githubId = 3965744; name = "Arthur Lee"; }; + arthurteisseire = { + email = "arthurteisseire33@gmail.com"; + github = "arthurteisseire"; + githubId = 37193992; + name = "Arthur Teisseire"; + }; arturcygan = { email = "arczicygan@gmail.com"; github = "arcz"; @@ -746,6 +926,12 @@ githubId = 869771; name = "Kirill Boltaev"; }; + ashley = { + email = "personavinny@protonmail.com"; + github = "paranoidcat"; + githubId = 84152630; + name = "Ashley Chiara"; + }; asppsa = { email = "asppsa@gmail.com"; github = "asppsa"; @@ -775,6 +961,10 @@ github = "aszlig"; githubId = 192147; name = "aszlig"; + keys = [{ + longkeyid = "ed25519/0x684089CE67EBB691"; + fingerprint = "DD52 6BC7 767D BA28 16C0 95E5 6840 89CE 67EB B691"; + }]; }; atemu = { name = "Atemu"; @@ -800,12 +990,24 @@ githubId = 706854; name = "Etienne Laurin"; }; + attila-lendvai = { + name = "Attila Lendvai"; + email = "attila@lendvai.name"; + github = "attila-lendvai"; + githubId = 840345; + }; auntie = { email = "auntieNeo@gmail.com"; github = "auntieNeo"; githubId = 574938; name = "Jonathan Glines"; }; + austinbutler = { + email = "austinabutler@gmail.com"; + github = "austinbutler"; + githubId = 354741; + name = "Austin Butler"; + }; avaq = { email = "nixpkgs@account.avaq.it"; github = "avaq"; @@ -824,6 +1026,12 @@ githubId = 687218; name = "averelld"; }; + avh4 = { + email = "gruen0aermel@gmail.com"; + github = "avh4"; + githubId = 1222; + name = "Aaron VonderHaar"; + }; avitex = { email = "theavitex@gmail.com"; github = "avitex"; @@ -852,6 +1060,12 @@ githubId = 135230; name = "Aycan iRiCAN"; }; + arjix = { + email = "arjix@protonmail.com"; + github = "arjix"; + githubId = 62168569; + name = "arjix"; + }; artturin = { email = "artturin@artturin.com"; github = "artturin"; @@ -872,7 +1086,21 @@ email = "babathriviere@gmail.com"; github = "babariviere"; githubId = 12128029; - name = "babariviere"; + name = "Bastien Rivière"; + keys = [{ + longkeyid = "rsa4096/0xF202AD3B6EDF4BD1"; + fingerprint = "2F85 B362 B274 0012 37E2 81EE F202 AD3B 6EDF 4BD1"; + }]; + }; + babbaj = { + name = "babbaj"; + email = "babbaj45@gmail.com"; + github = "babbaj"; + githubId = 12820770; + keys = [{ + longkeyid = "rsa4096/0xF044309848A07CAC"; + fingerprint = "6FBC A462 4EAF C69C A7C4 98C1 F044 3098 48A0 7CAC"; + }]; }; bachp = { email = "pascal.bach@nextrem.ch"; @@ -886,9 +1114,9 @@ githubId = 1017537; name = "Bruno Bieth"; }; - badi = { - email = "abdulwahidc@gmail.com"; - github = "badi"; + badmutex = { + email = "github@badi.sh"; + github = "badmutex"; githubId = 35324; name = "Badi' Abdul-Wahid"; }; @@ -896,6 +1124,12 @@ email = "sivaraman.balaji@gmail.com"; name = "Balaji Sivaraman"; }; + baloo = { + email = "nixpkgs@superbaloo.net"; + github = "baloo"; + githubId = 59060; + name = "Arthur Gautier"; + }; balsoft = { email = "balsoft75@gmail.com"; github = "balsoft"; @@ -920,6 +1154,16 @@ githubId = 75235; name = "Michael Walker"; }; + bartuka = { + email = "wand@hey.com"; + github = "wandersoncferreira"; + githubId = 17708295; + name = "Wanderson Ferreira"; + keys = [{ + longkeyid = "rsa4096/0x56840A614DBE37AE"; + fingerprint = "A3E1 C409 B705 50B3 BF41 492B 5684 0A61 4DBE 37AE"; + }]; + }; basvandijk = { email = "v.dijk.bas@gmail.com"; github = "basvandijk"; @@ -956,6 +1200,12 @@ githubId = 1015044; name = "Brandon Carrell"; }; + bcc32 = { + email = "me@bcc32.com"; + github = "bcc32"; + githubId = 1239097; + name = "Aaron Zeng"; + }; bcdarwin = { email = "bcdarwin@gmail.com"; github = "bcdarwin"; @@ -974,6 +1224,18 @@ githubId = 14111; name = "Brandon Dimcheff"; }; + beardhatcode = { + name = "Robbert Gurdeep Singh"; + email = "nixpkgs@beardhatcode.be"; + github = "beardhatcode"; + githubId = 662538; + }; + beezow = { + name = "beezow"; + email = "zbeezow@gmail.com"; + github = "beezow"; + githubId = 42082156; + }; bendlas = { email = "herwig@bendlas.net"; github = "bendlas"; @@ -986,6 +1248,22 @@ githubId = 1432730; name = "Benjamin Staffin"; }; + benneti = { + name = "Benedikt Tissot"; + email = "benedikt.tissot@googlemail.com"; + github = "benneti"; + githubId = 11725645; + }; + bertof = { + name = "Filippo Berto"; + email = "berto.f@protonmail.com"; + github = "bertof"; + githubId = 9915675; + keys = [{ + longkeyid = "rsa4096/0xFE98AE5EC52B1056"; + fingerprint = "17C5 1EF9 C0FE 2EB2 FE56 BB53 FE98 AE5E C52B 1056"; + }]; + }; bennofs = { email = "benno.fuenfstueck@gmail.com"; github = "bennofs"; @@ -1004,6 +1282,12 @@ githubId = 75972; name = "Ben Booth"; }; + berberman = { + email = "berberman@yandex.com"; + github = "berberman"; + githubId = 26041945; + name = "Potato Hatsue"; + }; berce = { email = "bert.moens@gmail.com"; github = "berce"; @@ -1098,6 +1382,12 @@ githubId = 37907; name = "Julian Stecklina"; }; + bloomvdomino = { + name = "Laura Fäßler"; + email = "0x@ytex.de"; + github = "bloomvdomino"; + githubId = 33204710; + }; bluescreen303 = { email = "mathijs@bluescreen303.nl"; github = "bluescreen303"; @@ -1110,6 +1400,12 @@ github = "bmilanov"; githubId = 30090366; }; + bmwalters = { + name = "Bradley Walters"; + email = "oss@walters.app"; + github = "bmwalters"; + githubId = 4380777; + }; bobakker = { email = "bobakk3r@gmail.com"; github = "bobakker"; @@ -1134,9 +1430,15 @@ githubId = 50839; name = "Brian Jones"; }; - boothead = { + bootstrap-prime = { + email = "bootstrap.prime@gmail.com"; + github = "bootstrap-prime"; + githubId = 68566724; + name = "bootstrap-prime"; + }; + commandodev = { email = "ben@perurbis.com"; - github = "boothead"; + github = "commandodev"; githubId = 87764; name = "Ben Ford"; }; @@ -1200,6 +1502,22 @@ githubId = 5525646; name = "Brice Waegeneire"; }; + Br1ght0ne = { + email = "brightone@protonmail.com"; + github = "Br1ght0ne"; + githubId = 12615679; + name = "Oleksii Filonenko"; + keys = [{ + longkeyid = "rsa3072/0xA1BC8428323ECFE8"; + fingerprint = "F549 3B7F 9372 5578 FDD3 D0B8 A1BC 8428 323E CFE8"; + }]; + }; + bsima = { + email = "ben@bsima.me"; + github = "bsima"; + githubId = 200617; + name = "Ben Sima"; + }; bstrik = { email = "dutchman55@gmx.com"; github = "bstrik"; @@ -1218,12 +1536,34 @@ githubId = 3043718; name = "Brett Lyons"; }; + brodes = { + email = "me@brod.es"; + github = "brhoades"; + githubId = 4763746; + name = "Billy Rhoades"; + keys = [{ + longkeyid = "rsa4096/0x8AE74787A4B7C07E"; + fingerprint = "BF4FCB85C69989B4ED95BF938AE74787A4B7C07E"; + }]; + }; + bryanasdev000 = { + email = "bryanasdev000@gmail.com"; + github = "bryanasdev000"; + githubId = 53131727; + name = "Bryan Albuquerque"; + }; btlvr = { email = "btlvr@protonmail.com"; github = "btlvr"; githubId = 32319131; name = "Brett L"; }; + buckley310 = { + email = "sean.bck@gmail.com"; + github = "buckley310"; + githubId = 2379774; + name = "Sean Buckley"; + }; buffet = { email = "niclas@countingsort.com"; github = "buffet"; @@ -1236,6 +1576,12 @@ githubId = 7214361; name = "Roman Gerasimenko"; }; + bburdette = { + email = "bburdette@protonmail.com"; + github = "bburdette"; + githubId = 157330; + name = "Ben Burdette"; + }; bzizou = { email = "Bruno@bzizou.net"; github = "bzizou"; @@ -1260,6 +1606,12 @@ githubId = 510553; name = "Jos van Bakel"; }; + c4605 = { + email = "bolasblack@gmail.com"; + github = "bolasblack"; + githubId = 382011; + name = "c4605"; + }; caadar = { email = "v88m@posteo.net"; github = "caadar"; @@ -1273,11 +1625,13 @@ name = "Vladimir Serov"; keys = [ # compare with https://keybase.io/cab404 - { longkeyid = "1BB96810926F4E715DEF567E6BA7C26C3FDF7BB3"; - fingerprint = "rsa3072/0xCBDECF658C38079E"; + { + fingerprint = "1BB96810926F4E715DEF567E6BA7C26C3FDF7BB3"; + longkeyid = "rsa3072/0xCBDECF658C38079E"; } - { longkeyid = "1EBC648C64D6045463013B3EB7EFFC271D55DB8A"; - fingerprint = "ed25519/0xB7EFFC271D55DB8A"; + { + fingerprint = "1EBC648C64D6045463013B3EB7EFFC271D55DB8A"; + longkeyid = "ed25519/0xB7EFFC271D55DB8A"; } ]; }; @@ -1365,6 +1719,18 @@ githubId = 3471749; name = "Claudio Bley"; }; + cburstedde = { + email = "burstedde@ins.uni-bonn.de"; + github = "cburstedde"; + githubId = 109908; + name = "Carsten Burstedde"; + keys = [ + { + longkeyid = "rsa2048/0x0704CD9E550A6BCD"; + fingerprint = "1127 A432 6524 BF02 737B 544E 0704 CD9E 550A 6BCD"; + } + ]; + }; cdepillabout = { email = "cdep.illabout@gmail.com"; github = "cdepillabout"; @@ -1383,6 +1749,12 @@ githubId = 977929; name = "Cody Allen"; }; + centromere = { + email = "nix@centromere.net"; + github = "centromere"; + githubId = 543423; + name = "Alex Wied"; + }; cfouche = { email = "chaddai.fouche@gmail.com"; github = "Chaddai"; @@ -1401,10 +1773,12 @@ githubId = 2054509; name = "Constantine Evans"; keys = [ - { longkeyid = "rsa4096/0xB67DB1D20A93A9F9"; + { + longkeyid = "rsa4096/0xB67DB1D20A93A9F9"; fingerprint = "32B1 6EE7 DBA5 16DE 526E 4C5A B67D B1D2 0A93 A9F9"; } - { longkeyid = "rsa4096/0x1A1D58B86AE2AABD"; + { + longkeyid = "rsa4096/0x1A1D58B86AE2AABD"; fingerprint = "669C 1D24 5A87 DB34 6BE4 3216 1A1D 58B8 6AE2 AABD"; } ]; @@ -1443,6 +1817,12 @@ githubId = 33503784; name = "Yucheng Zhang"; }; + cheriimoya = { + email = "github@hausch.xyz"; + github = "cheriimoya"; + githubId = 28303440; + name = "Max Hausch"; + }; chessai = { email = "chessai1996@gmail.com"; github = "chessai"; @@ -1471,6 +1851,12 @@ githubId = 3086255; name = "Barry Moore II"; }; + chivay = { + email = "hubert.jasudowicz@gmail.com"; + github = "chivay"; + githubId = 14790226; + name = "Hubert Jasudowicz"; + }; chkno = { email = "chuck@intelligence.org"; github = "chkno"; @@ -1535,18 +1921,46 @@ githubId = 2245737; name = "Christopher Mark Poole"; }; + chuahou = { + email = "human+github@chuahou.dev"; + github = "chuahou"; + githubId = 12386805; + name = "Chua Hou"; + }; + chvp = { + email = "nixpkgs@cvpetegem.be"; + github = "chvp"; + githubId = 42220376; + name = "Charlotte Van Petegem"; + }; ciil = { email = "simon@lackerbauer.com"; github = "ciil"; githubId = 3956062; name = "Simon Lackerbauer"; }; + citadelcore = { + email = "alex@arctarus.co.uk"; + github = "citadelcore"; + githubId = 5567402; + name = "Alex Zero"; + keys = [{ + longkeyid = "rsa4096/0xA51550EDB450302C"; + fingerprint = "A0AA 4646 B8F6 9D45 4553 5A88 A515 50ED B450 302C"; + }]; + }; cizra = { email = "todurov+nix@gmail.com"; github = "cizra"; githubId = 2131991; name = "Elmo Todurov"; }; + cjab = { + email = "chad+nixpkgs@jablonski.xyz"; + github = "cjab"; + githubId = 136485; + name = "Chad Jablonski"; + }; ck3d = { email = "ck3d@gmx.de"; github = "ck3d"; @@ -1559,16 +1973,6 @@ githubId = 46303707; name = "Christian Lütke-Stetzkamp"; }; - kampka = { - email = "christian@kampka.net"; - github = "kampka"; - githubId = 422412; - name = "Christian Kampka"; - keys = [{ - longkeyid = "ed25519/0x1CBE9645DD68E915"; - fingerprint = "F7FA 0BD0 8775 337C F6AB 4A14 1CBE 9645 DD68 E915"; - }]; - }; ckauhaus = { email = "kc@flyingcircus.io"; github = "ckauhaus"; @@ -1599,6 +2003,16 @@ githubId = 3392199; name = "Calum MacRae"; }; + cmars = { + email = "nix@cmars.tech"; + github = "cmars"; + githubId = 23741; + name = "Casey Marshall"; + keys = [{ + longkeyid = "rsa3072/0x6DEC2758ACD5A973"; + fingerprint = "6B78 7E5F B493 FA4F D009 5D10 6DEC 2758 ACD5 A973"; + }]; + }; cmcdragonkai = { email = "roger.qiu@matrix.ai"; github = "cmcdragonkai"; @@ -1635,6 +2049,12 @@ githubId = 5561189; name = "Cody Opel"; }; + cohei = { + email = "a.d.xvii.kal.mai@gmail.com"; + github = "cohei"; + githubId = 3477497; + name = "TANIGUCHI Kohei"; + }; cohencyril = { email = "cyril.cohen@inria.fr"; github = "CohenCyril"; @@ -1663,6 +2083,12 @@ fingerprint = "68B8 0D57 B2E5 4AC3 EC1F 49B0 B37E 0F23 7101 6A4C"; }]; }; + collares = { + email = "mauricio@collares.org"; + github = "collares"; + githubId = 244239; + name = "Mauricio Collares"; + }; copumpkin = { email = "pumpkingod@gmail.com"; github = "copumpkin"; @@ -1687,6 +2113,12 @@ githubId = 1740337; name = "Chris Ostrouchov"; }; + confus = { + email = "con-f-use@gmx.net"; + github = "con-f-use"; + githubId = 11145016; + name = "J.C."; + }; contrun = { email = "uuuuuu@protonmail.com"; github = "contrun"; @@ -1873,12 +2305,30 @@ githubId = 1918; name = "David Anderson"; }; + dandellion = { + email = "daniel@dodsorf.as"; + github = "dali99"; + githubId = 990767; + name = "Daniel Olsen"; + }; + daneads = { + email = "me@daneads.com"; + github = "daneads"; + githubId = 24708079; + name = "Dan Eads"; + }; danharaj = { email = "dan@obsidian.systems"; github = "danharaj"; githubId = 23366017; name = "Dan Haraj"; }; + danielbarter = { + email = "danielbarter@gmail.com"; + github = "danielbarter"; + githubId = 8081722; + name = "Daniel Barter"; + }; danieldk = { email = "me@danieldk.eu"; github = "danieldk"; @@ -1891,6 +2341,12 @@ githubId = 1298344; name = "Daniel Fullmer"; }; + dan4ik605743 = { + email = "6057430gu@gmail.com"; + github = "dan4ik605743"; + githubId = 86075850; + name = "Danil Danevich"; + }; das-g = { email = "nixpkgs@raphael.dasgupta.ch"; github = "das-g"; @@ -1903,6 +2359,16 @@ githubId = 4971975; name = "Janne Heß"; }; + dasisdormax = { + email = "dasisdormax@mailbox.org"; + github = "dasisdormax"; + githubId = 3714905; + keys = [{ + longkeyid = "rsa4096/0x02BA0D4480CA6C44"; + fingerprint = "E59B A198 61B0 A9ED C1FA 3FB2 02BA 0D44 80CA 6C44"; + }]; + name = "Maximilian Wende"; + }; dasj19 = { email = "daniel@serbanescu.dk"; github = "dasj19"; @@ -1913,6 +2379,12 @@ email = "christoph.senjak@googlemail.com"; name = "Christoph-Simon Senjak"; }; + davhau = { + email = "d.hauer.it@gmail.com"; + name = "David Hauer"; + github = "DavHau"; + githubId = 42246742; + }; david-sawatzke = { email = "d-nix@sawatzke.dev"; github = "david-sawatzke"; @@ -1959,6 +2431,16 @@ githubId = 49904992; name = "Dawid Sowa"; }; + dbirks = { + email = "david@birks.dev"; + github = "dbirks"; + githubId = 7545665; + name = "David Birks"; + keys = [{ + longkeyid = "ed25519/0xBB999F83D9A19A36"; + fingerprint = "B26F 9AD8 DA20 3392 EF87 C61A BB99 9F83 D9A1 9A36"; + }]; + }; dbohdan = { email = "dbohdan@dbohdan.com"; github = "dbohdan"; @@ -1983,18 +2465,40 @@ githubId = 75067; name = "Daniel Duan"; }; + dearrude = { + name = "Ebrahim Nejati"; + email = "dearrude@tfwno.gf"; + github = "dearrude"; + githubId = 30749142; + keys = [{ + longkeyid = "rsa4096/19151E03BF2CF012"; + fingerprint = "4E35 F2E5 2132 D654 E815 A672 DB2C BC24 2868 6000"; + }]; + }; deepfire = { email = "_deepfire@feelingofgreen.ru"; github = "deepfire"; githubId = 452652; name = "Kosyrev Serge"; }; + DeeUnderscore = { + email = "d.anzorge@gmail.com"; + github = "DeeUnderscore"; + githubId = 156239; + name = "D Anzorge"; + }; delan = { name = "Delan Azabani"; email = "delan@azabani.com"; github = "delan"; githubId = 465303; }; + deliciouslytyped = { + email = "47436522+deliciouslytyped@users.noreply.github.com"; + github = "deliciouslytyped"; + githubId = 47436522; + name = "deliciouslytyped"; + }; delroth = { email = "delroth@gmail.com"; github = "delroth"; @@ -2061,6 +2565,12 @@ githubId = 896182; name = "devhell"; }; + devins2518 = { + email = "drsingh2518@icloud.com"; + github = "devins2518"; + githubId = 17111639; + name = "Devin Singh"; + }; dezgeg = { email = "tuomas.tynkkynen@iki.fi"; github = "dezgeg"; @@ -2079,6 +2589,12 @@ githubId = 4708206; name = "Daniel Fox Franke"; }; + dgliwka = { + email = "dawid.gliwka@gmail.com"; + github = "dgliwka"; + githubId = 33262214; + name = "Dawid Gliwka"; + }; dgonyeo = { email = "derek@gonyeo.com"; github = "dgonyeo"; @@ -2091,6 +2607,30 @@ githubId = 265220; name = "David Leung"; }; + DianaOlympos = { + email = "DianaOlympos@noreply.github.com"; + github = "DianaOlympos"; + githubId = 15774340; + name = "Thomas Depierre"; + }; + diegolelis = { + email = "diego.o.lelis@gmail.com"; + github = "diegolelis"; + githubId = 8404455; + name = "Diego Lelis"; + }; + diffumist = { + email = "git@diffumist.me"; + github = "diffumist"; + githubId = 32810399; + name = "Diffumist"; + }; + diogox = { + name = "Diogo Xavier"; + email = "13244408+diogox@users.noreply.github.com"; + github = "diogox"; + githubId = 13244408; + }; dipinhora = { email = "dipinhora+github@gmail.com"; github = "dipinhora"; @@ -2121,18 +2661,36 @@ githubId = 8852888; name = "David Izquierdo"; }; + djanatyn = { + email = "djanatyn@gmail.com"; + github = "djanatyn"; + githubId = 523628; + name = "Jonathan Strickland"; + }; Dje4321 = { email = "dje4321@gmail.com"; github = "dje4321"; githubId = 10913120; name = "Dje4321"; }; + djwf = { + email = "dave@weller-fahy.com"; + github = "djwf"; + githubId = 73162; + name = "David J. Weller-Fahy"; + }; dkabot = { email = "dkabot@dkabot.com"; github = "dkabot"; githubId = 1316469; name = "Naomi Morse"; }; + dlesl = { + email = "dlesl@dlesl.com"; + github = "dlesl"; + githubId = 28980797; + name = "David Leslie"; + }; dmalikov = { email = "malikov.d.y@gmail.com"; github = "dmalikov"; @@ -2163,6 +2721,12 @@ githubId = 1708810; name = "Daniel Vianna"; }; + dnr = { + email = "dnr@dnr.im"; + github = "dnr"; + githubId = 466723; + name = "David Reiss"; + }; dochang = { email = "dochang@gmail.com"; github = "dochang"; @@ -2193,6 +2757,16 @@ githubId = 6806011; name = "Robert Schütz"; }; + dottedmag = { + email = "dottedmag@dottedmag.net"; + github = "dottedmag"; + githubId = 16120; + name = "Misha Gusarov"; + keys = [{ + longkeyid = "rsa4096/0x9D20F6503E338888"; + fingerprint = "A8DF 1326 9E5D 9A38 E57C FAC2 9D20 F650 3E33 8888"; + }]; + }; doublec = { email = "chris.double@double.co.nz"; github = "doublec"; @@ -2215,6 +2789,12 @@ fingerprint = "4749 0887 CF3B 85A1 6355 C671 78C7 DD40 DF23 FB16"; }]; }; + dpercy = { + email = "dpercy@dpercy.dev"; + github = "dpercy"; + githubId = 349909; + name = "David Percy"; + }; dpflug = { email = "david@pflug.email"; github = "dpflug"; @@ -2243,6 +2823,26 @@ githubId = 10198051; name = "Drew Risinger"; }; + drupol = { + name = "Pol Dellaiera"; + email = "pol.dellaiera@protonmail.com"; + github = "drupol"; + githubId = 252042; + keys = [{ + longkeyid = "ed25519/0x0AAF2901E8040715"; + fingerprint = "85F3 72DF 4AF3 EF13 ED34 72A3 0AAF 2901 E804 0715"; + }]; + }; + dschrempf = { + name = "Dominik Schrempf"; + email = "dominik.schrempf@gmail.com"; + github = "dschrempf"; + githubId = 5596239; + keys = [{ + longkeyid = "rsa2048/0x875F2BCF163F1B29"; + fingerprint = "62BC E2BD 49DF ECC7 35C7 E153 875F 2BCF 163F 1B29"; + }]; + }; dsferruzza = { email = "david.sferruzza@gmail.com"; github = "dsferruzza"; @@ -2347,6 +2947,18 @@ githubId = 984691; name = "Evan Danaher"; }; + edbentley = { + email = "hello@edbentley.dev"; + github = "edbentley"; + githubId = 15923595; + name = "Ed Bentley"; + }; + edcragg = { + email = "ed.cragg@eipi.xyz"; + github = "nuxeh"; + githubId = 1516017; + name = "Ed Cragg"; + }; edef = { email = "edef@edef.eu"; github = "edef1c"; @@ -2377,6 +2989,12 @@ githubId = 18535642; name = "Emily"; }; + enderger = { + email = "endergeryt@gmail.com"; + github = "enderger"; + githubId = 36283171; + name = "Daniel"; + }; endocrimes = { email = "dani@builds.terrible.systems"; github = "endocrimes"; @@ -2389,6 +3007,12 @@ githubId = 119483; name = "Matthew Brown"; }; + eduardosm = { + email = "esm@eduardosm.net"; + github = "eduardosm"; + githubId = 761151; + name = "Eduardo Sánchez Muñoz"; + }; eduarrrd = { email = "e.bachmakov@gmail.com"; github = "eduarrrd"; @@ -2449,6 +3073,12 @@ githubId = 1753498; name = "Dejan Lukan"; }; + electrified = { + email = "ed@maidavale.org"; + github = "electrified"; + githubId = 103082; + name = "Ed Brindley"; + }; elliottvillars = { email = "elliottvillars@gmail.com"; github = "elliottvillars"; @@ -2509,6 +3139,12 @@ githubId = 57923898; name = "Elyhaka"; }; + em0lar = { + email = "nix@em0lar.dev"; + github = "em0lar"; + githubId = 11006031; + name = "Leo Maroni"; + }; emmanuelrosa = { email = "emmanuel_rosa@aol.com"; github = "emmanuelrosa"; @@ -2573,6 +3209,16 @@ githubId = 147284; name = "Jason Felice"; }; + erdnaxe = { + email = "erdnaxe@crans.org"; + github = "erdnaxe"; + githubId = 2663216; + name = "Alexandre Iooss"; + keys = [{ + longkeyid = "rsa4096/0x6C79278F3FCDCC02"; + fingerprint = "2D37 1AD2 7E2B BC77 97E1 B759 6C79 278F 3FCD CC02"; + }]; + }; ericbmerritt = { email = "eric@afiniate.com"; github = "ericbmerritt"; @@ -2598,21 +3244,33 @@ name = "John Ericson"; }; erictapen = { - email = "justin.humm@posteo.de"; + email = "kerstin@erictapen.name"; github = "erictapen"; githubId = 11532355; - name = "Justin Humm"; + name = "Kerstin Humm"; keys = [{ - longkeyid = "rsa4096/0x438871E000AA178E"; - fingerprint = "984E 4BAD 9127 4D0E AE47 FF03 4388 71E0 00AA 178E"; + longkeyid = "rsa4096/0x40293358C7B9326B"; + fingerprint = "F178 B4B4 6165 6D1B 7C15 B55D 4029 3358 C7B9 326B"; }]; }; + erikbackman = { + email = "contact@ebackman.net"; + github = "erikbackman"; + githubId = 46724898; + name = "Erik Backman"; + }; erikryb = { email = "erik.rybakken@math.ntnu.no"; github = "erikryb"; githubId = 3787281; name = "Erik Rybakken"; }; + erin = { + name = "Erin van der Veen"; + email = "erin@erinvanderveen.nl"; + github = "ErinvanderVeen"; + githubId = 10973664; + }; erosennin = { email = "ag@sologoc.com"; github = "erosennin"; @@ -2647,6 +3305,16 @@ email = "adam.copp@gmail.com"; name = "Adam Copp"; }; + ethancedwards8 = { + email = "ethan@ethancedwards.com"; + github = "ethancedwards8"; + githubId = 60861925; + name = "Ethan Carter Edwards"; + keys = [{ + longkeyid = "rsa4096/0xF93DDAFA26EF2458"; + fingerprint = "0E69 0F46 3457 D812 3387 C978 F93D DAFA 26EF 2458"; + }]; + }; ethercrow = { email = "ethercrow@gmail.com"; github = "ethercrow"; @@ -2669,12 +3337,28 @@ githubId = 2147649; name = "Euan Kemp"; }; + evalexpr = { + name = "Jonathan Wilkins"; + email = "nixos@wilkins.tech"; + github = "evalexpr"; + githubId = 23485511; + keys = [{ + longkeyid = "rsa4096/0x2D1D402E17763DD6"; + fingerprint = "8129 5B85 9C5A F703 C2F4 1E29 2D1D 402E 1776 3DD6"; + }]; + }; evanjs = { email = "evanjsx@gmail.com"; github = "evanjs"; githubId = 1847524; name = "Evan Stoll"; }; + evax = { + email = "nixos@evax.fr"; + github = "evax"; + githubId = 599997; + name = "evax"; + }; evck = { email = "eric@evenchick.com"; github = "ericevenchick"; @@ -2693,6 +3377,12 @@ githubId = 30512529; name = "Evils"; }; + ewok = { + email = "ewok@ewok.ru"; + github = "ewok"; + githubId = 454695; + name = "Artur Taranchiev"; + }; exfalso = { email = "0slemi0@gmail.com"; github = "exfalso"; @@ -2741,6 +3431,16 @@ githubId = 11909469; name = "Fabian Geiselhart"; }; + fab = { + email = "mail@fabian-affolter.ch"; + name = "Fabian Affolter"; + github = "fabaff"; + githubId = 116184; + keys = [{ + longkeyid = "dsa1024/0xE23CD2DD36A4397F"; + fingerprint = "2F6C 930F D3C4 7E38 6AFA 4EB4 E23C D2DD 36A4 397F"; + }]; + }; fabianhauser = { email = "fabian.nixos@fh2.ch"; github = "fabianhauser"; @@ -2751,6 +3451,12 @@ fingerprint = "50B7 11F4 3DFD 2018 DCE6 E8D0 8A52 A140 BEBF 7D2C"; }]; }; + fabianhjr = { + email = "fabianhjr@protonmail.com"; + github = "fabianhjr"; + githubId = 303897; + name = "Fabián Heredia Montiel"; + }; fadenb = { email = "tristan.helmich+nixos@gmail.com"; github = "fadenb"; @@ -2775,12 +3481,46 @@ githubId = 1276854; name = "Florian Peter"; }; + fbrs = { + email = "yuuki@protonmail.com"; + github = "cideM"; + githubId = 4246921; + name = "Florian Beeres"; + }; fdns = { email = "fdns02@gmail.com"; github = "fdns"; githubId = 541748; name = "Felipe Espinoza"; }; + fehnomenal = { + email = "fehnomenal@fehn.systems"; + github = "fehnomenal"; + githubId = 9959940; + name = "Andreas Fehn"; + }; + felixscheinost = { + name = "Felix Scheinost"; + email = "felix.scheinost@posteo.de"; + github = "felixscheinost"; + githubId = 31761492; + }; + felixsinger = { + email = "felixsinger@posteo.net"; + github = "felixsinger"; + githubId = 628359; + name = "Felix Singer"; + }; + felschr = { + email = "dev@felschr.com"; + github = "felschr"; + githubId = 3314323; + name = "Felix Tenley"; + keys = [{ + longkeyid = "ed25519/0x910ACB9F6BD26F58"; + fingerprint = "6AB3 7A28 5420 9A41 82D9 0068 910A CB9F 6BD2 6F58"; + }]; + }; ffinkdevs = { email = "fink@h0st.space"; github = "ffinkdevs"; @@ -2793,15 +3533,11 @@ githubId = 8182846; name = "Francesco Gazzetta"; }; - filalex77 = { - email = "brightone@protonmail.com"; - github = "filalex77"; - githubId = 12615679; - name = "Oleksii Filonenko"; - keys = [{ - longkeyid = "rsa3072/0xA1BC8428323ECFE8"; - fingerprint = "F549 3B7F 9372 5578 FDD3 D0B8 A1BC 8428 323E CFE8"; - }]; + figsoda = { + email = "figsoda@pm.me"; + github = "figsoda"; + githubId = 40620903; + name = "figsoda"; }; fionera = { email = "nix@fionera.de"; @@ -2821,6 +3557,12 @@ githubId = 10799507; name = "Karl Fischer"; }; + fitzgibbon = { + name = "Niall FitzGibbon"; + email = "fitzgibbon.niall@gmail.com"; + github = "fitzgibbon"; + githubId = 617048; + }; Flakebi = { email = "flakebi@t-online.de"; github = "Flakebi"; @@ -2837,6 +3579,12 @@ githubId = 19961516; name = "Felix Weilbach"; }; + fliegendewurst = { + email = "arne.keller@posteo.de"; + github = "FliegendeWurst"; + githubId = 12560461; + name = "Arne Keller"; + }; flokli = { email = "flokli@flokli.de"; github = "flokli"; @@ -2897,6 +3645,12 @@ githubId = 92793; name = "Friedrich von Never"; }; + fortuneteller2k = { + email = "lythe1107@gmail.com"; + github = "fortuneteller2k"; + githubId = 20619776; + name = "fortuneteller2k"; + }; fpletz = { email = "fpletz@fnordicwalking.de"; github = "fpletz"; @@ -2951,6 +3705,12 @@ githubId = 2129135; name = "Frederik Rietdijk"; }; + friedelino = { + email = "friede.mann@posteo.de"; + github = "friedelino"; + githubId = 46672819; + name = "Frido Friedemann"; + }; frlan = { email = "frank@frank.uvena.de"; github = "frlan"; @@ -2963,6 +3723,12 @@ githubId = 1943632; name = "fro_ozen"; }; + frogamic = { + email = "frogamic@protonmail.com"; + github = "frogamic"; + githubId = 10263813; + name = "Dominic Shelton"; + }; Frostman = { email = "me@slukjanov.name"; github = "Frostman"; @@ -2987,6 +3753,12 @@ githubId = 10528737; name = "Severin Fürbringer"; }; + fufexan = { + email = "fufexan@protonmail.com"; + github = "fufexan"; + githubId = 36706276; + name = "Fufezan Mihai"; + }; funfunctor = { email = "eocallaghan@alterapraxis.com"; name = "Edward O'Callaghan"; @@ -3031,6 +3803,12 @@ githubId = 606000; name = "Gabriel Adomnicai"; }; + Gabriel439 = { + email = "Gabriel439@gmail.com"; + github = "Gabriel439"; + githubId = 1313787; + name = "Gabriel Gonzalez"; + }; gal_bolle = { email = "florent.becker@ens-lyon.org"; github = "FlorentBecker"; @@ -3079,30 +3857,46 @@ githubId = 313929; name = "Gabriel Ebner"; }; - genesis = { - email = "ronan@aimao.org"; - github = "bignaux"; - githubId = 149484; - name = "Ronan Bignaux"; - }; georgewhewell = { email = "georgerw@gmail.com"; github = "georgewhewell"; githubId = 1176131; name = "George Whewell"; }; + georgyo = { + email = "george@shamm.as"; + github = "georgyo"; + githubId = 19374; + name = "George Shammas"; + keys = [{ + longkeyid = "rsa4096/0x82BB70D541AE2DB4"; + fingerprint = "D0CF 440A A703 E0F9 73CB A078 82BB 70D5 41AE 2DB4"; + }]; + }; gerschtli = { email = "tobias.happ@gmx.de"; github = "Gerschtli"; githubId = 10353047; name = "Tobias Happ"; }; + gfrascadorio = { + email = "gfrascadorio@tutanota.com"; + github = "gfrascadorio"; + githubId = 37602871; + name = "Galois"; + }; ggpeti = { email = "ggpeti@gmail.com"; github = "ggpeti"; githubId = 3217744; name = "Peter Ferenczy"; }; + ghuntley = { + email = "ghuntley@ghuntley.com"; + github = "ghuntley"; + githubId = 127353; + name = "Geoffrey Huntley"; + }; gila = { email = "jeffry.molanus@gmail.com"; github = "gila"; @@ -3155,12 +3949,6 @@ githubId = 1447245; name = "Robin Gloster"; }; - gnidorah = { - email = "gnidorah@users.noreply.github.com"; - github = "gnidorah"; - githubId = 12064730; - name = "gnidorah"; - }; gnxlxnxx = { email = "gnxlxnxx@web.de"; github = "gnxlxnxx"; @@ -3191,18 +3979,40 @@ githubId = 1621335; name = "Andrew Trachenko"; }; + govanify = { + name = "Gauvain 'GovanifY' Roussel-Tarbouriech"; + email = "gauvain@govanify.com"; + github = "govanify"; + githubId = 6375438; + keys = [{ + longkeyid = "rsa4096/0xDE62E1E2A6145556"; + fingerprint = "5214 2D39 A7CE F8FA 872B CA7F DE62 E1E2 A614 5556"; + }]; + }; gpyh = { email = "yacine.hmito@gmail.com"; github = "yacinehmito"; githubId = 6893840; name = "Yacine Hmito"; }; + graham33 = { + email = "graham@grahambennett.org"; + github = "graham33"; + githubId = 10908649; + name = "Graham Bennett"; + }; grahamc = { email = "graham@grahamc.com"; github = "grahamc"; githubId = 76716; name = "Graham Christensen"; }; + gravndal = { + email = "gaute.ravndal+nixos@gmail.com"; + github = "gravndal"; + githubId = 4656860; + name = "Gaute Ravndal"; + }; grburst = { email = "GRBurst@protonmail.com"; github = "GRBurst"; @@ -3213,6 +4023,12 @@ fingerprint = "7FC7 98AB 390E 1646 ED4D 8F1F 797F 6238 68CD 00C2"; }]; }; + greizgh = { + email = "greizgh@ephax.org"; + github = "greizgh"; + githubId = 1313624; + name = "greizgh"; + }; greydot = { email = "lanablack@amok.cc"; github = "greydot"; @@ -3225,6 +4041,12 @@ githubId = 201997; name = "Eric Seidel"; }; + gspia = { + email = "iahogsp@gmail.com"; + github = "gspia"; + githubId = 3320792; + name = "gspia"; + }; guibert = { email = "david.guibert@gmail.com"; github = "dguibert"; @@ -3237,6 +4059,18 @@ githubId = 343415; name = "Greg Roodt"; }; + gschwartz = { + email = "gsch@pennmedicine.upenn.edu"; + github = "GregorySchwartz"; + githubId = 2490088; + name = "Gregory Schwartz"; + }; + gtrunsec = { + email = "gtrunsec@hardenedlinux.org"; + github = "GTrunSec"; + githubId = 21156405; + name = "GuangTao Zhang"; + }; guibou = { email = "guillaum.bouchard@gmail.com"; github = "guibou"; @@ -3255,6 +4089,12 @@ githubId = 10654650; name = "Guillaume Koenig"; }; + guserav = { + email = "guserav@users.noreply.github.com"; + github = "guserav"; + githubId = 28863828; + name = "guserav"; + }; guyonvarch = { email = "joris@guyonvarch.me"; github = "guyonvarch"; @@ -3267,6 +4107,18 @@ githubId = 443978; name = "Gabriel Volpe"; }; + gytis-ivaskevicius = { + name = "Gytis Ivaskevicius"; + email = "me@gytis.io"; + github = "gytis-ivaskevicius"; + githubId = 23264966; + }; + hagl = { + email = "harald@glie.be"; + github = "hagl"; + githubId = 1162118; + name = "Harald Gliebe"; + }; hakuch = { email = "hakuch@gmail.com"; github = "hakuch"; @@ -3279,6 +4131,12 @@ githubId = 1742172; name = "Hamish Hutchings"; }; + hanemile = { + email = "mail@emile.space"; + github = "hanemile"; + githubId = 22756350; + name = "Emile Hansmaennel"; + }; hansjoergschurr = { email = "commits@schurr.at"; github = "hansjoergschurr"; @@ -3295,6 +4153,18 @@ fingerprint = "74B1 F67D 8E43 A94A 7554 0768 9CCC E364 02CB 49A6"; }]; }; + happysalada = { + email = "raphael@megzari.com"; + github = "happysalada"; + githubId = 5317234; + name = "Raphael Megzari"; + }; + happy-river = { + email = "happyriver93@runbox.com"; + github = "happy-river"; + githubId = 54728477; + name = "Happy River"; + }; haslersn = { email = "haslersn@fius.informatik.uni-stuttgart.de"; github = "haslersn"; @@ -3349,12 +4219,24 @@ githubId = 2405974; name = "Sébastian Méric de Bellefon"; }; + henrikolsson = { + email = "henrik@fixme.se"; + github = "henrikolsson"; + githubId = 982322; + name = "Henrik Olsson"; + }; henrytill = { email = "henrytill@gmail.com"; github = "henrytill"; githubId = 6430643; name = "Henry Till"; }; + heph2 = { + email = "srht@mrkeebs.eu"; + github = "heph2"; + githubId = 87579883; + name = "Marco"; + }; herberteuler = { email = "herberteuler@gmail.com"; github = "herberteuler"; @@ -3379,10 +4261,38 @@ githubId = 3656888; name = "hhm"; }; + higebu = { + name = "Yuya Kusakabe"; + email = "yuya.kusakabe@gmail.com"; + github = "higebu"; + githubId = 733288; + }; hinton = { email = "t@larkery.com"; name = "Tom Hinton"; }; + hirenashah = { + email = "hiren@hiren.io"; + github = "hirenashah"; + githubId = 19825977; + name = "Hiren Shah"; + }; + hiro98 = { + email = "hiro@protagon.space"; + github = "vale981"; + githubId = 4025991; + name = "Valentin Boettcher"; + keys = [{ + longkeyid = "rsa2048/0xC22D4DE4D7B32D19"; + fingerprint = "45A9 9917 578C D629 9F5F B5B4 C22D 4DE4 D7B3 2D19"; + }]; + }; + hjones2199 = { + email = "hjones2199@gmail.com"; + github = "hjones2199"; + githubId = 5525217; + name = "Hunter Jones"; + }; hkjn = { email = "me@hkjn.me"; name = "Henrik Jonsson"; @@ -3409,18 +4319,66 @@ fingerprint = "78C2 E81C 828A 420B 269A EBC1 49FA 39F8 A7F7 35F9"; }]; }; + humancalico = { + email = "humancalico@disroot.org"; + github = "humancalico"; + githubId = 51334444; + name = "Akshat Agarwal"; + }; hodapp = { email = "hodapp87@gmail.com"; github = "Hodapp87"; githubId = 896431; name = "Chris Hodapp"; }; + holymonson = { + email = "holymonson@gmail.com"; + github = "holymonson"; + githubId = 902012; + name = "Monson Shao"; + }; + hongchangwu = { + email = "wuhc85@gmail.com"; + github = "hongchangwu"; + githubId = 362833; + name = "Hongchang Wu"; + }; + hoppla20 = { + email = "privat@vincentcui.de"; + github = "hoppla20"; + githubId = 25618740; + name = "Vincent Cui"; + }; + hoverbear = { + email = "operator+nix@hoverbear.org"; + github = "hoverbear"; + githubId = 130903; + name = "Ana Hobden"; + }; + holgerpeters = { + name = "Holger Peters"; + email = "holger.peters@posteo.de"; + github = "HolgerPeters"; + githubId = 4097049; + }; + hqurve = { + email = "hqurve@outlook.com"; + github = "hqurve"; + githubId = 53281855; + name = "hqurve"; + }; hrdinka = { email = "c.nix@hrdinka.at"; github = "hrdinka"; githubId = 1436960; name = "Christoph Hrdinka"; }; + hrhino = { + email = "hora.rhino@gmail.com"; + github = "hrhino"; + githubId = 28076058; + name = "Harrison Houghton"; + }; hschaeidt = { email = "he.schaeidt@gmail.com"; github = "hschaeidt"; @@ -3433,18 +4391,48 @@ githubId = 39689; name = "Hugo Tavares Reis"; }; + hugolgst = { + email = "hugo.lageneste@pm.me"; + github = "hugolgst"; + githubId = 15371828; + name = "Hugo Lageneste"; + }; + hypersw = { + email = "baltic@hypersw.net"; + github = "hypersw"; + githubId = 2332070; + name = "Serge Baltic"; + }; hyphon81 = { email = "zero812n@gmail.com"; github = "hyphon81"; githubId = 12491746; name = "Masato Yonekawa"; }; + hyzual = { + email = "hyzual@gmail.com"; + github = "Hyzual"; + githubId = 2051507; + name = "Joris Masson"; + }; + hzeller = { + email = "h.zeller@acm.org"; + github = "hzeller"; + githubId = 140937; + name = "Henner Zeller"; + }; i077 = { email = "nixpkgs@imranhossa.in"; github = "i077"; githubId = 2789926; name = "Imran Hossain"; }; + iammrinal0 = { + email = "nixpkgs@mrinalpurohit.in"; + github = "iammrinal0"; + githubId = 890062; + name = "Mrinal"; + }; iand675 = { email = "ian@iankduncan.com"; github = "iand675"; @@ -3469,6 +4457,12 @@ githubId = 3661115; name = "Ingo Blechschmidt"; }; + icy-thought = { + name = "Icy-Thought"; + email = "gilganyx@pm.me"; + github = "Icy-Thought"; + githubId = 53710398; + }; idontgetoutmuch = { email = "dominic@steinitz.org"; github = "idontgetoutmuch"; @@ -3493,6 +4487,12 @@ githubId = 7481521; name = "Balázs Lengyel"; }; + ilian = { + email = "ilian@tuta.io"; + github = "ilian"; + githubId = 25505957; + name = "Ilian"; + }; ilikeavocadoes = { email = "ilikeavocadoes@hush.com"; github = "ilikeavocadoes"; @@ -3511,6 +4511,12 @@ githubId = 61913481; name = "Mat Marini"; }; + illustris = { + email = "me@illustris.tech"; + github = "illustris"; + githubId = 3948275; + name = "Harikrishnan R"; + }; ilya-fedin = { email = "fedin-ilja2010@ya.ru"; github = "ilya-fedin"; @@ -3535,6 +4541,18 @@ githubId = 993484; name = "Greg Hale"; }; + imlonghao = { + email = "nixos@esd.cc"; + github = "imlonghao"; + githubId = 4951333; + name = "Hao Long"; + }; + immae = { + email = "ismael@bouya.org"; + github = "immae"; + githubId = 510202; + name = "Ismaël Bouya"; + }; imuli = { email = "i@imu.li"; github = "imuli"; @@ -3557,6 +4575,16 @@ githubId = 54999; name = "Ariel Nunez"; }; + irenes = { + name = "Irene Knapp"; + email = "ireneista@gmail.com"; + github = "IreneKnapp"; + githubId = 157678; + keys = [{ + longkeyid = "rsa4096/0xDBF252AFFB2619FD"; + fingerprint = "E864 BDFA AB55 36FD C905 5195 DBF2 52AF FB26 19FD"; + }]; + }; ironpinguin = { email = "michele@catalano.de"; github = "ironpinguin"; @@ -3579,6 +4607,12 @@ githubId = 4458; name = "Ivan Kozik"; }; + ivan-babrou = { + email = "nixpkgs@ivan.computer"; + name = "Ivan Babrou"; + github = "bobrik"; + githubId = 89186; + }; ivan-timokhin = { email = "nixpkgs@ivan.timokhin.name"; name = "Ivan Timokhin"; @@ -3599,22 +4633,22 @@ fingerprint = "7311 2700 AB4F 4CDF C68C F6A5 79C3 C47D C652 EA54"; }]; }; + ivankovnatsky = { + email = "ikovnatsky@protonmail.ch"; + github = "ivankovnatsky"; + githubId = 75213; + name = "Ivan Kovnatsky"; + keys = [{ + longkeyid = "rsa4096/0x3A33FA4C82ED674F"; + fingerprint = "6BD3 7248 30BD 941E 9180 C1A3 3A33 FA4C 82ED 674F"; + }]; + }; ivar = { email = "ivar.scholten@protonmail.com"; github = "IvarWithoutBones"; githubId = 41924494; name = "Ivar"; }; - ivegotasthma = { - email = "ivegotasthma@protonmail.com"; - github = "ivegotasthma"; - githubId = 2437675; - name = "John Doe"; - keys = [{ - longkeyid = "rsa4096/09AC52AEA87817A4"; - fingerprint = "4008 2A5B 56A4 79B9 83CB 95FD 09AC 52AE A878 17A4"; - }]; - }; ixmatus = { email = "parnell@digitalmentat.com"; github = "ixmatus"; @@ -3633,6 +4667,18 @@ githubId = 26877687; name = "Yurii Izorkin"; }; + j0hax = { + name = "Johannes Arnold"; + email = "johannes.arnold@stud.uni-hannover.de"; + github = "j0hax"; + githubId = 3802620; + }; + j4m3s = { + name = "James Landrein"; + email = "github@j4m3s.eu"; + github = "j4m3s-s"; + githubId = 9413812; + }; jacg = { name = "Jacek Generowicz"; email = "jacg@my-post-office.net"; @@ -3645,6 +4691,12 @@ githubId = 6874204; name = "Jason Carr"; }; + j-brn = { + email = "me@bricker.io"; + github = "j-brn"; + githubId = 40566146; + name = "Jonas Braun"; + }; j-keck = { email = "jhyphenkeck@gmail.com"; github = "j-keck"; @@ -3657,12 +4709,24 @@ githubId = 175537; name = "Johannes Lötzsch"; }; + jackgerrits = { + email = "jack@jackgerrits.com"; + github = "jackgerrits"; + githubId = 7558482; + name = "Jack Gerrits"; + }; jagajaga = { email = "ars.seroka@gmail.com"; github = "jagajaga"; githubId = 2179419; name = "Arseniy Seroka"; }; + jakeisnt = { + name = "Jacob Chvatal"; + email = "jake@isnt.online"; + github = "jakeisnt"; + githubId = 29869612; + }; jakelogemann = { email = "jake.logemann@gmail.com"; github = "jakelogemann"; @@ -3681,6 +4745,18 @@ githubId = 5283991; name = "Jake Waksbaum"; }; + jakubgs = { + email = "jakub@gsokolowski.pl"; + github = "jakubgs"; + githubId = 2212681; + name = "Jakub Grzgorz Sokołowski"; + }; + jamiemagee = { + email = "jamie.magee@gmail.com"; + github = "JamieMagee"; + githubId = 1358764; + name = "Jamie Magee"; + }; jammerful = { email = "jammerful@gmail.com"; github = "jammerful"; @@ -3693,6 +4769,12 @@ githubId = 2588851; name = "Jan Solanti"; }; + jappie = { + email = "jappieklooster@hotmail.com"; + github = "jappeace"; + githubId = 3874017; + name = "Jappie Klooster"; + }; javaguirre = { email = "contacto@javaguirre.net"; github = "javaguirre"; @@ -3705,6 +4787,12 @@ githubId = 45598; name = "William Casarin"; }; + jbcrail = { + name = "Joseph Crail"; + email = "jbcrail@gmail.com"; + github = "jbcrail"; + githubId = 6038; + }; jbedo = { email = "cu@cua0.org"; github = "jbedo"; @@ -3725,20 +4813,22 @@ }; jcumming = { email = "jack@mudshark.org"; + github = "jcumming"; + githubId = 1982341; name = "Jack Cummings"; }; - jD91mZM2 = { - email = "me@krake.one"; - github = "jD91mZM2"; - githubId = 12830969; - name = "jD91mZM2"; - }; jdagilliland = { email = "jdagilliland@gmail.com"; github = "jdagilliland"; githubId = 1383440; name = "Jason Gilliland"; }; + jdahm = { + email = "johann.dahm@gmail.com"; + github = "jdahm"; + githubId = 68032; + name = "Johann Dahm"; + }; jdanek = { email = "jdanek@redhat.com"; github = "jdanekrh"; @@ -3827,6 +4917,16 @@ githubId = 2736480; name = "Johannes Frankenau"; }; + jfroche = { + name = "Jean-François Roche"; + email = "jfroche@pyxel.be"; + github = "jfroche"; + githubId = 207369; + keys = [{ + longkeyid = "dsa1024/0xD1D09DE169EA19A0"; + fingerprint = "7EB1 C02A B62B B464 6D7C E4AE D1D0 9DE1 69EA 19A0"; + }]; + }; jgeerds = { email = "jascha@geerds.org"; github = "jgeerds"; @@ -3863,6 +4963,12 @@ githubId = 2502736; name = "James Hillyerd"; }; + jiehong = { + email = "nixos@majiehong.com"; + github = "Jiehong"; + githubId = 1061229; + name = "Jiehong Ma"; + }; jirkamarsik = { email = "jiri.marsik89@gmail.com"; github = "jirkamarsik"; @@ -3923,6 +5029,12 @@ githubId = 587870; name = "Jonathan Mettes"; }; + jo1gi = { + email = "joakimholm@protonmail.com"; + github = "jo1gi"; + githubId = 26695750; + name = "Joakim Holm"; + }; joachifm = { email = "joachifm@fastmail.fm"; github = "joachifm"; @@ -3947,6 +5059,12 @@ githubId = 60272884; name = "Jonathan Jeppener-Haltenhoff"; }; + joelancaster = { + email = "joe.a.lancas@gmail.com"; + github = "joelancaster"; + githubId = 16760945; + name = "Joe Lancaster"; + }; joelburget = { email = "joelburget@gmail.com"; github = "joelburget"; @@ -4056,12 +5174,6 @@ githubId = 1843676; name = "Jonathan Reeve"; }; - joncojonathan = { - email = "joncojonathan@gmail.com"; - github = "joncojonathan"; - githubId = 11414454; - name = "Jonathan Haddock"; - }; jonringer = { email = "jonringer117@gmail.com"; github = "jonringer"; @@ -4098,6 +5210,12 @@ githubId = 1918771; name = "Joe Doyle"; }; + jperras = { + email = "joel@nerderati.com"; + github = "jperras"; + githubId = 20675; + name = "Joël Perras"; + }; jpierre03 = { email = "nix@prunetwork.fr"; github = "jpierre03"; @@ -4128,6 +5246,18 @@ githubId = 1786438; name = "Jonas Schievink"; }; + jshcmpbll = { + email = "me@joshuadcampbell.com"; + github = "jshcmpbll"; + githubId = 16374374; + name = "Joshua Campbell"; + }; + jshholland = { + email = "josh@inv.alid.pw"; + github = "jshholland"; + githubId = 107689; + name = "Josh Holland"; + }; jtcoolen = { email = "jtcoolen@pm.me"; name = "Julien Coolen"; @@ -4163,7 +5293,7 @@ name = "Julien Dehos"; }; julm = { - email = "julm+nix@sourcephile.fr"; + email = "julm+nixpkgs@sourcephile.fr"; github = "ju1m"; githubId = 21160136; name = "Julien Moutinho"; @@ -4174,6 +5304,18 @@ githubId = 39434424; name = "Felix Springer"; }; + justinas = { + email = "justinas@justinas.org"; + github = "justinas"; + githubId = 662666; + name = "Justinas Stankevičius"; + }; + justinlovinger = { + email = "git@justinlovinger.com"; + github = "JustinLovinger"; + githubId = 7183441; + name = "Justin Lovinger"; + }; justinwoo = { email = "moomoowoo@gmail.com"; github = "justinwoo"; @@ -4202,6 +5344,18 @@ email = "jwilberding@afiniate.com"; name = "Jordan Wilberding"; }; + jwoudenberg = { + email = "nixpkgs@jasperwoudenberg.com"; + github = "jwoudenberg"; + githubId = 1525551; + name = "Jasper Woudenberg"; + }; + jwygoda = { + email = "jaroslaw@wygoda.me"; + github = "jwygoda"; + githubId = 20658981; + name = "Jarosław Wygoda"; + }; jyp = { email = "jeanphilippe.bernardy@gmail.com"; github = "jyp"; @@ -4215,7 +5369,7 @@ name = "Jeff Zellner"; }; kaction = { - name = "Dmitry Bogatov"; + name = "Dmitry Bogatov"; email = "KAction@disroot.org"; github = "kaction"; githubId = 44864956; @@ -4298,30 +5452,86 @@ githubId = 37185887; name = "Calvin Kim"; }; + kennyballou = { + email = "kb@devnulllabs.io"; + github = "kennyballou"; + githubId = 2186188; + name = "Kenny Ballou"; + keys = [{ + longkeyid = "rsa4096/0xB0CAA28A02958308"; + fingerprint = "932F 3E8E 1C0F 4A98 95D7 B8B8 B0CA A28A 0295 8308"; + }]; + }; kentjames = { email = "jameschristopherkent@gmail.com"; github = "kentjames"; githubId = 2029444; name = "James Kent"; }; + ketzacoatl = { + email = "ketzacoatl@protonmail.com"; + github = "ketzacoatl"; + githubId = 10122937; + name = "ketzacoatl"; + }; kevincox = { email = "kevincox@kevincox.ca"; github = "kevincox"; githubId = 494012; name = "Kevin Cox"; }; + kevingriffin = { + email = "me@kevin.jp"; + github = "kevingriffin"; + githubId = 209729; + name = "Kevin Griffin"; + }; + kfollesdal = { + email = "kfollesdal@gmail.com"; + github = "kfollesdal"; + githubId = 546087; + name = "Kristoffer K. Føllesdal"; + }; + kho-dialga = { + email = "ivandashenyou@gmail.com"; + github = "kho-dialga"; + githubId = 55767703; + name = "Iván Brito"; + }; khumba = { email = "bog@khumba.net"; github = "khumba"; githubId = 788813; name = "Bryan Gardiner"; }; + khushraj = { + email = "khushraj.rathod@gmail.com"; + github = "KhushrajRathod"; + githubId = 44947946; + name = "Khushraj Rathod"; + keys = [{ + longkeyid = "rsa2048/0xB77B2A40E7702F19"; + fingerprint = "1988 3FD8 EA2E B4EC 0A93 1E22 B77B 2A40 E770 2F19"; + }]; + }; KibaFox = { email = "kiba.fox@foxypossibilities.com"; github = "KibaFox"; githubId = 16481032; name = "Kiba Fox"; }; + kidd = { + email = "raimonster@gmail.com"; + github = "kidd"; + githubId = 25607; + name = "Raimon Grau"; + }; + kidonng = { + email = "hi@xuann.wang"; + github = "kidonng"; + githubId = 44045911; + name = "Kid"; + }; kierdavis = { email = "kierdavis@gmail.com"; github = "kierdavis"; @@ -4392,6 +5602,12 @@ fingerprint = "8992 44FC D291 5CA2 0A97 802C 156C 88A5 B0A0 4B2A"; }]; }; + kiyengar = { + email = "hello@kiyengar.net"; + github = "karthikiyengar"; + githubId = 8260207; + name = "Karthik Iyengar"; + }; kkallio = { email = "tierpluspluslists@gmail.com"; name = "Karn Kallio"; @@ -4431,6 +5647,12 @@ github = "kmein"; githubId = 10352507; }; + kmicklas = { + email = "maintainer@kmicklas.com"; + name = "Ken Micklas"; + github = "kmicklas"; + githubId = 929096; + }; knairda = { email = "adrian@kummerlaender.eu"; name = "Adrian Kummerlaender"; @@ -4509,12 +5731,24 @@ githubId = 735008; name = "Louis Taylor"; }; + kranzes = { + email = "personal@ilanjoselevich.com"; + github = "Kranzes"; + githubId = 56614642; + name = "Ilan Joselevich"; + }; krav = { email = "kristoffer@microdisko.no"; github = "krav"; githubId = 4032; name = "Kristoffer Thømt Ravneberg"; }; + kritnich = { + email = "kritnich@kritni.ch"; + github = "Kritnich"; + githubId = 22116767; + name = "Kritnich"; + }; kroell = { email = "nixosmainter@makroell.de"; github = "rokk4"; @@ -4575,6 +5809,16 @@ githubId = 2422454; name = "Kai Wohlfahrt"; }; + kyleondy = { + email = "kyle@ondy.org"; + github = "kyleondy"; + githubId = 1640900; + name = "Kyle Ondy"; + keys = [{ + longkeyid = "rsa4096/0xDB0E3C33491F91C9"; + fingerprint = "3C79 9D26 057B 64E6 D907 B0AC DB0E 3C33 491F 91C9"; + }]; + }; kylesferrazza = { name = "Kyle Sferrazza"; email = "kyle.sferrazza@gmail.com"; @@ -4587,11 +5831,31 @@ fingerprint = "5A9A 1C9B 2369 8049 3B48 CF5B 81A1 5409 4816 2372"; }]; }; - kylewlacy = { - email = "kylelacy+nix@pm.me"; - github = "kylewlacy"; - githubId = 1362179; - name = "Kyle Lacy"; + l-as = { + email = "las@protonmail.ch"; + github = "L-as"; + githubId = 22075344; + keys = [{ + longkeyid = "rsa2048/0xAC458A7D1087D025"; + fingerprint = "A093 EA17 F450 D4D1 60A0 1194 AC45 8A7D 1087 D025"; + }]; + name = "Las Safin"; + }; + l3af = { + email = "L3afMeAlon3@gmail.com"; + github = "L3afMe"; + githubId = 72546287; + name = "L3af"; + }; + lach = { + email = "iam@lach.pw"; + github = "CertainLach"; + githubId = 6235312; + keys = [{ + longkeyid = "rsa3072/40B5D6948143175F"; + fingerprint = "323C 95B5 DBF7 2D74 8570 C0B7 40B5 D694 8143 175F"; + }]; + name = "Yaroslav Bolyukin"; }; laikq = { email = "gwen@quasebarth.de"; @@ -4599,6 +5863,12 @@ githubId = 55911173; name = "Gwendolyn Quasebarth"; }; + larsr = { + email = "Lars.Rasmusson@gmail.com"; + github = "larsr"; + githubId = 182024; + name = "Lars Rasmusson"; + }; lasandell = { email = "lasandell@gmail.com"; github = "lasandell"; @@ -4648,12 +5918,30 @@ githubId = 45168934; name = "Louis Blin"; }; + lucc = { + email = "lucc+nix@posteo.de"; + github = "lucc"; + githubId = 1104419; + name = "Lucas Hoffmann"; + }; + lde = { + email = "lilian.deloche@puck.fr"; + github = "lde"; + githubId = 1447020; + name = "Lilian Deloche"; + }; ldelelis = { email = "ldelelis@est.frba.utn.edu.ar"; github = "ldelelis"; githubId = 20250323; name = "Lucio Delelis"; }; + ldenefle = { + email = "ldenefle@gmail.com"; + github = "ldenefle"; + githubId = 20558127; + name = "Lucas Denefle"; + }; ldesgoui = { email = "ldesgoui@gmail.com"; github = "ldesgoui"; @@ -4696,6 +5984,12 @@ githubId = 4158274; name = "Michiel Leenaars"; }; + legendofmiracles = { + email = "legendofmiracles@protonmail.com"; + github = "legendofmiracles"; + githubId = 30902201; + name = "legendofmiracles"; + }; lejonet = { email = "daniel@kuehn.se"; github = "lejonet"; @@ -4720,12 +6014,24 @@ githubId = 42153076; name = "Alexey Nikashkin"; }; + lesuisse = { + email = "thomas@gerbet.me"; + github = "LeSuisse"; + githubId = 737767; + name = "Thomas Gerbet"; + }; lethalman = { email = "lucabru@src.gnome.org"; github = "lethalman"; githubId = 480920; name = "Luca Bruno"; }; + leungbk = { + email = "leungbk@mailfence.com"; + github = "leungbk"; + githubId = 29217594; + name = "Brian Leung"; + }; lewo = { email = "lewo@abesis.fr"; github = "nlewo"; @@ -4748,6 +6054,12 @@ githubId = 6652840; name = "Jade"; }; + lgcl = { + email = "dev@lgcl.de"; + name = "Leon Vack"; + github = "LogicalOverflow"; + githubId = 5919957; + }; lheckemann = { email = "git@sphalerite.org"; github = "lheckemann"; @@ -4760,6 +6072,12 @@ githubId = 307589; name = "Nathaniel Baxter"; }; + liamdiprose = { + email = "liam@liamdiprose.com"; + github = "liamdiprose"; + githubId = 1769386; + name = "Liam Diprose"; + }; liff = { email = "liff@iki.fi"; github = "liff"; @@ -4876,6 +6194,12 @@ githubId = 7622248; name = "Sebastian Zivota"; }; + locallycompact = { + email = "dan.firth@homotopic.tech"; + github = "locallycompact"; + githubId = 1267527; + name = "Daniel Firth"; + }; lopsided98 = { email = "benwolsieffer@gmail.com"; github = "lopsided98"; @@ -4888,6 +6212,12 @@ githubId = 1202012; name = "Ignat Loskutov"; }; + lostnet = { + email = "lost.networking@gmail.com"; + github = "lostnet"; + githubId = 1422781; + name = "Will Young"; + }; louisdk1 = { email = "louis@louis.dk"; github = "louisdk1"; @@ -4905,16 +6235,10 @@ github = "lovesegfault"; githubId = 7243783; name = "Bernardo Meurer"; - keys = [ - { - longkeyid = "rsa2048/0xE421C74191EA186C"; - fingerprint = "5894 12CE 19DF 582A E10A 3320 E421 C741 91EA 186C"; - } - { - longkeyid = "rsa2048/0x4A6D87A0E7475769"; - fingerprint = "56A8 E164 E834 290C 4AC0 EE3E 4A6D 87A0 E747 5769"; - } - ]; + keys = [{ + longkeyid = "rsa4096/0xF4C0D53B8D14C246"; + fingerprint = "F193 7596 57D5 6DA4 CCD4 786B F4C0 D53B 8D14 C246"; + }]; }; lowfatcomputing = { email = "andreas.wagner@lowfatcomputing.org"; @@ -4922,6 +6246,16 @@ githubId = 10626; name = "Andreas Wagner"; }; + lromor = { + email = "leonardo.romor@gmail.com"; + github = "lromor"; + githubId = 1597330; + name = "Leonardo Romor"; + }; + lrworth = { + email = "luke@worth.id.au"; + name = "Luke Worth"; + }; lschuermann = { email = "leon.git@is.currently.online"; github = "lschuermann"; @@ -5038,6 +6372,12 @@ githubId = 2057309; name = "Sergey Sofeychuk"; }; + lxea = { + email = "nix@amk.ie"; + github = "lxea"; + githubId = 7910815; + name = "Alex McGrath"; + }; lynty = { email = "ltdong93+nix@gmail.com"; github = "lynty"; @@ -5070,6 +6410,12 @@ githubId = 36235154; name = "Sean Haugh"; }; + maaslalani = { + email = "maaslalani0@gmail.com"; + github = "maaslalani"; + githubId = 42545625; + name = "Maas Lalani"; + }; madjar = { email = "georges.dubus@compiletoi.net"; github = "madjar"; @@ -5100,18 +6446,48 @@ githubId = 1238350; name = "Matthias Herrmann"; }; + majesticmullet = { + email = "hoccthomas@gmail.com.au"; + github = "MajesticMullet"; + githubId = 31056089; + name = "Tom Ho"; + }; makefu = { email = "makefu@syntax-fehler.de"; github = "makefu"; githubId = 115218; name = "Felix Richter"; }; + malo = { + email = "mbourgon@gmail.com"; + github = "malob"; + githubId = 2914269; + name = "Malo Bourgon"; + }; + malvo = { + email = "malte@malvo.org"; + github = "malte-v"; + githubId = 34393802; + name = "Malte Voos"; + }; + malbarbo = { + email = "malbarbo@gmail.com"; + github = "malbarbo"; + githubId = 1678126; + name = "Marco A L Barbosa"; + }; malyn = { email = "malyn@strangeGizmo.com"; github = "malyn"; githubId = 346094; name = "Michael Alyn Miller"; }; + manojkarthick = { + email = "smanojkarthick@gmail.com"; + github = "manojkarthick"; + githubId = 7802795; + name = "Manoj Karthick"; + }; manveru = { email = "m.fellinger@gmail.com"; github = "manveru"; @@ -5158,6 +6534,12 @@ email = "markus@wotringer.de"; name = "Markus Wotringer"; }; + marijanp = { + name = "Marijan Petričević"; + email = "marijan.petricevic94@gmail.com"; + github = "marijanp"; + githubId = 13599169; + }; marius851000 = { email = "mariusdavid@laposte.net"; name = "Marius David"; @@ -5192,6 +6574,12 @@ fingerprint = "B573 5118 0375 A872 FBBF 7770 B629 036B E399 EEE9"; }]; }; + masipcat = { + email = "jordi@masip.cat"; + github = "masipcat"; + githubId = 775189; + name = "Jordi Masip"; + }; matejc = { email = "cotman.matej@gmail.com"; github = "matejc"; @@ -5216,6 +6604,12 @@ githubId = 11810057; name = "Matt Snider"; }; + mattchrist = { + email = "nixpkgs-matt@christ.systems"; + github = "mattchrist"; + githubId = 952712; + name = "Matt Christ"; + }; matthewbauer = { email = "mjbauer95@gmail.com"; github = "matthewbauer"; @@ -5246,6 +6640,12 @@ githubId = 136037; name = "Matthew Maurer"; }; + mausch = { + email = "mauricioscheffer@gmail.com"; + github = "mausch"; + githubId = 95194; + name = "Mauricio Scheffer"; + }; maxdamantus = { email = "maxdamantus@gmail.com"; github = "Maxdamantus"; @@ -5258,20 +6658,38 @@ githubId = 35892750; name = "Maxine Aubrey"; }; + maxhbr = { + email = "nixos@maxhbr.dev"; + github = "maxhbr"; + githubId = 1187050; + name = "Maximilian Huber"; + }; maxxk = { email = "maxim.krivchikov@gmail.com"; github = "maxxk"; githubId = 1191859; name = "Maxim Krivchikov"; }; - mbakke = { - email = "mbakke@fastmail.com"; - github = "mbakke"; - githubId = 1269099; - name = "Marius Bakke"; + MayNiklas = { + email = "info@niklas-steffen.de"; + github = "MayNiklas"; + githubId = 44636701; + name = "Niklas Steffen"; + }; + mazurel = { + email = "mateusz.mazur@yahoo.com"; + github = "Mazurel"; + githubId = 22836301; + name = "Mateusz Mazur"; + }; + mbaeten = { + email = "mbaeten@users.noreply.github.com"; + github = "mbaeten"; + githubId = 2649304; + name = "M. Baeten"; }; mbaillie = { - email = "martin@baillie.email"; + email = "martin@baillie.id"; github = "martinbaillie"; githubId = 613740; name = "Martin Baillie"; @@ -5306,6 +6724,12 @@ githubId = 2971615; name = "Marius Bergmann"; }; + mcaju = { + email = "cajum.bugs@yandex.com"; + github = "CajuM"; + githubId = 10420834; + name = "Mihai-Drosi Caju"; + }; mcbeth = { email = "mcbeth@broggs.org"; github = "mcbeth"; @@ -5319,10 +6743,14 @@ name = "Matthias C. M. Troffaes"; }; McSinyx = { - email = "vn.mcsinyx@gmail.com"; + email = "mcsinyx@disroot.org"; github = "McSinyx"; githubId = 13689192; name = "Nguyễn Gia Phong"; + keys = [{ + longkeyid = "rsa3072/0x27148B2C06A2224B"; + fingerprint = "E90E 11B8 0493 343B 6132 E394 2714 8B2C 06A2 224B"; + }]; }; mcwitt = { email = "mcwitt@gmail.com"; @@ -5352,6 +6780,22 @@ fingerprint = "D709 03C8 0BE9 ACDC 14F0 3BFB 77BF E531 397E DE94"; }]; }; + mdsp = { + github = "Mdsp9070"; + githubId = 44469426; + name = "Matheus de Souza Pessanha"; + email = "matheus_pessanha2001@outlook.com"; + keys = [{ + longkeyid = "rsa4096/6DFD656220A3B849"; + fingerprint = "2D4D 488F 17FB FF75 664E C016 6DFD 6562 20A3 B849"; + }]; + }; + meatcar = { + email = "nixpkgs@denys.me"; + github = "meatcar"; + githubId = 191622; + name = "Denys Pavlov"; + }; meditans = { email = "meditans@gmail.com"; github = "meditans"; @@ -5398,10 +6842,10 @@ email = "softs@metabarcoding.org"; name = "Celine Mercier"; }; - metadark = { - email = "kira.bruneau@gmail.com"; + kira-bruneau = { + email = "kira.bruneau@pm.me"; name = "Kira Bruneau"; - github = "metadark"; + github = "kira-bruneau"; githubId = 382041; }; meutraa = { @@ -5410,6 +6854,12 @@ github = "meutraa"; githubId = 68550871; }; + mephistophiles = { + email = "mussitantesmortem@gmail.com"; + name = "Maxim Zhukov"; + github = "Mephistophiles"; + githubId = 4850908; + }; mfossen = { email = "msfossen@gmail.com"; github = "mfossen"; @@ -5494,10 +6944,14 @@ name = "Michael Mercier"; }; midchildan = { - email = "midchildan+nix@gmail.com"; + email = "git@midchildan.org"; github = "midchildan"; githubId = 7343721; name = "midchildan"; + keys = [{ + longkeyid = "rsa4096/0x186A1EDAC5C63F83"; + fingerprint = "FEF0 AE2D 5449 3482 5F06 40AA 186A 1EDA C5C6 3F83"; + }]; }; mikefaille = { email = "michael@faille.io"; @@ -5517,11 +6971,21 @@ githubId = 1387206; name = "Mike Sperber"; }; - mildlyincompetent = { - email = "nix@kch.dev"; - github = "mildlyincompetent"; - githubId = 19479662; - name = "Kajetan Champlewski"; + mikroskeem = { + email = "mikroskeem@mikroskeem.eu"; + github = "mikroskeem"; + githubId = 3490861; + name = "Mark Vainomaa"; + keys = [{ + longkeyid = "rsa4096/0xDA015B05B5A11B22"; + fingerprint = "DB43 2895 CF68 F0CE D4B7 EF60 DA01 5B05 B5A1 1B22"; + }]; + }; + milesbreslin = { + email = "milesbreslin@gmail.com"; + github = "milesbreslin"; + githubId = 38543128; + name = "Miles Breslin"; }; millerjason = { email = "mailings-github@millerjason.com"; @@ -5573,12 +7037,24 @@ githubId = 1776903; name = "Andrew Abbott"; }; + mitchmindtree = { + email = "mail@mitchellnordine.com"; + github = "mitchmindtree"; + githubId = 4587373; + name = "Mitchell Nordine"; + }; mjanczyk = { email = "m@dragonvr.pl"; github = "mjanczyk"; githubId = 1001112; name = "Marcin Janczyk"; }; + mjlbach = { + email = "m.j.lbach@gmail.com"; + github = "mjlbach"; + githubId = 13316262; + name = "Michael Lingelbach"; + }; mjp = { email = "mike@mythik.co.uk"; github = "MikePlayle"; @@ -5629,6 +7105,12 @@ githubId = 622577; name = "Michael Lieberman"; }; + mlvzk = { + name = "mlvzk"; + email = "mlvzk@users.noreply.github.com"; + github = "mlvzk"; + githubId = 44906333; + }; mmahut = { email = "marek.mahut@gmail.com"; github = "mmahut"; @@ -5641,6 +7123,12 @@ githubId = 117842; name = "Henri Bourcereau"; }; + mmesch = { + email = "mmesch@noreply.github.com"; + github = "mmesch"; + githubId = 2597803; + name = "Matthias Meschede"; + }; mmilata = { email = "martin@martinmilata.cz"; github = "mmilata"; @@ -5683,6 +7171,16 @@ githubId = 754512; name = "Mogria"; }; + mohe2015 = { + name = "Moritz Hedtke"; + email = "Moritz.Hedtke@t-online.de"; + github = "mohe2015"; + githubId = 13287984; + keys = [{ + longkeyid = "rsa4096/0x6794D45A488C2EDE"; + fingerprint = "1248 D3E1 1D11 4A85 75C9 8934 6794 D45A 488C 2EDE"; + }]; + }; monsieurp = { email = "monsieurp@gentoo.org"; github = "monsieurp"; @@ -5845,6 +7343,12 @@ githubId = 788953; name = "Matthijs Steen"; }; + mstrangfeld = { + email = "marvin@strangfeld.io"; + github = "mstrangfeld"; + githubId = 36842980; + name = "Marvin Strangfeld"; + }; mt-caret = { email = "mtakeda.enigsol@gmail.com"; github = "mt-caret"; @@ -5857,6 +7361,12 @@ githubId = 2176611; name = "Marko Poikonen"; }; + mtreca = { + email = "maxime.treca@gmail.com"; + github = "mtreca"; + githubId = 16440823; + name = "Maxime Tréca"; + }; mtreskin = { email = "zerthurd@gmail.com"; github = "Zert"; @@ -5869,6 +7379,12 @@ githubId = 5139265; name = "James Wood"; }; + mudrii = { + email = "mudreac@gmail.com"; + github = "mudrii"; + githubId = 220262; + name = "Ion Mudreac"; + }; muflax = { email = "mail@muflax.com"; github = "muflax"; @@ -5881,6 +7397,12 @@ githubId = 5047140; name = "Victor Collod"; }; + musfay = { + email = "musfay@protonmail.com"; + github = "musfay"; + githubId = 33374965; + name = "Mustafa Çalışkan"; + }; mupdt = { email = "nix@pdtpartners.com"; github = "mupdt"; @@ -5893,10 +7415,10 @@ githubId = 6455574; name = "Matt Votava"; }; - mwilsoninsight = { - email = "max.wilson@insight.com"; - github = "mwilsoninsight"; - githubId = 47782621; + maxwilson = { + email = "nixpkgs@maxwilson.dev"; + github = "mwilsoncoding"; + githubId = 43796009; name = "Max Wilson"; }; myrl = { @@ -5923,11 +7445,15 @@ githubId = 1222539; name = "Roman Naumann"; }; - nand0p = { - email = "nando@hex7.com"; - github = "nand0p"; - githubId = 1916245; - name = "Fernando Jose Pando"; + nasirhm = { + email = "nasirhussainm14@gmail.com"; + github = "nasirhm"; + githubId = 35005234; + name = "Nasir Hussain"; + keys = [{ + longkeyid = "rsa4096/0xD8126E559CE7C35D"; + fingerprint = "7A10 AB8E 0BEC 566B 090C 9BE3 D812 6E55 9CE7 C35D"; + }]; }; Nate-Devv = { email = "natedevv@gmail.com"; @@ -5945,12 +7471,40 @@ githubId = 818502; name = "Nathan Yong"; }; + natto1784 = { + email = "natto@weirdnatto.in"; + github = "natto1784"; + githubId = 56316606; + name = "Amneesh Singh"; + }; + nbren12 = { + email = "nbren12@gmail.com"; + github = "nbren12"; + githubId = 1386642; + name = "Noah Brenowitz"; + }; + ncfavier = { + email = "n@monade.li"; + github = "ncfavier"; + githubId = 4323933; + name = "Naïm Favier"; + keys = [{ + longkeyid = "rsa2048/0x49B07322580B7EE2"; + fingerprint = "51A0 705E 7DD2 3CBC 5EAA B43E 49B0 7322 580B 7EE2"; + }]; + }; nckx = { email = "github@tobias.gr"; github = "nckx"; githubId = 364510; name = "Tobias Geerinckx-Rice"; }; + ndl = { + email = "ndl@endl.ch"; + github = "ndl"; + githubId = 137805; + name = "Alexander Tsvyashchenko"; + }; neeasade = { email = "nathanisom27@gmail.com"; github = "neeasade"; @@ -5969,12 +7523,35 @@ githubId = 628342; name = "Tim Steinbach"; }; + nessdoor = { + name = "Tomas Antonio Lopez"; + email = "entropy.overseer@protonmail.com"; + githubId = 25993494; + }; + netcrns = { + email = "jason.wing@gmx.de"; + github = "netcrns"; + githubId = 34162313; + name = "Jason Wing"; + }; netixx = { email = "dev.espinetfrancois@gmail.com"; github = "netixx"; githubId = 1488603; name = "François Espinet"; }; + neverbehave = { + email = "i@never.pet"; + github = "NeverBehave"; + githubId = 17120571; + name = "Xinhao Luo"; + }; + newam = { + email = "alexmgit@protonmail.com"; + github = "newAM"; + githubId = 7845120; + name = "Alex M."; + }; nikitavoloboev = { email = "nikita.voloboev@gmail.com"; github = "nikitavoloboev"; @@ -5997,6 +7574,28 @@ githubId = 10180857; name = "Anmol Sethi"; }; + nicbk = { + email = "nicolas@nicbk.com"; + github = "nicbk"; + githubId = 77309427; + name = "Nicolás Kennedy"; + keys = [{ + longkeyid = "rsa4096/0xC061089EFEBF7A35"; + fingerprint = "7BC1 77D9 C222 B1DC FB2F 0484 C061 089E FEBF 7A35"; + }]; + }; + nichtsfrei = { + email = "philipp.eder@posteo.net"; + github = "nichtsfrei"; + githubId = 1665818; + name = "Philipp Eder"; + }; + nickcao = { + name = "Nick Cao"; + email = "nickcao@nichi.co"; + github = "NickCao"; + githubId = 15247171; + }; nickhu = { email = "me@nickhu.co.uk"; github = "nickhu"; @@ -6015,6 +7614,16 @@ githubId = 8214542; name = "Nicolò Balzarotti"; }; + NieDzejkob = { + email = "kuba@kadziolka.net"; + github = "NieDzejkob"; + githubId = 23580910; + name = "Jakub Kądziołka"; + keys = [{ + longkeyid = "rsa4096/0xE315A75846131564"; + fingerprint = "E576 BFB2 CF6E B13D F571 33B9 E315 A758 4613 1564"; + }]; + }; NikolaMandic = { email = "nikola@mandic.email"; github = "NikolaMandic"; @@ -6033,24 +7642,72 @@ githubId = 26231126; name = "Nils ANDRÉ-CHANG"; }; + nils-degroot = { + email = "nils@peeko.nl"; + github = "nils-degroot"; + githubId = 53556985; + name = "Nils de Groot"; + }; ninjatrappeur = { email = "felix@alternativebit.fr"; github = "ninjatrappeur"; githubId = 1219785; name = "Félix Baylac-Jacqué"; }; + ninjin = { + email = "pontus@stenetorp.se"; + github = "ninjin"; + githubId = 354934; + name = "Pontus Stenetorp"; + keys = [{ + longkeyid = "rsa4096/0xD430287500E6483C"; + fingerprint = "0966 2F9F 3FDA C22B C22E 4CE1 D430 2875 00E6 483C"; + }]; + }; nioncode = { email = "nioncode+github@gmail.com"; github = "nioncode"; githubId = 3159451; name = "Nicolas Schneider"; }; - nipav = { + nkje = { + name = "Niels Kristian Lyshøj Jensen"; + email = "n@nk.je"; + github = "NKJe"; + githubId = 1102306; + keys = [{ + longkeyid = "nistp256/0xDE3BADFECD31A89D"; + fingerprint = "B956 C6A4 22AF 86A0 8F77 A8CA DE3B ADFE CD31 A89D"; + }]; + }; + nitsky = { + name = "nitsky"; + email = "492793+nitsky@users.noreply.github.com"; + github = "nitsky"; + githubId = 492793; + }; + nkpvk = { email = "niko.pavlinek@gmail.com"; - github = "nipav"; + github = "nkpvk"; githubId = 16385648; name = "Niko Pavlinek"; }; + nixbitcoin = { + email = "nixbitcoin@i2pmail.org"; + github = "nixbitcoin"; + githubId = 45737139; + name = "nixbitcoindev"; + keys = [{ + longkeyid = "rsa4096/0xDD11F9AD5308B3BA"; + fingerprint = "577A 3452 7F3E 2A85 E80F E164 DD11 F9AD 5308 B3BA"; + }]; + }; + nixinator = { + email = "33lockdown33@protonmail.com"; + github = "nixinator"; + githubId = 66913205; + name = "Rick Sanchez"; + }; nixy = { email = "nixy@nixy.moe"; github = "nixy"; @@ -6069,11 +7726,11 @@ githubId = 6930756; name = "Nicolas Mattia"; }; - nocent = { - email = "nocent@protonmail.ch"; - github = "nocent"; - githubId = 25505957; - name = "nocent"; + nobbz = { + name = "Norbert Melzer"; + email = "timmelzer+nixpkgs@gmail.com"; + github = "NobbZ"; + githubId = 58951; }; nocoolnametom = { email = "nocoolnametom@gmail.com"; @@ -6087,12 +7744,30 @@ githubId = 148037; name = "Joachim Breitner"; }; + nomisiv = { + email = "simon@nomisiv.com"; + github = "NomisIV"; + githubId = 47303199; + name = "Simon Gutgesell"; + }; noneucat = { email = "andy@lolc.at"; github = "noneucat"; githubId = 40049608; name = "Andy Chun"; }; + noreferences = { + email = "norkus@norkus.net"; + github = "noreferences"; + githubId = 13085275; + name = "Juozas Norkus"; + }; + norfair = { + email = "syd@cs-syd.eu"; + github = "NorfairKing"; + githubId = 3521180; + name = "Tom Sydney Kerckhove"; + }; notthemessiah = { email = "brian.cohen.88@gmail.com"; github = "notthemessiah"; @@ -6139,6 +7814,12 @@ githubId = 1839979; name = "Niklas Thörne"; }; + nullx76 = { + email = "nix@xirion.net"; + github = "NULLx76"; + githubId = 1809198; + name = "Victor Roest"; + }; numinit = { email = "me@numin.it"; github = "numinit"; @@ -6157,6 +7838,12 @@ githubId = 7677321; name = "Paul Trehiou"; }; + nyanotech = { + name = "nyanotech"; + email = "nyanotechnology@gmail.com"; + github = "nyanotech"; + githubId = 33802077; + }; nyarly = { email = "nyarly@gmail.com"; github = "nyarly"; @@ -6175,11 +7862,21 @@ githubId = 3359345; name = "obadz"; }; - ocharles = { - email = "ollie@ocharles.org.uk"; - github = "ocharles"; - githubId = 20878; - name = "Oliver Charles"; + obsidian-systems-maintenance = { + name = "Obsidian Systems Maintenance"; + email = "maintainer@obsidian.systems"; + github = "obsidian-systems-maintenance"; + githubId = 80847921; + }; + obfusk = { + email = "flx@obfusk.net"; + github = "obfusk"; + githubId = 1260687; + name = "Felix C. Stegerman"; + keys = [{ + longkeyid = "rsa4096/0x2F9607F09B360F2D"; + fingerprint = "D5E4 A51D F8D2 55B9 FAC6 A9BB 2F96 07F0 9B36 0F2D"; + }]; }; odi = { email = "oliver.dunkl@gmail.com"; @@ -6209,6 +7906,12 @@ githubId = 20923; name = "Erik Timan"; }; + olebedev = { + email = "ole6edev@gmail.com"; + github = "olebedev"; + githubId = 848535; + name = "Oleg Lebedev"; + }; olejorgenb = { email = "olejorgenb@yahoo.no"; github = "olejorgenb"; @@ -6221,12 +7924,48 @@ githubId = 4728903; name = "Owen Lynch"; }; + omasanori = { + email = "167209+omasanori@users.noreply.github.com"; + github = "omasanori"; + githubId = 167209; + name = "Masanori Ogino"; + }; + omgbebebe = { + email = "omgbebebe@gmail.com"; + github = "omgbebebe"; + githubId = 588167; + name = "Sergey Bubnov"; + }; omnipotententity = { email = "omnipotententity@gmail.com"; github = "omnipotententity"; githubId = 1538622; name = "Michael Reilly"; }; + onixie = { + email = "onixie@gmail.com"; + github = "onixie"; + githubId = 817073; + name = "Yc. Shen"; + }; + onsails = { + email = "andrey@onsails.com"; + github = "onsails"; + githubId = 107261; + name = "Andrey Kuznetsov"; + }; + onny = { + email = "onny@project-insanity.org"; + github = "onny"; + githubId = 757752; + name = "Jonas Heinrich"; + }; + ony = { + name = "Mykola Orliuk"; + email = "virkony@gmail.com"; + github = "ony"; + githubId = 11265; + }; OPNA2608 = { email = "christoph.neidahl@gmail.com"; github = "OPNA2608"; @@ -6263,6 +8002,12 @@ githubId = 111265; name = "Ozan Sener"; }; + otavio = { + email = "otavio.salvador@ossystems.com.br"; + github = "otavio"; + githubId = 25278; + name = "Otavio Salvador"; + }; otwieracz = { email = "slawek@otwiera.cz"; github = "otwieracz"; @@ -6317,6 +8062,12 @@ githubId = 1449319; name = "Pacien Tran-Girard"; }; + pacman99 = { + email = "pachum99@gmail.com"; + github = "Pacman99"; + githubId = 16345849; + name = "Parthiv Seetharaman"; + }; paddygord = { email = "pgpatrickgordon@gmail.com"; github = "paddygord"; @@ -6389,6 +8140,12 @@ githubId = 131844; name = "Igor Pashev"; }; + pasqui23 = { + email = "p3dimaria@hotmail.it"; + github = "pasqui23"; + githubId = 6931743; + name = "pasqui23"; + }; patryk27 = { email = "wychowaniec.patryk@gmail.com"; github = "Patryk27"; @@ -6405,6 +8162,12 @@ githubId = 15645854; name = "Brad Christensen"; }; + payas = { + email = "relekarpayas@gmail.com"; + github = "payasrelekar"; + githubId = 24254289; + name = "Payas Relekar"; + }; pawelpacana = { email = "pawel.pacana@gmail.com"; github = "pawelpacana"; @@ -6417,6 +8180,12 @@ githubId = 157610; name = "Piotr Bogdan"; }; + pborzenkov = { + email = "pavel@borzenkov.net"; + github = "pborzenkov"; + githubId = 434254; + name = "Pavel Borzenkov"; + }; pblkt = { email = "pebblekite@gmail.com"; github = "pblkt"; @@ -6429,20 +8198,32 @@ githubId = 8641; name = "Pierre Carrier"; }; + pengmeiyu = { + email = "pengmyu@gmail.com"; + github = "pmeiyu"; + githubId = 8529551; + name = "Peng Mei Yu"; + }; + penguwin = { + email = "penguwin@penguwin.eu"; + github = "penguwin"; + githubId = 13225611; + name = "Nicolas Martin"; + }; + p3psi = { + name = "Elliot Boo"; + email = "p3psi.boo@gmail.com"; + github = "p3psi-boo"; + githubId = 43925055; + }; periklis = { email = "theopompos@gmail.com"; github = "periklis"; githubId = 152312; name = "Periklis Tsirakidis"; }; - pesterhazy = { - email = "pesterhazy@gmail.com"; - github = "pesterhazy"; - githubId = 106328; - name = "Paulus Esterhazy"; - }; petabyteboy = { - email = "me@pbb.lc"; + email = "milan@petabyte.dev"; github = "petabyteboy"; githubId = 3250809; name = "Milan Pässler"; @@ -6477,6 +8258,24 @@ githubId = 28323; name = "Peter Simons"; }; + petrosagg = { + email = "petrosagg@gmail.com"; + github = "petrosagg"; + githubId = 939420; + name = "Petros Angelatos"; + }; + petterstorvik = { + email = "petterstorvik@gmail.com"; + github = "storvik"; + githubId = 3438604; + name = "Petter Storvik"; + }; + p-h = { + email = "p@hurlimann.org"; + github = "p-h"; + githubId = 645664; + name = "Philippe Hürlimann"; + }; philandstuff = { email = "philip.g.potter@gmail.com"; github = "philandstuff"; @@ -6489,6 +8288,12 @@ githubId = 1640697; name = "Philipp Hausmann"; }; + Philipp-M = { + email = "philipp@mildenberger.me"; + github = "Philipp-M"; + githubId = 9267430; + name = "Philipp Mildenberger"; + }; Phlogistique = { email = "noe.rubinstein@gmail.com"; github = "Phlogistique"; @@ -6513,6 +8318,12 @@ githubId = 627831; name = "Hoang Xuan Phu"; }; + piegames = { + name = "piegames"; + email = "nix@piegames.de"; + github = "piegamesde"; + githubId = 14054505; + }; pierrechevalier83 = { email = "pierrechevalier83@gmail.com"; github = "pierrechevalier83"; @@ -6537,6 +8348,12 @@ githubId = 1179566; name = "Nicolas B. Pierron"; }; + pimeys = { + email = "julius@nauk.io"; + github = "pimeys"; + githubId = 34967; + name = "Julius de Bruijn"; + }; pingiun = { email = "nixos@pingiun.com"; github = "pingiun"; @@ -6547,6 +8364,16 @@ fingerprint = "A3A3 65AE 16ED A7A0 C29C 88F1 9712 452E 8BE3 372E"; }]; }; + pinpox = { + email = "mail@pablo.tools"; + github = "pinpox"; + githubId = 1719781; + name = "Pablo Ovelleiro Corral"; + keys = [{ + longkeyid = "sa4096/0x823A6154426408D3"; + fingerprint = "D03B 218C AE77 1F77 D7F9 20D9 823A 6154 4264 08D3"; + }]; + }; piotr = { email = "ppietrasa@gmail.com"; name = "Piotr Pietraszkiewicz"; @@ -6575,6 +8402,16 @@ githubId = 610615; name = "Chih-Mao Chen"; }; + plabadens = { + name = "Pierre Labadens"; + email = "labadens.pierre+nixpkgs@gmail.com"; + github = "plabadens"; + githubId = 4303706; + keys = [{ + longkeyid = "rsa2048/0xF55814E4D6874375"; + fingerprint = "B00F E582 FD3F 0732 EA48 3937 F558 14E4 D687 4375"; + }]; + }; plchldr = { email = "mail@oddco.de"; github = "plchldr"; @@ -6593,12 +8430,28 @@ githubId = 13000278; name = "Maksim Bronsky"; }; + PlushBeaver = { + name = "Dmitry Kozlyuk"; + email = "dmitry.kozliuk+nixpkgs@gmail.com"; + github = "PlushBeaver"; + githubId = 8988269; + }; pmahoney = { email = "pat@polycrystal.org"; github = "pmahoney"; githubId = 103822; name = "Patrick Mahoney"; }; + pmenke = { + email = "nixos@pmenke.de"; + github = "pmenke-de"; + githubId = 898922; + name = "Philipp Menke"; + keys = [{ + longkeyid = "rsa4096/0xEB7F2D4CCBE23B69"; + fingerprint = "ED54 5EFD 64B6 B5AA EC61 8C16 EB7F 2D4C CBE2 3B69"; + }]; + }; pmeunier = { email = "pierre-etienne.meunier@inria.fr"; github = "P-E-Meunier"; @@ -6629,6 +8482,28 @@ githubId = 11365056; name = "Kevin Liu"; }; + pnotequalnp = { + email = "kevin@pnotequalnp.com"; + github = "pnotequalnp"; + githubId = 46154511; + name = "Kevin Mullins"; + keys = [{ + longkeyid = "rsa4096/361820A45DB41E9A"; + fingerprint = "2CD2 B030 BD22 32EF DF5A 008A 3618 20A4 5DB4 1E9A"; + }]; + }; + polendri = { + email = "paul@ijj.li"; + github = "polendri"; + githubId = 1829032; + name = "Paul Hendry"; + }; + polygon = { + email = "polygon@wh2.tu-dresden.de"; + name = "Polygon"; + github = "polygon"; + githubId = 51489; + }; polyrod = { email = "dc1mdp@gmail.com"; github = "polyrod"; @@ -6641,6 +8516,16 @@ githubId = 138074; name = "Pedro Pombeiro"; }; + poscat = { + email = "poscat@mail.poscat.moe"; + github = "poscat0x04"; + githubId = 53291983; + name = "Poscat Tarski"; + keys = [{ + longkeyid = "rsa4096/2D2595A00D08ACE0"; + fingerprint = "48AD DE10 F27B AFB4 7BB0 CCAF 2D25 95A0 0D08 ACE0"; + }]; + }; pradeepchhetri = { email = "pradeep.chhetri89@gmail.com"; github = "pradeepchhetri"; @@ -6657,6 +8542,12 @@ fingerprint = "240B 57DE 4271 2480 7CE3 EAC8 4F74 D536 1C4C A31E"; }]; }; + preisschild = { + email = "florian@florianstroeger.com"; + github = "Preisschild"; + githubId = 11898437; + name = "Florian Ströger"; + }; priegger = { email = "philipp@riegger.name"; github = "priegger"; @@ -6697,6 +8588,18 @@ githubId = 18549627; name = "Proglodyte"; }; + progval = { + email = "progval+nix@progval.net"; + github = "ProgVal"; + githubId = 406946; + name = "Valentin Lorentz"; + }; + proofofkeags = { + email = "keagan.mcclelland@gmail.com"; + github = "ProofOfKeags"; + githubId = 4033651; + name = "Keagan McClelland"; + }; protoben = { email = "protob3n@gmail.com"; github = "protoben"; @@ -6719,17 +8622,11 @@ githubId = 33375; name = "Peter Sanford"; }; - pshendry = { - email = "paul@pshendry.com"; - github = "pshendry"; - githubId = 1829032; - name = "Paul Hendry"; - }; psibi = { email = "sibi@psibi.in"; github = "psibi"; githubId = 737477; - name = "Sibi"; + name = "Sibi Prabakaran"; }; pstn = { email = "philipp@xndr.de"; @@ -6774,7 +8671,7 @@ purcell = { email = "steve@sanityinc.com"; github = "purcell"; - githubId = 5636; + githubId = 5636; name = "Steve Purcell"; }; puzzlewolf = { @@ -6813,6 +8710,12 @@ githubId = 115877; name = "Kenny Shen"; }; + queezle = { + email = "git@queezle.net"; + github = "qzle"; + githubId = 1024891; + name = "Jens Nolte"; + }; quentini = { email = "quentini@airmail.cc"; github = "QuentinI"; @@ -6829,6 +8732,12 @@ fingerprint = "7573 56D7 79BB B888 773E 415E 736C CDF9 EF51 BD97"; }]; }; + r-burns = { + email = "rtburns@protonmail.com"; + github = "r-burns"; + githubId = 52847440; + name = "Ryan Burns"; + }; raboof = { email = "arnout@bzzt.net"; github = "raboof"; @@ -6871,6 +8780,12 @@ githubId = 14829269; name = "Ram Kromberg"; }; + ranfdev = { + email = "ranfdev@gmail.com"; + name = "Lorenzo Miglietta"; + github = "ranfdev"; + githubId = 23294184; + }; rardiol = { email = "ricardo.ardissone@gmail.com"; github = "rardiol"; @@ -6889,6 +8804,12 @@ githubId = 1891350; name = "Michael Raskin"; }; + ratsclub = { + email = "victor@freire.dev.br"; + github = "ratsclub"; + githubId = 25647735; + name = "Victor Freire"; + }; ravloony = { email = "ravloony@gmail.com"; name = "Tom Macdonald"; @@ -6905,6 +8826,12 @@ githubId = 1758708; name = "Răzvan Flavius Panda"; }; + rb2k = { + email = "nix@marc-seeger.com"; + github = "rb2k"; + githubId = 9519; + name = "Marc Seeger"; + }; rbasso = { email = "rbasso@sharpgeeks.net"; github = "rbasso"; @@ -6941,6 +8868,12 @@ githubId = 816465; name = "Redvers Davies"; }; + reedrw = { + email = "reedrw5601@gmail.com"; + github = "reedrw"; + githubId = 21069876; + name = "Reed Williams"; + }; refnil = { email = "broemartino@gmail.com"; github = "refnil"; @@ -6995,12 +8928,36 @@ githubId = 165283; name = "Alexey Kutepov"; }; + rgrunbla = { + email = "remy@grunblatt.org"; + github = "rgrunbla"; + githubId = 42433779; + name = "Rémy Grünblatt"; + }; + rguevara84 = { + email = "fuzztkd@gmail.com"; + github = "rguevara84"; + githubId = 12279531; + name = "Ricardo Guevara"; + }; rht = { email = "rhtbot@protonmail.com"; github = "rht"; githubId = 395821; name = "rht"; }; + rhoriguchi = { + email = "ryan.horiguchi@gmail.com"; + github = "rhoriguchi "; + githubId = 6047658; + name = "Ryan Horiguchi"; + }; + ribose-jeffreylau = { + name = "Jeffrey Lau"; + email = "jeffrey.lau@ribose.com"; + github = "ribose-jeffreylau"; + githubId = 2649467; + }; richardipsum = { email = "richardipsum@fastmail.co.uk"; github = "richardipsum"; @@ -7019,6 +8976,12 @@ githubId = 16779; name = "Rickard Nilsson"; }; + riey = { + email = "creeper844@gmail.com"; + github = "Riey"; + githubId = 14910534; + name = "Riey"; + }; rika = { email = "rika@paymentswit.ch"; github = "NekomimiScience"; @@ -7043,10 +9006,12 @@ github = "rissson"; githubId = 18313093; keys = [ - { longkeyid = "rsa4096/0xF6FD87B15C263EC9"; + { + longkeyid = "rsa4096/0xF6FD87B15C263EC9"; fingerprint = "8A0E 6A7C 08AB B9DE 67DE 2A13 F6FD 87B1 5C26 3EC9"; } - { longkeyid = "ed25519/0xBBB7A6801DF1E03F"; + { + longkeyid = "ed25519/0xBBB7A6801DF1E03F"; fingerprint = "C0A7 A9BB 115B C857 4D75 EA99 BBB7 A680 1DF1 E03F"; } ]; @@ -7063,6 +9028,12 @@ githubId = 449990; name = "Cedric Cellier"; }; + rkitover = { + email = "rkitover@gmail.com"; + github = "rkitover"; + githubId = 77611; + name = "Rafael Kitover"; + }; rkoe = { email = "rk@simple-is-better.org"; github = "rkoe"; @@ -7087,6 +9058,12 @@ githubId = 13752145; name = "Richard Lupton"; }; + rmcgibbo = { + email = "rmcgibbo@gmail.com"; + github = "rmcgibbo"; + githubId = 641278; + name = "Robert T. McGibbon"; + }; rnhmjoj = { email = "rnhmjoj@inventati.org"; github = "rnhmjoj"; @@ -7139,6 +9116,12 @@ githubId = 3708689; name = "Roberto Di Remigio"; }; + robertoszek = { + email = "robertoszek@robertoszek.xyz"; + github = "robertoszek"; + githubId = 1080963; + name = "Roberto"; + }; robgssp = { email = "robgssp@gmail.com"; github = "robgssp"; @@ -7169,17 +9152,53 @@ githubId = 1217934; name = "José Romildo Malaquias"; }; + ronanmacf = { + email = "macfhlar@tcd.ie"; + github = "ronanmacf"; + githubId = 25930627; + name = "Ronan Mac Fhlannchadha"; + }; rongcuid = { email = "rongcuid@outlook.com"; github = "rongcuid"; githubId = 1312525; name = "Rongcui Dong"; }; + ronthecookie = { + name = "Ron B"; + email = "me@ronthecookie.me"; + github = "ronthecookie"; + githubId = 2526321; + keys = [{ + longkeyid = "rsa2048/0x6F5B32DE5E5FA80C"; + fingerprint = "4B2C DDA5 FA35 642D 956D 7294 6F5B 32DE 5E5F A80C"; + }]; + }; roosemberth = { - email = "roosembert.palacios+nixpkgs@gmail.com"; + email = "roosembert.palacios+nixpkgs@posteo.ch"; github = "roosemberth"; githubId = 3621083; name = "Roosembert (Roosemberth) Palacios"; + keys = [{ + longkeyid = "rsa2048/0xCAAAECE5C2242BB7"; + fingerprint = "78D9 1871 D059 663B 6117 7532 CAAA ECE5 C224 2BB7"; + }]; + }; + rople380 = { + name = "rople380"; + email = "55679162+rople380@users.noreply.github.com"; + github = "rople380"; + githubId = 55679162; + keys = [{ + longkeyid = "rsa2048/0x8526B7574A536236"; + fingerprint = "1401 1B63 393D 16C1 AA9C C521 8526 B757 4A53 6236"; + }]; + }; + rowanG077 = { + email = "goemansrowan@gmail.com"; + github = "rowanG077"; + githubId = 7439756; + name = "Rowan Goemans"; }; royneary = { email = "christian@ulrich.earth"; @@ -7205,12 +9224,30 @@ githubId = 221121; name = "Robert P. Seaton"; }; + rraval = { + email = "ronuk.raval@gmail.com"; + github = "rraval"; + githubId = 373566; + name = "Ronuk Raval"; + }; rszibele = { email = "richard@szibele.com"; github = "rszibele"; githubId = 1387224; name = "Richard Szibele"; }; + rsynnest = { + email = "contact@rsynnest.com"; + github = "rsynnest"; + githubId = 4392850; + name = "Roland Synnestvedt"; + }; + rtburns-jpl = { + email = "rtburns@jpl.nasa.gov"; + github = "rtburns-jpl"; + githubId = 47790121; + name = "Ryan Burns"; + }; rtreffer = { email = "treffer+nixos@measite.de"; github = "rtreffer"; @@ -7223,12 +9260,24 @@ githubId = 4958190; name = "Rushmore Mushambi"; }; + russell = { + email = "russell.sim@gmail.com"; + github = "russell"; + githubId = 2660; + name = "Russell Sim"; + }; ruuda = { email = "dev+nix@veniogames.com"; github = "ruuda"; githubId = 506953; name = "Ruud van Asseldonk"; }; + rvarago = { + email = "rafael.varago@gmail.com"; + github = "rvarago"; + githubId = 7365864; + name = "Rafael Varago"; + }; rvl = { email = "dev+nix@rodney.id.au"; github = "rvl"; @@ -7299,6 +9348,16 @@ githubId = 3280280; name = "Ryne Everett"; }; + rytone = { + email = "max@ryt.one"; + github = "rytone"; + githubId = 8082305; + name = "Maxwell Beck"; + keys = [{ + longkeyid = "rsa2048/0xBB3EFA303760A0DB"; + fingerprint = "D260 79E3 C2BC 2E43 905B D057 BB3E FA30 3760 A0DB"; + }]; + }; rzetterberg = { email = "richard.zetterberg@gmail.com"; github = "rzetterberg"; @@ -7311,6 +9370,12 @@ github = "s1341"; githubId = 5682183; }; + samb96 = { + email = "samb96@gmail.com"; + github = "samb96"; + githubId = 819426; + name = "Sam Bickley"; + }; samdoshi = { email = "sam@metal-fish.co.uk"; github = "samdoshi"; @@ -7397,18 +9462,36 @@ githubId = 8534888; name = "Savanni D'Gerinel"; }; + sayanarijit = { + email = "sayanarijit@gmail.com"; + github = "sayanarijit"; + githubId = 11632726; + name = "Arijit Basu"; + }; sb0 = { email = "sb@m-labs.hk"; github = "sbourdeauducq"; githubId = 720864; name = "Sébastien Bourdeauducq"; }; + sbond75 = { + name = "sbond75"; + email = "43617712+sbond75@users.noreply.github.com"; + github = "sbond75"; + githubId = 43617712; + }; sboosali = { email = "SamBoosalis@gmail.com"; github = "sboosali"; githubId = 2320433; name = "Sam Boosalis"; }; + sbruder = { + email = "nixos@sbruder.de"; + github = "sbruder"; + githubId = 15986681; + name = "Simon Bruder"; + }; scalavision = { email = "scalavision@gmail.com"; github = "scalavision"; @@ -7433,6 +9516,12 @@ githubId = 15379000; name = "schneefux"; }; + schnusch = { + email = "schnusch@users.noreply.github.com"; + github = "schnusch"; + githubId = 5104601; + name = "schnusch"; + }; schristo = { email = "schristopher@konputa.com"; name = "Scott Christopher"; @@ -7491,6 +9580,12 @@ githubId = 19472270; name = "Sebastian"; }; + sebbadk = { + email = "sebastian@sebba.dk"; + github = "SEbbaDK"; + githubId = 1567527; + name = "Sebastian Hyberts"; + }; sellout = { email = "greg@technomadic.org"; github = "sellout"; @@ -7537,6 +9632,16 @@ fingerprint = "A317 37B3 693C 921B 480C C629 4A2A AAA3 82F8 294C"; }]; }; + seylerius = { + name = "Sable Seyler"; + email = "sable@seyleri.us"; + github = "seylerius"; + githubId = 1145981; + keys = [{ + longkeyid = "rsa4096/0xDC26B921A9E9DBDE"; + fingerprint = "7246 B6E1 ABB9 9A48 4395 FD11 DC26 B921 A9E9 DBDE"; + }]; + }; sfrijters = { email = "sfrijters@gmail.com"; github = "sfrijters"; @@ -7597,6 +9702,12 @@ githubId = 1443459; name = "Sheena Artrip"; }; + sheepforce = { + email = "phillip.seeber@googlemail.com"; + github = "sheepforce"; + githubId = 16844216; + name = "Phillip Seeber"; + }; sheganinans = { email = "sheganinans@gmail.com"; github = "sheganinans"; @@ -7627,12 +9738,28 @@ githubId = 997855; name = "Narazaki Shuji"; }; + shofius = { + name = "Sam Hofius"; + email = "sam@samhofi.us"; + github = "kf5grd"; + githubId = 18297490; + }; shou = { email = "x+g@shou.io"; github = "Shou"; githubId = 819413; name = "Benedict Aas"; }; + shreerammodi = { + name = "Shreeram Modi"; + email = "shreerammodi10@gmail.com"; + github = "Shrimpram"; + githubId = 67710369; + keys = [{ + longkeyid = "rsa4096/0x163B16EE76ED24CE"; + fingerprint = "EA88 EA07 26E9 6CBF 6365 3966 163B 16EE 76ED 24CE"; + }]; + }; shyim = { email = "s.sayakci@gmail.com"; github = "shyim"; @@ -7679,6 +9806,12 @@ githubId = 11135311; name = "Simon Chatterjee"; }; + simonkampe = { + email = "simon.kampe+nix@gmail.com"; + github = "simonkampe"; + githubId = 254799; + name = "Simon Kämpe"; + }; simonvandel = { email = "simon.vandel@gmail.com"; github = "simonvandel"; @@ -7819,6 +9952,12 @@ githubId = 3371635; name = "Salar Rahmanian"; }; + sohalt = { + email = "nixos@sohalt.net"; + github = "sohalt"; + githubId = 2157287; + name = "sohalt"; + }; solson = { email = "scott@solson.me"; github = "solson"; @@ -7835,6 +9974,12 @@ fingerprint = "0EC3 FA89 EFBA B421 F82E 40B0 2567 6BCB FFAD 76B1"; }]; }; + sophrosyne = { + email = "joshuaortiz@tutanota.com"; + github = "sophrosyne97"; + githubId = 53029739; + name = "Joshua Ortiz"; + }; sorki = { email = "srk@48.io"; github = "sorki"; @@ -7859,6 +10004,12 @@ githubId = 7669898; name = "Katharina Fey"; }; + spease = { + email = "peasteven@gmail.com"; + github = "spease"; + githubId = 2825204; + name = "Steven Pease"; + }; spencerjanssen = { email = "spencerjanssen@gmail.com"; github = "spencerjanssen"; @@ -7889,6 +10040,12 @@ githubId = 36899624; name = "squalus"; }; + srapenne = { + email = "solene@perso.pw"; + github = "rapenne-s"; + githubId = 248016; + name = "Solène Rapenne"; + }; srghma = { email = "srghma@gmail.com"; github = "srghma"; @@ -7925,12 +10082,30 @@ githubId = 1699155; name = "Steve Elliott"; }; + stelcodes = { + email = "stel@stel.codes"; + github = "stelcodes"; + githubId = 22163194; + name = "Stel Abrego"; + }; + stephank = { + email = "nix@stephank.nl"; + github = "stephank"; + githubId = 89950; + name = "Stéphan Kochen"; + }; stephenmw = { email = "stephen@q5comm.com"; github = "stephenmw"; githubId = 231788; name = "Stephen Weinberg"; }; + stephenwithph = { + name = "StephenWithPH"; + email = "StephenWithPH@users.noreply.github.com"; + github = "StephenWithPH"; + githubId = 2990492; + }; sterfield = { email = "sterfield@gmail.com"; github = "sterfield"; @@ -7938,7 +10113,7 @@ name = "Guillaume Loetscher"; }; sternenseemann = { - email = "post@lukasepple.de"; + email = "sternenseemann@systemli.org"; github = "sternenseemann"; githubId = 3154475; name = "Lukas Epple"; @@ -7965,6 +10140,12 @@ githubId = 1829294; name = "Steve Chávez"; }; + stevebob = { + email = "stephen@sherra.tt"; + github = "stevebob"; + githubId = 417118; + name = "Stephen Sherratt"; + }; steveej = { email = "mail@stefanjunker.de"; github = "steveej"; @@ -7978,8 +10159,8 @@ name = "Stian Lågstad"; }; StijnDW = { - email = "stekke@airmail.cc"; - github = "StijnDW"; + email = "nixdev@rinsa.eu"; + github = "Stekke"; githubId = 1751956; name = "Stijn DW"; }; @@ -8001,12 +10182,48 @@ githubId = 638763; name = "Stuart Moss"; }; + stunkymonkey = { + email = "account@buehler.rocks"; + github = "Stunkymonkey"; + githubId = 1315818; + name = "Felix Bühler"; + }; + stupremee = { + email = "jutus.k@protonmail.com"; + github = "Stupremee"; + githubId = 39732259; + name = "Justus K"; + }; + SubhrajyotiSen = { + email = "subhrajyoti12@gmail.com"; + github = "SubhrajyotiSen"; + githubId = 12984845; + name = "Subhrajyoti Sen"; + }; suhr = { email = "suhr@i2pmail.org"; github = "suhr"; githubId = 65870; name = "Сухарик"; }; + sumnerevans = { + email = "me@sumnerevans.com"; + github = "sumnerevans"; + githubId = 16734772; + name = "Sumner Evans"; + }; + superbo = { + email = "supernbo@gmail.com"; + github = "SuperBo"; + githubId = 2666479; + name = "Y Nguyen"; + }; + superherointj = { + name = "Sérgio G."; + email = "5861043+superherointj@users.noreply.github.com"; + github = "superherointj"; + githubId = 5861043; + }; SuperSandro2000 = { email = "sandro.jaeckel@gmail.com"; github = "SuperSandro2000"; @@ -8019,6 +10236,12 @@ githubId = 187109; name = "Bjarki Ágúst Guðmundsson"; }; + suryasr007 = { + email = "94suryateja@gmail.com"; + github = "suryasr007"; + githubId = 10533926; + name = "Surya Teja V"; + }; suvash = { email = "suvash+nixpkgs@gmail.com"; github = "suvash"; @@ -8031,6 +10254,18 @@ githubId = 1040871; name = "Mathis Antony"; }; + svend = { + email = "svend@svends.net"; + github = "svend"; + githubId = 306190; + name = "Svend Sorensen"; + }; + svrana = { + email = "shaw@vranix.com"; + github = "svrana"; + githubId = 850665; + name = "Shaw Vrana"; + }; svsdep = { email = "svsdep@gmail.com"; github = "svsdep"; @@ -8091,6 +10326,12 @@ githubId = 203195; name = "Szczyp"; }; + szlend = { + email = "pub.nix@zlender.si"; + github = "szlend"; + githubId = 7301807; + name = "Simon Žlender"; + }; sztupi = { email = "attila.sztupak@gmail.com"; github = "sztupi"; @@ -8137,6 +10378,12 @@ githubId = 321799; name = "Paul Colomiets"; }; + takagiy = { + email = "takagiy.4dev@gmail.com"; + github = "takagiy"; + githubId = 18656090; + name = "Yuki Takagi"; + }; taketwo = { email = "alexandrov88@gmail.com"; github = "taketwo"; @@ -8191,12 +10438,6 @@ githubId = 102685; name = "Thomas Friese"; }; - tavyc = { - email = "octavian.cerna@gmail.com"; - github = "tavyc"; - githubId = 3650609; - name = "Octavian Cerna"; - }; tazjin = { email = "mail@tazj.in"; github = "tazjin"; @@ -8221,6 +10462,12 @@ githubId = 2389333; name = "Andy Tockman"; }; + Technical27 = { + email = "38222826+Technical27@users.noreply.github.com"; + github = "Technical27"; + githubId = 38222826; + name = "Aamaruvi Yogamani"; + }; teh = { email = "tehunger@gmail.com"; github = "teh"; @@ -8239,6 +10486,12 @@ githubId = 649832; name = "Teo Klestrup Röijezon"; }; + terin = { + email = "terinjokes@gmail.com"; + github = "terinjokes"; + githubId = 273509; + name = "Terin Stock"; + }; terlar = { email = "terlar@gmail.com"; github = "terlar"; @@ -8269,6 +10522,12 @@ githubId = 27386; name = "Milan Svoboda"; }; + tfc = { + email = "jacek@galowicz.de"; + github = "tfc"; + githubId = 29044; + name = "Jacek Galowicz"; + }; tg-x = { email = "*@tg-x.net"; github = "tg-x"; @@ -8329,8 +10588,14 @@ githubId = 3105057; name = "Jan Beinke"; }; + therealansh = { + email = "tyagiansh23@gmail.com"; + github = "therealansh"; + githubId = 57180880; + name = "Ansh Tyagi"; + }; thesola10 = { - email = "thesola10@bobile.fr"; + email = "me@thesola.io"; github = "thesola10"; githubId = 7287268; keys = [{ @@ -8351,6 +10616,12 @@ githubId = 844343; name = "Thiago K. Okada"; }; + thibautmarty = { + email = "github@thibautmarty.fr"; + github = "ThibautMarty"; + githubId = 3268082; + name = "Thibaut Marty"; + }; thmzlt = { email = "git@thomazleite.com"; github = "thmzlt"; @@ -8393,6 +10664,22 @@ githubId = 1391883; name = "Tom Hall"; }; + Thunderbottom = { + email = "chinmaydpai@gmail.com"; + github = "Thunderbottom"; + githubId = 11243138; + name = "Chinmay D. Pai"; + keys = [{ + longkeyid = "rsa4096/0x75507BE256F40CED"; + fingerprint = "7F3E EEAA EE66 93CC 8782 042A 7550 7BE2 56F4 0CED"; + }]; + }; + tiagolobocastro = { + email = "tiagolobocastro@gmail.com"; + github = "tiagolobocastro"; + githubId = 1618946; + name = "Tiago Castro"; + }; tilpner = { email = "till@hoeppner.ws"; github = "tilpner"; @@ -8457,6 +10744,12 @@ fingerprint = "556A 403F B0A2 D423 F656 3424 8489 B911 F9ED 617B"; }]; }; + tmountain = { + email = "tinymountain@gmail.com"; + github = "tmountain"; + githubId = 135297; + name = "Travis Whitton"; + }; tmplt = { email = "tmplt@dragons.rocks"; github = "tmplt"; @@ -8469,6 +10762,16 @@ githubId = 9853194; name = "Philipp Bartsch"; }; + toastal = { + email = "toastal+nix@posteo.net"; + github = "toastal"; + githubId = 561087; + name = "toastal"; + keys = [{ + longkeyid = "ed25519/5CCE6F1466D47C9E"; + fingerprint = "7944 74B7 D236 DAB9 C9EF E7F9 5CCE 6F14 66D4 7C9E"; + }]; + }; tobim = { email = "nix@tobim.fastmail.fm"; github = "tobim"; @@ -8518,7 +10821,7 @@ name = "Tom Smeets"; }; toonn = { - email = "nnoot@toonn.io"; + email = "nixpkgs@toonn.io"; github = "toonn"; githubId = 1486805; name = "Toon Nolten"; @@ -8529,12 +10832,30 @@ githubId = 27586264; name = "Tobias Schmidt"; }; + totoroot = { + name = "Matthias Thym"; + email = "git@thym.at"; + github = "totoroot"; + githubId = 39650930; + }; + ToxicFrog = { + email = "toxicfrog@ancilla.ca"; + github = "ToxicFrog"; + githubId = 90456; + name = "Rebecca (Bex) Kelly"; + }; travisbhartwell = { email = "nafai@travishartwell.net"; github = "travisbhartwell"; githubId = 10110; name = "Travis B. Hartwell"; }; + TredwellGit = { + email = "tredwell@tutanota.com"; + github = "TredwellGit"; + githubId = 61860346; + name = "Tredwell"; + }; treemo = { email = "matthieu.chevrier@treemo.fr"; github = "treemo"; @@ -8571,6 +10892,12 @@ githubId = 483735; name = "Dmitry Geurkov"; }; + truh = { + email = "jakob-nixos@truh.in"; + github = "truh"; + githubId = 1183303; + name = "Jakob Klepp"; + }; tscholak = { email = "torsten.scholak@googlemail.com"; github = "tscholak"; @@ -8593,6 +10920,22 @@ githubId = 303489; name = "Manuel Bärenz"; }; + tu-maurice = { + email = "valentin.gehrke+nixpkgs@zom.bi"; + github = "tu-maurice"; + githubId = 16151097; + name = "Valentin Gehrke"; + }; + tuxinaut = { + email = "trash4you@tuxinaut.de"; + github = "tuxinaut"; + githubId = 722482; + name = "Denny Schäfer"; + keys = [{ + longkeyid = "rsa4096/0xB057455D1E567270"; + fingerprint = "C752 0E49 4D92 1740 D263 C467 B057 455D 1E56 7270"; + }]; + }; tv = { email = "tv@krebsco.de"; github = "4z3"; @@ -8651,6 +10994,22 @@ githubId = 347983; name = "Udo Spallek"; }; + ulrikstrid = { + email = "ulrik.strid@outlook.com"; + github = "ulrikstrid"; + githubId = 1607770; + name = "Ulrik Strid"; + }; + unclechu = { + name = "Viacheslav Lotsmanov"; + email = "lotsmanov89@gmail.com"; + github = "unclechu"; + githubId = 799353; + keys = [{ + longkeyid = "rsa4096/0xD276FF7467007335"; + fingerprint = "EE59 5E29 BB5B F2B3 5ED2 3F1C D276 FF74 6700 7335"; + }]; + }; unode = { email = "alves.rjc@gmail.com"; github = "unode"; @@ -8663,12 +11022,24 @@ githubId = 619015; name = "Svintsov Dmitry"; }; + urbas = { + email = "matej.urbas@gmail.com"; + github = "urbas"; + githubId = 771193; + name = "Matej Urbas"; + }; uri-canva = { email = "uri@canva.com"; github = "uri-canva"; githubId = 33242106; name = "Uri Baghin"; }; + urlordjames = { + email = "urlordjames@gmail.com"; + github = "urlordjames"; + githubId = 32751441; + name = "urlordjames"; + }; uskudnik = { email = "urban.skudnik@gmail.com"; github = "uskudnik"; @@ -8693,11 +11064,11 @@ githubId = 2212422; name = "uwap"; }; - va1entin = { - email = "github@valentinsblog.com"; - github = "va1entin"; - githubId = 31535155; - name = "Valentin Heidelberger"; + V = { + name = "V"; + email = "v@anomalous.eu"; + github = "deviant"; + githubId = 68829907; }; vaibhavsagar = { email = "vaibhavsagar@gmail.com"; @@ -8729,6 +11100,12 @@ githubId = 608417; name = "Jos van den Oever"; }; + vanilla = { + email = "neko@hydev.org"; + github = "VergeDX"; + githubId = 25173827; + name = "Vanilla"; + }; vanschelven = { email = "klaas@vanschelven.com"; github = "vanschelven"; @@ -8792,6 +11169,12 @@ fingerprint = "4D23 ECDF 880D CADF 5ECA 4458 874B D6F9 16FA A742"; }]; }; + vel = { + email = "llathasa@outlook.com"; + github = "llathasa-veleth"; + githubId = 61933599; + name = "vel"; + }; velovix = { email = "xaviosx@gmail.com"; github = "velovix"; @@ -8897,7 +11280,12 @@ githubId = 45292658; name = "Julius Schmitt"; }; - + vojta001 = { + email = "vojtech.kane@gmail.com"; + github = "vojta001"; + githubId = 7038383; + name = "Vojta Káně"; + }; volhovm = { email = "volhovm.cs@gmail.com"; github = "volhovm"; @@ -8910,10 +11298,26 @@ githubId = 508305; name = "Jaroslavas Pocepko"; }; + vonfry = { + email = "nixos@vonfry.name"; + github = "Vonfry"; + githubId = 3413119; + name = "Vonfry"; + }; vozz = { email = "oliver.huntuk@gmail.com"; name = "Oliver Hunt"; }; + vq = { + email = "vq@erq.se"; + name = "Daniel Nilsson"; + }; + vrinek = { + email = "vrinek@hey.com"; + github = "vrinek"; + name = "Kostas Karachalios"; + githubId = 81346; + }; vrthra = { email = "rahul@gopinath.org"; github = "vrthra"; @@ -8926,6 +11330,12 @@ githubId = 7677567; name = "Victor SENE"; }; + vtuan10 = { + email = "mail@tuan-vo.de"; + github = "vtuan10"; + githubId = 16415673; + name = "Van Tuan Vo"; + }; vyorkin = { email = "vasiliy.yorkin@gmail.com"; github = "vyorkin"; @@ -8938,6 +11348,16 @@ githubId = 3889405; name = "vyp"; }; + wakira = { + name = "Sheng Wang"; + email = "sheng@a64.work"; + github = "wakira"; + githubId = 2338339; + keys = [{ + longkeyid = "rsa4096/0x8C9B0A8FC0C0D862"; + fingerprint = "47F7 009E 3AE3 1DA7 988E 12E1 8C9B 0A8F C0C0 D862"; + }]; + }; wamserma = { name = "Markus S. Wamser"; email = "github-dev@mail2013.wamser.eu"; @@ -8960,12 +11380,40 @@ email = "kirill.wedens@gmail.com"; name = "wedens"; }; + weihua = { + email = "luwh364@gmail.com"; + github = "weihua-lu"; + githubId = 9002575; + name = "Weihua Lu"; + }; + wheelsandmetal = { + email = "jakob@schmutz.co.uk"; + github = "wheelsandmetal"; + githubId = 13031455; + name = "Jakob Schmutz"; + }; WhittlesJr = { email = "alex.joseph.whitt@gmail.com"; github = "WhittlesJr"; githubId = 19174984; name = "Alex Whitt"; }; + whonore = { + email = "wolfhonore@gmail.com"; + github = "whonore"; + githubId = 7121530; + name = "Wolf Honoré"; + }; + wildsebastian = { + name = "Sebastian Wild"; + email = "sebastian@wild-siena.com"; + github = "wildsebastian"; + githubId = 1215623; + keys = [{ + longkeyid = "rsa4096/0x366A2940479A06FC"; + fingerprint = "DA03 D6C6 3F58 E796 AD26 E99B 366A 2940 479A 06FC"; + }]; + }; willibutz = { email = "willibutz@posteo.de"; github = "willibutz"; @@ -8986,6 +11434,18 @@ githubId = 6016963; name = "Patrick Winter"; }; + winterqt = { + email = "nixos@winter.cafe"; + github = "winterqt"; + githubId = 78392041; + name = "Winter"; + }; + wirew0rm = { + email = "alex@wirew0rm.de"; + github = "wirew0rm"; + githubId = 1202371; + name = "Alexander Krimm"; + }; wishfort36 = { email = "42300264+wishfort36@users.noreply.github.com"; github = "wishfort36"; @@ -9004,6 +11464,12 @@ githubId = 43315; name = "William Roe"; }; + wldhx = { + email = "wldhx+nixpkgs@wldhx.me"; + github = "wldhx"; + githubId = 15619766; + name = "wldhx"; + }; wmertens = { email = "Wout.Mertens@gmail.com"; github = "wmertens"; @@ -9028,6 +11494,18 @@ githubId = 1322287; name = "William O'Hanley"; }; + woky = { + email = "pampu.andrei@pm.me"; + github = "andreisergiu98"; + githubId = 11740700; + name = "Andrei Pampu"; + }; + wolfangaukang = { + email = "liquid.query960@4wrd.cc"; + github = "wolfangaukang"; + githubId = 8378365; + name = "P. R. d. O."; + }; womfoo = { email = "kranium@gikos.net"; github = "womfoo"; @@ -9038,7 +11516,7 @@ email = "worldofpeace@protonmail.ch"; github = "worldofpeace"; githubId = 28888242; - name = "worldofpeace"; + name = "WORLDofPEACE"; }; wscott = { email = "wsc9tt@gmail.com"; @@ -9064,6 +11542,12 @@ githubId = 13378502; name = "Wulfsta"; }; + wunderbrick = { + name = "Andrew Phipps"; + email = "lambdafuzz@tutanota.com"; + github = "wunderbrick"; + githubId = 52174714; + }; wyvie = { email = "elijahrum@gmail.com"; github = "wyvie"; @@ -9082,6 +11566,12 @@ githubId = 13489144; name = "Calle Rosenquist"; }; + xdhampus = { + name = "Hampus"; + email = "16954508+xdHampus@users.noreply.github.com"; + github = "xdHampus"; + githubId = 16954508; + }; xe = { email = "me@christine.website"; github = "Xe"; @@ -9094,6 +11584,12 @@ githubId = 36407913; name = "Uli Baum"; }; + xfnw = { + email = "xfnw+nixos@riseup.net"; + github = "xfnw"; + githubId = 66233223; + name = "Owen"; + }; xfix = { email = "konrad@borowski.pw"; github = "xfix"; @@ -9136,6 +11632,12 @@ githubId = 11824817; name = "Marti Serra"; }; + xworld21 = { + email = "1962985+xworld21@users.noreply.github.com"; + github = "xworld21"; + githubId = 1962985; + name = "Vincenzo Mantova"; + }; xwvvvvwx = { email = "davidterry@posteo.de"; github = "xwvvvvwx"; @@ -9190,6 +11692,12 @@ githubId = 1322201; name = "Yochai"; }; + yoctocell = { + email = "public@yoctocell.xyz"; + github = "yoctocell"; + githubId = 40352765; + name = "Yoctocell"; + }; yorickvp = { email = "yorickvanpelt@gmail.com"; github = "yorickvp"; @@ -9230,6 +11738,12 @@ fingerprint = "85F8 E850 F8F2 F823 F934 535B EC50 6589 9AEA AF4C"; }]; }; + yuka = { + email = "yuka@yuka.dev"; + github = "yu-re-ka"; + githubId = 86169957; + name = "Yureka"; + }; yusdacra = { email = "y.bera003.06@protonmail.com"; github = "yusdacra"; @@ -9270,6 +11784,12 @@ githubId = 568532; name = "Christian Zagrodnick"; }; + zakame = { + email = "zakame@zakame.net"; + github = "zakame"; + githubId = 110625; + name = "Zak B. Elep"; + }; zalakain = { email = "ping@umazalakain.info"; github = "umazalakain"; @@ -9326,6 +11846,12 @@ githubId = 1141948; name = "Zack Grannan"; }; + zhaofengli = { + email = "hello@zhaofeng.li"; + github = "zhaofengli"; + githubId = 2189609; + name = "Zhaofeng Li"; + }; zimbatm = { email = "zimbatm@zimbatm.com"; github = "zimbatm"; @@ -9356,6 +11882,12 @@ githubId = 1069303; name = "Kim Simmons"; }; + zopieux = { + email = "zopieux@gmail.com"; + github = "zopieux"; + githubId = 81353; + name = "Alexandre Macabies"; + }; zowoq = { email = "59103226+zowoq@users.noreply.github.com"; github = "zowoq"; @@ -9368,12 +11900,24 @@ githubId = 8100652; name = "David Mell"; }; + ztzg = { + email = "dd@crosstwine.com"; + github = "ztzg"; + githubId = 393108; + name = "Damien Diederen"; + }; zx2c4 = { email = "Jason@zx2c4.com"; github = "zx2c4"; githubId = 10643; name = "Jason A. Donenfeld"; }; + zyansheep = { + email = "zyansheep@protonmail.com"; + github = "zyansheep"; + githubId = 20029431; + name = "Zyansheep"; + }; zzamboni = { email = "diego@zzamboni.org"; github = "zzamboni"; @@ -9434,20 +11978,20 @@ githubId = 8686360; name = "Illia Shestakov"; }; - foxit64 = { - email = "o4nsxy05@gmail.com"; - github = "foxit64"; - githubId = 56247270; - name = "Foxit"; - }; masaeedu = { email = "masaeedu@gmail.com"; github = "masaeedu"; githubId = 3674056; name = "Asad Saeeduddin"; }; + matthewcroughan = { + email = "matt@croughan.sh"; + github = "matthewcroughan"; + githubId = 26458780; + name = "Matthew Croughan"; + }; ngerstle = { - name = "Nicholas Gerstle"; + name = "Nicholas Gerstle"; email = "ngerstle@gmail.com"; github = "ngerstle"; githubId = 1023752; @@ -9470,6 +12014,16 @@ github = "ymarkus"; githubId = 62380378; }; + ymatsiuk = { + name = "Yurii Matsiuk"; + email = "ymatsiuk@users.noreply.github.com"; + github = "ymatsiuk"; + githubId = 24990891; + keys = [{ + longkeyid = "rsa4096/0x61302290298601AA"; + fingerprint = "7BB8 84B5 74DA FDB1 E194 ED21 6130 2290 2986 01AA"; + }]; + }; ymeister = { name = "Yuri Meister"; email = "47071325+ymeister@users.noreply.github.com"; @@ -9534,4 +12088,112 @@ fingerprint = "F1C5 760E 45B9 9A44 72E9 6BFB D65C 9AFB 4C22 4DA3"; }]; }; + berbiche = { + name = "Nicolas Berbiche"; + email = "nicolas@normie.dev"; + github = "berbiche"; + githubId = 20448408; + keys = [{ + longkeyid = "rsa4096/0xB461292445C6E696"; + fingerprint = "D446 E58D 87A0 31C7 EC15 88D7 B461 2924 45C6 E696"; + }]; + }; + wenngle = { + name = "Zeke Stephens"; + email = "zekestephens@gmail.com"; + github = "wenngle"; + githubId = 63376671; + }; + yanganto = { + name = "Antonio Yang"; + email = "yanganto@gmail.com"; + github = "yanganto"; + githubId = 10803111; + }; + starcraft66 = { + name = "Tristan Gosselin-Hane"; + email = "starcraft66@gmail.com"; + github = "starcraft66"; + githubId = 1858154; + keys = [{ + longkeyid = "rsa4096/0x9D98CDACFF04FD78"; + fingerprint = "8597 4506 EC69 5392 0443 0805 9D98 CDAC FF04 FD78"; + }]; + }; + hloeffler = { + name = "Hauke Löffler"; + email = "nix@hauke-loeffler.de"; + github = "hloeffler"; + githubId = 6627191; + }; + wilsonehusin = { + name = "Wilson E. Husin"; + email = "wilsonehusin@gmail.com"; + github = "wilsonehusin"; + githubId = 14004487; + }; + bb2020 = { + email = "bb2020@users.noreply.github.com"; + github = "bb2020"; + githubId = 19290397; + name = "Tunc Uzlu"; + }; + pulsation = { + name = "Philippe Sam-Long"; + email = "1838397+pulsation@users.noreply.github.com"; + github = "pulsation"; + githubId = 1838397; + }; + princemachiavelli = { + name = "Josh Hoffer"; + email = "jhoffer@sansorgan.es"; + github = "princemachiavelli"; + githubId = 2730968; + keys = [{ + longkeyid = "ed25519/0x83124F97A318EA18"; + fingerprint = "DD54 130B ABEC B65C 1F6B 2A38 8312 4F97 A318 EA18"; + }]; + }; + ydlr = { + name = "ydlr"; + email = "ydlr@ydlr.io"; + github = "ydlr"; + githubId = 58453832; + keys = [{ + longkeyid = "rsa4096/0x43AB44130A29AD9D"; + fingerprint = "FD0A C425 9EF5 4084 F99F 9B47 2ACC 9749 7C68 FAD4"; + }]; + }; + zane = { + name = "Zane van Iperen"; + email = "zane@zanevaniperen.com"; + github = "vs49688"; + githubId = 4423262; + keys = [{ + longkeyid = "rsa4096/0x68616B2D8AC4DCC5"; + fingerprint = "61AE D40F 368B 6F26 9DAE 3892 6861 6B2D 8AC4 DCC5"; + }]; + }; + zeri = { + name = "zeri"; + email = "68825133+zeri42@users.noreply.github.com"; + github = "zeri42"; + githubId = 68825133; + }; + zseri = { + name = "zseri"; + email = "zseri.devel@ytrizja.de"; + github = "zseri"; + githubId = 1618343; + keys = [{ + longkeyid = "rsa4096/0x229E63AE5644A96D"; + fingerprint = "7AFB C595 0D3A 77BD B00F 947B 229E 63AE 5644 A96D"; + }]; + }; + zupo = { + name = "Nejc Zupan"; + email = "nejczupan+nix@gmail.com"; + github = "zupo"; + githubId = 311580; + }; } diff --git a/maintainers/scripts/build.nix b/maintainers/scripts/build.nix index c70993cf138..ca401700b4a 100644 --- a/maintainers/scripts/build.nix +++ b/maintainers/scripts/build.nix @@ -1,10 +1,18 @@ -{ maintainer }: +{ maintainer +, localSystem ? { system = args.system or builtins.currentSystem; } +, system ? localSystem.system +, crossSystem ? localSystem +, ... +}@args: # based on update.nix # nix-build build.nix --argstr maintainer <yourname> +# to build for aarch64-linux using boot.binfmt.emulatedSystems: +# nix-build build.nix --argstr maintainer <yourname> --argstr system aarch64-linux + let - pkgs = import ./../../default.nix {}; + pkgs = import ./../../default.nix (removeAttrs args [ "maintainer" ]); maintainer_ = pkgs.lib.maintainers.${maintainer}; packagesWith = cond: return: set: (pkgs.lib.flatten @@ -13,8 +21,12 @@ let let result = builtins.tryEval ( - if pkgs.lib.isDerivation pkg && cond name pkg - then [ (return name pkg) ] + if pkgs.lib.isDerivation pkg && cond name pkg then + # Skip packages whose closure fails on evaluation. + # This happens for pkgs like `python27Packages.djangoql` + # that have disabled Python pkgs as dependencies. + builtins.seq pkg.outPath + [ (return name pkg) ] else if pkg.recurseForDerivations or false || pkg.recurseForRelease or false then packagesWith cond return pkg else [ ] @@ -30,7 +42,7 @@ in packagesWith (name: pkg: ( - if builtins.hasAttr "maintainers" pkg.meta + if builtins.hasAttr "meta" pkg && builtins.hasAttr "maintainers" pkg.meta then ( if builtins.isList pkg.meta.maintainers then builtins.elem maintainer_ pkg.meta.maintainers diff --git a/maintainers/scripts/check-hydra-by-maintainer.nix b/maintainers/scripts/check-hydra-by-maintainer.nix new file mode 100644 index 00000000000..326aae47f8c --- /dev/null +++ b/maintainers/scripts/check-hydra-by-maintainer.nix @@ -0,0 +1,68 @@ +{ maintainer }: +let + pkgs = import ./../../default.nix { }; + maintainer_ = pkgs.lib.maintainers.${maintainer}; + packagesWith = cond: return: prefix: set: + (pkgs.lib.flatten + (pkgs.lib.mapAttrsToList + (name: pkg: + let + result = builtins.tryEval + ( + if pkgs.lib.isDerivation pkg && cond name pkg then + # Skip packages whose closure fails on evaluation. + # This happens for pkgs like `python27Packages.djangoql` + # that have disabled Python pkgs as dependencies. + builtins.seq pkg.outPath + [ (return "${prefix}${name}") ] + else if pkg.recurseForDerivations or false || pkg.recurseForRelease or false + # then packagesWith cond return pkg + then packagesWith cond return "${name}." pkg + else [ ] + ); + in + if result.success then result.value + else [ ] + ) + set + ) + ); + + packages = packagesWith + (name: pkg: + ( + if builtins.hasAttr "meta" pkg && builtins.hasAttr "maintainers" pkg.meta + then + ( + if builtins.isList pkg.meta.maintainers + then builtins.elem maintainer_ pkg.meta.maintainers + else maintainer_ == pkg.meta.maintainers + ) + else false + ) + ) + (name: name) + ("") + pkgs; + +in +pkgs.stdenv.mkDerivation { + name = "nixpkgs-update-script"; + buildInputs = [ pkgs.hydra-check ]; + buildCommand = '' + echo "" + echo "----------------------------------------------------------------" + echo "" + echo "nix-shell maintainers/scripts/check-hydra-by-maintainer.nix --argstr maintainer SuperSandro2000" + echo "" + echo "----------------------------------------------------------------" + exit 1 + ''; + shellHook = '' + unset shellHook # do not contaminate nested shells + echo "Please stand by" + echo nix-shell -p hydra-check --run "hydra-check ${builtins.concatStringsSep " " packages}" + nix-shell -p hydra-check --run "hydra-check ${builtins.concatStringsSep " " packages}" + exit $? + ''; +} diff --git a/maintainers/scripts/copy-tarballs.pl b/maintainers/scripts/copy-tarballs.pl index 59696a4432d..6a08eb88bf8 100755 --- a/maintainers/scripts/copy-tarballs.pl +++ b/maintainers/scripts/copy-tarballs.pl @@ -165,6 +165,20 @@ elsif (defined $expr) { my $hash = $fetch->{hash}; my $name = $fetch->{name}; + if ($hash =~ /^([a-z0-9]+)-([A-Za-z0-9+\/=]+)$/) { + $algo = $1; + $hash = `nix hash to-base16 $hash` or die; + chomp $hash; + } + + next unless $algo =~ /^[a-z0-9]+$/; + + # Convert non-SRI base-64 to base-16. + if ($hash =~ /^[A-Za-z0-9+\/=]+$/) { + $hash = `nix hash to-base16 --type '$algo' $hash` or die; + chomp $hash; + } + if (defined $ENV{DEBUG}) { print "$url $algo $hash\n"; next; @@ -184,7 +198,7 @@ elsif (defined $expr) { my $storePath = makeFixedOutputPath(0, $algo, $hash, $name); - print STDERR "mirroring $url ($storePath)...\n"; + print STDERR "mirroring $url ($storePath, $algo, $hash)...\n"; if ($dryRun) { $mirrored++; diff --git a/maintainers/scripts/fetch-kde-qt.sh b/maintainers/scripts/fetch-kde-qt.sh index c6c980dd0cb..22d78151978 100755 --- a/maintainers/scripts/fetch-kde-qt.sh +++ b/maintainers/scripts/fetch-kde-qt.sh @@ -14,13 +14,12 @@ fi tmp=$(mktemp -d) pushd $tmp >/dev/null -wget -nH -r -c --no-parent "${WGET_ARGS[@]}" -A '*.tar.xz.sha256' -A '*.mirrorlist' >/dev/null -find -type f -name '*.mirrorlist' -delete +wget -nH -r -c --no-parent "${WGET_ARGS[@]}" >/dev/null csv=$(mktemp) find . -type f | while read src; do # Sanitize file name - filename=$(gawk '{ print $2 }' "$src" | tr '@' '_') + filename=$(basename "$src" | tr '@' '_') nameVersion="${filename%.tar.*}" name=$(echo "$nameVersion" | sed -e 's,-[[:digit:]].*,,' | sed -e 's,-opensource-src$,,' | sed -e 's,-everywhere-src$,,') version=$(echo "$nameVersion" | sed -e 's,^\([[:alpha:]][[:alnum:]]*-\)\+,,') @@ -40,8 +39,8 @@ gawk -F , "{ print \$1 }" $csv | sort | uniq | while read name; do latestVersion=$(echo "$versions" | sort -rV | head -n 1) src=$(gawk -F , "/^$name,$latestVersion,/ { print \$3 }" $csv) filename=$(gawk -F , "/^$name,$latestVersion,/ { print \$4 }" $csv) - url="$(dirname "${src:2}")/$filename" - sha256=$(gawk '{ print $1 }' "$src") + url="${src:2}" + sha256=$(nix-hash --type sha256 --base32 --flat "$src") cat >>"$SRCS" <<EOF $name = { version = "$latestVersion"; diff --git a/maintainers/scripts/haskell/hydra-report.hs b/maintainers/scripts/haskell/hydra-report.hs new file mode 100755 index 00000000000..fd6430d43c9 --- /dev/null +++ b/maintainers/scripts/haskell/hydra-report.hs @@ -0,0 +1,408 @@ +#! /usr/bin/env nix-shell +#! nix-shell -p "haskellPackages.ghcWithPackages (p: [p.aeson p.req])" +#! nix-shell -p hydra-unstable +#! nix-shell -i runhaskell + +{- + +The purpose of this script is + +1) download the state of the nixpkgs/haskell-updates job from hydra (with get-report) +2) print a summary of the state suitable for pasting into a github comment (with ping-maintainers) +3) print a list of broken packages suitable for pasting into configuration-hackage2nix.yaml + +Because step 1) is quite expensive and takes roughly ~5 minutes the result is cached in a json file in XDG_CACHE. + +-} +{-# LANGUAGE BlockArguments #-} +{-# LANGUAGE DeriveAnyClass #-} +{-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE DerivingStrategies #-} +{-# LANGUAGE DuplicateRecordFields #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NamedFieldPuns #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE TupleSections #-} +{-# OPTIONS_GHC -Wall #-} + +import Control.Monad (forM_, (<=<)) +import Control.Monad.Trans (MonadIO (liftIO)) +import Data.Aeson ( + FromJSON, + ToJSON, + decodeFileStrict', + eitherDecodeStrict', + encodeFile, + ) +import Data.Foldable (Foldable (toList), foldl') +import Data.List.NonEmpty (NonEmpty, nonEmpty) +import qualified Data.List.NonEmpty as NonEmpty +import Data.Map.Strict (Map) +import qualified Data.Map.Strict as Map +import Data.Maybe (fromMaybe, mapMaybe) +import Data.Monoid (Sum (Sum, getSum)) +import Data.Sequence (Seq) +import qualified Data.Sequence as Seq +import Data.Set (Set) +import qualified Data.Set as Set +import Data.Text (Text) +import qualified Data.Text as Text +import Data.Text.Encoding (encodeUtf8) +import Data.Time (defaultTimeLocale, formatTime, getCurrentTime) +import Data.Time.Clock (UTCTime) +import GHC.Generics (Generic) +import Network.HTTP.Req ( + GET (GET), + NoReqBody (NoReqBody), + defaultHttpConfig, + header, + https, + jsonResponse, + req, + responseBody, + responseTimeout, + runReq, + (/:), + ) +import System.Directory (XdgDirectory (XdgCache), getXdgDirectory) +import System.Environment (getArgs) +import System.Process (readProcess) +import Prelude hiding (id) + +newtype JobsetEvals = JobsetEvals + { evals :: Seq Eval + } + deriving (Generic, ToJSON, FromJSON, Show) + +newtype Nixpkgs = Nixpkgs {revision :: Text} + deriving (Generic, ToJSON, FromJSON, Show) + +newtype JobsetEvalInputs = JobsetEvalInputs {nixpkgs :: Nixpkgs} + deriving (Generic, ToJSON, FromJSON, Show) + +data Eval = Eval + { id :: Int + , jobsetevalinputs :: JobsetEvalInputs + } + deriving (Generic, ToJSON, FromJSON, Show) + +data Build = Build + { job :: Text + , buildstatus :: Maybe Int + , finished :: Int + , id :: Int + , nixname :: Text + , system :: Text + , jobsetevals :: Seq Int + } + deriving (Generic, ToJSON, FromJSON, Show) + +main :: IO () +main = do + args <- getArgs + case args of + ["get-report"] -> getBuildReports + ["ping-maintainers"] -> printMaintainerPing + ["mark-broken-list"] -> printMarkBrokenList + _ -> putStrLn "Usage: get-report | ping-maintainers | mark-broken-list" + +reportFileName :: IO FilePath +reportFileName = getXdgDirectory XdgCache "haskell-updates-build-report.json" + +showT :: Show a => a -> Text +showT = Text.pack . show + +getBuildReports :: IO () +getBuildReports = runReq defaultHttpConfig do + evalMay <- Seq.lookup 0 . evals <$> myReq (https "hydra.nixos.org" /: "jobset" /: "nixpkgs" /: "haskell-updates" /: "evals") mempty + eval@Eval{id} <- maybe (liftIO $ fail "No Evalution found") pure evalMay + liftIO . putStrLn $ "Fetching evaluation " <> show id <> " from Hydra. This might take a few minutes..." + buildReports :: Seq Build <- myReq (https "hydra.nixos.org" /: "eval" /: showT id /: "builds") (responseTimeout 600000000) + liftIO do + fileName <- reportFileName + putStrLn $ "Finished fetching all builds from Hydra, saving report as " <> fileName + now <- getCurrentTime + encodeFile fileName (eval, now, buildReports) + where + myReq query option = responseBody <$> req GET query NoReqBody jsonResponse (header "User-Agent" "hydra-report.hs/v1 (nixpkgs;maintainers/scripts/haskell)" <> option) + +hydraEvalCommand :: FilePath +hydraEvalCommand = "hydra-eval-jobs" + +hydraEvalParams :: [String] +hydraEvalParams = ["-I", ".", "pkgs/top-level/release-haskell.nix"] + +handlesCommand :: FilePath +handlesCommand = "nix-instantiate" + +handlesParams :: [String] +handlesParams = ["--eval", "--strict", "--json", "-"] + +handlesExpression :: String +handlesExpression = "with import ./. {}; with lib; zipAttrsWith (_: builtins.head) (mapAttrsToList (_: v: if v ? github then { \"${v.email}\" = v.github; } else {}) (import maintainers/maintainer-list.nix))" + +-- | This newtype is used to parse a Hydra job output from @hydra-eval-jobs@. +-- The only field we are interested in is @maintainers@, which is why this +-- is just a newtype. +-- +-- Note that there are occassionally jobs that don't have a maintainers +-- field, which is why this has to be @Maybe Text@. +newtype Maintainers = Maintainers { maintainers :: Maybe Text } + deriving stock (Generic, Show) + deriving anyclass (FromJSON, ToJSON) + +-- | This is a 'Map' from Hydra job name to maintainer email addresses. +-- +-- It has values similar to the following: +-- +-- @@ +-- fromList +-- [ ("arion.aarch64-linux", Maintainers (Just "robert@example.com")) +-- , ("bench.x86_64-linux", Maintainers (Just "")) +-- , ("conduit.x86_64-linux", Maintainers (Just "snoy@man.com, web@ber.com")) +-- , ("lens.x86_64-darwin", Maintainers (Just "ek@category.com")) +-- ] +-- @@ +-- +-- Note that Hydra jobs without maintainers will have an empty string for the +-- maintainer list. +type HydraJobs = Map Text Maintainers + +-- | Map of email addresses to GitHub handles. +-- This is built from the file @../../maintainer-list.nix@. +-- +-- It has values similar to the following: +-- +-- @@ +-- fromList +-- [ ("robert@example.com", "rob22") +-- , ("ek@category.com", "edkm") +-- ] +-- @@ +type EmailToGitHubHandles = Map Text Text + +-- | Map of Hydra jobs to maintainer GitHub handles. +-- +-- It has values similar to the following: +-- +-- @@ +-- fromList +-- [ ("arion.aarch64-linux", ["rob22"]) +-- , ("conduit.x86_64-darwin", ["snoyb", "webber"]) +-- ] +-- @@ +type MaintainerMap = Map Text (NonEmpty Text) + +-- | Generate a mapping of Hydra job names to maintainer GitHub handles. +getMaintainerMap :: IO MaintainerMap +getMaintainerMap = do + hydraJobs :: HydraJobs <- + readJSONProcess hydraEvalCommand hydraEvalParams "" "Failed to decode hydra-eval-jobs output: " + handlesMap :: EmailToGitHubHandles <- + readJSONProcess handlesCommand handlesParams handlesExpression "Failed to decode nix output for lookup of github handles: " + pure $ Map.mapMaybe (splitMaintainersToGitHubHandles handlesMap) hydraJobs + where + -- Split a comma-spearated string of Maintainers into a NonEmpty list of + -- GitHub handles. + splitMaintainersToGitHubHandles + :: EmailToGitHubHandles -> Maintainers -> Maybe (NonEmpty Text) + splitMaintainersToGitHubHandles handlesMap (Maintainers maint) = + nonEmpty . mapMaybe (`Map.lookup` handlesMap) . Text.splitOn ", " $ fromMaybe "" maint + +-- | Run a process that produces JSON on stdout and and decode the JSON to a +-- data type. +-- +-- If the JSON-decoding fails, throw the JSON-decoding error. +readJSONProcess + :: FromJSON a + => FilePath -- ^ Filename of executable. + -> [String] -- ^ Arguments + -> String -- ^ stdin to pass to the process + -> String -- ^ String to prefix to JSON-decode error. + -> IO a +readJSONProcess exe args input err = do + output <- readProcess exe args input + let eitherDecodedOutput = eitherDecodeStrict' . encodeUtf8 . Text.pack $ output + case eitherDecodedOutput of + Left decodeErr -> error $ err <> decodeErr <> "\nRaw: '" <> take 1000 output <> "'" + Right decodedOutput -> pure decodedOutput + +-- BuildStates are sorted by subjective importance/concerningness +data BuildState + = Failed + | DependencyFailed + | OutputLimitExceeded + | Unknown (Maybe Int) + | TimedOut + | Canceled + | HydraFailure + | Unfinished + | Success + deriving stock (Show, Eq, Ord) + +icon :: BuildState -> Text +icon = \case + Failed -> ":x:" + DependencyFailed -> ":heavy_exclamation_mark:" + OutputLimitExceeded -> ":warning:" + Unknown x -> "unknown code " <> showT x + TimedOut -> ":hourglass::no_entry_sign:" + Canceled -> ":no_entry_sign:" + Unfinished -> ":hourglass_flowing_sand:" + HydraFailure -> ":construction:" + Success -> ":heavy_check_mark:" + +platformIcon :: Platform -> Text +platformIcon (Platform x) = case x of + "x86_64-linux" -> ":penguin:" + "aarch64-linux" -> ":iphone:" + "x86_64-darwin" -> ":apple:" + _ -> x + +data BuildResult = BuildResult {state :: BuildState, id :: Int} deriving (Show, Eq, Ord) +newtype Platform = Platform {platform :: Text} deriving (Show, Eq, Ord) +newtype Table row col a = Table (Map (row, col) a) +type StatusSummary = Map Text (Table Text Platform BuildResult, Set Text) + +instance (Ord row, Ord col, Semigroup a) => Semigroup (Table row col a) where + Table l <> Table r = Table (Map.unionWith (<>) l r) +instance (Ord row, Ord col, Semigroup a) => Monoid (Table row col a) where + mempty = Table Map.empty +instance Functor (Table row col) where + fmap f (Table a) = Table (fmap f a) +instance Foldable (Table row col) where + foldMap f (Table a) = foldMap f a + +buildSummary :: MaintainerMap -> Seq Build -> StatusSummary +buildSummary maintainerMap = foldl (Map.unionWith unionSummary) Map.empty . fmap toSummary + where + unionSummary (Table l, l') (Table r, r') = (Table $ Map.union l r, l' <> r') + toSummary Build{finished, buildstatus, job, id, system} = Map.singleton name (Table (Map.singleton (set, Platform system) (BuildResult state id)), maintainers) + where + state :: BuildState + state = case (finished, buildstatus) of + (0, _) -> Unfinished + (_, Just 0) -> Success + (_, Just 1) -> Failed + (_, Just 2) -> DependencyFailed + (_, Just 3) -> HydraFailure + (_, Just 4) -> Canceled + (_, Just 7) -> TimedOut + (_, Just 11) -> OutputLimitExceeded + (_, i) -> Unknown i + packageName = fromMaybe job (Text.stripSuffix ("." <> system) job) + splitted = nonEmpty $ Text.splitOn "." packageName + name = maybe packageName NonEmpty.last splitted + set = maybe "" (Text.intercalate "." . NonEmpty.init) splitted + maintainers = maybe mempty (Set.fromList . toList) (Map.lookup job maintainerMap) + +readBuildReports :: IO (Eval, UTCTime, Seq Build) +readBuildReports = do + file <- reportFileName + fromMaybe (error $ "Could not decode " <> file) <$> decodeFileStrict' file + +sep :: Text +sep = " | " +joinTable :: [Text] -> Text +joinTable t = sep <> Text.intercalate sep t <> sep + +type NumSummary = Table Platform BuildState Int + +printTable :: (Ord rows, Ord cols) => Text -> (rows -> Text) -> (cols -> Text) -> (entries -> Text) -> Table rows cols entries -> [Text] +printTable name showR showC showE (Table mapping) = joinTable <$> (name : map showC cols) : replicate (length cols + sepsInName + 1) "---" : map printRow rows + where + sepsInName = Text.count "|" name + printRow row = showR row : map (\col -> maybe "" showE (Map.lookup (row, col) mapping)) cols + rows = toList $ Set.fromList (fst <$> Map.keys mapping) + cols = toList $ Set.fromList (snd <$> Map.keys mapping) + +printJob :: Int -> Text -> (Table Text Platform BuildResult, Text) -> [Text] +printJob evalId name (Table mapping, maintainers) = + if length sets <= 1 + then map printSingleRow sets + else ["- [ ] " <> makeJobSearchLink "" name <> " " <> maintainers] <> map printRow sets + where + printRow set = " - " <> printState set <> " " <> makeJobSearchLink set (if Text.null set then "toplevel" else set) + printSingleRow set = "- [ ] " <> printState set <> " " <> makeJobSearchLink set (makePkgName set) <> " " <> maintainers + makePkgName set = (if Text.null set then "" else set <> ".") <> name + printState set = Text.intercalate " " $ map (\pf -> maybe "" (label pf) $ Map.lookup (set, pf) mapping) platforms + makeJobSearchLink set linkLabel= makeSearchLink evalId linkLabel (makePkgName set) + sets = toList $ Set.fromList (fst <$> Map.keys mapping) + platforms = toList $ Set.fromList (snd <$> Map.keys mapping) + label pf (BuildResult s i) = "[[" <> platformIcon pf <> icon s <> "]](https://hydra.nixos.org/build/" <> showT i <> ")" + +makeSearchLink :: Int -> Text -> Text -> Text +makeSearchLink evalId linkLabel query = "[" <> linkLabel <> "](" <> "https://hydra.nixos.org/eval/" <> showT evalId <> "?filter=" <> query <> ")" + +statusToNumSummary :: StatusSummary -> NumSummary +statusToNumSummary = fmap getSum . foldMap (fmap Sum . jobTotals) + +jobTotals :: (Table Text Platform BuildResult, a) -> Table Platform BuildState Int +jobTotals (Table mapping, _) = getSum <$> Table (Map.foldMapWithKey (\(_, platform) (BuildResult buildstate _) -> Map.singleton (platform, buildstate) (Sum 1)) mapping) + +details :: Text -> [Text] -> [Text] +details summary content = ["<details><summary>" <> summary <> " </summary>", ""] <> content <> ["</details>", ""] + +printBuildSummary :: Eval -> UTCTime -> StatusSummary -> Text +printBuildSummary + Eval{id, jobsetevalinputs = JobsetEvalInputs{nixpkgs = Nixpkgs{revision}}} + fetchTime + summary = + Text.unlines $ + headline <> totals + <> optionalList "#### Maintained packages with build failure" (maintainedList fails) + <> optionalList "#### Maintained packages with failed dependency" (maintainedList failedDeps) + <> optionalList "#### Maintained packages with unknown error" (maintainedList unknownErr) + <> optionalHideableList "#### Unmaintained packages with build failure" (unmaintainedList fails) + <> optionalHideableList "#### Unmaintained packages with failed dependency" (unmaintainedList failedDeps) + <> optionalHideableList "#### Unmaintained packages with unknown error" (unmaintainedList unknownErr) + <> footer + where + footer = ["*Report generated with [maintainers/scripts/haskell/hydra-report.hs](https://github.com/NixOS/nixpkgs/blob/haskell-updates/maintainers/scripts/haskell/hydra-report.sh)*"] + totals = + [ "#### Build summary" + , "" + ] + <> printTable "Platform" (\x -> makeSearchLink id (platform x <> " " <> platformIcon x) ("." <> platform x)) (\x -> showT x <> " " <> icon x) showT (statusToNumSummary summary) + headline = + [ "### [haskell-updates build report from hydra](https://hydra.nixos.org/jobset/nixpkgs/haskell-updates)" + , "*evaluation [" + <> showT id + <> "](https://hydra.nixos.org/eval/" + <> showT id + <> ") of nixpkgs commit [" + <> Text.take 7 revision + <> "](https://github.com/NixOS/nixpkgs/commits/" + <> revision + <> ") as of " + <> Text.pack (formatTime defaultTimeLocale "%Y-%m-%d %H:%M UTC" fetchTime) + <> "*" + ] + jobsByState predicate = Map.filter (predicate . foldl' min Success . fmap state . fst) summary + fails = jobsByState (== Failed) + failedDeps = jobsByState (== DependencyFailed) + unknownErr = jobsByState (\x -> x > DependencyFailed && x < TimedOut) + withMaintainer = Map.mapMaybe (\(x, m) -> (x,) <$> nonEmpty (Set.toList m)) + withoutMaintainer = Map.mapMaybe (\(x, m) -> if Set.null m then Just x else Nothing) + optionalList heading list = if null list then mempty else [heading] <> list + optionalHideableList heading list = if null list then mempty else [heading] <> details (showT (length list) <> " job(s)") list + maintainedList = showMaintainedBuild <=< Map.toList . withMaintainer + unmaintainedList = showBuild <=< Map.toList . withoutMaintainer + showBuild (name, table) = printJob id name (table, "") + showMaintainedBuild (name, (table, maintainers)) = printJob id name (table, Text.intercalate " " (fmap ("@" <>) (toList maintainers))) + +printMaintainerPing :: IO () +printMaintainerPing = do + maintainerMap <- getMaintainerMap + (eval, fetchTime, buildReport) <- readBuildReports + putStrLn (Text.unpack (printBuildSummary eval fetchTime (buildSummary maintainerMap buildReport))) + +printMarkBrokenList :: IO () +printMarkBrokenList = do + (_, _, buildReport) <- readBuildReports + forM_ buildReport \Build{buildstatus, job} -> + case (buildstatus, Text.splitOn "." job) of + (Just 1, ["haskellPackages", name, "x86_64-linux"]) -> putStrLn $ " - " <> Text.unpack name + _ -> pure () diff --git a/maintainers/scripts/haskell/mark-broken.sh b/maintainers/scripts/haskell/mark-broken.sh new file mode 100755 index 00000000000..71568ef6f20 --- /dev/null +++ b/maintainers/scripts/haskell/mark-broken.sh @@ -0,0 +1,46 @@ +#! /usr/bin/env nix-shell +#! nix-shell -i bash -p coreutils git -I nixpkgs=. + +# This script uses the data pulled with +# maintainers/scripts/haskell/hydra-report.hs get-report to produce a list of +# failing builds that get written to the hackage2nix config. Then +# hackage-packages.nix gets regenerated and transitive-broken packages get +# marked as dont-distribute in the config as well. +# This should disable builds for most failing jobs in the haskell-updates jobset. + +set -euo pipefail + +broken_config="pkgs/development/haskell-modules/configuration-hackage2nix/broken.yaml" + +tmpfile=$(mktemp) +trap "rm ${tmpfile}" 0 + +echo "Remember that you need to manually run 'maintainers/scripts/haskell/hydra-report.hs get-report' sometime before running this script." +echo "Generating a list of broken builds and displaying for manual confirmation ..." +maintainers/scripts/haskell/hydra-report.hs mark-broken-list | sort -i > "$tmpfile" + +$EDITOR "$tmpfile" + +tail -n +3 "$broken_config" >> "$tmpfile" + +cat > "$broken_config" << EOF +broken-packages: + # These packages don't compile. +EOF + +# clear environment here to avoid things like allowing broken builds in +sort -iu "$tmpfile" >> "$broken_config" +env -i maintainers/scripts/haskell/regenerate-hackage-packages.sh +env -i maintainers/scripts/haskell/regenerate-transitive-broken-packages.sh +env -i maintainers/scripts/haskell/regenerate-hackage-packages.sh + +if [[ "${1:-}" == "--do-commit" ]]; then +git add $broken_config +git add pkgs/development/haskell-modules/configuration-hackage2nix/transitive-broken.yaml +git add pkgs/development/haskell-modules/hackage-packages.nix +git commit -F - << EOF +haskellPackages: mark builds failing on hydra as broken + +This commit has been generated by maintainers/scripts/haskell/mark-broken.sh +EOF +fi diff --git a/maintainers/scripts/haskell/regenerate-hackage-packages.sh b/maintainers/scripts/haskell/regenerate-hackage-packages.sh new file mode 100755 index 00000000000..285f6ed7cf9 --- /dev/null +++ b/maintainers/scripts/haskell/regenerate-hackage-packages.sh @@ -0,0 +1,46 @@ +#! /usr/bin/env nix-shell +#! nix-shell -i bash -p coreutils haskellPackages.cabal2nix-unstable git nix -I nixpkgs=. + +# This script is used to regenerate nixpkgs' Haskell package set, using the +# tool hackage2nix from the nixos/cabal2nix repo. hackage2nix looks at the +# config files in pkgs/development/haskell-modules/configuration-hackage2nix +# and generates a Nix expression for package version specified there, using the +# Cabal files from the Hackage database (available under all-cabal-hashes) and +# its companion tool cabal2nix. +# +# Related scripts are update-hackage.sh, for updating the snapshot of the +# Hackage database used by hackage2nix, and update-cabal2nix-unstable.sh, +# for updating the version of hackage2nix used to perform this task. + +set -euo pipefail + +HACKAGE2NIX="${HACKAGE2NIX:-hackage2nix}" + +# To prevent hackage2nix fails because of encoding. +# See: https://github.com/NixOS/nixpkgs/pull/122023 +export LC_ALL=C.UTF-8 + +extraction_derivation='with import ./. {}; runCommand "unpacked-cabal-hashes" { } "tar xf ${all-cabal-hashes} --strip-components=1 --one-top-level=$out"' +unpacked_hackage="$(nix-build -E "$extraction_derivation" --no-out-link)" +config_dir=pkgs/development/haskell-modules/configuration-hackage2nix + +echo "Starting hackage2nix to regenerate pkgs/development/haskell-modules/hackage-packages.nix ..." +"$HACKAGE2NIX" \ + --hackage "$unpacked_hackage" \ + --preferred-versions <(for n in "$unpacked_hackage"/*/preferred-versions; do cat "$n"; echo; done) \ + --nixpkgs "$PWD" \ + --config "$config_dir/main.yaml" \ + --config "$config_dir/stackage.yaml" \ + --config "$config_dir/broken.yaml" \ + --config "$config_dir/transitive-broken.yaml" + +if [[ "${1:-}" == "--do-commit" ]]; then +git add pkgs/development/haskell-modules/hackage-packages.nix +git commit -F - << EOF +haskellPackages: regenerate package set based on current config + +This commit has been generated by maintainers/scripts/haskell/regenerate-hackage-packages.sh +EOF +fi + +echo "Regeneration of hackage-packages.nix finished." diff --git a/maintainers/scripts/haskell/regenerate-transitive-broken-packages.sh b/maintainers/scripts/haskell/regenerate-transitive-broken-packages.sh new file mode 100755 index 00000000000..94104e00edb --- /dev/null +++ b/maintainers/scripts/haskell/regenerate-transitive-broken-packages.sh @@ -0,0 +1,15 @@ +#! /usr/bin/env nix-shell +#! nix-shell -i bash -p coreutils nix gnused -I nixpkgs=. + +config_file=pkgs/development/haskell-modules/configuration-hackage2nix/transitive-broken.yaml + +cat > $config_file << EOF +# This file is automatically generated by +# maintainers/scripts/haskell/regenerate-transitive-broken-packages.sh +# It is supposed to list all haskellPackages that cannot evaluate because they +# depend on a dependency marked as broken. +dont-distribute-packages: +EOF + +echo "Regenerating list of transitive broken packages ..." +echo -e $(nix-instantiate --eval --strict maintainers/scripts/haskell/transitive-broken-packages.nix) | sed 's/\"//' | LC_ALL=C.UTF-8 sort -i >> $config_file diff --git a/maintainers/scripts/haskell/transitive-broken-packages.nix b/maintainers/scripts/haskell/transitive-broken-packages.nix new file mode 100644 index 00000000000..d4ddaa95765 --- /dev/null +++ b/maintainers/scripts/haskell/transitive-broken-packages.nix @@ -0,0 +1,16 @@ +let + nixpkgs = import ../../..; + inherit (nixpkgs {}) pkgs lib; + getEvaluating = x: + builtins.attrNames ( + lib.filterAttrs ( + _: v: (builtins.tryEval (v.outPath or null)).success && lib.isDerivation v && !v.meta.broken + ) x + ); + brokenDeps = lib.subtractLists + (getEvaluating pkgs.haskellPackages) + (getEvaluating (nixpkgs { config.allowBroken = true; }).haskellPackages); +in +'' + ${lib.concatMapStringsSep "\n" (x: " - ${x}") brokenDeps} +'' diff --git a/maintainers/scripts/haskell/update-cabal2nix-unstable.sh b/maintainers/scripts/haskell/update-cabal2nix-unstable.sh new file mode 100755 index 00000000000..41583704560 --- /dev/null +++ b/maintainers/scripts/haskell/update-cabal2nix-unstable.sh @@ -0,0 +1,17 @@ +#! /usr/bin/env nix-shell +#! nix-shell -i bash -p coreutils curl jq gnused haskellPackages.cabal2nix-unstable -I nixpkgs=. + +# Updates cabal2nix-unstable to the latest master of the nixos/cabal2nix repository. +# See regenerate-hackage-packages.sh for details on the purpose of this script. + +set -euo pipefail + +# fetch current master HEAD from Github +head_info="$(curl -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/NixOS/cabal2nix/branches/master)" +# extract commit hash +commit="$(jq -r .commit.sha <<< "$head_info")" +# extract commit timestamp and convert to date +date="$(date "--date=$(jq -r .commit.commit.committer.date <<< "$head_info")" +%F)" +# generate nix expression from cabal file, replacing the version with the commit date +echo '# This file defines cabal2nix-unstable, used by maintainers/scripts/haskell/regenerate-hackage-packages.sh.' > pkgs/development/haskell-modules/cabal2nix-unstable.nix +cabal2nix "https://github.com/NixOS/cabal2nix/archive/$commit.tar.gz" | sed -e 's/version = ".*"/version = "'"unstable-$date"'"/' >> pkgs/development/haskell-modules/cabal2nix-unstable.nix diff --git a/maintainers/scripts/haskell/update-hackage.sh b/maintainers/scripts/haskell/update-hackage.sh new file mode 100755 index 00000000000..a7cfecbbb0f --- /dev/null +++ b/maintainers/scripts/haskell/update-hackage.sh @@ -0,0 +1,35 @@ +#! /usr/bin/env nix-shell +#! nix-shell -i bash -p nix curl jq nix-prefetch-github git gnused -I nixpkgs=. + +# See regenerate-hackage-packages.sh for details on the purpose of this script. + +set -euo pipefail + +pin_file=pkgs/data/misc/hackage/pin.json +current_commit="$(jq -r .commit $pin_file)" +old_date="$(jq -r .msg $pin_file | sed 's/Update from Hackage at //')" +git_info="$(curl -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/commercialhaskell/all-cabal-hashes/branches/hackage)" +head_commit="$(echo "$git_info" | jq -r .commit.sha)" +commit_msg="$(echo "$git_info" | jq -r .commit.commit.message)" +new_date="$(echo "$commit_msg" | sed 's/Update from Hackage at //')" + +if [ "$current_commit" != "$head_commit" ]; then + url="https://github.com/commercialhaskell/all-cabal-hashes/archive/$head_commit.tar.gz" + hash="$(nix-prefetch-url "$url")" + jq -n \ + --arg commit "$head_commit" \ + --arg hash "$hash" \ + --arg url "$url" \ + --arg commit_msg "$commit_msg" \ + '{commit: $commit, url: $url, sha256: $hash, msg: $commit_msg}' \ + > $pin_file +fi + +if [[ "${1:-}" == "--do-commit" ]]; then +git add pkgs/data/misc/hackage/pin.json +git commit -F - << EOF +all-cabal-hashes: $old_date -> $new_date + +This commit has been generated by maintainers/scripts/haskell/update-hackage.sh +EOF +fi diff --git a/maintainers/scripts/haskell/update-stackage.sh b/maintainers/scripts/haskell/update-stackage.sh new file mode 100755 index 00000000000..ecf38dc4b90 --- /dev/null +++ b/maintainers/scripts/haskell/update-stackage.sh @@ -0,0 +1,57 @@ +#! /usr/bin/env nix-shell +#! nix-shell -i bash -p nix curl jq nix-prefetch-github git gnused gnugrep -I nixpkgs=. + +set -eu -o pipefail + +tmpfile=$(mktemp "update-stackage.XXXXXXX") +# shellcheck disable=SC2064 + +stackage_config="pkgs/development/haskell-modules/configuration-hackage2nix/stackage.yaml" + +trap "rm ${tmpfile} ${tmpfile}.new" 0 +touch "$tmpfile" "$tmpfile.new" # Creating files here so that trap creates no errors. + +curl -L -s "https://stackage.org/lts/cabal.config" >"$tmpfile" +old_version=$(grep "# Stackage" $stackage_config | sed -E 's/.*([0-9]{2}\.[0-9]+)/\1/') +version=$(sed -rn "s/^--.*http:..(www.)?stackage.org.snapshot.lts-//p" "$tmpfile") + +if [[ "$old_version" == "$version" ]]; then + echo "No new stackage version" + exit 0 # Nothing to do +fi + +echo "Updating Stackage LTS from $old_version to $version." + +# Create a simple yaml version of the file. +sed -r \ + -e '/^--/d' \ + -e 's|^constraints:||' \ + -e 's|^ +| - |' \ + -e 's|,$||' \ + -e '/installed$/d' \ + -e '/^$/d' \ + < "${tmpfile}" | sort --ignore-case >"${tmpfile}.new" + +cat > $stackage_config << EOF +# Stackage LTS $version +# This file is auto-generated by +# maintainers/scripts/haskell/update-stackage.sh +default-package-overrides: +EOF + +# Drop restrictions on some tools where we always want the latest version. +sed -r \ + -e '/ cabal2nix /d' \ + -e '/ distribution-nixpkgs /d' \ + -e '/ jailbreak-cabal /d' \ + -e '/ language-nix /d' \ + < "${tmpfile}.new" >> $stackage_config + +if [[ "${1:-}" == "--do-commit" ]]; then +git add $stackage_config +git commit -F - << EOF +haskellPackages: stackage-lts $old_version -> $version + +This commit has been generated by maintainers/scripts/haskell/update-stackage.sh +EOF +fi diff --git a/maintainers/scripts/hydra-eval-failures.py b/maintainers/scripts/hydra-eval-failures.py index 0f738c5427b..b7518b12857 100755 --- a/maintainers/scripts/hydra-eval-failures.py +++ b/maintainers/scripts/hydra-eval-failures.py @@ -1,5 +1,5 @@ #!/usr/bin/env nix-shell -#!nix-shell -i python3 -p 'python3.withPackages(ps: with ps; [ requests pyquery click ])' +#!nix-shell -i python3 -p "python3.withPackages(ps: with ps; [ requests pyquery click ])" # To use, just execute this script with --help to display help. diff --git a/maintainers/scripts/luarocks-packages.csv b/maintainers/scripts/luarocks-packages.csv index fb90e62769f..a387430245a 100644 --- a/maintainers/scripts/luarocks-packages.csv +++ b/maintainers/scripts/luarocks-packages.csv @@ -6,7 +6,7 @@ basexx,,,,, binaryheap,,,,,vcunat bit32,,,,lua5_1,lblasc busted,,,,, -cassowary,,,,,marsam +cassowary,,,,,marsam alerque cjson,lua-cjson,,,, compat53,,,,,vcunat cosmo,,,,,marsam @@ -38,6 +38,7 @@ lua-messagepack,,,,, lua-resty-http,,,,, lua-resty-jwt,,,,, lua-resty-openidc,,,,, +lua-resty-openssl,,,,, lua-resty-session,,,,, lua-term,,,,, lua-toml,,,,, diff --git a/maintainers/scripts/nix-generate-from-cpan.nix b/maintainers/scripts/nix-generate-from-cpan.nix index 5c4cf0f6c55..fecca7f0c73 100644 --- a/maintainers/scripts/nix-generate-from-cpan.nix +++ b/maintainers/scripts/nix-generate-from-cpan.nix @@ -1,4 +1,4 @@ -{ stdenv, makeWrapper, perl, perlPackages }: +{ stdenv, lib, makeWrapper, perl, perlPackages }: stdenv.mkDerivation { name = "nix-generate-from-cpan-3"; @@ -18,8 +18,8 @@ stdenv.mkDerivation { ''; meta = { - maintainers = with stdenv.lib.maintainers; [ eelco rycee ]; + maintainers = with lib.maintainers; [ eelco ]; description = "Utility to generate a Nix expression for a Perl package from CPAN"; - platforms = stdenv.lib.platforms.unix; + platforms = lib.platforms.unix; }; } diff --git a/maintainers/scripts/nix-generate-from-cpan.pl b/maintainers/scripts/nix-generate-from-cpan.pl index f02af4ea669..6494acb50da 100755 --- a/maintainers/scripts/nix-generate-from-cpan.pl +++ b/maintainers/scripts/nix-generate-from-cpan.pl @@ -309,7 +309,7 @@ sub render_license { # "GPL v2" or to "GPL v2 or later". my $amb = 0; - # Whether the license is available inside `stdenv.lib.licenses`. + # Whether the license is available inside `lib.licenses`. my $in_set = 1; my $nix_license = $LICENSE_MAP{$cpan_license}; @@ -331,7 +331,7 @@ sub render_license { # Avoid defining the license line. } elsif ($in_set) { - my $lic = 'stdenv.lib.licenses'; + my $lic = 'lib.licenses'; if ( @$licenses == 1 ) { $license_line = "$lic.$licenses->[0]"; } @@ -449,7 +449,7 @@ print <<EOF; meta = { EOF print <<EOF if defined $homepage; - homepage = $homepage; + homepage = "$homepage"; EOF print <<EOF if defined $description && $description ne "Unknown"; description = "$description"; diff --git a/maintainers/scripts/nixpkgs-lint.nix b/maintainers/scripts/nixpkgs-lint.nix index 6d99c94bf33..873905373af 100644 --- a/maintainers/scripts/nixpkgs-lint.nix +++ b/maintainers/scripts/nixpkgs-lint.nix @@ -1,9 +1,10 @@ -{ stdenv, makeWrapper, perl, perlPackages }: +{ stdenv, lib, makeWrapper, perl, perlPackages }: stdenv.mkDerivation { name = "nixpkgs-lint-1"; - buildInputs = [ makeWrapper perl perlPackages.XMLSimple ]; + nativeBuildInputs = [ makeWrapper ]; + buildInputs = [ perl perlPackages.XMLSimple ]; dontUnpack = true; buildPhase = "true"; @@ -15,9 +16,9 @@ stdenv.mkDerivation { wrapProgram $out/bin/nixpkgs-lint --set PERL5LIB $PERL5LIB ''; - meta = { - maintainers = [ stdenv.lib.maintainers.eelco ]; + meta = with lib; { + maintainers = [ maintainers.eelco ]; description = "A utility for Nixpkgs contributors to check Nixpkgs for common errors"; - platforms = stdenv.lib.platforms.unix; + platforms = platforms.unix; }; } diff --git a/maintainers/scripts/nixpkgs-lint.pl b/maintainers/scripts/nixpkgs-lint.pl index 638d1b2aaa1..43fb3941361 100755 --- a/maintainers/scripts/nixpkgs-lint.pl +++ b/maintainers/scripts/nixpkgs-lint.pl @@ -35,7 +35,7 @@ GetOptions("package|p=s" => \$filter, ) or exit 1; # Evaluate Nixpkgs into an XML representation. -my $xml = `nix-env -f '$path' -qa '$filter' --xml --meta --drv-path`; +my $xml = `nix-env -f '$path' --arg overlays '[]' -qa '$filter' --xml --meta --drv-path`; die "$0: evaluation of ‘$path’ failed\n" if $? != 0; my $info = XMLin($xml, KeyAttr => { 'item' => '+attrPath', 'meta' => 'name' }, ForceArray => 1, SuppressEmpty => '' ) or die "cannot parse XML output"; diff --git a/maintainers/scripts/pluginupdate.py b/maintainers/scripts/pluginupdate.py new file mode 100644 index 00000000000..91c5214d153 --- /dev/null +++ b/maintainers/scripts/pluginupdate.py @@ -0,0 +1,555 @@ +# Used by pkgs/misc/vim-plugins/update.py and pkgs/applications/editors/kakoune/plugins/update.py + +# format: +# $ nix run nixpkgs.python3Packages.black -c black update.py +# type-check: +# $ nix run nixpkgs.python3Packages.mypy -c mypy update.py +# linted: +# $ nix run nixpkgs.python3Packages.flake8 -c flake8 --ignore E501,E265 update.py + +import argparse +import functools +import http +import json +import os +import subprocess +import logging +import sys +import time +import traceback +import urllib.error +import urllib.parse +import urllib.request +import xml.etree.ElementTree as ET +from datetime import datetime +from functools import wraps +from multiprocessing.dummy import Pool +from pathlib import Path +from typing import Dict, List, Optional, Tuple, Union, Any, Callable +from urllib.parse import urljoin, urlparse +from tempfile import NamedTemporaryFile + +import git + +ATOM_ENTRY = "{http://www.w3.org/2005/Atom}entry" # " vim gets confused here +ATOM_LINK = "{http://www.w3.org/2005/Atom}link" # " +ATOM_UPDATED = "{http://www.w3.org/2005/Atom}updated" # " + +LOG_LEVELS = { + logging.getLevelName(level): level for level in [ + logging.DEBUG, logging.INFO, logging.WARN, logging.ERROR ] +} + +log = logging.getLogger() +log.addHandler(logging.StreamHandler()) + + +def retry(ExceptionToCheck: Any, tries: int = 4, delay: float = 3, backoff: float = 2): + """Retry calling the decorated function using an exponential backoff. + http://www.saltycrane.com/blog/2009/11/trying-out-retry-decorator-python/ + original from: http://wiki.python.org/moin/PythonDecoratorLibrary#Retry + (BSD licensed) + :param ExceptionToCheck: the exception on which to retry + :param tries: number of times to try (not retry) before giving up + :param delay: initial delay between retries in seconds + :param backoff: backoff multiplier e.g. value of 2 will double the delay + each retry + """ + + def deco_retry(f: Callable) -> Callable: + @wraps(f) + def f_retry(*args: Any, **kwargs: Any) -> Any: + mtries, mdelay = tries, delay + while mtries > 1: + try: + return f(*args, **kwargs) + except ExceptionToCheck as e: + print(f"{str(e)}, Retrying in {mdelay} seconds...") + time.sleep(mdelay) + mtries -= 1 + mdelay *= backoff + return f(*args, **kwargs) + + return f_retry # true decorator + + return deco_retry + + +def make_request(url: str) -> urllib.request.Request: + token = os.getenv("GITHUB_API_TOKEN") + headers = {} + if token is not None: + headers["Authorization"] = f"token {token}" + return urllib.request.Request(url, headers=headers) + + +class Repo: + def __init__( + self, owner: str, name: str, branch: str, alias: Optional[str] + ) -> None: + self.owner = owner + self.name = name + self.branch = branch + self.alias = alias + self.redirect: Dict[str, str] = {} + + def url(self, path: str) -> str: + return urljoin(f"https://github.com/{self.owner}/{self.name}/", path) + + def __repr__(self) -> str: + return f"Repo({self.owner}, {self.name})" + + @retry(urllib.error.URLError, tries=4, delay=3, backoff=2) + def has_submodules(self) -> bool: + try: + req = make_request(self.url(f"blob/{self.branch}/.gitmodules")) + urllib.request.urlopen(req, timeout=10).close() + except urllib.error.HTTPError as e: + if e.code == 404: + return False + else: + raise + return True + + @retry(urllib.error.URLError, tries=4, delay=3, backoff=2) + def latest_commit(self) -> Tuple[str, datetime]: + commit_url = self.url(f"commits/{self.branch}.atom") + commit_req = make_request(commit_url) + with urllib.request.urlopen(commit_req, timeout=10) as req: + self.check_for_redirect(commit_url, req) + xml = req.read() + root = ET.fromstring(xml) + latest_entry = root.find(ATOM_ENTRY) + assert latest_entry is not None, f"No commits found in repository {self}" + commit_link = latest_entry.find(ATOM_LINK) + assert commit_link is not None, f"No link tag found feed entry {xml}" + url = urlparse(commit_link.get("href")) + updated_tag = latest_entry.find(ATOM_UPDATED) + assert ( + updated_tag is not None and updated_tag.text is not None + ), f"No updated tag found feed entry {xml}" + updated = datetime.strptime(updated_tag.text, "%Y-%m-%dT%H:%M:%SZ") + return Path(str(url.path)).name, updated + + def check_for_redirect(self, url: str, req: http.client.HTTPResponse): + response_url = req.geturl() + if url != response_url: + new_owner, new_name = ( + urllib.parse.urlsplit(response_url).path.strip("/").split("/")[:2] + ) + end_line = "\n" if self.alias is None else f" as {self.alias}\n" + plugin_line = "{owner}/{name}" + end_line + + old_plugin = plugin_line.format(owner=self.owner, name=self.name) + new_plugin = plugin_line.format(owner=new_owner, name=new_name) + self.redirect[old_plugin] = new_plugin + + def prefetch_git(self, ref: str) -> str: + data = subprocess.check_output( + ["nix-prefetch-git", "--fetch-submodules", self.url(""), ref] + ) + return json.loads(data)["sha256"] + + def prefetch_github(self, ref: str) -> str: + data = subprocess.check_output( + ["nix-prefetch-url", "--unpack", self.url(f"archive/{ref}.tar.gz")] + ) + return data.strip().decode("utf-8") + + +class Plugin: + def __init__( + self, + name: str, + commit: str, + has_submodules: bool, + sha256: str, + date: Optional[datetime] = None, + ) -> None: + self.name = name + self.commit = commit + self.has_submodules = has_submodules + self.sha256 = sha256 + self.date = date + + @property + def normalized_name(self) -> str: + return self.name.replace(".", "-") + + @property + def version(self) -> str: + assert self.date is not None + return self.date.strftime("%Y-%m-%d") + + def as_json(self) -> Dict[str, str]: + copy = self.__dict__.copy() + del copy["date"] + return copy + + +class Editor: + """The configuration of the update script.""" + + def __init__( + self, + name: str, + root: Path, + get_plugins: str, + generate_nix: Callable[[List[Tuple[str, str, Plugin]], str], None], + default_in: Optional[Path] = None, + default_out: Optional[Path] = None, + deprecated: Optional[Path] = None, + cache_file: Optional[str] = None, + ): + self.name = name + self.root = root + self.get_plugins = get_plugins + self.generate_nix = generate_nix + self.default_in = default_in or root.joinpath(f"{name}-plugin-names") + self.default_out = default_out or root.joinpath("generated.nix") + self.deprecated = deprecated or root.joinpath("deprecated.json") + self.cache_file = cache_file or f"{name}-plugin-cache.json" + + +class CleanEnvironment(object): + def __enter__(self) -> None: + self.old_environ = os.environ.copy() + local_pkgs = str(Path(__file__).parent.parent.parent) + os.environ["NIX_PATH"] = f"localpkgs={local_pkgs}" + self.empty_config = NamedTemporaryFile() + self.empty_config.write(b"{}") + self.empty_config.flush() + os.environ["NIXPKGS_CONFIG"] = self.empty_config.name + + def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None: + os.environ.update(self.old_environ) + self.empty_config.close() + + +def get_current_plugins(editor: Editor) -> List[Plugin]: + with CleanEnvironment(): + out = subprocess.check_output(["nix", "eval", "--json", editor.get_plugins]) + data = json.loads(out) + plugins = [] + for name, attr in data.items(): + p = Plugin(name, attr["rev"], attr["submodules"], attr["sha256"]) + plugins.append(p) + return plugins + + +def prefetch_plugin( + user: str, + repo_name: str, + branch: str, + alias: Optional[str], + cache: "Optional[Cache]" = None, +) -> Tuple[Plugin, Dict[str, str]]: + log.info("Prefetching plugin %s", repo_name) + repo = Repo(user, repo_name, branch, alias) + commit, date = repo.latest_commit() + has_submodules = repo.has_submodules() + cached_plugin = cache[commit] if cache else None + if cached_plugin is not None: + cached_plugin.name = alias or repo_name + cached_plugin.date = date + return cached_plugin, repo.redirect + + print(f"prefetch {user}/{repo_name}") + if has_submodules: + sha256 = repo.prefetch_git(commit) + else: + sha256 = repo.prefetch_github(commit) + + return ( + Plugin(alias or repo_name, commit, has_submodules, sha256, date=date), + repo.redirect, + ) + + +def fetch_plugin_from_pluginline(plugin_line: str) -> Plugin: + plugin, _ = prefetch_plugin(*parse_plugin_line(plugin_line)) + return plugin + + +def print_download_error(plugin: str, ex: Exception): + print(f"{plugin}: {ex}", file=sys.stderr) + ex_traceback = ex.__traceback__ + tb_lines = [ + line.rstrip("\n") + for line in traceback.format_exception(ex.__class__, ex, ex_traceback) + ] + print("\n".join(tb_lines)) + + +def check_results( + results: List[Tuple[str, str, Union[Exception, Plugin], Dict[str, str]]] +) -> Tuple[List[Tuple[str, str, Plugin]], Dict[str, str]]: + failures: List[Tuple[str, Exception]] = [] + plugins = [] + redirects: Dict[str, str] = {} + for (owner, name, result, redirect) in results: + if isinstance(result, Exception): + failures.append((name, result)) + else: + plugins.append((owner, name, result)) + redirects.update(redirect) + + print(f"{len(results) - len(failures)} plugins were checked", end="") + if len(failures) == 0: + print() + return plugins, redirects + else: + print(f", {len(failures)} plugin(s) could not be downloaded:\n") + + for (plugin, exception) in failures: + print_download_error(plugin, exception) + + sys.exit(1) + + +def parse_plugin_line(line: str) -> Tuple[str, str, str, Optional[str]]: + branch = "master" + alias = None + name, repo = line.split("/") + if " as " in repo: + repo, alias = repo.split(" as ") + alias = alias.strip() + if "@" in repo: + repo, branch = repo.split("@") + + return (name.strip(), repo.strip(), branch.strip(), alias) + + +def load_plugin_spec(plugin_file: str) -> List[Tuple[str, str, str, Optional[str]]]: + plugins = [] + with open(plugin_file) as f: + for line in f: + plugin = parse_plugin_line(line) + if not plugin[0]: + msg = f"Invalid repository {line}, must be in the format owner/repo[ as alias]" + print(msg, file=sys.stderr) + sys.exit(1) + plugins.append(plugin) + return plugins + + +def get_cache_path(cache_file_name: str) -> Optional[Path]: + xdg_cache = os.environ.get("XDG_CACHE_HOME", None) + if xdg_cache is None: + home = os.environ.get("HOME", None) + if home is None: + return None + xdg_cache = str(Path(home, ".cache")) + + return Path(xdg_cache, cache_file_name) + + +class Cache: + def __init__(self, initial_plugins: List[Plugin], cache_file_name: str) -> None: + self.cache_file = get_cache_path(cache_file_name) + + downloads = {} + for plugin in initial_plugins: + downloads[plugin.commit] = plugin + downloads.update(self.load()) + self.downloads = downloads + + def load(self) -> Dict[str, Plugin]: + if self.cache_file is None or not self.cache_file.exists(): + return {} + + downloads: Dict[str, Plugin] = {} + with open(self.cache_file) as f: + data = json.load(f) + for attr in data.values(): + p = Plugin( + attr["name"], attr["commit"], attr["has_submodules"], attr["sha256"] + ) + downloads[attr["commit"]] = p + return downloads + + def store(self) -> None: + if self.cache_file is None: + return + + os.makedirs(self.cache_file.parent, exist_ok=True) + with open(self.cache_file, "w+") as f: + data = {} + for name, attr in self.downloads.items(): + data[name] = attr.as_json() + json.dump(data, f, indent=4, sort_keys=True) + + def __getitem__(self, key: str) -> Optional[Plugin]: + return self.downloads.get(key, None) + + def __setitem__(self, key: str, value: Plugin) -> None: + self.downloads[key] = value + + +def prefetch( + args: Tuple[str, str, str, Optional[str]], cache: Cache +) -> Tuple[str, str, Union[Exception, Plugin], dict]: + assert len(args) == 4 + owner, repo, branch, alias = args + try: + plugin, redirect = prefetch_plugin(owner, repo, branch, alias, cache) + cache[plugin.commit] = plugin + return (owner, repo, plugin, redirect) + except Exception as e: + return (owner, repo, e, {}) + + +def rewrite_input( + input_file: Path, + deprecated: Path, + redirects: Dict[str, str] = None, + append: Tuple = (), +): + with open(input_file, "r") as f: + lines = f.readlines() + + lines.extend(append) + + if redirects: + lines = [redirects.get(line, line) for line in lines] + + cur_date_iso = datetime.now().strftime("%Y-%m-%d") + with open(deprecated, "r") as f: + deprecations = json.load(f) + for old, new in redirects.items(): + old_plugin = fetch_plugin_from_pluginline(old) + new_plugin = fetch_plugin_from_pluginline(new) + if old_plugin.normalized_name != new_plugin.normalized_name: + deprecations[old_plugin.normalized_name] = { + "new": new_plugin.normalized_name, + "date": cur_date_iso, + } + with open(deprecated, "w") as f: + json.dump(deprecations, f, indent=4, sort_keys=True) + f.write("\n") + + lines = sorted(lines, key=str.casefold) + + with open(input_file, "w") as f: + f.writelines(lines) + + +def parse_args(editor: Editor): + parser = argparse.ArgumentParser( + description=( + f"Updates nix derivations for {editor.name} plugins" + f"By default from {editor.default_in} to {editor.default_out}" + ) + ) + parser.add_argument( + "--add", + dest="add_plugins", + default=[], + action="append", + help=f"Plugin to add to {editor.name}Plugins from Github in the form owner/repo", + ) + parser.add_argument( + "--input-names", + "-i", + dest="input_file", + default=editor.default_in, + help="A list of plugins in the form owner/repo", + ) + parser.add_argument( + "--out", + "-o", + dest="outfile", + default=editor.default_out, + help="Filename to save generated nix code", + ) + parser.add_argument( + "--proc", + "-p", + dest="proc", + type=int, + default=30, + help="Number of concurrent processes to spawn.", + ) + parser.add_argument( + "--no-commit", "-n", action="store_true", default=False, + help="Whether to autocommit changes" + ) + parser.add_argument( + "--debug", "-d", choices=LOG_LEVELS.keys(), + default=logging.getLevelName(logging.WARN), + help="Adjust log level" + ) + return parser.parse_args() + + +def commit(repo: git.Repo, message: str, files: List[Path]) -> None: + repo.index.add([str(f.resolve()) for f in files]) + + if repo.index.diff("HEAD"): + print(f'committing to nixpkgs "{message}"') + repo.index.commit(message) + else: + print("no changes in working tree to commit") + + +def get_update(input_file: str, outfile: str, proc: int, editor: Editor): + cache: Cache = Cache(get_current_plugins(editor), editor.cache_file) + _prefetch = functools.partial(prefetch, cache=cache) + + def update() -> dict: + plugin_names = load_plugin_spec(input_file) + + try: + pool = Pool(processes=proc) + results = pool.map(_prefetch, plugin_names) + finally: + cache.store() + + plugins, redirects = check_results(results) + + editor.generate_nix(plugins, outfile) + + return redirects + + return update + + +def update_plugins(editor: Editor): + """The main entry function of this module. All input arguments are grouped in the `Editor`.""" + + args = parse_args(editor) + log.setLevel(LOG_LEVELS[args.debug]) + + log.info("Start updating plugins") + nixpkgs_repo = git.Repo(editor.root, search_parent_directories=True) + update = get_update(args.input_file, args.outfile, args.proc, editor) + + redirects = update() + rewrite_input(args.input_file, editor.deprecated, redirects) + + autocommit = not args.no_commit + + if autocommit: + commit(nixpkgs_repo, f"{editor.name}Plugins: update", [args.outfile]) + + if redirects: + update() + if autocommit: + commit( + nixpkgs_repo, + f"{editor.name}Plugins: resolve github repository redirects", + [args.outfile, args.input_file, editor.deprecated], + ) + + for plugin_line in args.add_plugins: + rewrite_input(args.input_file, editor.deprecated, append=(plugin_line + "\n",)) + update() + plugin = fetch_plugin_from_pluginline(plugin_line) + if autocommit: + commit( + nixpkgs_repo, + "{editor}Plugins.{name}: init at {version}".format( + editor=editor.name, name=plugin.normalized_name, version=plugin.version + ), + [args.outfile, args.input_file], + ) diff --git a/maintainers/scripts/update-luarocks-packages b/maintainers/scripts/update-luarocks-packages index 5c42080745e..da4d224bd33 100755 --- a/maintainers/scripts/update-luarocks-packages +++ b/maintainers/scripts/update-luarocks-packages @@ -66,7 +66,7 @@ nixpkgs$ ${0} ${GENERATED_NIXFILE} These packages are manually refined in lua-overrides.nix */ -{ self, stdenv, fetchurl, fetchgit, pkgs, ... } @ args: +{ self, stdenv, lib, fetchurl, fetchgit, pkgs, ... } @ args: self: super: with self; { diff --git a/maintainers/scripts/update-luarocks-shell.nix b/maintainers/scripts/update-luarocks-shell.nix index 23a940b3691..d3f342b07a9 100644 --- a/maintainers/scripts/update-luarocks-shell.nix +++ b/maintainers/scripts/update-luarocks-shell.nix @@ -2,8 +2,11 @@ }: with nixpkgs; mkShell { - buildInputs = [ - bash luarocks-nix nix-prefetch-scripts parallel + packages = [ + bash + luarocks-nix + nix-prefetch-scripts + parallel ]; LUAROCKS_NIXPKGS_PATH = toString nixpkgs.path; } diff --git a/maintainers/scripts/update-redirected-urls.sh b/maintainers/scripts/update-redirected-urls.sh new file mode 100755 index 00000000000..5ffa9aca5f6 --- /dev/null +++ b/maintainers/scripts/update-redirected-urls.sh @@ -0,0 +1,12 @@ +#! /usr/bin/env nix-shell +#! nix-shell -p bash curl ripgrep jq -i bash + +set -euxo pipefail + +# Possibly also add non-https redirect, but there were non of those when I first +# made this script to test that. Feel free to add it when it is relevant. +curl https://repology.org/api/v1/repository/nix_unstable/problems \ + | jq -r '.[] | select(.type == "homepage_permanent_https_redirect") | .data | "s@\(.url)@\(.target)@"' \ + | sort | uniq | tee script.sed +find -name '*.nix' | xargs -P4 -- sed -f script.sed -i +rm script.sed diff --git a/maintainers/scripts/update.nix b/maintainers/scripts/update.nix index 9568c6cbbcc..7435cf64425 100755 --- a/maintainers/scripts/update.nix +++ b/maintainers/scripts/update.nix @@ -1,9 +1,11 @@ { package ? null , maintainer ? null +, predicate ? null , path ? null , max-workers ? null , include-overlays ? false , keep-going ? null +, commit ? null }: # TODO: add assert statements @@ -31,30 +33,50 @@ let in [x] ++ nubOn f xs; - packagesWithPath = relativePath: cond: return: pathContent: - let - result = builtins.tryEval pathContent; + /* Recursively find all packages (derivations) in `pkgs` matching `cond` predicate. - dedupResults = lst: nubOn (pkg: pkg.updateScript) (lib.concatLists lst); - in - if result.success then + Type: packagesWithPath :: AttrPath → (AttrPath → derivation → bool) → AttrSet → List<AttrSet{attrPath :: str; package :: derivation; }> + AttrPath :: [str] + + The packages will be returned as a list of named pairs comprising of: + - attrPath: stringified attribute path (based on `rootPath`) + - package: corresponding derivation + */ + packagesWithPath = rootPath: cond: pkgs: + let + packagesWithPathInner = path: pathContent: let - pathContent = result.value; + result = builtins.tryEval pathContent; + + dedupResults = lst: nubOn ({ package, attrPath }: package.updateScript) (lib.concatLists lst); in - if lib.isDerivation pathContent then - lib.optional (cond relativePath pathContent) (return relativePath pathContent) - else if lib.isAttrs pathContent then - # If user explicitly points to an attrSet or it is marked for recursion, we recur. - if relativePath == [] || pathContent.recurseForDerivations or false || pathContent.recurseForRelease or false then - dedupResults (lib.mapAttrsToList (name: elem: packagesWithPath (relativePath ++ [name]) cond return elem) pathContent) - else [] - else if lib.isList pathContent then - dedupResults (lib.imap0 (i: elem: packagesWithPath (relativePath ++ [i]) cond return elem) pathContent) - else [] - else []; + if result.success then + let + evaluatedPathContent = result.value; + in + if lib.isDerivation evaluatedPathContent then + lib.optional (cond path evaluatedPathContent) { attrPath = lib.concatStringsSep "." path; package = evaluatedPathContent; } + else if lib.isAttrs evaluatedPathContent then + # If user explicitly points to an attrSet or it is marked for recursion, we recur. + if path == rootPath || evaluatedPathContent.recurseForDerivations or false || evaluatedPathContent.recurseForRelease or false then + dedupResults (lib.mapAttrsToList (name: elem: packagesWithPathInner (path ++ [name]) elem) evaluatedPathContent) + else [] + else [] + else []; + in + packagesWithPathInner rootPath pkgs; + /* Recursively find all packages (derivations) in `pkgs` matching `cond` predicate. + */ packagesWith = packagesWithPath []; + /* Recursively find all packages in `pkgs` with updateScript matching given predicate. + */ + packagesWithUpdateScriptMatchingPredicate = cond: + packagesWith (path: pkg: builtins.hasAttr "updateScript" pkg && cond path pkg); + + /* Recursively find all packages in `pkgs` with updateScript by given maintainer. + */ packagesWithUpdateScriptAndMaintainer = maintainer': let maintainer = @@ -63,47 +85,53 @@ let else builtins.getAttr maintainer' lib.maintainers; in - packagesWith (relativePath: pkg: builtins.hasAttr "updateScript" pkg && - (if builtins.hasAttr "maintainers" pkg.meta - then (if builtins.isList pkg.meta.maintainers - then builtins.elem maintainer pkg.meta.maintainers - else maintainer == pkg.meta.maintainers - ) - else false - ) - ) - (relativePath: pkg: pkg) - pkgs; - - packagesWithUpdateScript = path: + packagesWithUpdateScriptMatchingPredicate (path: pkg: + (if builtins.hasAttr "maintainers" pkg.meta + then (if builtins.isList pkg.meta.maintainers + then builtins.elem maintainer pkg.meta.maintainers + else maintainer == pkg.meta.maintainers + ) + else false + ) + ); + + /* Recursively find all packages under `path` in `pkgs` with updateScript. + */ + packagesWithUpdateScript = path: pkgs: let - pathContent = lib.attrByPath (lib.splitString "." path) null pkgs; + prefix = lib.splitString "." path; + pathContent = lib.attrByPath prefix null pkgs; in if pathContent == null then builtins.throw "Attribute path `${path}` does not exists." else - packagesWith (relativePath: pkg: builtins.hasAttr "updateScript" pkg) - (relativePath: pkg: pkg) + packagesWithPath prefix (path: pkg: builtins.hasAttr "updateScript" pkg) pathContent; - packageByName = name: + /* Find a package under `path` in `pkgs` and require that it has an updateScript. + */ + packageByName = path: pkgs: let - package = lib.attrByPath (lib.splitString "." name) null pkgs; + package = lib.attrByPath (lib.splitString "." path) null pkgs; in if package == null then - builtins.throw "Package with an attribute name `${name}` does not exists." + builtins.throw "Package with an attribute name `${path}` does not exists." else if ! builtins.hasAttr "updateScript" package then - builtins.throw "Package with an attribute name `${name}` does not have a `passthru.updateScript` attribute defined." + builtins.throw "Package with an attribute name `${path}` does not have a `passthru.updateScript` attribute defined." else - package; + { attrPath = path; inherit package; }; + /* List of packages matched based on the CLI arguments. + */ packages = if package != null then - [ (packageByName package) ] + [ (packageByName package pkgs) ] + else if predicate != null then + packagesWithUpdateScriptMatchingPredicate predicate pkgs else if maintainer != null then - packagesWithUpdateScriptAndMaintainer maintainer + packagesWithUpdateScriptAndMaintainer maintainer pkgs else if path != null then - packagesWithUpdateScript path + packagesWithUpdateScript path pkgs else builtins.throw "No arguments provided.\n\n${helpText}"; @@ -115,11 +143,15 @@ let to run all update scripts for all packages that lists \`garbas\` as a maintainer and have \`updateScript\` defined, or: - % nix-shell maintainers/scripts/update.nix --argstr package gnome3.nautilus + % nix-shell maintainers/scripts/update.nix --argstr package gnome.nautilus to run update script for specific package, or - % nix-shell maintainers/scripts/update.nix --argstr path gnome3 + % nix-shell maintainers/scripts/update.nix --arg predicate '(path: pkg: builtins.isList pkg.updateScript && builtins.length pkg.updateScript >= 1 && (let script = builtins.head pkg.updateScript; in builtins.isAttrs script && script.name == "gnome-update-script"))' + + to run update script for all packages matching given predicate, or + + % nix-shell maintainers/scripts/update.nix --argstr path gnome to run update script for all package under an attribute path. @@ -132,19 +164,32 @@ let --argstr keep-going true to continue running when a single update fails. + + You can also make the updater automatically commit on your behalf from updateScripts + that support it by adding + + --argstr commit true ''; - packageData = package: { + /* Transform a matched package into an object for update.py. + */ + packageData = { package, attrPath }: { name = package.name; pname = lib.getName package; - updateScript = map builtins.toString (lib.toList package.updateScript); + oldVersion = lib.getVersion package; + updateScript = map builtins.toString (lib.toList (package.updateScript.command or package.updateScript)); + supportedFeatures = package.updateScript.supportedFeatures or []; + attrPath = package.updateScript.attrPath or attrPath; }; + /* JSON file with data for update.py. + */ packagesJson = pkgs.writeText "packages.json" (builtins.toJSON (map packageData packages)); optionalArgs = lib.optional (max-workers != null) "--max-workers=${max-workers}" - ++ lib.optional (keep-going == "true") "--keep-going"; + ++ lib.optional (keep-going == "true") "--keep-going" + ++ lib.optional (commit == "true") "--commit"; args = [ packagesJson ] ++ optionalArgs; diff --git a/maintainers/scripts/update.py b/maintainers/scripts/update.py index eb7d0ef2647..eb26a472e92 100644 --- a/maintainers/scripts/update.py +++ b/maintainers/scripts/update.py @@ -1,23 +1,192 @@ +from __future__ import annotations +from typing import Dict, Generator, List, Optional, Tuple import argparse -import concurrent.futures +import asyncio +import contextlib import json import os +import re import subprocess import sys +import tempfile -updates = {} +class CalledProcessError(Exception): + process: asyncio.subprocess.Process def eprint(*args, **kwargs): print(*args, file=sys.stderr, **kwargs) -def run_update_script(package): +async def check_subprocess(*args, **kwargs): + """ + Emulate check argument of subprocess.run function. + """ + process = await asyncio.create_subprocess_exec(*args, **kwargs) + returncode = await process.wait() + + if returncode != 0: + error = CalledProcessError() + error.process = process + + raise error + + return process + +async def run_update_script(nixpkgs_root: str, merge_lock: asyncio.Lock, temp_dir: Optional[Tuple[str, str]], package: Dict, keep_going: bool): + worktree: Optional[str] = None + + update_script_command = package['updateScript'] + + if temp_dir is not None: + worktree, _branch = temp_dir + + # Ensure the worktree is clean before update. + await check_subprocess('git', 'reset', '--hard', '--quiet', 'HEAD', cwd=worktree) + + # Update scripts can use $(dirname $0) to get their location but we want to run + # their clones in the git worktree, not in the main nixpkgs repo. + update_script_command = map(lambda arg: re.sub(r'^{0}'.format(re.escape(nixpkgs_root)), worktree, arg), update_script_command) + eprint(f" - {package['name']}: UPDATING ...") - subprocess.run(package['updateScript'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, check=True) + try: + update_process = await check_subprocess('env', f"UPDATE_NIX_ATTR_PATH={package['attrPath']}", *update_script_command, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE, cwd=worktree) + update_info = await update_process.stdout.read() + + await merge_changes(merge_lock, package, update_info, temp_dir) + except KeyboardInterrupt as e: + eprint('Cancelling…') + raise asyncio.exceptions.CancelledError() + except CalledProcessError as e: + eprint(f" - {package['name']}: ERROR") + eprint() + eprint(f"--- SHOWING ERROR LOG FOR {package['name']} ----------------------") + eprint() + stderr = await e.process.stderr.read() + eprint(stderr.decode('utf-8')) + with open(f"{package['pname']}.log", 'wb') as logfile: + logfile.write(stderr) + eprint() + eprint(f"--- SHOWING ERROR LOG FOR {package['name']} ----------------------") + + if not keep_going: + raise asyncio.exceptions.CancelledError() + +@contextlib.contextmanager +def make_worktree() -> Generator[Tuple[str, str], None, None]: + with tempfile.TemporaryDirectory() as wt: + branch_name = f'update-{os.path.basename(wt)}' + target_directory = f'{wt}/nixpkgs' + + subprocess.run(['git', 'worktree', 'add', '-b', branch_name, target_directory]) + yield (target_directory, branch_name) + subprocess.run(['git', 'worktree', 'remove', '--force', target_directory]) + subprocess.run(['git', 'branch', '-D', branch_name]) + +async def commit_changes(name: str, merge_lock: asyncio.Lock, worktree: str, branch: str, changes: List[Dict]) -> None: + for change in changes: + # Git can only handle a single index operation at a time + async with merge_lock: + await check_subprocess('git', 'add', *change['files'], cwd=worktree) + commit_message = '{attrPath}: {oldVersion} → {newVersion}'.format(**change) + await check_subprocess('git', 'commit', '--quiet', '-m', commit_message, cwd=worktree) + await check_subprocess('git', 'cherry-pick', branch) + +async def check_changes(package: Dict, worktree: str, update_info: str): + if 'commit' in package['supportedFeatures']: + changes = json.loads(update_info) + else: + changes = [{}] + + # Try to fill in missing attributes when there is just a single change. + if len(changes) == 1: + # Dynamic data from updater take precedence over static data from passthru.updateScript. + if 'attrPath' not in changes[0]: + # update.nix is always passing attrPath + changes[0]['attrPath'] = package['attrPath'] + + if 'oldVersion' not in changes[0]: + # update.nix is always passing oldVersion + changes[0]['oldVersion'] = package['oldVersion'] + + if 'newVersion' not in changes[0]: + attr_path = changes[0]['attrPath'] + obtain_new_version_process = await check_subprocess('nix-instantiate', '--expr', f'with import ./. {{}}; lib.getVersion {attr_path}', '--eval', '--strict', '--json', stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE, cwd=worktree) + changes[0]['newVersion'] = json.loads((await obtain_new_version_process.stdout.read()).decode('utf-8')) + + if 'files' not in changes[0]: + changed_files_process = await check_subprocess('git', 'diff', '--name-only', stdout=asyncio.subprocess.PIPE, cwd=worktree) + changed_files = (await changed_files_process.stdout.read()).splitlines() + changes[0]['files'] = changed_files + + if len(changed_files) == 0: + return [] + + return changes + +async def merge_changes(merge_lock: asyncio.Lock, package: Dict, update_info: str, temp_dir: Optional[Tuple[str, str]]) -> None: + if temp_dir is not None: + worktree, branch = temp_dir + changes = await check_changes(package, worktree, update_info) + + if len(changes) > 0: + await commit_changes(package['name'], merge_lock, worktree, branch, changes) + else: + eprint(f" - {package['name']}: DONE, no changes.") + else: + eprint(f" - {package['name']}: DONE.") + +async def updater(nixpkgs_root: str, temp_dir: Optional[Tuple[str, str]], merge_lock: asyncio.Lock, packages_to_update: asyncio.Queue[Optional[Dict]], keep_going: bool, commit: bool): + while True: + package = await packages_to_update.get() + if package is None: + # A sentinel received, we are done. + return + + if not ('commit' in package['supportedFeatures'] or 'attrPath' in package): + temp_dir = None + + await run_update_script(nixpkgs_root, merge_lock, temp_dir, package, keep_going) + +async def start_updates(max_workers: int, keep_going: bool, commit: bool, packages: List[Dict]): + merge_lock = asyncio.Lock() + packages_to_update: asyncio.Queue[Optional[Dict]] = asyncio.Queue() + + with contextlib.ExitStack() as stack: + temp_dirs: List[Optional[Tuple[str, str]]] = [] + + # Do not create more workers than there are packages. + num_workers = min(max_workers, len(packages)) + nixpkgs_root_process = await check_subprocess('git', 'rev-parse', '--show-toplevel', stdout=asyncio.subprocess.PIPE) + nixpkgs_root = (await nixpkgs_root_process.stdout.read()).decode('utf-8').strip() -def main(max_workers, keep_going, packages): - with open(sys.argv[1]) as f: + # Set up temporary directories when using auto-commit. + for i in range(num_workers): + temp_dir = stack.enter_context(make_worktree()) if commit else None + temp_dirs.append(temp_dir) + + # Fill up an update queue, + for package in packages: + await packages_to_update.put(package) + + # Add sentinels, one for each worker. + # A workers will terminate when it gets sentinel from the queue. + for i in range(num_workers): + await packages_to_update.put(None) + + # Prepare updater workers for each temp_dir directory. + # At most `num_workers` instances of `run_update_script` will be running at one time. + updaters = asyncio.gather(*[updater(nixpkgs_root, temp_dir, merge_lock, packages_to_update, keep_going, commit) for temp_dir in temp_dirs]) + + try: + # Start updater workers. + await updaters + except asyncio.exceptions.CancelledError as e: + # When one worker is cancelled, cancel the others too. + updaters.cancel() + +def main(max_workers: int, keep_going: bool, commit: bool, packages_path: str) -> None: + with open(packages_path) as f: packages = json.load(f) eprint() @@ -31,29 +200,7 @@ def main(max_workers, keep_going, packages): eprint() eprint('Running update for:') - with concurrent.futures.ProcessPoolExecutor(max_workers=max_workers) as executor: - for package in packages: - updates[executor.submit(run_update_script, package)] = package - - for future in concurrent.futures.as_completed(updates): - package = updates[future] - - try: - future.result() - eprint(f" - {package['name']}: DONE.") - except subprocess.CalledProcessError as e: - eprint(f" - {package['name']}: ERROR") - eprint() - eprint(f"--- SHOWING ERROR LOG FOR {package['name']} ----------------------") - eprint() - eprint(e.stdout.decode('utf-8')) - with open(f"{package['pname']}.log", 'wb') as f: - f.write(e.stdout) - eprint() - eprint(f"--- SHOWING ERROR LOG FOR {package['name']} ----------------------") - - if not keep_going: - sys.exit(1) + asyncio.run(start_updates(max_workers, keep_going, commit, packages)) eprint() eprint('Packages updated!') @@ -65,15 +212,14 @@ def main(max_workers, keep_going, packages): parser = argparse.ArgumentParser(description='Update packages') parser.add_argument('--max-workers', '-j', dest='max_workers', type=int, help='Number of updates to run concurrently', nargs='?', default=4) parser.add_argument('--keep-going', '-k', dest='keep_going', action='store_true', help='Do not stop after first failure') +parser.add_argument('--commit', '-c', dest='commit', action='store_true', help='Commit the changes') parser.add_argument('packages', help='JSON file containing the list of package names and their update scripts') if __name__ == '__main__': args = parser.parse_args() try: - main(args.max_workers, args.keep_going, args.packages) - except (KeyboardInterrupt, SystemExit) as e: - for update in updates: - update.cancel() - - sys.exit(e.code if isinstance(e, SystemExit) else 130) + main(args.max_workers, args.keep_going, args.commit, args.packages) + except KeyboardInterrupt as e: + # Let’s cancel outside of the main loop too. + sys.exit(130) diff --git a/maintainers/team-list.nix b/maintainers/team-list.nix index d07f602f0da..939cf159212 100644 --- a/maintainers/team-list.nix +++ b/maintainers/team-list.nix @@ -29,11 +29,64 @@ with lib.maintainers; { scope = "Maintain ACME-related packages and modules."; }; + beam = { + members = [ + ankhers + Br1ght0ne + DianaOlympos + gleber + happysalada + yurrriq + ]; + scope = "Maintain BEAM-related packages and modules."; + }; + + cinnamon = { + members = [ + mkg20001 + ]; + scope = "Maintain Cinnamon desktop environment and applications made by the LinuxMint team."; + }; + + chia = { + members = [ + atemu + lourkeur + ]; + scope = "Maintain the Chia blockchain and its dependencies"; + }; + + deshaw = { + # Verify additions to this team with at least one already existing member of the team. + members = [ + limeytexan + ]; + scope = "Group registration for D. E. Shaw employees who collectively maintain packages."; + }; + + determinatesystems = { + # Verify additions to this team with at least one already existing member of the team. + members = [ + cole-h + grahamc + ]; + scope = "Group registration for packages maintained by Determinate Systems."; + }; + freedesktop = { - members = [ jtojnar worldofpeace ]; + members = [ jtojnar ]; scope = "Maintain Freedesktop.org packages for graphical desktop."; }; + gcc = { + members = [ + synthetica + vcunat + ericson2314 + ]; + scope = "Maintain GCC (GNU Compiler Collection) compilers"; + }; + golang = { members = [ c00w @@ -53,30 +106,61 @@ with lib.maintainers; { members = [ hedning jtojnar - worldofpeace dasj19 + maxeaubrey ]; scope = "Maintain GNOME desktop environment and platform."; }; + haskell = { + members = [ + maralorn + cdepillabout + sternenseemann + ]; + scope = "Maintain Haskell packages and infrastructure."; + }; + + home-assistant = { + members = [ + fab + globin + hexa + mic92 + ]; + scope = "Maintain the Home Assistant ecosystem"; + }; + jitsi = { members = [ - mmilata petabyteboy - prusnak ryantm + yuka ]; scope = "Maintain Jitsi."; }; + kodi = { + members = [ + aanderse + cpages + edwtjo + minijackson + peterhoeg + sephalon + ]; + scope = "Maintain Kodi and related packages."; + }; + matrix = { members = [ ma27 - pacien fadenb mguentner ekleog ralith + mjlbach + dandellion ]; scope = "Maintain the ecosystem around Matrix, a decentralized messenger."; }; @@ -101,4 +185,31 @@ with lib.maintainers; { ]; scope = "Maintain Podman and CRI-O related packages and modules."; }; + + sage = { + members = [ + timokau + omasanori + raskin + collares + ]; + scope = "Maintain SageMath and the dependencies that are likely to break it."; + }; + + serokell = { + # Verify additions by approval of an already existing member of the team. + members = [ + balsoft + mkaito + ]; + scope = "Group registration for Serokell employees who collectively maintain packages."; + }; + + tts = { + members = [ + hexa + mic92 + ]; + scope = "coqui-ai TTS (formerly Mozilla TTS) and leaf packages"; + }; } |