5 Commits

Author SHA1 Message Date
8090f42cc2 jetbrains: generate IDEA packages 2021-01-26 19:35:45 +11:00
c67b2c2b0e jetbrains: normalize file names 2021-01-26 19:35:45 +11:00
af57ecdd22 jetbrains: add update script wrapper
The main script only does a single program, and requires being fed the
name. This is a wrapper to get those names.
2021-01-26 19:35:45 +11:00
fb2bbf59d0 jetbrains: include small set of generated IDEA plugins 2021-01-25 15:27:16 +11:00
3c8d8f0347 jetbrains: move to auto-generated plugins
Some edge cases but appears to work on my machine (TM).

Still TODO is setting up the job to generate and commit updates.
2021-01-25 15:27:16 +11:00
51 changed files with 95620 additions and 761 deletions

View File

@ -4,5 +4,3 @@ updates:
directory: "/" directory: "/"
schedule: schedule:
interval: "weekly" interval: "weekly"
commit-message:
prefix: "ci"

View File

@ -1,26 +1,14 @@
name: "CI" name: "Build and populate cache"
on: on:
pull_request: pull_request:
push: push:
schedule:
# rebuild everyday at 6:50
# TIP: Choose a random time here so not all repositories are build at once:
# https://www.random.org/clock-times/?num=1&earliest=01%3A00&latest=08%3A00&interval=5&format=html&rnd=new
- cron: '50 6 * * *'
jobs: jobs:
tests:
checks:
strategy:
matrix:
check:
- nixpkgs-fmt
- deadnix
- nur
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- uses: cachix/install-nix-action@v22
- name: Check ${{ matrix.check }}
# Depends on nixos/nix#7759 to simply `nix flake check`
run: nix run .#checks.$(nix eval --raw --impure --expr "builtins.currentSystem").${{ matrix.check }}
build-and-update:
strategy: strategy:
matrix: matrix:
# Set this to notify the global nur package registry that changes are # Set this to notify the global nur package registry that changes are
@ -40,22 +28,30 @@ jobs:
# in your repository settings in Github found at https://github.com/<your_githubname>/nur-packages/settings/secrets # in your repository settings in Github found at https://github.com/<your_githubname>/nur-packages/settings/secrets
cachixName: cachixName:
- xeals - xeals
nixPath:
- nixpkgs=channel:nixos-unstable
- nixpkgs=channel:nixpkgs-unstable
# Disable due to buildGoModule and buildRustPackage
# - nixpkgs=channel:nixos-20.03
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v3 uses: actions/checkout@v2.3.4
- name: Install nix - name: Install nix
uses: cachix/install-nix-action@v22 uses: cachix/install-nix-action@v12
with:
nix_path: "${{ matrix.nixPath }}"
- name: Show nixpkgs version - name: Show nixpkgs version
run: nix eval --impure --expr '(import ./flake-compat.nix { src = ./.; }).lib.version' run: nix-instantiate --eval -E '(import <nixpkgs> {}).lib.version'
- name: Setup cachix - name: Setup cachix
uses: cachix/cachix-action@v12 uses: cachix/cachix-action@v8
if: ${{ matrix.cachixName != '<YOUR_CACHIX_NAME>' }} if: ${{ matrix.cachixName != '<YOUR_CACHIX_NAME>' }}
with: with:
name: ${{ matrix.cachixName }} name: ${{ matrix.cachixName }}
signingKey: '${{ secrets.CACHIX_SIGNING_KEY }}' signingKey: '${{ secrets.CACHIX_SIGNING_KEY }}'
- name: Build nix packages - name: Build nix packages
run: nix develop .#ci -c nix-build-uncached ci.nix -A cacheOutputs # TODO switch to default nixpkgs channel once nix-build-uncached 1.0.0 is in stable
run: nix run -I 'nixpkgs=channel:nixos-unstable' nixpkgs.nix-build-uncached -c nix-build-uncached ci.nix -A cacheOutputs
- name: Trigger NUR update - name: Trigger NUR update
if: ${{ matrix.nurRepo != '<YOUR_REPO_NAME>' }} if: ${{ matrix.nurRepo != '<YOUR_REPO_NAME>' }}
run: curl -XPOST "https://nur-update.nix-community.org/update?repo=${{ matrix.nurRepo }}" run: curl -XPOST "https://nur-update.herokuapp.com/update?repo=${{ matrix.nurRepo }}"

View File

@ -1,24 +0,0 @@
name: "Update flake inputs"
on:
workflow_dispatch:
schedule:
# bump weekly at 6:50
- cron: '50 6 * * 1'
jobs:
update-flake:
runs-on: ubuntu-latest
strategy:
fail-fast: false
steps:
- name: Checkout repository
uses: actions/checkout@v3
- uses: cachix/install-nix-action@v22
with:
extra_nix_config: |
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
- name: "flake: update inputs"
uses: DeterminateSystems/update-flake-lock@v20
with:
pr-title: "flake: update inputs"
pr-labels: dependencies
commit-msg: "flake: update inputs"

View File

@ -2,7 +2,7 @@
**My personal [NUR](https://github.com/nix-community/NUR) repository** **My personal [NUR](https://github.com/nix-community/NUR) repository**
[![CI](https://github.com/xeals/nur-packages/actions/workflows/build.yml/badge.svg)](https://github.com/xeals/nur-packages/actions) [![Cachix Cache](https://img.shields.io/badge/cachix-xeals-blue.svg)](https://xeals.cachix.org) [![Build and populate cache](https://github.com/xeals/nur-packages/workflows/Build%20and%20populate%20cache/badge.svg)](https://github.com/xeals/nur-packages/actions) [![Cachix Cache](https://img.shields.io/badge/cachix-xeals-blue.svg)](https://xeals.cachix.org)
## Noteworthy packages ## Noteworthy packages

View File

@ -1,15 +0,0 @@
{ pkgs
, lib ? pkgs.lib
, unitDir ? "unit"
, packageFun ? "package.nix"
, root ? "${./pkgs}/${unitDir}"
}:
let
shards = lib.attrNames (builtins.readDir root);
namesForShard = shard: lib.mapAttrs'
(name: _: { inherit name; value = root + "/${shard}/${name}"; })
(builtins.readDir (root + "/${shard}"));
namesToPath = lib.foldl' lib.recursiveUpdate { } (map namesForShard shards);
units = lib.mapAttrs (_: path: pkgs.callPackage (path + "/${packageFun}") { }) namesToPath;
in
units

16
ci.nix
View File

@ -9,7 +9,7 @@
# then your CI will be able to build and cache only those packages for # then your CI will be able to build and cache only those packages for
# which this is possible. # which this is possible.
{ pkgs ? import ./flake-compat.nix { src = ./.; } }: { pkgs ? import <nixpkgs> {} }:
with builtins; with builtins;
@ -29,10 +29,10 @@ let
let let
f = p: f = p:
if shouldRecurseForDerivations p then flattenPkgs p if shouldRecurseForDerivations p then flattenPkgs p
else if isDerivation p then [ p ] else if isDerivation p then [p]
else [ ]; else [];
in in
concatMap f (attrValues s); concatMap f (attrValues s);
outputsOf = p: map (o: p.${o}) p.outputs; outputsOf = p: map (o: p.${o}) p.outputs;
@ -40,10 +40,10 @@ let
nurPkgs = nurPkgs =
flattenPkgs flattenPkgs
(listToAttrs (listToAttrs
(map (n: nameValuePair n nurAttrs.${n}) (map (n: nameValuePair n nurAttrs.${n})
(filter (n: !isReserved n) (filter (n: !isReserved n)
(attrNames nurAttrs)))); (attrNames nurAttrs))));
in in

View File

@ -7,11 +7,9 @@
# nix-build -A mypackage # nix-build -A mypackage
{ pkgs ? import <nixpkgs> { } }: { pkgs ? import <nixpkgs> { } }:
let
legacy = import ./pkgs/top-level/all-packages.nix { inherit pkgs; }; import ./pkgs/top-level/all-packages.nix { inherit pkgs; }
units = import ./callUnitRoot.nix { inherit pkgs; root = ./pkgs/unit; }; // {
in
legacy // units // {
# The `lib`, `modules`, and `overlay` names are special # The `lib`, `modules`, and `overlay` names are special
lib = import ./lib { inherit pkgs; }; # functions lib = import ./lib { inherit pkgs; }; # functions
modules = import ./modules; # NixOS modules modules = import ./modules; # NixOS modules

View File

@ -1,12 +0,0 @@
{ src, system ? builtins.currentSystem or "unknown-system" }:
let
lockFilePath = "${src}/flake.lock";
lockFile = builtins.fromJSON (builtins.readFile lockFilePath);
nixpkgs = lockFile.nodes.nixpkgs.locked;
tarball = fetchTarball {
url = "https://github.com/${nixpkgs.owner}/${nixpkgs.repo}/archive/${nixpkgs.rev}.zip";
sha256 = nixpkgs.narHash;
};
in
import tarball { inherit system; }

30
flake.lock generated
View File

@ -1,15 +1,12 @@
{ {
"nodes": { "nodes": {
"flake-utils": { "flake-utils": {
"inputs": {
"systems": "systems"
},
"locked": { "locked": {
"lastModified": 1692799911, "lastModified": 1605370193,
"narHash": "sha256-3eihraek4qL744EvQXsK1Ha6C3CR7nnT8X2qWap4RNk=", "narHash": "sha256-YyMTf3URDL/otKdKgtoMChu4vfVL3vCMkRqpGifhUn0=",
"owner": "numtide", "owner": "numtide",
"repo": "flake-utils", "repo": "flake-utils",
"rev": "f9e7cf818399d17d347f847525c5a5a8032e4e44", "rev": "5021eac20303a61fafe17224c087f5519baed54d",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -20,11 +17,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1693145325, "lastModified": 1611414562,
"narHash": "sha256-Gat9xskErH1zOcLjYMhSDBo0JTBZKfGS0xJlIRnj6Rc=", "narHash": "sha256-u002KfYA7Uk3vffnnmLz88BmxOzixYFdh+8II6ZT+Kg=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "cddebdb60de376c1bdb7a4e6ee3d98355453fe56", "rev": "9d6fd2ba135c5b5c85c3332604d39b43e93b8298",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -39,21 +36,6 @@
"flake-utils": "flake-utils", "flake-utils": "flake-utils",
"nixpkgs": "nixpkgs" "nixpkgs": "nixpkgs"
} }
},
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
} }
}, },
"root": "root", "root": "root",

108
flake.nix
View File

@ -1,81 +1,47 @@
{ {
description = "xeals's Nix repository"; description = "xeals's flake";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; inputs = {
inputs.flake-utils.url = "github:numtide/flake-utils"; nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, flake-utils }: outputs = { self, nixpkgs, flake-utils }:
let let
inherit (nixpkgs) lib; inherit (flake-utils.lib) eachDefaultSystem flattenTree;
inherit (flake-utils.lib) mkApp; inherit (nixpkgs.lib.attrsets) filterAttrs mapAttrs;
in in
flake-utils.lib.eachDefaultSystem {
(system: nixosModules = mapAttrs (_: path: import path) (import ./modules);
let
pkgs = import nixpkgs { inherit system; };
in
{
# nixos/rfcs#140
# Only produces the package set of the proposed functionality.
# Unstable names are variables.
packages =
let
legacyPackages = import ./pkgs/top-level/all-packages.nix { inherit pkgs; };
unitPackages = import ./callUnitRoot.nix { inherit pkgs; };
onlyAvailable = lib.filterAttrs (_: drv: builtins.elem system (drv.meta.platforms or [ ]));
in
onlyAvailable (legacyPackages // unitPackages);
checks = {
nixpkgs-fmt = pkgs.writeShellScriptBin "nixpkgs-fmt-check" ''
${pkgs.nixpkgs-fmt}/bin/nixpkgs-fmt --check .
'';
deadnix = pkgs.writeShellScriptBin "deadnix-check" ''
${pkgs.deadnix}/bin/deadnix --fail .
'';
# Ensures that the NUR bot can evaluate and find all our packages.
# Normally we'd also run with `--option restrict-eval true`, but
# this is incompatible with flakes because reasons.
nur = pkgs.writeShellScriptBin "nur-check" ''
# Prefer nixpkgs channel (actual build), otherwise read from flake.lock (CI)
if ! nixpkgs=$(nix-instantiate --find-file nixpkgs 2>/dev/null); then
_rev=$(${pkgs.jq}/bin/jq -r .nodes.nixpkgs.locked.rev flake.lock)
nixpkgs="https://github.com/nixos/nixpkgs/archive/''${_rev}.tar.gz"
fi
nix-env -f . -qa \* --meta \
--allowed-uris https://static.rust-lang.org \
--option allow-import-from-derivation true \
--drv-path --show-trace \
-I nixpkgs="$nixpkgs" \
-I ./ \
--json | ${pkgs.jq}/bin/jq -r 'values | .[].name'
'';
};
devShells.ci = pkgs.mkShellNoCC {
buildInputs = [ pkgs.nix-build-uncached ];
};
apps = {
alacritty = mkApp { drv = pkgs.alacritty-ligatures; exePath = "/bin/alacritty"; };
protonmail-bridge = mkApp { drv = pkgs.protonmail-bridge; };
protonmail-bridge-headless = mkApp { drv = pkgs.protonmail-bridge; };
psst-cli = mkApp { drv = pkgs.psst; exePath = "/bin/psst-cli"; };
psst-gui = mkApp { drv = pkgs.psst; exePath = "/bin/psst-gui"; };
samrewritten = mkApp { drv = pkgs.samrewritten; };
spotify-ripper = mkApp { drv = pkgs.spotify-ripper; };
};
})
// {
nixosModules = lib.mapAttrs (_: path: import path) (import ./modules) // {
default = {
imports = lib.attrValues self.nixosModules;
};
};
overlays = import ./overlays // { overlays = import ./overlays // {
pkgs = _: prev: import ./pkgs/top-level/all-packages.nix { pkgs = prev; }; pkgs = final: prev: import ./pkgs/top-level/all-packages.nix { pkgs = prev; };
default = _: _: { xeals = nixpkgs.lib.composeExtensions self.overlays.pkgs; };
}; };
};
overlay = final: prev: {
xeals = nixpkgs.lib.composeExtensions self.overlays.pkgs;
};
} // eachDefaultSystem (system:
let
pkgs = nixpkgs.legacyPackages.${system};
xPkgs = import ./pkgs/top-level/all-packages.nix { inherit pkgs; };
mkApp = opts: { type = "app"; } // opts;
in
rec {
packages = filterAttrs
(attr: drv: builtins.elem system (drv.meta.platforms or [ ]))
(flattenTree xPkgs);
apps = flattenTree {
alacritty = mkApp { program = "${packages.alacritty-ligatures}/bin/alacritty"; };
protonmail-bridge = mkApp { program = "${packages.protonmail-bridge}/bin/protonmail-bridge"; };
protonmail-bridge-headless = mkApp { program = "${packages.protonmail-bridge}/bin/protonmail-bridge"; };
psst = {
cli = mkApp { program = "${packages.psst}/bin/psst-cli"; };
gui = mkApp { program = "${packages.psst}/bin/psst-gui"; };
};
samrewritten = mkApp { program = "${packages.samrewritten}/bin/samrewritten"; };
spotify-ripper = mkApp { program = "${packages.spotify-ripper}/bin/spotify-ripper"; };
};
});
} }

View File

@ -2,7 +2,6 @@
amdgpu-common = ./services/hardware/amdgpu-common.nix; amdgpu-common = ./services/hardware/amdgpu-common.nix;
amdgpu-fan = ./services/hardware/amdgpu-fan.nix; amdgpu-fan = ./services/hardware/amdgpu-fan.nix;
amdgpu-pwm = ./services/hardware/amdgpu-pwm.nix; amdgpu-pwm = ./services/hardware/amdgpu-pwm.nix;
dunst = ./services/x11/dunst.nix;
radeon-profile-daemon = ./services/hardware/radeon-profile-daemon.nix; radeon-profile-daemon = ./services/hardware/radeon-profile-daemon.nix;
} }

View File

@ -1,4 +1,4 @@
{ lib, ... }: { config, lib, pkgs, ... }:
with lib; with lib;
@ -7,7 +7,7 @@ with lib;
cards = mkOption { cards = mkOption {
type = types.listOf types.str; type = types.listOf types.str;
default = [ "card0" ]; default = [ "card0" ];
example = [ "card0" "card1" ]; example = literalExample ''[ "card0" ]'';
description = '' description = ''
A list of cards to enable fan configuration for. The identifiers for A list of cards to enable fan configuration for. The identifiers for
each device can be found in /sys/class/drm/ as card0, card1, etc. each device can be found in /sys/class/drm/ as card0, card1, etc.

View File

@ -33,12 +33,14 @@ in
[ 75 89 ] [ 75 89 ]
[ 80 100 ] [ 80 100 ]
]; ];
example = [ example = literalExample ''
[ 0 0 ] [
[ 40 30 ] [ 0 0 ]
[ 60 50 ] [ 40 30 ]
[ 80 100 ] [ 60 50 ]
]; [ 80 100 ]
]
'';
description = '' description = ''
A list of temperature-fan speed pairs. The temperature is specified in A list of temperature-fan speed pairs. The temperature is specified in
degrees celcius, and speed is specified in %. degrees celcius, and speed is specified in %.

View File

@ -1,4 +1,4 @@
{ config, lib, ... }: { config, lib, pkgs, ... }:
with lib; with lib;

View File

@ -1,68 +0,0 @@
{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.services.dunst;
in
{
options.services.dunst = {
enable = mkEnableOption "dunst";
package = mkOption {
type = types.package;
default = pkgs.dunst;
};
settings = mkOption {
type = types.nullOr types.attrs;
default = null;
description = ''
Configuration set alternative to <literal>configFile</literal>.
'';
example = {
global = {
monitor = 0;
follow = "none";
};
};
};
configFile = mkOption {
type = types.nullOr types.path;
default = null;
description = "Path to dunstrc configuration file.";
};
};
config = mkIf cfg.enable {
assertions = [
{
assertion = !(cfg.settings != null && cfg.configFile != null);
message = "only one of services.dunst.settings or .configFile may be specified";
}
];
environment.systemPackages = [ (getOutput "man" cfg.package) ];
systemd.user.services.dunst = {
description = "Dunst notification daemon";
documentation = [ "man:dunst(1)" ];
after = [ "graphical-session-pre.target" ];
partOf = [ "graphical-session.target" ];
serviceConfig = {
Type = "dbus";
BusName = "org.freedesktop.Notifications";
ExecStart =
let
config =
if (cfg.settings != null)
then pkgs.writeText "dunstrc" (generators.toINI { } cfg.settings)
else if (cfg.configFile != null)
then cfg.configFile
else null;
in
"${cfg.package}/bin/dunst ${optionalString (config != null) "-conf ${config}"}";
};
};
};
}

View File

@ -2,7 +2,7 @@
# case where you don't want to add the whole NUR namespace to your # case where you don't want to add the whole NUR namespace to your
# configuration. # configuration.
_self: super: self: super:
let let

View File

@ -1,4 +1,4 @@
{ lib { stdenv
, fetchFromGitHub , fetchFromGitHub
, python3Packages , python3Packages
@ -20,7 +20,7 @@ python3Packages.buildPythonApplication rec {
doCheck = false; doCheck = false;
meta = with lib; { meta = with stdenv.lib; {
homepage = "https://github.com/Prior99/mopidy-subidy"; homepage = "https://github.com/Prior99/mopidy-subidy";
description = "Mopidy extension for playing music from Subsonic servers"; description = "Mopidy extension for playing music from Subsonic servers";
license = licenses.bsd3; license = licenses.bsd3;

View File

@ -1,10 +1,9 @@
{ lib { stdenv
, fetchFromGitHub , fetchFromGitHub
, rustPlatform , rustPlatform
, cmake
, pkg-config , pkg-config
, alsaLib
, dbus
, openssl , openssl
# GUI # GUI
@ -15,27 +14,27 @@
}: }:
let let
inherit (lib) optional optionals; inherit (stdenv.lib) optional optionals;
in in
assert withGui -> gtk3.meta.available; assert withGui -> gtk3.meta.available;
rustPlatform.buildRustPackage rec { rustPlatform.buildRustPackage rec {
pname = "psst"; pname = "psst";
version = "20221012.d70ed81"; version = "20210122.gec114ac";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "jpochyla"; owner = "jpochyla";
repo = "psst"; repo = "psst";
rev = "d70ed8104533dc15bc36b989ba8428872c9b578f"; rev = "ec114ac8299179c8dd51bc026d6060dc75658b83";
hash = "sha256-ZKhHN0ruLb6ZVKkrKv/YawRsVop6SP1QF/nrtkmA8P8="; sha256 = "02mh6hjnlimadc3w899hccss31p1r4sxgb5880zwn7yiycbq3yyj";
fetchSubmodules = true; fetchSubmodules = true;
}; };
cargoSha256 = "sha256-zH6+EV78FDVOYEFXk0f54pH2Su0QpK1I0bHqzIiMdBo="; cargoSha256 = "1m01rycnpy9asspih1x9l5ppfbjnqcfdycmzgkrmdwzah3x8s8xc";
nativeBuildInputs = [ pkg-config ] nativeBuildInputs = [ pkg-config ]
++ optional withGui copyDesktopItems; ++ optional withGui copyDesktopItems;
buildInputs = [ alsaLib dbus openssl ] buildInputs = [ openssl ]
++ optional withGui gtk3; ++ optional withGui gtk3;
cargoBuildFlags = optionals (!withGui) [ cargoBuildFlags = optionals (!withGui) [
@ -55,16 +54,16 @@ rustPlatform.buildRustPackage rec {
name = pname; name = pname;
desktopName = "psst"; desktopName = "psst";
genericName = "Spotify Player"; genericName = "Spotify Player";
categories = [ "AudioVideo" "Audio" "Network" "Player" ]; categories = "AudioVideo;Audio;Network;Player;";
comment = "Spotify client with native GUI"; comment = "Spotify client with native GUI";
exec = "psst-gui"; exec = "psst-gui";
keywords = [ "spotify" "music" ]; extraEntries = "Keywords=spotify;music;";
icon = "spotify"; icon = "spotify";
type = "Application"; type = "Application";
}) })
]; ];
meta = with lib; { meta = with stdenv.lib; {
description = "Fast and multi-platform Spotify client with native GUI "; description = "Fast and multi-platform Spotify client with native GUI ";
homepage = "https://github.com/jpochyla/psst"; homepage = "https://github.com/jpochyla/psst";
license = licenses.mit; license = licenses.mit;

View File

@ -1,45 +0,0 @@
{ lib, stdenv, fetchzip }:
self:
let
commonBuild = import ../../../build-support/jetbrains/plugin.nix {
inherit lib stdenv fetchzip;
jetbrainsPlatforms = [
"clion"
"datagrip"
"goland"
"idea-community"
"idea-ultimate"
"phpstorm"
"pycharm-community"
"pycharm-professional"
"rider"
"ruby-mine"
"webstorm"
];
};
generateCommon = lib.makeOverridable (
{ common ? ./manual-common-packages.nix
}:
let
imported = import common {
inherit (self) callPackage;
};
super = imported;
overrides = { };
jetbrainsPlugins = super // overrides;
in
jetbrainsPlugins // { inherit commonBuild; }
);
in
generateCommon { }

File diff suppressed because it is too large Load Diff

View File

@ -9,25 +9,21 @@ let
jetbrainsPlatforms = [ "idea-community" "idea-ultimate" ]; jetbrainsPlatforms = [ "idea-community" "idea-ultimate" ];
}; };
generateIdea = lib.makeOverridable ( generateIdea = lib.makeOverridable ({
{ idea ? ./manual-idea-packages.nix idea ? ./idea-generated.nix
}: }: let
let
imported = import idea { imported = import idea {
inherit (self) callPackage; inherit (self) callPackage;
}; };
super = imported; super = imported;
overrides = { }; overrides = { };
ideaPlugins = super // overrides; ideaPlugins = super // overrides;
in in ideaPlugins // { inherit ideaBuild; });
ideaPlugins // { inherit ideaBuild; }
);
in in generateIdea { }
generateIdea { }

View File

@ -1,33 +0,0 @@
{ callPackage }:
{
ideavim = callPackage
({ commonBuild }: commonBuild {
pname = "IdeaVim";
version = "0.57";
pluginId = 164;
versionId = 85009;
sha256 = "1rwfwj0b0nwi7jxhzxk1r0xc190nf4i3b59i0zknpmgb4yc5clzw";
})
{ };
checkstyle-idea = callPackage
({ commonBuild }: commonBuild {
pname = "CheckStyle-IDEA";
version = "5.42.0";
pluginId = 1065;
versionId = 95757;
sha256 = "0sji3649n5zz84dlidqaklipq6vaiafxsvg0gzy3j59mvkz6dk14";
})
{ };
google-java-format = callPackage
({ commonBuild }: commonBuild rec {
pname = "google-java-format";
version = "1.7.0.4";
pluginId = 8527;
versionId = 83164;
sha256 = "1pmnn1ksiv44kdga53gi3psrm2sva4bqrxizagbr0if2n0rrvgii";
filename = "${pname}.zip";
})
{ };
}

View File

@ -1,12 +0,0 @@
{ callPackage }:
{
spring-assistant = callPackage
({ ideaBuild }: ideaBuild {
pname = "intellij-spring-assistant";
version = "0.12.0";
pluginId = 10229;
versionId = 44968;
sha256 = "13cglywzhb4j0qj0bs2jwaz2k8pxrxalv35wgkmgkxr635bxmwsj";
})
{ };
}

View File

@ -0,0 +1,12 @@
#!/usr/bin/env nix-shell
#!nix-shell --show-trace ./updater.nix -i bash
set -e
for app in $APPS; do
./updater-jetbrains $app -o ${app%-[0-9.]*}-generated.nix
done
# Local Variables:
# mode: sh
# End:

View File

@ -7,6 +7,7 @@ import re
import requests import requests
import subprocess as sp import subprocess as sp
import sys import sys
import unicodedata
import urllib import urllib
from lxml import etree from lxml import etree
@ -27,10 +28,15 @@ PRODUCT_CODE = {
} }
PACKAGE_RE = re.compile("[^0-9A-Za-z._-]")
HTML_RE = re.compile("<[^>]+/?>")
def to_slug(name): def to_slug(name):
slug = name.replace(" ", "-").lstrip(".") slug = name.replace(" ", "-").lstrip(".")
for char in ",/;'\\<>:\"|!@#$%^&*()": for char in ",/;'\\<>:\"|!@#$%^&*()":
slug = slug.replace(char, "") slug = slug.replace(char, "")
slug = unicodedata.normalize("NFD", slug).encode("ascii", "ignore").decode("utf-8")
return slug return slug
@ -59,18 +65,15 @@ class Build:
return self.code + "-" + self.version return self.code + "-" + self.version
PACKAGE_RE = re.compile("[^0-9A-Za-z._-]")
HTML_RE = re.compile("<[^>]+/?>")
class Plugin: class Plugin:
def __init__(self, data, category=None): def __init__(self, data, build, category=None):
self.build = build
self.category = category self.category = category
self.name = data.find("name").text self.name = data.find("name").text
self.id = data.find("id").text self.xml_id = data.find("id").text
self._description = data.find("description").text self._description = data.find("description").text
self.url = data.get("url") or data.find("vendor").get("url") self.url = data.get("url") or data.find("vendor").get("url")
self.version = data.find("version").text self.version = data.find("version").text.replace(" ", "-")
self.slug = to_slug(self.name) self.slug = to_slug(self.name)
self.orig_slug = self.slug self.orig_slug = self.slug
@ -84,7 +87,7 @@ class Plugin:
def description(self): def description(self):
return re.sub(HTML_RE, "", self._description or "").strip() return re.sub(HTML_RE, "", self._description or "").strip()
def download_url(self, build, deref=True): def get_download_url(self, deref=True):
""" """
Provides the ZIP download URL for this plugin. Provides the ZIP download URL for this plugin.
@ -94,18 +97,52 @@ class Plugin:
(which it is by default). However, this comes at the cost of requiring (which it is by default). However, this comes at the cost of requiring
an HTTP request. an HTTP request.
""" """
id = urllib.parse.quote(self.id) id = urllib.parse.quote(self.xml_id)
url = f"https://plugins.jetbrains.com/pluginManager?action=download&id={id}&build={build}" url = f"https://plugins.jetbrains.com/pluginManager?action=download&id={id}&build={self.build}"
if deref: if deref:
res = requests.get(url, allow_redirects=not deref) res = requests.get(url, allow_redirects=not deref)
url = "https://plugins.jetbrains.com" + re.sub( url = "https://plugins.jetbrains.com" + re.sub(
"\?.*$", "", res.headers["location"] "\?.*$", "", res.headers["location"]
) )
self.jetbrains_url = url
if url.endswith("external"): if url.endswith("external"):
res = requests.get(url, allow_redirects=not deref) res = requests.get(url, allow_redirects=not deref)
url = res.headers["location"] url = res.headers["location"]
return url return url
def fetch_external(self, update_only=False):
"""
Performs network calls to update this plugin with information that
cannot be performed from the public XML API.
Additional attributes provided after this method:
download_url : the plugin download location
sha : the SHA256 of the download source
If update_only is true, a full update is performed, also providing:
id : the plugin integer ID
license_url : the plugin license URL
license : the Nixpkgs license attribute
"""
self.download_url = self.get_download_url(deref=True)
self.sha = prefetch(self, self.build, self.download_url)
if update_only:
return
self.id = self.jetbrains_url.split("/")[4]
res = requests.get(
f"https://plugins.jetbrains.com/api/plugins/{self.id}"
).json()
try:
self.url = self.url or res["urls"]["sourceCodeUrl"]
except KeyError:
pass
self.license_url = res["urls"]["licenseUrl"]
self.license = translate_license(self.license_url, fallback=self.url)
def packagename(self): def packagename(self):
slug = re.sub(PACKAGE_RE, "", self.slug.lower()).replace(".", "-") slug = re.sub(PACKAGE_RE, "", self.slug.lower()).replace(".", "-")
if slug[0] in "1234567890": if slug[0] in "1234567890":
@ -128,16 +165,16 @@ def list_plugins(build):
https://plugins.jetbrains.com/docs/marketplace/plugins-list.html https://plugins.jetbrains.com/docs/marketplace/plugins-list.html
""" """
resp = requests.get(f"https://plugins.jetbrains.com/plugins/list/?build={build}") resp = requests.get(f"https://plugins.jetbrains.com/plugins/list/?build={build}")
return parse_repository(resp.content) return parse_repository(resp.content, build)
def parse_repository(content): def parse_repository(content, build):
tree = etree.XML(content) tree = etree.XML(content)
plugins = [] plugins = []
for cat in tree.findall("category"): for cat in tree.findall("category"):
cat_name = cat.get("name") cat_name = cat.get("name")
for plugin in cat.findall("idea-plugin"): for plugin in cat.findall("idea-plugin"):
plugins.append(Plugin(plugin, cat_name)) plugins.append(Plugin(plugin, build, cat_name))
return plugins return plugins
@ -155,28 +192,101 @@ def deduplicate(plugins):
def prefetch(plugin, build, url=None): def prefetch(plugin, build, url=None):
if not url: if not url:
url = plugin.download_url(build) url = plugin.download_url or plugin.get_download_url()
res = sp.run( res = sp.run(
["nix-prefetch-url", "--name", plugin.filename(), url], capture_output=True, ["nix-prefetch-url", "--name", plugin.filename(), url], capture_output=True,
) )
if not res.stdout: if not res.stdout:
raise IOError(f"nix-prefetch-url {plugin} failed: {res.stderr.decode('utf-8')}") raise IOError(
return res.stdout.decode("utf-8").strip() f"nix-prefetch-url {plugin} failed: {res.stderr.decode('unicode-escape')}"
)
return res.stdout.decode("unicode-escape").strip()
def write_packages(outfile, plugins, build): def custom_license(short, full, url, free=False):
builder = build.builder() return f"""{{
shortName = "{short}";
fullName = "{full}";
url = "{url}";
free = {"true" if free else "false"};
}}"""
def arr(url):
return custom_license("allrightsreserved", "All Rights Reserved", url)
def translate_license(url, fallback=""):
license = url.lower()
if license == "":
print(f"no license for {fallback}", file=sys.stderr)
return arr(fallback)
# Common (license) hosts
elif "github.com" in license or "raw.githubusercontent.com" in license:
try:
owner, repo = url.split("/")[3:5]
except ValueError:
print(f"no license metadata for {url}", file=sys.stderr)
return arr(url)
res = requests.get(
f"https://api.github.com/repos/{owner}/{repo}",
headers={"Accept": "application/vnd.github.v3+json"},
).json()
try:
return translate_license(res["license"]["key"])
except (KeyError, TypeError):
print(f"no license metadata for {url}", file=sys.stderr)
return arr(url)
elif "opensource.org" in license:
os_license = license.rstrip("/").split("/")[-1]
if os_license == "alphabetical":
# Doesn't actually have a license, it's the listing page
return arr(fallback)
return translate_license(os_license)
# Actual translations now
elif "apache.org/licenses/license-2.0" in license or "apache-2.0" in license:
return "lib.licenses.asl20"
elif "artistic-2" in license:
return "lib.licenses.artistic2"
elif "bsd-2-clause" in license:
return "lib.licenses.bsd2"
elif "bsd-3-clause" in license:
return "lib.licenses.bsd3"
elif "eclipse.org/legal/epl-2.0" in license:
return "lib.licenses.epl20"
elif "gpl-3.0" in license:
return "lib.licenses.gpl3Only"
elif "mit" in license:
return "lib.licenses.mit"
elif "osd" in license:
return "lib.licenses.free"
elif "other" == license:
return arr(fallback)
# Custom known licenses
elif "plugins.jetbrains.com/legal/terms-of-use" in license:
return custom_license(
"jetbrains", "Jetbrains Plugin Marketplace Agreement", license
)
# Fallback
else:
print(f"unrecognised license {license}", file=sys.stderr)
return arr(license)
def write_packages(outfile, plugins):
builder = plugins[0].build.builder() or ""
outfile.write("{callPackage}:\n{") outfile.write("{callPackage}:\n{")
for plugin in plugins: for i, plugin in enumerate(plugins):
src_url = plugin.download_url(build, deref=True) print(f"{i:04} {plugin.packagename()}")
src_ext = os.path.splitext(src_url)[-1]
try: try:
sha = prefetch(plugin, build, src_url) plugin.fetch_external()
except IOError as e: except IOError as e:
print(e, file=sys.stderr) print(e, file=sys.stderr)
continue continue
src_url = plugin.download_url
src_ext = os.path.splitext(src_url)[-1]
sha = plugin.sha
build_inputs = [] build_inputs = []
if src_ext == ".zip": if src_ext == ".zip":
@ -186,7 +296,7 @@ def write_packages(outfile, plugins, build):
# internal and external plugins; need to find some way to resolve them # internal and external plugins; need to find some way to resolve them
requires = [] requires = []
# TODO: Licenses are actually on the website, but aren't provided in the API # TODO: Licenses are actually on the website, but aren't provided in the API
license = "lib.licenses.free" license = plugin.license
call_args = [str(builder), "fetchurl", "lib"] call_args = [str(builder), "fetchurl", "lib"]
for binput in build_inputs: for binput in build_inputs:
@ -197,7 +307,7 @@ def write_packages(outfile, plugins, build):
{plugin.packagename()} = callPackage ({{ {", ".join(sorted(call_args))} }}: {builder} {{ {plugin.packagename()} = callPackage ({{ {", ".join(sorted(call_args))} }}: {builder} {{
pname = "{plugin.slug}"; pname = "{plugin.slug}";
plugname = "{plugin.name}"; plugname = "{plugin.name}";
plugid = "{plugin.id}"; plugid = "{plugin.xml_id}";
version = "{plugin.version}"; version = "{plugin.version}";
src = fetchurl {{ src = fetchurl {{
url = "{src_url}"; url = "{src_url}";
@ -227,6 +337,7 @@ def main():
parser.add_argument( parser.add_argument(
"-o", "--out", type=str, help="File to write plugins to", "-o", "--out", type=str, help="File to write plugins to",
) )
parser.add_argument("-O", "--offset", type=int, help="Offset number of packages")
parser.add_argument( parser.add_argument(
"package", "package",
metavar="PACKAGE", metavar="PACKAGE",
@ -241,15 +352,17 @@ def main():
plugins.sort(key=lambda p: p.slug) plugins.sort(key=lambda p: p.slug)
deduplicate(plugins) deduplicate(plugins)
if args.offset:
plugins = plugins[args.offset :]
if args.number: if args.number:
plugins = plugins[: args.number] plugins = plugins[: args.number]
print(f"Generating packages for {len(plugins)} plugins", file=sys.stderr) print(f"Generating packages for {len(plugins)} plugins", file=sys.stderr)
if not args.out: if not args.out:
write_packages(sys.stdout, plugins, build) write_packages(sys.stdout, plugins)
else: else:
with open(args.out, "w") as f: with open(args.out, "w") as f:
write_packages(f, plugins, build) write_packages(f, plugins)
main() main()

View File

@ -0,0 +1,26 @@
{ pkgs ? import <nixpkgs> { } }:
let
inherit (pkgs.stdenv) lib;
in
pkgs.mkShell {
buildInputs = [
pkgs.bash
];
APPS = lib.mapAttrsToList
(k: v: v.name)
{
inherit (pkgs.jetbrains)
clion
datagrip
goland
idea-community
idea-ultimate
phpstorm
pycharm-community
pycharm-professional
rider
ruby-mine
webstorm;
};
}

View File

@ -1,5 +1,4 @@
{ lib { lib, makeWrapper, runCommand }: self:
}: self:
with lib; with lib;
@ -20,12 +19,31 @@ in
assert assertMsg (length badPlugins == 0) errorMsg; assert assertMsg (length badPlugins == 0) errorMsg;
appendToName "with-plugins" (package.overrideAttrs (oldAttrs: { runCommand
passthru = { inherit plugins; }; (appendToName "with-plugins" package).name
# TODO: Purely aesthetics, but link the plugin to its name instead of hash-name-version {
installPhase = oldAttrs.installPhase + '' nativeBuildInputs = [ package makeWrapper ];
for plugin in $plugins; do inherit package plugins;
ln -s "$plugin" "$out/$name/plugins/$(basename $plugin)" packageName = package.name;
done
''; preferLocalBuild = true;
})) allowSubstitutes = false;
} ''
mkdir -p $out/$packageName/plugins
for dir in $package/*; do
cp -r $dir $out/
done
# Install plugins
for plugin in $plugins; do
local pluginName=$(basename $plugin)
pluginName=''${pluginName#*-}
pluginName=''${pluginName%-[0-9.]*}
ln -s $plugin $out/$packageName/plugins/$pluginName
done
# Fix up wrapper
substituteInPlace $out/bin/* \
--replace "$package" "$out"
''

View File

@ -2,10 +2,12 @@ diff --git a/include/components/types.hpp b/include/components/types.hpp
index 8125d4b..c435f4a 100644 index 8125d4b..c435f4a 100644
--- a/include/components/types.hpp --- a/include/components/types.hpp
+++ b/include/components/types.hpp +++ b/include/components/types.hpp
@@ -43,5 +43,6 @@ enum class controltag { @@ -57,7 +57,7 @@ enum class controltag {
DOUBLE_MIDDLE, R, // Reset all open tags (B, F, T, o, u). Used at module edges
DOUBLE_RIGHT,
+ EXTRA,
// Terminator value, do not use
BTN_COUNT,
}; };
-enum class mousebtn { NONE = 0, LEFT, MIDDLE, RIGHT, SCROLL_UP, SCROLL_DOWN, DOUBLE_LEFT, DOUBLE_MIDDLE, DOUBLE_RIGHT };
+enum class mousebtn { NONE = 0, LEFT, MIDDLE, RIGHT, SCROLL_UP, SCROLL_DOWN, DOUBLE_LEFT, DOUBLE_MIDDLE, DOUBLE_RIGHT, EXTRA };
enum class strut {
LEFT = 0,

View File

@ -1,48 +0,0 @@
{ lib
, fetchFromGitHub
, buildGoModule
, pkg-config
, libsecret
}:
{ pname
, tags
, ...
}@args:
buildGoModule (lib.recursiveUpdate args rec {
inherit pname;
version = "1.8.10";
src = fetchFromGitHub {
owner = "ProtonMail";
repo = "proton-bridge";
rev = "br-${version}";
sha256 = "1na8min9cmn82lpad58abw6837k303fr09l6cvzswaxs73f231ig";
};
vendorSha256 = "1219xa1347877bfhnid15y6w9s4hf1czbrmll2iha4gpsmg066bb";
nativeBuildInputs = (args.nativeBuildInputs or [ ]) ++ [
pkg-config
];
buildInputs = (args.buildInputs or [ ]) ++ [
libsecret
];
inherit tags;
ldflags = [
"-X github.com/ProtonMail/proton-bridge/pkg/constants.Version=${version}"
"-X github.com/ProtonMail/proton-bridge/pkg/constants.Revision=${version}"
"-X github.com/ProtonMail/proton-bridge/pkg/constants.BuildDate=unknown"
];
meta = with lib; {
description = "Integrate ProtonMail paid account with any program that supports IMAP and SMTP";
homepage = "https://protonmail.com";
license = licenses.gpl3;
plaforms = platforms.x86_64;
};
})

View File

@ -1,4 +1,4 @@
{ lib { stdenv
, fetchFromGitHub , fetchFromGitHub
, buildGoModule , buildGoModule
@ -7,12 +7,62 @@
, libsecret , libsecret
, pkg-config , pkg-config
, qtbase , qtbase
, qtdoc
}: }:
let let
builder = import ./common.nix {
inherit lib fetchFromGitHub buildGoModule libsecret pkg-config; builder =
}; { pname
, tags
, ...
}@args:
buildGoModule (stdenv.lib.recursiveUpdate args rec {
inherit pname;
version = "1.5.6";
src = fetchFromGitHub {
owner = "ProtonMail";
repo = "proton-bridge";
rev = "br-${version}";
sha256 = "1na8min9cmn82lpad58abw6837k303fr09l6cvzswaxs73f231ig";
};
vendorSha256 = "1219xa1347877bfhnid15y6w9s4hf1czbrmll2iha4gpsmg066bb";
nativeBuildInputs = (args.nativeBuildInputs or [ ]) ++ [
pkg-config
];
buildInputs = (args.buildInputs or [ ]) ++ [
libsecret
];
buildFlagsArray =
let
t = "github.com/ProtonMail/proton-bridge/pkg/constants";
in
[
"-tags=${tags}"
''
-ldflags=
-X ${t}.Version=${version}
-X ${t}.Revision=unknown
-X ${t}.BuildDate=unknown
''
];
meta = with stdenv.lib; {
description = "Integrate ProtonMail paid account with any program that supports IMAP and SMTP";
homepage = "https://protonmail.com";
license = licenses.gpl3;
plaforms = platforms.x86_64;
};
});
in in
{ {
protonmail-bridge = builder (import ./app.nix { inherit qtbase go goModules; }); protonmail-bridge = builder (import ./app.nix { inherit qtbase go goModules; });
protonmail-bridge-headless = builder (import ./headless.nix { }); protonmail-bridge-headless = builder (import ./headless.nix { });

View File

@ -1,17 +1,30 @@
{}: {}:
{ rec {
pname = "protonmail-bridge-headless"; pname = "protonmail-bridge-headless";
tags = [ "pmapi_prod" "nogui" ]; tags = "pmapi_prod nogui";
# REVIEW: Some issue with IMAP tests that probably fail due to network # FIXME: There's something fucky going on in the buildFlagsArray
# sandboxing. # substitution. I shouldn't need to do this.
doCheck = false; buildPhase =
let
t = "github.com/ProtonMail/proton-bridge/pkg/constants";
in
''
runHook preBuild
go install \
-tags="${tags}" \
-ldflags="-X ${t}.Version=1.3.2 -X ${t}.Revision=unknown -X ${t}.BuildDate=unknown" \
cmd/Desktop-Bridge/main.go
mv $GOPATH/bin/main $GOPATH/bin/Desktop-Bridge
runHook postBuild
'';
# Fix up name. # Fix up name.
postInstall = '' postInstall = ''
mv $out/bin/Desktop-Bridge $out/bin/protonmail-bridge mv $out/bin/Desktop-Bridge $out/bin/protonmail-bridge
mv $out/bin/Import-Export $out/bin/protonmail-import-export
''; '';
} }

View File

@ -1,12 +1,15 @@
{ stdenv { stdenv
, lib
, fetchFromGitLab , fetchFromGitLab
, fetchzip
, cereal , cereal
, cmake , cmake
, git
, libGL , libGL
, libX11 , libX11
, libinput , libinput
, libxkbcommon , libxkbcommon
, mesa
, meson , meson
, ninja , ninja
, pixman , pixman
@ -15,6 +18,7 @@
, wayland , wayland
, wayland-protocols , wayland-protocols
, wlroots , wlroots
, xwayland
}: }:
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
@ -58,11 +62,10 @@ stdenv.mkDerivation rec {
passthru.providedSessions = [ "cardboard" ]; passthru.providedSessions = [ "cardboard" ];
meta = with lib; { meta = {
description = "Scrollable tiling Wayland compositor designed with laptops in mind"; description = "Scrollable tiling Wayland compositor designed with laptops in mind";
homepage = "https://gitlab.com/cardboardwm/cardboard"; homepage = "https://gitlab.com/cardboardwm/cardboard";
license = licenses.gpl3; license = stdenv.lib.licenses.gpl3;
platforms = wlroots.meta.platforms; platforms = wlroots.meta.platforms;
broken = true;
}; };
} }

View File

@ -4,30 +4,38 @@
, jetbrainsPlatforms , jetbrainsPlatforms
}: }:
{ pluginId { plugid
, pname , pname
, version , version
, versionId , ...
, sha256 }@args:
, filename ? "${pname}-${version}.zip"
}:
stdenv.mkDerivation { let
inherit pname version;
src = fetchzip { defaultMeta = {
inherit sha256; broken = false;
url = "https://plugins.jetbrains.com/files/${toString pluginId}/${toString versionId}/${filename}"; } // lib.optionalAttrs ((args.src.meta.homepage or "") != "") {
homepage = args.src.meta.homepage;
} // lib.optionalAttrs ((args.src.meta.description or "") != "") {
description = args.src.meta.description;
} // lib.optionalAttrs ((args.src.meta.license or {}) != {}) {
license = args.src.meta.license;
}; };
in
stdenv.mkDerivation (args // {
passthru = { inherit jetbrainsPlatforms; }; passthru = { inherit jetbrainsPlatforms; };
dontUnpack = lib.any (lib.hasSuffix ".jar") args.src.urls;
installPhase = '' installPhase = ''
mkdir $out mkdir $out
cp -r * $out/ cp -r * $out/
''; '';
meta = { meta = {
homepage = "https://plugins.jetbrains.com/plugin/${pluginId}-${lib.toLower pname}"; inherit (args.meta) license description;
homepage = if (args.meta.homepage == "") then null else args.meta.homepage;
}; };
} })

View File

@ -1,4 +1,4 @@
{ lib { stdenv
, fetchFromGitHub , fetchFromGitHub
, buildGoModule , buildGoModule
, makeWrapper , makeWrapper
@ -59,10 +59,9 @@ buildGoModule rec {
done done
''; '';
meta = with lib; { meta = with stdenv.lib; {
homepage = "https://github.com/therecipe/qt"; homepage = "https://github.com/therecipe/qt";
description = "Qt bindings for Go"; description = "Qt bindings for Go";
license = licenses.lgpl3; license = licenses.lgpl3;
broken = true;
}; };
} }

View File

@ -1,7 +1,7 @@
{ stdenv { stdenv
, lib
, fetchFromGitHub , fetchFromGitHub
, coreutils
, autoreconfHook , autoreconfHook
}: }:
@ -26,7 +26,7 @@ stdenv.mkDerivation rec {
mkdir -p $out/include $out/lib mkdir -p $out/include $out/lib
''; '';
meta = with lib; { meta = with stdenv.lib; {
homepage = "https://github.com/xant/libhl"; homepage = "https://github.com/xant/libhl";
description = "Simple and fast C library implementing a thread-safe API to manage hash-tables, linked lists, lock-free ring buffers and queues "; description = "Simple and fast C library implementing a thread-safe API to manage hash-tables, linked lists, lock-free ring buffers and queues ";
license = licenses.lgpl3; license = licenses.lgpl3;

View File

@ -1,4 +1,4 @@
{ lib { stdenv
, buildPythonPackage , buildPythonPackage
, fetchPypi , fetchPypi
}: }:
@ -14,9 +14,9 @@ buildPythonPackage rec {
doCheck = false; doCheck = false;
meta = with lib; { meta = {
homepage = "https://stuffivelearned.org/doku.php?id=programming:python:py-sonic"; homepage = "https://stuffivelearned.org/doku.php?id=programming:python:py-sonic";
license = licenses.gpl3; license = stdenv.lib.licenses.gpl3;
description = "A python wrapper library for the Subsonic REST API"; description = "A python wrapper library for the Subsonic REST API";
}; };
} }

View File

@ -1,5 +1,4 @@
{ stdenv { stdenv
, lib
, fetchFromGitHub , fetchFromGitHub
, autoreconfHook , autoreconfHook
@ -26,10 +25,10 @@ stdenv.mkDerivation rec {
configureFlags = [ "--with-moduledir=\${out}/lib/security" ]; configureFlags = [ "--with-moduledir=\${out}/lib/security" ];
meta = with lib; { meta = with stdenv.lib; {
homepage = "https://github.com/cruegge/pam-gnupg"; homepage = "https://github.com/cruegge/pam-gnupg";
description = "Unlock GnuPG keys on login"; description = "Unlock GnuPG keys on login";
license = licenses.gpl3; license = licenses.gpl3;
platforms = pam.meta.platforms; inherit (pam.meta) platforms;
}; };
} }

View File

@ -1,5 +1,4 @@
{ stdenv { stdenv
, lib
, fetchFromGitHub , fetchFromGitHub
, installShellFiles , installShellFiles
@ -26,10 +25,10 @@ stdenv.mkDerivation {
installShellCompletion --zsh _zshz installShellCompletion --zsh _zshz
''; '';
meta = with lib; { meta = {
description = ''Jump quickly to directories that you have visited "frecently." A native ZSH port of z.sh.''; description = ''Jump quickly to directories that you have visited "frecently." A native ZSH port of z.sh.'';
homepage = "https://github.com/agkozak/zsh-z"; homepage = "https://github.com/agkozak/zsh-z";
license = licenses.mit; license = stdenv.lib.licenses.mit;
platforms = zsh.meta.platforms; platforms = zsh.meta.platforms;
}; };
} }

View File

@ -1,4 +1,4 @@
{ lib { stdenv
, fetchFromGitHub , fetchFromGitHub
, python3Packages , python3Packages
@ -20,12 +20,7 @@ python3Packages.buildPythonApplication rec {
pyyaml pyyaml
]; ];
patchPhase = '' meta = with stdenv.lib; {
substituteInPlace setup.py \
--replace PROJECTVERSION "${version}"
'';
meta = with lib; {
description = "Fan controller for AMD graphics cards running the amdgpu driver on Linux"; description = "Fan controller for AMD graphics cards running the amdgpu driver on Linux";
homepage = "https://github.com/chestm007/amdgpu-fan"; homepage = "https://github.com/chestm007/amdgpu-fan";
license = licenses.gpl2; license = licenses.gpl2;

View File

@ -1,18 +1,16 @@
{ stdenv { stdenv
, lib
, fetchFromGitHub , fetchFromGitHub
, qtbase , qtbase
, qmake , qmake
, wrapQtAppsHook ? null # Temporary backwards compatibility
}: }:
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
pname = "radeon-profile-daemon"; pname = "radeon-profile-daemon";
version = "20190603.g06qxq2h"; version = "20190603.g06qxq2h";
nativeBuildInputs = [ qmake ];
buildInputs = [ qtbase ]; buildInputs = [ qtbase ];
nativeBuildInputs = [ qmake wrapQtAppsHook ];
src = ( src = (
fetchFromGitHub { fetchFromGitHub {
@ -28,7 +26,7 @@ stdenv.mkDerivation rec {
--replace "/usr/" "$out/" --replace "/usr/" "$out/"
''; '';
meta = with lib; { meta = with stdenv.lib; {
description = "System daemon for reading current clocks of AMD Radeon cards"; description = "System daemon for reading current clocks of AMD Radeon cards";
homepage = "https://github.com/marazmista/radeon-profile-daemon"; homepage = "https://github.com/marazmista/radeon-profile-daemon";
license = licenses.gpl2Plus; license = licenses.gpl2Plus;

View File

@ -1,6 +1,7 @@
{ stdenv { stdenv
, lib
, fetchFromGitHub , fetchFromGitHub
, makeWrapper
, curl , curl
, gnumake , gnumake
, gnutls , gnutls
@ -39,7 +40,7 @@ stdenv.mkDerivation rec {
--replace /usr/bin/samrewritten $out/bin/samrewritten --replace /usr/bin/samrewritten $out/bin/samrewritten
''; '';
meta = with lib; { meta = with stdenv.lib; {
description = "Steam Achievement Manager For Linux"; description = "Steam Achievement Manager For Linux";
homepage = "https://github.com/PaulCombal/SamRewritten"; homepage = "https://github.com/PaulCombal/SamRewritten";
license = licenses.gpl3; license = licenses.gpl3;

View File

@ -1,52 +1,42 @@
{ lib { stdenv
, fetchFromGitHub , fetchFromGitHub
, python3Packages , python2Packages
, lame
, aacSupport ? false , aacSupport ? false, faac
, faac , alacSupport ? false, libav
, alacSupport ? false , flacSupport ? false, flac
, libav , m4aSupport ? false, mp4Support ? false, fdk-aac-encoder
, flacSupport ? false , oggSupport ? false, vorbisTools
, flac , opusSupport ? false, opusTools
, m4aSupport ? false
, mp4Support ? false
, fdk-aac-encoder
, oggSupport ? false
, vorbisTools
, opusSupport ? false
, opusTools
}: }:
assert aacSupport -> faac.meta.available; assert aacSupport -> faac.meta.available;
assert alacSupport -> libav.meta.available; assert alacSupport -> libav.meta.available;
assert flacSupport -> flac.meta.available; assert flacSupport -> flac.meta.available;
assert m4aSupport || mp4Support -> fdk-aac-encoder.meta.available; assert m4aSupport || mp4Support -> fdk-aac-encoder.meta.available;
assert oggSupport -> vorbisTools.meta.available; assert oggSupport -> vorbisTools.meta.available;
assert opusSupport -> opusTools.meta.available; assert opusSupport -> opusTools.meta.available;
python3Packages.buildPythonApplication rec { python2Packages.buildPythonApplication rec {
pname = "spotify-ripper"; pname = "spotify-ripper";
version = "20210724.5bfd3f7"; version = "20161231.gd046419";
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "ast261"; owner = "hbashton";
repo = pname; repo = pname;
rev = "5bfd3f7a52f2767b433fd315145409837a3c33f0"; rev = "d0464193dead7bd3ac7580e98bde86a0f323acae";
sha256 = "sha256-LLunGzs9Mg4S00Su260b+M5w/XwS+kICl/YXQdR/cPI="; sha256 = "003d6br20f1cf4qvmpl62bk0k4h4v66ib76wn36c23bnh9x5q806";
}; };
propagatedBuildInputs = (with python3Packages; [ propagatedBuildInputs = (with python2Packages; [
colorama colorama
mutagen mutagen
pyspotify pyspotify
requests requests
schedule schedule
setuptools setuptools
spotipy
]) ++ [ ]) ++ [
lame
(if flacSupport then flac else null) (if flacSupport then flac else null)
(if alacSupport then libav else null) (if alacSupport then libav else null)
(if aacSupport then faac else null) (if aacSupport then faac else null)
@ -58,7 +48,7 @@ python3Packages.buildPythonApplication rec {
# Remove impure executables. # Remove impure executables.
patches = [ ./fix-setup.patch ]; patches = [ ./fix-setup.patch ];
meta = with lib; { meta = {
description = "Rip Spotify URIs to audio files, including ID3 tags and cover art"; description = "Rip Spotify URIs to audio files, including ID3 tags and cover art";
longDescription = '' longDescription = ''
Spotify-ripper is a small ripper script for Spotify that rips Spotify URIs Spotify-ripper is a small ripper script for Spotify that rips Spotify URIs
@ -68,6 +58,6 @@ python3Packages.buildPythonApplication rec {
''; '';
homepage = "https://github.com/hbashton/spotify-ripper"; homepage = "https://github.com/hbashton/spotify-ripper";
# spotify-ripper itself is MIT, but the upstream libspotify is unfree. # spotify-ripper itself is MIT, but the upstream libspotify is unfree.
license = licenses.unfree; license = stdenv.lib.licenses.unfree;
}; };
} }

View File

@ -2,7 +2,7 @@ diff --git a/setup.py b/setup.py
index a800b3b..8967921 100755 index a800b3b..8967921 100755
--- a/setup.py --- a/setup.py
+++ b/setup.py +++ b/setup.py
@@ -33,14 +33,13 @@ setup( @@ -22,14 +22,13 @@ setup(
name='spotify-ripper', name='spotify-ripper',
version='2.9.1', version='2.9.1',
packages=find_packages(exclude=["tests"]), packages=find_packages(exclude=["tests"]),
@ -18,7 +18,11 @@ index a800b3b..8967921 100755
], ],
}, },
@@ -121,3 +121,2 @@ setup( @@ -67,7 +66,5 @@ setup(
return True 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.4',
],
- long_description=_read('README.rst'),
)
-create_default_dir() -create_default_dir()

View File

@ -1,14 +1,61 @@
{ pkgs }: { pkgs }:
rec { rec {
# Alacritty with the unmerged ligature patches applied.
alacritty-ligatures = pkgs.alacritty.overrideAttrs (oldAttrs: rec {
pname = "${oldAttrs.pname}-ligatures";
version = "0.7.1.20210107.gada2680";
src = pkgs.fetchFromGitHub {
owner = "zenixls2";
repo = "alacritty";
fetchSubmodules = true;
rev = "ada2680e79a8f53cd350263c8cc91d2e2a264d81";
sha256 = "0c0k1ib1dl35731zyjb32apyn28xc63mhbwsig5mz3hnkyk5nisr";
};
cargoDeps = oldAttrs.cargoDeps.overrideAttrs (pkgs.lib.const {
name = "${pname}-${version}-vendor.tar.gz";
inherit src;
outputHash = "1d1yz4xmal0f3c0pcn59lxfh5a3532nv7dv7s95svvi8qsvnk9gv";
});
ligatureInputs = [
pkgs.fontconfig
pkgs.freetype
pkgs.libglvnd
pkgs.stdenv.cc.cc.lib
pkgs.xlibs.libxcb
];
buildInputs = (oldAttrs.buildInputs or []) ++ ligatureInputs;
# HACK: One of the ligature libraries required the C++ stdlib at runtime,
# and I can't work out a better way to push it to the RPATH.
postInstall = pkgs.lib.optional (!pkgs.stdenv.isDarwin) ''
patchelf \
--set-rpath ${pkgs.lib.makeLibraryPath ligatureInputs}:"$(patchelf --show-rpath $out/bin/alacritty)" \
$out/bin/alacritty
'';
meta = oldAttrs.meta // {
description = "Alacritty with ligature patch applied";
homepage = "https://github.com/zenixls2/alacritty/tree/ligature";
};
});
amdgpu-fan = pkgs.callPackage ../tools/misc/amdgpu-fan { };
cardboard = pkgs.callPackage ../applications/window-managers/cardboard { };
goModules = pkgs.recurseIntoAttrs rec { goModules = pkgs.recurseIntoAttrs rec {
qt = pkgs.libsForQt5.callPackage ../development/go-modules/qt { }; qt = pkgs.libsForQt512.callPackage ../development/go-modules/qt { };
}; };
# A functional Jetbrains IDE-with-plugins package set. # A functional Jetbrains IDE-with-plugins package set.
jetbrains = pkgs.dontRecurseIntoAttrs rec { jetbrains = pkgs.dontRecurseIntoAttrs rec {
jetbrainsPluginsFor = variant: import ../top-level/jetbrains-plugins.nix { jetbrainsPluginsFor = variant: import ../top-level/jetbrains-plugins.nix {
inherit (pkgs) lib newScope stdenv fetchzip; inherit (pkgs) lib newScope stdenv fetchzip makeWrapper runCommand;
inherit variant; inherit variant;
}; };
@ -25,11 +72,15 @@ rec {
ideaUltimateWithPlugins = ideaUltimatePlugins.jetbrainsWithPlugins; ideaUltimateWithPlugins = ideaUltimatePlugins.jetbrainsWithPlugins;
}; };
libhl = pkgs.callPackage ../development/libraries/libhl { };
mopidy-subidy = pkgs.callPackage ../applications/audio/mopidy/subidy.nix { mopidy-subidy = pkgs.callPackage ../applications/audio/mopidy/subidy.nix {
python3Packages = pkgs.python3Packages // python3Packages; python3Packages = pkgs.python3Packages // python3Packages;
}; };
picom-animations = pkgs.picom.overrideAttrs (_oldAttrs: { pam_gnupg = pkgs.callPackage ../os-specific/linux/pam_gnupg { };
picom-animations = pkgs.picom.overrideAttrs (oldAttrs: {
pname = "picom-animations"; pname = "picom-animations";
src = pkgs.fetchFromGitHub { src = pkgs.fetchFromGitHub {
owner = "jonaburg"; owner = "jonaburg";
@ -45,17 +96,74 @@ rec {
patches = (oldAttrs.patches or [ ]) ++ [ ../applications/misc/polybar/9button.patch ]; patches = (oldAttrs.patches or [ ]) ++ [ ../applications/misc/polybar/9button.patch ];
}); });
psst = pkgs.callPackage ../applications/audio/psst { };
python2Packages =
let
fixVersion =
{ package
, version
, sha256
, extra ? (oldAttrs: { })
}: package.overrideAttrs (oldAttrs: rec {
inherit version;
src = pkgs.python2Packages.fetchPypi {
inherit (oldAttrs) pname;
inherit version sha256;
};
} // extra oldAttrs);
in
pkgs.recurseIntoAttrs rec {
colorama_0_3_3 = fixVersion {
package = pkgs.python2Packages.colorama;
version = "0.3.3";
sha256 = "1716z9pq1r5ys3nkg7wdrb3h2f9rmd0zdxpxzmx3bgwgf6xg48gb";
};
mutagen_1_30 = fixVersion {
package = pkgs.python2Packages.mutagen;
version = "1.30";
sha256 = "0kv2gjnzbj1w0bswmxm7wi05x6ypi7jk52s0lb8gw8s459j41gyd";
extra = oldAttrs: {
patches = [ ];
};
};
pyspotify_2_0_5 = fixVersion {
package = pkgs.python2Packages.pyspotify;
version = "2.0.5";
sha256 = "0y16c024rrvbvfdqj1n0k4b25b1nbza3i7kspg5b0ci2src1rm7v";
};
overlay = {
colorama = colorama_0_3_3;
mutagen = mutagen_1_30;
pyspotify = pyspotify_2_0_5;
};
};
python3Packages = pkgs.recurseIntoAttrs { python3Packages = pkgs.recurseIntoAttrs {
py-sonic = pkgs.python3.pkgs.callPackage ../development/python-modules/py-sonic { }; py-sonic = pkgs.python3.pkgs.callPackage ../development/python-modules/py-sonic { };
}; };
# The one in Nixpkgs still extracts the pre-built Debian package instead # The one in Nixpkgs still extracts the pre-built Debian package instead
# of building from source. # of building from source.
protonmailBridgePackages = pkgs.libsForQt5.callPackage ../applications/networking/protonmail-bridge { protonmailBridgePackages = pkgs.libsForQt512.callPackage ../applications/networking/protonmail-bridge {
inherit goModules; inherit goModules;
}; };
protonmail-bridge = protonmailBridgePackages.protonmail-bridge; protonmail-bridge = protonmailBridgePackages.protonmail-bridge;
protonmail-bridge-headless = protonmailBridgePackages.protonmail-bridge-headless; protonmail-bridge-headless = protonmailBridgePackages.protonmail-bridge-headless;
radeon-profile-daemon = pkgs.libsForQt5.callPackage ../tools/misc/radeon-profile-daemon { }; radeon-profile-daemon = pkgs.libsForQt5.callPackage ../tools/misc/radeon-profile-daemon { };
samrewritten = pkgs.callPackage ../tools/misc/samrewritten { };
spotify-ripper = pkgs.callPackage ../tools/misc/spotify-ripper {
# NOTE: Not available in 20.03. Specifying it this way lets me cheat the
# build auto-failing on 20.03 because of the attribute not existing.
inherit (pkgs) fdk-aac-encoder;
python2Packages = pkgs.python2Packages // python2Packages.overlay;
};
zsh-z = pkgs.callPackage ../shells/zsh/zsh-z { };
} }

View File

@ -2,34 +2,28 @@
, newScope , newScope
, stdenv , stdenv
, fetchzip , fetchzip
, makeWrapper
, runCommand
, variant , variant
}: }:
let let
mkJetbrainsPlugins = import ../applications/editors/jetbrains/common-plugins.nix {
inherit lib stdenv fetchzip;
};
mkIdeaPlugins = import ../applications/editors/jetbrains/idea-plugins.nix { mkIdeaPlugins = import ../applications/editors/jetbrains/idea-plugins.nix {
inherit lib stdenv fetchzip; inherit lib stdenv fetchzip;
}; };
jetbrainsWithPlugins = import ../applications/editors/jetbrains/wrapper.nix { jetbrainsWithPlugins = import ../applications/editors/jetbrains/wrapper.nix {
inherit lib; inherit lib makeWrapper runCommand;
}; };
in in lib.makeScope newScope (self: lib.makeOverridable ({
lib.makeScope newScope (self: lib.makeOverridable ideaPlugins ? mkIdeaPlugins self
({ jetbrainsPlugins ? mkJetbrainsPlugins self }: ({ }
, ideaPlugins ? mkIdeaPlugins self // ideaPlugins // { inherit ideaPlugins; }
}: ({ } // {
// jetbrainsPlugins // { inherit jetbrainsPlugins; }
// ideaPlugins // { inherit ideaPlugins; }
// {
inherit variant; inherit variant;
jetbrainsWithPlugins = jetbrainsWithPlugins self variant; jetbrainsWithPlugins = jetbrainsWithPlugins self variant;
}) })
) ) { })
{ })

View File

@ -1,55 +0,0 @@
{ stdenv
, lib
, fetchFromGitHub
, alacritty
, fontconfig
, freetype
, libglvnd
, libxcb
}:
alacritty.overrideAttrs (oldAttrs: rec {
pname = "${oldAttrs.pname}-ligatures";
version = "0.7.2.20210209.g3ed0430";
src = fetchFromGitHub {
owner = "zenixls2";
repo = "alacritty";
fetchSubmodules = true;
rev = "3ed043046fc74f288d4c8fa7e4463dc201213500";
sha256 = "1dGk4ORzMSUQhuKSt5Yo7rOJCJ5/folwPX2tLiu0suA=";
};
cargoDeps = oldAttrs.cargoDeps.overrideAttrs (lib.const {
name = "${pname}-${version}-vendor.tar.gz";
inherit src;
outputSha256 = "pONu6caJmEKnbr7j+o9AyrYNpS4Q8OEjNZOhGTalncc=";
});
ligatureInputs = [
fontconfig
freetype
libglvnd
stdenv.cc.cc.lib
libxcb
];
preferLocalBuild = true;
buildInputs = (oldAttrs.buildInputs or [ ]) ++ ligatureInputs;
# HACK: One of the ligature libraries required the C++ stdlib at runtime,
# and I can't work out a better way to push it to the RPATH.
postInstall = lib.optional (!stdenv.isDarwin) ''
patchelf \
--set-rpath ${lib.makeLibraryPath ligatureInputs}:"$(patchelf --print-rpath $out/bin/alacritty)" \
$out/bin/alacritty
'';
meta = oldAttrs.meta // {
description = "Alacritty with ligature patch applied";
homepage = "https://github.com/zenixls2/alacritty/tree/ligature";
};
})

View File

@ -1,46 +0,0 @@
{ stdenv
, lib
, fetchurl
, makeWrapper
, jdk17
, udev
, xorg
}:
stdenv.mkDerivation rec {
pname = "atlauncher";
version = "3.4.33.1";
src = fetchurl {
url = "https://github.com/ATLauncher/ATLauncher/releases/download/v${version}/ATLauncher-${version}.jar";
hash = "sha256-YfTo3Vp4ACQPQJWCujpAv8J0i2FuG5MLaIjNdBPN1Ns=";
};
dontUnpack = true;
nativeBuildInputs = [ makeWrapper ];
installPhase = ''
mkdir -p $out/bin $out/share/java
cp $src $out/share/java/ATLauncher.jar
makeWrapper ${jdk17}/bin/java $out/bin/atlauncher \
--prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath [ xorg.libXxf86vm udev ]}" \
--add-flags "-jar $out/share/java/ATLauncher.jar" \
--add-flags "--working-dir \''${XDG_DATA_HOME:-\$HOME/.local/share}/ATLauncher" \
--add-flags "--no-launcher-update"
'';
meta = {
description = "Minecraft launcher";
longDescription = ''
ATLauncher is a Launcher for Minecraft which integrates multiple different
ModPacks to allow you to download and install ModPacks easily and quickly.
'';
sourceProvenance = [
(lib.sourceTypes.binaryBytecode or { shortName = "binaryBytecode"; isSource = false; })
];
license = lib.licenses.gpl3Only;
platforms = lib.platforms.all;
homepage = "https://atlauncher.com/";
};
}

View File

@ -1,39 +0,0 @@
{ stdenv
, fetchurl
, writeScriptBin
, appimageTools
}:
let
pname = "cura5";
version = "5.4.0";
name = "${pname}-${version}";
cura5 = appimageTools.wrapType2 {
inherit pname version;
src = fetchurl {
url = "https://github.com/Ultimaker/Cura/releases/download/${version}/Ultimaker-Cura-${version}-linux-modern.AppImage";
hash = "sha256-QVv7Wkfo082PH6n6rpsB79st2xK2+Np9ivBg/PYZd74=";
};
extraPkgs = _: [ ];
};
script = writeScriptBin pname ''
#!${stdenv.shell}
# AppImage version of Cura loses current working directory and treats all paths relateive to $HOME.
# So we convert each of the files passed as argument to an absolute path.
# This fixes use cases like `cd /path/to/my/files; cura mymodel.stl anothermodel.stl`.
args=()
for a in "$@"; do
if [ -e "$a" ]; then
a="$(realpath "$a")"
fi
args+=("$a")
done
exec "${cura5}/bin/${name}" "''${args[@]}"
'';
in
script // {
inherit name pname version;
meta.platforms = [ "x86_64-linux" ];
}

View File

@ -1,38 +0,0 @@
{ stdenv
, lib
, fetchFromGitHub
, python3
, ffmpeg
}:
stdenv.mkDerivation rec {
pname = "ytarchive";
version = "0.2.2+0304577";
src = fetchFromGitHub {
owner = "Kethsar";
repo = "ytarchive";
# NOTE: Last revision where it was written in Python, so don't change
# without rewriting the derivation.
rev = "030457749d6c8d1d62240bfbad659326f3cd3a30";
hash = "sha256-mvmdkxZxlEbWc7GR8LfyxTJOeEhjCoYyeatDx8l1uhM=";
};
propagatedBuildInputs = [
python3
ffmpeg
];
phases = [ "unpackPhase" "installPhase" "fixupPhase" ];
installPhase = ''
install -Dm00755 ytarchive.py $out/bin/ytarchive
'';
meta = with lib; {
description = "Garbage Youtube livestream downloader";
homepage = "https://github.com/Kethsar/ytarchive";
license = licenses.mit;
platforms = python3.meta.platforms;
};
}