{ pkgs, lib }:
let
  kebab-case-name = project-name: lib.pipe project-name [
    (builtins.replaceStrings
      lib.upperChars
      (map (x: "-${x}") lib.lowerChars)
    )
    (lib.removePrefix "-")
  ];

  mw-ext = {
    name
  , commit
  , hash
  , tracking-branch ? "REL1_45"
  , kebab-name ? kebab-case-name name
  , fetchgit ? pkgs.fetchgit
  }:
  {
    ${name} = (fetchgit {
      name = "mediawiki-${kebab-name}-source";
      url = "https://gerrit.wikimedia.org/r/mediawiki/extensions/${name}";
      rev = commit;
      inherit hash;
    }).overrideAttrs (_: {
      passthru = { inherit name kebab-name tracking-branch; };
    });
  };
in
# NOTE: to add another extension, you can add an mw-ext expression
#       with an empty (or even wrong) commit and empty hash, and
#       run the update script
lib.mergeAttrsList [
  (mw-ext {
    name = "CodeEditor";
    commit = "af7e82f24ba4b68393712fece6f1b5fa4bb049ec";
    hash = "sha256-XT8E4O6MEZYHSs6Q+A/dfYaUvJ4kY13Kd/cq30dA5NA=";
  })
  (mw-ext {
    name = "CodeMirror";
    commit = "7ab826eff8c4097589a3199c40c507717af23234";
    hash = "sha256-kMIyGW9J4OSGSetByel7hEGgxPRJmQ53it6ndpYA/Hs=";
  })
  (mw-ext {
    name = "DeleteBatch";
    commit = "b5920283cfe78b86a63a1037a81651c58ce764da";
    hash = "sha256-LwuVX2s5Q4uc6o7hlTjFzRTwvSCwTk74gBpX0HoLDMA=";
  })
  (mw-ext {
    name = "PdfHandler";
    commit = "dc1a3ca04ac6ec7d7de7ce5355803510508a2575";
    hash = "sha256-ltAQZtfTMMLRPATA7rclSNW8Yz4ctGc30CxlL3SRBWU=";
  })
  (mw-ext {
    name = "PluggableAuth";
    commit = "4b57a23e32d72bd3f74184ff2734aa483a5b0c63";
    hash = "sha256-ZGw0Wgz0Sg04YDcOzkOGywmfQ6s6Ex17QbjmUDO1D8c=";
  })
  (mw-ext {
    name = "Popups";
    commit = "f74a8639f57232898978d9f3792293eb2d370e40";
    hash = "sha256-uunUtN3M/ksW/kcbeIzDVTdb1P/PHTeTwaTsvspMLko=";
  })
  (mw-ext {
    name = "Scribunto";
    commit = "35c85c96167922adc98e62dd6573789d906dd7d7";
    hash = "sha256-FEWADJW53cDOlLseM62VL66PENv/jNnwuCMo2Pb02ek=";
  })
  (mw-ext {
    name = "SimpleSAMLphp";
    kebab-name = "simple-saml-php";
    commit = "70778bb02f972abbb51e6ba3e0f6545b00dcab00";
    hash = "sha256-wfmFJKy+ih84qFM9DVcCQFAZBx45s7Hl0lRnseMPhGY=";
  })
  (mw-ext {
    name = "TemplateData";
    commit = "cca3b3430067f2161bf65de822f70dd38fe07bba";
    hash = "sha256-OxLwiF8FlWizkpDF9GXYfjehKtrltX8ihiCE+fNJpgw=";
  })
  (mw-ext {
    name = "TemplateStyles";
    commit = "101a159dd0190759a16551a86800144c18b6ff5c";
    hash = "sha256-IGQQVAx8/76ivHq9b97ec1AlFoqbRl7uhXhwoFimsG4=";
  })
  (mw-ext {
    name = "UserMerge";
    commit = "6c0d105e07538c34bfde989bd26fa1945f8d1b79";
    hash = "sha256-w058Ihk0I98hIG1tkVJGy1bzbv7XXyUksGexXgCN540=";
  })
  (mw-ext {
    name = "VisualEditor";
    commit = "8d8c6d7f179a5f799e1fa8cba207d81f58f722d2";
    hash = "sha256-wbYHXi2vD521EMzUl7ttinG4YdLv/DwYvVUew7dka0g=";
  })
  (mw-ext {
    name = "WikiEditor";
    commit = "f53000f0499858fe74e4f5008b2f5e467d9d9382";
    hash = "sha256-+HTXZEVCwMD8z6c1kCZA3k686HzNd30pJljzRvf+gMg=";
  })
]
