diff options
author | Alyssa Ross <hi@alyssa.is> | 2021-06-22 15:01:47 +0000 |
---|---|---|
committer | Alyssa Ross <hi@alyssa.is> | 2021-06-22 16:57:59 +0000 |
commit | 633cab0ecb07627706c6b523e219490f019eaab5 (patch) | |
tree | 4fb472bdfe2723037dad53dc1b8a87c939015f5e /nixpkgs/maintainers | |
parent | ffb691c199e7e0cbc4e45e5310779c9e3f7c2a73 (diff) | |
parent | 432fc2d9a67f92e05438dff5fdc2b39d33f77997 (diff) | |
download | nixlib-633cab0ecb07627706c6b523e219490f019eaab5.tar nixlib-633cab0ecb07627706c6b523e219490f019eaab5.tar.gz nixlib-633cab0ecb07627706c6b523e219490f019eaab5.tar.bz2 nixlib-633cab0ecb07627706c6b523e219490f019eaab5.tar.lz nixlib-633cab0ecb07627706c6b523e219490f019eaab5.tar.xz nixlib-633cab0ecb07627706c6b523e219490f019eaab5.tar.zst nixlib-633cab0ecb07627706c6b523e219490f019eaab5.zip |
Merge commit '432fc2d9a67f92e05438dff5fdc2b39d33f77997'
# Conflicts: # nixpkgs/pkgs/applications/editors/emacs/elisp-packages/elpa-generated.nix # nixpkgs/pkgs/applications/networking/mailreaders/thunderbird/default.nix # nixpkgs/pkgs/applications/window-managers/sway/default.nix # nixpkgs/pkgs/build-support/rust/default.nix # nixpkgs/pkgs/development/go-modules/generic/default.nix
Diffstat (limited to 'nixpkgs/maintainers')
16 files changed, 1132 insertions, 57 deletions
diff --git a/nixpkgs/maintainers/maintainer-list.nix b/nixpkgs/maintainers/maintainer-list.nix index ee12b1a24db3..3dbc1902b71c 100644 --- a/nixpkgs/maintainers/maintainer-list.nix +++ b/nixpkgs/maintainers/maintainer-list.nix @@ -64,6 +64,16 @@ 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"; @@ -290,6 +300,12 @@ githubId = 335271; name = "James Alexander Feldman-Crough"; }; + afontain = { + email = "antoine.fontaine@epfl.ch"; + github = "necessarily-equal"; + githubId = 59283660; + name = "Antoine Fontaine"; + }; aforemny = { email = "aforemny@posteo.de"; github = "aforemny"; @@ -428,6 +444,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"; @@ -1316,6 +1338,12 @@ github = "bmilanov"; githubId = 30090366; }; + bmwalters = { + name = "Bradley Walters"; + email = "oss@walters.app"; + github = "bmwalters"; + githubId = 4380777; + }; bobakker = { email = "bobakk3r@gmail.com"; github = "bobakker"; @@ -1382,12 +1410,6 @@ githubId = 302429; name = "Marton Boros"; }; - branwright1 = { - email = "branwright@protonmail.com"; - github = "branwright1"; - githubId = 71175207; - name = "Brandon Wright"; - }; bramd = { email = "bram@bramd.nl"; github = "bramd"; @@ -1522,6 +1544,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"; @@ -2177,6 +2205,12 @@ githubId = 990767; name = "Daniel Olsen"; }; + daneads = { + email = "me@daneads.com"; + github = "daneads"; + githubId = 24708079; + name = "Dan Eads"; + }; danharaj = { email = "dan@obsidian.systems"; github = "danharaj"; @@ -2397,6 +2431,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"; @@ -2439,6 +2479,12 @@ githubId = 8404455; name = "Diego Lelis"; }; + diogox = { + name = "Diogo Xavier"; + email = "13244408+diogox@users.noreply.github.com"; + github = "diogox"; + githubId = 13244408; + }; dipinhora = { email = "dipinhora+github@gmail.com"; github = "dipinhora"; @@ -2493,6 +2539,12 @@ 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"; @@ -2625,6 +2677,16 @@ 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"; @@ -2995,6 +3057,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"; @@ -3029,6 +3101,12 @@ 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"; @@ -3107,6 +3185,16 @@ 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"; @@ -3317,6 +3405,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"; @@ -3477,6 +3571,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"; @@ -3551,6 +3651,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"; @@ -3611,6 +3717,12 @@ githubId = 10353047; name = "Tobias Happ"; }; + gfrascadorio = { + email = "gfrascadorio@tutanota.com"; + github = "gfrascadorio"; + githubId = 37602871; + name = "Galois"; + }; ggpeti = { email = "ggpeti@gmail.com"; github = "ggpeti"; @@ -3675,12 +3787,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"; @@ -3991,6 +4097,16 @@ 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"; @@ -4047,6 +4163,12 @@ 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"; @@ -4095,6 +4217,12 @@ 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"; @@ -4249,6 +4377,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"; @@ -4313,16 +4451,6 @@ 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"; @@ -4697,6 +4825,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"; @@ -4955,7 +5089,7 @@ name = "Julien Dehos"; }; julm = { - email = "julm+nix@sourcephile.fr"; + email = "julm+nixpkgs@sourcephile.fr"; github = "ju1m"; githubId = 21160136; name = "Julien Moutinho"; @@ -5108,6 +5242,16 @@ 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"; @@ -5138,6 +5282,12 @@ 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"; @@ -5453,6 +5603,12 @@ }]; name = "Las Safin"; }; + l3af = { + email = "L3afMeAlon3@gmail.com"; + github = "L3afMe"; + githubId = 72546287; + name = "L3af"; + }; laikq = { email = "gwen@quasebarth.de"; github = "laikq"; @@ -5644,6 +5800,12 @@ githubId = 6652840; name = "Jade"; }; + lgcl = { + email = "dev@lgcl.de"; + name = "Leon Vack"; + github = "LogicalOverflow"; + githubId = 5919957; + }; lheckemann = { email = "git@sphalerite.org"; github = "lheckemann"; @@ -5830,6 +5992,12 @@ 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"; @@ -6036,6 +6204,12 @@ githubId = 2914269; name = "Malo Bourgon"; }; + malvo = { + email = "malte@malvo.org"; + github = "malte-v"; + githubId = 34393802; + name = "Malte Voos"; + }; malyn = { email = "malyn@strangeGizmo.com"; github = "malyn"; @@ -6134,11 +6308,11 @@ fingerprint = "B573 5118 0375 A872 FBBF 7770 B629 036B E399 EEE9"; }]; }; - mausch = { - email = "mauricioscheffer@gmail.com"; - github = "mausch"; - githubId = 95194; - name = "Mauricio Scheffer"; + masipcat = { + email = "jordi@masip.cat"; + github = "masipcat"; + githubId = 775189; + name = "Jordi Masip"; }; matejc = { email = "cotman.matej@gmail.com"; @@ -6164,6 +6338,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"; @@ -6194,6 +6374,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"; @@ -6324,6 +6510,16 @@ 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"; @@ -6376,10 +6572,10 @@ email = "softs@metabarcoding.org"; name = "Celine Mercier"; }; - metadark = { + kira-bruneau = { email = "kira.bruneau@pm.me"; name = "Kira Bruneau"; - github = "metadark"; + github = "kira-bruneau"; githubId = 382041; }; meutraa = { @@ -6505,6 +6701,16 @@ githubId = 1387206; name = "Mike Sperber"; }; + 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"; @@ -6921,6 +7127,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"; @@ -6963,12 +7175,6 @@ 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"; @@ -7031,6 +7237,12 @@ githubId = 628342; name = "Tim Steinbach"; }; + netcrns = { + email = "jason.wing@gmx.de"; + github = "netcrns"; + githubId = 34162313; + name = "Jason Wing"; + }; netixx = { email = "dev.espinetfrancois@gmail.com"; github = "netixx"; @@ -7065,6 +7277,22 @@ 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"; + }; nickhu = { email = "me@nickhu.co.uk"; github = "nickhu"; @@ -7133,12 +7361,22 @@ githubId = 3159451; name = "Nicolas Schneider"; }; - nipav = { + 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"; @@ -7193,6 +7431,12 @@ 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"; @@ -7245,6 +7489,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"; @@ -7331,6 +7581,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"; @@ -7361,6 +7617,18 @@ 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"; @@ -7623,12 +7891,6 @@ githubId = 152312; name = "Periklis Tsirakidis"; }; - pesterhazy = { - email = "pesterhazy@gmail.com"; - github = "pesterhazy"; - githubId = 106328; - name = "Paulus Esterhazy"; - }; petabyteboy = { email = "milan@petabyte.dev"; github = "petabyteboy"; @@ -7985,6 +8247,12 @@ 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"; @@ -8189,6 +8457,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"; @@ -8331,6 +8605,12 @@ 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"; @@ -8401,6 +8681,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"; @@ -8542,10 +8828,14 @@ }]; }; 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"; @@ -8587,6 +8877,12 @@ 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"; @@ -8623,6 +8919,12 @@ 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"; @@ -9027,6 +9329,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"; @@ -9385,6 +9693,12 @@ githubId = 1699155; name = "Steve Elliott"; }; + stelcodes = { + email = "stel@stel.codes"; + github = "stelcodes"; + githubId = 22163194; + name = "Stel Abrego"; + }; stephank = { email = "nix@stephank.nl"; github = "stephank"; @@ -9807,6 +10121,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"; @@ -10305,6 +10625,12 @@ githubId = 2212422; name = "uwap"; }; + V = { + name = "V"; + email = "v@anomalous.eu"; + github = "deviant"; + githubId = 68829907; + }; va1entin = { email = "github@valentinsblog.com"; github = "va1entin"; @@ -10515,7 +10841,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"; @@ -11358,6 +11689,16 @@ github = "pulsation"; githubId = 1838397; }; + 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"; @@ -11368,6 +11709,12 @@ 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"; diff --git a/nixpkgs/maintainers/scripts/build.nix b/nixpkgs/maintainers/scripts/build.nix index bc4355d0aa8e..ca401700b4a6 100644 --- a/nixpkgs/maintainers/scripts/build.nix +++ b/nixpkgs/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 diff --git a/nixpkgs/maintainers/scripts/check-hydra-by-maintainer.nix b/nixpkgs/maintainers/scripts/check-hydra-by-maintainer.nix index cecf65ec66dc..326aae47f8c5 100644 --- a/nixpkgs/maintainers/scripts/check-hydra-by-maintainer.nix +++ b/nixpkgs/maintainers/scripts/check-hydra-by-maintainer.nix @@ -48,6 +48,7 @@ let in pkgs.stdenv.mkDerivation { name = "nixpkgs-update-script"; + buildInputs = [ pkgs.hydra-check ]; buildCommand = '' echo "" echo "----------------------------------------------------------------" diff --git a/nixpkgs/maintainers/scripts/haskell/hydra-report.hs b/nixpkgs/maintainers/scripts/haskell/hydra-report.hs new file mode 100755 index 000000000000..fd6430d43c9a --- /dev/null +++ b/nixpkgs/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/nixpkgs/maintainers/scripts/haskell/mark-broken.sh b/nixpkgs/maintainers/scripts/haskell/mark-broken.sh new file mode 100755 index 000000000000..ddf2b1243b1b --- /dev/null +++ b/nixpkgs/maintainers/scripts/haskell/mark-broken.sh @@ -0,0 +1,45 @@ +#! /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 + +sort -iu "$tmpfile" >> "$broken_config" +maintainers/scripts/haskell/regenerate-hackage-packages.sh +maintainers/scripts/haskell/regenerate-transitive-broken-packages.sh +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 +hackage2nix: Mark failing builds broken + +This commit has been generated by maintainers/scripts/haskell/mark-broken.sh +EOF +fi diff --git a/nixpkgs/maintainers/scripts/haskell/regenerate-hackage-packages.sh b/nixpkgs/maintainers/scripts/haskell/regenerate-hackage-packages.sh new file mode 100755 index 000000000000..e7f91f2d79d1 --- /dev/null +++ b/nixpkgs/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 +hackage-packages.nix: Regenerate 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/nixpkgs/maintainers/scripts/haskell/regenerate-transitive-broken-packages.sh b/nixpkgs/maintainers/scripts/haskell/regenerate-transitive-broken-packages.sh new file mode 100755 index 000000000000..64ec998bf6b1 --- /dev/null +++ b/nixpkgs/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/\"//' | sort -i >> $config_file diff --git a/nixpkgs/maintainers/scripts/haskell/transitive-broken-packages.nix b/nixpkgs/maintainers/scripts/haskell/transitive-broken-packages.nix new file mode 100644 index 000000000000..d4ddaa957658 --- /dev/null +++ b/nixpkgs/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/nixpkgs/maintainers/scripts/haskell/update-cabal2nix-unstable.sh b/nixpkgs/maintainers/scripts/haskell/update-cabal2nix-unstable.sh new file mode 100755 index 000000000000..415837045602 --- /dev/null +++ b/nixpkgs/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/nixpkgs/maintainers/scripts/haskell/update-hackage.sh b/nixpkgs/maintainers/scripts/haskell/update-hackage.sh new file mode 100755 index 000000000000..a7cfecbbb0fe --- /dev/null +++ b/nixpkgs/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/nixpkgs/maintainers/scripts/haskell/update-stackage.sh b/nixpkgs/maintainers/scripts/haskell/update-stackage.sh new file mode 100755 index 000000000000..db336bf12da3 --- /dev/null +++ b/nixpkgs/maintainers/scripts/haskell/update-stackage.sh @@ -0,0 +1,68 @@ +#! /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/nightly/cabal.config" >"$tmpfile" +old_version=$(grep "# Stackage Nightly" $stackage_config | sed -E 's/.*([0-9]{4}-[0-9]{2}-[0-9]{2}).*/\1/') +version=$(sed -rn "s/^--.*http:..(www.)?stackage.org.snapshot.nightly-//p" "$tmpfile") + +if [[ "$old_version" == "$version" ]]; then + echo "No new stackage version" + exit 0 # Nothing to do +fi + +# 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 Nightly $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 '/ cabal-install /d' \ + -e '/ cabal2nix /d' \ + -e '/ cabal2spec /d' \ + -e '/ distribution-nixpkgs /d' \ + -e '/ git-annex /d' \ + -e '/ hindent /d' \ + -e '/ hledger/d' \ + -e '/ hlint /d' \ + -e '/ hoogle /d' \ + -e '/ hopenssl /d' \ + -e '/ jailbreak-cabal /d' \ + -e '/ json-autotype/d' \ + -e '/ language-nix /d' \ + -e '/ shake /d' \ + -e '/ ShellCheck /d' \ + -e '/ stack /d' \ + -e '/ weeder /d' \ + < "${tmpfile}.new" >> $stackage_config + +if [[ "${1:-}" == "--do-commit" ]]; then +git add $stackage_config +git commit -F - << EOF +Stackage Nightly: $old_version -> $version + +This commit has been generated by maintainers/scripts/haskell/update-stackage.sh +EOF +fi diff --git a/nixpkgs/maintainers/scripts/pluginupdate.py b/nixpkgs/maintainers/scripts/pluginupdate.py index e7a183952b08..91c5214d1539 100644 --- a/nixpkgs/maintainers/scripts/pluginupdate.py +++ b/nixpkgs/maintainers/scripts/pluginupdate.py @@ -13,6 +13,7 @@ import http import json import os import subprocess +import logging import sys import time import traceback @@ -34,6 +35,14 @@ 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. @@ -235,6 +244,7 @@ def prefetch_plugin( 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() @@ -464,6 +474,11 @@ def parse_args(editor: Editor): "--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() @@ -503,6 +518,9 @@ 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) diff --git a/nixpkgs/maintainers/scripts/update-luarocks-shell.nix b/nixpkgs/maintainers/scripts/update-luarocks-shell.nix index 23a940b3691b..d3f342b07a96 100644 --- a/nixpkgs/maintainers/scripts/update-luarocks-shell.nix +++ b/nixpkgs/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/nixpkgs/maintainers/scripts/update.nix b/nixpkgs/maintainers/scripts/update.nix index 1305e0947c72..7435cf64425c 100755 --- a/nixpkgs/maintainers/scripts/update.nix +++ b/nixpkgs/maintainers/scripts/update.nix @@ -1,5 +1,6 @@ { package ? null , maintainer ? null +, predicate ? null , path ? null , max-workers ? null , include-overlays ? false @@ -69,6 +70,11 @@ let */ 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': @@ -79,7 +85,7 @@ let else builtins.getAttr maintainer' lib.maintainers; in - packagesWith (path: pkg: builtins.hasAttr "updateScript" pkg && + packagesWithUpdateScriptMatchingPredicate (path: pkg: (if builtins.hasAttr "maintainers" pkg.meta then (if builtins.isList pkg.meta.maintainers then builtins.elem maintainer pkg.meta.maintainers @@ -120,6 +126,8 @@ let packages = if package != null then [ (packageByName package pkgs) ] + else if predicate != null then + packagesWithUpdateScriptMatchingPredicate predicate pkgs else if maintainer != null then packagesWithUpdateScriptAndMaintainer maintainer pkgs else if path != null then @@ -135,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. diff --git a/nixpkgs/maintainers/scripts/update.py b/nixpkgs/maintainers/scripts/update.py index 8cc2bcbd67c9..eb26a472e926 100644 --- a/nixpkgs/maintainers/scripts/update.py +++ b/nixpkgs/maintainers/scripts/update.py @@ -39,6 +39,9 @@ async def run_update_script(nixpkgs_root: str, merge_lock: asyncio.Lock, temp_di 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) diff --git a/nixpkgs/maintainers/team-list.nix b/nixpkgs/maintainers/team-list.nix index cb30b2e01380..3e6843f0e573 100644 --- a/nixpkgs/maintainers/team-list.nix +++ b/nixpkgs/maintainers/team-list.nix @@ -48,6 +48,14 @@ with lib.maintainers; { 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 = [ @@ -66,10 +74,19 @@ with lib.maintainers; { }; 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 @@ -89,13 +106,21 @@ 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 @@ -110,7 +135,6 @@ with lib.maintainers; { members = [ mmilata petabyteboy - prusnak ryantm ]; scope = "Maintain Jitsi."; @@ -131,11 +155,11 @@ with lib.maintainers; { matrix = { members = [ ma27 - pacien fadenb mguentner ekleog ralith + mjlbach ]; scope = "Maintain the ecosystem around Matrix, a decentralized messenger."; }; @@ -170,4 +194,13 @@ with lib.maintainers; { ]; 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."; + }; } |