Merge branch 'master' into staging

This commit is contained in:
Vladimír Čunát
2026-01-08 12:47:15 +01:00
146 changed files with 3139 additions and 1933 deletions
+2 -2
View File
@@ -609,9 +609,9 @@ in
rewrite @allow_media /lib/exe/fetch.php?media=/{http.regexp.path.1}
@allow_detail {
path /_detail*
path_regexp path ^/_detail/(.*)$
}
rewrite @allow_detail /lib/exe/detail.php?media={path}
rewrite @allow_detail /lib/exe/detail.php?media=/{http.regexp.path.1}
@allow_export {
path /_export*
@@ -142,5 +142,16 @@
fi
'';
};
security =
let
extraConfig = ''
Defaults env_keep+=NIXOS_NO_CHECK
'';
in
{
sudo = { inherit extraConfig; };
sudo-rs = { inherit extraConfig; };
};
};
}
@@ -1,151 +0,0 @@
#! /usr/bin/env nix-shell
#! nix-shell -i python3 -p python3 python3.pkgs.packaging python3.pkgs.requests python3.pkgs.xmltodict
import json
import pathlib
import logging
import requests
import subprocess
import sys
from urllib.error import HTTPError
import urllib.request
import xmltodict
from packaging import version
updates_url = "https://www.jetbrains.com/updates/updates.xml"
current_path = pathlib.Path(__file__).parent
ides_file_path = current_path.joinpath("..").joinpath("ides.json").resolve()
versions_file_path = current_path.joinpath("versions.json").resolve()
fromVersions = {}
toVersions = {}
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
def one_or_more(x):
return x if isinstance(x, list) else [x]
def download_channels():
logging.info("Checking for updates from %s", updates_url)
updates_response = requests.get(updates_url)
updates_response.raise_for_status()
root = xmltodict.parse(updates_response.text)
products = root["products"]["product"]
return {
channel["@name"]: channel
for product in products
if "channel" in product
for channel in one_or_more(product["channel"])
}
def build_version(build):
build_number = build["@fullNumber"] if "@fullNumber" in build else build["@number"]
return version.parse(build_number)
def latest_build(channel):
builds = one_or_more(channel["build"])
latest = max(builds, key=build_version)
return latest
def download_sha256(url):
url = f"{url}.sha256"
download_response = requests.get(url)
download_response.raise_for_status()
return download_response.content.decode('UTF-8').split(' ')[0]
channels = download_channels()
def get_url(template, version_or_build_number, version_number):
release = [str(n) for n in version.parse(version_number).release]
for k in range(len(release), 0, -1):
s = ".".join(release[0:k])
url = template.format(version=version_or_build_number, versionMajorMinor=s)
try:
if urllib.request.urlopen(url).getcode() == 200:
return url
except HTTPError:
pass
return None
def update_product(name, ide, version_info):
update_channel = ide["updateChannel"]
logging.info("Updating %s", name)
channel = channels.get(update_channel)
if channel is None:
logging.error("Failed to find channel %s.", update_channel)
logging.error("Check that the update-channel in %s matches the name in %s", versions_file_path, updates_url)
else:
try:
build = latest_build(channel)
new_version = build["@version"]
new_build_number = ""
if "@fullNumber" not in build:
new_build_number = build["@number"]
else:
new_build_number = build["@fullNumber"]
if "EAP" not in channel["@name"]:
version_or_build_number = new_version
else:
version_or_build_number = new_build_number
version_number = new_version.split(' ')[0]
download_url = get_url(version_info["url-template"], version_or_build_number, version_number)
if not download_url:
raise Exception(f"No valid url for {name} version {version_or_build_number}")
version_info["url"] = download_url
if "sha256" not in version_info or version_info.get("build_number") != new_build_number:
fromVersions[name] = version_info["version"]
toVersions[name] = new_version
logging.info("Found a newer version %s with build number %s.", new_version, new_build_number)
version_info["version"] = new_version
version_info["build_number"] = new_build_number
version_info["sha256"] = download_sha256(download_url)
else:
logging.info("Already at the latest version %s with build number %s.", new_version, new_build_number)
except Exception as e:
logging.exception("Update failed:", exc_info=e)
logging.warning("Skipping %s due to the above error.", name)
logging.warning("It may be out-of-date. Fix the error and rerun.")
def update_products(versioned_products, ides):
for name, version_info in versioned_products.items():
update_product(name, ides[name], version_info)
with open(versions_file_path, "r") as versions_file:
versions = json.load(versions_file)
with open(ides_file_path, "r") as ides_file:
ides = json.load(ides_file)
for versioned_products in versions.values():
update_products(versioned_products, ides)
with open(versions_file_path, "w") as versions_file:
json.dump(versions, versions_file, indent=2)
versions_file.write("\n")
if len(toVersions) == 0:
# No Updates found
sys.exit(0)
if len(toVersions) == 1:
commitMessage = ""
else:
lowestVersion = min(fromVersions.values())
highestVersion = max(toVersions.values())
commitMessage = f"jetbrains: {lowestVersion} -> {highestVersion}"
commitMessage += "\n\n"
for name in toVersions.keys():
commitMessage += f"jetbrains.{name}: {fromVersions[name]} -> {toVersions[name]}\n"
# Commit the result
logging.info("#### Committing changes... ####")
subprocess.run(['git', 'commit', f'-m{commitMessage}', '--', f'{versions_file_path}'], check=True)
@@ -1,490 +0,0 @@
{
"x86_64-linux": {
"aqua": {
"url-template": "https://download.jetbrains.com/aqua/aqua-{version}.tar.gz",
"version": "2024.3.2",
"sha256": "de073e8a3734a2c4ef984b3e1bd68f5de72a6180e73400889510439ac3f419aa",
"url": "https://download.jetbrains.com/aqua/aqua-2024.3.2.tar.gz",
"build_number": "243.23654.154"
},
"clion": {
"url-template": "https://download.jetbrains.com/cpp/CLion-{version}.tar.gz",
"version": "2025.3.1",
"sha256": "44ae3da5358ba010a62d55ab412b72f364c5dcd2c2dcd2004ae34b7463807bbd",
"url": "https://download.jetbrains.com/cpp/CLion-2025.3.1.tar.gz",
"build_number": "253.29346.141"
},
"datagrip": {
"url-template": "https://download.jetbrains.com/datagrip/datagrip-{version}.tar.gz",
"version": "2025.3.2",
"sha256": "cb6ed6475d21eb8d30754131bd24003c114096bfa84ffccf334dc11cf8ac60cc",
"url": "https://download.jetbrains.com/datagrip/datagrip-2025.3.2.tar.gz",
"build_number": "253.29346.170"
},
"dataspell": {
"url-template": "https://download.jetbrains.com/python/dataspell-{version}.tar.gz",
"version": "2025.3.1",
"sha256": "37f13426ce4f5d859d7db246f2328ccbad61adf361d43c784cb6932af6644c28",
"url": "https://download.jetbrains.com/python/dataspell-2025.3.1.tar.gz",
"build_number": "253.29346.157"
},
"gateway": {
"url-template": "https://download.jetbrains.com/idea/gateway/JetBrainsGateway-{version}.tar.gz",
"version": "2025.3",
"sha256": "90c8a54f619245a5435c343f94f39595ab59cd3cbada569e2b1e28bcacdbcb4a",
"url": "https://download.jetbrains.com/idea/gateway/JetBrainsGateway-2025.3.tar.gz",
"build_number": "253.28294.342"
},
"goland": {
"url-template": "https://download.jetbrains.com/go/goland-{version}.tar.gz",
"version": "2025.3",
"sha256": "6151856286ea546eb8af9aeb025772cee6bd57134f45494a818e8da20a8691c6",
"url": "https://download.jetbrains.com/go/goland-2025.3.tar.gz",
"build_number": "253.28294.337"
},
"idea-community": {
"url-template": "https://download.jetbrains.com/idea/ideaIC-{version}.tar.gz",
"version": "2025.2.5",
"sha256": "995c334cc3e143f13467abafef07a1ccf7d06275512bb6f4c91123948786ab7c",
"url": "https://download.jetbrains.com/idea/ideaIC-2025.2.5.tar.gz",
"build_number": "252.28238.7"
},
"idea": {
"url-template": "https://download.jetbrains.com/idea/ideaIU-{version}.tar.gz",
"version": "2025.3.1",
"sha256": "21e1b90b5ec684767a03498ba424ef3f9acc5dbf759cceefd5edd474f043ad6c",
"url": "https://download.jetbrains.com/idea/ideaIU-2025.3.1.tar.gz",
"build_number": "253.29346.138"
},
"mps": {
"url-template": "https://download.jetbrains.com/mps/{versionMajorMinor}/MPS-{version}.tar.gz",
"version": "2025.3",
"sha256": "c4023e52b4e17824d61d2768238619be14e5ae5735db533e3951647f377b6b79",
"url": "https://download.jetbrains.com/mps/2025.3/MPS-2025.3.tar.gz",
"build_number": "253.28294.432"
},
"phpstorm": {
"url-template": "https://download.jetbrains.com/webide/PhpStorm-{version}.tar.gz",
"version": "2025.3.1",
"sha256": "fd8937ab6b79605cefc9917ffe6a08e05a6b7cc0256fa2178623d24ec322fa29",
"url": "https://download.jetbrains.com/webide/PhpStorm-2025.3.1.tar.gz",
"build_number": "253.29346.151",
"version-major-minor": "2022.3"
},
"pycharm-community": {
"url-template": "https://download.jetbrains.com/python/pycharm-community-{version}.tar.gz",
"version": "2025.2.5",
"sha256": "7f49a014f53f0f6f7c46f6710b131f390302287f4046b606331d88081cdb551f",
"url": "https://download.jetbrains.com/python/pycharm-community-2025.2.5.tar.gz",
"build_number": "252.28238.29"
},
"pycharm": {
"url-template": "https://download.jetbrains.com/python/pycharm-{version}.tar.gz",
"version": "2025.3.1",
"sha256": "933fd42d7cc2a76ad4ba23f9112294e4df013fa4c3362435a1e3368051c07391",
"url": "https://download.jetbrains.com/python/pycharm-2025.3.1.tar.gz",
"build_number": "253.29346.142"
},
"rider": {
"url-template": "https://download.jetbrains.com/rider/JetBrains.Rider-{version}.tar.gz",
"version": "2025.3.1",
"sha256": "ba840f7c48da7f118cf57aa8c22df30120d16f175fbce3bec6a65590ed87f2e8",
"url": "https://download.jetbrains.com/rider/JetBrains.Rider-2025.3.1.tar.gz",
"build_number": "253.29346.144"
},
"ruby-mine": {
"url-template": "https://download.jetbrains.com/ruby/RubyMine-{version}.tar.gz",
"version": "2025.3.1",
"sha256": "e9eb2011ca2d5694c58c011690bf544d026e3a7c1c0c8de9bb37a18fa0cf8118",
"url": "https://download.jetbrains.com/ruby/RubyMine-2025.3.1.tar.gz",
"build_number": "253.29346.140"
},
"rust-rover": {
"url-template": "https://download.jetbrains.com/rustrover/RustRover-{version}.tar.gz",
"version": "2025.3.1",
"sha256": "5a1b34e10a1c59eee30694236baa8233c7787580769381be01b4ccb09618ec89",
"url": "https://download.jetbrains.com/rustrover/RustRover-2025.3.1.tar.gz",
"build_number": "253.29346.139"
},
"webstorm": {
"url-template": "https://download.jetbrains.com/webstorm/WebStorm-{version}.tar.gz",
"version": "2025.3.1",
"sha256": "08a851d216b741c49ebb6846e178fb823d329fe7b9824a2134b68c8fd25ba2ae",
"url": "https://download.jetbrains.com/webstorm/WebStorm-2025.3.1.tar.gz",
"build_number": "253.29346.143"
},
"writerside": {
"url-template": "https://download.jetbrains.com/writerside/writerside-{version}.tar.gz",
"version": "2024.3 EAP",
"sha256": "d49e58020d51ec4ccdbdffea5d42b5a2d776a809fc00789cef5abda7b23bd3f6",
"url": "https://download.jetbrains.com/writerside/writerside-243.22562.371.tar.gz",
"build_number": "243.22562.371"
}
},
"aarch64-linux": {
"aqua": {
"url-template": "https://download.jetbrains.com/aqua/aqua-{version}-aarch64.tar.gz",
"version": "2024.3.2",
"sha256": "d2a3c781756a83ccea63dc6d9aebf85f819de1edb5bcd4e5a1a161eaa0779c84",
"url": "https://download.jetbrains.com/aqua/aqua-2024.3.2-aarch64.tar.gz",
"build_number": "243.23654.154"
},
"clion": {
"url-template": "https://download.jetbrains.com/cpp/CLion-{version}-aarch64.tar.gz",
"version": "2025.3.1",
"sha256": "b96c38c3d2f7ff7b988d75c970fd0e90363e09b8273106defc9ae3defa868ed7",
"url": "https://download.jetbrains.com/cpp/CLion-2025.3.1-aarch64.tar.gz",
"build_number": "253.29346.141"
},
"datagrip": {
"url-template": "https://download.jetbrains.com/datagrip/datagrip-{version}-aarch64.tar.gz",
"version": "2025.3.2",
"sha256": "1a6feb3aa255dace332cc18b868593181b6ea62c3d9f0d36f90032ca0517d068",
"url": "https://download.jetbrains.com/datagrip/datagrip-2025.3.2-aarch64.tar.gz",
"build_number": "253.29346.170"
},
"dataspell": {
"url-template": "https://download.jetbrains.com/python/dataspell-{version}-aarch64.tar.gz",
"version": "2025.3.1",
"sha256": "40afd38cc704cdff2be89b9f0d67bdbcb1699d7b37b25d34d44d2d52ef6a46d3",
"url": "https://download.jetbrains.com/python/dataspell-2025.3.1-aarch64.tar.gz",
"build_number": "253.29346.157"
},
"gateway": {
"url-template": "https://download.jetbrains.com/idea/gateway/JetBrainsGateway-{version}-aarch64.tar.gz",
"version": "2025.3",
"sha256": "204ed3f7262877d0a46aaf30c5bafb7216b4e9736bebee71425c993c18486af8",
"url": "https://download.jetbrains.com/idea/gateway/JetBrainsGateway-2025.3-aarch64.tar.gz",
"build_number": "253.28294.342"
},
"goland": {
"url-template": "https://download.jetbrains.com/go/goland-{version}-aarch64.tar.gz",
"version": "2025.3",
"sha256": "c530dd4bcc7a075a040b64859ecb34142c8fc0399625c5a13ae2d7a8f5974340",
"url": "https://download.jetbrains.com/go/goland-2025.3-aarch64.tar.gz",
"build_number": "253.28294.337"
},
"idea-community": {
"url-template": "https://download.jetbrains.com/idea/ideaIC-{version}-aarch64.tar.gz",
"version": "2025.2.5",
"sha256": "4c57a783f31ee6f2c82d8c43bb5d0334a9afbc8bfb4542e732048c41f61e63a0",
"url": "https://download.jetbrains.com/idea/ideaIC-2025.2.5-aarch64.tar.gz",
"build_number": "252.28238.7"
},
"idea": {
"url-template": "https://download.jetbrains.com/idea/ideaIU-{version}-aarch64.tar.gz",
"version": "2025.3.1",
"sha256": "095711329d1e9c14641ba426e652d4dbd3885b27c9a046e44725ae677491e8c3",
"url": "https://download.jetbrains.com/idea/ideaIU-2025.3.1-aarch64.tar.gz",
"build_number": "253.29346.138"
},
"mps": {
"url-template": "https://download.jetbrains.com/mps/{versionMajorMinor}/MPS-{version}.tar.gz",
"version": "2025.3",
"sha256": "c4023e52b4e17824d61d2768238619be14e5ae5735db533e3951647f377b6b79",
"url": "https://download.jetbrains.com/mps/2025.3/MPS-2025.3.tar.gz",
"build_number": "253.28294.432"
},
"phpstorm": {
"url-template": "https://download.jetbrains.com/webide/PhpStorm-{version}-aarch64.tar.gz",
"version": "2025.3.1",
"sha256": "7648667f85b4c45928b04d4c26f22882a8aa65a787a64fa2f7affe51a1bc2a61",
"url": "https://download.jetbrains.com/webide/PhpStorm-2025.3.1-aarch64.tar.gz",
"build_number": "253.29346.151",
"version-major-minor": "2022.3"
},
"pycharm-community": {
"url-template": "https://download.jetbrains.com/python/pycharm-community-{version}-aarch64.tar.gz",
"version": "2025.2.5",
"sha256": "67b61a3e788b043d93b3cc3e0dd3cea350e6d170402fd94adaf792cfc57e5462",
"url": "https://download.jetbrains.com/python/pycharm-community-2025.2.5-aarch64.tar.gz",
"build_number": "252.28238.29"
},
"pycharm": {
"url-template": "https://download.jetbrains.com/python/pycharm-{version}-aarch64.tar.gz",
"version": "2025.3.1",
"sha256": "2b6f5a430132773ea7caf3046f7763ea7a031dbfab6e1be72bdc86f3cc7a758b",
"url": "https://download.jetbrains.com/python/pycharm-2025.3.1-aarch64.tar.gz",
"build_number": "253.29346.142"
},
"rider": {
"url-template": "https://download.jetbrains.com/rider/JetBrains.Rider-{version}-aarch64.tar.gz",
"version": "2025.3.1",
"sha256": "19080fcdc48fa0f743ed60927b71975a3c478b805296161cfd8a0aa2c04c8f52",
"url": "https://download.jetbrains.com/rider/JetBrains.Rider-2025.3.1-aarch64.tar.gz",
"build_number": "253.29346.144"
},
"ruby-mine": {
"url-template": "https://download.jetbrains.com/ruby/RubyMine-{version}-aarch64.tar.gz",
"version": "2025.3.1",
"sha256": "bf603c6a1ba1e618afdb70589648447cfce53b4daa7a0cc68073c1b77e727d55",
"url": "https://download.jetbrains.com/ruby/RubyMine-2025.3.1-aarch64.tar.gz",
"build_number": "253.29346.140"
},
"rust-rover": {
"url-template": "https://download.jetbrains.com/rustrover/RustRover-{version}-aarch64.tar.gz",
"version": "2025.3.1",
"sha256": "fb0f81c9d2a2a604718484954b261a642be9ed6f51de98fcdc6cedb32b0a4c9e",
"url": "https://download.jetbrains.com/rustrover/RustRover-2025.3.1-aarch64.tar.gz",
"build_number": "253.29346.139"
},
"webstorm": {
"url-template": "https://download.jetbrains.com/webstorm/WebStorm-{version}-aarch64.tar.gz",
"version": "2025.3.1",
"sha256": "fd8bb3ee70c549165d9102437bca03e857fc147281c1d7382249d4690c31dd87",
"url": "https://download.jetbrains.com/webstorm/WebStorm-2025.3.1-aarch64.tar.gz",
"build_number": "253.29346.143"
},
"writerside": {
"url-template": "https://download.jetbrains.com/writerside/writerside-{version}-aarch64.tar.gz",
"version": "2024.3 EAP",
"sha256": "6067f6f73c4a178e2d0ae42bd18669045d85b5b5ed2c9115c2488ba7aa2a3d88",
"url": "https://download.jetbrains.com/writerside/writerside-243.22562.371-aarch64.tar.gz",
"build_number": "243.22562.371"
}
},
"x86_64-darwin": {
"aqua": {
"url-template": "https://download.jetbrains.com/aqua/aqua-{version}.dmg",
"version": "2024.3.2",
"sha256": "423d492e9849beb7edbbd1771650a04e8df9f469bf1789b41bc5878c84cee393",
"url": "https://download.jetbrains.com/aqua/aqua-2024.3.2.dmg",
"build_number": "243.23654.154"
},
"clion": {
"url-template": "https://download.jetbrains.com/cpp/CLion-{version}.dmg",
"version": "2025.3.1",
"sha256": "9a8174c9229f9c86f86da1a8e2bdab52ffb369ea0781b57eb245703ebc8307e2",
"url": "https://download.jetbrains.com/cpp/CLion-2025.3.1.dmg",
"build_number": "253.29346.141"
},
"datagrip": {
"url-template": "https://download.jetbrains.com/datagrip/datagrip-{version}.dmg",
"version": "2025.3.2",
"sha256": "0383a0a4f2fde583b62ea7d342e5718b0fa306fc8349541c75bec5ae841fb4fc",
"url": "https://download.jetbrains.com/datagrip/datagrip-2025.3.2.dmg",
"build_number": "253.29346.170"
},
"dataspell": {
"url-template": "https://download.jetbrains.com/python/dataspell-{version}.dmg",
"version": "2025.3.1",
"sha256": "388d956dd6243697a162c062c76b2fee4098f4f3405badb07a69ce6df7de6017",
"url": "https://download.jetbrains.com/python/dataspell-2025.3.1.dmg",
"build_number": "253.29346.157"
},
"gateway": {
"url-template": "https://download.jetbrains.com/idea/gateway/JetBrainsGateway-{version}.dmg",
"version": "2025.3",
"sha256": "282fd7f302d95adeed022f8d6c679d3292778f96205394af52dd090f6201f338",
"url": "https://download.jetbrains.com/idea/gateway/JetBrainsGateway-2025.3.dmg",
"build_number": "253.28294.342"
},
"goland": {
"url-template": "https://download.jetbrains.com/go/goland-{version}.dmg",
"version": "2025.3",
"sha256": "e1df4f10b158c7788736559666244e994500a40db5b08661e2691357d269dbf4",
"url": "https://download.jetbrains.com/go/goland-2025.3.dmg",
"build_number": "253.28294.337"
},
"idea-community": {
"url-template": "https://download.jetbrains.com/idea/ideaIC-{version}.dmg",
"version": "2025.2.5",
"sha256": "ff48a1e60869342a91db867fa482a49d4cdf38476496911c109f34a7e8d6523d",
"url": "https://download.jetbrains.com/idea/ideaIC-2025.2.5.dmg",
"build_number": "252.28238.7"
},
"idea": {
"url-template": "https://download.jetbrains.com/idea/ideaIU-{version}.dmg",
"version": "2025.3.1",
"sha256": "adf5af3839e07ba6387bf0eca94df2f44c829023a1898170eacbc5cbafce0393",
"url": "https://download.jetbrains.com/idea/ideaIU-2025.3.1.dmg",
"build_number": "253.29346.138"
},
"mps": {
"url-template": "https://download.jetbrains.com/mps/{versionMajorMinor}/MPS-{version}-macos.dmg",
"version": "2025.3",
"sha256": "c216008ca905efd9ab9271df9599ef38ecb66cba2c61482e7a56434ae3eddee6",
"url": "https://download.jetbrains.com/mps/2025.3/MPS-2025.3-macos.dmg",
"build_number": "253.28294.432"
},
"phpstorm": {
"url-template": "https://download.jetbrains.com/webide/PhpStorm-{version}.dmg",
"version": "2025.3.1",
"sha256": "11988bcee5d94b271ea67aeacd3e836029595a6cfebfec2659565fc18a4ad2d1",
"url": "https://download.jetbrains.com/webide/PhpStorm-2025.3.1.dmg",
"build_number": "253.29346.151",
"version-major-minor": "2022.3"
},
"pycharm-community": {
"url-template": "https://download.jetbrains.com/python/pycharm-community-{version}.dmg",
"version": "2025.2.5",
"sha256": "08ba97a278031ff1942ddefb18d8acf7582f0bb4a28ccdf5d65721bfb80ca456",
"url": "https://download.jetbrains.com/python/pycharm-community-2025.2.5.dmg",
"build_number": "252.28238.29"
},
"pycharm": {
"url-template": "https://download.jetbrains.com/python/pycharm-{version}.dmg",
"version": "2025.3.1",
"sha256": "586c9eed67da609fc1e565a8bfc36eb155b23e5483d5dc6e9dcf8b5540f47fa5",
"url": "https://download.jetbrains.com/python/pycharm-2025.3.1.dmg",
"build_number": "253.29346.142"
},
"rider": {
"url-template": "https://download.jetbrains.com/rider/JetBrains.Rider-{version}.dmg",
"version": "2025.3.1",
"sha256": "addd816dbdf130e2ef5e7dc184d7a8087f8bfbf6eba4e32ead2452069a49607d",
"url": "https://download.jetbrains.com/rider/JetBrains.Rider-2025.3.1.dmg",
"build_number": "253.29346.144"
},
"ruby-mine": {
"url-template": "https://download.jetbrains.com/ruby/RubyMine-{version}.dmg",
"version": "2025.3.1",
"sha256": "4fce84983a6ace16d8479150b765280250a260b3d24fb37258d114000c6c1115",
"url": "https://download.jetbrains.com/ruby/RubyMine-2025.3.1.dmg",
"build_number": "253.29346.140"
},
"rust-rover": {
"url-template": "https://download.jetbrains.com/rustrover/RustRover-{version}.dmg",
"version": "2025.3.1",
"sha256": "3899875452a5182db93b132c00dbc84394ffb637430b97f2390be8abb0412537",
"url": "https://download.jetbrains.com/rustrover/RustRover-2025.3.1.dmg",
"build_number": "253.29346.139"
},
"webstorm": {
"url-template": "https://download.jetbrains.com/webstorm/WebStorm-{version}.dmg",
"version": "2025.3.1",
"sha256": "a6cb906562f95b37e9c1e34c9bd9561dea653a726c95d02bfa957acbe909b88d",
"url": "https://download.jetbrains.com/webstorm/WebStorm-2025.3.1.dmg",
"build_number": "253.29346.143"
},
"writerside": {
"url-template": "https://download.jetbrains.com/writerside/writerside-{version}.dmg",
"version": "2024.3 EAP",
"sha256": "0c78b8035497c855aea5666256716778abd46dadf68f51e4f91c0db01f62b280",
"url": "https://download.jetbrains.com/writerside/writerside-243.22562.371.dmg",
"build_number": "243.22562.371"
}
},
"aarch64-darwin": {
"aqua": {
"url-template": "https://download.jetbrains.com/aqua/aqua-{version}-aarch64.dmg",
"version": "2024.3.2",
"sha256": "43974cdbbb71aaf5bfcfaf2cfd0e69e9920dda3973e64671936c1d52b267494d",
"url": "https://download.jetbrains.com/aqua/aqua-2024.3.2-aarch64.dmg",
"build_number": "243.23654.154"
},
"clion": {
"url-template": "https://download.jetbrains.com/cpp/CLion-{version}-aarch64.dmg",
"version": "2025.3.1",
"sha256": "11cae8aeb43d1870d96980f1d927ff545fabed989f3bf4e7327911b441e149f1",
"url": "https://download.jetbrains.com/cpp/CLion-2025.3.1-aarch64.dmg",
"build_number": "253.29346.141"
},
"datagrip": {
"url-template": "https://download.jetbrains.com/datagrip/datagrip-{version}-aarch64.dmg",
"version": "2025.3.2",
"sha256": "a7224548dc9da3863727b0c11cef9d613fd951d16baa016ca1407c56a9ec6964",
"url": "https://download.jetbrains.com/datagrip/datagrip-2025.3.2-aarch64.dmg",
"build_number": "253.29346.170"
},
"dataspell": {
"url-template": "https://download.jetbrains.com/python/dataspell-{version}-aarch64.dmg",
"version": "2025.3.1",
"sha256": "fe0d8ef15e6e36af0ea4361bd474f204ee5c307ef90af8ec833976a1dae5a5a3",
"url": "https://download.jetbrains.com/python/dataspell-2025.3.1-aarch64.dmg",
"build_number": "253.29346.157"
},
"gateway": {
"url-template": "https://download.jetbrains.com/idea/gateway/JetBrainsGateway-{version}-aarch64.dmg",
"version": "2025.3",
"sha256": "b10cabda93c88d27bcc135a44a1fd98fe60fe8305606d6e75a0d5b736f0df274",
"url": "https://download.jetbrains.com/idea/gateway/JetBrainsGateway-2025.3-aarch64.dmg",
"build_number": "253.28294.342"
},
"goland": {
"url-template": "https://download.jetbrains.com/go/goland-{version}-aarch64.dmg",
"version": "2025.3",
"sha256": "d4ee20b5c3df6151d366d6cc9b06b915499ff0c1eb1184aab53a01078908ec89",
"url": "https://download.jetbrains.com/go/goland-2025.3-aarch64.dmg",
"build_number": "253.28294.337"
},
"idea-community": {
"url-template": "https://download.jetbrains.com/idea/ideaIC-{version}-aarch64.dmg",
"version": "2025.2.5",
"sha256": "52065492d433f0ea9df4debd5f0683154ab4dab5846394cabc8a49903d70e5bc",
"url": "https://download.jetbrains.com/idea/ideaIC-2025.2.5-aarch64.dmg",
"build_number": "252.28238.7"
},
"idea": {
"url-template": "https://download.jetbrains.com/idea/ideaIU-{version}-aarch64.dmg",
"version": "2025.3.1",
"sha256": "2137863cc3a5f4acd25ba38a82e004e935d3a94fa566f8e3851d6b8a8ac12777",
"url": "https://download.jetbrains.com/idea/ideaIU-2025.3.1-aarch64.dmg",
"build_number": "253.29346.138"
},
"mps": {
"url-template": "https://download.jetbrains.com/mps/{versionMajorMinor}/MPS-{version}-macos-aarch64.dmg",
"version": "2025.3",
"url": "https://download.jetbrains.com/mps/2025.3/MPS-2025.3-macos-aarch64.dmg",
"sha256": "dc79c41ce851448f4862306173914eee1e63e230410ed65356498efd2d5f0444",
"build_number": "253.28294.432"
},
"phpstorm": {
"url-template": "https://download.jetbrains.com/webide/PhpStorm-{version}-aarch64.dmg",
"version": "2025.3.1",
"sha256": "0453e0a6ee86c3cbf97b8c48f2826751d8085bf8211b541a04752621c5af16bc",
"url": "https://download.jetbrains.com/webide/PhpStorm-2025.3.1-aarch64.dmg",
"build_number": "253.29346.151",
"version-major-minor": "2022.3"
},
"pycharm-community": {
"url-template": "https://download.jetbrains.com/python/pycharm-community-{version}-aarch64.dmg",
"version": "2025.2.5",
"sha256": "040a4ed6bb7563972d844c450f615d0d11385e524fbbfdbfc9fc68d78811e994",
"url": "https://download.jetbrains.com/python/pycharm-community-2025.2.5-aarch64.dmg",
"build_number": "252.28238.29"
},
"pycharm": {
"url-template": "https://download.jetbrains.com/python/pycharm-{version}-aarch64.dmg",
"version": "2025.3.1",
"sha256": "ec8e97856f00da902020c72b0f079cc10983de6bb4438292ea5faa1e5b0cb935",
"url": "https://download.jetbrains.com/python/pycharm-2025.3.1-aarch64.dmg",
"build_number": "253.29346.142"
},
"rider": {
"url-template": "https://download.jetbrains.com/rider/JetBrains.Rider-{version}-aarch64.dmg",
"version": "2025.3.1",
"sha256": "d7080323412900f5d37270233e5a4c773011c6853d6031ce1f5e635c77511426",
"url": "https://download.jetbrains.com/rider/JetBrains.Rider-2025.3.1-aarch64.dmg",
"build_number": "253.29346.144"
},
"ruby-mine": {
"url-template": "https://download.jetbrains.com/ruby/RubyMine-{version}-aarch64.dmg",
"version": "2025.3.1",
"sha256": "67f1aa674b90ec54ba21f3523ad940218f979befd7429e38ad822bc8146d16a4",
"url": "https://download.jetbrains.com/ruby/RubyMine-2025.3.1-aarch64.dmg",
"build_number": "253.29346.140"
},
"rust-rover": {
"url-template": "https://download.jetbrains.com/rustrover/RustRover-{version}-aarch64.dmg",
"version": "2025.3.1",
"sha256": "103a12ed1c37b6b38cff5d637e7dc7b8dcc78f5c576ba38b8f862c6ba3647d52",
"url": "https://download.jetbrains.com/rustrover/RustRover-2025.3.1-aarch64.dmg",
"build_number": "253.29346.139"
},
"webstorm": {
"url-template": "https://download.jetbrains.com/webstorm/WebStorm-{version}-aarch64.dmg",
"version": "2025.3.1",
"sha256": "1c21990cee2bbbffdd8f6c90e8071bc03ec7fe5a3662e51931c15222d4b7ccb2",
"url": "https://download.jetbrains.com/webstorm/WebStorm-2025.3.1-aarch64.dmg",
"build_number": "253.29346.143"
},
"writerside": {
"url-template": "https://download.jetbrains.com/writerside/writerside-{version}-aarch64.dmg",
"version": "2024.3 EAP",
"sha256": "9d86ef50b4c6d2a07d236219e9b05c0557241fb017d52ac395719bdb425130f5",
"url": "https://download.jetbrains.com/writerside/writerside-243.22562.371-aarch64.dmg",
"build_number": "243.22562.371"
}
}
}
@@ -1,3 +1,8 @@
# Darwin-specific base builder.
# TODO:
# This actually just ignores a lot of options passed to it... (e.g. buildInputs)
# - not entirely sure how this hasn't caused big problems yet.
{
lib,
stdenvNoCC,
@@ -9,13 +14,14 @@
meta,
pname,
product,
productShort ? product,
productShort,
src,
version,
passthru,
plugins ? [ ],
buildNumber,
...
}@args:
}:
let
loname = lib.toLower productShort;
@@ -26,10 +32,8 @@ stdenvNoCC.mkDerivation {
src
version
plugins
passthru
;
passthru.buildNumber = buildNumber;
passthru.product = product;
passthru.tests = args.passthru.tests;
meta = meta // {
mainProgram = loname;
};
@@ -0,0 +1,87 @@
# Builder for JetBrains IDEs (`mkJetBrainsProduct`)
{
lib,
stdenv,
callPackage,
jdk,
fontconfig,
libGL,
libX11,
vmopts ? null,
forceWayland ? false,
}:
let
baseBuilder = if stdenv.hostPlatform.isDarwin then ./darwin.nix else ./linux.nix;
mkJetBrainsProductCore = callPackage baseBuilder { inherit vmopts; };
in
# Makes a JetBrains IDE
{
pname,
src,
version,
buildNumber,
wmClass,
product,
productShort ? product,
meta,
libdbm,
fsnotifier,
extraWrapperArgs ? [ ],
extraLdPath ? [ ],
buildInputs ? [ ],
passthru ? { },
}:
mkJetBrainsProductCore {
inherit
pname
extraLdPath
jdk
src
version
buildNumber
wmClass
product
productShort
libdbm
fsnotifier
;
buildInputs =
buildInputs
++ [ stdenv.cc.cc ]
++ lib.optionals stdenv.hostPlatform.isLinux [
fontconfig
libGL
libX11
];
extraWrapperArgs =
extraWrapperArgs
++ lib.optionals (stdenv.hostPlatform.isLinux && forceWayland) [
''--add-flags "\''${WAYLAND_DISPLAY:+-Dawt.toolkit.name=WLToolkit}"''
];
passthru = lib.recursiveUpdate passthru {
inherit
buildNumber
product
libdbm
fsnotifier
;
updateScript = ../updater/main.py;
tests = {
plugins = callPackage ../plugins/tests.nix { ideName = pname; };
};
};
meta = meta // {
teams = [ lib.teams.jetbrains ];
};
}
@@ -1,3 +1,5 @@
# Linux-specific base builder.
{
stdenv,
lib,
@@ -23,18 +25,20 @@
{
pname,
product,
productShort ? product,
productShort,
version,
src,
wmClass,
buildNumber,
jdk,
meta,
passthru,
libdbm,
fsnotifier,
extraLdPath ? [ ],
extraWrapperArgs ? [ ],
extraBuildInputs ? [ ],
buildInputs ? [ ],
...
}@args:
@@ -47,13 +51,18 @@ in
with stdenv;
lib.makeOverridable mkDerivation (
rec {
inherit pname version src;
passthru.buildNumber = buildNumber;
passthru.tests = args.passthru.tests;
inherit
pname
version
src
buildInputs
passthru
;
meta = args.meta // {
mainProgram = pname;
};
# FIXME: Do not use meta attributes, see README (`TODO` section)
desktopItem = makeDesktopItem {
name = pname;
exec = pname;
@@ -74,7 +83,6 @@ lib.makeOverridable mkDerivation (
unzip
autoPatchelfHook
];
buildInputs = extraBuildInputs;
postPatch = ''
rm -rf jbr
+75 -357
View File
@@ -1,165 +1,60 @@
let
# `ides.json` is handwritten and contains information that doesn't change across updates, like maintainers and other metadata
# `versions.json` contains everything generated/needed by the update script version numbers, build numbers and tarball hashes
ideInfo = builtins.fromJSON (builtins.readFile ./ides.json);
versions = builtins.fromJSON (builtins.readFile ./bin/versions.json);
in
{
config,
lib,
config,
stdenv,
callPackage,
fetchurl,
python3,
jdk,
zlib,
python3,
lldb,
dotnetCorePackages,
maven,
openssl,
expat,
libxcrypt,
libxcrypt-legacy,
fontconfig,
libxml2,
runCommand,
musl,
R,
libgcc,
lttng-ust_2_12,
xz,
xorg,
libGL,
libICE,
libSM,
libX11,
vmopts ? null,
forceWayland ? false,
}:
let
inherit (stdenv.hostPlatform) system;
mkJetBrainsProduct = callPackage ./builder/default.nix { inherit jdk forceWayland vmopts; };
mkJetBrainsSource = callPackage ./source/build.nix { };
products = versions.${system} or (throw "Unsupported system: ${system}");
mkSrcIde =
path: extras: callPackage path ({ inherit mkJetBrainsProduct mkJetBrainsSource; } // extras);
dotnet-sdk = dotnetCorePackages.sdk_10_0-source;
_idea-oss = mkSrcIde ./ides/idea-oss.nix { };
package = if stdenv.hostPlatform.isDarwin then ./bin/darwin.nix else ./bin/linux.nix;
mkJetBrainsProductCore = callPackage package { inherit vmopts; };
mkMeta = meta: fromSource: {
inherit (meta) homepage longDescription;
description =
meta.description
+ lib.optionalString meta.isOpenSource (
if fromSource then " (built from source)" else " (patched binaries from jetbrains)"
);
maintainers = map (x: lib.maintainers."${x}") meta.maintainers;
teams = [ lib.teams.jetbrains ];
license = if meta.isOpenSource then lib.licenses.asl20 else lib.licenses.unfree;
sourceProvenance =
if fromSource then
[ lib.sourceTypes.fromSource ]
else
(
if stdenv.hostPlatform.isDarwin then
[ lib.sourceTypes.binaryNativeCode ]
else
[ lib.sourceTypes.binaryBytecode ]
);
};
# The binary builds use the same libdbm and fsnotifier as the current idea-oss source build.
mkBinIde =
path: extras:
callPackage path (
{
inherit mkJetBrainsProduct;
libdbm = _idea-oss.libdbm;
fsnotifier = _idea-oss.fsnotifier;
}
// extras
);
mkJetBrainsProduct =
{
pname,
fromSource ? false,
extraWrapperArgs ? [ ],
extraLdPath ? [ ],
extraBuildInputs ? [ ],
extraTests ? { },
}:
mkJetBrainsProductCore {
inherit
pname
extraLdPath
jdk
;
extraBuildInputs =
extraBuildInputs
++ [ stdenv.cc.cc ]
++ lib.optionals stdenv.hostPlatform.isLinux [
fontconfig
libGL
libX11
# Common build overrides, fixes, etc.
# TODO: These should eventually be moved outside of this file
pyCharmCommonOverrides = (
finalAttrs: previousAttrs:
lib.optionalAttrs stdenv.hostPlatform.isLinux {
buildInputs =
with python3.pkgs;
(previousAttrs.buildInputs or [ ])
++ [
python3
setuptools
];
extraWrapperArgs =
extraWrapperArgs
++ lib.optionals (stdenv.hostPlatform.isLinux && forceWayland) [
''--add-flags "\''${WAYLAND_DISPLAY:+-Dawt.toolkit.name=WLToolkit}"''
];
src =
if fromSource then
communitySources."${pname}"
preInstall = ''
echo "compiling cython debug speedups"
if [[ -d plugins/python-ce ]]; then
${python3.interpreter} plugins/python-ce/helpers/pydev/setup_cython.py build_ext --inplace
else
fetchurl {
url = products."${pname}".url;
sha256 = products."${pname}".sha256;
};
version = if fromSource then communitySources."${pname}".version else products."${pname}".version;
buildNumber =
if fromSource then communitySources."${pname}".buildNumber else products."${pname}".build_number;
inherit (ideInfo."${pname}") wmClass product;
productShort = ideInfo."${pname}".productShort or ideInfo."${pname}".product;
meta = mkMeta ideInfo."${pname}".meta fromSource;
passthru.tests = extraTests // {
plugins = callPackage ./plugins/tests.nix { ideName = pname; };
};
libdbm = communitySources."${pname}".libdbm or communitySources.idea-oss.libdbm;
fsnotifier = communitySources."${pname}".fsnotifier or communitySources.idea-oss.fsnotifier;
};
communitySources = callPackage ./source { };
buildIdea =
args:
mkJetBrainsProduct (
args
// {
extraLdPath = [ zlib ];
extraWrapperArgs = [
''--set M2_HOME "${maven}/maven"''
''--set M2 "${maven}/maven/bin"''
];
}
);
buildPycharm =
args:
(mkJetBrainsProduct args).overrideAttrs (
finalAttrs: previousAttrs:
lib.optionalAttrs stdenv.hostPlatform.isLinux {
buildInputs =
with python3.pkgs;
(previousAttrs.buildInputs or [ ])
++ [
python3
setuptools
];
preInstall = ''
echo "compiling cython debug speedups"
if [[ -d plugins/python-ce ]]; then
${python3.interpreter} plugins/python-ce/helpers/pydev/setup_cython.py build_ext --inplace
else
${python3.interpreter} plugins/python/helpers/pydev/setup_cython.py build_ext --inplace
fi
'';
# See https://www.jetbrains.com/help/pycharm/2022.1/cython-speedups.html
}
);
${python3.interpreter} plugins/python/helpers/pydev/setup_cython.py build_ext --inplace
fi
'';
# See https://www.jetbrains.com/help/pycharm/2022.1/cython-speedups.html
}
);
patchSharedLibs = lib.optionalString stdenv.hostPlatform.isLinux ''
ls -d \
$out/*/bin/*/linux/*/lib/liblldb.so \
@@ -174,203 +69,27 @@ let
--replace-needed libcrypt.so.1 libcrypt.so \
${lib.optionalString stdenv.hostPlatform.isAarch "--replace-needed libxml2.so.2 libxml2.so"}
'';
# TODO: These can be moved down again when we don't need the aliases anymore:
_idea = buildIdea {
pname = "idea";
extraBuildInputs = [
lldb
musl
];
};
_idea-oss = buildIdea {
pname = "idea-oss";
fromSource = true;
};
_pycharm = buildPycharm {
pname = "pycharm";
extraBuildInputs = [ musl ];
};
_pycharm-oss = buildPycharm {
pname = "pycharm-oss";
fromSource = true;
};
in
{
# Sorted alphabetically. Deprecated products and aliases are at the very end.
clion =
(mkJetBrainsProduct {
pname = "clion";
extraBuildInputs =
lib.optionals stdenv.hostPlatform.isLinux [
python3
openssl
libxcrypt-legacy
lttng-ust_2_12
musl
]
++ lib.optionals (stdenv.hostPlatform.isLinux && stdenv.hostPlatform.isAarch) [
expat
libxml2
xz
];
}).overrideAttrs
(attrs: {
postInstall =
(attrs.postInstall or "")
+ lib.optionalString stdenv.hostPlatform.isLinux ''
for dir in $out/clion/plugins/clion-radler/DotFiles/linux-*; do
rm -rf $dir/dotnet
ln -s ${dotnet-sdk}/share/dotnet $dir/dotnet
done
'';
postFixup = ''
${attrs.postFixup or ""}
${patchSharedLibs}
'';
});
datagrip = mkJetBrainsProduct {
pname = "datagrip";
};
dataspell =
let
libr = runCommand "libR" { } ''
mkdir -p $out/lib
ln -s ${R}/lib/R/lib/libR.so $out/lib/libR.so
'';
in
mkJetBrainsProduct {
pname = "dataspell";
extraBuildInputs = [
libgcc
libr
];
};
gateway = mkJetBrainsProduct {
pname = "gateway";
extraBuildInputs = [ libgcc ];
};
goland =
(mkJetBrainsProduct {
pname = "goland";
extraWrapperArgs = [
# fortify source breaks build since delve compiles with -O0
''--prefix CGO_CPPFLAGS " " "-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0"''
];
extraBuildInputs = [
libgcc
];
}).overrideAttrs
(attrs: {
postFixup =
(attrs.postFixup or "")
+ lib.optionalString stdenv.hostPlatform.isLinux ''
interp="$(cat $NIX_CC/nix-support/dynamic-linker)"
patchelf --set-interpreter $interp $out/goland/plugins/go-plugin/lib/dlv/linux/dlv
chmod +x $out/goland/plugins/go-plugin/lib/dlv/linux/dlv
'';
});
idea = _idea;
clion = mkBinIde ./ides/clion.nix { inherit patchSharedLibs; };
datagrip = mkBinIde ./ides/datagrip.nix { };
dataspell = mkBinIde ./ides/dataspell.nix { };
gateway = mkBinIde ./ides/gateway.nix { };
goland = mkBinIde ./ides/goland.nix { };
idea = mkBinIde ./ides/idea.nix { };
idea-oss = _idea-oss;
mps = mkJetBrainsProduct { pname = "mps"; };
phpstorm = mkJetBrainsProduct {
pname = "phpstorm";
extraBuildInputs = [
musl
];
};
pycharm = _pycharm;
pycharm-oss = _pycharm-oss;
rider =
(mkJetBrainsProduct {
pname = "rider";
extraBuildInputs = [
openssl
libxcrypt
lttng-ust_2_12
musl
]
++ lib.optionals stdenv.hostPlatform.isLinux [
xorg.xcbutilkeysyms
]
++ lib.optionals (stdenv.hostPlatform.isLinux && stdenv.hostPlatform.isAarch) [
expat
libxml2
xz
];
extraLdPath = lib.optionals (stdenv.hostPlatform.isLinux) [
# Avalonia dependencies needed for dotMemory
libICE
libSM
libX11
];
}).overrideAttrs
(attrs: {
postInstall =
(attrs.postInstall or "")
+ lib.optionalString stdenv.hostPlatform.isLinux ''
${patchSharedLibs}
for dir in $out/rider/lib/ReSharperHost/linux-*; do
rm -rf $dir/dotnet
ln -s ${dotnet-sdk}/share/dotnet $dir/dotnet
done
'';
});
ruby-mine = mkJetBrainsProduct {
pname = "ruby-mine";
extraBuildInputs = [
musl
];
};
rust-rover =
(mkJetBrainsProduct {
pname = "rust-rover";
extraBuildInputs =
lib.optionals stdenv.hostPlatform.isLinux [
python3
openssl
libxcrypt-legacy
]
++ lib.optionals (stdenv.hostPlatform.isLinux && stdenv.hostPlatform.isAarch) [
expat
libxml2
xz
];
}).overrideAttrs
(attrs: {
postFixup = ''
${attrs.postFixup or ""}
${patchSharedLibs}
'';
});
webstorm = mkJetBrainsProduct {
pname = "webstorm";
extraBuildInputs = [
musl
];
};
mps = mkBinIde ./ides/mps.nix { };
phpstorm = mkBinIde ./ides/phpstorm.nix { };
pycharm = mkBinIde ./ides/pycharm.nix { inherit pyCharmCommonOverrides; };
pycharm-oss = mkSrcIde ./ides/pycharm-oss.nix { inherit pyCharmCommonOverrides; };
rider = mkBinIde ./ides/rider.nix { inherit patchSharedLibs; };
ruby-mine = mkBinIde ./ides/ruby-mine.nix { };
rust-rover = mkBinIde ./ides/rust-rover.nix { inherit patchSharedLibs; };
webstorm = mkBinIde ./ides/webstorm.nix { };
# Plugins
plugins = callPackage ./plugins { };
}
// lib.optionalAttrs config.allowAliases rec {
@@ -380,12 +99,7 @@ in
aqua =
lib.warnOnInstantiate
"jetbrains.aqua: Aqua has been discontinued by Jetbrains and is not receiving updates. It will be removed in NixOS 26.05."
(mkJetBrainsProduct {
pname = "aqua";
extraBuildInputs = [
lldb
];
});
(mkBinIde ./ides/aqua.nix { });
idea-community =
lib.warnOnInstantiate
@@ -400,37 +114,41 @@ in
idea-community-bin =
lib.warnOnInstantiate
"jetbrains.idea-community-bin: IntelliJ IDEA Community has been discontinued by Jetbrains. This binary build is no longer updated. Switch to 'jetbrains.idea-oss' for open source builds (from source) or 'jetbrains.idea' for commercial builds (binary, unfree). See: https://blog.jetbrains.com/idea/2025/07/intellij-idea-unified-distribution-plan/"
(buildIdea {
pname = "idea-community";
});
(mkBinIde ./ides/idea-community.nix { });
idea-ultimate = lib.warnOnInstantiate "'jetbrains.idea-ultimate' has been renamed to/replaced by 'jetbrains.idea'" _idea;
idea-ultimate =
lib.warnOnInstantiate "'jetbrains.idea-ultimate' has been renamed to/replaced by 'jetbrains.idea'"
(mkBinIde ./ides/idea.nix { });
idea-community-src = lib.warnOnInstantiate "jetbrains.idea-community-src: IntelliJ IDEA Community has been discontinued by Jetbrains. This is now an alias for 'jetbrains.idea-oss', the Open Source build of IntelliJ. See: https://blog.jetbrains.com/idea/2025/07/intellij-idea-unified-distribution-plan/" _idea-oss;
pycharm-community =
lib.warnOnInstantiate
"pycharm-comminity: PyCharm Community has been discontinued by Jetbrains. This deprecated alias uses the, no longer updated, binary build on Darwin. On Linux it uses PyCharm Open Source, built from source. Either switch to 'jetbrains.pycharm-oss' or 'jetbrains.pycharm'. See: https://blog.jetbrains.com/pycharm/2025/04/pycharm-2025"
(if stdenv.hostPlatform.isDarwin then pycharm-community-bin else _pycharm-oss);
(
if stdenv.hostPlatform.isDarwin then
pycharm-community-bin
else
(mkSrcIde ./ides/pycharm-oss.nix { inherit pyCharmCommonOverrides; })
);
pycharm-community-bin =
lib.warnOnInstantiate
"pycharm-comminity-bin: PyCharm Community has been discontinued by Jetbrains. This binary build is no longer updated. Switch to 'jetbrains.pycharm-oss' for open source builds (from source) or 'jetbrains.pycharm' for commercial builds (binary, unfree). See: https://blog.jetbrains.com/pycharm/2025/04/pycharm-2025"
(buildPycharm {
pname = "pycharm-community";
});
(mkBinIde ./ides/pycharm-community.nix { inherit pyCharmCommonOverrides; });
pycharm-community-src = lib.warnOnInstantiate "jetbrains.idea-community-src: PyCharm Community has been discontinued by Jetbrains. This is now an alias for 'jetbrains.pycharm-oss', the Open Source build of PyCharm. See: https://blog.jetbrains.com/pycharm/2025/04/pycharm-2025" _pycharm-oss;
pycharm-community-src =
lib.warnOnInstantiate
"jetbrains.idea-community-src: PyCharm Community has been discontinued by Jetbrains. This is now an alias for 'jetbrains.pycharm-oss', the Open Source build of PyCharm. See: https://blog.jetbrains.com/pycharm/2025/04/pycharm-2025"
(mkSrcIde ./ides/pycharm-oss.nix { inherit pyCharmCommonOverrides; });
pycharm-professional = lib.warnOnInstantiate "'jetbrains.pycharm-professional' has been renamed to/replaced by 'jetbrains.pycharm'" _pycharm;
pycharm-professional =
lib.warnOnInstantiate
"'jetbrains.pycharm-professional' has been renamed to/replaced by 'jetbrains.pycharm'"
(mkBinIde ./ides/pycharm.nix { inherit pyCharmCommonOverrides; });
writerside =
lib.warnOnInstantiate
"jetbrains.writerside: Writerside has been discontinued by Jetbrains and is not receiving updates. It will be removed in NixOS 26.05."
(mkJetBrainsProduct {
pname = "writerside";
extraBuildInputs = [
musl
];
});
(mkBinIde ./ides/writerside.nix { });
}
@@ -1,237 +0,0 @@
{
"aqua": {
"product": "Aqua",
"updateChannel": "Aqua RELEASE",
"wmClass": "jetbrains-aqua",
"meta": {
"isOpenSource": false,
"description": "Test automation IDE from JetBrains",
"maintainers": [ "remcoschrijver" ],
"longDescription": "Aqua is a test automation IDE from jetbrains that can deal with many languages and frameworks to improve your test workflows. Has support for popular testing frameworks like Selenium, Cypress, and Playwright.",
"homepage": "https://www.jetbrains.com/aqua/"
}
},
"clion": {
"product": "CLion",
"updateChannel": "CLion RELEASE",
"wmClass": "jetbrains-clion",
"meta": {
"isOpenSource": false,
"description": "C/C++ IDE from JetBrains",
"maintainers": [ "mic92", "tymscar" ],
"longDescription": "Enhancing productivity for every C and C++ developer on Linux, macOS and Windows.",
"homepage": "https://www.jetbrains.com/clion/"
}
},
"datagrip": {
"product": "DataGrip",
"updateChannel": "DataGrip RELEASE",
"wmClass": "jetbrains-datagrip",
"meta": {
"isOpenSource": false,
"description": "Database IDE from JetBrains",
"maintainers": [ ],
"longDescription": "DataGrip is a new IDE from JetBrains built for database admins. It allows you to quickly migrate and refactor relational databases, construct efficient, statically checked SQL queries and much more.",
"homepage": "https://www.jetbrains.com/datagrip/"
}
},
"dataspell": {
"product": "DataSpell",
"updateChannel": "DataSpell RELEASE",
"wmClass": "jetbrains-dataspell",
"meta": {
"isOpenSource": false,
"description": "Data science IDE from JetBrains",
"maintainers": [ "leona" ],
"longDescription": "DataSpell is a new IDE from JetBrains built for Data Scientists. Mainly it integrates Jupyter notebooks in the IntelliJ platform.",
"homepage": "https://www.jetbrains.com/dataspell/"
}
},
"gateway": {
"product": "JetBrains Gateway",
"updateChannel": "Gateway RELEASE",
"productShort": "Gateway",
"wmClass": "jetbrains-gateway",
"meta": {
"isOpenSource": false,
"description": "Remote development for JetBrains products",
"maintainers": [ ],
"longDescription": "JetBrains Gateway is a lightweight launcher that connects a remote server with your local machine, downloads necessary components on the backend, and opens your project in JetBrains Client.",
"homepage": "https://www.jetbrains.com/remote-development/gateway/"
}
},
"goland": {
"product": "Goland",
"updateChannel": "GoLand RELEASE",
"wmClass": "jetbrains-goland",
"meta": {
"isOpenSource": false,
"description": "Go IDE from JetBrains",
"maintainers": [ "tymscar" ],
"longDescription": "Goland is the codename for a new commercial IDE by JetBrains aimed at providing an ergonomic environment for Go development.\n The new IDE extends the IntelliJ platform with the coding assistance and tool integrations specific for the Go language",
"homepage": "https://www.jetbrains.com/go/"
}
},
"idea": {
"product": "IntelliJ IDEA",
"updateChannel": "IntelliJ IDEA RELEASE",
"productShort": "IDEA",
"wmClass": "jetbrains-idea",
"meta": {
"isOpenSource": false,
"description": "Java, Kotlin, Groovy and Scala IDE from Jetbrains",
"maintainers": [ "gytis-ivaskevicius", "tymscar" ],
"longDescription": "IDE for Java SE, Groovy & Scala development Powerful environment for building Google Android apps Integration with JUnit, TestNG, popular SCMs, Ant & Maven. Also known as IntelliJ.",
"homepage": "https://www.jetbrains.com/idea/"
}
},
"idea-community": {
"product": "IntelliJ IDEA CE",
"updateChannel": "IntelliJ IDEA RELEASE",
"productShort": "IDEA",
"wmClass": "jetbrains-idea-ce",
"meta": {
"isOpenSource": true,
"description": "Free Java, Kotlin, Groovy and Scala IDE from Jetbrains",
"maintainers": [ "gytis-ivaskevicius", "tymscar" ],
"longDescription": "IDE for Java SE, Groovy & Scala development Powerful environment for building Google Android apps Integration with JUnit, TestNG, popular SCMs, Ant & Maven. Also known as IntelliJ.",
"homepage": "https://www.jetbrains.com/idea/"
}
},
"idea-oss": {
"product": "IntelliJ IDEA Open Source",
"updateChannel": "IntelliJ IDEA RELEASE",
"productShort": "IDEA",
"wmClass": "jetbrains-idea-ce",
"meta": {
"isOpenSource": true,
"description": "Free Java, Kotlin, Groovy and Scala IDE from Jetbrains",
"maintainers": [ "gytis-ivaskevicius", "tymscar" ],
"longDescription": "IDE for Java SE, Groovy & Scala development Powerful environment for building Google Android apps Integration with JUnit, TestNG, popular SCMs, Ant & Maven. Also known as IntelliJ.",
"homepage": "https://www.jetbrains.com/idea/"
}
},
"mps": {
"product": "MPS",
"updateChannel": "MPS RELEASE",
"wmClass": "jetbrains-MPS",
"meta": {
"isOpenSource": false,
"description": "IDE for building domain-specific languages from JetBrains",
"maintainers": [ ],
"longDescription": "A metaprogramming system which uses projectional editing which allows users to overcome the limits of language parsers, and build DSL editors, such as ones with tables and diagrams.",
"homepage": "https://www.jetbrains.com/mps/"
}
},
"phpstorm": {
"product": "PhpStorm",
"updateChannel": "PhpStorm RELEASE",
"wmClass": "jetbrains-phpstorm",
"meta": {
"isOpenSource": false,
"description": "PHP IDE from JetBrains",
"maintainers": [ "dritter", "tymscar" ],
"longDescription": "PhpStorm provides an editor for PHP, HTML and JavaScript with on-the-fly code analysis, error prevention and automated refactorings for PHP and JavaScript code. ",
"homepage": "https://www.jetbrains.com/phpstorm/"
}
},
"pycharm": {
"product": "PyCharm",
"productShort": "PyCharm",
"updateChannel": "PyCharm RELEASE",
"wmClass": "jetbrains-pycharm",
"meta": {
"isOpenSource": false,
"description": "Python IDE from JetBrains",
"maintainers": [ "genericnerdyusername", "tymscar" ],
"longDescription": "Python IDE with complete set of tools for productive development with Python programming language. In addition, the IDE provides high-class capabilities for professional Web development with Django framework and Google App Engine. It has powerful coding assistance, navigation, a lot of refactoring features, tight integration with various Version Control Systems, Unit testing, powerful all-singing all-dancing Debugger and entire customization. PyCharm is developer driven IDE. It was developed with the aim of providing you almost everything you need for your comfortable and productive development!",
"homepage": "https://www.jetbrains.com/pycharm/"
}
},
"pycharm-community": {
"product": "PyCharm CE",
"productShort": "PyCharm",
"updateChannel": "PyCharm RELEASE",
"wmClass": "jetbrains-pycharm-ce",
"meta": {
"isOpenSource": true,
"description": "Free Python IDE from JetBrains",
"maintainers": [ "genericnerdyusername", "tymscar" ],
"longDescription": "Python IDE with complete set of tools for productive development with Python programming language. In addition, the IDE provides high-class capabilities for professional Web development with Django framework and Google App Engine. It has powerful coding assistance, navigation, a lot of refactoring features, tight integration with various Version Control Systems, Unit testing, powerful all-singing all-dancing Debugger and entire customization. PyCharm is developer driven IDE. It was developed with the aim of providing you almost everything you need for your comfortable and productive development!",
"homepage": "https://www.jetbrains.com/pycharm/"
}
},
"pycharm-oss": {
"product": "PyCharm Open Source",
"productShort": "PyCharm",
"updateChannel": "PyCharm RELEASE",
"wmClass": "jetbrains-pycharm-ce",
"meta": {
"isOpenSource": true,
"description": "Free Python IDE from JetBrains",
"maintainers": [ "genericnerdyusername", "tymscar" ],
"longDescription": "Python IDE with complete set of tools for productive development with Python programming language. In addition, the IDE provides high-class capabilities for professional Web development with Django framework and Google App Engine. It has powerful coding assistance, navigation, a lot of refactoring features, tight integration with various Version Control Systems, Unit testing, powerful all-singing all-dancing Debugger and entire customization. PyCharm is developer driven IDE. It was developed with the aim of providing you almost everything you need for your comfortable and productive development!",
"homepage": "https://www.jetbrains.com/pycharm/"
}
},
"rider": {
"product": "Rider",
"updateChannel": "Rider RELEASE",
"wmClass": "jetbrains-rider",
"meta": {
"isOpenSource": false,
"description": ".NET IDE from JetBrains",
"maintainers": [ "raphaelr" ],
"longDescription": "JetBrains Rider is a new .NET IDE based on the IntelliJ platform and ReSharper. Rider supports .NET Core, .NET Framework and Mono based projects. This lets you develop a wide array of applications including .NET desktop apps, services and libraries, Unity games, ASP.NET and ASP.NET Core web applications.",
"homepage": "https://www.jetbrains.com/rider/"
}
},
"ruby-mine": {
"product": "RubyMine",
"updateChannel": "RubyMine RELEASE",
"wmClass": "jetbrains-rubymine",
"meta": {
"isOpenSource": false,
"description": "Ruby IDE from JetBrains",
"maintainers": [ "tymscar"],
"longDescription": "Ruby IDE from JetBrains",
"homepage": "https://www.jetbrains.com/ruby/"
}
},
"rust-rover": {
"product": "RustRover",
"updateChannel": "RustRover RELEASE",
"wmClass": "jetbrains-rustrover",
"meta": {
"isOpenSource": false,
"description": "Rust IDE from JetBrains",
"maintainers": [ "genericnerdyusername"],
"longDescription": "Rust IDE from JetBrains",
"homepage": "https://www.jetbrains.com/rust/"
}
},
"webstorm": {
"product": "WebStorm",
"updateChannel": "WebStorm RELEASE",
"wmClass": "jetbrains-webstorm",
"meta": {
"isOpenSource": false,
"description": "Web IDE from JetBrains",
"maintainers": [ "abaldeau", "tymscar"],
"longDescription": "WebStorm provides an editor for HTML, JavaScript (incl. Node.js), and CSS with on-the-fly code analysis, error prevention and automated refactorings for JavaScript code.",
"homepage": "https://www.jetbrains.com/webstorm/"
}
},
"writerside": {
"product": "Writerside",
"updateChannel": "Writerside EAP",
"wmClass": "jetbrains-writerside",
"meta": {
"isOpenSource": false,
"description": "Documentation IDE from JetBrains",
"maintainers": [ "zlepper"],
"longDescription": "The most powerful development environment now adapted for writing documentation.",
"homepage": "https://www.jetbrains.com/writerside/"
}
}
}
@@ -0,0 +1,66 @@
# TODO: This IDE is deprecated and scheduled for removal in 26.05
{
stdenv,
lib,
fetchurl,
mkJetBrainsProduct,
libdbm,
fsnotifier,
lldb,
}:
let
system = stdenv.hostPlatform.system;
# update-script-start: urls
urls = {
x86_64-linux = {
url = "https://download.jetbrains.com/aqua/aqua-2024.3.2.tar.gz";
sha256 = "de073e8a3734a2c4ef984b3e1bd68f5de72a6180e73400889510439ac3f419aa";
};
aarch64-linux = {
url = "https://download.jetbrains.com/aqua/aqua-2024.3.2-aarch64.tar.gz";
sha256 = "d2a3c781756a83ccea63dc6d9aebf85f819de1edb5bcd4e5a1a161eaa0779c84";
};
x86_64-darwin = {
url = "https://download.jetbrains.com/aqua/aqua-2024.3.2.dmg";
sha256 = "423d492e9849beb7edbbd1771650a04e8df9f469bf1789b41bc5878c84cee393";
};
aarch64-darwin = {
url = "https://download.jetbrains.com/aqua/aqua-2024.3.2-aarch64.dmg";
sha256 = "43974cdbbb71aaf5bfcfaf2cfd0e69e9920dda3973e64671936c1d52b267494d";
};
};
# update-script-end: urls
in
mkJetBrainsProduct {
inherit libdbm fsnotifier;
pname = "aqua";
wmClass = "jetbrains-aqua";
product = "Aqua";
# update-script-start: version
version = "2024.3.2";
buildNumber = "243.23654.154";
# update-script-end: version
src = fetchurl (urls.${system} or (throw "Unsupported system: ${system}"));
buildInputs = [
lldb
];
# NOTE: meta attrs are currently used by the desktop entry, so changing them may cause rebuilds (see TODO in README)
meta = {
homepage = "https://www.jetbrains.com/aqua/";
description = "Test automation IDE from JetBrains";
longDescription = "Aqua is a test automation IDE from jetbrains that can deal with many languages and frameworks to improve your test workflows. Has support for popular testing frameworks like Selenium, Cypress, and Playwright.";
maintainers = with lib.maintainers; [ remcoschrijver ];
license = lib.licenses.unfree;
sourceProvenance =
if stdenv.hostPlatform.isDarwin then
[ lib.sourceTypes.binaryNativeCode ]
else
[ lib.sourceTypes.binaryBytecode ];
};
}
@@ -0,0 +1,102 @@
{
stdenv,
lib,
fetchurl,
mkJetBrainsProduct,
libdbm,
fsnotifier,
patchSharedLibs,
dotnetCorePackages,
python3,
openssl,
libxcrypt-legacy,
lttng-ust_2_12,
musl,
expat,
libxml2,
xz,
}:
let
system = stdenv.hostPlatform.system;
# update-script-start: urls
urls = {
x86_64-linux = {
url = "https://download.jetbrains.com/cpp/CLion-2025.3.1.tar.gz";
hash = "sha256-RK49pTWLoBCmLVWrQSty82TF3NLC3NIASuNLdGOAe70=";
};
aarch64-linux = {
url = "https://download.jetbrains.com/cpp/CLion-2025.3.1-aarch64.tar.gz";
hash = "sha256-uWw4w9L3/3uYjXXJcP0OkDY+CbgnMQbe/Jrj3vqGjtc=";
};
x86_64-darwin = {
url = "https://download.jetbrains.com/cpp/CLion-2025.3.1.dmg";
hash = "sha256-moF0ySKfnIb4baGo4r2rUv+zaeoHgbV+skVwPryDB+I=";
};
aarch64-darwin = {
url = "https://download.jetbrains.com/cpp/CLion-2025.3.1-aarch64.dmg";
hash = "sha256-EcrorrQ9GHDZaYDx2Sf/VF+r7ZifO/TnMnkRtEHhSfE=";
};
};
# update-script-end: urls
in
(mkJetBrainsProduct {
inherit libdbm fsnotifier;
pname = "clion";
wmClass = "jetbrains-clion";
product = "CLion";
# update-script-start: version
version = "2025.3.1";
buildNumber = "253.29346.141";
# update-script-end: version
src = fetchurl (urls.${system} or (throw "Unsupported system: ${system}"));
buildInputs =
lib.optionals stdenv.hostPlatform.isLinux [
python3
openssl
libxcrypt-legacy
lttng-ust_2_12
musl
]
++ lib.optionals (stdenv.hostPlatform.isLinux && stdenv.hostPlatform.isAarch) [
expat
libxml2
xz
];
# NOTE: meta attrs are currently used by the desktop entry, so changing them may cause rebuilds (see TODO in README)
meta = {
homepage = "https://www.jetbrains.com/clion/";
description = "C/C++ IDE from JetBrains";
longDescription = "Enhancing productivity for every C and C++ developer on Linux, macOS and Windows.";
maintainers = with lib.maintainers; [
mic92
tymscar
];
license = lib.licenses.unfree;
sourceProvenance =
if stdenv.hostPlatform.isDarwin then
[ lib.sourceTypes.binaryNativeCode ]
else
[ lib.sourceTypes.binaryBytecode ];
};
}).overrideAttrs
(attrs: {
postInstall =
(attrs.postInstall or "")
+ lib.optionalString stdenv.hostPlatform.isLinux ''
for dir in $out/clion/plugins/clion-radler/DotFiles/linux-*; do
rm -rf $dir/dotnet
ln -s ${dotnetCorePackages.sdk_10_0-source}/share/dotnet $dir/dotnet
done
'';
postFixup = ''
${attrs.postFixup or ""}
${patchSharedLibs}
'';
})
@@ -0,0 +1,61 @@
{
stdenv,
lib,
fetchurl,
mkJetBrainsProduct,
libdbm,
fsnotifier,
}:
let
system = stdenv.hostPlatform.system;
# update-script-start: urls
urls = {
x86_64-linux = {
url = "https://download.jetbrains.com/datagrip/datagrip-2025.3.2.tar.gz";
hash = "sha256-y27WR10h640wdUExvSQAPBFAlr+oT/zPM03BHPisYMw=";
};
aarch64-linux = {
url = "https://download.jetbrains.com/datagrip/datagrip-2025.3.2-aarch64.tar.gz";
hash = "sha256-Gm/rOqJV2s4zLMGLhoWTGBtupiw9nw02+QAyygUX0Gg=";
};
x86_64-darwin = {
url = "https://download.jetbrains.com/datagrip/datagrip-2025.3.2.dmg";
hash = "sha256-A4OgpPL95YO2LqfTQuVxiw+jBvyDSVQcdb7FroQftPw=";
};
aarch64-darwin = {
url = "https://download.jetbrains.com/datagrip/datagrip-2025.3.2-aarch64.dmg";
hash = "sha256-pyJFSNydo4Y3J7DBHO+dYT/ZUdFrqgFsoUB8VqnsaWQ=";
};
};
# update-script-end: urls
in
mkJetBrainsProduct {
inherit libdbm fsnotifier;
pname = "datagrip";
wmClass = "jetbrains-datagrip";
product = "DataGrip";
# update-script-start: version
version = "2025.3.2";
buildNumber = "253.29346.170";
# update-script-end: version
src = fetchurl (urls.${system} or (throw "Unsupported system: ${system}"));
# NOTE: meta attrs are currently used by the desktop entry, so changing them may cause rebuilds (see TODO in README)
meta = {
homepage = "https://www.jetbrains.com/datagrip/";
description = "Database IDE from JetBrains";
longDescription = "DataGrip is a new IDE from JetBrains built for database admins. It allows you to quickly migrate and refactor relational databases, construct efficient, statically checked SQL queries and much more.";
maintainers = [ ];
license = lib.licenses.unfree;
sourceProvenance =
if stdenv.hostPlatform.isDarwin then
[ lib.sourceTypes.binaryNativeCode ]
else
[ lib.sourceTypes.binaryBytecode ];
};
}
@@ -0,0 +1,71 @@
{
stdenv,
lib,
fetchurl,
mkJetBrainsProduct,
libdbm,
fsnotifier,
libgcc,
runCommand,
R,
}:
let
system = stdenv.hostPlatform.system;
# update-script-start: urls
urls = {
x86_64-linux = {
url = "https://download.jetbrains.com/python/dataspell-2025.3.1.tar.gz";
hash = "sha256-N/E0Js5PXYWdfbJG8jKMy61hrfNh1Dx4TLaTKvZkTCg=";
};
aarch64-linux = {
url = "https://download.jetbrains.com/python/dataspell-2025.3.1-aarch64.tar.gz";
hash = "sha256-QK/TjMcEzf8r6JufDWe9vLFpnXs3sl001E0tUu9qRtM=";
};
x86_64-darwin = {
url = "https://download.jetbrains.com/python/dataspell-2025.3.1.dmg";
hash = "sha256-OI2VbdYkNpehYsBix2sv7kCY9PNAW62wemnObffeYBc=";
};
aarch64-darwin = {
url = "https://download.jetbrains.com/python/dataspell-2025.3.1-aarch64.dmg";
hash = "sha256-/g2O8V5uNq8OpDYb1HTyBO5cMH75Cvjsgzl2odrlpaM=";
};
};
# update-script-end: urls
in
mkJetBrainsProduct {
inherit libdbm fsnotifier;
pname = "dataspell";
wmClass = "jetbrains-dataspell";
product = "DataSpell";
# update-script-start: version
version = "2025.3.1";
buildNumber = "253.29346.157";
# update-script-end: version
src = fetchurl (urls.${system} or (throw "Unsupported system: ${system}"));
buildInputs = [
libgcc
(runCommand "libR" { } ''
mkdir -p $out/lib
ln -s ${R}/lib/R/lib/libR.so $out/lib/libR.so
'')
];
# NOTE: meta attrs are currently used by the desktop entry, so changing them may cause rebuilds (see TODO in README)
meta = {
homepage = "https://www.jetbrains.com/dataspell/";
description = "Data science IDE from JetBrains";
longDescription = "DataSpell is a new IDE from JetBrains built for Data Scientists. Mainly it integrates Jupyter notebooks in the IntelliJ platform.";
maintainers = with lib.maintainers; [ leona ];
license = lib.licenses.unfree;
sourceProvenance =
if stdenv.hostPlatform.isDarwin then
[ lib.sourceTypes.binaryNativeCode ]
else
[ lib.sourceTypes.binaryBytecode ];
};
}
@@ -0,0 +1,66 @@
{
stdenv,
lib,
fetchurl,
mkJetBrainsProduct,
libdbm,
fsnotifier,
libgcc,
}:
let
system = stdenv.hostPlatform.system;
# update-script-start: urls
urls = {
x86_64-linux = {
url = "https://download.jetbrains.com/idea/gateway/JetBrainsGateway-2025.3.tar.gz";
hash = "sha256-kMilT2GSRaVDXDQ/lPOVlatZzTy62laeKx4ovKzby0o=";
};
aarch64-linux = {
url = "https://download.jetbrains.com/idea/gateway/JetBrainsGateway-2025.3-aarch64.tar.gz";
hash = "sha256-IE7T9yYod9Ckaq8wxbr7cha06XNr6+5xQlyZPBhIavg=";
};
x86_64-darwin = {
url = "https://download.jetbrains.com/idea/gateway/JetBrainsGateway-2025.3.dmg";
hash = "sha256-KC/X8wLZWt7tAi+NbGedMpJ3j5YgU5SvUt0JD2IB8zg=";
};
aarch64-darwin = {
url = "https://download.jetbrains.com/idea/gateway/JetBrainsGateway-2025.3-aarch64.dmg";
hash = "sha256-sQyr2pPIjSe8wTWkSh/Zj+YP6DBWBtbnWg1bc28N8nQ=";
};
};
# update-script-end: urls
in
mkJetBrainsProduct {
inherit libdbm fsnotifier;
pname = "gateway";
wmClass = "jetbrains-gateway";
product = "JetBrains Gateway";
productShort = "Gateway";
# update-script-start: version
version = "2025.3";
buildNumber = "253.28294.342";
# update-script-end: version
src = fetchurl (urls.${system} or (throw "Unsupported system: ${system}"));
buildInputs = [
libgcc
];
# NOTE: meta attrs are currently used by the desktop entry, so changing them may cause rebuilds (see TODO in README)
meta = {
homepage = "https://www.jetbrains.com/remote-development/gateway/";
description = "Remote development for JetBrains products";
longDescription = "JetBrains Gateway is a lightweight launcher that connects a remote server with your local machine, downloads necessary components on the backend, and opens your project in JetBrains Client.";
maintainers = [ ];
license = lib.licenses.unfree;
sourceProvenance =
if stdenv.hostPlatform.isDarwin then
[ lib.sourceTypes.binaryNativeCode ]
else
[ lib.sourceTypes.binaryBytecode ];
};
}
@@ -0,0 +1,79 @@
{
stdenv,
lib,
fetchurl,
mkJetBrainsProduct,
libdbm,
fsnotifier,
libgcc,
}:
let
system = stdenv.hostPlatform.system;
# update-script-start: urls
urls = {
x86_64-linux = {
url = "https://download.jetbrains.com/go/goland-2025.3.tar.gz";
hash = "sha256-YVGFYobqVG64r5rrAldyzua9VxNPRUlKgY6NogqGkcY=";
};
aarch64-linux = {
url = "https://download.jetbrains.com/go/goland-2025.3-aarch64.tar.gz";
hash = "sha256-xTDdS8x6B1oEC2SFnss0FCyPwDmWJcWhOuLXqPWXQ0A=";
};
x86_64-darwin = {
url = "https://download.jetbrains.com/go/goland-2025.3.dmg";
hash = "sha256-4d9PELFYx3iHNlWWZiROmUUApA21sIZh4mkTV9Jp2/Q=";
};
aarch64-darwin = {
url = "https://download.jetbrains.com/go/goland-2025.3-aarch64.dmg";
hash = "sha256-1O4gtcPfYVHTZtbMmwa5FUmf8MHrEYSqtToBB4kI7Ik=";
};
};
# update-script-end: urls
in
(mkJetBrainsProduct {
inherit libdbm fsnotifier;
pname = "goland";
wmClass = "jetbrains-goland";
product = "Goland";
# update-script-start: version
version = "2025.3";
buildNumber = "253.28294.337";
# update-script-end: version
src = fetchurl (urls.${system} or (throw "Unsupported system: ${system}"));
extraWrapperArgs = [
# fortify source breaks build since delve compiles with -O0
''--prefix CGO_CPPFLAGS " " "-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0"''
];
buildInputs = [
libgcc
];
# NOTE: meta attrs are currently used by the desktop entry, so changing them may cause rebuilds (see TODO in README)
meta = {
homepage = "https://www.jetbrains.com/go/";
description = "Go IDE from JetBrains";
longDescription = "Goland is the codename for a new commercial IDE by JetBrains aimed at providing an ergonomic environment for Go development.
The new IDE extends the IntelliJ platform with the coding assistance and tool integrations specific for the Go language";
maintainers = with lib.maintainers; [ tymscar ];
license = lib.licenses.unfree;
sourceProvenance =
if stdenv.hostPlatform.isDarwin then
[ lib.sourceTypes.binaryNativeCode ]
else
[ lib.sourceTypes.binaryBytecode ];
};
}).overrideAttrs
(attrs: {
postFixup =
(attrs.postFixup or "")
+ lib.optionalString stdenv.hostPlatform.isLinux ''
interp="$(cat $NIX_CC/nix-support/dynamic-linker)"
patchelf --set-interpreter $interp $out/goland/plugins/go-plugin/lib/dlv/linux/dlv
chmod +x $out/goland/plugins/go-plugin/lib/dlv/linux/dlv
'';
})
@@ -0,0 +1,69 @@
# TODO: This IDE is deprecated and scheduled for removal in 26.05
{
stdenv,
lib,
fetchurl,
mkJetBrainsProduct,
libdbm,
fsnotifier,
maven,
zlib,
}:
let
system = stdenv.hostPlatform.system;
# update-script-start: urls
urls = {
x86_64-linux = {
url = "https://download.jetbrains.com/idea/ideaIC-2025.2.5.tar.gz";
sha256 = "995c334cc3e143f13467abafef07a1ccf7d06275512bb6f4c91123948786ab7c";
};
aarch64-linux = {
url = "https://download.jetbrains.com/idea/ideaIC-2025.2.5-aarch64.tar.gz";
sha256 = "4c57a783f31ee6f2c82d8c43bb5d0334a9afbc8bfb4542e732048c41f61e63a0";
};
x86_64-darwin = {
url = "https://download.jetbrains.com/idea/ideaIC-2025.2.5.dmg";
sha256 = "ff48a1e60869342a91db867fa482a49d4cdf38476496911c109f34a7e8d6523d";
};
aarch64-darwin = {
url = "https://download.jetbrains.com/idea/ideaIC-2025.2.5-aarch64.dmg";
sha256 = "52065492d433f0ea9df4debd5f0683154ab4dab5846394cabc8a49903d70e5bc";
};
};
# update-script-end: urls
in
mkJetBrainsProduct {
inherit libdbm fsnotifier;
pname = "idea-community";
wmClass = "jetbrains-idea-ce";
product = "IntelliJ IDEA CE";
productShort = "IDEA";
# update-script-start: version
version = "2025.2.5";
buildNumber = "252.28238.7";
# update-script-end: version
src = fetchurl (urls.${system} or (throw "Unsupported system: ${system}"));
extraLdPath = [ zlib ];
extraWrapperArgs = [
''--set M2_HOME "${maven}/maven"''
''--set M2 "${maven}/maven/bin"''
];
# NOTE: meta attrs are currently used by the desktop entry, so changing them may cause rebuilds (see TODO in README)
meta = {
homepage = "https://www.jetbrains.com/idea/";
description = "Free Java, Kotlin, Groovy and Scala IDE from Jetbrains (built from source)";
longDescription = "IDE for Java SE, Groovy & Scala development Powerful environment for building Google Android apps Integration with JUnit, TestNG, popular SCMs, Ant & Maven. Also known as IntelliJ.";
maintainers = with lib.maintainers; [
gytis-ivaskevicius
tymscar
];
license = lib.licenses.asl20;
sourceProvenance = [ lib.sourceTypes.fromSource ];
};
}
@@ -0,0 +1,72 @@
{
lib,
mkJetBrainsProduct,
mkJetBrainsSource,
maven,
zlib,
}:
let
src = mkJetBrainsSource {
# update-script-start: source-args
version = "2025.3.1";
buildNumber = "253.29346.138";
buildType = "idea";
ideaHash = "sha256-eAq/lgv6ZcN9SR2E1KYnnhDHe/rBQ3GqqbbF6GstDoU=";
androidHash = "sha256-quMCzrjCKIo1pkzw4PWewAs5tz7A2aq7TI5zd+QaaUY=";
jpsHash = "sha256-iHpt926BDLNUwHRXvkqVgwlWiLo1qSZEaGeJcS0Fjmk=";
restarterHash = "sha256-acCmC58URd6p9uKZrm0qWgdZkqu9yqCs23v8qgxV2Ag=";
mvnDeps = ../source/idea_maven_artefacts.json;
repositories = [
"repo1.maven.org/maven2"
"packages.jetbrains.team/maven/p/ij/intellij-dependencies"
"dl.google.com/dl/android/maven2"
"download.jetbrains.com/teamcity-repository"
"maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-ide-plugin-dependencies"
"packages.jetbrains.team/maven/p/grazi/grazie-platform-public"
"packages.jetbrains.team/maven/p/kpm/public"
"packages.jetbrains.team/maven/p/ki/maven"
"maven.pkg.jetbrains.space/public/p/compose/dev"
"packages.jetbrains.team/maven/p/amper/amper"
"packages.jetbrains.team/maven/p/kt/bootstrap"
];
kotlin-jps-plugin = {
version = "2.2.20";
hash = "sha256-+jGghK2+yq+YFm5zT7ob+WTgTiJnHXAjDtlZjOzSISQ=";
};
# update-script-end: source-args
};
in
mkJetBrainsProduct {
inherit src;
inherit (src)
version
buildNumber
libdbm
fsnotifier
;
pname = "idea-oss";
wmClass = "jetbrains-idea-ce";
product = "IntelliJ IDEA Open Source";
productShort = "IDEA";
extraLdPath = [ zlib ];
extraWrapperArgs = [
''--set M2_HOME "${maven}/maven"''
''--set M2 "${maven}/maven/bin"''
];
# NOTE: meta attrs are currently used by the desktop entry, so changing them may cause rebuilds (see TODO in README)
meta = {
homepage = "https://www.jetbrains.com/idea/";
description = "Free Java, Kotlin, Groovy and Scala IDE from Jetbrains (built from source)";
longDescription = "IDE for Java SE, Groovy & Scala development Powerful environment for building Google Android apps Integration with JUnit, TestNG, popular SCMs, Ant & Maven. Also known as IntelliJ.";
maintainers = with lib.maintainers; [
gytis-ivaskevicius
tymscar
];
license = lib.licenses.asl20;
sourceProvenance = [ lib.sourceTypes.fromSource ];
};
}
@@ -0,0 +1,79 @@
{
stdenv,
lib,
fetchurl,
mkJetBrainsProduct,
libdbm,
fsnotifier,
maven,
zlib,
lldb,
musl,
}:
let
system = stdenv.hostPlatform.system;
# update-script-start: urls
urls = {
x86_64-linux = {
url = "https://download.jetbrains.com/idea/ideaIU-2025.3.1.tar.gz";
hash = "sha256-IeG5C17GhHZ6A0mLpCTvP5rMXb91nM7v1e3UdPBDrWw=";
};
aarch64-linux = {
url = "https://download.jetbrains.com/idea/ideaIU-2025.3.1-aarch64.tar.gz";
hash = "sha256-CVcRMp0enBRkG6Qm5lLU29OIWyfJoEbkRyWuZ3SR6MM=";
};
x86_64-darwin = {
url = "https://download.jetbrains.com/idea/ideaIU-2025.3.1.dmg";
hash = "sha256-rfWvODnge6Y4e/DsqU3y9EyCkCOhiYFw6svFy6/OA5M=";
};
aarch64-darwin = {
url = "https://download.jetbrains.com/idea/ideaIU-2025.3.1-aarch64.dmg";
hash = "sha256-ITeGPMOl9KzSW6OKguAE6TXTqU+lZvjjhR1riorBJ3c=";
};
};
# update-script-end: urls
in
mkJetBrainsProduct {
inherit libdbm fsnotifier;
pname = "idea";
wmClass = "jetbrains-idea";
product = "IntelliJ IDEA";
productShort = "IDEA";
# update-script-start: version
version = "2025.3.1";
buildNumber = "253.29346.138";
# update-script-end: version
src = fetchurl (urls.${system} or (throw "Unsupported system: ${system}"));
extraLdPath = [ zlib ];
extraWrapperArgs = [
''--set M2_HOME "${maven}/maven"''
''--set M2 "${maven}/maven/bin"''
];
buildInputs = [
lldb
musl
];
# NOTE: meta attrs are currently used by the desktop entry, so changing them may cause rebuilds (see TODO in README)
meta = {
homepage = "https://www.jetbrains.com/idea/";
description = "Java, Kotlin, Groovy and Scala IDE from Jetbrains";
longDescription = "IDE for Java SE, Groovy & Scala development Powerful environment for building Google Android apps Integration with JUnit, TestNG, popular SCMs, Ant & Maven. Also known as IntelliJ.";
maintainers = with lib.maintainers; [
gytis-ivaskevicius
tymscar
];
license = lib.licenses.unfree;
sourceProvenance =
if stdenv.hostPlatform.isDarwin then
[ lib.sourceTypes.binaryNativeCode ]
else
[ lib.sourceTypes.binaryBytecode ];
};
}
@@ -0,0 +1,61 @@
{
stdenv,
lib,
fetchurl,
mkJetBrainsProduct,
libdbm,
fsnotifier,
}:
let
system = stdenv.hostPlatform.system;
# update-script-start: urls
urls = {
x86_64-linux = {
url = "https://download.jetbrains.com/mps/2025.3/MPS-2025.3.tar.gz";
hash = "sha256-xAI+UrTheCTWHSdoI4YZvhTlrlc121M+OVFkfzd7a3k=";
};
aarch64-linux = {
url = "https://download.jetbrains.com/mps/2025.3/MPS-2025.3.tar.gz";
hash = "sha256-xAI+UrTheCTWHSdoI4YZvhTlrlc121M+OVFkfzd7a3k=";
};
x86_64-darwin = {
url = "https://download.jetbrains.com/mps/2025.3/MPS-2025.3-macos.dmg";
hash = "sha256-whYAjKkF79mrknHflZnvOOy2bLosYUguelZDSuPt3uY=";
};
aarch64-darwin = {
url = "https://download.jetbrains.com/mps/2025.3/MPS-2025.3-macos-aarch64.dmg";
hash = "sha256-3HnEHOhRRI9IYjBhc5FO7h5j4jBBDtZTVkmO/S1fBEQ=";
};
};
# update-script-end: urls
in
mkJetBrainsProduct {
inherit libdbm fsnotifier;
pname = "mps";
wmClass = "jetbrains-MPS";
product = "MPS";
# update-script-start: version
version = "2025.3";
buildNumber = "253.28294.432";
# update-script-end: version
src = fetchurl (urls.${system} or (throw "Unsupported system: ${system}"));
# NOTE: meta attrs are currently used by the desktop entry, so changing them may cause rebuilds (see TODO in README)
meta = {
homepage = "https://www.jetbrains.com/mps/";
description = "IDE for building domain-specific languages from JetBrains";
longDescription = "A metaprogramming system which uses projectional editing which allows users to overcome the limits of language parsers, and build DSL editors, such as ones with tables and diagrams.";
maintainers = [ ];
license = lib.licenses.unfree;
sourceProvenance =
if stdenv.hostPlatform.isDarwin then
[ lib.sourceTypes.binaryNativeCode ]
else
[ lib.sourceTypes.binaryBytecode ];
};
}
@@ -0,0 +1,68 @@
{
stdenv,
lib,
fetchurl,
mkJetBrainsProduct,
libdbm,
fsnotifier,
musl,
}:
let
system = stdenv.hostPlatform.system;
# update-script-start: urls
urls = {
x86_64-linux = {
url = "https://download.jetbrains.com/webide/PhpStorm-2025.3.1.tar.gz";
hash = "sha256-/Yk3q2t5YFzvyZF//moI4FprfMAlb6IXhiPSTsMi+ik=";
};
aarch64-linux = {
url = "https://download.jetbrains.com/webide/PhpStorm-2025.3.1-aarch64.tar.gz";
hash = "sha256-dkhmf4W0xFkosE1MJvIogqiqZaeHpk+i96/+UaG8KmE=";
};
x86_64-darwin = {
url = "https://download.jetbrains.com/webide/PhpStorm-2025.3.1.dmg";
hash = "sha256-EZiLzuXZSycepnrqzT6DYClZWmz+v+wmWVZfwYpK0tE=";
};
aarch64-darwin = {
url = "https://download.jetbrains.com/webide/PhpStorm-2025.3.1-aarch64.dmg";
hash = "sha256-BFPgpu6Gw8v5e4xI8oJnUdgIW/ghG1QaBHUmIcWvFrw=";
};
};
# update-script-end: urls
in
mkJetBrainsProduct {
inherit libdbm fsnotifier;
pname = "phpstorm";
wmClass = "jetbrains-phpstorm";
product = "PhpStorm";
# update-script-start: version
version = "2025.3.1";
buildNumber = "253.29346.151";
# update-script-end: version
src = fetchurl (urls.${system} or (throw "Unsupported system: ${system}"));
buildInputs = [
musl
];
# NOTE: meta attrs are currently used by the desktop entry, so changing them may cause rebuilds (see TODO in README)
meta = {
homepage = "https://www.jetbrains.com/phpstorm/";
description = "PHP IDE from JetBrains";
longDescription = "PhpStorm provides an editor for PHP, HTML and JavaScript with on-the-fly code analysis, error prevention and automated refactorings for PHP and JavaScript code. ";
maintainers = with lib.maintainers; [
dritter
tymscar
];
license = lib.licenses.unfree;
sourceProvenance =
if stdenv.hostPlatform.isDarwin then
[ lib.sourceTypes.binaryNativeCode ]
else
[ lib.sourceTypes.binaryBytecode ];
};
}
@@ -0,0 +1,63 @@
# TODO: This IDE is deprecated and scheduled for removal in 26.05
{
stdenv,
lib,
fetchurl,
mkJetBrainsProduct,
libdbm,
fsnotifier,
pyCharmCommonOverrides,
}:
let
system = stdenv.hostPlatform.system;
# update-script-start: urls
urls = {
x86_64-linux = {
url = "https://download.jetbrains.com/python/pycharm-community-2025.2.5.tar.gz";
sha256 = "7f49a014f53f0f6f7c46f6710b131f390302287f4046b606331d88081cdb551f";
};
aarch64-linux = {
url = "https://download.jetbrains.com/python/pycharm-community-2025.2.5-aarch64.tar.gz";
sha256 = "67b61a3e788b043d93b3cc3e0dd3cea350e6d170402fd94adaf792cfc57e5462";
};
x86_64-darwin = {
url = "https://download.jetbrains.com/python/pycharm-community-2025.2.5.dmg";
sha256 = "08ba97a278031ff1942ddefb18d8acf7582f0bb4a28ccdf5d65721bfb80ca456";
};
aarch64-darwin = {
url = "https://download.jetbrains.com/python/pycharm-community-2025.2.5-aarch64.dmg";
sha256 = "040a4ed6bb7563972d844c450f615d0d11385e524fbbfdbfc9fc68d78811e994";
};
};
# update-script-end: urls
in
(mkJetBrainsProduct {
inherit libdbm fsnotifier;
pname = "pycharm-community";
wmClass = "jetbrains-pycharm-ce";
product = "PyCharm CE";
productShort = "PyCharm";
# update-script-start: version
version = "2025.2.5";
buildNumber = "252.28238.29";
# update-script-end: version
src = fetchurl (urls.${system} or (throw "Unsupported system: ${system}"));
# NOTE: meta attrs are currently used by the desktop entry, so changing them may cause rebuilds (see TODO in README)
meta = {
homepage = "https://www.jetbrains.com/pycharm/";
description = "Free Python IDE from JetBrains (built from source)";
longDescription = "Python IDE with complete set of tools for productive development with Python programming language. In addition, the IDE provides high-class capabilities for professional Web development with Django framework and Google App Engine. It has powerful coding assistance, navigation, a lot of refactoring features, tight integration with various Version Control Systems, Unit testing, powerful all-singing all-dancing Debugger and entire customization. PyCharm is developer driven IDE. It was developed with the aim of providing you almost everything you need for your comfortable and productive development!";
maintainers = with lib.maintainers; [
genericnerdyusername
tymscar
];
license = lib.licenses.asl20;
sourceProvenance = [ lib.sourceTypes.fromSource ];
};
}).overrideAttrs
pyCharmCommonOverrides
@@ -0,0 +1,66 @@
{
lib,
mkJetBrainsProduct,
mkJetBrainsSource,
pyCharmCommonOverrides,
}:
let
src = mkJetBrainsSource {
# update-script-start: source-args
version = "2025.3.1";
buildNumber = "253.29346.142";
buildType = "pycharm";
ideaHash = "sha256-eAq/lgv6ZcN9SR2E1KYnnhDHe/rBQ3GqqbbF6GstDoU=";
androidHash = "sha256-quMCzrjCKIo1pkzw4PWewAs5tz7A2aq7TI5zd+QaaUY=";
jpsHash = "sha256-iHpt926BDLNUwHRXvkqVgwlWiLo1qSZEaGeJcS0Fjmk=";
restarterHash = "sha256-acCmC58URd6p9uKZrm0qWgdZkqu9yqCs23v8qgxV2Ag=";
mvnDeps = ../source/pycharm_maven_artefacts.json;
repositories = [
"repo1.maven.org/maven2"
"packages.jetbrains.team/maven/p/ij/intellij-dependencies"
"dl.google.com/dl/android/maven2"
"download.jetbrains.com/teamcity-repository"
"maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-ide-plugin-dependencies"
"packages.jetbrains.team/maven/p/grazi/grazie-platform-public"
"packages.jetbrains.team/maven/p/kpm/public"
"packages.jetbrains.team/maven/p/ki/maven"
"maven.pkg.jetbrains.space/public/p/compose/dev"
"packages.jetbrains.team/maven/p/amper/amper"
"packages.jetbrains.team/maven/p/kt/bootstrap"
];
kotlin-jps-plugin = {
version = "2.2.20";
hash = "sha256-+jGghK2+yq+YFm5zT7ob+WTgTiJnHXAjDtlZjOzSISQ=";
};
# update-script-end: source-args
};
in
(mkJetBrainsProduct {
inherit src;
inherit (src)
version
buildNumber
libdbm
fsnotifier
;
pname = "pycharm-oss";
wmClass = "jetbrains-pycharm-ce";
product = "PyCharm Open Source";
productShort = "PyCharm";
# NOTE: meta attrs are currently used by the desktop entry, so changing them may cause rebuilds (see TODO in README)
meta = {
homepage = "https://www.jetbrains.com/pycharm/";
description = "Free Python IDE from JetBrains (built from source)";
longDescription = "Python IDE with complete set of tools for productive development with Python programming language. In addition, the IDE provides high-class capabilities for professional Web development with Django framework and Google App Engine. It has powerful coding assistance, navigation, a lot of refactoring features, tight integration with various Version Control Systems, Unit testing, powerful all-singing all-dancing Debugger and entire customization. PyCharm is developer driven IDE. It was developed with the aim of providing you almost everything you need for your comfortable and productive development!";
maintainers = with lib.maintainers; [
genericnerdyusername
tymscar
];
license = lib.licenses.asl20;
sourceProvenance = [ lib.sourceTypes.fromSource ];
};
}).overrideAttrs
pyCharmCommonOverrides
@@ -0,0 +1,71 @@
{
stdenv,
lib,
fetchurl,
mkJetBrainsProduct,
libdbm,
fsnotifier,
pyCharmCommonOverrides,
musl,
}:
let
system = stdenv.hostPlatform.system;
# update-script-start: urls
urls = {
x86_64-linux = {
url = "https://download.jetbrains.com/python/pycharm-2025.3.1.tar.gz";
hash = "sha256-kz/ULXzCp2rUuiP5ESKU5N8BP6TDNiQ1oeM2gFHAc5E=";
};
aarch64-linux = {
url = "https://download.jetbrains.com/python/pycharm-2025.3.1-aarch64.tar.gz";
hash = "sha256-K29aQwEydz6nyvMEb3dj6noDHb+rbhvnK9yG88x6dYs=";
};
x86_64-darwin = {
url = "https://download.jetbrains.com/python/pycharm-2025.3.1.dmg";
hash = "sha256-WGye7WfaYJ/B5WWov8NusVWyPlSD1dxunc+LVUD0f6U=";
};
aarch64-darwin = {
url = "https://download.jetbrains.com/python/pycharm-2025.3.1-aarch64.dmg";
hash = "sha256-7I6XhW8A2pAgIMcrDwecwQmD3mu0Q4KS6l+qHlsMuTU=";
};
};
# update-script-end: urls
in
(mkJetBrainsProduct {
inherit libdbm fsnotifier;
pname = "pycharm";
wmClass = "jetbrains-pycharm";
product = "PyCharm";
productShort = "PyCharm";
# update-script-start: version
version = "2025.3.1";
buildNumber = "253.29346.142";
# update-script-end: version
src = fetchurl (urls.${system} or (throw "Unsupported system: ${system}"));
buildInputs = [
musl
];
# NOTE: meta attrs are currently used by the desktop entry, so changing them may cause rebuilds (see TODO in README)
meta = {
homepage = "https://www.jetbrains.com/pycharm/";
description = "Python IDE from JetBrains";
longDescription = "Python IDE with complete set of tools for productive development with Python programming language. In addition, the IDE provides high-class capabilities for professional Web development with Django framework and Google App Engine. It has powerful coding assistance, navigation, a lot of refactoring features, tight integration with various Version Control Systems, Unit testing, powerful all-singing all-dancing Debugger and entire customization. PyCharm is developer driven IDE. It was developed with the aim of providing you almost everything you need for your comfortable and productive development!";
maintainers = with lib.maintainers; [
genericnerdyusername
tymscar
];
license = lib.licenses.unfree;
sourceProvenance =
if stdenv.hostPlatform.isDarwin then
[ lib.sourceTypes.binaryNativeCode ]
else
[ lib.sourceTypes.binaryBytecode ];
};
}).overrideAttrs
pyCharmCommonOverrides
@@ -0,0 +1,106 @@
{
stdenv,
lib,
fetchurl,
mkJetBrainsProduct,
libdbm,
fsnotifier,
patchSharedLibs,
openssl,
libxcrypt,
lttng-ust_2_12,
musl,
libICE,
libSM,
libX11,
dotnetCorePackages,
xorg,
expat,
libxml2,
xz,
}:
let
system = stdenv.hostPlatform.system;
# update-script-start: urls
urls = {
x86_64-linux = {
url = "https://download.jetbrains.com/rider/JetBrains.Rider-2025.3.1.tar.gz";
hash = "sha256-uoQPfEjafxGM9Xqowi3zASDRbxdfvOO+xqZVkO2H8ug=";
};
aarch64-linux = {
url = "https://download.jetbrains.com/rider/JetBrains.Rider-2025.3.1-aarch64.tar.gz";
hash = "sha256-GQgPzcSPoPdD7WCSe3GXWjxHi4BSlhYc/YoKosBMj1I=";
};
x86_64-darwin = {
url = "https://download.jetbrains.com/rider/JetBrains.Rider-2025.3.1.dmg";
hash = "sha256-rd2Bbb3xMOLvXn3BhNeoCH+L+/brpOMurSRSBppJYH0=";
};
aarch64-darwin = {
url = "https://download.jetbrains.com/rider/JetBrains.Rider-2025.3.1-aarch64.dmg";
hash = "sha256-1wgDI0EpAPXTcnAjPlpMdzARxoU9YDHOH15jXHdRFCY=";
};
};
# update-script-end: urls
in
(mkJetBrainsProduct {
inherit libdbm fsnotifier;
pname = "rider";
wmClass = "jetbrains-rider";
product = "Rider";
# update-script-start: version
version = "2025.3.1";
buildNumber = "253.29346.144";
# update-script-end: version
src = fetchurl (urls.${system} or (throw "Unsupported system: ${system}"));
buildInputs = [
openssl
libxcrypt
lttng-ust_2_12
musl
]
++ lib.optionals stdenv.hostPlatform.isLinux [
xorg.xcbutilkeysyms
]
++ lib.optionals (stdenv.hostPlatform.isLinux && stdenv.hostPlatform.isAarch) [
expat
libxml2
xz
];
extraLdPath = lib.optionals (stdenv.hostPlatform.isLinux) [
# Avalonia dependencies needed for dotMemory
libICE
libSM
libX11
];
# NOTE: meta attrs are currently used by the desktop entry, so changing them may cause rebuilds (see TODO in README)
meta = {
homepage = "https://www.jetbrains.com/rider/";
description = ".NET IDE from JetBrains";
longDescription = "JetBrains Rider is a new .NET IDE based on the IntelliJ platform and ReSharper. Rider supports .NET Core, .NET Framework and Mono based projects. This lets you develop a wide array of applications including .NET desktop apps, services and libraries, Unity games, ASP.NET and ASP.NET Core web applications.";
maintainers = with lib.maintainers; [ raphaelr ];
license = lib.licenses.unfree;
sourceProvenance =
if stdenv.hostPlatform.isDarwin then
[ lib.sourceTypes.binaryNativeCode ]
else
[ lib.sourceTypes.binaryBytecode ];
};
}).overrideAttrs
(attrs: {
postInstall =
(attrs.postInstall or "")
+ lib.optionalString stdenv.hostPlatform.isLinux ''
${patchSharedLibs}
for dir in $out/rider/lib/ReSharperHost/linux-*; do
rm -rf $dir/dotnet
ln -s ${dotnetCorePackages.sdk_10_0-source}/share/dotnet $dir/dotnet
done
'';
})
@@ -0,0 +1,65 @@
{
stdenv,
lib,
fetchurl,
mkJetBrainsProduct,
libdbm,
fsnotifier,
musl,
}:
let
system = stdenv.hostPlatform.system;
# update-script-start: urls
urls = {
x86_64-linux = {
url = "https://download.jetbrains.com/ruby/RubyMine-2025.3.1.tar.gz";
hash = "sha256-6esgEcotVpTFjAEWkL9UTQJuOnwcDI3puzehj6DPgRg=";
};
aarch64-linux = {
url = "https://download.jetbrains.com/ruby/RubyMine-2025.3.1-aarch64.tar.gz";
hash = "sha256-v2A8ahuh5hiv23BYlkhEfPzlO02qegzGgHPBt35yfVU=";
};
x86_64-darwin = {
url = "https://download.jetbrains.com/ruby/RubyMine-2025.3.1.dmg";
hash = "sha256-T86EmDpqzhbYR5FQt2UoAlCiYLPST7NyWNEUAAxsERU=";
};
aarch64-darwin = {
url = "https://download.jetbrains.com/ruby/RubyMine-2025.3.1-aarch64.dmg";
hash = "sha256-Z/GqZ0uQ7FS6IfNSOtlAIY+Xm+/XQp44rYIryBRtFqQ=";
};
};
# update-script-end: urls
in
mkJetBrainsProduct {
inherit libdbm fsnotifier;
pname = "ruby-mine";
wmClass = "jetbrains-rubymine";
product = "RubyMine";
# update-script-start: version
version = "2025.3.1";
buildNumber = "253.29346.140";
# update-script-end: version
src = fetchurl (urls.${system} or (throw "Unsupported system: ${system}"));
buildInputs = [
musl
];
# NOTE: meta attrs are currently used by the desktop entry, so changing them may cause rebuilds (see TODO in README)
meta = {
homepage = "https://www.jetbrains.com/ruby/";
description = "Ruby IDE from JetBrains";
longDescription = "Ruby IDE from JetBrains";
maintainers = with lib.maintainers; [ tymscar ];
license = lib.licenses.unfree;
sourceProvenance =
if stdenv.hostPlatform.isDarwin then
[ lib.sourceTypes.binaryNativeCode ]
else
[ lib.sourceTypes.binaryBytecode ];
};
}
@@ -0,0 +1,85 @@
{
stdenv,
lib,
fetchurl,
mkJetBrainsProduct,
libdbm,
fsnotifier,
patchSharedLibs,
python3,
openssl,
libxcrypt-legacy,
expat,
libxml2,
xz,
}:
let
system = stdenv.hostPlatform.system;
# update-script-start: urls
urls = {
x86_64-linux = {
url = "https://download.jetbrains.com/rustrover/RustRover-2025.3.1.tar.gz";
hash = "sha256-Whs04QocWe7jBpQja6qCM8d4dYB2k4G+AbTMsJYY7Ik=";
};
aarch64-linux = {
url = "https://download.jetbrains.com/rustrover/RustRover-2025.3.1-aarch64.tar.gz";
hash = "sha256-+w+BydKipgRxhISVSyYaZCvp7W9R3pj83GztsysKTJ4=";
};
x86_64-darwin = {
url = "https://download.jetbrains.com/rustrover/RustRover-2025.3.1.dmg";
hash = "sha256-OJmHVFKlGC25OxMsANvIQ5T/tjdDC5fyOQvoq7BBJTc=";
};
aarch64-darwin = {
url = "https://download.jetbrains.com/rustrover/RustRover-2025.3.1-aarch64.dmg";
hash = "sha256-EDoS7Rw3trOM/11jfn3HuNzHj1xXa6OLj4Ysa6NkfVI=";
};
};
# update-script-end: urls
in
(mkJetBrainsProduct {
inherit libdbm fsnotifier;
pname = "rust-rover";
wmClass = "jetbrains-rustrover";
product = "RustRover";
# update-script-start: version
version = "2025.3.1";
buildNumber = "253.29346.139";
# update-script-end: version
src = fetchurl (urls.${system} or (throw "Unsupported system: ${system}"));
buildInputs =
lib.optionals stdenv.hostPlatform.isLinux [
python3
openssl
libxcrypt-legacy
]
++ lib.optionals (stdenv.hostPlatform.isLinux && stdenv.hostPlatform.isAarch) [
expat
libxml2
xz
];
# NOTE: meta attrs are currently used by the desktop entry, so changing them may cause rebuilds (see TODO in README)
meta = {
homepage = "https://www.jetbrains.com/rust/";
description = "Rust IDE from JetBrains";
longDescription = "Rust IDE from JetBrains";
maintainers = with lib.maintainers; [ genericnerdyusername ];
license = lib.licenses.unfree;
sourceProvenance =
if stdenv.hostPlatform.isDarwin then
[ lib.sourceTypes.binaryNativeCode ]
else
[ lib.sourceTypes.binaryBytecode ];
};
}).overrideAttrs
(attrs: {
postFixup = ''
${attrs.postFixup or ""}
${patchSharedLibs}
'';
})
@@ -0,0 +1,68 @@
{
stdenv,
lib,
fetchurl,
mkJetBrainsProduct,
libdbm,
fsnotifier,
musl,
}:
let
system = stdenv.hostPlatform.system;
# update-script-start: urls
urls = {
x86_64-linux = {
url = "https://download.jetbrains.com/webstorm/WebStorm-2025.3.1.tar.gz";
hash = "sha256-CKhR0ha3QcSeu2hG4Xj7gj0yn+e5gkohNLaMj9Jboq4=";
};
aarch64-linux = {
url = "https://download.jetbrains.com/webstorm/WebStorm-2025.3.1-aarch64.tar.gz";
hash = "sha256-/Yuz7nDFSRZdkQJDe8oD6Ff8FHKBwdc4IknUaQwx3Yc=";
};
x86_64-darwin = {
url = "https://download.jetbrains.com/webstorm/WebStorm-2025.3.1.dmg";
hash = "sha256-psuQZWL5WzfpweNMm9lWHeplOnJsldAr+pV6y+kJuI0=";
};
aarch64-darwin = {
url = "https://download.jetbrains.com/webstorm/WebStorm-2025.3.1-aarch64.dmg";
hash = "sha256-HCGZDO4ru//dj2yQ6AcbwD7H/lo2YuUZMcFSItS3zLI=";
};
};
# update-script-end: urls
in
mkJetBrainsProduct {
inherit libdbm fsnotifier;
pname = "webstorm";
wmClass = "jetbrains-webstorm";
product = "WebStorm";
# update-script-start: version
version = "2025.3.1";
buildNumber = "253.29346.143";
# update-script-end: version
src = fetchurl (urls.${system} or (throw "Unsupported system: ${system}"));
buildInputs = [
musl
];
# NOTE: meta attrs are currently used by the desktop entry, so changing them may cause rebuilds (see TODO in README)
meta = {
homepage = "https://www.jetbrains.com/webstorm/";
description = "Web IDE from JetBrains";
longDescription = "WebStorm provides an editor for HTML, JavaScript (incl. Node.js), and CSS with on-the-fly code analysis, error prevention and automated refactorings for JavaScript code.";
maintainers = with lib.maintainers; [
abaldeau
tymscar
];
license = lib.licenses.unfree;
sourceProvenance =
if stdenv.hostPlatform.isDarwin then
[ lib.sourceTypes.binaryNativeCode ]
else
[ lib.sourceTypes.binaryBytecode ];
};
}
@@ -0,0 +1,66 @@
# TODO: This IDE is deprecated and scheduled for removal in 26.05
{
stdenv,
lib,
fetchurl,
mkJetBrainsProduct,
libdbm,
fsnotifier,
musl,
}:
let
system = stdenv.hostPlatform.system;
# update-script-start: urls
urls = {
x86_64-linux = {
url = "https://download.jetbrains.com/writerside/writerside-243.22562.371.tar.gz";
sha256 = "d49e58020d51ec4ccdbdffea5d42b5a2d776a809fc00789cef5abda7b23bd3f6";
};
aarch64-linux = {
url = "https://download.jetbrains.com/writerside/writerside-243.22562.371-aarch64.tar.gz";
sha256 = "6067f6f73c4a178e2d0ae42bd18669045d85b5b5ed2c9115c2488ba7aa2a3d88";
};
x86_64-darwin = {
url = "https://download.jetbrains.com/writerside/writerside-243.22562.371.dmg";
sha256 = "0c78b8035497c855aea5666256716778abd46dadf68f51e4f91c0db01f62b280";
};
aarch64-darwin = {
url = "https://download.jetbrains.com/writerside/writerside-243.22562.371-aarch64.dmg";
sha256 = "9d86ef50b4c6d2a07d236219e9b05c0557241fb017d52ac395719bdb425130f5";
};
};
# update-script-end: urls
in
mkJetBrainsProduct {
inherit libdbm fsnotifier;
pname = "writerside";
wmClass = "jetbrains-writerside";
product = "Writerside";
# update-script-start: version
version = "2024.3 EAP";
buildNumber = "243.22562.371";
# update-script-end: version
src = fetchurl (urls.${system} or (throw "Unsupported system: ${system}"));
buildInputs = [
musl
];
# NOTE: meta attrs are currently used by the desktop entry, so changing them may cause rebuilds (see TODO in README)
meta = {
homepage = "https://www.jetbrains.com/writerside/";
description = "Documentation IDE from JetBrains";
longDescription = "The most powerful development environment now adapted for writing documentation.";
maintainers = with lib.maintainers; [ zlepper ];
license = lib.licenses.unfree;
sourceProvenance =
if stdenv.hostPlatform.isDarwin then
[ lib.sourceTypes.binaryNativeCode ]
else
[ lib.sourceTypes.binaryBytecode ];
};
}
+27 -19
View File
@@ -1,4 +1,4 @@
This directory contains the build expressions needed to build any of the jetbrains IDEs.
This directory contains the build expressions needed to build any of the JetBrains IDEs.
The jdk is in `pkgs/development/compilers/jetbrains-jdk`.
## Tests:
@@ -35,31 +35,39 @@ fetchurl {
}
```
## How to update stuff:
- Run ./bin/update_bin.py, this will update binary IDEs, and automatically commit them
- Source builds need a bit more effort, as they **aren't automated at the moment**:
- Run ./source/update.py ./source/sources.json. This will update the source version to the latest available version.
- Run these commands respectively:
- `nix build .#jetbrains.idea-oss.src.src && ./source/build_maven.py source/idea_maven_artefacts.json result/` for IDEA
- `nix build .#jetbrains.pycharm-oss.src.src && ./source/build_maven.py source/pycharm_maven_artefacts.json result/` for PyCharm
- Make sure the Kotlin version used is correct.
- Check the recommended Kotlin version in `.idea/kotlinc.xml` in the IDEA source root
- Do a test build
- If it succeeds, make a commit
- make a PR/merge
- If it fails, ping/message GenericNerdyUsername or the nixpkgs Jetbrains maintainer team
## How to update IDEs:
- Run `./updater/main.py`.
This will update binary and source IDEs.
After this you can commit them.
- See `./updater/main.py --help` for additional flags.
- The IDEs have `passthru.updateScript` set up to run `./updater/main.py`.
The script then uses the `UPDATE_NIX_*` environment variables as documented.
To keep things simple, the update script will search for the following markers and may replace any content between them:
- `update-script-start: urls` / `update-script-end: urls`: URLs for binary IDEs
- `update-script-start: version` / `update-script-end: version`: Version and build number for binary IDEs
- `update-script-start: source-args` / `update-script-end: source-args`: Arguments for `mkJetBrainsSource` for source IDEs.
Any comments or other manual changes between these markers will be removed when the script runs.
## How to add an IDE:
- Make dummy entries in `bin/versions.json` (make sure to set the version to something older than the real one)
- Run `bin/update_bin.py`
- Add an entry in `ides.json`
- Add an entry in `default.nix`
- Add a new derivation in `ides/`
- Add an entry to the URL templates in `updater/updateInfo.json`
- Add it to `default.nix`
### TODO:
- remove the usage of `meta.` properties for building the Linux desktop files
(JetBrains already provides their own Desktop files, we can just use those probably?)
- drop the community IDEs
- Switch `mkJetbrainsProduct` to use `lib.extendMkDerivation`, see also:
- https://github.com/NixOS/nixpkgs/pull/475183#discussion_r2655305961
- https://github.com/NixOS/nixpkgs/pull/475183#discussion_r2655348886
- move PyCharm overrides to a common place outside of `default.nix`
- package `patchSharedLibs` from `default.nix` as a hook
- cleanup this TODO list, especially the following points, which have been here since 2023
- replace `libxcrypt-legacy` with `libxcrypt` when supported
- make `jetbrains-remote-dev.patch` cleaner
- is extraLdPath needed for IDEA?
- set meta.sourceProvenance for everything
- from source builds:
- remove timestamps in output `.jar` of `jps-bootstrap`
- automated update scripts
@@ -23,7 +23,8 @@
p7zip,
pkg-config,
xorg,
}:
{
version,
buildNumber,
buildType,
@@ -35,7 +36,6 @@
repositories,
kotlin-jps-plugin,
}:
let
kotlin' = kotlin.overrideAttrs (oldAttrs: {
version = "2.2.20";
@@ -313,6 +313,12 @@ stdenvNoCC.mkDerivation rec {
'';
passthru = {
inherit libdbm fsnotifier jps-bootstrap;
inherit
version
buildNumber
libdbm
fsnotifier
jps-bootstrap
;
};
}
@@ -1,109 +0,0 @@
#!/usr/bin/env nix-shell
#! nix-shell -i python3 -p python3 python3.pkgs.xmltodict
import os
import urllib
from argparse import ArgumentParser
from xmltodict import parse
from json import dump
from sys import stdout
def get_args() -> (str, list[str]):
parser = ArgumentParser(
description="Given the path of a intellij source tree, make a list of urls and hashes of maven artefacts required to build"
)
parser.add_argument("out", help="File to output json to")
parser.add_argument("path", help="Path to the intellij-community source dir")
args = parser.parse_args()
return args.path, args.out
def ensure_is_list(x):
if type(x) != list:
return [x]
return x
def add_entries(sources, targets, hashes):
for artefact in sources:
target = None
base_jar_name = os.path.basename(urllib.parse.urlparse(artefact["@url"]).path)
for candidate in targets:
if candidate["@url"].endswith(base_jar_name + "!/"):
target = candidate
break
if target is None:
raise ValueError(f"Did not find target for source {artefact}")
url = artefact["@url"].removeprefix("file://$MAVEN_REPOSITORY$/")
if url == artefact["@url"]:
raise ValueError(f"Unexpected artefact URL {url}")
path = target["@url"].removeprefix("jar://$MAVEN_REPOSITORY$/").removesuffix("!/")
if path == target["@url"]:
raise ValueError(f"Unexpected target path {path}")
hashes.append({
"url": url,
"hash": artefact["sha256sum"],
"path": path
})
def add_libraries(root_path: str, hashes: list[dict[str, str]], projects_to_process: list[str]):
library_paths = os.listdir(root_path + "/libraries/")
for path in library_paths:
file_contents = parse(open(root_path + "/libraries/" + path).read())
if "properties" not in file_contents["component"]["library"]:
continue
sources = ensure_is_list(file_contents["component"]["library"]["properties"]["verification"]["artifact"])
targets = ensure_is_list(file_contents["component"]["library"]["CLASSES"]["root"])
add_entries(sources, targets, hashes)
modules_xml = parse(open(root_path+"/modules.xml").read())
for module in modules_xml["project"]["component"]["modules"]["module"]:
projects_to_process.append(module["@filepath"])
def add_iml(path: str, hashes: list[dict[str, str]], projects_to_process: list[str]):
try:
contents = parse(open(path).read())
except FileNotFoundError:
print(f"Warning: path {path} does not exist (did you forget the android directory?)")
return
for manager in ensure_is_list(contents["module"]["component"]):
if manager["@name"] != "NewModuleRootManager":
continue
for entry in manager["orderEntry"]:
if type(entry) != dict or \
entry["@type"] != "module-library" or \
"properties" not in entry["library"]:
continue
sources = ensure_is_list(entry["library"]["properties"]["verification"]["artifact"])
targets = ensure_is_list(entry["library"]["CLASSES"]["root"])
add_entries(sources, targets, hashes)
def main():
root_path, out = get_args()
file_hashes = []
projects_to_process: list[str] = [root_path+"/.idea"]
while projects_to_process:
elem = projects_to_process.pop()
elem = elem.replace("$PROJECT_DIR$", root_path)
if elem.endswith(".iml"):
add_iml(elem, file_hashes, projects_to_process)
else:
add_libraries(elem, file_hashes, projects_to_process)
if out == "stdout":
dump(file_hashes, stdout, indent=4)
else:
file = open(out, "w")
dump(file_hashes, file, indent=4)
file.write("\n")
if __name__ == '__main__':
main()
@@ -1,9 +0,0 @@
let
ides = builtins.fromJSON (builtins.readFile ./sources.json);
in
{
callPackage,
}:
builtins.mapAttrs (
_: info: callPackage ./build.nix (info // { mvnDeps = ./. + "/${info.mvnDeps}"; })
) ides
@@ -1,56 +0,0 @@
{
"idea-oss": {
"version": "2025.3.1",
"buildNumber": "253.29346.138",
"buildType": "idea",
"ideaHash": "sha256-eAq/lgv6ZcN9SR2E1KYnnhDHe/rBQ3GqqbbF6GstDoU=",
"androidHash": "sha256-quMCzrjCKIo1pkzw4PWewAs5tz7A2aq7TI5zd+QaaUY=",
"jpsHash": "sha256-iHpt926BDLNUwHRXvkqVgwlWiLo1qSZEaGeJcS0Fjmk=",
"restarterHash": "sha256-acCmC58URd6p9uKZrm0qWgdZkqu9yqCs23v8qgxV2Ag=",
"mvnDeps": "idea_maven_artefacts.json",
"repositories": [
"repo1.maven.org/maven2",
"packages.jetbrains.team/maven/p/ij/intellij-dependencies",
"dl.google.com/dl/android/maven2",
"download.jetbrains.com/teamcity-repository",
"maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-ide-plugin-dependencies",
"packages.jetbrains.team/maven/p/grazi/grazie-platform-public",
"packages.jetbrains.team/maven/p/kpm/public",
"packages.jetbrains.team/maven/p/ki/maven",
"maven.pkg.jetbrains.space/public/p/compose/dev",
"packages.jetbrains.team/maven/p/amper/amper",
"packages.jetbrains.team/maven/p/kt/bootstrap"
],
"kotlin-jps-plugin": {
"version": "2.2.20",
"hash": "sha256-+jGghK2+yq+YFm5zT7ob+WTgTiJnHXAjDtlZjOzSISQ="
}
},
"pycharm-oss": {
"version": "2025.3.1",
"buildNumber": "253.29346.142",
"buildType": "pycharm",
"ideaHash": "sha256-eAq/lgv6ZcN9SR2E1KYnnhDHe/rBQ3GqqbbF6GstDoU=",
"androidHash": "sha256-quMCzrjCKIo1pkzw4PWewAs5tz7A2aq7TI5zd+QaaUY=",
"jpsHash": "sha256-iHpt926BDLNUwHRXvkqVgwlWiLo1qSZEaGeJcS0Fjmk=",
"restarterHash": "sha256-acCmC58URd6p9uKZrm0qWgdZkqu9yqCs23v8qgxV2Ag=",
"mvnDeps": "pycharm_maven_artefacts.json",
"repositories": [
"repo1.maven.org/maven2",
"packages.jetbrains.team/maven/p/ij/intellij-dependencies",
"dl.google.com/dl/android/maven2",
"download.jetbrains.com/teamcity-repository",
"maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-ide-plugin-dependencies",
"packages.jetbrains.team/maven/p/grazi/grazie-platform-public",
"packages.jetbrains.team/maven/p/kpm/public",
"packages.jetbrains.team/maven/p/ki/maven",
"maven.pkg.jetbrains.space/public/p/compose/dev",
"packages.jetbrains.team/maven/p/amper/amper",
"packages.jetbrains.team/maven/p/kt/bootstrap"
],
"kotlin-jps-plugin": {
"version": "2.2.20",
"hash": "sha256-+jGghK2+yq+YFm5zT7ob+WTgTiJnHXAjDtlZjOzSISQ="
}
}
}
@@ -1,236 +0,0 @@
#!/usr/bin/env nix-shell
#! nix-shell -i python3 -p python3 python3.pkgs.packaging python3.pkgs.xmltodict python3.pkgs.requests nurl
import os
import subprocess
import pprint
import pathlib
import requests
import json
import re
from argparse import ArgumentParser
from xmltodict import parse
from json import dump, loads
from sys import stdout
from packaging import version
UPDATES_URL = "https://www.jetbrains.com/updates/updates.xml"
IDES_FILE_PATH = pathlib.Path(__file__).parent.joinpath("..").joinpath("ides.json").resolve()
def convert_hash_to_sri(base32: str) -> str:
result = subprocess.run(["nix-hash", "--to-sri", "--type", "sha256", base32], capture_output=True, check=True, text=True)
return result.stdout.strip()
def ensure_is_list(x):
if type(x) != list:
return [x]
return x
def one_or_more(x):
return x if isinstance(x, list) else [x]
# TODO: Code duplication to update_bin.py - eventually refactor or merge scripts
def download_channels():
print(f"Checking for updates from {UPDATES_URL}")
updates_response = requests.get(UPDATES_URL)
updates_response.raise_for_status()
root = parse(updates_response.text)
products = root["products"]["product"]
return {
channel["@name"]: channel
for product in products
if "channel" in product
for channel in one_or_more(product["channel"])
}
# TODO: Code duplication to update_bin.py - eventually refactor or merge scripts
def build_version(build):
build_number = build["@fullNumber"] if "@fullNumber" in build else build["@number"]
return version.parse(build_number)
# TODO: Code duplication to update_bin.py - eventually refactor or merge scripts
def latest_build(channel):
builds = one_or_more(channel["build"])
latest = max(builds, key=build_version)
return latest
def jar_repositories(root_path: str) -> list[str]:
repositories = []
file_contents = parse(open(root_path + "/.idea/jarRepositories.xml").read())
component = file_contents['project']['component']
if component['@name'] != 'RemoteRepositoriesConfiguration':
return repositories
options = component['remote-repository']
for option in ensure_is_list(options):
for item in option['option']:
if item['@name'] == 'url':
repositories.append(
# Remove protocol and cache-redirector server, we only want the original URL. We try both the original
# URL and the URL via the cache-redirector for download in build.nix
re.sub(r'^https?://', '', item['@value']).removeprefix("cache-redirector.jetbrains.com/")
)
return repositories
def kotlin_jps_plugin_info(root_path: str) -> (str, str):
file_contents = parse(open(root_path + "/.idea/kotlinc.xml").read())
components = file_contents['project']['component']
for component in components:
if component['@name'] != 'KotlinJpsPluginSettings':
continue
option = component['option']
version = option['@value']
print(f"* Prefetching Kotlin JPS Plugin version {version}...")
prefetch = subprocess.run(["nix-prefetch-url", "--type", "sha256", f"https://packages.jetbrains.team/maven/p/ij/intellij-dependencies/org/jetbrains/kotlin/kotlin-jps-plugin-classpath/{version}/kotlin-jps-plugin-classpath-{version}.jar"], capture_output=True, check=True, text=True)
return (version, convert_hash_to_sri(prefetch.stdout.strip()))
def requested_kotlinc_version(root_path: str) -> str:
file_contents = parse(open(root_path + "/.idea/kotlinc.xml").read())
components = file_contents['project']['component']
for component in components:
if component['@name'] != 'KotlinJpsPluginSettings':
continue
option = component['option']
version = option['@value']
return version
def prefetch_intellij_community(variant: str, buildNumber: str) -> (str, str):
print("* Prefetching IntelliJ community source code...")
prefetch = subprocess.run(["nix-prefetch-url", "--print-path", "--unpack", "--name", "source", "--type", "sha256", f"https://github.com/jetbrains/intellij-community/archive/{variant}/{buildNumber}.tar.gz"], capture_output=True, check=True, text=True)
parts = prefetch.stdout.strip().split()
hash = convert_hash_to_sri(parts[0])
outPath = parts[1]
return (hash, outPath)
def prefetch_android(variant: str, buildNumber: str) -> str:
print("* Prefetching Android plugin source code...")
prefetch = subprocess.run(["nix-prefetch-url", "--unpack", "--name", "source", "--type", "sha256", f"https://github.com/jetbrains/android/archive/{variant}/{buildNumber}.tar.gz"], capture_output=True, check=True, text=True)
return convert_hash_to_sri(prefetch.stdout.strip())
def generate_restarter_hash(nixpkgs_path: str, root_path: str) -> str:
print("* Generating restarter Cargo hash...")
root_name = pathlib.Path(root_path).name
output = subprocess.run(["nurl", "--expr", f'''
(import {nixpkgs_path} {{}}).rustPlatform.buildRustPackage {{
name = "restarter";
src = {root_path};
sourceRoot = "{root_name}/native/restarter";
cargoHash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
}}
'''], capture_output=True, check=True, text=True)
return output.stdout.strip()
def generate_jps_hash(nixpkgs_path: str, root_path: str) -> str:
print("* Generating jps repo hash...")
jps_repo_nix = pathlib.Path(__file__).parent.joinpath("jps_repo.nix").resolve()
output = subprocess.run(["nurl", "--expr", f'''
(import {nixpkgs_path} {{}}).callPackage {jps_repo_nix} {{
jbr = (import {nixpkgs_path} {{}}).jetbrains.jdk-no-jcef;
src = {root_path};
jpsHash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
}}
'''], capture_output=True, check=True, text=True)
return output.stdout.strip()
def get_args() -> str:
parser = ArgumentParser(
description="Updates the IDEA / PyCharm source build infomations"
)
parser.add_argument("out", help="File to output json to")
args = parser.parse_args()
return args.out
# TODO: Code duplication to update_bin.py - eventually refactor or merge scripts
def get_latest_versions(channels: dict, ides: dict, name: str) -> (str, str):
update_channel = ides[name]['updateChannel']
print(f"Fetching latest {name} (channel: {update_channel}) release...")
channel = channels[update_channel]
build = latest_build(channel)
new_version = build["@version"]
new_build_number = ""
if "@fullNumber" not in build:
new_build_number = build["@number"]
else:
new_build_number = build["@fullNumber"]
version_number = new_version.split(' ')[0]
print(f"* Version: {version_number} - Build: {new_build_number}")
return version_number, new_build_number
def main():
out = get_args()
# source<jetbr.<editr.<applc.<pkgs <nixpkgs
nixpkgs_path = pathlib.Path(__file__).parent.parent.parent.parent.parent.parent.resolve()
assert nixpkgs_path.joinpath("pkgs").is_dir(), f"nixpkgs_path ({nixpkgs_path}) doesn't seem to point to the root of the repo, please check if things were moved."
channels = download_channels()
with open(IDES_FILE_PATH, "r") as ides_file:
ides = json.load(ides_file)
idea_version, idea_build = get_latest_versions(channels, ides, 'idea-oss')
pycharm_version, pycharm_build = get_latest_versions(channels, ides, 'pycharm-oss')
result = { 'idea-oss': {}, 'pycharm-oss': {} }
result['idea-oss']['version'] = idea_version
result['idea-oss']['buildNumber'] = idea_build
result['idea-oss']['buildType'] = 'idea'
result['pycharm-oss']['version'] = pycharm_version
result['pycharm-oss']['buildNumber'] = pycharm_build
result['pycharm-oss']['buildType'] = 'pycharm'
print('Fetching IDEA info...')
result['idea-oss']['ideaHash'], ideaOutPath = prefetch_intellij_community('idea', result['idea-oss']['buildNumber'])
result['idea-oss']['androidHash'] = prefetch_android('idea', result['idea-oss']['buildNumber'])
result['idea-oss']['jpsHash'] = generate_jps_hash(nixpkgs_path, ideaOutPath)
result['idea-oss']['restarterHash'] = generate_restarter_hash(nixpkgs_path, ideaOutPath)
result['idea-oss']['mvnDeps'] = 'idea_maven_artefacts.json'
result['idea-oss']['repositories'] = jar_repositories(ideaOutPath)
result['idea-oss']['kotlin-jps-plugin'] = {}
result['idea-oss']['kotlin-jps-plugin']['version'], result['idea-oss']['kotlin-jps-plugin']['hash'] = kotlin_jps_plugin_info(ideaOutPath)
kotlinc_version = requested_kotlinc_version(ideaOutPath)
print(f"* Prefetched IDEA Open Source requested Kotlin compiler {kotlinc_version}")
print('Fetching PyCharm info...')
result['pycharm-oss']['ideaHash'], pycharmOutPath = prefetch_intellij_community('pycharm', result['pycharm-oss']['buildNumber'])
result['pycharm-oss']['androidHash'] = prefetch_android('pycharm', result['pycharm-oss']['buildNumber'])
result['pycharm-oss']['jpsHash'] = generate_jps_hash(nixpkgs_path, pycharmOutPath)
result['pycharm-oss']['restarterHash'] = generate_restarter_hash(nixpkgs_path, pycharmOutPath)
result['pycharm-oss']['mvnDeps'] = 'pycharm_maven_artefacts.json'
result['pycharm-oss']['repositories'] = jar_repositories(pycharmOutPath)
result['pycharm-oss']['kotlin-jps-plugin'] = {}
result['pycharm-oss']['kotlin-jps-plugin']['version'], result['pycharm-oss']['kotlin-jps-plugin']['hash'] = kotlin_jps_plugin_info(pycharmOutPath)
kotlinc_version = requested_kotlinc_version(pycharmOutPath)
print(f"* Prefetched PyCharm Open Source requested Kotlin compiler {kotlinc_version}")
if out == "stdout":
dump(result, stdout, indent=2)
else:
file = open(out, "w")
dump(result, file, indent=2)
file.write("\n")
if __name__ == '__main__':
main()
@@ -0,0 +1,49 @@
import os
import dataclasses
from pathlib import Path
SUPPORTED_SYSTEMS = ["x86_64-linux", "aarch64-linux", "x86_64-darwin", "aarch64-darwin"]
def find_nixpkgs(current_path: Path) -> Path:
if current_path.joinpath("flake.nix").exists():
return current_path
parent = current_path.parent
if parent == current_path:
raise Exception("nixpkgs could not be found, please provide --nixpkgs-root")
return find_nixpkgs(parent)
@dataclasses.dataclass(slots=True)
class UpdaterConfig:
nixpkgs_root: Path
jetbrains_root: Path
ide: str | None # If None: Run for all IDEs
old_version: str | None
no_bin: bool
no_src: bool
no_maven_deps: bool
def __init__(self, argparse_result):
self.nixpkgs_root = (
Path(argparse_result.nixpkgs_root)
if argparse_result.nixpkgs_root is not None
else find_nixpkgs(Path.cwd())
)
self.jetbrains_root = (
self.nixpkgs_root / "pkgs" / "applications" / "editors" / "jetbrains"
)
self.ide = (
argparse_result.ide
if argparse_result.ide is not None
else os.environ.get("UPDATE_NIX_PNAME")
)
self.old_version = (
argparse_result.old_version
if argparse_result.old_version is not None
else os.environ.get("UPDATE_NIX_OLD_VERSION")
)
self.no_bin = argparse_result.no_bin
self.no_src = argparse_result.no_src
self.no_maven_deps = argparse_result.no_maven_deps
@@ -0,0 +1,132 @@
import dataclasses
from urllib import request
from urllib.error import HTTPError
import requests
import xmltodict
from packaging import version
from jetbrains_nix_updater.config import SUPPORTED_SYSTEMS
from jetbrains_nix_updater.ides import Ide
from jetbrains_nix_updater.util import one_or_more
UPDATES_URL = "https://www.jetbrains.com/updates/updates.xml"
@dataclasses.dataclass(slots=True)
class VersionInfo:
version: str
build_number: str
urls: dict[str, str | None]
def download_sha256(self, system: str) -> str:
if self.urls[system] is None:
raise Exception("No URL available")
print(f"[.] Downloading sha256 for {self.urls[system]}")
url = f"{self.urls[system]}.sha256"
download_response = requests.get(url)
download_response.raise_for_status()
return download_response.content.decode("UTF-8").split(" ")[0]
class VersionFetcher:
# Cached updates.xml content
_channels: dict | None = None
@property
def channels(self) -> dict:
if self._channels is None:
self._channels = self.download_channels()
return self._channels
def latest_version_info(
self, ide: Ide, ignore_no_url_error=False
) -> VersionInfo | None:
if ide.update_info is None:
print(f"[!] no update info for {ide.name} in `updateInfo.json` - skipping!")
return None
channel_name = ide.update_info["channel"]
channel = self.channels.get(channel_name)
if channel is None:
print(
f"[!] failed to find IDE channel {channel_name} - skipping! check {ide.name}'s `channel`!"
)
return None
try:
build = self.latest_build(channel)
new_version = build["@version"]
if "@fullNumber" not in build:
new_build_number = build["@number"]
else:
new_build_number = build["@fullNumber"]
if "EAP" not in channel["@name"]:
version_or_build_number = new_version
else:
version_or_build_number = new_build_number
version_number = new_version.split(" ")[0]
download_urls = {}
for system in SUPPORTED_SYSTEMS:
download_url = self.make_url(
ide.update_info["urls"].get(system, None),
version_or_build_number,
version_number,
)
if not download_url and not ignore_no_url_error:
print(
f"[!] no valid URL found for '{ide.name}' for '{system}'! make sure `updater/updateInfo.json` contains an entry and is correct."
)
download_urls[system] = None
else:
download_urls[system] = download_url
return VersionInfo(
version=new_version,
build_number=new_build_number,
urls=download_urls,
)
except Exception as e:
print(f"[!] exception while trying to fetch version: {e} - skipping!")
return None
@classmethod
def latest_build(cls, channel: dict) -> dict:
builds = one_or_more(channel["build"])
latest = max(builds, key=cls.build_version)
return latest
@staticmethod
def download_channels():
print(f"[-] Checking for updates from {UPDATES_URL}")
updates_response = requests.get(UPDATES_URL)
updates_response.raise_for_status()
root = xmltodict.parse(updates_response.text)
products = root["products"]["product"]
return {
channel["@name"]: channel
for product in products
if "channel" in product
for channel in one_or_more(product["channel"])
}
@staticmethod
def build_version(build):
build_number = (
build["@fullNumber"] if "@fullNumber" in build else build["@number"]
)
return version.parse(build_number)
@staticmethod
def make_url(
template: str | None, version_or_build_number: str, version_number: str
) -> str | None:
if template is None:
return None
release = [str(n) for n in version.parse(version_number).release]
for k in range(len(release), 0, -1):
s = ".".join(release[0:k])
url = template.format(version=version_or_build_number, versionMajorMinor=s)
try:
if request.urlopen(url).getcode() == 200:
return url
except HTTPError:
pass
return None
@@ -0,0 +1,64 @@
import sys
from subprocess import CalledProcessError
from typing import Iterable, TypedDict
import dataclasses
from pathlib import Path
from jetbrains_nix_updater.util import run_command
class UpdateInfo(TypedDict):
channel: str
urls: dict[str, str]
@dataclasses.dataclass(slots=True)
class Ide:
name: str
drv_path: Path
is_source: bool
update_info: UpdateInfo | None
def is_source_ide(drv_path: Path):
assert " " not in str(drv_path)
try:
return (
run_command(
[
"nix-instantiate",
"--eval",
"-E",
f'builtins.hasAttr "mkJetBrainsSource" (builtins.functionArgs (import {drv_path}))',
]
)
== "true"
)
except CalledProcessError as ex:
print(f"Failed to eval {drv_path}: {ex.stderr}", file=sys.stderr)
exit(1)
def get_single_ide(update_info: dict[str, UpdateInfo], jb_root: Path, name: str) -> Ide:
drv_path = jb_root / "ides" / f"{name}.nix"
if not drv_path.exists():
raise Exception(f"IDE not found at {drv_path}")
return Ide(
name=name,
drv_path=drv_path,
is_source=is_source_ide(drv_path),
update_info=update_info.get(name),
)
def get_all_ides(update_info: dict[str, UpdateInfo], jb_root: Path) -> Iterable[Ide]:
for file in sorted((jb_root / "ides").iterdir()):
if file.suffix == ".nix":
yield Ide(
name=file.stem,
drv_path=file,
is_source=is_source_ide(file),
update_info=update_info.get(file.stem),
)
@@ -0,0 +1,37 @@
from jetbrains_nix_updater.config import UpdaterConfig
from jetbrains_nix_updater.fetcher import VersionInfo
from jetbrains_nix_updater.ides import Ide
from jetbrains_nix_updater.util import replace_blocks, convert_hash_to_sri
def run_bin_update(ide: Ide, info: VersionInfo, config: UpdaterConfig):
urls_nix = ""
for system, url in info.urls.items():
urls_nix += f"""
{system} = {{
url = "{url}";
hash = "{convert_hash_to_sri(info.download_sha256(system))}";
}};"""
try:
replace_blocks(
config,
ide.drv_path,
[
(
"version",
f"""
version = "{info.version}";
buildNumber = "{info.build_number}";
""",
),
(
"urls",
f"""
urls = {{{urls_nix}}};
""",
),
],
)
except Exception as e:
print(f"[!] Writing update info to file failed: {e}")
@@ -0,0 +1,205 @@
import json
import re
from pathlib import Path
from xmltodict import parse
from jetbrains_nix_updater.config import UpdaterConfig
from jetbrains_nix_updater.fetcher import VersionInfo
from jetbrains_nix_updater.ides import Ide
from jetbrains_nix_updater.update_src_maven import (
get_maven_deps_for_ide,
ensure_is_list,
)
from jetbrains_nix_updater.util import replace_blocks, run_command, convert_hash_to_sri
def jar_repositories(root_path: Path) -> list[str]:
repositories = []
file_contents = parse(open(root_path / ".idea" / "jarRepositories.xml").read())
component = file_contents["project"]["component"]
if component["@name"] != "RemoteRepositoriesConfiguration":
return repositories
options = component["remote-repository"]
for option in ensure_is_list(options):
for item in option["option"]:
if item["@name"] == "url":
repositories.append(
# Remove protocol and cache-redirector server, we only want the original URL. We try both the original
# URL and the URL via the cache-redirector for download in build.nix
re.sub(r"^https?://", "", item["@value"]).removeprefix(
"cache-redirector.jetbrains.com/"
)
)
return repositories
def kotlin_jps_plugin_info(root_path: Path) -> tuple[str, str]:
file_contents = parse(open(root_path / ".idea" / "kotlinc.xml").read())
components = file_contents["project"]["component"]
for component in components:
if component["@name"] != "KotlinJpsPluginSettings":
continue
option = component["option"]
version = option["@value"]
print(f"[*] Prefetching Kotlin JPS Plugin version {version}...")
prefetch = run_command(
[
"nix-prefetch-url",
"--type",
"sha256",
f"https://packages.jetbrains.team/maven/p/ij/intellij-dependencies/org/jetbrains/kotlin/kotlin-jps-plugin-classpath/{version}/kotlin-jps-plugin-classpath-{version}.jar",
]
)
return (version, convert_hash_to_sri(prefetch))
def requested_kotlinc_version(root_path: Path) -> str:
file_contents = parse(open(root_path / ".idea" / "kotlinc.xml").read())
components = file_contents["project"]["component"]
for component in components:
if component["@name"] != "KotlinJpsPluginSettings":
continue
option = component["option"]
version = option["@value"]
return version
def prefetch_intellij_community(variant: str, build_number: str) -> tuple[str, Path]:
print("[*] Prefetching IntelliJ community source code...")
prefetch = run_command(
[
"nix-prefetch-url",
"--print-path",
"--unpack",
"--name",
"source",
"--type",
"sha256",
f"https://github.com/jetbrains/intellij-community/archive/{variant}/{build_number}.tar.gz",
]
)
parts = prefetch.split()
hash = convert_hash_to_sri(parts[0])
out_path = parts[1]
return (hash, Path(out_path))
def prefetch_android(variant: str, build_number: str) -> str:
print("[*] Prefetching Android plugin source code...")
prefetch = run_command(
[
"nix-prefetch-url",
"--unpack",
"--name",
"source",
"--type",
"sha256",
f"https://github.com/jetbrains/android/archive/{variant}/{build_number}.tar.gz",
]
)
return convert_hash_to_sri(prefetch)
def generate_restarter_hash(config: UpdaterConfig, root_path: Path) -> str:
print("[*] Generating restarter Cargo hash...")
root_name = root_path.name
return run_command(
[
"nurl",
"--expr",
f'''
(import {config.nixpkgs_root} {{}}).rustPlatform.buildRustPackage {{
name = "restarter";
src = {root_path};
sourceRoot = "{root_name}/native/restarter";
cargoHash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
}}
''',
]
)
def generate_jps_hash(config: UpdaterConfig, root_path: Path) -> str:
print("[*] Generating jps repo hash...")
jps_repo_nix = config.jetbrains_root / "source" / "jps_repo.nix"
return run_command(
[
"nurl",
"--expr",
f"""
(import {config.nixpkgs_root} {{}}).callPackage {jps_repo_nix} {{
jbr = (import {config.nixpkgs_root} {{}}).jetbrains.jdk-no-jcef;
src = {root_path};
jpsHash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
}}
""",
]
)
def maven_out_path(jb_root: Path, name: str) -> Path:
return jb_root / "source" / f"{name}_maven_artefacts.json"
def run_src_update(ide: Ide, info: VersionInfo, config: UpdaterConfig):
variant = ide.name.removesuffix("-oss")
intellij_hash, intellij_outpath = prefetch_intellij_community(
variant, info.build_number
)
android_hash = prefetch_android(variant, info.build_number)
jps_hash = generate_jps_hash(config, intellij_outpath)
restarter_hash = generate_restarter_hash(config, intellij_outpath)
repositories = jar_repositories(intellij_outpath)
kjps_plugin_version, kjps_plugin_hash = kotlin_jps_plugin_info(intellij_outpath)
kotlinc_version = requested_kotlinc_version(intellij_outpath)
print(
f"[i] Prefetched IDEA Open Source requested Kotlin compiler {kotlinc_version}"
)
repositories_nix = " ".join(f'"{x}"' for x in repositories)
try:
replace_blocks(
config,
ide.drv_path,
[
(
"source-args",
f"""
version = "{info.version}";
buildNumber = "{info.build_number}";
buildType = "{variant}";
ideaHash = "{intellij_hash}";
androidHash = "{android_hash}";
jpsHash = "{jps_hash}";
restarterHash = "{restarter_hash}";
mvnDeps = ../source/{variant}_maven_artefacts.json;
repositories = [
{repositories_nix}
];
kotlin-jps-plugin = {{
version = "{kjps_plugin_version}";
hash = "{kjps_plugin_hash}";
}};
""",
)
],
)
except Exception as e:
print(f"[!] Writing update info to file failed: {e}")
return
if not config.no_maven_deps:
print("[*] Collecting maven hashes")
maven_hashes = get_maven_deps_for_ide(config, ide)
with open(maven_out_path(config.jetbrains_root, variant), "w") as f:
json.dump(maven_hashes, f, indent=4)
f.write("\n")
@@ -0,0 +1,111 @@
import os
from pathlib import Path
from tempfile import TemporaryDirectory
from urllib.parse import urlparse
from xmltodict import parse
from jetbrains_nix_updater.config import UpdaterConfig
from jetbrains_nix_updater.ides import Ide
from jetbrains_nix_updater.util import ensure_is_list, run_command
def add_entries(sources, targets, hashes):
for artefact in sources:
target = None
base_jar_name = os.path.basename(urlparse(artefact["@url"]).path)
for candidate in targets:
if candidate["@url"].endswith(base_jar_name + "!/"):
target = candidate
break
if target is None:
raise ValueError(f"Did not find target for source {artefact}")
url = artefact["@url"].removeprefix("file://$MAVEN_REPOSITORY$/")
if url == artefact["@url"]:
raise ValueError(f"Unexpected artefact URL {url}")
path = (
target["@url"].removeprefix("jar://$MAVEN_REPOSITORY$/").removesuffix("!/")
)
if path == target["@url"]:
raise ValueError(f"Unexpected target path {path}")
hashes.append({"url": url, "hash": artefact["sha256sum"], "path": path})
def add_libraries(
root_path: str, hashes: list[dict[str, str]], projects_to_process: list[str]
):
library_paths = os.listdir(root_path + "/libraries/")
for path in library_paths:
file_contents = parse(open(root_path + "/libraries/" + path).read())
if "properties" not in file_contents["component"]["library"]:
continue
sources = ensure_is_list(
file_contents["component"]["library"]["properties"]["verification"][
"artifact"
]
)
targets = ensure_is_list(
file_contents["component"]["library"]["CLASSES"]["root"]
)
add_entries(sources, targets, hashes)
modules_xml = parse(open(root_path + "/modules.xml").read())
for module in modules_xml["project"]["component"]["modules"]["module"]:
projects_to_process.append(module["@filepath"])
def add_iml(path: str, hashes: list[dict[str, str]], projects_to_process: list[str]):
try:
contents = parse(open(path).read())
except FileNotFoundError:
print(
f"Warning: path {path} does not exist (did you forget the android directory?)"
)
return
for manager in ensure_is_list(contents["module"]["component"]):
if manager["@name"] != "NewModuleRootManager":
continue
for entry in manager["orderEntry"]:
if (
type(entry) != dict
or entry["@type"] != "module-library"
or "properties" not in entry["library"]
):
continue
sources = ensure_is_list(
entry["library"]["properties"]["verification"]["artifact"]
)
targets = ensure_is_list(entry["library"]["CLASSES"]["root"])
add_entries(sources, targets, hashes)
def get_maven_deps_for_ide(config: UpdaterConfig, ide: Ide) -> list[dict]:
with TemporaryDirectory() as tmp_dir:
root_path = Path(tmp_dir) / "result"
run_command(
[
"nix-build",
"--out-link",
root_path,
"--attr",
f"jetbrains.{ide.name}.src.src",
],
cwd=config.nixpkgs_root,
)
file_hashes = []
projects_to_process: list[str] = [str(root_path / ".idea")]
while projects_to_process:
elem = projects_to_process.pop()
elem = elem.replace("$PROJECT_DIR$", str(root_path))
if elem.endswith(".iml"):
add_iml(elem, file_hashes, projects_to_process)
else:
add_libraries(elem, file_hashes, projects_to_process)
return file_hashes
@@ -0,0 +1,82 @@
from typing import Iterable
import subprocess
from pathlib import Path
from jetbrains_nix_updater.config import UpdaterConfig
def run_command(cmd: list[str], **kwargs) -> str:
result = subprocess.run(cmd, capture_output=True, check=True, text=True, **kwargs)
return result.stdout.strip()
def convert_hash_to_sri(base32: str) -> str:
return run_command(["nix-hash", "--to-sri", "--type", "sha256", base32])
def ensure_is_list(x):
if type(x) is not list:
return [x]
return x
def one_or_more(x):
return x if isinstance(x, list) else [x]
def replace_blocks(
config: UpdaterConfig, file: Path, blocks: Iterable[tuple[str, str]]
):
"""
Replace placeholder blocks in a nix file.
The blocks must be enclosed in the `file` with lines
`# update-script-start: XXX` and `# update-script-end: XXX`,
where these lines must only contain that string and optionally any
number of leading and trailing whitespaces. `XXX` in this example is the
identifier of the block.
The lines between these markers are replaced with the content of the block.
The content is stripped of trailin and leading lines containing only whitespaces first.
The file is formatted with `nixfmt` after saving.
"""
with open(file, "r") as f:
lines = f.readlines()
for name, block in blocks:
old_lines = lines
lines = []
have_found_start = False
have_found_end = False
for line in old_lines:
if not have_found_start and line.lstrip().startswith(
f"# update-script-start: {name}"
):
have_found_start = True
lines.append(line)
elif have_found_start and line.lstrip().startswith(
f"# update-script-end: {name}"
):
for replacement_line in block.splitlines(True):
if replacement_line.rstrip("\n") == "":
# Skip empty lines in replacement
continue
lines.append(replacement_line)
have_found_end = True
lines.append(line)
elif not have_found_start or have_found_end:
lines.append(line)
if not have_found_start or not have_found_end:
raise Exception(
f"Either start or end marker for `{name}` block missing in `{file}`"
)
with open(file, "w") as f:
f.writelines(lines)
run_command(
["nix-shell", "--run", f"treefmt --no-cache {file.absolute()}"],
cwd=config.nixpkgs_root,
)
+82
View File
@@ -0,0 +1,82 @@
#!/usr/bin/env nix-shell
#!nix-shell -i python3 -p python3 python3.pkgs.packaging python3.pkgs.xmltodict python3.pkgs.requests nurl
import argparse
import json
from jetbrains_nix_updater.config import UpdaterConfig
from jetbrains_nix_updater.fetcher import VersionFetcher
from jetbrains_nix_updater.ides import get_single_ide, get_all_ides
from jetbrains_nix_updater.update_bin import run_bin_update
from jetbrains_nix_updater.update_src import run_src_update
def main():
parser = argparse.ArgumentParser()
parser.add_argument(
"ide",
nargs="?",
help="pname of the IDE to update. If not set, uses UPDATE_NIX_PNAME. "
"If that is also not set, all IDEs are updated",
)
parser.add_argument(
"--nixpkgs-root", help="root directory of nixpkgs, auto-detected if not given"
)
parser.add_argument(
"--no-bin", action="store_true", help="do not update binary IDEs"
)
parser.add_argument(
"--no-src", action="store_true", help="do not update source IDEs"
)
parser.add_argument(
"--no-maven-deps",
action="store_true",
help="do not update maven dependencies for source IDEs",
)
parser.add_argument(
"--old-version",
type=str,
help="old version of the IDE, only used if `ide` (or UPDATE_NIX_PNAME) is also used. "
"Defaults to UPDATE_NIX_OLD_VERSION. If the new version matches the old version, "
"exits early without making changes.",
)
config = UpdaterConfig(parser.parse_args())
print(f"[i] running jetbrains updater with: {config}")
with open(config.jetbrains_root / "updater" / "updateInfo.json", "r") as f:
update_info = json.load(f)
version_fetcher = VersionFetcher()
ides_to_run_for = (
[get_single_ide(update_info, config.jetbrains_root, config.ide)]
if config.ide is not None
else list(get_all_ides(update_info, config.jetbrains_root))
)
print(f"[.] found IDEs to update: {', '.join(ide.name for ide in ides_to_run_for)}")
for ide in ides_to_run_for:
if ide.is_source and config.no_src:
print(f"[!] skipping {ide.name}, due to --no-src")
continue
if not ide.is_source and config.no_bin:
print(f"[!] skipping {ide.name}, due to --no-bin")
continue
print(f"[@] updating IDE {ide.name}")
info = version_fetcher.latest_version_info(
ide, ignore_no_url_error=ide.is_source
)
if info is not None:
if config.old_version == info.version:
print("[o] Version is the same, no update required")
return
if ide.is_source:
run_src_update(ide, info, config)
else:
run_bin_update(ide, info, config)
if __name__ == "__main__":
main()
@@ -0,0 +1,127 @@
{
"clion": {
"channel": "CLion RELEASE",
"urls": {
"x86_64-linux": "https://download.jetbrains.com/cpp/CLion-{version}.tar.gz",
"aarch64-linux": "https://download.jetbrains.com/cpp/CLion-{version}-aarch64.tar.gz",
"x86_64-darwin": "https://download.jetbrains.com/cpp/CLion-{version}.dmg",
"aarch64-darwin": "https://download.jetbrains.com/cpp/CLion-{version}-aarch64.dmg"
}
},
"datagrip": {
"channel": "DataGrip RELEASE",
"urls": {
"x86_64-linux": "https://download.jetbrains.com/datagrip/datagrip-{version}.tar.gz",
"aarch64-linux": "https://download.jetbrains.com/datagrip/datagrip-{version}-aarch64.tar.gz",
"x86_64-darwin": "https://download.jetbrains.com/datagrip/datagrip-{version}.dmg",
"aarch64-darwin": "https://download.jetbrains.com/datagrip/datagrip-{version}-aarch64.dmg"
}
},
"dataspell": {
"channel": "DataSpell RELEASE",
"urls": {
"x86_64-linux": "https://download.jetbrains.com/python/dataspell-{version}.tar.gz",
"aarch64-linux": "https://download.jetbrains.com/python/dataspell-{version}-aarch64.tar.gz",
"x86_64-darwin": "https://download.jetbrains.com/python/dataspell-{version}.dmg",
"aarch64-darwin": "https://download.jetbrains.com/python/dataspell-{version}-aarch64.dmg"
}
},
"gateway": {
"channel": "Gateway RELEASE",
"urls": {
"x86_64-linux": "https://download.jetbrains.com/idea/gateway/JetBrainsGateway-{version}.tar.gz",
"aarch64-linux": "https://download.jetbrains.com/idea/gateway/JetBrainsGateway-{version}-aarch64.tar.gz",
"x86_64-darwin": "https://download.jetbrains.com/idea/gateway/JetBrainsGateway-{version}.dmg",
"aarch64-darwin": "https://download.jetbrains.com/idea/gateway/JetBrainsGateway-{version}-aarch64.dmg"
}
},
"goland": {
"channel": "GoLand RELEASE",
"urls": {
"x86_64-linux": "https://download.jetbrains.com/go/goland-{version}.tar.gz",
"aarch64-linux": "https://download.jetbrains.com/go/goland-{version}-aarch64.tar.gz",
"x86_64-darwin": "https://download.jetbrains.com/go/goland-{version}.dmg",
"aarch64-darwin": "https://download.jetbrains.com/go/goland-{version}-aarch64.dmg"
}
},
"idea": {
"channel": "IntelliJ IDEA RELEASE",
"urls": {
"x86_64-linux": "https://download.jetbrains.com/idea/ideaIU-{version}.tar.gz",
"aarch64-linux": "https://download.jetbrains.com/idea/ideaIU-{version}-aarch64.tar.gz",
"x86_64-darwin": "https://download.jetbrains.com/idea/ideaIU-{version}.dmg",
"aarch64-darwin": "https://download.jetbrains.com/idea/ideaIU-{version}-aarch64.dmg"
}
},
"idea-oss": {
"channel": "IntelliJ IDEA RELEASE",
"urls": {}
},
"mps": {
"channel": "MPS RELEASE",
"urls": {
"x86_64-linux": "https://download.jetbrains.com/mps/{versionMajorMinor}/MPS-{version}.tar.gz",
"aarch64-linux": "https://download.jetbrains.com/mps/{versionMajorMinor}/MPS-{version}.tar.gz",
"x86_64-darwin": "https://download.jetbrains.com/mps/{versionMajorMinor}/MPS-{version}-macos.dmg",
"aarch64-darwin": "https://download.jetbrains.com/mps/{versionMajorMinor}/MPS-{version}-macos-aarch64.dmg"
}
},
"phpstorm": {
"channel": "PhpStorm RELEASE",
"urls": {
"x86_64-linux": "https://download.jetbrains.com/webide/PhpStorm-{version}.tar.gz",
"aarch64-linux": "https://download.jetbrains.com/webide/PhpStorm-{version}-aarch64.tar.gz",
"x86_64-darwin": "https://download.jetbrains.com/webide/PhpStorm-{version}.dmg",
"aarch64-darwin": "https://download.jetbrains.com/webide/PhpStorm-{version}-aarch64.dmg"
}
},
"pycharm": {
"channel": "PyCharm RELEASE",
"urls": {
"x86_64-linux": "https://download.jetbrains.com/python/pycharm-{version}.tar.gz",
"aarch64-linux": "https://download.jetbrains.com/python/pycharm-{version}-aarch64.tar.gz",
"x86_64-darwin": "https://download.jetbrains.com/python/pycharm-{version}.dmg",
"aarch64-darwin": "https://download.jetbrains.com/python/pycharm-{version}-aarch64.dmg"
}
},
"pycharm-oss": {
"channel": "PyCharm RELEASE",
"urls": {}
},
"rider": {
"channel": "Rider RELEASE",
"urls": {
"x86_64-linux": "https://download.jetbrains.com/rider/JetBrains.Rider-{version}.tar.gz",
"aarch64-linux": "https://download.jetbrains.com/rider/JetBrains.Rider-{version}-aarch64.tar.gz",
"x86_64-darwin": "https://download.jetbrains.com/rider/JetBrains.Rider-{version}.dmg",
"aarch64-darwin": "https://download.jetbrains.com/rider/JetBrains.Rider-{version}-aarch64.dmg"
}
},
"ruby-mine": {
"channel": "RubyMine RELEASE",
"urls": {
"x86_64-linux": "https://download.jetbrains.com/ruby/RubyMine-{version}.tar.gz",
"aarch64-linux": "https://download.jetbrains.com/ruby/RubyMine-{version}-aarch64.tar.gz",
"x86_64-darwin": "https://download.jetbrains.com/ruby/RubyMine-{version}.dmg",
"aarch64-darwin": "https://download.jetbrains.com/ruby/RubyMine-{version}-aarch64.dmg"
}
},
"rust-rover": {
"channel": "RustRover RELEASE",
"urls": {
"x86_64-linux": "https://download.jetbrains.com/rustrover/RustRover-{version}.tar.gz",
"aarch64-linux": "https://download.jetbrains.com/rustrover/RustRover-{version}-aarch64.tar.gz",
"x86_64-darwin": "https://download.jetbrains.com/rustrover/RustRover-{version}.dmg",
"aarch64-darwin": "https://download.jetbrains.com/rustrover/RustRover-{version}-aarch64.dmg"
}
},
"webstorm": {
"channel": "WebStorm RELEASE",
"urls": {
"x86_64-linux": "https://download.jetbrains.com/webstorm/WebStorm-{version}.tar.gz",
"aarch64-linux": "https://download.jetbrains.com/webstorm/WebStorm-{version}-aarch64.tar.gz",
"x86_64-darwin": "https://download.jetbrains.com/webstorm/WebStorm-{version}.dmg",
"aarch64-darwin": "https://download.jetbrains.com/webstorm/WebStorm-{version}-aarch64.dmg"
}
}
}
@@ -63,14 +63,14 @@
"vendorHash": "sha256-6Tw4rCOzrvN2pK83NejdJJBjljfDfHEniIX+EdfqujA="
},
"argoproj-labs_argocd": {
"hash": "sha256-wCYf/WKEyM816FlxfXuxrUl51N032Xvf2u2Id0HDhYM=",
"hash": "sha256-xIEl9SsiwJp3X7hyVPE/Z9qHGTL9ZotvzIz7Zx5bdEc=",
"homepage": "https://registry.terraform.io/providers/argoproj-labs/argocd",
"owner": "argoproj-labs",
"proxyVendor": true,
"repo": "terraform-provider-argocd",
"rev": "v7.12.4",
"rev": "v7.12.5",
"spdx": "MPL-2.0",
"vendorHash": "sha256-mzOhvrX7BxU00HfbE17xswPg4oRVbVvDb3etwUbq7EE="
"vendorHash": "sha256-gVzj5x95MNgCbxwqiqakrUnhF/x+vXnAurv4pUt8kV4="
},
"auth0_auth0": {
"hash": "sha256-NB8MRaj3O7Fb2xBYzYEEQ6+ZcibF4JHUQQz51ynUzlc=",
@@ -44,14 +44,15 @@ rustPlatform.buildRustPackage rec {
# https://github.com/cloud-hypervisor/rust-hypervisor-firmware/issues/249
auditable = false;
RUSTC_BOOTSTRAP = 1;
env = {
RUSTC_BOOTSTRAP = 1;
RUSTFLAGS = "-C linker=lld -C linker-flavor=ld.lld";
};
nativeBuildInputs = [
lld
];
RUSTFLAGS = "-C linker=lld -C linker-flavor=ld.lld";
# Tests don't work for `no_std`. See https://os.phil-opp.com/testing/
doCheck = false;
+1 -1
View File
@@ -87,7 +87,7 @@ rustPlatform.buildRustPackage {
makeWrapper
];
env.RUSTC_BOOTSTRAP = 1; # We need rust unstable features
RUSTC_BOOTSTRAP = 1; # We need rust unstable features
postInstall = ''
install -Dm444 -t "$out/share/applications" "client/assets/net.veloren.airshipper.desktop"
+10 -9
View File
@@ -78,18 +78,19 @@ rustPlatform.buildRustPackage rec {
"-lpng"
"-lssl"
];
RUSTFLAGS = toString (
map (a: "-C link-arg=${a}") [
"-Wl,--push-state,--no-as-needed"
"-lEGL"
"-lwayland-client"
"-lxkbcommon"
"-Wl,--pop-state"
]
);
};
RUSTFLAGS = map (a: "-C link-arg=${a}") [
"-Wl,--push-state,--no-as-needed"
"-lEGL"
"-lwayland-client"
"-lxkbcommon"
"-Wl,--pop-state"
];
cargoBuildFlags = [
"--exclude alvr_xtask"
"--exclude=alvr_xtask"
"--workspace"
];
+12 -8
View File
@@ -77,14 +77,18 @@ rustPlatform.buildRustPackage rec {
wayland
];
# force linking to all the dlopen()ed dependencies
RUSTFLAGS = map (a: "-C link-arg=${a}") [
"-Wl,--push-state,--no-as-needed"
"-lEGL"
"-lfontconfig"
"-lwayland-client"
"-Wl,--pop-state"
];
env = {
# force linking to all the dlopen()ed dependencies
RUSTFLAGS = toString (
map (a: "-C link-arg=${a}") [
"-Wl,--push-state,--no-as-needed"
"-lEGL"
"-lfontconfig"
"-lwayland-client"
"-Wl,--pop-state"
]
);
};
# upstream has minimal tests, so don't rebuild twice
doCheck = false;
+1 -1
View File
@@ -21,7 +21,7 @@ rustPlatform.buildRustPackage rec {
rustPlatform.bindgenHook
];
RUSTFLAGS = "--cfg tracing_unstable";
env.RUSTFLAGS = "--cfg tracing_unstable";
meta = {
description = "User-friendly, lightweight TUI for disk imaging";
+1 -1
View File
@@ -54,7 +54,7 @@ rustPlatform.buildRustPackage rec {
--replace-warn 'edition = "2021"' 'edition = "2024"'
'';
env.RUSTC_BOOTSTRAP = 1;
RUSTC_BOOTSTRAP = 1;
nativeBuildInputs = [
just
+3 -3
View File
@@ -23,19 +23,19 @@
stdenv.mkDerivation (finalAttrs: {
pname = "citations";
version = "0.8.0";
version = "0.9.0";
src = fetchFromGitLab {
domain = "gitlab.gnome.org";
owner = "World";
repo = "citations";
rev = finalAttrs.version;
hash = "sha256-aJp9UrfRXAsnHFGgMTHGRgCvlPEa62r9/0hEp5YKRzE=";
hash = "sha256-oWRBJvf7EimxIwdsr11vsN5605nZ4p4LQ1tzx/ZiCrg=";
};
cargoDeps = rustPlatform.fetchCargoVendor {
src = finalAttrs.src;
hash = "sha256-ZoflXdou6S7CYFF5x1pB71Ur08X1W6wPaJIm1sYsI2w=";
hash = "sha256-FCrrZ9efzTsYleOzaBVjLpC+shgwLnvHfpJmWXF80DI=";
};
nativeBuildInputs = [
+2 -2
View File
@@ -13,13 +13,13 @@
stdenv.mkDerivation (finalAttrs: {
pname = "clifm";
version = "1.26.3";
version = "1.27";
src = fetchFromGitHub {
owner = "leo-arch";
repo = "clifm";
tag = "v${finalAttrs.version}";
hash = "sha256-lYeYElTeQpOnptL/c/06OWpsmI/Jkd7rlKGw0mKc9/c=";
hash = "sha256-LfAXdFFaFldJ36QiBotGrSrdePY1Zc3IIQVOe9FszH0=";
};
buildInputs = [
+1 -1
View File
@@ -22,7 +22,7 @@ rustPlatform.buildRustPackage (finalAttrs: {
passthru.updateScript = ./update.sh;
env.RUSTC_BOOTSTRAP = true;
RUSTC_BOOTSTRAP = true;
buildInputs = [ sqlite ];
meta = {
+11 -2
View File
@@ -48,6 +48,17 @@ stdenv.mkDerivation (finalAttrs: {
libXtst
];
env.NIX_CFLAGS_COMPILE = toString [
# juce, compiled in this build as part of a Git submodule, uses `-flto` as
# a Link Time Optimization flag, and instructs the plugin compiled here to
# use this flag to. This breaks the build for us. Using _fat_ LTO allows
# successful linking while still providing LTO benefits. If our build of
# `juce` was used as a dependency, we could have patched that `-flto` line
# in our juce's source, but that is not possible because it is used as a
# Git Submodule.
"-ffat-lto-objects"
];
enableParallelBuilding = true;
postPatch = ''
@@ -55,8 +66,6 @@ stdenv.mkDerivation (finalAttrs: {
--replace-fail 'COPY_PLUGIN_AFTER_BUILD TRUE' 'COPY_PLUGIN_AFTER_BUILD FALSE'
substituteInPlace CMakeLists.txt \
--replace-fail 'include(cmake-include/CPM.cmake)' '# No CPM needed'
substituteInPlace CMakeLists.txt \
--replace-fail 'juce::juce_recommended_lto_flags' '# Not forcing LTO'
'';
installPhase = ''
+11 -5
View File
@@ -33,11 +33,6 @@ stdenv.mkDerivation (finalAttrs: {
substituteInPlace Source/CMakeLists.txt \
--replace-fail 'COPY_PLUGIN_AFTER_BUILD TRUE' 'COPY_PLUGIN_AFTER_BUILD FALSE'
''
# LTO needs special setup on Linux
+ lib.optionalString stdenv.hostPlatform.isLinux ''
substituteInPlace Source/CMakeLists.txt \
--replace-fail 'juce::juce_recommended_lto_flags' '# Not forcing LTO'
'';
strictDeps = true;
@@ -68,6 +63,17 @@ stdenv.mkDerivation (finalAttrs: {
"-ljack"
]);
env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.hostPlatform.isLinux (toString [
# juce, compiled in this build as part of a Git submodule, uses `-flto` as
# a Link Time Optimization flag, and instructs the plugin compiled here to
# use this flag to. This breaks the build for us. Using _fat_ LTO allows
# successful linking while still providing LTO benefits. If our build of
# `juce` was used as a dependency, we could have patched that `-flto` line
# in our juce's source, but that is not possible because it is used as a
# Git Submodule.
"-ffat-lto-objects"
]);
installPhase =
let
vst3Dir =
+6 -1
View File
@@ -40,7 +40,12 @@ stdenv.mkDerivation rec {
})
];
NIX_LDFLAGS = "-lid3tag -lz";
env = {
NIX_LDFLAGS = "-lid3tag -lz";
# Note: this allows id3lib to be found at configure time, and also prevents
# compilation errors on Linux (GCC 15). Clang / Darwin seems to be unaffected.
NIX_CFLAGS_COMPILE = lib.optionalString stdenv.cc.isGNU "-std=c17 -Wno-implicit-function-declaration";
};
nativeBuildInputs = [
pkg-config
+1 -1
View File
@@ -47,7 +47,7 @@ rustPlatform.buildRustPackage rec {
cargoTestFlags = cargoBuildFlags;
# requires unstable rust features
env.RUSTC_BOOTSTRAP = 1;
RUSTC_BOOTSTRAP = 1;
postInstall = lib.optionalString (stdenv.buildPlatform.canExecute stdenv.hostPlatform) ''
installShellCompletion --cmd eww \
+11 -5
View File
@@ -108,11 +108,6 @@ stdenv.mkDerivation (finalAttrs: {
# Regression tests require big sound files stored in LFS, skip them
rm -v tests/RegressionTests.cpp
''
+ lib.optionalString stdenv.hostPlatform.isLinux ''
# Remove hardcoded LTO flags: needs extra setup on Linux
substituteInPlace CMakeLists.txt \
--replace-fail 'juce::juce_recommended_lto_flags' '# Not forcing LTO'
''
+ lib.optionalString (!finalAttrs.finalPackage.doCheck) ''
substituteInPlace CMakeLists.txt \
--replace-fail 'include(Tests)' '# Not building tests' \
@@ -144,6 +139,17 @@ stdenv.mkDerivation (finalAttrs: {
(lib.cmakeFeature "Catch2_SOURCE_DIR" "${catch2_3.src}")
];
env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.hostPlatform.isLinux (toString [
# juce, compiled in this build as part of a Git submodule, uses `-flto` as
# a Link Time Optimization flag, and instructs the plugin compiled here to
# use this flag to. This breaks the build for us. Using _fat_ LTO allows
# successful linking while still providing LTO benefits. If our build of
# `juce` was used as a dependency, we could have patched that `-flto` line
# in our juce's source, but that is not possible because it is used as a
# Git Submodule.
"-ffat-lto-objects"
]);
installPhase = ''
runHook preInstall
+1 -1
View File
@@ -17,7 +17,7 @@ rustPlatform.buildRustPackage rec {
cargoHash = "sha256-8YftVt72JpmxWB/WvOPpduE0/QgYvQhSuFRmsFth2iU=";
sourceRoot = "${src.name}/rust";
buildAndTestSubdir = "gateway";
RUSTFLAGS = "--cfg system_certs";
env.RUSTFLAGS = "--cfg system_certs";
# Required to remove profiling arguments which conflict with this builder
postPatch = ''
@@ -82,7 +82,7 @@ rustPlatform.buildRustPackage rec {
cargoHash = "sha256-TDP1Z4MeQaSER8MGnCEQfIhRsakaSCeJ7boUMBYkkI0=";
sourceRoot = "${src.name}/rust";
buildAndTestSubdir = "gui-client";
RUSTFLAGS = "--cfg system_certs";
env.RUSTFLAGS = "--cfg system_certs";
nativeBuildInputs = [
cargo-tauri.hook
@@ -17,7 +17,7 @@ rustPlatform.buildRustPackage rec {
cargoHash = "sha256-J2IqqFBuoTkbO0nMJbY680G2HTAtC1To/nMra2PCopY=";
sourceRoot = "${src.name}/rust";
buildAndTestSubdir = "headless-client";
RUSTFLAGS = "--cfg system_certs";
env.RUSTFLAGS = "--cfg system_certs";
# Required to remove profiling arguments which conflict with this builder
postPatch = ''
+1 -1
View File
@@ -16,7 +16,7 @@ rustPlatform.buildRustPackage rec {
cargoHash = "sha256-uqy4GgYaSX2kM4a37093lHmhvOtNUhkEs6/ZS1bjuYo=";
sourceRoot = "${src.name}/rust";
buildAndTestSubdir = "relay";
RUSTFLAGS = "--cfg system_certs";
env.RUSTFLAGS = "--cfg system_certs";
# Required to remove profiling arguments which conflict with this builder
postPatch = ''
+1 -1
View File
@@ -18,7 +18,7 @@ rustPlatform.buildRustPackage rec {
cargoHash = "sha256-LKltHVig33zUSWoRgCb1BgeKiJsDnlYEuPfQfrnhafI=";
# freshfetch depends on rust nightly features
env.RUSTC_BOOTSTRAP = 1;
RUSTC_BOOTSTRAP = 1;
meta = {
description = "Fresh take on neofetch";
+1 -1
View File
@@ -19,7 +19,7 @@ rustPlatform.buildRustPackage (finalAttrs: {
cargoHash = "sha256-OoTWGeF96BpPDx1Y9AEVOIBK7kCz6pjw24pLiNcKmOc=";
env.RUSTC_BOOTSTRAP = 1;
RUSTC_BOOTSTRAP = 1;
cargoBuildFlags = [
"--workspace"
+2
View File
@@ -44,6 +44,8 @@ stdenv.mkDerivation rec {
make gatling
'';
env.NIX_CFLAGS_COMPILE = toString [ "-Wno-error=incompatible-pointer-types" ];
meta = {
description = "High performance web server";
homepage = "http://www.fefe.de/gatling/";
+3 -3
View File
@@ -18,16 +18,16 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "gelly";
version = "0.14.0";
version = "0.14.1";
src = fetchFromGitHub {
owner = "Fingel";
repo = "gelly";
tag = "v${finalAttrs.version}";
hash = "sha256-7EmRC8qFN0q9O8FsQiSqYqEfvCg7yKKOxLca098867A=";
hash = "sha256-tjJIIKv4+ElmhLIaZAC/MIqhsZI6RzZBAkXZoN4nLeM=";
};
cargoHash = "sha256-INxtgEg1a8PK0BofySwB2OsLFlVZaiz9nbXGNKB+icE=";
cargoHash = "sha256-sQJrhkyRYTfk2qQ7FXG6IQ4js9Jq4BSWAh9z0V0jdm8=";
nativeBuildInputs = [
pkg-config
+1 -1
View File
@@ -38,7 +38,7 @@ rustPlatform.buildRustPackage rec {
cargoHash = "sha256-rE7SErOhl2fcmvLairq+mvdnbDIk1aPo3eYqwRx5kkA=";
# See https://github.com/mikedilger/gossip/blob/0.9/README.md.
RUSTFLAGS = "--cfg tokio_unstable";
env.RUSTFLAGS = "--cfg tokio_unstable";
# Some users might want to add "rustls-tls(-native)" for Rust TLS instead of OpenSSL.
buildFeatures = [
@@ -18,7 +18,7 @@ rustPlatform.buildRustPackage rec {
cargoHash = "sha256-egrxcnDVKKgk1sL5WNMIR2FPwQbjjMy20VWizcTBEtM=";
# requires nightly features
env.RUSTC_BOOTSTRAP = 1;
RUSTC_BOOTSTRAP = 1;
meta = {
description = "Tool for unit testing tree sitter highlights for nvim-treesitter";
+3 -2
View File
@@ -39,13 +39,13 @@
stdenv.mkDerivation (finalAttrs: {
pname = "hmcl";
version = "3.8.2";
version = "3.9.1";
src = fetchurl {
# HMCL has built-in keys, such as the Microsoft OAuth secret and the CurseForge API key.
# See https://github.com/HMCL-dev/HMCL/blob/refs/tags/release-3.6.12/.github/workflows/gradle.yml#L26-L28
url = "https://github.com/HMCL-dev/HMCL/releases/download/v${finalAttrs.version}/HMCL-${finalAttrs.version}.jar";
hash = "sha256-0vAgyN8PC2AQbor9aVqr/K1oBLt4QGpEQ2vSL2ajQOg=";
hash = "sha256-UcycobEFbiSys19a3C01CqLKTM1SdAwHDNExRNVv6ug=";
};
# - HMCL prompts users to download prebuilt Terracotta binary for
@@ -200,6 +200,7 @@ stdenv.mkDerivation (finalAttrs: {
'';
maintainers = with lib.maintainers; [
daru-san
Misaka13514
moraxyc
];
inherit (hmclJdk.meta) platforms;
+1 -1
View File
@@ -24,7 +24,7 @@ rustPlatform.buildRustPackage (finalAttrs: {
passthru.updateScript = nix-update-script { extraArgs = [ "--version=branch" ]; };
# Use rust nightly features
env.RUSTC_BOOTSTRAP = 1;
RUSTC_BOOTSTRAP = 1;
nativeBuildInputs = [
cmake
+1 -1
View File
@@ -25,7 +25,7 @@ rustPlatform.buildRustPackage (finalAttrs: {
cargoHash = "sha256-YZ2c6W6CCqgyN+6i7Vh5fWLKw8L4pUqvq/tDO/Q/kf0=";
# Use rust nightly features
env.RUSTC_BOOTSTRAP = 1;
RUSTC_BOOTSTRAP = 1;
nativeBuildInputs = [
cmake
+3 -4
View File
@@ -74,6 +74,9 @@ buildFHSEnv {
pkgs: with pkgs; [
libudev0-shim
insync-pkg
# Qt requires usr/share/icons/hicolor/index.theme file (provided by hicolor-icon-theme) to be
# present to successfully find the system tray icons.
hicolor-icon-theme
];
extraInstallCommands = ''
@@ -117,10 +120,6 @@ buildFHSEnv {
and built in sharing.
There is a 15-day free trial, and it is a paid application after that.
Known bug(s):
1) Currently the system try icon does not render correctly.
'';
mainProgram = "insync";
};
+5 -3
View File
@@ -128,9 +128,11 @@ stdenv.mkDerivation (finalAttrs: {
cargo
];
RUST_BACKTRACE = 1;
# https://github.com/Riey/kime/issues/688
RUSTFLAGS = "-Clink-args=-L./target/release";
env = {
RUST_BACKTRACE = 1;
# https://github.com/Riey/kime/issues/688
RUSTFLAGS = "-Clink-args=-L./target/release";
};
meta = {
homepage = "https://github.com/Riey/kime";
+1 -1
View File
@@ -23,7 +23,7 @@ rustPlatform.buildRustPackage rec {
'';
# requires nightly features
env.RUSTC_BOOTSTRAP = true;
RUSTC_BOOTSTRAP = true;
meta = {
description = "Functional programming language and proof assistant";
+1 -1
View File
@@ -13,7 +13,7 @@ rustPlatform.buildRustPackage rec {
version = "0.6.1";
# kord depends on nightly features
env.RUSTC_BOOTSTRAP = 1;
RUSTC_BOOTSTRAP = 1;
src = fetchFromGitHub {
owner = "twitchax";
+1 -1
View File
@@ -53,7 +53,7 @@ rustPlatform.buildRustPackage (finalAttrs: {
];
# we do this here so that the binary is usable during integration tests
RUSTFLAGS = lib.optionalString stdenv.targetPlatform.isElf (
env.RUSTFLAGS = lib.optionalString stdenv.targetPlatform.isElf (
lib.concatStringsSep " " [
"-C link-arg=-Wl,-rpath,${
lib.makeLibraryPath [
+55
View File
@@ -0,0 +1,55 @@
{
lib,
buildGoModule,
fetchFromGitHub,
installShellFiles,
versionCheckHook,
nix-update-script,
}:
buildGoModule (finalAttrs: {
pname = "lazyworktree";
version = "1.17.0";
src = fetchFromGitHub {
owner = "chmouel";
repo = "lazyworktree";
tag = "v${finalAttrs.version}";
hash = "sha256-5e/GnGpNCK/Tqs71UKei2sbnQ5c3MRuNod3VTNodKGM=";
};
vendorHash = "sha256-6TVCpD7xKN7giFhZXInKkohoML+usnzAJ5+4yDBjzJA=";
nativeBuildInputs = [ installShellFiles ];
# Tests require git and are integration tests
doCheck = false;
ldflags = [
"-s"
"-w"
"-X main.version=${finalAttrs.version}"
];
postInstall = ''
install -Dm444 shell/functions.shell -t $out/share/lazyworktree
installManPage lazyworktree.1
'';
doInstallCheck = true;
nativeInstallCheckInputs = [ versionCheckHook ];
passthru.updateScript = nix-update-script { };
meta = {
description = "BubbleTea-based Terminal User Interface for efficient Git worktree management";
homepage = "https://github.com/chmouel/lazyworktree";
changelog = "https://github.com/chmouel/lazyworktree/releases/tag/v${finalAttrs.version}";
license = lib.licenses.asl20;
maintainers = with lib.maintainers; [
chmouel
vdemeester
];
mainProgram = "lazyworktree";
};
})
+3 -3
View File
@@ -20,13 +20,13 @@
stdenv.mkDerivation rec {
pname = "libdeltachat";
version = "2.35.0";
version = "2.36.0";
src = fetchFromGitHub {
owner = "chatmail";
repo = "core";
tag = "v${version}";
hash = "sha256-tcH9F+FKXfFozk6PcbEE37HFIojhDR672bfcPXfKnCs=";
hash = "sha256-w9OxYrKqJJRfxCi4EjmRhqRv+7WPgQwag5CE1qNYeYU=";
};
patches = [
@@ -36,7 +36,7 @@ stdenv.mkDerivation rec {
cargoDeps = rustPlatform.fetchCargoVendor {
pname = "chatmail-core";
inherit version src;
hash = "sha256-p1E7K1EiEftpNSyE41LpMYmkZwjeasZzrXbYxKK/IgI=";
hash = "sha256-o1CtEgjuy+wVbtfCEd3401pt5oBdDoR4xlroi1Q9WQ0=";
};
nativeBuildInputs = [
+5 -1
View File
@@ -33,9 +33,13 @@ stdenv.mkDerivation (finalAttrs: {
patches = [
(fetchpatch {
url = "https://gitlab.archlinux.org/archlinux/packaging/packages/libmspub/-/raw/main/buildfix.diff?ref_type=heads";
url = "https://gitlab.archlinux.org/archlinux/packaging/packages/libmspub/-/raw/8721a52e09e14f905311abd3d5f2ad9bb3fe78a2/buildfix.diff";
hash = "sha256-evxEoQ0a6YHoymR+SEJwqfr7rkWp3JnsWOD1tfYfZOw=";
})
(fetchpatch {
url = "https://gitlab.archlinux.org/archlinux/packaging/packages/libmspub/-/raw/9d565015753364fa458da19e5dd4ce8224cf9246/includes.patch";
hash = "sha256-oHXEWSOSod9VnOrFtdMQcHYm7EdKkG+S7Q9rfM0DaTg=";
})
];
meta = {
+2
View File
@@ -32,6 +32,8 @@ stdenv.mkDerivation rec {
];
enableParallelBuilding = true;
env.NIX_CFLAGS_COMPILE = toString [ "-Wno-error=incompatible-pointer-types" ];
meta = {
description = "GPL reimplementation of libdjb";
homepage = "https://www.fefe.de/libowfat/";
+3
View File
@@ -2,6 +2,7 @@
lib,
buildNpmPackage,
fetchFromGitHub,
nodejs_20,
}:
buildNpmPackage rec {
@@ -17,6 +18,8 @@ buildNpmPackage rec {
npmDepsHash = "sha256-8rUhDo1l0oLENWwy56UzwlSGIBJtTPsH6w5OX8tnp6U=";
nodejs = nodejs_20;
# Prevent Cypress binary download.
CYPRESS_INSTALL_BINARY = 0;
+9 -7
View File
@@ -36,13 +36,15 @@ rustPlatform.buildRustPackage (finalAttrs: {
libglvnd
];
RUSTFLAGS = map (a: "-C link-arg=${a}") [
"-Wl,--push-state,--no-as-needed"
"-lEGL"
"-lwayland-client"
"-lxkbcommon"
"-Wl,--pop-state"
];
env.RUSTFLAGS = toString (
map (a: "-C link-arg=${a}") [
"-Wl,--push-state,--no-as-needed"
"-lEGL"
"-lwayland-client"
"-lxkbcommon"
"-Wl,--pop-state"
]
);
doInstallCheck = true;
nativeInstallCheckInputs = [ versionCheckHook ];
+3 -3
View File
@@ -22,16 +22,16 @@
rustPlatform.buildRustPackage rec {
pname = "mise";
version = "2025.12.12";
version = "2026.1.0";
src = fetchFromGitHub {
owner = "jdx";
repo = "mise";
rev = "v${version}";
hash = "sha256-Grba4mV+eB3+P8v6SgLSwfoRP6TZhiPodZ85uH8yDvQ=";
hash = "sha256-AxNVHWqvLePR4SeVuzUZxLoR0ZGo97I3SJzGOCchjeU=";
};
cargoHash = "sha256-ogSgNuxFN4GjN7JUaXwDu2/gtnqyyxJbVax205g0gZA=";
cargoHash = "sha256-Z8qZEmtFUeT4c78gIWxanVRJEjArLD65j3eaO7fjfz0=";
nativeBuildInputs = [
installShellFiles
+1 -1
View File
@@ -23,7 +23,7 @@ rustPlatform.buildRustPackage rec {
# require running database
doCheck = false;
RUSTFLAGS = [
env.RUSTFLAGS = toString [
# MEMO: mitra use ammonia crate with unstable rustc flag
"--cfg=ammonia_unstable"
];
+7 -11
View File
@@ -19,18 +19,14 @@ rustPlatform.buildRustPackage (finalAttrs: {
};
cargoHash = "sha256-U8U70nzTmpY6r8J661EJ4CGjx6vWrGovu5m25dvz5sY=";
# Requires nightly features
env = {
RUSTC_BOOTSTRAP = 1;
# Without -headerpad, the following error occurs on x86_64-darwin
# error: install_name_tool: changing install names or rpaths can't be redone for: ... because larger updated load commands do not fit (the program must be relinked, and you may need to use -headerpad or -headerpad_max_install_names)
NIX_LDFLAGS = toString (
lib.optionals (with stdenv.hostPlatform; isDarwin && isx86_64) [
"-headerpad_max_install_names"
]
);
};
env.RUSTC_BOOTSTRAP = 1;
# Without -headerpad, the following error occurs on x86_64-darwin
# error: install_name_tool: changing install names or rpaths can't be redone for: ... because larger updated load commands do not fit (the program must be relinked, and you may need to use -headerpad or -headerpad_max_install_names)
NIX_LDFLAGS = lib.optionals (with stdenv.hostPlatform; isDarwin && isx86_64) [
"-headerpad_max_install_names"
];
buildInputs = [
icu
+3 -3
View File
@@ -7,16 +7,16 @@
php83.buildComposerProject2 (finalAttrs: {
pname = "n98-magerun2";
version = "9.1.0";
version = "9.2.1";
src = fetchFromGitHub {
owner = "netz98";
repo = "n98-magerun2";
tag = finalAttrs.version;
hash = "sha256-kjT72pLKuN166Edm8+8vUIfhFdMnZkeTagl0ECL20b8=";
hash = "sha256-00VbleO94noopyqy9XOyHTi5M2ECEhWaT/byXgNEed0=";
};
vendorHash = "sha256-wqaePPMC1OiXwtdhMJzg4AvcYDmJg2Uo2LV7TbZ00ec=";
vendorHash = "sha256-g9O83bq3OoXM3kP2qmvuYaXywfkDc/GQxjkLBU9XmOc=";
nativeInstallCheckInputs = [ versionCheckHook ];
doInstallCheck = true;
+1
View File
@@ -46,6 +46,7 @@ stdenv.mkDerivation (finalAttrs: {
];
env.NIX_CFLAGS_COMPILE = toString [
"-std=c17"
"-Wno-error=implicit-function-declaration"
"-Wno-error=implicit-int"
"-Wno-error=incompatible-pointer-types"
+64
View File
@@ -0,0 +1,64 @@
{
lib,
cmake,
fetchFromGitHub,
fetchpatch2,
gtest,
nix-update-script,
stdenv,
testers,
validatePkgConfig,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "nbytes";
version = "0.1.2";
src = fetchFromGitHub {
owner = "nodejs";
repo = "nbytes";
tag = "v${finalAttrs.version}";
hash = "sha256-lsd1Qrv1HEz/5ry10s7Pq7unoh3y9ZmwCaT+6nTlxkc=";
};
patches = [
# Use `gtest` from Nixpkgs to allow an offline build
./use-nix-googletest.patch
# Add support for pkgconfig for use as a shared lib
# TODO: remove when included in the next release
(fetchpatch2 {
url = "https://github.com/nodejs/nbytes/commit/00f48a0620cef800054d4aab061f09d89990a1b9.patch?full_index=1";
hash = "sha256-uOPEI70Dq446K56BSFHVyxDHNaYY5OASu3QeWGCLQmI=";
})
];
outputs = [
"out"
];
nativeBuildInputs = [
cmake
validatePkgConfig
];
buildInputs = [
gtest
];
passthru = {
updateScript = nix-update-script { };
tests.pkg-config = testers.hasPkgConfigModules {
package = finalAttrs.finalPackage;
};
};
meta = {
description = "Library of byte handling functions extracted from Node.js core";
homepage = "https://github.com/nodejs/nbytes";
changelog = "https://github.com/nodejs/nbytes/releases/tag/v${finalAttrs.version}";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ aduh95 ];
platforms = lib.platforms.all;
pkgConfigModules = [ "nbytes" ];
};
})
@@ -0,0 +1,22 @@
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f2efa3c..3f363dd 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -11,15 +11,9 @@ endif()
option(NBYTES_DEVELOPMENT_CHECKS "Enable development checks" OFF)
include(GNUInstallDirs)
-include(FetchContent)
-FetchContent_Declare(
- googletest
- URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip
-)
-# For Windows: Prevent overriding the parent project's compiler/linker settings
-set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
-FetchContent_MakeAvailable(googletest)
+# Use find_package to use the gtest package provided by Nix
+find_package(GTest REQUIRED)
add_subdirectory(src)
enable_testing()
+23
View File
@@ -5,15 +5,32 @@
fetchFromGitHub,
jq,
lib,
makeWrapper,
mariadb,
minio,
minio-client,
postgresql,
python3,
redis,
writeShellScriptBin,
}:
let
dbmate-real = writeShellScriptBin "dbmate.real" ''
exec ${dbmate}/bin/dbmate "$@"
'';
dbmate-wrapper = buildGoModule {
pname = "ncps-dbmate-wrapper";
inherit (finalAttrs) version;
src = "${finalAttrs.src}/nix/dbmate-wrapper/src";
vendorHash = null;
subPackages = [ "." ];
};
finalAttrs = {
pname = "ncps";
version = "0.6.0";
@@ -46,6 +63,7 @@ let
postgresql # PostgreSQL for integration tests
python3 # used for generating the ports
redis # Redis for distributed locking integration tests
makeWrapper # For wrapping dbmate.
];
# pre and post checks
@@ -68,6 +86,11 @@ let
postInstall = ''
mkdir -p $out/share/ncps
cp -r db $out/share/ncps/db
makeWrapper ${dbmate-wrapper}/bin/dbmate-wrapper \
$out/bin/dbmate-ncps \
--prefix PATH : ${dbmate-real}/bin \
--set NCPS_DB_MIGRATIONS_DIR $out/share/ncps/db/migrations
'';
meta = {
+9
View File
@@ -2,6 +2,7 @@
stdenv,
lib,
fetchFromGitHub,
fetchpatch,
makeWrapper,
bison,
flex,
@@ -30,6 +31,14 @@ stdenv.mkDerivation rec {
hash = "sha256-P1xZqhZ/HJV3fAvh4xhhApZ0+FLDFqvYrZlbvb+FV7I=";
};
patches = [
# GCC 15 compatibility
(fetchpatch {
url = "https://github.com/netsniff-ng/netsniff-ng/commit/1af7ae33e3e8178ab5c649c3a52838d4375c4228.patch";
sha256 = "sha256-aNV1Srnr396HsyAKVQoCeGBo/oduxLrUidlZLuI5Rlk=";
})
];
nativeBuildInputs = [
bison
flex
+2 -4
View File
@@ -21,10 +21,8 @@ rustPlatform.buildRustPackage rec {
hardeningDisable = [ "stackprotector" ];
env = {
NIX_SYSTEM = stdenv.system;
RUSTC_BOOTSTRAP = "1";
};
NIX_SYSTEM = stdenv.system;
RUSTC_BOOTSTRAP = "1";
preCheck = ''
export NIX_LD=${stdenv.cc.bintools.dynamicLinker}
@@ -37,6 +37,8 @@ SWITCH_TO_CONFIGURATION_CMD_PREFIX: Final = [
"LOCALE_ARCHIVE",
"-E",
"NIXOS_INSTALL_BOOTLOADER",
"-E",
"NIXOS_NO_CHECK",
"--collect",
"--no-ask-password",
"--pipe",
@@ -0,0 +1,31 @@
From 8ddb983a546f632986a84a784c4625110f7782a2 Mon Sep 17 00:00:00 2001
From: Arthur de Jong <arthur@arthurdejong.org>
Date: Sun, 23 Feb 2025 15:22:38 +0100
Subject: Fix variable name (bool) which is a keyword in C23
Closes https://bugs.debian.org/1097481
---
nslcd/cfg.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/nslcd/cfg.c b/nslcd/cfg.c
index ded797a..b984b0e 100644
--- a/nslcd/cfg.c
+++ b/nslcd/cfg.c
@@ -207,10 +207,10 @@ static int get_boolean(const char *filename, int lnr,
return parse_boolean(filename, lnr, token);
}
-static const char *print_boolean(int bool)
+static const char *print_boolean(int value)
{
- if (bool) return "yes";
- else return "no";
+ if (value) return "yes";
+ else return "no";
}
#define TIME_MINUTES 60
--
cgit v1.2.3
@@ -19,6 +19,11 @@ stdenv.mkDerivation rec {
sha256 = "sha256-4BeE4Xy1M7tmvQYB4gXnhSY0RcPC33pvkCMqtBMccW0=";
};
patches = [
# Fix C23 compatibility: rename 'bool' variable which is now a keyword
./fix-bool-c23-keyword.patch
];
nativeBuildInputs = [
pkg-config
makeWrapper
+2 -2
View File
@@ -10,14 +10,14 @@
python3Packages.buildPythonApplication rec {
pname = "nwg-hello";
version = "0.4.1";
version = "0.4.2";
pyproject = true;
src = fetchFromGitHub {
owner = "nwg-piotr";
repo = "nwg-hello";
tag = "v${version}";
hash = "sha256-h/2e2pQw4ID17kT36AMzFe/FX6pYxxOxqkmHVHS5R1E=";
hash = "sha256-SLz9qnk8JESTj1EeTJiQboDylEHC6r5KbvDhZ4zgiAo=";
};
nativeBuildInputs = [
+3 -3
View File
@@ -14,12 +14,12 @@
}:
let
pname = "opencode";
version = "1.1.3";
version = "1.1.6";
src = fetchFromGitHub {
owner = "anomalyco";
repo = "opencode";
tag = "v${version}";
hash = "sha256-uNeje6WZ/FJVOtxdTdWXbWhPl7BwMws+7/Iz2Hz/stw=";
hash = "sha256-CXABHBk+stVF57+5oGkuMRFJpwA6qb7AMpkFVWfs38c=";
};
node_modules = stdenvNoCC.mkDerivation {
@@ -71,7 +71,7 @@ let
# NOTE: Required else we get errors that our fixed-output derivation references store paths
dontFixup = true;
outputHash = "sha256-LJ7xgKQP0ows76P8QVflS6SGGowVBYVvarkmCVkfe60=";
outputHash = "sha256-tea/pSuUOELsSSMdwi0mmG5GsFZpqR5MlyQvVUno7dM=";
outputHashAlgo = "sha256";
outputHashMode = "recursive";
};
+1 -1
View File
@@ -17,7 +17,7 @@ stdenv.mkDerivation {
inherit version;
src = fetchurl {
url = "http://bugseng.com/products/ppl/download/ftp/releases/${version}/ppl-${version}.tar.bz2";
url = "https://mirror.metanet.ch/sage/spkg/upstream/ppl/ppl-${version}.tar.bz2";
sha256 = "1wgxcbgmijgk11df43aiqfzv31r3bkxmgb4yl68g21194q60nird";
};
+7 -1
View File
@@ -58,7 +58,13 @@ stdenv.mkDerivation rec {
env.NIX_CFLAGS_COMPILE = toString [
# Support JACK output in the standalone application:
"-DJUCE_JACK"
# Accommodate -flto:
# juce, compiled in this build as part of a Git submodule, uses `-flto` as
# a Link Time Optimization flag, and instructs the plugin compiled here to
# use this flag to. This breaks the build for us. Using _fat_ LTO allows
# successful linking while still providing LTO benefits. If our build of
# `juce` was used as a dependency, we could have patched that `-flto` line
# in our juce's source, but that is not possible because it is used as a
# Git Submodule.
"-ffat-lto-objects"
];

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