Merge master into staging
This commit is contained in:
commit
d9fa74ba78
@ -705,4 +705,52 @@ overrides = super: self: rec {
|
|||||||
</programlisting>
|
</programlisting>
|
||||||
</para>
|
</para>
|
||||||
</section>
|
</section>
|
||||||
|
<section xml:id="sec-citrix">
|
||||||
|
<title>Citrix Receiver</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The <link xlink:href="https://www.citrix.com/products/receiver/">Citrix Receiver</link> is a remote
|
||||||
|
desktop viewer which provides access to
|
||||||
|
<link xlink:href="https://www.citrix.com/products/xenapp-xendesktop/">XenDesktop</link> installations.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<section xml:id="sec-citrix-base">
|
||||||
|
<title>Basic usage</title>
|
||||||
|
<para>
|
||||||
|
The tarball archive needs to be downloaded manually as the licenses agreements of the vendor
|
||||||
|
need to be accepted first. This is available at the
|
||||||
|
<link xlink:href="https://www.citrix.com/downloads/citrix-receiver/">download page at citrix.com</link>.
|
||||||
|
Then run <literal>nix-prefetch-url file://$PWD/linuxx64-$version.tar.gz</literal>.
|
||||||
|
With the archive available in the store the package can be built and installed with Nix.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
<emphasis>Note: it's recommended to install <literal>Citrix Receiver</literal> using
|
||||||
|
<literal>nix-env -i</literal> or globally to ensure that the <literal>.desktop</literal> files
|
||||||
|
are installed properly into <literal>$XDG_CONFIG_DIRS</literal>. Otherwise it won't
|
||||||
|
be possible to open <literal>.ica</literal> files
|
||||||
|
automatically from the browser to start a Citrix connection.</emphasis>
|
||||||
|
</para>
|
||||||
|
</section>
|
||||||
|
<section xml:id="sec-citrix-custom-certs">
|
||||||
|
<title>Custom certificates</title>
|
||||||
|
<para>
|
||||||
|
The <literal>Citrix Receiver</literal> in <literal>nixpkgs</literal> trusts several certificates
|
||||||
|
<link xlink:href="https://curl.haxx.se/docs/caextract.html">from the Mozilla database</link> by default.
|
||||||
|
However several companies using Citrix might require their own corporate certificate. On distros with imperative
|
||||||
|
packaging these certs can be stored easily in
|
||||||
|
<link xlink:href="https://developer-docs.citrix.com/projects/receiver-for-linux-command-reference/en/13.7/"><literal>$ICAROOT</literal></link>,
|
||||||
|
however this directory is a store path in <literal>nixpkgs</literal>. In order to work around this issue the package provides a simple
|
||||||
|
mechanism to add custom certificates without rebuilding the entire package using <literal>symlinkJoin</literal>:
|
||||||
|
|
||||||
|
<programlisting>
|
||||||
|
<![CDATA[with import <nixpkgs> { config.allowUnfree = true; };
|
||||||
|
let extraCerts = [ ./custom-cert-1.pem ./custom-cert-2.pem /* ... */ ]; in
|
||||||
|
citrix_receiver.override {
|
||||||
|
inherit extraCerts;
|
||||||
|
}]]>
|
||||||
|
</programlisting>
|
||||||
|
</para>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
</chapter>
|
</chapter>
|
||||||
|
@ -103,8 +103,9 @@
|
|||||||
<itemizedlist>
|
<itemizedlist>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>
|
<para>
|
||||||
mention-bot usually notifies GitHub users based on the submitted changes,
|
<link xlink:href="https://help.github.com/articles/about-codeowners/">CODEOWNERS</link>
|
||||||
but it can happen that it misses some of the package maintainers.
|
will make GitHub notify users based on the submitted changes, but it can
|
||||||
|
happen that it misses some of the package maintainers.
|
||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</itemizedlist>
|
</itemizedlist>
|
||||||
@ -376,8 +377,9 @@ $ nix-shell -p nox --run "nox-review -k pr PRNUMBER"
|
|||||||
<itemizedlist>
|
<itemizedlist>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>
|
<para>
|
||||||
Mention-bot notify GitHub users based on the submitted changes, but it
|
<link xlink:href="https://help.github.com/articles/about-codeowners/">CODEOWNERS</link>
|
||||||
can happen that it miss some of the package maintainers.
|
will make GitHub notify users based on the submitted changes, but it can
|
||||||
|
happen that it misses some of the package maintainers.
|
||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</itemizedlist>
|
</itemizedlist>
|
||||||
|
@ -807,6 +807,11 @@
|
|||||||
github = "coroa";
|
github = "coroa";
|
||||||
name = "Jonas Hörsch";
|
name = "Jonas Hörsch";
|
||||||
};
|
};
|
||||||
|
costrouc = {
|
||||||
|
email = "chris.ostrouchov@gmail.com";
|
||||||
|
github = "costrouc";
|
||||||
|
name = "Chris Ostrouchov";
|
||||||
|
};
|
||||||
couchemar = {
|
couchemar = {
|
||||||
email = "couchemar@yandex.ru";
|
email = "couchemar@yandex.ru";
|
||||||
github = "couchemar";
|
github = "couchemar";
|
||||||
@ -1689,6 +1694,11 @@
|
|||||||
github = "imalsogreg";
|
github = "imalsogreg";
|
||||||
name = "Greg Hale";
|
name = "Greg Hale";
|
||||||
};
|
};
|
||||||
|
imuli = {
|
||||||
|
email = "i@imu.li";
|
||||||
|
github = "imuli";
|
||||||
|
name = "Imuli";
|
||||||
|
};
|
||||||
infinisil = {
|
infinisil = {
|
||||||
email = "infinisil@icloud.com";
|
email = "infinisil@icloud.com";
|
||||||
github = "infinisil";
|
github = "infinisil";
|
||||||
@ -1837,6 +1847,11 @@
|
|||||||
github = "jluttine";
|
github = "jluttine";
|
||||||
name = "Jaakko Luttinen";
|
name = "Jaakko Luttinen";
|
||||||
};
|
};
|
||||||
|
jmettes = {
|
||||||
|
email = "jonathan@jmettes.com";
|
||||||
|
github = "jmettes";
|
||||||
|
name = "Jonathan Mettes";
|
||||||
|
};
|
||||||
Jo = {
|
Jo = {
|
||||||
email = "0x4A6F@shackspace.de";
|
email = "0x4A6F@shackspace.de";
|
||||||
name = "Joachim Ernst";
|
name = "Joachim Ernst";
|
||||||
@ -2094,6 +2109,11 @@
|
|||||||
github = "kuznero";
|
github = "kuznero";
|
||||||
name = "Roman Kuznetsov";
|
name = "Roman Kuznetsov";
|
||||||
};
|
};
|
||||||
|
kylewlacy = {
|
||||||
|
email = "kylelacy+nix@pm.me";
|
||||||
|
github = "kylewlacy";
|
||||||
|
name = "Kyle Lacy";
|
||||||
|
};
|
||||||
lasandell = {
|
lasandell = {
|
||||||
email = "lasandell@gmail.com";
|
email = "lasandell@gmail.com";
|
||||||
github = "lasandell";
|
github = "lasandell";
|
||||||
@ -2180,7 +2200,7 @@
|
|||||||
name = "Nathaniel Baxter";
|
name = "Nathaniel Baxter";
|
||||||
};
|
};
|
||||||
lightdiscord = {
|
lightdiscord = {
|
||||||
email = "arnaud@lightdiscord.me";
|
email = "root@arnaud.sh";
|
||||||
github = "lightdiscord";
|
github = "lightdiscord";
|
||||||
name = "Arnaud Pascal";
|
name = "Arnaud Pascal";
|
||||||
};
|
};
|
||||||
|
@ -73,6 +73,20 @@ $ nix-instantiate -E '(import <nixpkgsunstable> {}).gitFull'
|
|||||||
</para>
|
</para>
|
||||||
|
|
||||||
<itemizedlist>
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
The <varname>services.cassandra</varname> module has been reworked and
|
||||||
|
was rewritten from scratch. The service has succeeding tests for
|
||||||
|
the versions 2.1, 2.2, 3.0 and 3.11 of <link
|
||||||
|
xlink:href="https://cassandra.apache.org/">Apache Cassandra</link>.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
There is a new <varname>services.foundationdb</varname> module for deploying
|
||||||
|
<link xlink:href="https://www.foundationdb.org">FoundationDB</link> clusters.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>
|
<para>
|
||||||
When enabled the <literal>iproute2</literal> will copy the files expected
|
When enabled the <literal>iproute2</literal> will copy the files expected
|
||||||
@ -113,6 +127,12 @@ $ nix-instantiate -E '(import <nixpkgsunstable> {}).gitFull'
|
|||||||
</para>
|
</para>
|
||||||
|
|
||||||
<itemizedlist>
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
The deprecated <varname>services.cassandra</varname> module has
|
||||||
|
seen a complete rewrite. (See above.)
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>
|
<para>
|
||||||
<literal>lib.strict</literal> is removed. Use
|
<literal>lib.strict</literal> is removed. Use
|
||||||
@ -170,6 +190,16 @@ $ nix-instantiate -E '(import <nixpkgsunstable> {}).gitFull'
|
|||||||
which indicates that the nix output hash will be used as tag.
|
which indicates that the nix output hash will be used as tag.
|
||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Options
|
||||||
|
<literal>boot.initrd.luks.devices.<replaceable>name</replaceable>.yubikey.ramfsMountPoint</literal>
|
||||||
|
<literal>boot.initrd.luks.devices.<replaceable>name</replaceable>.yubikey.storage.mountPoint</literal>
|
||||||
|
were removed. <literal>luksroot.nix</literal> module never supported more than one YubiKey at
|
||||||
|
a time anyway, hence those options never had any effect. You should be able to remove them
|
||||||
|
from your config without any issues.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
</itemizedlist>
|
</itemizedlist>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
@ -29,8 +29,5 @@ with lib;
|
|||||||
# Add Memtest86+ to the CD.
|
# Add Memtest86+ to the CD.
|
||||||
boot.loader.grub.memtest86.enable = true;
|
boot.loader.grub.memtest86.enable = true;
|
||||||
|
|
||||||
# Allow the user to log in as root without a password.
|
|
||||||
users.users.root.initialHashedPassword = "";
|
|
||||||
|
|
||||||
system.stateVersion = mkDefault "18.03";
|
system.stateVersion = mkDefault "18.03";
|
||||||
}
|
}
|
||||||
|
@ -33,9 +33,6 @@ in
|
|||||||
# Also increase the amount of CMA to ensure the virtual console on the RPi3 works.
|
# Also increase the amount of CMA to ensure the virtual console on the RPi3 works.
|
||||||
boot.kernelParams = ["cma=32M" "console=ttyS0,115200n8" "console=ttyAMA0,115200n8" "console=tty0"];
|
boot.kernelParams = ["cma=32M" "console=ttyS0,115200n8" "console=ttyAMA0,115200n8" "console=tty0"];
|
||||||
|
|
||||||
# FIXME: this probably should be in installation-device.nix
|
|
||||||
users.users.root.initialHashedPassword = "";
|
|
||||||
|
|
||||||
sdImage = {
|
sdImage = {
|
||||||
populateBootCommands = let
|
populateBootCommands = let
|
||||||
configTxt = pkgs.writeText "config.txt" ''
|
configTxt = pkgs.writeText "config.txt" ''
|
||||||
|
@ -34,9 +34,6 @@ in
|
|||||||
# - ttySAC2: for Exynos (ODROID-XU3)
|
# - ttySAC2: for Exynos (ODROID-XU3)
|
||||||
boot.kernelParams = ["console=ttyS0,115200n8" "console=ttymxc0,115200n8" "console=ttyAMA0,115200n8" "console=ttyO0,115200n8" "console=ttySAC2,115200n8" "console=tty0"];
|
boot.kernelParams = ["console=ttyS0,115200n8" "console=ttymxc0,115200n8" "console=ttyAMA0,115200n8" "console=ttyO0,115200n8" "console=ttySAC2,115200n8" "console=tty0"];
|
||||||
|
|
||||||
# FIXME: this probably should be in installation-device.nix
|
|
||||||
users.users.root.initialHashedPassword = "";
|
|
||||||
|
|
||||||
sdImage = {
|
sdImage = {
|
||||||
populateBootCommands = let
|
populateBootCommands = let
|
||||||
configTxt = pkgs.writeText "config.txt" ''
|
configTxt = pkgs.writeText "config.txt" ''
|
||||||
|
@ -27,9 +27,6 @@ in
|
|||||||
boot.consoleLogLevel = lib.mkDefault 7;
|
boot.consoleLogLevel = lib.mkDefault 7;
|
||||||
boot.kernelPackages = pkgs.linuxPackages_rpi;
|
boot.kernelPackages = pkgs.linuxPackages_rpi;
|
||||||
|
|
||||||
# FIXME: this probably should be in installation-device.nix
|
|
||||||
users.users.root.initialHashedPassword = "";
|
|
||||||
|
|
||||||
sdImage = {
|
sdImage = {
|
||||||
populateBootCommands = let
|
populateBootCommands = let
|
||||||
configTxt = pkgs.writeText "config.txt" ''
|
configTxt = pkgs.writeText "config.txt" ''
|
||||||
|
@ -14,7 +14,4 @@ with lib;
|
|||||||
../../profiles/base.nix
|
../../profiles/base.nix
|
||||||
../../profiles/installation-device.nix
|
../../profiles/installation-device.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
# Allow the user to log in as root without a password.
|
|
||||||
users.users.root.initialHashedPassword = "";
|
|
||||||
}
|
}
|
||||||
|
@ -536,6 +536,13 @@ if ($showHardwareConfig) {
|
|||||||
# Use the systemd-boot EFI boot loader.
|
# Use the systemd-boot EFI boot loader.
|
||||||
boot.loader.systemd-boot.enable = true;
|
boot.loader.systemd-boot.enable = true;
|
||||||
boot.loader.efi.canTouchEfiVariables = true;
|
boot.loader.efi.canTouchEfiVariables = true;
|
||||||
|
EOF
|
||||||
|
} elsif (-e "/boot/extlinux") {
|
||||||
|
$bootLoaderConfig = <<EOF;
|
||||||
|
# Use the extlinux boot loader. (NixOS wants to enable GRUB by default)
|
||||||
|
boot.loader.grub.enable = false;
|
||||||
|
# Enables the generation of /boot/extlinux/extlinux.conf
|
||||||
|
boot.loader.generic-extlinux-compatible.enable = true;
|
||||||
EOF
|
EOF
|
||||||
} elsif ($virt ne "systemd-nspawn") {
|
} elsif ($virt ne "systemd-nspawn") {
|
||||||
$bootLoaderConfig = <<EOF;
|
$bootLoaderConfig = <<EOF;
|
||||||
|
@ -324,6 +324,7 @@
|
|||||||
hadoop = 297;
|
hadoop = 297;
|
||||||
hydron = 298;
|
hydron = 298;
|
||||||
cfssl = 299;
|
cfssl = 299;
|
||||||
|
cassandra = 300;
|
||||||
|
|
||||||
# When adding a uid, make sure it doesn't match an existing gid. And don't use uids above 399!
|
# When adding a uid, make sure it doesn't match an existing gid. And don't use uids above 399!
|
||||||
|
|
||||||
@ -608,6 +609,7 @@
|
|||||||
hadoop = 297;
|
hadoop = 297;
|
||||||
hydron = 298;
|
hydron = 298;
|
||||||
cfssl = 299;
|
cfssl = 299;
|
||||||
|
cassandra = 300;
|
||||||
|
|
||||||
# When adding a gid, make sure it doesn't match an existing
|
# When adding a gid, make sure it doesn't match an existing
|
||||||
# uid. Users and groups with the same name should have equal
|
# uid. Users and groups with the same name should have equal
|
||||||
|
@ -201,6 +201,7 @@
|
|||||||
./services/databases/4store-endpoint.nix
|
./services/databases/4store-endpoint.nix
|
||||||
./services/databases/4store.nix
|
./services/databases/4store.nix
|
||||||
./services/databases/aerospike.nix
|
./services/databases/aerospike.nix
|
||||||
|
./services/databases/cassandra.nix
|
||||||
./services/databases/clickhouse.nix
|
./services/databases/clickhouse.nix
|
||||||
./services/databases/couchdb.nix
|
./services/databases/couchdb.nix
|
||||||
./services/databases/firebird.nix
|
./services/databases/firebird.nix
|
||||||
|
@ -86,5 +86,9 @@ with lib;
|
|||||||
networking.firewall.logRefusedConnections = mkDefault false;
|
networking.firewall.logRefusedConnections = mkDefault false;
|
||||||
|
|
||||||
environment.systemPackages = [ pkgs.vim ];
|
environment.systemPackages = [ pkgs.vim ];
|
||||||
|
|
||||||
|
|
||||||
|
# Allow the user to log in as root without a password.
|
||||||
|
users.users.root.initialHashedPassword = "";
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,6 @@ with lib;
|
|||||||
(mkRenamedOptionModule [ "system" "nixos" "stateVersion" ] [ "system" "stateVersion" ])
|
(mkRenamedOptionModule [ "system" "nixos" "stateVersion" ] [ "system" "stateVersion" ])
|
||||||
(mkRenamedOptionModule [ "system" "nixos" "defaultChannel" ] [ "system" "defaultChannel" ])
|
(mkRenamedOptionModule [ "system" "nixos" "defaultChannel" ] [ "system" "defaultChannel" ])
|
||||||
|
|
||||||
(mkRenamedOptionModule [ "dysnomia" ] [ "services" "dysnomia" ])
|
|
||||||
(mkRenamedOptionModule [ "environment" "x11Packages" ] [ "environment" "systemPackages" ])
|
(mkRenamedOptionModule [ "environment" "x11Packages" ] [ "environment" "systemPackages" ])
|
||||||
(mkRenamedOptionModule [ "environment" "enableBashCompletion" ] [ "programs" "bash" "enableCompletion" ])
|
(mkRenamedOptionModule [ "environment" "enableBashCompletion" ] [ "programs" "bash" "enableCompletion" ])
|
||||||
(mkRenamedOptionModule [ "environment" "nix" ] [ "nix" "package" ])
|
(mkRenamedOptionModule [ "environment" "nix" ] [ "nix" "package" ])
|
||||||
|
@ -4,445 +4,288 @@ with lib;
|
|||||||
|
|
||||||
let
|
let
|
||||||
cfg = config.services.cassandra;
|
cfg = config.services.cassandra;
|
||||||
cassandraPackage = cfg.package.override {
|
defaultUser = "cassandra";
|
||||||
jre = cfg.jre;
|
cassandraConfig = flip recursiveUpdate cfg.extraConfig
|
||||||
};
|
({ commitlog_sync = "batch";
|
||||||
cassandraUser = {
|
commitlog_sync_batch_window_in_ms = 2;
|
||||||
name = cfg.user;
|
partitioner = "org.apache.cassandra.dht.Murmur3Partitioner";
|
||||||
home = "/var/lib/cassandra";
|
endpoint_snitch = "SimpleSnitch";
|
||||||
description = "Cassandra role user";
|
seed_provider =
|
||||||
};
|
[{ class_name = "org.apache.cassandra.locator.SimpleSeedProvider";
|
||||||
|
parameters = [ { seeds = "127.0.0.1"; } ];
|
||||||
cassandraRackDcProperties = ''
|
}];
|
||||||
dc=${cfg.dc}
|
data_file_directories = [ "${cfg.homeDir}/data" ];
|
||||||
rack=${cfg.rack}
|
commitlog_directory = "${cfg.homeDir}/commitlog";
|
||||||
'';
|
saved_caches_directory = "${cfg.homeDir}/saved_caches";
|
||||||
|
} // (if builtins.compareVersions cfg.package.version "3" >= 0
|
||||||
cassandraConf = ''
|
then { hints_directory = "${cfg.homeDir}/hints"; }
|
||||||
cluster_name: ${cfg.clusterName}
|
else {})
|
||||||
num_tokens: 256
|
);
|
||||||
auto_bootstrap: ${boolToString cfg.autoBootstrap}
|
cassandraConfigWithAddresses = cassandraConfig //
|
||||||
hinted_handoff_enabled: ${boolToString cfg.hintedHandOff}
|
( if isNull cfg.listenAddress
|
||||||
hinted_handoff_throttle_in_kb: ${builtins.toString cfg.hintedHandOffThrottle}
|
then { listen_interface = cfg.listenInterface; }
|
||||||
max_hints_delivery_threads: 2
|
else { listen_address = cfg.listenAddress; }
|
||||||
max_hint_window_in_ms: 10800000 # 3 hours
|
) // (
|
||||||
authenticator: ${cfg.authenticator}
|
if isNull cfg.rpcAddress
|
||||||
authorizer: ${cfg.authorizer}
|
then { rpc_interface = cfg.rpcInterface; }
|
||||||
permissions_validity_in_ms: 2000
|
else { rpc_address = cfg.rpcAddress; }
|
||||||
partitioner: org.apache.cassandra.dht.Murmur3Partitioner
|
);
|
||||||
data_file_directories:
|
cassandraEtc = pkgs.stdenv.mkDerivation
|
||||||
${builtins.concatStringsSep "\n" (map (v: " - "+v) cfg.dataDirs)}
|
{ name = "cassandra-etc";
|
||||||
commitlog_directory: ${cfg.commitLogDirectory}
|
cassandraYaml = builtins.toJSON cassandraConfigWithAddresses;
|
||||||
disk_failure_policy: stop
|
cassandraEnvPkg = "${cfg.package}/conf/cassandra-env.sh";
|
||||||
key_cache_size_in_mb:
|
buildCommand = ''
|
||||||
key_cache_save_period: 14400
|
mkdir -p "$out"
|
||||||
row_cache_size_in_mb: 0
|
|
||||||
row_cache_save_period: 0
|
|
||||||
saved_caches_directory: ${cfg.savedCachesDirectory}
|
|
||||||
commitlog_sync: ${cfg.commitLogSync}
|
|
||||||
commitlog_sync_period_in_ms: ${builtins.toString cfg.commitLogSyncPeriod}
|
|
||||||
commitlog_segment_size_in_mb: 32
|
|
||||||
seed_provider:
|
|
||||||
- class_name: org.apache.cassandra.locator.SimpleSeedProvider
|
|
||||||
parameters:
|
|
||||||
- seeds: "${builtins.concatStringsSep "," cfg.seeds}"
|
|
||||||
concurrent_reads: ${builtins.toString cfg.concurrentReads}
|
|
||||||
concurrent_writes: ${builtins.toString cfg.concurrentWrites}
|
|
||||||
memtable_flush_queue_size: 4
|
|
||||||
trickle_fsync: false
|
|
||||||
trickle_fsync_interval_in_kb: 10240
|
|
||||||
storage_port: 7000
|
|
||||||
ssl_storage_port: 7001
|
|
||||||
listen_address: ${cfg.listenAddress}
|
|
||||||
start_native_transport: true
|
|
||||||
native_transport_port: 9042
|
|
||||||
start_rpc: true
|
|
||||||
rpc_address: ${cfg.rpcAddress}
|
|
||||||
rpc_port: 9160
|
|
||||||
rpc_keepalive: true
|
|
||||||
rpc_server_type: sync
|
|
||||||
thrift_framed_transport_size_in_mb: 15
|
|
||||||
incremental_backups: ${boolToString cfg.incrementalBackups}
|
|
||||||
snapshot_before_compaction: false
|
|
||||||
auto_snapshot: true
|
|
||||||
column_index_size_in_kb: 64
|
|
||||||
in_memory_compaction_limit_in_mb: 64
|
|
||||||
multithreaded_compaction: false
|
|
||||||
compaction_throughput_mb_per_sec: 16
|
|
||||||
compaction_preheat_key_cache: true
|
|
||||||
read_request_timeout_in_ms: 10000
|
|
||||||
range_request_timeout_in_ms: 10000
|
|
||||||
write_request_timeout_in_ms: 10000
|
|
||||||
cas_contention_timeout_in_ms: 1000
|
|
||||||
truncate_request_timeout_in_ms: 60000
|
|
||||||
request_timeout_in_ms: 10000
|
|
||||||
cross_node_timeout: false
|
|
||||||
endpoint_snitch: ${cfg.snitch}
|
|
||||||
dynamic_snitch_update_interval_in_ms: 100
|
|
||||||
dynamic_snitch_reset_interval_in_ms: 600000
|
|
||||||
dynamic_snitch_badness_threshold: 0.1
|
|
||||||
request_scheduler: org.apache.cassandra.scheduler.NoScheduler
|
|
||||||
server_encryption_options:
|
|
||||||
internode_encryption: ${cfg.internodeEncryption}
|
|
||||||
keystore: ${cfg.keyStorePath}
|
|
||||||
keystore_password: ${cfg.keyStorePassword}
|
|
||||||
truststore: ${cfg.trustStorePath}
|
|
||||||
truststore_password: ${cfg.trustStorePassword}
|
|
||||||
client_encryption_options:
|
|
||||||
enabled: ${boolToString cfg.clientEncryption}
|
|
||||||
keystore: ${cfg.keyStorePath}
|
|
||||||
keystore_password: ${cfg.keyStorePassword}
|
|
||||||
internode_compression: all
|
|
||||||
inter_dc_tcp_nodelay: false
|
|
||||||
preheat_kernel_page_cache: false
|
|
||||||
streaming_socket_timeout_in_ms: ${toString cfg.streamingSocketTimoutInMS}
|
|
||||||
'';
|
|
||||||
|
|
||||||
cassandraLog = ''
|
|
||||||
log4j.rootLogger=${cfg.logLevel},stdout
|
|
||||||
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
|
|
||||||
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
|
|
||||||
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] %d{HH:mm:ss,SSS} %m%n
|
|
||||||
'';
|
|
||||||
|
|
||||||
cassandraConfFile = pkgs.writeText "cassandra.yaml" cassandraConf;
|
|
||||||
cassandraLogFile = pkgs.writeText "log4j-server.properties" cassandraLog;
|
|
||||||
cassandraRackFile = pkgs.writeText "cassandra-rackdc.properties" cassandraRackDcProperties;
|
|
||||||
|
|
||||||
cassandraEnvironment = {
|
|
||||||
CASSANDRA_HOME = cassandraPackage;
|
|
||||||
JAVA_HOME = cfg.jre;
|
|
||||||
CASSANDRA_CONF = "/etc/cassandra";
|
|
||||||
};
|
|
||||||
|
|
||||||
|
echo "$cassandraYaml" > "$out/cassandra.yaml"
|
||||||
|
ln -s "$cassandraEnvPkg" "$out/cassandra-env.sh"
|
||||||
|
'';
|
||||||
|
};
|
||||||
in {
|
in {
|
||||||
|
|
||||||
###### interface
|
|
||||||
|
|
||||||
options.services.cassandra = {
|
options.services.cassandra = {
|
||||||
enable = mkOption {
|
enable = mkEnableOption ''
|
||||||
description = "Whether to enable cassandra.";
|
Apache Cassandra – Scalable and highly available database.
|
||||||
default = false;
|
'';
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
package = mkOption {
|
|
||||||
description = "Cassandra package to use.";
|
|
||||||
default = pkgs.cassandra;
|
|
||||||
defaultText = "pkgs.cassandra";
|
|
||||||
type = types.package;
|
|
||||||
};
|
|
||||||
jre = mkOption {
|
|
||||||
description = "JRE package to run cassandra service.";
|
|
||||||
default = pkgs.jre;
|
|
||||||
defaultText = "pkgs.jre";
|
|
||||||
type = types.package;
|
|
||||||
};
|
|
||||||
user = mkOption {
|
user = mkOption {
|
||||||
description = "User that runs cassandra service.";
|
type = types.str;
|
||||||
default = "cassandra";
|
default = defaultUser;
|
||||||
type = types.string;
|
description = "Run Apache Cassandra under this user.";
|
||||||
};
|
};
|
||||||
group = mkOption {
|
group = mkOption {
|
||||||
description = "Group that runs cassandra service.";
|
|
||||||
default = "cassandra";
|
|
||||||
type = types.string;
|
|
||||||
};
|
|
||||||
envFile = mkOption {
|
|
||||||
description = "path to cassandra-env.sh";
|
|
||||||
default = "${cassandraPackage}/conf/cassandra-env.sh";
|
|
||||||
defaultText = "\${cassandraPackage}/conf/cassandra-env.sh";
|
|
||||||
type = types.path;
|
|
||||||
};
|
|
||||||
clusterName = mkOption {
|
|
||||||
description = "set cluster name";
|
|
||||||
default = "cassandra";
|
|
||||||
example = "prod-cluster0";
|
|
||||||
type = types.string;
|
|
||||||
};
|
|
||||||
commitLogDirectory = mkOption {
|
|
||||||
description = "directory for commit logs";
|
|
||||||
default = "/var/lib/cassandra/commit_log";
|
|
||||||
type = types.string;
|
|
||||||
};
|
|
||||||
savedCachesDirectory = mkOption {
|
|
||||||
description = "directory for saved caches";
|
|
||||||
default = "/var/lib/cassandra/saved_caches";
|
|
||||||
type = types.string;
|
|
||||||
};
|
|
||||||
hintedHandOff = mkOption {
|
|
||||||
description = "enable hinted handoff";
|
|
||||||
default = true;
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
hintedHandOffThrottle = mkOption {
|
|
||||||
description = "hinted hand off throttle rate in kb";
|
|
||||||
default = 1024;
|
|
||||||
type = types.int;
|
|
||||||
};
|
|
||||||
commitLogSync = mkOption {
|
|
||||||
description = "commitlog sync method";
|
|
||||||
default = "periodic";
|
|
||||||
type = types.str;
|
type = types.str;
|
||||||
example = "batch";
|
default = defaultUser;
|
||||||
|
description = "Run Apache Cassandra under this group.";
|
||||||
};
|
};
|
||||||
commitLogSyncPeriod = mkOption {
|
homeDir = mkOption {
|
||||||
description = "commitlog sync period in ms ";
|
|
||||||
default = 10000;
|
|
||||||
type = types.int;
|
|
||||||
};
|
|
||||||
envScript = mkOption {
|
|
||||||
default = "${cassandraPackage}/conf/cassandra-env.sh";
|
|
||||||
defaultText = "\${cassandraPackage}/conf/cassandra-env.sh";
|
|
||||||
type = types.path;
|
type = types.path;
|
||||||
description = "Supply your own cassandra-env.sh rather than using the default";
|
default = "/var/lib/cassandra";
|
||||||
|
description = ''
|
||||||
|
Home directory for Apache Cassandra.
|
||||||
|
'';
|
||||||
};
|
};
|
||||||
extraParams = mkOption {
|
package = mkOption {
|
||||||
description = "add additional lines to cassandra-env.sh";
|
type = types.package;
|
||||||
|
default = pkgs.cassandra;
|
||||||
|
defaultText = "pkgs.cassandra";
|
||||||
|
example = literalExample "pkgs.cassandra_3_11";
|
||||||
|
description = ''
|
||||||
|
The Apache Cassandra package to use.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
jvmOpts = mkOption {
|
||||||
|
type = types.listOf types.str;
|
||||||
default = [];
|
default = [];
|
||||||
example = [''JVM_OPTS="$JVM_OPTS -Dcassandra.available_processors=1"''];
|
description = ''
|
||||||
type = types.listOf types.str;
|
Populate the JVM_OPT environment variable.
|
||||||
};
|
'';
|
||||||
dataDirs = mkOption {
|
|
||||||
type = types.listOf types.path;
|
|
||||||
default = [ "/var/lib/cassandra/data" ];
|
|
||||||
description = "Data directories for cassandra";
|
|
||||||
};
|
|
||||||
logLevel = mkOption {
|
|
||||||
type = types.str;
|
|
||||||
default = "INFO";
|
|
||||||
description = "default logging level for log4j";
|
|
||||||
};
|
|
||||||
internodeEncryption = mkOption {
|
|
||||||
description = "enable internode encryption";
|
|
||||||
default = "none";
|
|
||||||
example = "all";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
clientEncryption = mkOption {
|
|
||||||
description = "enable client encryption";
|
|
||||||
default = false;
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
trustStorePath = mkOption {
|
|
||||||
description = "path to truststore";
|
|
||||||
default = ".conf/truststore";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
keyStorePath = mkOption {
|
|
||||||
description = "path to keystore";
|
|
||||||
default = ".conf/keystore";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
keyStorePassword = mkOption {
|
|
||||||
description = "password to keystore";
|
|
||||||
default = "cassandra";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
trustStorePassword = mkOption {
|
|
||||||
description = "password to truststore";
|
|
||||||
default = "cassandra";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
seeds = mkOption {
|
|
||||||
description = "password to truststore";
|
|
||||||
default = [ "127.0.0.1" ];
|
|
||||||
type = types.listOf types.str;
|
|
||||||
};
|
|
||||||
concurrentWrites = mkOption {
|
|
||||||
description = "number of concurrent writes allowed";
|
|
||||||
default = 32;
|
|
||||||
type = types.int;
|
|
||||||
};
|
|
||||||
concurrentReads = mkOption {
|
|
||||||
description = "number of concurrent reads allowed";
|
|
||||||
default = 32;
|
|
||||||
type = types.int;
|
|
||||||
};
|
};
|
||||||
listenAddress = mkOption {
|
listenAddress = mkOption {
|
||||||
description = "listen address";
|
type = types.nullOr types.str;
|
||||||
default = "localhost";
|
default = "127.0.0.1";
|
||||||
type = types.str;
|
example = literalExample "null";
|
||||||
|
description = ''
|
||||||
|
Address or interface to bind to and tell other Cassandra nodes
|
||||||
|
to connect to. You _must_ change this if you want multiple
|
||||||
|
nodes to be able to communicate!
|
||||||
|
|
||||||
|
Set listenAddress OR listenInterface, not both.
|
||||||
|
|
||||||
|
Leaving it blank leaves it up to
|
||||||
|
InetAddress.getLocalHost(). This will always do the Right
|
||||||
|
Thing _if_ the node is properly configured (hostname, name
|
||||||
|
resolution, etc), and the Right Thing is to use the address
|
||||||
|
associated with the hostname (it might not be).
|
||||||
|
|
||||||
|
Setting listen_address to 0.0.0.0 is always wrong.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
listenInterface = mkOption {
|
||||||
|
type = types.nullOr types.str;
|
||||||
|
default = null;
|
||||||
|
example = "eth1";
|
||||||
|
description = ''
|
||||||
|
Set listenAddress OR listenInterface, not both. Interfaces
|
||||||
|
must correspond to a single address, IP aliasing is not
|
||||||
|
supported.
|
||||||
|
'';
|
||||||
};
|
};
|
||||||
rpcAddress = mkOption {
|
rpcAddress = mkOption {
|
||||||
description = "rpc listener address";
|
type = types.nullOr types.str;
|
||||||
default = "localhost";
|
default = "127.0.0.1";
|
||||||
type = types.str;
|
example = literalExample "null";
|
||||||
};
|
|
||||||
incrementalBackups = mkOption {
|
|
||||||
description = "enable incremental backups";
|
|
||||||
default = false;
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
snitch = mkOption {
|
|
||||||
description = "snitch to use for topology discovery";
|
|
||||||
default = "GossipingPropertyFileSnitch";
|
|
||||||
example = "Ec2Snitch";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
dc = mkOption {
|
|
||||||
description = "datacenter for use in topology configuration";
|
|
||||||
default = "DC1";
|
|
||||||
example = "DC1";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
rack = mkOption {
|
|
||||||
description = "rack for use in topology configuration";
|
|
||||||
default = "RAC1";
|
|
||||||
example = "RAC1";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
authorizer = mkOption {
|
|
||||||
description = "
|
|
||||||
Authorization backend, implementing IAuthorizer; used to limit access/provide permissions
|
|
||||||
";
|
|
||||||
default = "AllowAllAuthorizer";
|
|
||||||
example = "CassandraAuthorizer";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
authenticator = mkOption {
|
|
||||||
description = "
|
|
||||||
Authentication backend, implementing IAuthenticator; used to identify users
|
|
||||||
";
|
|
||||||
default = "AllowAllAuthenticator";
|
|
||||||
example = "PasswordAuthenticator";
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
autoBootstrap = mkOption {
|
|
||||||
description = "It makes new (non-seed) nodes automatically migrate the right data to themselves.";
|
|
||||||
default = true;
|
|
||||||
type = types.bool;
|
|
||||||
};
|
|
||||||
streamingSocketTimoutInMS = mkOption {
|
|
||||||
description = "Enable or disable socket timeout for streaming operations";
|
|
||||||
default = 3600000; #CASSANDRA-8611
|
|
||||||
example = 120;
|
|
||||||
type = types.int;
|
|
||||||
};
|
|
||||||
repairStartAt = mkOption {
|
|
||||||
default = "Sun";
|
|
||||||
type = types.string;
|
|
||||||
description = ''
|
description = ''
|
||||||
Defines realtime (i.e. wallclock) timers with calendar event
|
The address or interface to bind the native transport server to.
|
||||||
expressions. For more details re: systemd OnCalendar at
|
|
||||||
https://www.freedesktop.org/software/systemd/man/systemd.time.html#Displaying%20Time%20Spans
|
Set rpcAddress OR rpcInterface, not both.
|
||||||
'';
|
|
||||||
example = ["weekly" "daily" "08:05:40" "mon,fri *-1/2-1,3 *:30:45"];
|
Leaving rpcAddress blank has the same effect as on
|
||||||
};
|
listenAddress (i.e. it will be based on the configured hostname
|
||||||
repairRandomizedDelayInSec = mkOption {
|
of the node).
|
||||||
default = 0;
|
|
||||||
type = types.int;
|
Note that unlike listenAddress, you can specify 0.0.0.0, but you
|
||||||
description = ''Delay the timer by a randomly selected, evenly distributed
|
must also set extraConfig.broadcast_rpc_address to a value other
|
||||||
amount of time between 0 and the specified time value. re: systemd timer
|
than 0.0.0.0.
|
||||||
RandomizedDelaySec for more details
|
|
||||||
|
For security reasons, you should not expose this port to the
|
||||||
|
internet. Firewall it if needed.
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
repairPostStop = mkOption {
|
rpcInterface = mkOption {
|
||||||
|
type = types.nullOr types.str;
|
||||||
default = null;
|
default = null;
|
||||||
type = types.nullOr types.string;
|
example = "eth1";
|
||||||
description = ''
|
description = ''
|
||||||
Run a script when repair is over. One can use it to send statsd events, email, etc.
|
Set rpcAddress OR rpcInterface, not both. Interfaces must
|
||||||
|
correspond to a single address, IP aliasing is not supported.
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
repairPostStart = mkOption {
|
|
||||||
default = null;
|
extraConfig = mkOption {
|
||||||
type = types.nullOr types.string;
|
type = types.attrs;
|
||||||
|
default = {};
|
||||||
|
example =
|
||||||
|
{ commitlog_sync_batch_window_in_ms = 3;
|
||||||
|
};
|
||||||
description = ''
|
description = ''
|
||||||
Run a script when repair starts. One can use it to send statsd events, email, etc.
|
Extra options to be merged into cassandra.yaml as nix attribute set.
|
||||||
It has same semantics as systemd ExecStopPost; So, if it fails, unit is consisdered
|
|
||||||
failed.
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
fullRepairInterval = mkOption {
|
||||||
|
type = types.nullOr types.str;
|
||||||
|
default = "3w";
|
||||||
|
example = literalExample "null";
|
||||||
|
description = ''
|
||||||
|
Set the interval how often full repairs are run, i.e.
|
||||||
|
`nodetool repair --full` is executed. See
|
||||||
|
https://cassandra.apache.org/doc/latest/operating/repair.html
|
||||||
|
for more information.
|
||||||
|
|
||||||
|
Set to `null` to disable full repairs.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
fullRepairOptions = mkOption {
|
||||||
|
type = types.listOf types.str;
|
||||||
|
default = [];
|
||||||
|
example = [ "--partitioner-range" ];
|
||||||
|
description = ''
|
||||||
|
Options passed through to the full repair command.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
incrementalRepairInterval = mkOption {
|
||||||
|
type = types.nullOr types.str;
|
||||||
|
default = "3d";
|
||||||
|
example = literalExample "null";
|
||||||
|
description = ''
|
||||||
|
Set the interval how often incremental repairs are run, i.e.
|
||||||
|
`nodetool repair` is executed. See
|
||||||
|
https://cassandra.apache.org/doc/latest/operating/repair.html
|
||||||
|
for more information.
|
||||||
|
|
||||||
|
Set to `null` to disable incremental repairs.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
incrementalRepairOptions = mkOption {
|
||||||
|
type = types.listOf types.string;
|
||||||
|
default = [];
|
||||||
|
example = [ "--partitioner-range" ];
|
||||||
|
description = ''
|
||||||
|
Options passed through to the incremental repair command.
|
||||||
|
'';
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
###### implementation
|
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
|
assertions =
|
||||||
environment.etc."cassandra/cassandra-rackdc.properties" = {
|
[ { assertion =
|
||||||
source = cassandraRackFile;
|
((isNull cfg.listenAddress)
|
||||||
};
|
|| (isNull cfg.listenInterface)
|
||||||
environment.etc."cassandra/cassandra.yaml" = {
|
) && !((isNull cfg.listenAddress)
|
||||||
source = cassandraConfFile;
|
&& (isNull cfg.listenInterface)
|
||||||
};
|
);
|
||||||
environment.etc."cassandra/log4j-server.properties" = {
|
message = "You have to set either listenAddress or listenInterface";
|
||||||
source = cassandraLogFile;
|
}
|
||||||
};
|
{ assertion =
|
||||||
environment.etc."cassandra/cassandra-env.sh" = {
|
((isNull cfg.rpcAddress)
|
||||||
text = ''
|
|| (isNull cfg.rpcInterface)
|
||||||
${builtins.readFile cfg.envFile}
|
) && !((isNull cfg.rpcAddress)
|
||||||
${concatStringsSep "\n" cfg.extraParams}
|
&& (isNull cfg.rpcInterface)
|
||||||
'';
|
);
|
||||||
};
|
message = "You have to set either rpcAddress or rpcInterface";
|
||||||
systemd.services.cassandra = {
|
}
|
||||||
description = "Cassandra Daemon";
|
|
||||||
wantedBy = [ "multi-user.target" ];
|
|
||||||
after = [ "network.target" ];
|
|
||||||
environment = cassandraEnvironment;
|
|
||||||
restartTriggers = [ cassandraConfFile cassandraLogFile cassandraRackFile ];
|
|
||||||
serviceConfig = {
|
|
||||||
|
|
||||||
User = cfg.user;
|
|
||||||
PermissionsStartOnly = true;
|
|
||||||
LimitAS = "infinity";
|
|
||||||
LimitNOFILE = "100000";
|
|
||||||
LimitNPROC = "32768";
|
|
||||||
LimitMEMLOCK = "infinity";
|
|
||||||
|
|
||||||
};
|
|
||||||
script = ''
|
|
||||||
${cassandraPackage}/bin/cassandra -f
|
|
||||||
'';
|
|
||||||
path = [
|
|
||||||
cfg.jre
|
|
||||||
cassandraPackage
|
|
||||||
pkgs.coreutils
|
|
||||||
];
|
];
|
||||||
preStart = ''
|
users = mkIf (cfg.user == defaultUser) {
|
||||||
mkdir -m 0700 -p /etc/cassandra/triggers
|
extraUsers."${defaultUser}" =
|
||||||
mkdir -m 0700 -p /var/lib/cassandra /var/log/cassandra
|
{ group = cfg.group;
|
||||||
chown ${cfg.user} /var/lib/cassandra /var/log/cassandra /etc/cassandra/triggers
|
home = cfg.homeDir;
|
||||||
'';
|
createHome = true;
|
||||||
postStart = ''
|
uid = config.ids.uids.cassandra;
|
||||||
sleep 2
|
description = "Cassandra service user";
|
||||||
while ! nodetool status >/dev/null 2>&1; do
|
};
|
||||||
sleep 2
|
extraGroups."${defaultUser}".gid = config.ids.gids.cassandra;
|
||||||
done
|
|
||||||
nodetool status
|
|
||||||
'';
|
|
||||||
};
|
};
|
||||||
|
|
||||||
environment.systemPackages = [ cassandraPackage ];
|
systemd.services.cassandra =
|
||||||
|
{ description = "Apache Cassandra service";
|
||||||
networking.firewall.allowedTCPPorts = [
|
after = [ "network.target" ];
|
||||||
7000
|
environment =
|
||||||
7001
|
{ CASSANDRA_CONF = "${cassandraEtc}";
|
||||||
9042
|
JVM_OPTS = builtins.concatStringsSep " " cfg.jvmOpts;
|
||||||
9160
|
};
|
||||||
];
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
serviceConfig =
|
||||||
users.users.cassandra =
|
{ User = cfg.user;
|
||||||
if config.ids.uids ? "cassandra"
|
Group = cfg.group;
|
||||||
then { uid = config.ids.uids.cassandra; } // cassandraUser
|
ExecStart = "${cfg.package}/bin/cassandra -f";
|
||||||
else cassandraUser ;
|
SuccessExitStatus = 143;
|
||||||
|
};
|
||||||
boot.kernel.sysctl."vm.swappiness" = pkgs.lib.mkOptionDefault 0;
|
|
||||||
|
|
||||||
systemd.timers."cassandra-repair" = {
|
|
||||||
timerConfig = {
|
|
||||||
OnCalendar = "${toString cfg.repairStartAt}";
|
|
||||||
RandomizedDelaySec = cfg.repairRandomizedDelayInSec;
|
|
||||||
};
|
};
|
||||||
};
|
|
||||||
|
|
||||||
systemd.services."cassandra-repair" = {
|
systemd.services.cassandra-full-repair =
|
||||||
description = "Cassandra repair daemon";
|
{ description = "Perform a full repair on this Cassandra node";
|
||||||
environment = cassandraEnvironment;
|
after = [ "cassandra.service" ];
|
||||||
script = "${cassandraPackage}/bin/nodetool repair -pr";
|
requires = [ "cassandra.service" ];
|
||||||
postStop = mkIf (cfg.repairPostStop != null) cfg.repairPostStop;
|
serviceConfig =
|
||||||
postStart = mkIf (cfg.repairPostStart != null) cfg.repairPostStart;
|
{ User = cfg.user;
|
||||||
serviceConfig = {
|
Group = cfg.group;
|
||||||
User = cfg.user;
|
ExecStart =
|
||||||
|
lib.concatStringsSep " "
|
||||||
|
([ "${cfg.package}/bin/nodetool" "repair" "--full"
|
||||||
|
] ++ cfg.fullRepairOptions);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
systemd.timers.cassandra-full-repair =
|
||||||
|
mkIf (!isNull cfg.fullRepairInterval) {
|
||||||
|
description = "Schedule full repairs on Cassandra";
|
||||||
|
wantedBy = [ "timers.target" ];
|
||||||
|
timerConfig =
|
||||||
|
{ OnBootSec = cfg.fullRepairInterval;
|
||||||
|
OnUnitActiveSec = cfg.fullRepairInterval;
|
||||||
|
Persistent = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services.cassandra-incremental-repair =
|
||||||
|
{ description = "Perform an incremental repair on this cassandra node.";
|
||||||
|
after = [ "cassandra.service" ];
|
||||||
|
requires = [ "cassandra.service" ];
|
||||||
|
serviceConfig =
|
||||||
|
{ User = cfg.user;
|
||||||
|
Group = cfg.group;
|
||||||
|
ExecStart =
|
||||||
|
lib.concatStringsSep " "
|
||||||
|
([ "${cfg.package}/bin/nodetool" "repair"
|
||||||
|
] ++ cfg.incrementalRepairOptions);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
systemd.timers.cassandra-incremental-repair =
|
||||||
|
mkIf (!isNull cfg.incrementalRepairInterval) {
|
||||||
|
description = "Schedule incremental repairs on Cassandra";
|
||||||
|
wantedBy = [ "timers.target" ];
|
||||||
|
timerConfig =
|
||||||
|
{ OnBootSec = cfg.incrementalRepairInterval;
|
||||||
|
OnUnitActiveSec = cfg.incrementalRepairInterval;
|
||||||
|
Persistent = true;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -12,12 +12,10 @@
|
|||||||
|
|
||||||
<para><emphasis>Maintainer:</emphasis> Austin Seipp</para>
|
<para><emphasis>Maintainer:</emphasis> Austin Seipp</para>
|
||||||
|
|
||||||
<para><emphasis>Available version(s):</emphasis> 5.1.x</para>
|
<para><emphasis>Available version(s):</emphasis> 5.1.x, 5.2.x, 6.0.x</para>
|
||||||
|
|
||||||
<para>FoundationDB (or "FDB") is a distributed, open source, high performance,
|
<para>FoundationDB (or "FDB") is an open source, distributed, transactional
|
||||||
transactional key-value store. It can store petabytes of data and deliver
|
key-value store.</para>
|
||||||
exceptional performance while maintaining consistency and ACID semantics
|
|
||||||
(serializable transactions) over a large cluster.</para>
|
|
||||||
|
|
||||||
<section><title>Configuring and basic setup</title>
|
<section><title>Configuring and basic setup</title>
|
||||||
|
|
||||||
@ -26,12 +24,12 @@ exceptional performance while maintaining consistency and ACID semantics
|
|||||||
|
|
||||||
<programlisting>
|
<programlisting>
|
||||||
services.foundationdb.enable = true;
|
services.foundationdb.enable = true;
|
||||||
services.foundationdb.package = pkgs.foundationdb51; # FoundationDB 5.1.x
|
services.foundationdb.package = pkgs.foundationdb52; # FoundationDB 5.2.x
|
||||||
</programlisting>
|
</programlisting>
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>The <option>services.foundationdb.package</option> option is required,
|
<para>The <option>services.foundationdb.package</option> option is required,
|
||||||
and must always be specified. Because FoundationDB network protocols and
|
and must always be specified. Due to the fact FoundationDB network protocols and
|
||||||
on-disk storage formats may change between (major) versions, and upgrades must
|
on-disk storage formats may change between (major) versions, and upgrades must
|
||||||
be explicitly handled by the user, you must always manually specify this
|
be explicitly handled by the user, you must always manually specify this
|
||||||
yourself so that the NixOS module will use the proper version. Note that minor,
|
yourself so that the NixOS module will use the proper version. Note that minor,
|
||||||
@ -70,6 +68,40 @@ fdb>
|
|||||||
</programlisting>
|
</programlisting>
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
|
<para>You can also write programs using the available client libraries.
|
||||||
|
For example, the following Python program can be run in order to grab the
|
||||||
|
cluster status, as a quick example. (This example uses
|
||||||
|
<command>nix-shell</command> shebang support to automatically supply the
|
||||||
|
necessary Python modules).
|
||||||
|
|
||||||
|
<programlisting>
|
||||||
|
a@link> cat fdb-status.py
|
||||||
|
#! /usr/bin/env nix-shell
|
||||||
|
#! nix-shell -i python -p python pythonPackages.foundationdb52
|
||||||
|
|
||||||
|
import fdb
|
||||||
|
import json
|
||||||
|
|
||||||
|
def main():
|
||||||
|
fdb.api_version(520)
|
||||||
|
db = fdb.open()
|
||||||
|
|
||||||
|
@fdb.transactional
|
||||||
|
def get_status(tr):
|
||||||
|
return str(tr['\xff\xff/status/json'])
|
||||||
|
|
||||||
|
obj = json.loads(get_status(db))
|
||||||
|
print('FoundationDB available: %s' % obj['client']['database_status']['available'])
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
a@link> chmod +x fdb-status.py
|
||||||
|
a@link> ./fdb-status.py
|
||||||
|
FoundationDB available: True
|
||||||
|
a@link>
|
||||||
|
</programlisting>
|
||||||
|
</para>
|
||||||
|
|
||||||
<para>FoundationDB is run under the <command>foundationdb</command> user and
|
<para>FoundationDB is run under the <command>foundationdb</command> user and
|
||||||
group by default, but this may be changed in the NixOS configuration. The
|
group by default, but this may be changed in the NixOS configuration. The
|
||||||
systemd unit <command>foundationdb.service</command> controls the
|
systemd unit <command>foundationdb.service</command> controls the
|
||||||
@ -295,7 +327,6 @@ only undergone fairly basic testing of all the available functionality.</para>
|
|||||||
individual <command>fdbserver</command> processes. Currently, all server
|
individual <command>fdbserver</command> processes. Currently, all server
|
||||||
processes inherit all the global <command>fdbmonitor</command> settings.
|
processes inherit all the global <command>fdbmonitor</command> settings.
|
||||||
</para></listitem>
|
</para></listitem>
|
||||||
<listitem><para>Python bindings are not currently installed.</para></listitem>
|
|
||||||
<listitem><para>Ruby bindings are not currently installed.</para></listitem>
|
<listitem><para>Ruby bindings are not currently installed.</para></listitem>
|
||||||
<listitem><para>Go bindings are not currently installed.</para></listitem>
|
<listitem><para>Go bindings are not currently installed.</para></listitem>
|
||||||
</itemizedlist>
|
</itemizedlist>
|
||||||
@ -306,8 +337,9 @@ only undergone fairly basic testing of all the available functionality.</para>
|
|||||||
|
|
||||||
<para>NixOS's FoundationDB module allows you to configure all of the most
|
<para>NixOS's FoundationDB module allows you to configure all of the most
|
||||||
relevant configuration options for <command>fdbmonitor</command>, matching it
|
relevant configuration options for <command>fdbmonitor</command>, matching it
|
||||||
quite closely. For a complete list of all options, check <command>man
|
quite closely. A complete list of options for the FoundationDB module may be
|
||||||
configuration.nix</command>.</para>
|
found <link linkend="opt-services.foundationdb.enable">here</link>. You should
|
||||||
|
also read the FoundationDB documentation as well.</para>
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
@ -71,6 +71,13 @@ in {
|
|||||||
BlacklistPlugins=${lib.concatStringsSep ";" cfg.blacklistPlugins}
|
BlacklistPlugins=${lib.concatStringsSep ";" cfg.blacklistPlugins}
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
"fwupd/uefi.conf" = {
|
||||||
|
source = pkgs.writeText "uefi.conf" ''
|
||||||
|
[uefi]
|
||||||
|
OverrideESPMountPoint=${config.boot.loader.efi.efiSysMountPoint}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
} // originalEtc // extraTrustedKeys;
|
} // originalEtc // extraTrustedKeys;
|
||||||
|
|
||||||
services.dbus.packages = [ pkgs.fwupd ];
|
services.dbus.packages = [ pkgs.fwupd ];
|
||||||
|
@ -47,7 +47,7 @@ in
|
|||||||
###### implementation
|
###### implementation
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
services.dysnomia.enable = true;
|
dysnomia.enable = true;
|
||||||
|
|
||||||
environment.systemPackages = [ pkgs.disnix ] ++ optional cfg.useWebServiceInterface pkgs.DisnixWebService;
|
environment.systemPackages = [ pkgs.disnix ] ++ optional cfg.useWebServiceInterface pkgs.DisnixWebService;
|
||||||
|
|
||||||
|
@ -5,6 +5,43 @@ with lib;
|
|||||||
let
|
let
|
||||||
cfg = config.services.dockerRegistry;
|
cfg = config.services.dockerRegistry;
|
||||||
|
|
||||||
|
blobCache = if cfg.enableRedisCache
|
||||||
|
then "redis"
|
||||||
|
else "inmemory";
|
||||||
|
|
||||||
|
registryConfig = {
|
||||||
|
version = "0.1";
|
||||||
|
log.fields.service = "registry";
|
||||||
|
storage = {
|
||||||
|
cache.blobdescriptor = blobCache;
|
||||||
|
filesystem.rootdirectory = cfg.storagePath;
|
||||||
|
delete.enabled = cfg.enableDelete;
|
||||||
|
};
|
||||||
|
http = {
|
||||||
|
addr = ":${builtins.toString cfg.port}";
|
||||||
|
headers.X-Content-Type-Options = ["nosniff"];
|
||||||
|
};
|
||||||
|
health.storagedriver = {
|
||||||
|
enabled = true;
|
||||||
|
interval = "10s";
|
||||||
|
threshold = 3;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
registryConfig.redis = mkIf cfg.enableRedisCache {
|
||||||
|
addr = "${cfg.redisUrl}";
|
||||||
|
password = "${cfg.redisPassword}";
|
||||||
|
db = 0;
|
||||||
|
dialtimeout = "10ms";
|
||||||
|
readtimeout = "10ms";
|
||||||
|
writetimeout = "10ms";
|
||||||
|
pool = {
|
||||||
|
maxidle = 16;
|
||||||
|
maxactive = 64;
|
||||||
|
idletimeout = "300s";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
configFile = pkgs.writeText "docker-registry-config.yml" (builtins.toJSON (recursiveUpdate registryConfig cfg.extraConfig));
|
configFile = pkgs.writeText "docker-registry-config.yml" (builtins.toJSON (recursiveUpdate registryConfig cfg.extraConfig));
|
||||||
|
|
||||||
in {
|
in {
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
with lib;
|
with lib;
|
||||||
|
|
||||||
let
|
let
|
||||||
cfg = config.services.dysnomia;
|
cfg = config.dysnomia;
|
||||||
|
|
||||||
printProperties = properties:
|
printProperties = properties:
|
||||||
concatMapStrings (propertyName:
|
concatMapStrings (propertyName:
|
||||||
@ -69,7 +69,7 @@ let
|
|||||||
in
|
in
|
||||||
{
|
{
|
||||||
options = {
|
options = {
|
||||||
services.dysnomia = {
|
dysnomia = {
|
||||||
|
|
||||||
enable = mkOption {
|
enable = mkOption {
|
||||||
type = types.bool;
|
type = types.bool;
|
||||||
@ -142,7 +142,7 @@ in
|
|||||||
|
|
||||||
environment.systemPackages = [ cfg.package ];
|
environment.systemPackages = [ cfg.package ];
|
||||||
|
|
||||||
services.dysnomia.package = pkgs.dysnomia.override (origArgs: {
|
dysnomia.package = pkgs.dysnomia.override (origArgs: {
|
||||||
enableApacheWebApplication = config.services.httpd.enable;
|
enableApacheWebApplication = config.services.httpd.enable;
|
||||||
enableAxis2WebService = config.services.tomcat.axis2.enable;
|
enableAxis2WebService = config.services.tomcat.axis2.enable;
|
||||||
enableEjabberdDump = config.services.ejabberd.enable;
|
enableEjabberdDump = config.services.ejabberd.enable;
|
||||||
@ -153,7 +153,7 @@ in
|
|||||||
enableMongoDatabase = config.services.mongodb.enable;
|
enableMongoDatabase = config.services.mongodb.enable;
|
||||||
});
|
});
|
||||||
|
|
||||||
services.dysnomia.properties = {
|
dysnomia.properties = {
|
||||||
hostname = config.networking.hostName;
|
hostname = config.networking.hostName;
|
||||||
inherit (config.nixpkgs.localSystem) system;
|
inherit (config.nixpkgs.localSystem) system;
|
||||||
|
|
||||||
@ -171,7 +171,7 @@ in
|
|||||||
}}");
|
}}");
|
||||||
};
|
};
|
||||||
|
|
||||||
services.dysnomia.containers = lib.recursiveUpdate ({
|
dysnomia.containers = lib.recursiveUpdate ({
|
||||||
process = {};
|
process = {};
|
||||||
wrapper = {};
|
wrapper = {};
|
||||||
}
|
}
|
||||||
|
@ -57,12 +57,6 @@ let
|
|||||||
--nodaemon --syslog --prefix=${name} --pidfile /run/${name}/${name}.pid ${name}
|
--nodaemon --syslog --prefix=${name} --pidfile /run/${name}/${name}.pid ${name}
|
||||||
'';
|
'';
|
||||||
|
|
||||||
mkPidFileDir = name: ''
|
|
||||||
mkdir -p /run/${name}
|
|
||||||
chmod 0700 /run/${name}
|
|
||||||
chown -R graphite:graphite /run/${name}
|
|
||||||
'';
|
|
||||||
|
|
||||||
carbonEnv = {
|
carbonEnv = {
|
||||||
PYTHONPATH = let
|
PYTHONPATH = let
|
||||||
cenv = pkgs.python.buildEnv.override {
|
cenv = pkgs.python.buildEnv.override {
|
||||||
@ -412,18 +406,16 @@ in {
|
|||||||
after = [ "network.target" ];
|
after = [ "network.target" ];
|
||||||
environment = carbonEnv;
|
environment = carbonEnv;
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
|
RuntimeDirectory = name;
|
||||||
ExecStart = "${pkgs.pythonPackages.twisted}/bin/twistd ${carbonOpts name}";
|
ExecStart = "${pkgs.pythonPackages.twisted}/bin/twistd ${carbonOpts name}";
|
||||||
User = "graphite";
|
User = "graphite";
|
||||||
Group = "graphite";
|
Group = "graphite";
|
||||||
PermissionsStartOnly = true;
|
PermissionsStartOnly = true;
|
||||||
PIDFile="/run/${name}/${name}.pid";
|
PIDFile="/run/${name}/${name}.pid";
|
||||||
};
|
};
|
||||||
preStart = mkPidFileDir name + ''
|
preStart = ''
|
||||||
|
install -dm0700 -o graphite -g graphite ${cfg.dataDir}
|
||||||
mkdir -p ${cfg.dataDir}/whisper
|
install -dm0700 -o graphite -g graphite ${cfg.dataDir}/whisper
|
||||||
chmod 0700 ${cfg.dataDir}/whisper
|
|
||||||
chown graphite:graphite ${cfg.dataDir}
|
|
||||||
chown graphite:graphite ${cfg.dataDir}/whisper
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
@ -436,12 +428,12 @@ in {
|
|||||||
after = [ "network.target" ];
|
after = [ "network.target" ];
|
||||||
environment = carbonEnv;
|
environment = carbonEnv;
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
|
RuntimeDirectory = name;
|
||||||
ExecStart = "${pkgs.pythonPackages.twisted}/bin/twistd ${carbonOpts name}";
|
ExecStart = "${pkgs.pythonPackages.twisted}/bin/twistd ${carbonOpts name}";
|
||||||
User = "graphite";
|
User = "graphite";
|
||||||
Group = "graphite";
|
Group = "graphite";
|
||||||
PIDFile="/run/${name}/${name}.pid";
|
PIDFile="/run/${name}/${name}.pid";
|
||||||
};
|
};
|
||||||
preStart = mkPidFileDir name;
|
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -452,12 +444,12 @@ in {
|
|||||||
after = [ "network.target" ];
|
after = [ "network.target" ];
|
||||||
environment = carbonEnv;
|
environment = carbonEnv;
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
|
RuntimeDirectory = name;
|
||||||
ExecStart = "${pkgs.pythonPackages.twisted}/bin/twistd ${carbonOpts name}";
|
ExecStart = "${pkgs.pythonPackages.twisted}/bin/twistd ${carbonOpts name}";
|
||||||
User = "graphite";
|
User = "graphite";
|
||||||
Group = "graphite";
|
Group = "graphite";
|
||||||
PIDFile="/run/${name}/${name}.pid";
|
PIDFile="/run/${name}/${name}.pid";
|
||||||
};
|
};
|
||||||
preStart = mkPidFileDir name;
|
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -14,6 +14,10 @@ let
|
|||||||
global = {
|
global = {
|
||||||
"plugins directory" = "${wrappedPlugins}/libexec/netdata/plugins.d ${pkgs.netdata}/libexec/netdata/plugins.d";
|
"plugins directory" = "${wrappedPlugins}/libexec/netdata/plugins.d ${pkgs.netdata}/libexec/netdata/plugins.d";
|
||||||
};
|
};
|
||||||
|
web = {
|
||||||
|
"web files owner" = "root";
|
||||||
|
"web files group" = "root";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
mkConfig = generators.toINI {} (recursiveUpdate localConfig cfg.config);
|
mkConfig = generators.toINI {} (recursiveUpdate localConfig cfg.config);
|
||||||
configFile = pkgs.writeText "netdata.conf" (if cfg.configText != null then cfg.configText else mkConfig);
|
configFile = pkgs.writeText "netdata.conf" (if cfg.configText != null then cfg.configText else mkConfig);
|
||||||
|
@ -17,6 +17,15 @@ in
|
|||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
options.services.zerotierone.port = mkOption {
|
||||||
|
default = 9993;
|
||||||
|
example = 9993;
|
||||||
|
type = types.int;
|
||||||
|
description = ''
|
||||||
|
Network port used by ZeroTier.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
options.services.zerotierone.package = mkOption {
|
options.services.zerotierone.package = mkOption {
|
||||||
default = pkgs.zerotierone;
|
default = pkgs.zerotierone;
|
||||||
defaultText = "pkgs.zerotierone";
|
defaultText = "pkgs.zerotierone";
|
||||||
@ -40,7 +49,7 @@ in
|
|||||||
touch "/var/lib/zerotier-one/networks.d/${netId}.conf"
|
touch "/var/lib/zerotier-one/networks.d/${netId}.conf"
|
||||||
'') cfg.joinNetworks);
|
'') cfg.joinNetworks);
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
ExecStart = "${cfg.package}/bin/zerotier-one";
|
ExecStart = "${cfg.package}/bin/zerotier-one -p${toString cfg.port}";
|
||||||
Restart = "always";
|
Restart = "always";
|
||||||
KillMode = "process";
|
KillMode = "process";
|
||||||
};
|
};
|
||||||
@ -49,8 +58,8 @@ in
|
|||||||
# ZeroTier does not issue DHCP leases, but some strangers might...
|
# ZeroTier does not issue DHCP leases, but some strangers might...
|
||||||
networking.dhcpcd.denyInterfaces = [ "zt*" ];
|
networking.dhcpcd.denyInterfaces = [ "zt*" ];
|
||||||
|
|
||||||
# ZeroTier receives UDP transmissions on port 9993 by default
|
# ZeroTier receives UDP transmissions
|
||||||
networking.firewall.allowedUDPPorts = [ 9993 ];
|
networking.firewall.allowedUDPPorts = [ cfg.port ];
|
||||||
|
|
||||||
environment.systemPackages = [ cfg.package ];
|
environment.systemPackages = [ cfg.package ];
|
||||||
};
|
};
|
||||||
|
@ -104,8 +104,9 @@ in
|
|||||||
systemd.services.cloud-init =
|
systemd.services.cloud-init =
|
||||||
{ description = "Initial cloud-init job (metadata service crawler)";
|
{ description = "Initial cloud-init job (metadata service crawler)";
|
||||||
wantedBy = [ "multi-user.target" ];
|
wantedBy = [ "multi-user.target" ];
|
||||||
wants = [ "local-fs.target" "cloud-init-local.service" "sshd.service" "sshd-keygen.service" ];
|
wants = [ "local-fs.target" "network-online.target" "cloud-init-local.service"
|
||||||
after = [ "local-fs.target" "network.target" "cloud-init-local.service" ];
|
"sshd.service" "sshd-keygen.service" ];
|
||||||
|
after = [ "local-fs.target" "network-online.target" "cloud-init-local.service" ];
|
||||||
before = [ "sshd.service" "sshd-keygen.service" ];
|
before = [ "sshd.service" "sshd-keygen.service" ];
|
||||||
requires = [ "network.target "];
|
requires = [ "network.target "];
|
||||||
path = path;
|
path = path;
|
||||||
@ -121,8 +122,8 @@ in
|
|||||||
systemd.services.cloud-config =
|
systemd.services.cloud-config =
|
||||||
{ description = "Apply the settings specified in cloud-config";
|
{ description = "Apply the settings specified in cloud-config";
|
||||||
wantedBy = [ "multi-user.target" ];
|
wantedBy = [ "multi-user.target" ];
|
||||||
wants = [ "network.target" ];
|
wants = [ "network-online.target" ];
|
||||||
after = [ "network.target" "syslog.target" "cloud-config.target" ];
|
after = [ "network-online.target" "syslog.target" "cloud-config.target" ];
|
||||||
|
|
||||||
path = path;
|
path = path;
|
||||||
serviceConfig =
|
serviceConfig =
|
||||||
@ -137,8 +138,8 @@ in
|
|||||||
systemd.services.cloud-final =
|
systemd.services.cloud-final =
|
||||||
{ description = "Execute cloud user/final scripts";
|
{ description = "Execute cloud user/final scripts";
|
||||||
wantedBy = [ "multi-user.target" ];
|
wantedBy = [ "multi-user.target" ];
|
||||||
wants = [ "network.target" ];
|
wants = [ "network-online.target" ];
|
||||||
after = [ "network.target" "syslog.target" "cloud-config.service" "rc-local.service" ];
|
after = [ "network-online.target" "syslog.target" "cloud-config.service" "rc-local.service" ];
|
||||||
requires = [ "cloud-config.target" ];
|
requires = [ "cloud-config.target" ];
|
||||||
path = path;
|
path = path;
|
||||||
serviceConfig =
|
serviceConfig =
|
||||||
|
@ -224,7 +224,7 @@ in
|
|||||||
# Update the start menu for each user that has `isNormalUser` set.
|
# Update the start menu for each user that has `isNormalUser` set.
|
||||||
system.activationScripts.plasmaSetup = stringAfter [ "users" "groups" ]
|
system.activationScripts.plasmaSetup = stringAfter [ "users" "groups" ]
|
||||||
(concatStringsSep "\n"
|
(concatStringsSep "\n"
|
||||||
(mapAttrsToList (name: value: "${pkgs.su}/bin/su ${name} -c kbuildsycoca5")
|
(mapAttrsToList (name: value: "${pkgs.su}/bin/su ${name} -c ${pkgs.libsForQt5.kservice}/bin/kbuildsycoca5")
|
||||||
(filterAttrs (n: v: v.isNormalUser) config.users.users)));
|
(filterAttrs (n: v: v.isNormalUser) config.users.users)));
|
||||||
})
|
})
|
||||||
];
|
];
|
||||||
|
@ -23,7 +23,7 @@ let
|
|||||||
makeWrapper ${pkgs.lightdm_gtk_greeter}/sbin/lightdm-gtk-greeter \
|
makeWrapper ${pkgs.lightdm_gtk_greeter}/sbin/lightdm-gtk-greeter \
|
||||||
$out/greeter \
|
$out/greeter \
|
||||||
--prefix PATH : "${pkgs.glibc.bin}/bin" \
|
--prefix PATH : "${pkgs.glibc.bin}/bin" \
|
||||||
--set GDK_PIXBUF_MODULE_FILE "${pkgs.gdk_pixbuf.out}/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache" \
|
--set GDK_PIXBUF_MODULE_FILE "${pkgs.librsvg.out}/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache" \
|
||||||
--set GTK_PATH "${theme}:${pkgs.gtk3.out}" \
|
--set GTK_PATH "${theme}:${pkgs.gtk3.out}" \
|
||||||
--set GTK_EXE_PREFIX "${theme}" \
|
--set GTK_EXE_PREFIX "${theme}" \
|
||||||
--set GTK_DATA_PREFIX "${theme}" \
|
--set GTK_DATA_PREFIX "${theme}" \
|
||||||
|
@ -43,6 +43,7 @@ def write_loader_conf(profile, generation):
|
|||||||
f.write("default nixos-generation-%d\n" % (generation))
|
f.write("default nixos-generation-%d\n" % (generation))
|
||||||
if not @editor@:
|
if not @editor@:
|
||||||
f.write("editor 0");
|
f.write("editor 0");
|
||||||
|
f.write("console-mode @consoleMode@\n");
|
||||||
os.rename("@efiSysMountPoint@/loader/loader.conf.tmp", "@efiSysMountPoint@/loader/loader.conf")
|
os.rename("@efiSysMountPoint@/loader/loader.conf.tmp", "@efiSysMountPoint@/loader/loader.conf")
|
||||||
|
|
||||||
def profile_path(profile, generation, name):
|
def profile_path(profile, generation, name):
|
||||||
|
@ -22,6 +22,8 @@ let
|
|||||||
|
|
||||||
editor = if cfg.editor then "True" else "False";
|
editor = if cfg.editor then "True" else "False";
|
||||||
|
|
||||||
|
inherit (cfg) consoleMode;
|
||||||
|
|
||||||
inherit (efi) efiSysMountPoint canTouchEfiVariables;
|
inherit (efi) efiSysMountPoint canTouchEfiVariables;
|
||||||
};
|
};
|
||||||
in {
|
in {
|
||||||
@ -52,6 +54,38 @@ in {
|
|||||||
compatibility.
|
compatibility.
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
consoleMode = mkOption {
|
||||||
|
default = "keep";
|
||||||
|
|
||||||
|
type = types.enum [ "0" "1" "2" "auto" "max" "keep" ];
|
||||||
|
|
||||||
|
description = ''
|
||||||
|
The resolution of the console. The following values are valid:
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem><para>
|
||||||
|
<literal>"0"</literal>: Standard UEFI 80x25 mode
|
||||||
|
</para></listitem>
|
||||||
|
<listitem><para>
|
||||||
|
<literal>"1"</literal>: 80x50 mode, not supported by all devices
|
||||||
|
</para></listitem>
|
||||||
|
<listitem><para>
|
||||||
|
<literal>"2"</literal>: The first non-standard mode provided by the device firmware, if any
|
||||||
|
</para></listitem>
|
||||||
|
<listitem><para>
|
||||||
|
<literal>"auto"</literal>: Pick a suitable mode automatically using heuristics
|
||||||
|
</para></listitem>
|
||||||
|
<listitem><para>
|
||||||
|
<literal>"max"</literal>: Pick the highest-numbered available mode
|
||||||
|
</para></listitem>
|
||||||
|
<listitem><para>
|
||||||
|
<literal>"keep"</literal>: Keep the mode selected by firmware (the default)
|
||||||
|
</para></listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
'';
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
|
@ -5,61 +5,171 @@ with lib;
|
|||||||
let
|
let
|
||||||
luks = config.boot.initrd.luks;
|
luks = config.boot.initrd.luks;
|
||||||
|
|
||||||
openCommand = name': { name, device, header, keyFile, keyFileSize, allowDiscards, yubikey, fallbackToPassword, ... }: assert name' == name; ''
|
commonFunctions = ''
|
||||||
|
die() {
|
||||||
|
echo "$@" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
# Wait for a target (e.g. device, keyFile, header, ...) to appear.
|
|
||||||
wait_target() {
|
wait_target() {
|
||||||
local name="$1"
|
local name="$1"
|
||||||
local target="$2"
|
local target="$2"
|
||||||
|
local secs="''${3:-10}"
|
||||||
|
local desc="''${4:-$name $target to appear}"
|
||||||
|
|
||||||
if [ ! -e $target ]; then
|
if [ ! -e $target ]; then
|
||||||
echo -n "Waiting 10 seconds for $name $target to appear"
|
echo -n "Waiting $secs seconds for $desc..."
|
||||||
local success=false;
|
local success=false;
|
||||||
for try in $(seq 10); do
|
for try in $(seq $secs); do
|
||||||
echo -n "."
|
echo -n "."
|
||||||
sleep 1
|
sleep 1
|
||||||
if [ -e $target ]; then success=true break; fi
|
if [ -e $target ]; then
|
||||||
|
success=true
|
||||||
|
break
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
if [ $success = true ]; then
|
if [ $success == true ]; then
|
||||||
echo " - success";
|
echo " - success";
|
||||||
|
return 0
|
||||||
else
|
else
|
||||||
echo " - failure";
|
echo " - failure";
|
||||||
|
return 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wait_yubikey() {
|
||||||
|
local secs="''${1:-10}"
|
||||||
|
|
||||||
|
ykinfo -v 1>/dev/null 2>&1
|
||||||
|
if [ $? != 0 ]; then
|
||||||
|
echo -n "Waiting $secs seconds for Yubikey to appear..."
|
||||||
|
local success=false
|
||||||
|
for try in $(seq $secs); do
|
||||||
|
echo -n .
|
||||||
|
sleep 1
|
||||||
|
ykinfo -v 1>/dev/null 2>&1
|
||||||
|
if [ $? == 0 ]; then
|
||||||
|
success=true
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ $success == true ]; then
|
||||||
|
echo " - success";
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
echo " - failure";
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
|
||||||
|
preCommands = ''
|
||||||
|
# A place to store crypto things
|
||||||
|
|
||||||
|
# A ramfs is used here to ensure that the file used to update
|
||||||
|
# the key slot with cryptsetup will never get swapped out.
|
||||||
|
# Warning: Do NOT replace with tmpfs!
|
||||||
|
mkdir -p /crypt-ramfs
|
||||||
|
mount -t ramfs none /crypt-ramfs
|
||||||
|
|
||||||
|
# For Yubikey salt storage
|
||||||
|
mkdir -p /crypt-storage
|
||||||
|
|
||||||
|
# Disable all input echo for the whole stage. We could use read -s
|
||||||
|
# instead but that would ocasionally leak characters between read
|
||||||
|
# invocations.
|
||||||
|
stty -echo
|
||||||
|
'';
|
||||||
|
|
||||||
|
postCommands = ''
|
||||||
|
stty echo
|
||||||
|
umount /crypt-storage 2>/dev/null
|
||||||
|
umount /crypt-ramfs 2>/dev/null
|
||||||
|
'';
|
||||||
|
|
||||||
|
openCommand = name': { name, device, header, keyFile, keyFileSize, keyFileOffset, allowDiscards, yubikey, fallbackToPassword, ... }: assert name' == name;
|
||||||
|
let
|
||||||
|
csopen = "cryptsetup luksOpen ${device} ${name} ${optionalString allowDiscards "--allow-discards"} ${optionalString (header != null) "--header=${header}"}";
|
||||||
|
cschange = "cryptsetup luksChangeKey ${device} ${optionalString (header != null) "--header=${header}"}";
|
||||||
|
in ''
|
||||||
# Wait for luksRoot (and optionally keyFile and/or header) to appear, e.g.
|
# Wait for luksRoot (and optionally keyFile and/or header) to appear, e.g.
|
||||||
# if on a USB drive.
|
# if on a USB drive.
|
||||||
wait_target "device" ${device}
|
wait_target "device" ${device} || die "${device} is unavailable"
|
||||||
|
|
||||||
${optionalString (keyFile != null) ''
|
|
||||||
wait_target "key file" ${keyFile}
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString (header != null) ''
|
${optionalString (header != null) ''
|
||||||
wait_target "header" ${header}
|
wait_target "header" ${header} || die "${header} is unavailable"
|
||||||
''}
|
''}
|
||||||
|
|
||||||
open_normally() {
|
do_open_passphrase() {
|
||||||
echo luksOpen ${device} ${name} ${optionalString allowDiscards "--allow-discards"} \
|
local passphrase
|
||||||
${optionalString (header != null) "--header=${header}"} \
|
|
||||||
> /.luksopen_args
|
while true; do
|
||||||
${optionalString (keyFile != null) ''
|
echo -n "Passphrase for ${device}: "
|
||||||
${optionalString fallbackToPassword "if [ -e ${keyFile} ]; then"}
|
passphrase=
|
||||||
echo " --key-file=${keyFile} ${optionalString (keyFileSize != null) "--keyfile-size=${toString keyFileSize}"}" \
|
while true; do
|
||||||
>> /.luksopen_args
|
if [ -e /crypt-ramfs/passphrase ]; then
|
||||||
${optionalString fallbackToPassword ''
|
echo "reused"
|
||||||
else
|
passphrase=$(cat /crypt-ramfs/passphrase)
|
||||||
echo "keyfile ${keyFile} not found -- fallback to interactive unlocking"
|
break
|
||||||
fi
|
else
|
||||||
''}
|
# ask cryptsetup-askpass
|
||||||
''}
|
echo -n "${device}" > /crypt-ramfs/device
|
||||||
cryptsetup-askpass
|
|
||||||
rm /.luksopen_args
|
# and try reading it from /dev/console with a timeout
|
||||||
|
IFS= read -t 1 -r passphrase
|
||||||
|
if [ -n "$passphrase" ]; then
|
||||||
|
${if luks.reusePassphrases then ''
|
||||||
|
# remember it for the next device
|
||||||
|
echo -n "$passphrase" > /crypt-ramfs/passphrase
|
||||||
|
'' else ''
|
||||||
|
# Don't save it to ramfs. We are very paranoid
|
||||||
|
''}
|
||||||
|
echo
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo -n "Verifiying passphrase for ${device}..."
|
||||||
|
echo -n "$passphrase" | ${csopen} --key-file=-
|
||||||
|
if [ $? == 0 ]; then
|
||||||
|
echo " - success"
|
||||||
|
${if luks.reusePassphrases then ''
|
||||||
|
# we don't rm here because we might reuse it for the next device
|
||||||
|
'' else ''
|
||||||
|
rm -f /crypt-ramfs/passphrase
|
||||||
|
''}
|
||||||
|
break
|
||||||
|
else
|
||||||
|
echo " - failure"
|
||||||
|
# ask for a different one
|
||||||
|
rm -f /crypt-ramfs/passphrase
|
||||||
|
fi
|
||||||
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
${optionalString (luks.yubikeySupport && (yubikey != null)) ''
|
# LUKS
|
||||||
|
open_normally() {
|
||||||
|
${if (keyFile != null) then ''
|
||||||
|
if wait_target "key file" ${keyFile}; then
|
||||||
|
${csopen} --key-file=${keyFile} \
|
||||||
|
${optionalString (keyFileSize != null) "--keyfile-size=${toString keyFileSize}"} \
|
||||||
|
${optionalString (keyFileOffset != null) "--keyfile-offset=${toString keyFileOffset}"}
|
||||||
|
else
|
||||||
|
${if fallbackToPassword then "echo" else "die"} "${keyFile} is unavailable"
|
||||||
|
echo " - failing back to interactive password prompt"
|
||||||
|
do_open_passphrase
|
||||||
|
fi
|
||||||
|
'' else ''
|
||||||
|
do_open_passphrase
|
||||||
|
''}
|
||||||
|
}
|
||||||
|
|
||||||
|
${if luks.yubikeySupport && (yubikey != null) then ''
|
||||||
|
# Yubikey
|
||||||
rbtohex() {
|
rbtohex() {
|
||||||
( od -An -vtx1 | tr -d ' \n' )
|
( od -An -vtx1 | tr -d ' \n' )
|
||||||
}
|
}
|
||||||
@ -68,8 +178,7 @@ let
|
|||||||
( tr '[:lower:]' '[:upper:]' | sed -e 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf )
|
( tr '[:lower:]' '[:upper:]' | sed -e 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf )
|
||||||
}
|
}
|
||||||
|
|
||||||
open_yubikey() {
|
do_open_yubikey() {
|
||||||
|
|
||||||
# Make all of these local to this function
|
# Make all of these local to this function
|
||||||
# to prevent their values being leaked
|
# to prevent their values being leaked
|
||||||
local salt
|
local salt
|
||||||
@ -85,19 +194,18 @@ let
|
|||||||
local new_response
|
local new_response
|
||||||
local new_k_luks
|
local new_k_luks
|
||||||
|
|
||||||
mkdir -p ${yubikey.storage.mountPoint}
|
mount -t ${yubikey.storage.fsType} ${yubikey.storage.device} /crypt-storage || \
|
||||||
mount -t ${yubikey.storage.fsType} ${toString yubikey.storage.device} ${yubikey.storage.mountPoint}
|
die "Failed to mount Yubikey salt storage device"
|
||||||
|
|
||||||
salt="$(cat ${yubikey.storage.mountPoint}${yubikey.storage.path} | sed -n 1p | tr -d '\n')"
|
salt="$(cat /crypt-storage${yubikey.storage.path} | sed -n 1p | tr -d '\n')"
|
||||||
iterations="$(cat ${yubikey.storage.mountPoint}${yubikey.storage.path} | sed -n 2p | tr -d '\n')"
|
iterations="$(cat /crypt-storage${yubikey.storage.path} | sed -n 2p | tr -d '\n')"
|
||||||
challenge="$(echo -n $salt | openssl-wrap dgst -binary -sha512 | rbtohex)"
|
challenge="$(echo -n $salt | openssl-wrap dgst -binary -sha512 | rbtohex)"
|
||||||
response="$(ykchalresp -${toString yubikey.slot} -x $challenge 2>/dev/null)"
|
response="$(ykchalresp -${toString yubikey.slot} -x $challenge 2>/dev/null)"
|
||||||
|
|
||||||
for try in $(seq 3); do
|
for try in $(seq 3); do
|
||||||
|
|
||||||
${optionalString yubikey.twoFactor ''
|
${optionalString yubikey.twoFactor ''
|
||||||
echo -n "Enter two-factor passphrase: "
|
echo -n "Enter two-factor passphrase: "
|
||||||
read -s k_user
|
read -r k_user
|
||||||
echo
|
echo
|
||||||
''}
|
''}
|
||||||
|
|
||||||
@ -107,9 +215,9 @@ let
|
|||||||
k_luks="$(echo | pbkdf2-sha512 ${toString yubikey.keyLength} $iterations $response | rbtohex)"
|
k_luks="$(echo | pbkdf2-sha512 ${toString yubikey.keyLength} $iterations $response | rbtohex)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo -n "$k_luks" | hextorb | cryptsetup luksOpen ${device} ${name} ${optionalString allowDiscards "--allow-discards"} --key-file=-
|
echo -n "$k_luks" | hextorb | ${csopen} --key-file=-
|
||||||
|
|
||||||
if [ $? == "0" ]; then
|
if [ $? == 0 ]; then
|
||||||
opened=true
|
opened=true
|
||||||
break
|
break
|
||||||
else
|
else
|
||||||
@ -118,11 +226,7 @@ let
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
if [ "$opened" == false ]; then
|
[ "$opened" == false ] && die "Maximum authentication errors reached"
|
||||||
umount ${yubikey.storage.mountPoint}
|
|
||||||
echo "Maximum authentication errors reached"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo -n "Gathering entropy for new salt (please enter random keys to generate entropy if this blocks for long)..."
|
echo -n "Gathering entropy for new salt (please enter random keys to generate entropy if this blocks for long)..."
|
||||||
for i in $(seq ${toString yubikey.saltLength}); do
|
for i in $(seq ${toString yubikey.saltLength}); do
|
||||||
@ -147,69 +251,52 @@ let
|
|||||||
new_k_luks="$(echo | pbkdf2-sha512 ${toString yubikey.keyLength} $new_iterations $new_response | rbtohex)"
|
new_k_luks="$(echo | pbkdf2-sha512 ${toString yubikey.keyLength} $new_iterations $new_response | rbtohex)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
mkdir -p ${yubikey.ramfsMountPoint}
|
echo -n "$new_k_luks" | hextorb > /crypt-ramfs/new_key
|
||||||
# A ramfs is used here to ensure that the file used to update
|
echo -n "$k_luks" | hextorb | ${cschange} --key-file=- /crypt-ramfs/new_key
|
||||||
# the key slot with cryptsetup will never get swapped out.
|
|
||||||
# Warning: Do NOT replace with tmpfs!
|
|
||||||
mount -t ramfs none ${yubikey.ramfsMountPoint}
|
|
||||||
|
|
||||||
echo -n "$new_k_luks" | hextorb > ${yubikey.ramfsMountPoint}/new_key
|
if [ $? == 0 ]; then
|
||||||
echo -n "$k_luks" | hextorb | cryptsetup luksChangeKey ${device} --key-file=- ${yubikey.ramfsMountPoint}/new_key
|
echo -ne "$new_salt\n$new_iterations" > /crypt-storage${yubikey.storage.path}
|
||||||
|
|
||||||
if [ $? == "0" ]; then
|
|
||||||
echo -ne "$new_salt\n$new_iterations" > ${yubikey.storage.mountPoint}${yubikey.storage.path}
|
|
||||||
else
|
else
|
||||||
echo "Warning: Could not update LUKS key, current challenge persists!"
|
echo "Warning: Could not update LUKS key, current challenge persists!"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
rm -f ${yubikey.ramfsMountPoint}/new_key
|
rm -f /crypt-ramfs/new_key
|
||||||
umount ${yubikey.ramfsMountPoint}
|
umount /crypt-storage
|
||||||
rm -rf ${yubikey.ramfsMountPoint}
|
|
||||||
|
|
||||||
umount ${yubikey.storage.mountPoint}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
${optionalString (yubikey.gracePeriod > 0) ''
|
open_yubikey() {
|
||||||
echo -n "Waiting ${toString yubikey.gracePeriod} seconds as grace..."
|
if wait_yubikey ${toString yubikey.gracePeriod}; then
|
||||||
for i in $(seq ${toString yubikey.gracePeriod}); do
|
do_open_yubikey
|
||||||
sleep 1
|
else
|
||||||
echo -n .
|
echo "No yubikey found, falling back to non-yubikey open procedure"
|
||||||
done
|
open_normally
|
||||||
echo "ok"
|
fi
|
||||||
''}
|
}
|
||||||
|
|
||||||
yubikey_missing=true
|
open_yubikey
|
||||||
ykinfo -v 1>/dev/null 2>&1
|
'' else ''
|
||||||
if [ $? != "0" ]; then
|
|
||||||
echo -n "waiting 10 seconds for yubikey to appear..."
|
|
||||||
for try in $(seq 10); do
|
|
||||||
sleep 1
|
|
||||||
ykinfo -v 1>/dev/null 2>&1
|
|
||||||
if [ $? == "0" ]; then
|
|
||||||
yubikey_missing=false
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
echo -n .
|
|
||||||
done
|
|
||||||
echo "ok"
|
|
||||||
else
|
|
||||||
yubikey_missing=false
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$yubikey_missing" == true ]; then
|
|
||||||
echo "no yubikey found, falling back to non-yubikey open procedure"
|
|
||||||
open_normally
|
|
||||||
else
|
|
||||||
open_yubikey
|
|
||||||
fi
|
|
||||||
''}
|
|
||||||
|
|
||||||
# open luksRoot and scan for logical volumes
|
|
||||||
${optionalString ((!luks.yubikeySupport) || (yubikey == null)) ''
|
|
||||||
open_normally
|
open_normally
|
||||||
''}
|
''}
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
askPass = pkgs.writeScriptBin "cryptsetup-askpass" ''
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
${commonFunctions}
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
wait_target "luks" /crypt-ramfs/device 10 "LUKS to request a passphrase" || die "Passphrase is not requested now"
|
||||||
|
device=$(cat /crypt-ramfs/device)
|
||||||
|
|
||||||
|
echo -n "Passphrase for $device: "
|
||||||
|
IFS= read -rs passphrase
|
||||||
|
echo
|
||||||
|
|
||||||
|
rm /crypt-ramfs/device
|
||||||
|
echo -n "$passphrase" > /crypt-ramfs/passphrase
|
||||||
|
done
|
||||||
|
'';
|
||||||
|
|
||||||
preLVM = filterAttrs (n: v: v.preLVM) luks.devices;
|
preLVM = filterAttrs (n: v: v.preLVM) luks.devices;
|
||||||
postLVM = filterAttrs (n: v: !v.preLVM) luks.devices;
|
postLVM = filterAttrs (n: v: !v.preLVM) luks.devices;
|
||||||
|
|
||||||
@ -255,6 +342,22 @@ in
|
|||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
boot.initrd.luks.reusePassphrases = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
description = ''
|
||||||
|
When opening a new LUKS device try reusing last successful
|
||||||
|
passphrase.
|
||||||
|
|
||||||
|
Useful for mounting a number of devices that use the same
|
||||||
|
passphrase without retyping it several times.
|
||||||
|
|
||||||
|
Such setup can be useful if you use <command>cryptsetup
|
||||||
|
luksSuspend</command>. Different LUKS devices will still have
|
||||||
|
different master keys even when using the same passphrase.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
boot.initrd.luks.devices = mkOption {
|
boot.initrd.luks.devices = mkOption {
|
||||||
default = { };
|
default = { };
|
||||||
example = { "luksroot".device = "/dev/disk/by-uuid/430e9eff-d852-4f68-aa3b-2fa3599ebe08"; };
|
example = { "luksroot".device = "/dev/disk/by-uuid/430e9eff-d852-4f68-aa3b-2fa3599ebe08"; };
|
||||||
@ -316,6 +419,19 @@ in
|
|||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
keyFileOffset = mkOption {
|
||||||
|
default = null;
|
||||||
|
example = 4096;
|
||||||
|
type = types.nullOr types.int;
|
||||||
|
description = ''
|
||||||
|
The offset of the key file. Use this in combination with
|
||||||
|
<literal>keyFileSize</literal> to use part of a file as key file
|
||||||
|
(often the case if a raw device or partition is used as a key file).
|
||||||
|
If not specified, the key begins at the first byte of
|
||||||
|
<literal>keyFile</literal>.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
# FIXME: get rid of this option.
|
# FIXME: get rid of this option.
|
||||||
preLVM = mkOption {
|
preLVM = mkOption {
|
||||||
default = true;
|
default = true;
|
||||||
@ -383,15 +499,9 @@ in
|
|||||||
};
|
};
|
||||||
|
|
||||||
gracePeriod = mkOption {
|
gracePeriod = mkOption {
|
||||||
default = 2;
|
default = 10;
|
||||||
type = types.int;
|
type = types.int;
|
||||||
description = "Time in seconds to wait before attempting to find the Yubikey.";
|
description = "Time in seconds to wait for the Yubikey.";
|
||||||
};
|
|
||||||
|
|
||||||
ramfsMountPoint = mkOption {
|
|
||||||
default = "/crypt-ramfs";
|
|
||||||
type = types.str;
|
|
||||||
description = "Path where the ramfs used to update the LUKS key will be mounted during early boot.";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* TODO: Add to the documentation of the current module:
|
/* TODO: Add to the documentation of the current module:
|
||||||
@ -414,12 +524,6 @@ in
|
|||||||
description = "The filesystem of the unencrypted device.";
|
description = "The filesystem of the unencrypted device.";
|
||||||
};
|
};
|
||||||
|
|
||||||
mountPoint = mkOption {
|
|
||||||
default = "/crypt-storage";
|
|
||||||
type = types.str;
|
|
||||||
description = "Path where the unencrypted device will be mounted during early boot.";
|
|
||||||
};
|
|
||||||
|
|
||||||
path = mkOption {
|
path = mkOption {
|
||||||
default = "/crypt-storage/default";
|
default = "/crypt-storage/default";
|
||||||
type = types.str;
|
type = types.str;
|
||||||
@ -432,8 +536,8 @@ in
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
};
|
||||||
}; }));
|
}));
|
||||||
};
|
};
|
||||||
|
|
||||||
boot.initrd.luks.yubikeySupport = mkOption {
|
boot.initrd.luks.yubikeySupport = mkOption {
|
||||||
@ -463,18 +567,8 @@ in
|
|||||||
# copy the cryptsetup binary and it's dependencies
|
# copy the cryptsetup binary and it's dependencies
|
||||||
boot.initrd.extraUtilsCommands = ''
|
boot.initrd.extraUtilsCommands = ''
|
||||||
copy_bin_and_libs ${pkgs.cryptsetup}/bin/cryptsetup
|
copy_bin_and_libs ${pkgs.cryptsetup}/bin/cryptsetup
|
||||||
|
copy_bin_and_libs ${askPass}/bin/cryptsetup-askpass
|
||||||
cat > $out/bin/cryptsetup-askpass <<EOF
|
sed -i s,/bin/sh,$out/bin/sh, $out/bin/cryptsetup-askpass
|
||||||
#!$out/bin/sh -e
|
|
||||||
if [ -e /.luksopen_args ]; then
|
|
||||||
cryptsetup \$(cat /.luksopen_args)
|
|
||||||
killall -q cryptsetup
|
|
||||||
else
|
|
||||||
echo "Passphrase is not requested now"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
EOF
|
|
||||||
chmod +x $out/bin/cryptsetup-askpass
|
|
||||||
|
|
||||||
${optionalString luks.yubikeySupport ''
|
${optionalString luks.yubikeySupport ''
|
||||||
copy_bin_and_libs ${pkgs.yubikey-personalization}/bin/ykchalresp
|
copy_bin_and_libs ${pkgs.yubikey-personalization}/bin/ykchalresp
|
||||||
@ -506,8 +600,9 @@ in
|
|||||||
''}
|
''}
|
||||||
'';
|
'';
|
||||||
|
|
||||||
boot.initrd.preLVMCommands = concatStrings (mapAttrsToList openCommand preLVM);
|
boot.initrd.preFailCommands = postCommands;
|
||||||
boot.initrd.postDeviceCommands = concatStrings (mapAttrsToList openCommand postLVM);
|
boot.initrd.preLVMCommands = commonFunctions + preCommands + concatStrings (mapAttrsToList openCommand preLVM) + postCommands;
|
||||||
|
boot.initrd.postDeviceCommands = commonFunctions + preCommands + concatStrings (mapAttrsToList openCommand postLVM) + postCommands;
|
||||||
|
|
||||||
environment.systemPackages = [ pkgs.cryptsetup ];
|
environment.systemPackages = [ pkgs.cryptsetup ];
|
||||||
};
|
};
|
||||||
|
@ -248,6 +248,14 @@ let
|
|||||||
|
|
||||||
isExecutable = true;
|
isExecutable = true;
|
||||||
|
|
||||||
|
postInstall = ''
|
||||||
|
echo checking syntax
|
||||||
|
# check both with bash
|
||||||
|
${pkgs.bash}/bin/sh -n $target
|
||||||
|
# and with ash shell, just in case
|
||||||
|
${extraUtils}/bin/ash -n $target
|
||||||
|
'';
|
||||||
|
|
||||||
inherit udevRules extraUtils modulesClosure;
|
inherit udevRules extraUtils modulesClosure;
|
||||||
|
|
||||||
inherit (config.boot) resumeDevice;
|
inherit (config.boot) resumeDevice;
|
||||||
|
@ -190,9 +190,8 @@ let
|
|||||||
];
|
];
|
||||||
|
|
||||||
makeJobScript = name: text:
|
makeJobScript = name: text:
|
||||||
let mkScriptName = s: (replaceChars [ "\\" ] [ "-" ] (shellEscape s) );
|
let mkScriptName = s: "unit-script-" + (replaceChars [ "\\" "@" ] [ "-" "_" ] (shellEscape s) );
|
||||||
x = pkgs.writeTextFile { name = "unit-script"; executable = true; destination = "/bin/${mkScriptName name}"; inherit text; };
|
in pkgs.writeTextFile { name = mkScriptName name; executable = true; inherit text; };
|
||||||
in "${x}/bin/${mkScriptName name}";
|
|
||||||
|
|
||||||
unitConfig = { config, ... }: {
|
unitConfig = { config, ... }: {
|
||||||
config = {
|
config = {
|
||||||
|
@ -55,6 +55,15 @@ with lib;
|
|||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
device = mkOption {
|
||||||
|
default = "TPPS/2 IBM TrackPoint";
|
||||||
|
type = types.str;
|
||||||
|
description = ''
|
||||||
|
The device name of the trackpoint. You can check with xinput.
|
||||||
|
Some newer devices (example x1c6) use "TPPS/2 Elan TrackPoint".
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
@ -68,12 +77,12 @@ with lib;
|
|||||||
(mkIf cfg.enable {
|
(mkIf cfg.enable {
|
||||||
services.udev.extraRules =
|
services.udev.extraRules =
|
||||||
''
|
''
|
||||||
ACTION=="add|change", SUBSYSTEM=="input", ATTR{name}=="TPPS/2 IBM TrackPoint", ATTR{device/speed}="${toString cfg.speed}", ATTR{device/sensitivity}="${toString cfg.sensitivity}"
|
ACTION=="add|change", SUBSYSTEM=="input", ATTR{name}=="${cfg.device}", ATTR{device/speed}="${toString cfg.speed}", ATTR{device/sensitivity}="${toString cfg.sensitivity}"
|
||||||
'';
|
'';
|
||||||
|
|
||||||
system.activationScripts.trackpoint =
|
system.activationScripts.trackpoint =
|
||||||
''
|
''
|
||||||
${config.systemd.package}/bin/udevadm trigger --attr-match=name="TPPS/2 IBM TrackPoint"
|
${config.systemd.package}/bin/udevadm trigger --attr-match=name="${cfg.device}"
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -81,7 +90,7 @@ with lib;
|
|||||||
services.xserver.inputClassSections =
|
services.xserver.inputClassSections =
|
||||||
[''
|
[''
|
||||||
Identifier "Trackpoint Wheel Emulation"
|
Identifier "Trackpoint Wheel Emulation"
|
||||||
MatchProduct "${if cfg.fakeButtons then "PS/2 Generic Mouse" else "ETPS/2 Elantech TrackPoint|Elantech PS/2 TrackPoint|TPPS/2 IBM TrackPoint|DualPoint Stick|Synaptics Inc. Composite TouchPad / TrackPoint|ThinkPad USB Keyboard with TrackPoint|USB Trackpoint pointing device|Composite TouchPad / TrackPoint"}"
|
MatchProduct "${if cfg.fakeButtons then "PS/2 Generic Mouse" else "ETPS/2 Elantech TrackPoint|Elantech PS/2 TrackPoint|TPPS/2 IBM TrackPoint|DualPoint Stick|Synaptics Inc. Composite TouchPad / TrackPoint|ThinkPad USB Keyboard with TrackPoint|USB Trackpoint pointing device|Composite TouchPad / TrackPoint|${cfg.device}"}"
|
||||||
MatchDevicePath "/dev/input/event*"
|
MatchDevicePath "/dev/input/event*"
|
||||||
Option "EmulateWheel" "true"
|
Option "EmulateWheel" "true"
|
||||||
Option "EmulateWheelButton" "2"
|
Option "EmulateWheelButton" "2"
|
||||||
|
@ -277,6 +277,7 @@ in rec {
|
|||||||
tests.docker-tools = callTestOnMatchingSystems ["x86_64-linux"] tests/docker-tools.nix {};
|
tests.docker-tools = callTestOnMatchingSystems ["x86_64-linux"] tests/docker-tools.nix {};
|
||||||
tests.docker-tools-overlay = callTestOnMatchingSystems ["x86_64-linux"] tests/docker-tools-overlay.nix {};
|
tests.docker-tools-overlay = callTestOnMatchingSystems ["x86_64-linux"] tests/docker-tools-overlay.nix {};
|
||||||
tests.docker-edge = callTestOnMatchingSystems ["x86_64-linux"] tests/docker-edge.nix {};
|
tests.docker-edge = callTestOnMatchingSystems ["x86_64-linux"] tests/docker-edge.nix {};
|
||||||
|
tests.docker-registry = callTest tests/docker-registry.nix {};
|
||||||
tests.dovecot = callTest tests/dovecot.nix {};
|
tests.dovecot = callTest tests/dovecot.nix {};
|
||||||
tests.dnscrypt-proxy = callTestOnMatchingSystems ["x86_64-linux"] tests/dnscrypt-proxy.nix {};
|
tests.dnscrypt-proxy = callTestOnMatchingSystems ["x86_64-linux"] tests/dnscrypt-proxy.nix {};
|
||||||
tests.ecryptfs = callTest tests/ecryptfs.nix {};
|
tests.ecryptfs = callTest tests/ecryptfs.nix {};
|
||||||
|
@ -12,7 +12,9 @@ let
|
|||||||
'';
|
'';
|
||||||
});
|
});
|
||||||
|
|
||||||
pythonPackages = (super.python.override {
|
# Override certifi so that it accepts fake certificate for Let's Encrypt
|
||||||
|
# Need to override the attribute used by simp_le, which is python3Packages
|
||||||
|
python3Packages = (super.python3.override {
|
||||||
packageOverrides = lib.const (pysuper: {
|
packageOverrides = lib.const (pysuper: {
|
||||||
certifi = pysuper.certifi.overridePythonAttrs (attrs: {
|
certifi = pysuper.certifi.overridePythonAttrs (attrs: {
|
||||||
postPatch = (attrs.postPatch or "") + ''
|
postPatch = (attrs.postPatch or "") + ''
|
||||||
|
@ -1,68 +1,71 @@
|
|||||||
import ./make-test.nix ({ pkgs, ...}:
|
import ./make-test.nix ({ pkgs, ...}:
|
||||||
let
|
let
|
||||||
user = "cassandra";
|
# Change this to test a different version of Cassandra:
|
||||||
nodeCfg = nodes: selfIP: cassandraOpts:
|
testPackage = pkgs.cassandra;
|
||||||
{
|
cassandraCfg =
|
||||||
services.cassandra = {
|
{ enable = true;
|
||||||
enable = true;
|
listenAddress = null;
|
||||||
listenAddress = selfIP;
|
listenInterface = "eth1";
|
||||||
rpcAddress = "0.0.0.0";
|
rpcAddress = null;
|
||||||
seeds = [ "192.168.1.1" ];
|
rpcInterface = "eth1";
|
||||||
package = pkgs.cassandra_2_0;
|
extraConfig =
|
||||||
jre = pkgs.openjdk;
|
{ start_native_transport = true;
|
||||||
clusterName = "ci ahoy";
|
seed_provider =
|
||||||
authenticator = "PasswordAuthenticator";
|
[{ class_name = "org.apache.cassandra.locator.SimpleSeedProvider";
|
||||||
authorizer = "CassandraAuthorizer";
|
parameters = [ { seeds = "cass0"; } ];
|
||||||
user = user;
|
}];
|
||||||
} // cassandraOpts;
|
};
|
||||||
nixpkgs.config.allowUnfree = true;
|
package = testPackage;
|
||||||
|
};
|
||||||
|
nodeCfg = extra: {pkgs, config, ...}:
|
||||||
|
{ environment.systemPackages = [ testPackage ];
|
||||||
|
networking.firewall.enable = false;
|
||||||
|
services.cassandra = cassandraCfg // extra;
|
||||||
virtualisation.memorySize = 1024;
|
virtualisation.memorySize = 1024;
|
||||||
};
|
};
|
||||||
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
name = "cassandra-ci";
|
name = "cassandra-ci";
|
||||||
|
|
||||||
nodes = {
|
nodes = {
|
||||||
cass0 = { nodes, ... }: nodeCfg nodes "192.168.1.1" {};
|
cass0 = nodeCfg {};
|
||||||
cass1 = { nodes, ... }: nodeCfg nodes "192.168.1.2" {};
|
cass1 = nodeCfg {};
|
||||||
cass2 = { nodes, ... }: nodeCfg nodes "192.168.1.3" {
|
cass2 = nodeCfg { jvmOpts = [ "-Dcassandra.replace_address=cass1" ]; };
|
||||||
extraParams = [
|
|
||||||
''JVM_OPTS="$JVM_OPTS -Dcassandra.replace_address=192.168.1.2"''
|
|
||||||
];
|
|
||||||
listenAddress = "192.168.1.3";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
testScript = ''
|
testScript = ''
|
||||||
subtest "start seed", sub {
|
subtest "timers exist", sub {
|
||||||
|
$cass0->succeed("systemctl list-timers | grep cassandra-full-repair.timer");
|
||||||
|
$cass0->succeed("systemctl list-timers | grep cassandra-incremental-repair.timer");
|
||||||
|
};
|
||||||
|
subtest "can connect via cqlsh", sub {
|
||||||
$cass0->waitForUnit("cassandra.service");
|
$cass0->waitForUnit("cassandra.service");
|
||||||
$cass0->waitForOpenPort(9160);
|
$cass0->waitUntilSucceeds("nc -z cass0 9042");
|
||||||
$cass0->execute("echo show version | cqlsh localhost -u cassandra -p cassandra");
|
$cass0->succeed("echo 'show version;' | cqlsh cass0");
|
||||||
sleep 2;
|
|
||||||
$cass0->succeed("echo show version | cqlsh localhost -u cassandra -p cassandra");
|
|
||||||
$cass1->start;
|
|
||||||
};
|
};
|
||||||
subtest "cassandra user/group", sub {
|
subtest "nodetool is operational", sub {
|
||||||
$cass0->succeed("id \"${user}\" >/dev/null");
|
$cass0->waitForUnit("cassandra.service");
|
||||||
$cass1->succeed("id \"${user}\" >/dev/null");
|
$cass0->waitUntilSucceeds("nc -z localhost 7199");
|
||||||
|
$cass0->succeed("nodetool status --resolve-ip | egrep '^UN[[:space:]]+cass0'");
|
||||||
};
|
};
|
||||||
subtest "bring up cassandra cluster", sub {
|
subtest "bring up cluster", sub {
|
||||||
$cass1->waitForUnit("cassandra.service");
|
$cass1->waitForUnit("cassandra.service");
|
||||||
$cass0->waitUntilSucceeds("nodetool status | grep -c UN | grep 2");
|
$cass1->waitUntilSucceeds("nodetool status | egrep -c '^UN' | grep 2");
|
||||||
|
$cass0->succeed("nodetool status --resolve-ip | egrep '^UN[[:space:]]+cass1'");
|
||||||
};
|
};
|
||||||
subtest "break and fix node", sub {
|
subtest "break and fix node", sub {
|
||||||
$cass0->block;
|
$cass1->block;
|
||||||
$cass0->waitUntilSucceeds("nodetool status | grep -c DN | grep 1");
|
$cass0->waitUntilSucceeds("nodetool status --resolve-ip | egrep -c '^DN[[:space:]]+cass1'");
|
||||||
$cass0->unblock;
|
$cass0->succeed("nodetool status | egrep -c '^UN' | grep 1");
|
||||||
$cass0->waitUntilSucceeds("nodetool status | grep -c UN | grep 2");
|
$cass1->unblock;
|
||||||
|
$cass1->waitUntilSucceeds("nodetool status | egrep -c '^UN' | grep 2");
|
||||||
|
$cass0->succeed("nodetool status | egrep -c '^UN' | grep 2");
|
||||||
};
|
};
|
||||||
subtest "replace crashed node", sub {
|
subtest "replace crashed node", sub {
|
||||||
$cass1->crash;
|
$cass1->crash;
|
||||||
$cass2->start;
|
|
||||||
$cass2->waitForUnit("cassandra.service");
|
$cass2->waitForUnit("cassandra.service");
|
||||||
$cass0->waitUntilFails("nodetool status | grep UN | grep 192.168.1.2");
|
$cass0->waitUntilFails("nodetool status --resolve-ip | egrep '^UN[[:space:]]+cass1'");
|
||||||
$cass0->waitUntilSucceeds("nodetool status | grep UN | grep 192.168.1.3");
|
$cass0->waitUntilSucceeds("nodetool status --resolve-ip | egrep '^UN[[:space:]]+cass2'");
|
||||||
};
|
};
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
@ -19,8 +19,12 @@ import ./make-test.nix ({ pkgs, ...} : {
|
|||||||
startAll;
|
startAll;
|
||||||
|
|
||||||
$netdata->waitForUnit("netdata.service");
|
$netdata->waitForUnit("netdata.service");
|
||||||
# check if netdata can read disk ops for root owned processes.
|
|
||||||
# if > 0, successful. verifies both netdata working and
|
# check if the netdata main page loads.
|
||||||
|
$netdata->succeed("curl --fail http://localhost:19999/");
|
||||||
|
|
||||||
|
# check if netdata can read disk ops for root owned processes.
|
||||||
|
# if > 0, successful. verifies both netdata working and
|
||||||
# apps.plugin has elevated capabilities.
|
# apps.plugin has elevated capabilities.
|
||||||
my $cmd = <<'CMD';
|
my $cmd = <<'CMD';
|
||||||
curl -s http://localhost:19999/api/v1/data\?chart=users.pwrites | \
|
curl -s http://localhost:19999/api/v1/data\?chart=users.pwrites | \
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
buildGoPackage rec {
|
buildGoPackage rec {
|
||||||
name = "go-ethereum-${version}";
|
name = "go-ethereum-${version}";
|
||||||
version = "1.8.11";
|
version = "1.8.13";
|
||||||
goPackagePath = "github.com/ethereum/go-ethereum";
|
goPackagePath = "github.com/ethereum/go-ethereum";
|
||||||
|
|
||||||
# Fix for usb-related segmentation faults on darwin
|
# Fix for usb-related segmentation faults on darwin
|
||||||
@ -16,7 +16,7 @@ buildGoPackage rec {
|
|||||||
owner = "ethereum";
|
owner = "ethereum";
|
||||||
repo = "go-ethereum";
|
repo = "go-ethereum";
|
||||||
rev = "v${version}";
|
rev = "v${version}";
|
||||||
sha256 = "1b4za0hszb95jnj97g4xkrgcl0bydllznm0wj6rpi6cwmdr0h8na";
|
sha256 = "123jkyb293z7ww3sa9ji5rw7xd229isi03k4ayyh5p7rr0dg8al0";
|
||||||
};
|
};
|
||||||
|
|
||||||
meta = with stdenv.lib; {
|
meta = with stdenv.lib; {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
{ stdenv, fetchFromGitHub, cairo, fftw, gtkmm2, lv2, lvtk, pkgconfig, python }:
|
{ stdenv, fetchFromGitHub, cairo, fftw, gtkmm2, lv2, lvtk, pkgconfig, python3 }:
|
||||||
|
|
||||||
stdenv.mkDerivation rec {
|
stdenv.mkDerivation rec {
|
||||||
name = "ams-lv2-${version}";
|
name = "ams-lv2-${version}";
|
||||||
@ -12,13 +12,13 @@ stdenv.mkDerivation rec {
|
|||||||
};
|
};
|
||||||
|
|
||||||
nativeBuildInputs = [ pkgconfig ];
|
nativeBuildInputs = [ pkgconfig ];
|
||||||
buildInputs = [ cairo fftw gtkmm2 lv2 lvtk python ];
|
buildInputs = [ cairo fftw gtkmm2 lv2 lvtk ];
|
||||||
|
|
||||||
configurePhase = "python waf configure --prefix=$out";
|
configurePhase = "${python3.interpreter} waf configure --prefix=$out";
|
||||||
|
|
||||||
buildPhase = "python waf";
|
buildPhase = "${python3.interpreter} waf";
|
||||||
|
|
||||||
installPhase = "python waf install";
|
installPhase = "${python3.interpreter} waf install";
|
||||||
|
|
||||||
meta = with stdenv.lib; {
|
meta = with stdenv.lib; {
|
||||||
description = "An LV2 port of the internal modules found in Alsa Modular Synth";
|
description = "An LV2 port of the internal modules found in Alsa Modular Synth";
|
||||||
|
@ -3,11 +3,11 @@
|
|||||||
|
|
||||||
bitwig-studio1.overrideAttrs (oldAttrs: rec {
|
bitwig-studio1.overrideAttrs (oldAttrs: rec {
|
||||||
name = "bitwig-studio-${version}";
|
name = "bitwig-studio-${version}";
|
||||||
version = "2.3.2";
|
version = "2.3.5";
|
||||||
|
|
||||||
src = fetchurl {
|
src = fetchurl {
|
||||||
url = "https://downloads.bitwig.com/stable/${version}/bitwig-studio-${version}.deb";
|
url = "https://downloads.bitwig.com/stable/${version}/bitwig-studio-${version}.deb";
|
||||||
sha256 = "10ji4jqnnlhv4bgvhqwysprax6jcjk4759jskr9imwj6qjnj3vzn";
|
sha256 = "1v62z08hqla8fz5m7hl9ynf2hpr0j0arm0nb5lpd99qrv36ibrsc";
|
||||||
};
|
};
|
||||||
|
|
||||||
buildInputs = bitwig-studio1.buildInputs ++ [ ffmpeg ];
|
buildInputs = bitwig-studio1.buildInputs ++ [ ffmpeg ];
|
||||||
|
65
pkgs/applications/audio/cadence/default.nix
Normal file
65
pkgs/applications/audio/cadence/default.nix
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
{ stdenv
|
||||||
|
, fetchurl
|
||||||
|
, pkgconfig
|
||||||
|
, qtbase
|
||||||
|
, makeWrapper
|
||||||
|
, jack2Full
|
||||||
|
, python3Packages
|
||||||
|
, a2jmidid
|
||||||
|
}:
|
||||||
|
|
||||||
|
stdenv.mkDerivation rec {
|
||||||
|
version = "0.9.0";
|
||||||
|
name = "cadence";
|
||||||
|
|
||||||
|
src = fetchurl {
|
||||||
|
url = "https://github.com/falkTX/Cadence/archive/v${version}.tar.gz";
|
||||||
|
sha256 = "07z1mnb0bmldb3i31bgw816pnvlvr9gawr51rpx3mhixg5wpiqzb";
|
||||||
|
};
|
||||||
|
|
||||||
|
buildInputs = [
|
||||||
|
makeWrapper
|
||||||
|
pkgconfig
|
||||||
|
qtbase
|
||||||
|
];
|
||||||
|
|
||||||
|
apps = [
|
||||||
|
"cadence"
|
||||||
|
"cadence-jacksettings"
|
||||||
|
"cadence-pulse2loopback"
|
||||||
|
"claudia"
|
||||||
|
"cadence-aloop-daemon"
|
||||||
|
"cadence-logs"
|
||||||
|
"cadence-render"
|
||||||
|
"catarina"
|
||||||
|
"claudia-launcher"
|
||||||
|
"cadence-pulse2jack"
|
||||||
|
"cadence-session-start"
|
||||||
|
"catia"
|
||||||
|
];
|
||||||
|
|
||||||
|
makeFlags = ''
|
||||||
|
PREFIX=""
|
||||||
|
DESTDIR=$(out)
|
||||||
|
'';
|
||||||
|
|
||||||
|
propagatedBuildInputs = with python3Packages; [ pyqt5 ];
|
||||||
|
|
||||||
|
postInstall = ''
|
||||||
|
# replace with our own wrappers.
|
||||||
|
for app in $apps; do
|
||||||
|
rm $out/bin/$app
|
||||||
|
makeWrapper ${python3Packages.python.interpreter} $out/bin/$app \
|
||||||
|
--set PYTHONPATH "$PYTHONPATH:$out/share/cadence" \
|
||||||
|
--add-flags "-O $out/share/cadence/src/$app.py"
|
||||||
|
done
|
||||||
|
'';
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
homepage = https://github.com/falkTX/Cadence/;
|
||||||
|
description = "Collection of tools useful for audio production";
|
||||||
|
license = stdenv.lib.licenses.mit;
|
||||||
|
maintainers = with stdenv.lib.maintainers; [ genesis ];
|
||||||
|
platforms = stdenv.lib.platforms.linux;
|
||||||
|
};
|
||||||
|
}
|
@ -28,7 +28,7 @@ assert withOnlineServices -> withTaglib;
|
|||||||
assert withReplaygain -> withTaglib;
|
assert withReplaygain -> withTaglib;
|
||||||
|
|
||||||
let
|
let
|
||||||
version = "2.2.0";
|
version = "2.3.2";
|
||||||
pname = "cantata";
|
pname = "cantata";
|
||||||
fstat = x: fn: "-DENABLE_" + fn + "=" + (if x then "ON" else "OFF");
|
fstat = x: fn: "-DENABLE_" + fn + "=" + (if x then "ON" else "OFF");
|
||||||
fstats = x: map (fstat x);
|
fstats = x: map (fstat x);
|
||||||
@ -42,18 +42,9 @@ in stdenv.mkDerivation rec {
|
|||||||
owner = "CDrummond";
|
owner = "CDrummond";
|
||||||
repo = "cantata";
|
repo = "cantata";
|
||||||
rev = "v${version}";
|
rev = "v${version}";
|
||||||
sha256 = "1b633chgfs8rya78bzzck5zijna15d1y4nmrz4dcjp862ks5y5q6";
|
sha256 = "11hjday5vj0wzkc8yb5wbs05jwa8mvgxswd5qvhpci0zkl975yzn";
|
||||||
};
|
};
|
||||||
|
|
||||||
patches = [
|
|
||||||
# patch is needed for 2.2.0 with qt 5.10 (doesn't harm earlier versions)
|
|
||||||
(fetchpatch {
|
|
||||||
url = "https://github.com/CDrummond/cantata/commit/4da7a9128f2c5eaf23ae2a5006d300dc4f21fc6a.patch";
|
|
||||||
sha256 = "1z21ax3542z7hm628xv110lmplaspb407jzgfk16xkphww5qyphj";
|
|
||||||
name = "fix_qt_510.patch";
|
|
||||||
})
|
|
||||||
|
|
||||||
];
|
|
||||||
buildInputs = [ vlc qtbase qtmultimedia qtsvg ]
|
buildInputs = [ vlc qtbase qtmultimedia qtsvg ]
|
||||||
++ stdenv.lib.optionals withTaglib [ taglib taglib_extras ]
|
++ stdenv.lib.optionals withTaglib [ taglib taglib_extras ]
|
||||||
++ stdenv.lib.optionals withReplaygain [ ffmpeg speex mpg123 ]
|
++ stdenv.lib.optionals withReplaygain [ ffmpeg speex mpg123 ]
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
{ stdenv, fetchurl, pkgconfig, alsaLib, libjack2, dbus, qtbase, qttools, qtx11extras }:
|
{ stdenv, fetchurl, pkgconfig, alsaLib, libjack2, dbus, qtbase, qttools, qtx11extras }:
|
||||||
|
|
||||||
stdenv.mkDerivation rec {
|
stdenv.mkDerivation rec {
|
||||||
version = "0.5.2";
|
version = "0.5.3";
|
||||||
name = "qjackctl-${version}";
|
name = "qjackctl-${version}";
|
||||||
|
|
||||||
# some dependencies such as killall have to be installed additionally
|
# some dependencies such as killall have to be installed additionally
|
||||||
|
|
||||||
src = fetchurl {
|
src = fetchurl {
|
||||||
url = "mirror://sourceforge/qjackctl/${name}.tar.gz";
|
url = "mirror://sourceforge/qjackctl/${name}.tar.gz";
|
||||||
sha256 = "0nqr5f82lry3i4if8wdmrqsw84m45ijyj4psll30plxx5732zzaz";
|
sha256 = "0x08af8m5l8qy9av3dlldsg58ny9nc69h1s4i6hqkvj24jwy6fw1";
|
||||||
};
|
};
|
||||||
|
|
||||||
buildInputs = [
|
buildInputs = [
|
||||||
|
@ -3,11 +3,11 @@
|
|||||||
|
|
||||||
stdenv.mkDerivation rec {
|
stdenv.mkDerivation rec {
|
||||||
name = "qsampler-${version}";
|
name = "qsampler-${version}";
|
||||||
version = "0.5.1";
|
version = "0.5.2";
|
||||||
|
|
||||||
src = fetchurl {
|
src = fetchurl {
|
||||||
url = "mirror://sourceforge/qsampler/${name}.tar.gz";
|
url = "mirror://sourceforge/qsampler/${name}.tar.gz";
|
||||||
sha256 = "18j4cwmn7waih9x5b66cba2aa85spqqp507bf19ahsb5gl358yhh";
|
sha256 = "0xb0j57k03pkdl7yl5mcv1i21ljnxcq6b9h3zp6mris916lj45zq";
|
||||||
};
|
};
|
||||||
|
|
||||||
nativeBuildInputs = [ autoconf automake libtool pkgconfig qttools ];
|
nativeBuildInputs = [ autoconf automake libtool pkgconfig qttools ];
|
||||||
|
@ -2,15 +2,15 @@
|
|||||||
|
|
||||||
stdenv.mkDerivation rec {
|
stdenv.mkDerivation rec {
|
||||||
name = "qsynth-${version}";
|
name = "qsynth-${version}";
|
||||||
version = "0.5.1";
|
version = "0.5.2";
|
||||||
|
|
||||||
src = fetchurl {
|
src = fetchurl {
|
||||||
url = "mirror://sourceforge/qsynth/${name}.tar.gz";
|
url = "mirror://sourceforge/qsynth/${name}.tar.gz";
|
||||||
sha256 = "0kpk1rnhbifbvm4xvw8i0d4ksk78pf505qvg08k89kqkg32494ap";
|
sha256 = "1rfkaxq1pyc4hv3l0i6wicianbcbm1wp53kh9i5d4jsljgisd1dv";
|
||||||
};
|
};
|
||||||
|
|
||||||
# cmake is looking for qsynth.desktop.in and fails if it doesn't find it
|
# cmake is looking for qsynth.desktop.in and fails if it doesn't find it
|
||||||
# seems like a bug and can presumable go in the next version after 0.5.1
|
# seems like a bug and can presumable go in the next version after 0.5.2
|
||||||
postPatch = ''
|
postPatch = ''
|
||||||
mv src/qsynth.desktop src/qsynth.desktop.in
|
mv src/qsynth.desktop src/qsynth.desktop.in
|
||||||
'';
|
'';
|
||||||
|
@ -1,13 +1,18 @@
|
|||||||
{ fetchurl, stdenv, dpkg, xorg, alsaLib, makeWrapper, openssl, freetype
|
{ fetchurl, stdenv, squashfsTools, xorg, alsaLib, makeWrapper, openssl, freetype
|
||||||
, glib, pango, cairo, atk, gdk_pixbuf, gtk2, cups, nspr, nss, libpng
|
, glib, pango, cairo, atk, gdk_pixbuf, gtk2, cups, nspr, nss, libpng
|
||||||
, libgcrypt, systemd, fontconfig, dbus, expat, ffmpeg_0_10, curl, zlib, gnome3 }:
|
, libgcrypt, systemd, fontconfig, dbus, expat, ffmpeg_0_10, curl, zlib, gnome3 }:
|
||||||
|
|
||||||
let
|
let
|
||||||
# Please update the stable branch!
|
# "rev" decides what is actually being downloaded
|
||||||
# Latest version number can be found at:
|
version = "1.0.80.474.gef6b503e-7";
|
||||||
# http://repository-origin.spotify.com/pool/non-free/s/spotify-client/
|
# To get the latest stable revision:
|
||||||
# Be careful not to pick the testing version.
|
# curl -H 'X-Ubuntu-Series: 16' 'https://api.snapcraft.io/api/v1/snaps/details/spotify?channel=stable' | jq '.download_url,.version,.last_updated'
|
||||||
version = "1.0.80.480.g51b03ac3-13";
|
# To get general information:
|
||||||
|
# curl -H 'Snap-Device-Series: 16' 'https://api.snapcraft.io/v2/snaps/info/spotify' | jq '.'
|
||||||
|
# More exapmles of api usage:
|
||||||
|
# https://github.com/canonical-websites/snapcraft.io/blob/master/webapp/publisher/snaps/views.py
|
||||||
|
rev = "16";
|
||||||
|
|
||||||
|
|
||||||
deps = [
|
deps = [
|
||||||
alsaLib
|
alsaLib
|
||||||
@ -49,12 +54,20 @@ in
|
|||||||
stdenv.mkDerivation {
|
stdenv.mkDerivation {
|
||||||
name = "spotify-${version}";
|
name = "spotify-${version}";
|
||||||
|
|
||||||
|
# fetch from snapcraft instead of the debian repository most repos fetch from.
|
||||||
|
# That is a bit more cumbersome. But the debian repository only keeps the last
|
||||||
|
# two versions, while snapcraft should provide versions indefinately:
|
||||||
|
# https://forum.snapcraft.io/t/how-can-a-developer-remove-her-his-app-from-snap-store/512
|
||||||
|
|
||||||
|
# This is the next-best thing, since we're not allowed to re-distribute
|
||||||
|
# spotify ourselves:
|
||||||
|
# https://community.spotify.com/t5/Desktop-Linux/Redistribute-Spotify-on-Linux-Distributions/td-p/1695334
|
||||||
src = fetchurl {
|
src = fetchurl {
|
||||||
url = "https://repository-origin.spotify.com/pool/non-free/s/spotify-client/spotify-client_${version}_amd64.deb";
|
url = "https://api.snapcraft.io/api/v1/snaps/download/pOBIoZ2LrCB3rDohMxoYGnbN14EHOgD7_${rev}.snap";
|
||||||
sha256 = "e32f4816ae79dbfa0c14086e76df3bc83d526402aac1dbba534127fc00fe50ea";
|
sha512 = "45b7ab574b30fb368e0b6f4dd60addbfd1ddc02173b4f98b31c524eed49073432352a361e75959ce8e2f752231e93c79ca1b538c4bd295c935d1e2e0585d147f";
|
||||||
};
|
};
|
||||||
|
|
||||||
buildInputs = [ dpkg makeWrapper ];
|
buildInputs = [ squashfsTools makeWrapper ];
|
||||||
|
|
||||||
doConfigure = false;
|
doConfigure = false;
|
||||||
doBuild = false;
|
doBuild = false;
|
||||||
@ -63,7 +76,23 @@ stdenv.mkDerivation {
|
|||||||
|
|
||||||
unpackPhase = ''
|
unpackPhase = ''
|
||||||
runHook preUnpack
|
runHook preUnpack
|
||||||
dpkg-deb -x $src .
|
unsquashfs "$src" '/usr/share/spotify' '/usr/bin/spotify' '/meta/snap.yaml'
|
||||||
|
cd squashfs-root
|
||||||
|
if ! grep -q 'grade: stable' meta/snap.yaml; then
|
||||||
|
# Unfortunately this check is not reliable: At the moment (2018-07-26) the
|
||||||
|
# latest version in the "edge" channel is also marked as stable.
|
||||||
|
echo "The snap package is marked as unstable:"
|
||||||
|
grep 'grade: ' meta/snap.yaml
|
||||||
|
echo "You probably chose the wrong revision."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if ! grep -q '${version}' meta/snap.yaml; then
|
||||||
|
echo "Package version differs from version found in snap metadata:"
|
||||||
|
grep 'version: ' meta/snap.yaml
|
||||||
|
echo "While the nix package specifies: ${version}."
|
||||||
|
echo "You probably chose the wrong revision or forgot to update the nix version."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
runHook postUnpack
|
runHook postUnpack
|
||||||
'';
|
'';
|
||||||
|
|
||||||
@ -75,6 +104,8 @@ stdenv.mkDerivation {
|
|||||||
mkdir -p $libdir
|
mkdir -p $libdir
|
||||||
mv ./usr/* $out/
|
mv ./usr/* $out/
|
||||||
|
|
||||||
|
cp meta/snap.yaml $out
|
||||||
|
|
||||||
# Work around Spotify referring to a specific minor version of
|
# Work around Spotify referring to a specific minor version of
|
||||||
# OpenSSL.
|
# OpenSSL.
|
||||||
|
|
||||||
|
49
pkgs/applications/audio/spotify/update.sh
Normal file
49
pkgs/applications/audio/spotify/update.sh
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
channel="stable" # stable/candidate/edge
|
||||||
|
nixpkgs="$(git rev-parse --show-toplevel)"
|
||||||
|
spotify_nix="$nixpkgs/pkgs/applications/audio/spotify/default.nix"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# create bash array from snap info
|
||||||
|
snap_info=($(
|
||||||
|
curl -H 'X-Ubuntu-Series: 16' \
|
||||||
|
"https://api.snapcraft.io/api/v1/snaps/details/spotify?channel=$channel" \
|
||||||
|
| jq --raw-output \
|
||||||
|
'.revision,.download_sha512,.version,.last_updated'
|
||||||
|
))
|
||||||
|
|
||||||
|
revision="${snap_info[0]}"
|
||||||
|
sha512="${snap_info[1]}"
|
||||||
|
version="${snap_info[2]}"
|
||||||
|
last_updated="${snap_info[3]}"
|
||||||
|
|
||||||
|
# find the last commited version
|
||||||
|
version_pre=$(
|
||||||
|
git grep 'version\s*=' HEAD "$spotify_nix" \
|
||||||
|
| sed -Ene 's/.*"(.*)".*/\1/p'
|
||||||
|
)
|
||||||
|
|
||||||
|
if [[ "$version_pre" = "$version" ]]; then
|
||||||
|
echo "Spotify is already up ot date"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Updating from ${version_pre} to ${version}, released on ${last_updated}"
|
||||||
|
|
||||||
|
# search-andreplace revision, hash and version
|
||||||
|
sed --regexp-extended \
|
||||||
|
-e 's/rev\s*=\s*"[0-9]+"\s*;/rev = "'"${revision}"'";/' \
|
||||||
|
-e 's/sha512\s*=\s*".{128}"\s*;/sha512 = "'"${sha512}"'";/' \
|
||||||
|
-e 's/version\s*=\s*".*"\s*;/version = "'"${version}"'";/' \
|
||||||
|
-i "$spotify_nix"
|
||||||
|
|
||||||
|
if ! nix-build -A spotify "$nixpkgs"; then
|
||||||
|
echo "The updated spotify failed to build."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
git add "$spotify_nix"
|
||||||
|
# show diff for review
|
||||||
|
git diff HEAD
|
||||||
|
# prepare commit message, but allow edit
|
||||||
|
git commit --edit --message "spotify: $version_pre -> $version"
|
@ -8,9 +8,9 @@ let
|
|||||||
inherit (gnome2) GConf gnome_vfs;
|
inherit (gnome2) GConf gnome_vfs;
|
||||||
};
|
};
|
||||||
stableVersion = {
|
stableVersion = {
|
||||||
version = "3.1.3.0"; # "Android Studio 3.1.3"
|
version = "3.1.4.0"; # "Android Studio 3.1.4"
|
||||||
build = "173.4819257";
|
build = "173.4907809";
|
||||||
sha256Hash = "196yaswbxh2nd83gimjxr8ggr5xkdxq7n3xlh6ax73v59pj4hryq";
|
sha256Hash = "0xx6yprylmcb32ipmwdcfkgddlm1nrxi1w68miclvgrbk015brf2";
|
||||||
};
|
};
|
||||||
betaVersion = {
|
betaVersion = {
|
||||||
version = "3.2.0.22"; # "Android Studio 3.2 Beta 5"
|
version = "3.2.0.22"; # "Android Studio 3.2 Beta 5"
|
||||||
@ -18,9 +18,9 @@ let
|
|||||||
sha256Hash = "016nyn1pqviy089hg0dq7m4cqb39fdxdcy4zknkaq7dmgv1dj6x9";
|
sha256Hash = "016nyn1pqviy089hg0dq7m4cqb39fdxdcy4zknkaq7dmgv1dj6x9";
|
||||||
};
|
};
|
||||||
latestVersion = { # canary & dev
|
latestVersion = { # canary & dev
|
||||||
version = "3.3.0.3"; # "Android Studio 3.3 Canary 4"
|
version = "3.3.0.4"; # "Android Studio 3.3 Canary 5"
|
||||||
build = "182.4924367";
|
build = "182.4928781";
|
||||||
sha256Hash = "03fxjxlsbrpklsss1nvlkb41skr5ymmq9vdns8iikcm1ng925vfd";
|
sha256Hash = "110gh5ylgf1p8z0rdnvc6clkq3v721v6pjvll66a8v4zgz9ay8b4";
|
||||||
};
|
};
|
||||||
in rec {
|
in rec {
|
||||||
# Old alias
|
# Old alias
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
{ stdenv, pkgs, fetchurl, makeWrapper, gvfs, atomEnv}:
|
{ stdenv, pkgs, fetchurl, makeWrapper, wrapGAppsHook, gvfs, gtk3, atomEnv }:
|
||||||
|
|
||||||
let
|
let
|
||||||
common = pname: {version, sha256, beta ? null}:
|
common = pname: {version, sha256, beta ? null}:
|
||||||
@ -14,7 +14,19 @@ let
|
|||||||
inherit sha256;
|
inherit sha256;
|
||||||
};
|
};
|
||||||
|
|
||||||
nativeBuildInputs = [ makeWrapper ];
|
nativeBuildInputs = [
|
||||||
|
wrapGAppsHook # Fix error: GLib-GIO-ERROR **: No GSettings schemas are installed on the system
|
||||||
|
];
|
||||||
|
|
||||||
|
buildInputs = [
|
||||||
|
gtk3 # Fix error: GLib-GIO-ERROR **: Settings schema 'org.gtk.Settings.FileChooser' is not installed
|
||||||
|
];
|
||||||
|
|
||||||
|
preFixup = ''
|
||||||
|
gappsWrapperArgs+=(
|
||||||
|
--prefix "PATH" : "${gvfs}/bin" \
|
||||||
|
)
|
||||||
|
'';
|
||||||
|
|
||||||
buildCommand = ''
|
buildCommand = ''
|
||||||
mkdir -p $out/usr/
|
mkdir -p $out/usr/
|
||||||
@ -25,9 +37,6 @@ let
|
|||||||
rm -r $out/share/lintian
|
rm -r $out/share/lintian
|
||||||
rm -r $out/usr/
|
rm -r $out/usr/
|
||||||
sed -i "s/${pname})/.${pname}-wrapped)/" $out/bin/${pname}
|
sed -i "s/${pname})/.${pname}-wrapped)/" $out/bin/${pname}
|
||||||
# sed -i "s/'${pname}'/'.${pname}-wrapped'/" $out/bin/${pname}
|
|
||||||
wrapProgram $out/bin/${pname} \
|
|
||||||
--prefix "PATH" : "${gvfs}/bin"
|
|
||||||
|
|
||||||
fixupPhase
|
fixupPhase
|
||||||
|
|
||||||
|
@ -52,19 +52,9 @@ self:
|
|||||||
# part of a larger package
|
# part of a larger package
|
||||||
caml = dontConfigure super.caml;
|
caml = dontConfigure super.caml;
|
||||||
|
|
||||||
# part of a larger package
|
|
||||||
# upstream issue: missing package version
|
|
||||||
cmake-mode = markBroken (dontConfigure super.cmake-mode);
|
|
||||||
|
|
||||||
# Expects bash to be at /bin/bash
|
# Expects bash to be at /bin/bash
|
||||||
company-rtags = markBroken super.company-rtags;
|
company-rtags = markBroken super.company-rtags;
|
||||||
|
|
||||||
# upstream issue: missing file header
|
|
||||||
connection = markBroken super.connection;
|
|
||||||
|
|
||||||
# upstream issue: missing file header
|
|
||||||
dictionary = markBroken super.dictionary;
|
|
||||||
|
|
||||||
easy-kill-extras = super.easy-kill-extras.override {
|
easy-kill-extras = super.easy-kill-extras.override {
|
||||||
inherit (self.melpaPackages) easy-kill;
|
inherit (self.melpaPackages) easy-kill;
|
||||||
};
|
};
|
||||||
@ -79,6 +69,17 @@ self:
|
|||||||
inherit (self.melpaPackages) ess ctable popup;
|
inherit (self.melpaPackages) ess ctable popup;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
evil-magit = super.evil-magit.overrideAttrs (attrs: {
|
||||||
|
# searches for Git at build time
|
||||||
|
nativeBuildInputs =
|
||||||
|
(attrs.nativeBuildInputs or []) ++ [ external.git ];
|
||||||
|
});
|
||||||
|
|
||||||
|
# missing dependencies
|
||||||
|
evil-search-highlight-persist = super.evil-search-highlight-persist.overrideAttrs (attrs: {
|
||||||
|
packageRequires = with self; [ evil highlight ];
|
||||||
|
});
|
||||||
|
|
||||||
# missing OCaml
|
# missing OCaml
|
||||||
flycheck-ocaml = markBroken super.flycheck-ocaml;
|
flycheck-ocaml = markBroken super.flycheck-ocaml;
|
||||||
|
|
||||||
@ -108,15 +109,17 @@ self:
|
|||||||
# upstream issue: missing file header
|
# upstream issue: missing file header
|
||||||
initsplit = super.initsplit;
|
initsplit = super.initsplit;
|
||||||
|
|
||||||
|
# tries to write a log file to $HOME
|
||||||
|
insert-shebang = super.insert-shebang.overrideAttrs (attrs: {
|
||||||
|
HOME = "/tmp";
|
||||||
|
});
|
||||||
|
|
||||||
# Expects bash to be at /bin/bash
|
# Expects bash to be at /bin/bash
|
||||||
ivy-rtags = markBroken super.ivy-rtags;
|
ivy-rtags = markBroken super.ivy-rtags;
|
||||||
|
|
||||||
# upstream issue: missing file header
|
# upstream issue: missing file header
|
||||||
jsfmt = markBroken super.jsfmt;
|
jsfmt = markBroken super.jsfmt;
|
||||||
|
|
||||||
# upstream issue: missing file header
|
|
||||||
link = markBroken super.link;
|
|
||||||
|
|
||||||
# upstream issue: missing file header
|
# upstream issue: missing file header
|
||||||
maxframe = markBroken super.maxframe;
|
maxframe = markBroken super.maxframe;
|
||||||
|
|
||||||
@ -131,6 +134,18 @@ self:
|
|||||||
(attrs.nativeBuildInputs or []) ++ [ external.git ];
|
(attrs.nativeBuildInputs or []) ++ [ external.git ];
|
||||||
});
|
});
|
||||||
|
|
||||||
|
magit-annex = super.magit-annex.overrideAttrs (attrs: {
|
||||||
|
# searches for Git at build time
|
||||||
|
nativeBuildInputs =
|
||||||
|
(attrs.nativeBuildInputs or []) ++ [ external.git ];
|
||||||
|
});
|
||||||
|
|
||||||
|
magit-gitflow = super.magit-gitflow.overrideAttrs (attrs: {
|
||||||
|
# searches for Git at build time
|
||||||
|
nativeBuildInputs =
|
||||||
|
(attrs.nativeBuildInputs or []) ++ [ external.git ];
|
||||||
|
});
|
||||||
|
|
||||||
# missing OCaml
|
# missing OCaml
|
||||||
merlin = markBroken super.merlin;
|
merlin = markBroken super.merlin;
|
||||||
|
|
||||||
@ -154,8 +169,10 @@ self:
|
|||||||
(attrs.nativeBuildInputs or []) ++ [ external.git ];
|
(attrs.nativeBuildInputs or []) ++ [ external.git ];
|
||||||
}));
|
}));
|
||||||
|
|
||||||
# upstream issue: truncated file
|
# tries to write to $HOME
|
||||||
powershell = markBroken super.powershell;
|
php-auto-yasnippets = super.php-auto-yasnippets.overrideAttrs (attrs: {
|
||||||
|
HOME = "/tmp";
|
||||||
|
});
|
||||||
|
|
||||||
# upstream issue: mismatched filename
|
# upstream issue: mismatched filename
|
||||||
processing-snippets = markBroken super.processing-snippets;
|
processing-snippets = markBroken super.processing-snippets;
|
||||||
|
@ -4,12 +4,12 @@ with stdenv.lib;
|
|||||||
|
|
||||||
stdenv.mkDerivation rec {
|
stdenv.mkDerivation rec {
|
||||||
name = "kakoune-unstable-${version}";
|
name = "kakoune-unstable-${version}";
|
||||||
version = "2018-05-21";
|
version = "2018-08-05";
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
repo = "kakoune";
|
repo = "kakoune";
|
||||||
owner = "mawww";
|
owner = "mawww";
|
||||||
rev = "878d2a4bdb674a5e7703a66e530520f48efba641";
|
rev = "ae75032936ed9ffa2bf14589fef115d3d684a7c6";
|
||||||
sha256 = "0pwy6ilsb62s1792gjyvhvq8shj60l8lx26b58zvpfb54an4s6rk";
|
sha256 = "1qm6i8vzr4wjxxdvhr54pan0ysxq1sn880bz8p2w9y6qa91yd3m3";
|
||||||
};
|
};
|
||||||
nativeBuildInputs = [ pkgconfig ];
|
nativeBuildInputs = [ pkgconfig ];
|
||||||
buildInputs = [ ncurses asciidoc docbook_xsl libxslt ];
|
buildInputs = [ ncurses asciidoc docbook_xsl libxslt ];
|
||||||
|
@ -6,6 +6,7 @@ args@{ source ? "default", callPackage, fetchurl, stdenv, ncurses, pkgconfig, ge
|
|||||||
, libICE
|
, libICE
|
||||||
, vimPlugins
|
, vimPlugins
|
||||||
, makeWrapper
|
, makeWrapper
|
||||||
|
, wrapGAppsHook
|
||||||
|
|
||||||
# apple frameworks
|
# apple frameworks
|
||||||
, CoreServices, CoreData, Cocoa, Foundation, libobjc, cf-private
|
, CoreServices, CoreData, Cocoa, Foundation, libobjc, cf-private
|
||||||
@ -73,15 +74,6 @@ in stdenv.mkDerivation rec {
|
|||||||
|
|
||||||
src = builtins.getAttr source {
|
src = builtins.getAttr source {
|
||||||
"default" = common.src; # latest release
|
"default" = common.src; # latest release
|
||||||
|
|
||||||
"vim-nox" =
|
|
||||||
{
|
|
||||||
# vim nox branch: client-server without X by uing sockets
|
|
||||||
# REGION AUTO UPDATE: { name="vim-nox"; type="hg"; url="https://code.google.com/r/yukihironakadaira-vim-cmdsrv-nox/"; branch="cmdsrv-nox"; }
|
|
||||||
src = (fetchurl { url = "http://mawercer.de/~nix/repos/vim-nox-hg-2082fc3.tar.bz2"; sha256 = "293164ca1df752b7f975fd3b44766f5a1db752de6c7385753f083499651bd13a"; });
|
|
||||||
name = "vim-nox-hg-2082fc3";
|
|
||||||
# END
|
|
||||||
}.src;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
patches = [ ./cflags-prune.diff ] ++ stdenv.lib.optional ftNixSupport ./ft-nix-support.patch;
|
patches = [ ./cflags-prune.diff ] ++ stdenv.lib.optional ftNixSupport ./ft-nix-support.patch;
|
||||||
@ -131,6 +123,7 @@ in stdenv.mkDerivation rec {
|
|||||||
++ stdenv.lib.optional wrapPythonDrv makeWrapper
|
++ stdenv.lib.optional wrapPythonDrv makeWrapper
|
||||||
++ stdenv.lib.optional nlsSupport gettext
|
++ stdenv.lib.optional nlsSupport gettext
|
||||||
++ stdenv.lib.optional perlSupport perl
|
++ stdenv.lib.optional perlSupport perl
|
||||||
|
++ stdenv.lib.optional (guiSupport == "gtk3") wrapGAppsHook
|
||||||
;
|
;
|
||||||
|
|
||||||
buildInputs = [ ncurses libX11 libXext libSM libXpm libXt libXaw libXau
|
buildInputs = [ ncurses libX11 libXext libSM libXpm libXt libXaw libXau
|
||||||
|
40
pkgs/applications/graphics/animbar/default.nix
Normal file
40
pkgs/applications/graphics/animbar/default.nix
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
{ stdenv, lib, fetchurl, cmake, qt4, file, gcc }:
|
||||||
|
|
||||||
|
stdenv.mkDerivation rec {
|
||||||
|
pname = "animbar";
|
||||||
|
version = "1.2";
|
||||||
|
name = "${pname}-${version}";
|
||||||
|
|
||||||
|
src = fetchurl {
|
||||||
|
url = "mirror://sourceforge/${pname}/${name}.tar.bz2";
|
||||||
|
sha256 = "0836nwcpyfdrapyj3hbg3wh149ihc26pc78h01adpc7c0r7d9pr9";
|
||||||
|
};
|
||||||
|
|
||||||
|
nativeBuildInputs = [ cmake ];
|
||||||
|
|
||||||
|
buildInputs = [ qt4 file ];
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $out/bin $out/share/pixmaps
|
||||||
|
cp src/animbar $out/bin
|
||||||
|
cp ../icon/* $out/share/pixmaps
|
||||||
|
'';
|
||||||
|
|
||||||
|
meta = with lib; {
|
||||||
|
description = "Create your own animation on paper and transparancy";
|
||||||
|
longDescription = ''
|
||||||
|
Animbar lets you easily create your own animation on paper and
|
||||||
|
transparancy. From a set of input images two output images are
|
||||||
|
computed, that are printed one on paper and one on
|
||||||
|
transparency. By moving the transparency over the paper you
|
||||||
|
create a fascinating animation effect. This kind of animation
|
||||||
|
technique is hundreds of years old and known under several
|
||||||
|
names: picket fence animation, barrier grid animation, Moiré
|
||||||
|
animation, to name a few.
|
||||||
|
'';
|
||||||
|
homepage = http://animbar.mnim.org;
|
||||||
|
maintainers = with maintainers; [ leenaars ];
|
||||||
|
platforms = platforms.linux;
|
||||||
|
license = licenses.gpl3;
|
||||||
|
};
|
||||||
|
}
|
@ -1,14 +1,14 @@
|
|||||||
{ stdenv, fetchFromGitHub, fetchurl, xmlstarlet, makeWrapper, ant, jdk, rsync, javaPackages, libXxf86vm, gsettings-desktop-schemas }:
|
{ stdenv, fetchFromGitHub, fetchurl, xmlstarlet, makeWrapper, ant, jdk, rsync, javaPackages, libXxf86vm, gsettings-desktop-schemas }:
|
||||||
|
|
||||||
stdenv.mkDerivation rec {
|
stdenv.mkDerivation rec {
|
||||||
version = "3.3.7";
|
version = "3.4";
|
||||||
name = "processing3-${version}";
|
name = "processing3-${version}";
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "processing";
|
owner = "processing";
|
||||||
repo = "processing";
|
repo = "processing";
|
||||||
rev = "processing-0264-3.3.7";
|
rev = "processing-0265-${version}";
|
||||||
sha256 = "0a20z19lmc4xarfnr7xshcmlv3xkc2dgjxknis0iv79gxnwlqhpq";
|
sha256 = "12wpxgn2wd5vbasx9584w5yb1s319smq1zh8m7dvp7gkqw9plwp4";
|
||||||
};
|
};
|
||||||
|
|
||||||
nativeBuildInputs = [ ant rsync makeWrapper ];
|
nativeBuildInputs = [ ant rsync makeWrapper ];
|
||||||
@ -23,7 +23,7 @@ stdenv.mkDerivation rec {
|
|||||||
${xmlstarlet}/bin/xmlstarlet ed --inplace -P -d '//get[@src="http://download.processing.org/reference.zip"]' build/build.xml
|
${xmlstarlet}/bin/xmlstarlet ed --inplace -P -d '//get[@src="http://download.processing.org/reference.zip"]' build/build.xml
|
||||||
install -D -m0444 ${fetchurl {
|
install -D -m0444 ${fetchurl {
|
||||||
url = http://download.processing.org/reference.zip;
|
url = http://download.processing.org/reference.zip;
|
||||||
sha256 = "104zig026y8vbl4qksmscjq0bms8mi2jmri1ijdlbkxcqnv9bnlf";
|
sha256 = "0dli1bdgw8hsx7g7b048ap81v2za9maa6pfcwdqm3qkfypr8q7pr";
|
||||||
}
|
}
|
||||||
} ./java/reference.zip
|
} ./java/reference.zip
|
||||||
|
|
||||||
|
@ -12,14 +12,14 @@ let
|
|||||||
};
|
};
|
||||||
in
|
in
|
||||||
stdenv.mkDerivation rec {
|
stdenv.mkDerivation rec {
|
||||||
version = "1.0";
|
version = "1.1";
|
||||||
name = "renderdoc-${version}";
|
name = "renderdoc-${version}";
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "baldurk";
|
owner = "baldurk";
|
||||||
repo = "renderdoc";
|
repo = "renderdoc";
|
||||||
rev = "v${version}";
|
rev = "v${version}";
|
||||||
sha256 = "0l7pjxfrly4llryjnwk42dzx65n78wc98h56qm4yh04ja8fdbx2y";
|
sha256 = "0kb9m1dm0mnglqyh1srvl0f1bgjghxzbqarn0xfqw49wphqwhmcd";
|
||||||
};
|
};
|
||||||
|
|
||||||
buildInputs = [
|
buildInputs = [
|
||||||
|
@ -1,19 +1,19 @@
|
|||||||
{ stdenv, fetchFromGitHub, rustPlatform, cmake, CoreServices, cf-private }:
|
{ stdenv, fetchFromGitHub, rustPlatform, cmake, pkgconfig, openssl, CoreServices, cf-private }:
|
||||||
|
|
||||||
rustPlatform.buildRustPackage rec {
|
rustPlatform.buildRustPackage rec {
|
||||||
name = "gutenberg-${version}";
|
name = "gutenberg-${version}";
|
||||||
version = "0.3.4";
|
version = "0.4.0";
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "Keats";
|
owner = "Keats";
|
||||||
repo = "gutenberg";
|
repo = "gutenberg";
|
||||||
rev = "v${version}";
|
rev = "v${version}";
|
||||||
sha256 = "1v26q1m3bx7mdmmwgd6p601ncf13rr4rrx9s06fiy8vnd0ar1vlf";
|
sha256 = "1i2jcyq6afswxyjifhl5irv84licsad7c83yiy17454mplvrmyg2";
|
||||||
};
|
};
|
||||||
|
|
||||||
cargoSha256 = "0cdy0wvibkpnmlqwxvn02a2k2vqy6zdqzflj2dh6g1cjbz1j8qh5";
|
cargoSha256 = "0hzxwvb5m8mvpfxys4ikkaag6khflh5bfglmay11wf6ayighv834";
|
||||||
|
|
||||||
nativeBuildInputs = [ cmake ];
|
nativeBuildInputs = [ cmake pkgconfig openssl ];
|
||||||
buildInputs = stdenv.lib.optionals stdenv.isDarwin [ CoreServices cf-private ];
|
buildInputs = stdenv.lib.optionals stdenv.isDarwin [ CoreServices cf-private ];
|
||||||
|
|
||||||
postInstall = ''
|
postInstall = ''
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
buildGoPackage rec {
|
buildGoPackage rec {
|
||||||
name = "overmind-${version}";
|
name = "overmind-${version}";
|
||||||
version = "1.1.1";
|
version = "2.0.0.beta1";
|
||||||
goPackagePath = "github.com/DarthSim/overmind";
|
goPackagePath = "github.com/DarthSim/overmind";
|
||||||
|
|
||||||
nativeBuildInputs = [ makeWrapper ];
|
nativeBuildInputs = [ makeWrapper ];
|
||||||
@ -15,7 +15,7 @@ buildGoPackage rec {
|
|||||||
owner = "DarthSim";
|
owner = "DarthSim";
|
||||||
repo = "overmind";
|
repo = "overmind";
|
||||||
rev = "v${version}";
|
rev = "v${version}";
|
||||||
sha256 = "0gdsbm54ln07jv1kgg53fiavx18xxw4f21lfcdl74ijk6bx4jbzv";
|
sha256 = "15fch3qszdm8bj1m9hxky9zgk6f5gpbswwfslg84qdjf4iwr5drq";
|
||||||
};
|
};
|
||||||
|
|
||||||
meta = with stdenv.lib; {
|
meta = with stdenv.lib; {
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
{ stdenv, fetchFromGitHub, pythonPackages, file, less
|
{ stdenv, fetchFromGitHub, python3Packages, file, less
|
||||||
, imagePreviewSupport ? true, w3m ? null}:
|
, imagePreviewSupport ? true, w3m ? null}:
|
||||||
|
|
||||||
with stdenv.lib;
|
with stdenv.lib;
|
||||||
|
|
||||||
assert imagePreviewSupport -> w3m != null;
|
assert imagePreviewSupport -> w3m != null;
|
||||||
|
|
||||||
pythonPackages.buildPythonApplication rec {
|
python3Packages.buildPythonApplication rec {
|
||||||
name = "ranger-${version}";
|
name = "ranger-${version}";
|
||||||
version = "1.9.1";
|
version = "1.9.1";
|
||||||
|
|
||||||
@ -16,7 +16,7 @@ pythonPackages.buildPythonApplication rec {
|
|||||||
sha256= "1zhds37j1scxa9b183qbrjwxqldrdk581c5xiy81vg17sndb1kqj";
|
sha256= "1zhds37j1scxa9b183qbrjwxqldrdk581c5xiy81vg17sndb1kqj";
|
||||||
};
|
};
|
||||||
|
|
||||||
checkInputs = with pythonPackages; [ pytest ];
|
checkInputs = with python3Packages; [ pytest ];
|
||||||
propagatedBuildInputs = [ file ];
|
propagatedBuildInputs = [ file ];
|
||||||
|
|
||||||
checkPhase = ''
|
checkPhase = ''
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
{ stdenv, fetchFromGitHub, autoreconfHook, pkgconfig, libusb1, rtl-sdr }:
|
{ stdenv, fetchFromGitHub, autoreconfHook, pkgconfig, libusb1, rtl-sdr }:
|
||||||
stdenv.mkDerivation rec {
|
stdenv.mkDerivation rec {
|
||||||
|
|
||||||
version = "2018-02-23";
|
version = "18.05";
|
||||||
name = "rtl_433-${version}";
|
name = "rtl_433-${version}";
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "merbanan";
|
owner = "merbanan";
|
||||||
repo = "rtl_433";
|
repo = "rtl_433";
|
||||||
rev = "51d275c";
|
rev = "18.05";
|
||||||
sha256 = "1j443wmws5xgc18s47bvw3pqljk747izypz52rmlrvs16v96cg2g";
|
sha256 = "0vfhnjyrx6w1m8g1hww5vdz4zgdlhcaps9g0397mxlki4sm77wpc";
|
||||||
};
|
};
|
||||||
|
|
||||||
nativeBuildInputs = [ autoreconfHook pkgconfig ];
|
nativeBuildInputs = [ autoreconfHook pkgconfig ];
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
{fetchurl, stdenv, gtk3, python34Packages, gobjectIntrospection}:
|
{fetchFromGitHub, stdenv, gtk3, python34Packages, gobjectIntrospection}:
|
||||||
python34Packages.buildPythonApplication rec {
|
python34Packages.buildPythonApplication rec {
|
||||||
name = "solaar-${version}";
|
name = "solaar-unstable-${version}";
|
||||||
version = "0.9.2";
|
version = "2018-02-02";
|
||||||
namePrefix = "";
|
namePrefix = "";
|
||||||
src = fetchurl {
|
src = fetchFromGitHub {
|
||||||
sha256 = "0954grz2adggfzcj4df4mpr4d7qyl7w8rb4j2s0f9ymawl92i05j";
|
owner = "pwr";
|
||||||
url = "https://github.com/pwr/Solaar/archive/${version}.tar.gz";
|
repo = "Solaar";
|
||||||
|
rev = "59b7285fdfc875119f0c92cfd5f5909e8a8e578c";
|
||||||
|
sha256 = "0zy5vmjzdybnjf0mpp8rny11sc43gmm8172svsm9s51h7x0v83y3";
|
||||||
};
|
};
|
||||||
|
|
||||||
propagatedBuildInputs = [python34Packages.pygobject3 python34Packages.pyudev gobjectIntrospection gtk3];
|
propagatedBuildInputs = [python34Packages.pygobject3 python34Packages.pyudev gobjectIntrospection gtk3];
|
||||||
@ -35,6 +37,6 @@ python34Packages.buildPythonApplication rec {
|
|||||||
license = licenses.gpl2;
|
license = licenses.gpl2;
|
||||||
homepage = https://pwr.github.io/Solaar/;
|
homepage = https://pwr.github.io/Solaar/;
|
||||||
platforms = platforms.linux;
|
platforms = platforms.linux;
|
||||||
maintainers = [maintainers.spinus];
|
maintainers = [maintainers.spinus maintainers.ysndr];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
19
pkgs/applications/misc/toggldesktop/TogglDesktop.pro
Normal file
19
pkgs/applications/misc/toggldesktop/TogglDesktop.pro
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
QT += core network widgets
|
||||||
|
|
||||||
|
DEFINES += APP_ENVIRONMENT=\\\"production\\\"
|
||||||
|
DEFINES += APP_VERSION=\\\"@version@\\\"
|
||||||
|
|
||||||
|
TARGET = toggldesktop
|
||||||
|
TEMPLATE = app
|
||||||
|
|
||||||
|
SOURCES += *.cpp
|
||||||
|
HEADERS += *.h
|
||||||
|
FORMS += *.ui
|
||||||
|
RESOURCES += *.qrc
|
||||||
|
|
||||||
|
target.path = $$PREFIX
|
||||||
|
|
||||||
|
INSTALLS += target
|
||||||
|
|
||||||
|
CONFIG += link_pkgconfig
|
||||||
|
PKGCONFIG += bugsnag-qt qxtglobalshortcut qt-oauth-lib toggl x11 xscrnsaver
|
148
pkgs/applications/misc/toggldesktop/default.nix
Normal file
148
pkgs/applications/misc/toggldesktop/default.nix
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
{ stdenv, fetchzip, buildEnv, makeDesktopItem, runCommand, writeText, pkgconfig
|
||||||
|
, cmake, qmake, cacert, jsoncpp, libX11, libXScrnSaver, lua, openssl, poco
|
||||||
|
, qtbase, qtwebkit, qtx11extras, sqlite }:
|
||||||
|
|
||||||
|
let
|
||||||
|
name = "toggldesktop-${version}";
|
||||||
|
version = "7.4.231";
|
||||||
|
|
||||||
|
src = fetchzip {
|
||||||
|
url = "https://github.com/toggl/toggldesktop/archive/v${version}.tar.gz";
|
||||||
|
sha256 = "01hqkx9dljnhwnyqi6mmzfp02hnbi2j50rsfiasniqrkbi99x9v1";
|
||||||
|
};
|
||||||
|
|
||||||
|
bugsnag-qt = stdenv.mkDerivation rec {
|
||||||
|
name = "bugsnag-qt-${version}";
|
||||||
|
version = "20180522.005732";
|
||||||
|
|
||||||
|
src = fetchzip {
|
||||||
|
url = "https://github.com/yegortimoshenko/bugsnag-qt/archive/${version}.tar.gz";
|
||||||
|
sha256 = "02s6mlggh0i4a856md46dipy6mh47isap82jlwmjr7hfsk2ykgnq";
|
||||||
|
};
|
||||||
|
|
||||||
|
nativeBuildInputs = [ qmake ];
|
||||||
|
buildInputs = [ qtbase ];
|
||||||
|
};
|
||||||
|
|
||||||
|
qxtglobalshortcut = stdenv.mkDerivation rec {
|
||||||
|
name = "qxtglobalshortcut-${version}";
|
||||||
|
version = "f584471dada2099ba06c574bdfdd8b078c2e3550";
|
||||||
|
|
||||||
|
src = fetchzip {
|
||||||
|
url = "https://github.com/hluk/qxtglobalshortcut/archive/${version}.tar.gz";
|
||||||
|
sha256 = "1iy17gypav10z8aa62s5jb6mq9y4kb9ms4l61ydmk3xwlap7igw1";
|
||||||
|
};
|
||||||
|
|
||||||
|
nativeBuildInputs = [ cmake ];
|
||||||
|
buildInputs = [ qtbase qtx11extras ];
|
||||||
|
};
|
||||||
|
|
||||||
|
qt-oauth-lib = stdenv.mkDerivation rec {
|
||||||
|
name = "qt-oauth-lib-${version}";
|
||||||
|
version = "20180521.233208";
|
||||||
|
|
||||||
|
src = fetchzip {
|
||||||
|
url = "https://github.com/yegortimoshenko/qt-oauth-lib/archive/${version}.tar.gz";
|
||||||
|
sha256 = "0f46d44slzvzaqx0lksvv14lsc1jp8vd2mragxd61r820hybf5z3";
|
||||||
|
};
|
||||||
|
|
||||||
|
nativeBuildInputs = [ qmake ];
|
||||||
|
buildInputs = [ qtbase qtwebkit ];
|
||||||
|
};
|
||||||
|
|
||||||
|
poco-pc = writeText "poco.pc" ''
|
||||||
|
Name: Poco
|
||||||
|
Description: ${poco.meta.description}
|
||||||
|
Version: ${poco.version}
|
||||||
|
Libs: -L${poco}/lib -lPocoDataSQLite -lPocoData -lPocoNet -lPocoNetSSL -lPocoCrypto -lPocoUtil -lPocoXML -lPocoFoundation
|
||||||
|
Cflags: -I${poco}/include/Poco
|
||||||
|
'';
|
||||||
|
|
||||||
|
poco-pc-wrapped = runCommand "poco-pc-wrapped" {} ''
|
||||||
|
mkdir -p $out/lib/pkgconfig && ln -s ${poco-pc} $_/poco.pc
|
||||||
|
'';
|
||||||
|
|
||||||
|
libtoggl = stdenv.mkDerivation {
|
||||||
|
name = "libtoggl-${version}";
|
||||||
|
inherit src version;
|
||||||
|
|
||||||
|
sourceRoot = "source/src";
|
||||||
|
|
||||||
|
nativeBuildInputs = [ qmake pkgconfig ];
|
||||||
|
buildInputs = [ jsoncpp lua openssl poco poco-pc-wrapped sqlite libX11 ];
|
||||||
|
|
||||||
|
postPatch = ''
|
||||||
|
cat ${./libtoggl.pro} > libtoggl.pro
|
||||||
|
rm get_focused_window_{mac,windows}.cc
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
toggldesktop = stdenv.mkDerivation {
|
||||||
|
name = "${name}-unwrapped";
|
||||||
|
inherit src version;
|
||||||
|
|
||||||
|
sourceRoot = "source/src/ui/linux/TogglDesktop";
|
||||||
|
|
||||||
|
postPatch = ''
|
||||||
|
substituteAll ${./TogglDesktop.pro} TogglDesktop.pro
|
||||||
|
substituteInPlace toggl.cpp \
|
||||||
|
--replace ./../../../toggl_api.h toggl_api.h
|
||||||
|
'';
|
||||||
|
|
||||||
|
postInstall = ''
|
||||||
|
ln -s ${cacert}/etc/ssl/certs/ca-bundle.crt $out/cacert.pem
|
||||||
|
'';
|
||||||
|
|
||||||
|
nativeBuildInputs = [ qmake pkgconfig ];
|
||||||
|
|
||||||
|
buildInputs = [
|
||||||
|
bugsnag-qt
|
||||||
|
libtoggl
|
||||||
|
qxtglobalshortcut
|
||||||
|
qtbase
|
||||||
|
qtwebkit
|
||||||
|
qt-oauth-lib
|
||||||
|
qtx11extras
|
||||||
|
libX11
|
||||||
|
libXScrnSaver
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
toggldesktop-icons = stdenv.mkDerivation {
|
||||||
|
name = "${name}-icons";
|
||||||
|
inherit (toggldesktop) src sourceRoot;
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
for f in icons/*; do
|
||||||
|
mkdir -p $out/share/icons/hicolor/$(basename $f)/apps
|
||||||
|
mv $f/toggldesktop.png $_
|
||||||
|
done
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
toggldesktop-wrapped = runCommand "toggldesktop-wrapped" {} ''
|
||||||
|
mkdir -p $out/bin && ln -s ${toggldesktop}/toggldesktop $_
|
||||||
|
'';
|
||||||
|
|
||||||
|
desktopItem = makeDesktopItem rec {
|
||||||
|
categories = "Utility;";
|
||||||
|
desktopName = "Toggl";
|
||||||
|
genericName = desktopName;
|
||||||
|
name = "toggldesktop";
|
||||||
|
exec = "${toggldesktop-wrapped}/bin/toggldesktop";
|
||||||
|
icon = "toggldesktop";
|
||||||
|
};
|
||||||
|
in
|
||||||
|
|
||||||
|
buildEnv {
|
||||||
|
inherit name;
|
||||||
|
paths = [ desktopItem toggldesktop-icons toggldesktop-wrapped ];
|
||||||
|
|
||||||
|
meta = with stdenv.lib; {
|
||||||
|
description = "Client for Toggl time tracking service";
|
||||||
|
homepage = https://github.com/toggl/toggldesktop;
|
||||||
|
license = licenses.bsd3;
|
||||||
|
maintainers = with maintainers; [ yegortimoshenko ];
|
||||||
|
platforms = platforms.linux;
|
||||||
|
};
|
||||||
|
}
|
20
pkgs/applications/misc/toggldesktop/libtoggl.pro
Normal file
20
pkgs/applications/misc/toggldesktop/libtoggl.pro
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
TARGET = toggl
|
||||||
|
TEMPLATE = lib
|
||||||
|
|
||||||
|
SOURCES += *.cc
|
||||||
|
HEADERS += *.h
|
||||||
|
|
||||||
|
headers.files = $$HEADERS
|
||||||
|
headers.path = $$PREFIX/include
|
||||||
|
target.path = $$PREFIX/lib
|
||||||
|
|
||||||
|
INSTALLS += headers target
|
||||||
|
|
||||||
|
CONFIG += create_prl create_pc link_pkgconfig
|
||||||
|
PKGCONFIG += jsoncpp openssl lua poco sqlite3 x11
|
||||||
|
|
||||||
|
QMAKE_PKGCONFIG_NAME = $$TARGET
|
||||||
|
QMAKE_PKGCONFIG_PREFIX = $$PREFIX
|
||||||
|
QMAKE_PKGCONFIG_LIBDIR = $$target.path
|
||||||
|
QMAKE_PKGCONFIG_INCDIR = $$headers.path
|
||||||
|
QMAKE_PKGCONFIG_DESTDIR = pkgconfig
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,31 +0,0 @@
|
|||||||
{ stdenv, fetchgit, pkgconfig, girara, gtk, webkitgtk, glib-networking, makeWrapper
|
|
||||||
, gsettings-desktop-schemas }:
|
|
||||||
|
|
||||||
stdenv.mkDerivation rec {
|
|
||||||
name = "jumanji-${version}";
|
|
||||||
version = "20150107";
|
|
||||||
|
|
||||||
src = fetchgit {
|
|
||||||
url = https://git.pwmt.org/pwmt/jumanji.git;
|
|
||||||
rev = "f8e04e5b5a9fec47d49ca63a096e5d35be281151";
|
|
||||||
sha256 = "1dsbyz489fx7dp07i29q1rjkl7nhrfscc8ks8an2rdyhx3457asg";
|
|
||||||
};
|
|
||||||
|
|
||||||
nativeBuildInputs = [ pkgconfig ];
|
|
||||||
buildInputs = [ girara gtk webkitgtk makeWrapper gsettings-desktop-schemas ];
|
|
||||||
|
|
||||||
makeFlags = [ "PREFIX=$(out)" ];
|
|
||||||
|
|
||||||
preFixup=''
|
|
||||||
wrapProgram "$out/bin/jumanji" \
|
|
||||||
--prefix GIO_EXTRA_MODULES : "${glib-networking.out}/lib/gio/modules" \
|
|
||||||
--prefix XDG_DATA_DIRS : "$GSETTINGS_SCHEMAS_PATH"
|
|
||||||
'';
|
|
||||||
|
|
||||||
meta = with stdenv.lib; {
|
|
||||||
description = "Minimal web browser";
|
|
||||||
homepage = https://pwmt.org/projects/jumanji/;
|
|
||||||
platforms = platforms.all;
|
|
||||||
maintainers = [ maintainers.koral ];
|
|
||||||
};
|
|
||||||
}
|
|
@ -10,14 +10,14 @@
|
|||||||
|
|
||||||
stdenv.mkDerivation rec {
|
stdenv.mkDerivation rec {
|
||||||
name = "palemoon-${version}";
|
name = "palemoon-${version}";
|
||||||
version = "27.9.2";
|
version = "27.9.4";
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
name = "palemoon-src";
|
name = "palemoon-src";
|
||||||
owner = "MoonchildProductions";
|
owner = "MoonchildProductions";
|
||||||
repo = "Pale-Moon";
|
repo = "Pale-Moon";
|
||||||
rev = version + "_Release";
|
rev = version + "_Release";
|
||||||
sha256 = "0v6vgkxac2s1hw1namvrjysj2k1kbkabwdxrpq6kyd8svr7n974r";
|
sha256 = "0ir5gzhw98gfn15x58g1fwi11jd7gysvacqxg1v0jdjhgdl4m5sx";
|
||||||
};
|
};
|
||||||
|
|
||||||
desktopItem = makeDesktopItem {
|
desktopItem = makeDesktopItem {
|
||||||
@ -79,6 +79,8 @@ stdenv.mkDerivation rec {
|
|||||||
chmod u+w .
|
chmod u+w .
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
hardeningDisable = [ "format" ];
|
||||||
|
|
||||||
buildPhase = ''
|
buildPhase = ''
|
||||||
cd $builddir
|
cd $builddir
|
||||||
$src/mach build
|
$src/mach build
|
||||||
|
@ -9,15 +9,17 @@
|
|||||||
with lib;
|
with lib;
|
||||||
|
|
||||||
let
|
let
|
||||||
version = "3.9.0";
|
version = "3.10.0";
|
||||||
ver = stdenv.lib.elemAt (stdenv.lib.splitString "." version);
|
ver = stdenv.lib.elemAt (stdenv.lib.splitString "." version);
|
||||||
versionMajor = ver 0;
|
versionMajor = ver 0;
|
||||||
versionMinor = ver 1;
|
versionMinor = ver 1;
|
||||||
versionPatch = ver 2;
|
versionPatch = ver 2;
|
||||||
gitCommit = "191fece";
|
gitCommit = "dd10d17";
|
||||||
# version is in vendor/k8s.io/kubernetes/pkg/version/base.go
|
# version is in vendor/k8s.io/kubernetes/pkg/version/base.go
|
||||||
k8sversion = "v1.9.1";
|
k8sversion = "v1.10.0";
|
||||||
k8sgitcommit = "a0ce1bc657";
|
k8sgitcommit = "b81c8f8";
|
||||||
|
k8sgitMajor = "0";
|
||||||
|
k8sgitMinor = "1";
|
||||||
in stdenv.mkDerivation rec {
|
in stdenv.mkDerivation rec {
|
||||||
name = "openshift-origin-${version}";
|
name = "openshift-origin-${version}";
|
||||||
inherit version;
|
inherit version;
|
||||||
@ -26,7 +28,7 @@ in stdenv.mkDerivation rec {
|
|||||||
owner = "openshift";
|
owner = "openshift";
|
||||||
repo = "origin";
|
repo = "origin";
|
||||||
rev = "v${version}";
|
rev = "v${version}";
|
||||||
sha256 = "06k0zilfyvll7z34yirraslgpwgah9k6y5i6wgi7f00a79k76k78";
|
sha256 = "13aglz005jl48z17vnggkvr39l5h6jcqgkfyvkaz4c3jakms1hi9";
|
||||||
};
|
};
|
||||||
|
|
||||||
# go > 1.10
|
# go > 1.10
|
||||||
@ -38,15 +40,15 @@ in stdenv.mkDerivation rec {
|
|||||||
patchPhase = ''
|
patchPhase = ''
|
||||||
patchShebangs ./hack
|
patchShebangs ./hack
|
||||||
|
|
||||||
substituteInPlace pkg/oc/bootstrap/docker/host/host.go \
|
substituteInPlace pkg/oc/clusterup/docker/host/host.go \
|
||||||
--replace 'nsenter --mount=/rootfs/proc/1/ns/mnt findmnt' \
|
--replace 'nsenter --mount=/rootfs/proc/1/ns/mnt findmnt' \
|
||||||
'nsenter --mount=/rootfs/proc/1/ns/mnt ${utillinux}/bin/findmnt'
|
'nsenter --mount=/rootfs/proc/1/ns/mnt ${utillinux}/bin/findmnt'
|
||||||
|
|
||||||
substituteInPlace pkg/oc/bootstrap/docker/host/host.go \
|
substituteInPlace pkg/oc/clusterup/docker/host/host.go \
|
||||||
--replace 'nsenter --mount=/rootfs/proc/1/ns/mnt mount' \
|
--replace 'nsenter --mount=/rootfs/proc/1/ns/mnt mount' \
|
||||||
'nsenter --mount=/rootfs/proc/1/ns/mnt ${utillinux}/bin/mount'
|
'nsenter --mount=/rootfs/proc/1/ns/mnt ${utillinux}/bin/mount'
|
||||||
|
|
||||||
substituteInPlace pkg/oc/bootstrap/docker/host/host.go \
|
substituteInPlace pkg/oc/clusterup/docker/host/host.go \
|
||||||
--replace 'nsenter --mount=/rootfs/proc/1/ns/mnt mkdir' \
|
--replace 'nsenter --mount=/rootfs/proc/1/ns/mnt mkdir' \
|
||||||
'nsenter --mount=/rootfs/proc/1/ns/mnt ${coreutils}/bin/mkdir'
|
'nsenter --mount=/rootfs/proc/1/ns/mnt ${coreutils}/bin/mkdir'
|
||||||
'';
|
'';
|
||||||
@ -61,6 +63,8 @@ in stdenv.mkDerivation rec {
|
|||||||
echo "OS_GIT_COMMIT=${gitCommit}" >> os-version-defs
|
echo "OS_GIT_COMMIT=${gitCommit}" >> os-version-defs
|
||||||
echo "KUBE_GIT_VERSION=${k8sversion}" >> os-version-defs
|
echo "KUBE_GIT_VERSION=${k8sversion}" >> os-version-defs
|
||||||
echo "KUBE_GIT_COMMIT=${k8sgitcommit}" >> os-version-defs
|
echo "KUBE_GIT_COMMIT=${k8sgitcommit}" >> os-version-defs
|
||||||
|
echo "KUBE_GIT_MAJOR=${k8sgitMajor}" >> os-version-defs
|
||||||
|
echo "KUBE_GIT_MINOR=${k8sgitMinor}" >> os-version-defs
|
||||||
export OS_VERSION_FILE="os-version-defs"
|
export OS_VERSION_FILE="os-version-defs"
|
||||||
export CC=clang
|
export CC=clang
|
||||||
make all WHAT='${concatStringsSep " " components}'
|
make all WHAT='${concatStringsSep " " components}'
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
{ stdenv, fetchFromGitHub, pythonPackages, openssl }:
|
{ stdenv, fetchFromGitHub, python2Packages, openssl }:
|
||||||
|
|
||||||
pythonPackages.buildPythonApplication rec {
|
python2Packages.buildPythonApplication rec {
|
||||||
name = "pybitmessage-${version}";
|
pname = "pybitmessage";
|
||||||
|
|
||||||
version = "0.6.2";
|
version = "0.6.3.2";
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "bitmessage";
|
owner = "bitmessage";
|
||||||
repo = "PyBitmessage";
|
repo = "PyBitmessage";
|
||||||
rev = "v${version}";
|
rev = version;
|
||||||
sha256 = "04sgns9qczzw2152gqdr6bjyy4fmgs26cz8n3qck94l0j51rxhz8";
|
sha256 = "1lmhbpwsqh1v93krlqqhafw2pc3y0qp8zby186yllbph6s8kdp35";
|
||||||
};
|
};
|
||||||
|
|
||||||
propagatedBuildInputs = with pythonPackages; [ msgpack-python pyqt4 numpy pyopencl ] ++ [ openssl ];
|
propagatedBuildInputs = with python2Packages; [ msgpack-python pyqt4 numpy pyopencl ] ++ [ openssl ];
|
||||||
|
|
||||||
preConfigure = ''
|
preConfigure = ''
|
||||||
# Remove interaction and misleading output
|
# Remove interaction and misleading output
|
||||||
|
@ -3,9 +3,24 @@
|
|||||||
, dbus, libX11, xorg, libXi, libXcursor, libXdamage, libXrandr, libXcomposite
|
, dbus, libX11, xorg, libXi, libXcursor, libXdamage, libXrandr, libXcomposite
|
||||||
, libXext, libXfixes, libXrender, libXtst, libXScrnSaver, nss, nspr, alsaLib
|
, libXext, libXfixes, libXrender, libXtst, libXScrnSaver, nss, nspr, alsaLib
|
||||||
, cups, expat, udev
|
, cups, expat, udev
|
||||||
|
# Unfortunately this also overwrites the UI language (not just the spell
|
||||||
|
# checking language!):
|
||||||
|
, hunspellDicts, spellcheckerLanguage ? null # E.g. "de_DE"
|
||||||
|
# For a full list of available languages:
|
||||||
|
# $ cat pkgs/development/libraries/hunspell/dictionaries.nix | grep "dictFileName =" | awk '{ print $3 }'
|
||||||
}:
|
}:
|
||||||
|
|
||||||
let
|
let
|
||||||
|
customLanguageWrapperArgs = (with lib;
|
||||||
|
let
|
||||||
|
# E.g. "de_DE" -> "de-de" (spellcheckerLanguage -> hunspellDict)
|
||||||
|
spellLangComponents = splitString "_" spellcheckerLanguage;
|
||||||
|
hunspellDict = elemAt spellLangComponents 0 + "-" + toLower (elemAt spellLangComponents 1);
|
||||||
|
in if spellcheckerLanguage != null
|
||||||
|
then ''
|
||||||
|
--set HUNSPELL_DICTIONARIES "${hunspellDicts.${hunspellDict}}/share/hunspell" \
|
||||||
|
--set LC_MESSAGES "${spellcheckerLanguage}"''
|
||||||
|
else "");
|
||||||
rpath = lib.makeLibraryPath [
|
rpath = lib.makeLibraryPath [
|
||||||
alsaLib
|
alsaLib
|
||||||
atk
|
atk
|
||||||
@ -40,11 +55,11 @@ let
|
|||||||
|
|
||||||
in stdenv.mkDerivation rec {
|
in stdenv.mkDerivation rec {
|
||||||
name = "signal-desktop-${version}";
|
name = "signal-desktop-${version}";
|
||||||
version = "1.15.0";
|
version = "1.15.3";
|
||||||
|
|
||||||
src = fetchurl {
|
src = fetchurl {
|
||||||
url = "https://updates.signal.org/desktop/apt/pool/main/s/signal-desktop/signal-desktop_${version}_amd64.deb";
|
url = "https://updates.signal.org/desktop/apt/pool/main/s/signal-desktop/signal-desktop_${version}_amd64.deb";
|
||||||
sha256 = "1q73jx92h8zwk1dn103ymskz35q6kfiqc44886jr0p7mlpndqsa4";
|
sha256 = "009bcy90dvwiizya387fqrh3a8l0czgs4wnddxndy9gd477sn704";
|
||||||
};
|
};
|
||||||
|
|
||||||
phases = [ "unpackPhase" "installPhase" ];
|
phases = [ "unpackPhase" "installPhase" ];
|
||||||
@ -68,6 +83,7 @@ in stdenv.mkDerivation rec {
|
|||||||
--set-rpath ${rpath}:$out/libexec $out/libexec/signal-desktop
|
--set-rpath ${rpath}:$out/libexec $out/libexec/signal-desktop
|
||||||
wrapProgram $out/libexec/signal-desktop \
|
wrapProgram $out/libexec/signal-desktop \
|
||||||
--prefix XDG_DATA_DIRS : "${gtk3}/share/gsettings-schemas/${gtk3.name}/" \
|
--prefix XDG_DATA_DIRS : "${gtk3}/share/gsettings-schemas/${gtk3.name}/" \
|
||||||
|
${customLanguageWrapperArgs} \
|
||||||
"''${gappsWrapperArgs[@]}"
|
"''${gappsWrapperArgs[@]}"
|
||||||
|
|
||||||
# Symlink to bin
|
# Symlink to bin
|
||||||
|
@ -14,7 +14,7 @@ in {
|
|||||||
stable = mkTelegram stableVersion;
|
stable = mkTelegram stableVersion;
|
||||||
preview = mkTelegram (stableVersion // {
|
preview = mkTelegram (stableVersion // {
|
||||||
stable = false;
|
stable = false;
|
||||||
version = "1.3.11";
|
version = "1.3.12";
|
||||||
sha256Hash = "057b7ccba7k2slzbp9xzcs3fni40x7gz3wy13xfgxywr12f04h1r";
|
sha256Hash = "00z4ljs4fvbk7sf8wv1v50kln26gv8q12x6q41ai9gfzkvq5f69a";
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
buildGoPackage rec {
|
buildGoPackage rec {
|
||||||
name = "ipfs-${version}";
|
name = "ipfs-${version}";
|
||||||
version = "0.4.15";
|
version = "0.4.17";
|
||||||
rev = "v${version}";
|
rev = "v${version}";
|
||||||
|
|
||||||
goPackagePath = "github.com/ipfs/go-ipfs";
|
goPackagePath = "github.com/ipfs/go-ipfs";
|
||||||
@ -10,7 +10,7 @@ buildGoPackage rec {
|
|||||||
extraSrcPaths = [
|
extraSrcPaths = [
|
||||||
(fetchgx {
|
(fetchgx {
|
||||||
inherit name src;
|
inherit name src;
|
||||||
sha256 = "0bysfh2hd040i8lnyzhy96frflls4kdnlw748cl51ngqg3rwbhgz";
|
sha256 = "0grdgnr67r3qh0ppc3flrhcw8zlvx10mxypd8q2mhkil9w4dpcna";
|
||||||
})
|
})
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -18,7 +18,7 @@ buildGoPackage rec {
|
|||||||
owner = "ipfs";
|
owner = "ipfs";
|
||||||
repo = "go-ipfs";
|
repo = "go-ipfs";
|
||||||
inherit rev;
|
inherit rev;
|
||||||
sha256 = "1ry4a4pq26dbwy2b9cwi3xjaiyq6sng9lxnb1n30zxhp4w7rla2h";
|
sha256 = "18skmchdqd54wfqhibscqvc360l5ig6vmxd73ivf3bcpj3zvgq7q";
|
||||||
};
|
};
|
||||||
|
|
||||||
meta = with stdenv.lib; {
|
meta = with stdenv.lib; {
|
||||||
|
@ -18,7 +18,8 @@ pythonPackages.buildPythonPackage rec {
|
|||||||
];
|
];
|
||||||
|
|
||||||
propagatedBuildInputs = with pythonPackages; [
|
propagatedBuildInputs = with pythonPackages; [
|
||||||
pyGtkGlade libtorrentRasterbar twisted Mako chardet pyxdg pyopenssl service-identity
|
pyGtkGlade twisted Mako chardet pyxdg pyopenssl service-identity
|
||||||
|
libtorrentRasterbar.dev libtorrentRasterbar.python
|
||||||
];
|
];
|
||||||
|
|
||||||
nativeBuildInputs = [ intltool ];
|
nativeBuildInputs = [ intltool ];
|
||||||
|
@ -2,41 +2,59 @@
|
|||||||
, fetchurl
|
, fetchurl
|
||||||
, dbus
|
, dbus
|
||||||
, zlib, fontconfig
|
, zlib, fontconfig
|
||||||
|
, qtbase, qtmultimedia
|
||||||
|
, libjson, libgpgerror
|
||||||
, libX11, libxcb, libXau, libXdmcp, freetype, libbsd
|
, libX11, libxcb, libXau, libXdmcp, freetype, libbsd
|
||||||
|
, pythonPackages, squashfsTools, makeDesktopItem
|
||||||
}:
|
}:
|
||||||
|
|
||||||
with stdenv.lib;
|
with stdenv.lib;
|
||||||
let
|
let
|
||||||
libPath = makeLibraryPath
|
libPath = makeLibraryPath
|
||||||
[ stdenv.cc.cc dbus libX11 zlib libX11 libxcb libXau libXdmcp freetype fontconfig libbsd ];
|
[ stdenv.cc.cc qtbase qtmultimedia dbus libX11 zlib libX11 libxcb libXau libXdmcp freetype fontconfig libbsd libjson libgpgerror];
|
||||||
|
|
||||||
version = "2016-1-17";
|
version = "2018-1-30";
|
||||||
|
|
||||||
mainbin = "SoulseekQt-" + (version) +"-"+ (if stdenv.is64bit then "64bit" else "32bit");
|
mainbin = "SoulseekQt-" + (version) +"-"+ (if stdenv.is64bit then "64bit" else "32bit");
|
||||||
srcs = {
|
srcs = {
|
||||||
"i686-linux" = fetchurl {
|
|
||||||
url = "https://www.dropbox.com/s/kebk1b5ib1m3xxw/${mainbin}.tgz";
|
|
||||||
sha256 = "0r9rhnfslkgbw3l7fnc0rcfqjh58amgh5p33kwam0qvn1h1frnir";
|
|
||||||
};
|
|
||||||
|
|
||||||
"x86_64-linux" = fetchurl {
|
"x86_64-linux" = fetchurl {
|
||||||
url = "https://www.dropbox.com/s/7qh902qv2sxyp6p/${mainbin}.tgz";
|
url = "https://www.dropbox.com/s/0vi87eef3ooh7iy/${mainbin}.tgz";
|
||||||
sha256 = "05l3smpdvw8xdhv4v8a28j0yi1kvzhrha2ck23g4bl7x9wkay4cc";
|
sha256 = "0d1cayxr1a4j19bc5a3qp9pg22ggzmd55b6f5av3lc6lvwqqg4w6";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
desktopItem = makeDesktopItem {
|
||||||
|
name = "SoulseekQt";
|
||||||
|
exec = "soulseekqt";
|
||||||
|
icon = "$out/share/soulseekqt/";
|
||||||
|
comment = "Official Qt SoulSeek client";
|
||||||
|
desktopName = "SoulseekQt";
|
||||||
|
genericName = "SoulseekQt";
|
||||||
|
categories = "Network;";
|
||||||
|
};
|
||||||
|
|
||||||
in stdenv.mkDerivation rec {
|
in stdenv.mkDerivation rec {
|
||||||
|
|
||||||
name = "soulseekqt-${version}";
|
name = "soulseekqt-${version}";
|
||||||
inherit version;
|
inherit version;
|
||||||
src = srcs."${stdenv.system}" or (throw "unsupported system: ${stdenv.system}");
|
src = srcs."${stdenv.system}" or (throw "unsupported system: ${stdenv.system}");
|
||||||
|
|
||||||
sourceRoot = ".";
|
dontBuild = true;
|
||||||
buildPhase = ":"; # nothing to build
|
|
||||||
|
buildInputs = [ pythonPackages.binwalk squashfsTools ];
|
||||||
|
|
||||||
|
# avoid usage of appimagetool
|
||||||
|
unpackCmd = ''
|
||||||
|
export HOME=$(pwd) # workaround for binwalk
|
||||||
|
tar xvf $curSrc && binwalk --quiet \
|
||||||
|
${mainbin}.AppImage -D 'squashfs:.squashfs:unsquashfs %e'
|
||||||
|
'';
|
||||||
|
|
||||||
installPhase = ''
|
installPhase = ''
|
||||||
mkdir -p $out/bin
|
mkdir -p $out/{bin,share/soulseekqt}
|
||||||
cp ${mainbin} $out/bin/soulseekqt
|
cd squashfs-root/
|
||||||
|
cp -R soulseek.png translations $out/share/soulseekqt
|
||||||
|
cp SoulseekQt $out/bin/soulseekqt
|
||||||
'';
|
'';
|
||||||
|
|
||||||
fixupPhase = ''
|
fixupPhase = ''
|
||||||
@ -50,6 +68,6 @@ in stdenv.mkDerivation rec {
|
|||||||
homepage = http://www.soulseekqt.net;
|
homepage = http://www.soulseekqt.net;
|
||||||
license = licenses.unfree;
|
license = licenses.unfree;
|
||||||
maintainers = [ maintainers.genesis ];
|
maintainers = [ maintainers.genesis ];
|
||||||
platforms = [ "i686-linux" "x86_64-linux" ];
|
platforms = [ "x86_64-linux" ];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -39,50 +39,6 @@ let
|
|||||||
});
|
});
|
||||||
|
|
||||||
versionInfo = {
|
versionInfo = {
|
||||||
"13.4.0" = rec {
|
|
||||||
major = "13";
|
|
||||||
minor = "4";
|
|
||||||
patch = "0";
|
|
||||||
x64hash = "133brs0sq6d0mgr19rc6ig1n9ahm3ryi23v5nrgqfh0hgxqcrrjb";
|
|
||||||
x86hash = "0r7jfl5yqv1s2npy8l9gsn0gbb82f6raa092ppkc8xy5pni5sh7l";
|
|
||||||
x64suffix = "10109380";
|
|
||||||
x86suffix = x64suffix;
|
|
||||||
homepage = https://www.citrix.com/downloads/citrix-receiver/legacy-receiver-for-linux/receiver-for-linux-latest-13-4.html;
|
|
||||||
};
|
|
||||||
|
|
||||||
"13.5.0" = rec {
|
|
||||||
major = "13";
|
|
||||||
minor = "5";
|
|
||||||
patch = "0";
|
|
||||||
x64hash = "1r24mhkpcc0z95n597p07fz92pd1b8qqzp2z6w07rmb9wb8mpd4x";
|
|
||||||
x86hash = "0pwxshlryzhkl86cj9ryybm54alhzjx0gpp67fnvdn5r64wy1nd1";
|
|
||||||
x64suffix = "10185126";
|
|
||||||
x86suffix = x64suffix;
|
|
||||||
homepage = https://www.citrix.com/downloads/citrix-receiver/legacy-receiver-for-linux/receiver-for-linux-latest-13-5.html;
|
|
||||||
};
|
|
||||||
|
|
||||||
"13.6.0" = rec {
|
|
||||||
major = "13";
|
|
||||||
minor = "6";
|
|
||||||
patch = "0";
|
|
||||||
x64hash = "6e423be41d5bb8186bcca3fbb4ede54dc3f00b8d2aeb216ae4aabffef9310d34";
|
|
||||||
x86hash = "0ba3eba208b37844904d540b3011075ed5cecf429a0ab6c6cd52f2d0fd841ad2";
|
|
||||||
x64suffix = "10243651";
|
|
||||||
x86suffix = x64suffix;
|
|
||||||
homepage = https://www.citrix.com/downloads/citrix-receiver/legacy-receiver-for-linux/receiver-for-linux-136.html;
|
|
||||||
};
|
|
||||||
|
|
||||||
"13.7.0" = {
|
|
||||||
major = "13";
|
|
||||||
minor = "7";
|
|
||||||
patch = "0";
|
|
||||||
x64hash = "18fb374b9fb8e249b79178500dddca7a1f275411c6537e7695da5dcf19c5ba91";
|
|
||||||
x86hash = "4c68723b0327cf6f12da824056fce2b7853c38e6163a48c9d222b93dd8da75b6";
|
|
||||||
x64suffix = "10276927";
|
|
||||||
x86suffix = "10276925";
|
|
||||||
homepage = https://www.citrix.com/downloads/citrix-receiver/legacy-receiver-for-linux/receiver-for-linux-137.html;
|
|
||||||
};
|
|
||||||
|
|
||||||
"13.8.0" = {
|
"13.8.0" = {
|
||||||
major = "13";
|
major = "13";
|
||||||
minor = "8";
|
minor = "8";
|
||||||
@ -156,7 +112,7 @@ let
|
|||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
phases = [ "unpackPhase" "installPhase" ];
|
dontBuild = true;
|
||||||
|
|
||||||
sourceRoot = ".";
|
sourceRoot = ".";
|
||||||
|
|
||||||
@ -203,6 +159,8 @@ let
|
|||||||
};
|
};
|
||||||
|
|
||||||
installPhase = ''
|
installPhase = ''
|
||||||
|
runHook preInstall
|
||||||
|
|
||||||
export ICAInstDir="$out/opt/citrix-icaclient"
|
export ICAInstDir="$out/opt/citrix-icaclient"
|
||||||
|
|
||||||
sed -i \
|
sed -i \
|
||||||
@ -262,13 +220,15 @@ let
|
|||||||
|
|
||||||
# We introduce a dependency on the source file so that it need not be redownloaded everytime
|
# We introduce a dependency on the source file so that it need not be redownloaded everytime
|
||||||
echo $src >> "$out/share/nix_dependencies.pin"
|
echo $src >> "$out/share/nix_dependencies.pin"
|
||||||
|
|
||||||
|
runHook postInstall
|
||||||
'';
|
'';
|
||||||
|
|
||||||
meta = with stdenv.lib; {
|
meta = with stdenv.lib; {
|
||||||
license = stdenv.lib.licenses.unfree;
|
license = stdenv.lib.licenses.unfree;
|
||||||
inherit homepage;
|
inherit homepage;
|
||||||
description = "Citrix Receiver";
|
description = "Citrix Receiver";
|
||||||
maintainers = with maintainers; [ obadz a1russell ];
|
maintainers = with maintainers; [ obadz a1russell ma27 ];
|
||||||
platforms = platforms.linux;
|
platforms = platforms.linux;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -0,0 +1,19 @@
|
|||||||
|
{ citrix_receiver, extraCerts ? [], symlinkJoin }:
|
||||||
|
|
||||||
|
let
|
||||||
|
|
||||||
|
mkCertCopy = certPath:
|
||||||
|
"cp ${certPath} $out/opt/citrix-icaclient/keystore/cacerts/";
|
||||||
|
|
||||||
|
in
|
||||||
|
|
||||||
|
if builtins.length extraCerts == 0 then citrix_receiver else symlinkJoin {
|
||||||
|
name = "citrix-with-extra-certs-${citrix_receiver.version}";
|
||||||
|
paths = [ citrix_receiver ];
|
||||||
|
|
||||||
|
postBuild = ''
|
||||||
|
${builtins.concatStringsSep "\n" (map mkCertCopy extraCerts)}
|
||||||
|
|
||||||
|
sed -i -E "s,-icaroot (.+citrix-icaclient),-icaroot $out/opt/citrix-icaclient," $out/bin/wfica
|
||||||
|
'';
|
||||||
|
}
|
@ -10,7 +10,7 @@
|
|||||||
}:
|
}:
|
||||||
|
|
||||||
let
|
let
|
||||||
version = "1.2.30.1";
|
version = "1.2.31.2";
|
||||||
|
|
||||||
desktopItem = makeDesktopItem {
|
desktopItem = makeDesktopItem {
|
||||||
name = "remmina";
|
name = "remmina";
|
||||||
@ -29,7 +29,7 @@ in stdenv.mkDerivation {
|
|||||||
owner = "Remmina";
|
owner = "Remmina";
|
||||||
repo = "Remmina";
|
repo = "Remmina";
|
||||||
rev = "v${version}";
|
rev = "v${version}";
|
||||||
sha256 = "1jz20yv84a8m9gm9fsz0jii8ag90v1scmbkkx9gk38ax5il7ilvn";
|
sha256 = "09jdrs2hbr9wyd5yqw5bri41rnfnxxyh98mlv6ig2phlvs9cg73d";
|
||||||
};
|
};
|
||||||
|
|
||||||
nativeBuildInputs = [ pkgconfig ];
|
nativeBuildInputs = [ pkgconfig ];
|
||||||
|
@ -1,18 +1,26 @@
|
|||||||
{ stdenv, fetchFromGitHub, cmake, lua, pkgconfig, rsync,
|
{ stdenv, fetchFromGitHub, fetchpatch, cmake, lua, pkgconfig, rsync,
|
||||||
asciidoc, libxml2, docbook_xml_dtd_45, docbook_xsl, libxslt }:
|
asciidoc, libxml2, docbook_xml_dtd_45, docbook_xsl, libxslt }:
|
||||||
|
|
||||||
stdenv.mkDerivation rec {
|
stdenv.mkDerivation rec {
|
||||||
name = "lsyncd-${version}";
|
name = "lsyncd-${version}";
|
||||||
version = "2.2.2";
|
version = "2.2.3";
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "axkibe";
|
owner = "axkibe";
|
||||||
repo = "lsyncd";
|
repo = "lsyncd";
|
||||||
rev = "release-${version}";
|
rev = "release-${version}";
|
||||||
sha256 = "1q2ixp52r96ckghgmxdbms6xrq8dbziimp8gmgzqfq4lk1v1w80y";
|
sha256 = "1hbsih5hfq9lhgnxm0wb5mrj6xmlk2l0i9a79wzd5f6cnjil9l3x";
|
||||||
};
|
};
|
||||||
|
|
||||||
patchPhase = ''
|
patches = [
|
||||||
|
(fetchpatch {
|
||||||
|
sha256 = "0b0h2qxh73l502p7phf6qgl8576nf6fvqqp2x5wy3nz7sc9qb1z8";
|
||||||
|
name = "fix-non-versioned-lua-not-search-in-cmake.patch";
|
||||||
|
url = "https://github.com/axkibe/lsyncd/pull/500/commits/0af99d8d5ba35118e8799684a2d4a8ea4b0c6957.patch";
|
||||||
|
})
|
||||||
|
];
|
||||||
|
|
||||||
|
postPatch = ''
|
||||||
substituteInPlace default-rsync.lua \
|
substituteInPlace default-rsync.lua \
|
||||||
--replace "/usr/bin/rsync" "${rsync}/bin/rsync"
|
--replace "/usr/bin/rsync" "${rsync}/bin/rsync"
|
||||||
'';
|
'';
|
||||||
|
@ -14,10 +14,10 @@ with stdenv.lib;
|
|||||||
|
|
||||||
python2Packages.buildPythonApplication rec {
|
python2Packages.buildPythonApplication rec {
|
||||||
pname = "tryton";
|
pname = "tryton";
|
||||||
version = "4.8.3";
|
version = "4.8.4";
|
||||||
src = python2Packages.fetchPypi {
|
src = python2Packages.fetchPypi {
|
||||||
inherit pname version;
|
inherit pname version;
|
||||||
sha256 = "1e2862bbe7c943afbbdf2232cdc55f75d2357640115c7f1483f0814b2c5a6882";
|
sha256 = "6cf3091424853e1270d61f3a9b15ad8e6b36a44c28becf216c324ca8dc1474b0";
|
||||||
};
|
};
|
||||||
nativeBuildInputs = [ pkgconfig gobjectIntrospection ];
|
nativeBuildInputs = [ pkgconfig gobjectIntrospection ];
|
||||||
propagatedBuildInputs = with python2Packages; [
|
propagatedBuildInputs = with python2Packages; [
|
||||||
|
@ -5,10 +5,10 @@ with stdenv.lib;
|
|||||||
|
|
||||||
python2Packages.buildPythonApplication rec {
|
python2Packages.buildPythonApplication rec {
|
||||||
pname = "trytond";
|
pname = "trytond";
|
||||||
version = "4.8.2";
|
version = "4.8.3";
|
||||||
src = python2Packages.fetchPypi {
|
src = python2Packages.fetchPypi {
|
||||||
inherit pname version;
|
inherit pname version;
|
||||||
sha256 = "ec5c419418517bf9f7d2af08b2bfd3bcc7526f6d6f07d122abf1699c728ae2a9";
|
sha256 = "11d01dc984d9274229b5c80f883679d130a55e14e9124b051274fce9aea4ef77";
|
||||||
};
|
};
|
||||||
|
|
||||||
# Tells the tests which database to use
|
# Tells the tests which database to use
|
||||||
|
@ -2,11 +2,11 @@
|
|||||||
|
|
||||||
with stdenv.lib;
|
with stdenv.lib;
|
||||||
|
|
||||||
|
let version = "2.48"; in
|
||||||
stdenv.mkDerivation {
|
stdenv.mkDerivation {
|
||||||
name = "gwyddion-${version}";
|
name = "gwyddion-${version}";
|
||||||
version = "2.48";
|
|
||||||
src = fetchurl {
|
src = fetchurl {
|
||||||
url = "http://sourceforge.net/projects/gwyddion/files/gwyddion/2.48/gwyddion-2.48.tar.xz";
|
url = "http://sourceforge.net/projects/gwyddion/files/gwyddion/${version}/gwyddion-${version}.tar.xz";
|
||||||
sha256 = "119iw58ac2wn4cas6js8m7r1n4gmmkga6b1y711xzcyjp9hshgwx";
|
sha256 = "119iw58ac2wn4cas6js8m7r1n4gmmkga6b1y711xzcyjp9hshgwx";
|
||||||
};
|
};
|
||||||
nativeBuildInputs = [ pkgconfig ];
|
nativeBuildInputs = [ pkgconfig ];
|
||||||
|
@ -2,13 +2,13 @@
|
|||||||
|
|
||||||
stdenv.mkDerivation rec {
|
stdenv.mkDerivation rec {
|
||||||
name = "symbiyosys-${version}";
|
name = "symbiyosys-${version}";
|
||||||
version = "2018.05.03";
|
version = "2018.07.26";
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "yosyshq";
|
owner = "yosyshq";
|
||||||
repo = "symbiyosys";
|
repo = "symbiyosys";
|
||||||
rev = "35d956c7bb77c0602d198035b2d73a9c61cb4de4";
|
rev = "2fef25f93dd1cb5137a08e71f507e3eee8100fb1";
|
||||||
sha256 = "02zg3nkwp3fdjwz1agvsn55k1xipwh2rradb0bgjrjpsmmw63gda";
|
sha256 = "103fga0n11h4n2q346xyz3k0615d9lgx2b8sqr1pwn2hx26kchav";
|
||||||
};
|
};
|
||||||
|
|
||||||
buildInputs = [ python3 yosys ];
|
buildInputs = [ python3 yosys ];
|
||||||
|
@ -13,10 +13,10 @@ assert useGoogleHashmap -> sparsehash != null;
|
|||||||
|
|
||||||
let
|
let
|
||||||
inherit (stdenv.lib) optional;
|
inherit (stdenv.lib) optional;
|
||||||
|
version = "1.0";
|
||||||
in
|
in
|
||||||
stdenv.mkDerivation {
|
stdenv.mkDerivation {
|
||||||
name = "ripser-${version}";
|
name = "ripser-${version}";
|
||||||
version = "1.0";
|
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "Ripser";
|
owner = "Ripser";
|
||||||
|
@ -8,10 +8,6 @@ let
|
|||||||
# https://trac.sagemath.org/ticket/15980 for tracking of python3 support
|
# https://trac.sagemath.org/ticket/15980 for tracking of python3 support
|
||||||
python = nixpkgs.python2.override {
|
python = nixpkgs.python2.override {
|
||||||
packageOverrides = self: super: {
|
packageOverrides = self: super: {
|
||||||
cypari2 = super.cypari2.override { inherit pari; };
|
|
||||||
|
|
||||||
cysignals = super.cysignals.override { inherit pari; };
|
|
||||||
|
|
||||||
# python packages that appear unmaintained and were not accepted into the nixpkgs
|
# python packages that appear unmaintained and were not accepted into the nixpkgs
|
||||||
# tree because of that. These packages are only dependencies of the more-or-less
|
# tree because of that. These packages are only dependencies of the more-or-less
|
||||||
# deprecated sagenb. However sagenb is still a default dependency and the doctests
|
# deprecated sagenb. However sagenb is still a default dependency and the doctests
|
||||||
@ -24,7 +20,7 @@ let
|
|||||||
pybrial = self.callPackage ./pybrial.nix {};
|
pybrial = self.callPackage ./pybrial.nix {};
|
||||||
|
|
||||||
sagelib = self.callPackage ./sagelib.nix {
|
sagelib = self.callPackage ./sagelib.nix {
|
||||||
inherit flint ecl pari eclib ntl arb;
|
inherit flint ecl arb;
|
||||||
inherit sage-src openblas-blas-pc openblas-cblas-pc openblas-lapack-pc pynac singular;
|
inherit sage-src openblas-blas-pc openblas-cblas-pc openblas-lapack-pc pynac singular;
|
||||||
linbox = nixpkgs.linbox.override { withSage = true; };
|
linbox = nixpkgs.linbox.override { withSage = true; };
|
||||||
};
|
};
|
||||||
@ -38,20 +34,20 @@ let
|
|||||||
};
|
};
|
||||||
|
|
||||||
env-locations = self.callPackage ./env-locations.nix {
|
env-locations = self.callPackage ./env-locations.nix {
|
||||||
inherit pari_data ecl pari;
|
inherit pari_data ecl;
|
||||||
inherit singular;
|
inherit singular;
|
||||||
three = nodePackages_8_x.three;
|
three = nodePackages_8_x.three;
|
||||||
mathjax = nodePackages_8_x.mathjax;
|
mathjax = nodePackages_8_x.mathjax;
|
||||||
};
|
};
|
||||||
|
|
||||||
sage-env = self.callPackage ./sage-env.nix {
|
sage-env = self.callPackage ./sage-env.nix {
|
||||||
inherit sage-src python rWrapper openblas-cblas-pc ecl singular eclib pari palp flint pynac pythonEnv giac ntl;
|
inherit sage-src python rWrapper openblas-cblas-pc ecl singular palp flint pynac pythonEnv;
|
||||||
pkg-config = nixpkgs.pkgconfig; # not to confuse with pythonPackages.pkgconfig
|
pkg-config = nixpkgs.pkgconfig; # not to confuse with pythonPackages.pkgconfig
|
||||||
};
|
};
|
||||||
|
|
||||||
sage-with-env = self.callPackage ./sage-with-env.nix {
|
sage-with-env = self.callPackage ./sage-with-env.nix {
|
||||||
inherit pari eclib pythonEnv ntl;
|
inherit pythonEnv;
|
||||||
inherit sage-src openblas-blas-pc openblas-cblas-pc openblas-lapack-pc pynac singular giac;
|
inherit sage-src openblas-blas-pc openblas-cblas-pc openblas-lapack-pc pynac singular;
|
||||||
pkg-config = nixpkgs.pkgconfig; # not to confuse with pythonPackages.pkgconfig
|
pkg-config = nixpkgs.pkgconfig; # not to confuse with pythonPackages.pkgconfig
|
||||||
three = nodePackages_8_x.three;
|
three = nodePackages_8_x.three;
|
||||||
};
|
};
|
||||||
@ -106,41 +102,18 @@ let
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
# https://trac.sagemath.org/ticket/25532
|
|
||||||
ntl = nixpkgs.ntl.overrideAttrs (oldAttrs: rec {
|
|
||||||
name = "ntl-10.5.0";
|
|
||||||
sourceRoot = "${name}/src";
|
|
||||||
src = fetchurl {
|
|
||||||
url = "http://www.shoup.net/ntl/${name}.tar.gz";
|
|
||||||
sha256 = "1lmldaldgfr2b2a6585m3np5ds8bq1bis2s1ajycjm49vp4kc2xr";
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
giac = nixpkgs.giac.override { inherit ntl; };
|
|
||||||
arb = nixpkgs.arb.override { inherit flint; };
|
arb = nixpkgs.arb.override { inherit flint; };
|
||||||
|
|
||||||
# update causes issues
|
singular = nixpkgs.singular.override { inherit flint; };
|
||||||
# https://groups.google.com/forum/#!topic/sage-packaging/cS3v05Q0zso
|
|
||||||
# https://trac.sagemath.org/ticket/24735
|
|
||||||
singular = (nixpkgs.singular.override { inherit ntl flint; }).overrideAttrs (oldAttrs: {
|
|
||||||
name = "singular-4.1.0p3";
|
|
||||||
src = fetchurl {
|
|
||||||
url = "http://www.mathematik.uni-kl.de/ftp/pub/Math/Singular/SOURCES/4-1-0/singular-4.1.0p3.tar.gz";
|
|
||||||
sha256 = "105zs3zk46b1cps403ap9423rl48824ap5gyrdgmg8fma34680a4";
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
# *not* to confuse with the python package "pynac"
|
# *not* to confuse with the python package "pynac"
|
||||||
# https://trac.sagemath.org/ticket/24838 (depends on arb update)
|
|
||||||
pynac = nixpkgs.pynac.override { inherit singular flint; };
|
pynac = nixpkgs.pynac.override { inherit singular flint; };
|
||||||
|
|
||||||
eclib = nixpkgs.eclib.override { inherit pari ntl; };
|
|
||||||
|
|
||||||
# With openblas (64 bit), the tests fail the same way as when sage is build with
|
# With openblas (64 bit), the tests fail the same way as when sage is build with
|
||||||
# openblas instead of openblasCompat. Apparently other packages somehow use flints
|
# openblas instead of openblasCompat. Apparently other packages somehow use flints
|
||||||
# blas when it is available. Alternative would be to override flint to use
|
# blas when it is available. Alternative would be to override flint to use
|
||||||
# openblasCompat.
|
# openblasCompat.
|
||||||
flint = nixpkgs.flint.override { withBlas = false; inherit ntl; };
|
flint = nixpkgs.flint.override { withBlas = false; };
|
||||||
|
|
||||||
# Multiple palp dimensions need to be available and sage expects them all to be
|
# Multiple palp dimensions need to be available and sage expects them all to be
|
||||||
# in the same folder.
|
# in the same folder.
|
||||||
@ -165,15 +138,6 @@ let
|
|||||||
|
|
||||||
# https://trac.sagemath.org/ticket/22191
|
# https://trac.sagemath.org/ticket/22191
|
||||||
ecl = nixpkgs.ecl_16_1_2;
|
ecl = nixpkgs.ecl_16_1_2;
|
||||||
|
|
||||||
# sage currently uses an unreleased version of pari
|
|
||||||
pari = (nixpkgs.pari.override { withThread = false; }).overrideAttrs (attrs: rec {
|
|
||||||
version = "2.10-1280-g88fb5b3"; # on update remove pari-stackwarn patch from `sage-src.nix`
|
|
||||||
src = fetchurl {
|
|
||||||
url = "mirror://sageupstream/pari/pari-${version}.tar.gz";
|
|
||||||
sha256 = "19gbsm8jqq3hraanbmsvzkbh88iwlqbckzbnga3y76r7k42akn7m";
|
|
||||||
};
|
|
||||||
});
|
|
||||||
in
|
in
|
||||||
python.pkgs.sage-wrapper // {
|
python.pkgs.sage-wrapper // {
|
||||||
doc = python.pkgs.sagedoc;
|
doc = python.pkgs.sagedoc;
|
||||||
|
@ -1,427 +0,0 @@
|
|||||||
commit c885927e25b29bd23869e02379c2918da430323e
|
|
||||||
Author: Timo Kaufmann <timokau@zoho.com>
|
|
||||||
Date: Sat Jun 30 02:26:15 2018 +0200
|
|
||||||
|
|
||||||
diff --git a/build/pkgs/arb/checksums.ini b/build/pkgs/arb/checksums.ini
|
|
||||||
index 1924ee03c3..9323b97391 100644
|
|
||||||
--- a/build/pkgs/arb/checksums.ini
|
|
||||||
+++ b/build/pkgs/arb/checksums.ini
|
|
||||||
@@ -1,4 +1,4 @@
|
|
||||||
tarball=arb-VERSION.tar.gz
|
|
||||||
-sha1=27476d0529e48a07d92da90bd0fb80dd18f443e3
|
|
||||||
-md5=733285d9705d10b8024e551ffa81952f
|
|
||||||
-cksum=2391183744
|
|
||||||
+sha1=44eda7bf8eaa666c45b1fc2c1b5bd08756d94b58
|
|
||||||
+md5=fa24de9fffe4394fb6a7a6792e2ecc5f
|
|
||||||
+cksum=3689220688
|
|
||||||
diff --git a/build/pkgs/arb/package-version.txt b/build/pkgs/arb/package-version.txt
|
|
||||||
index c8810e9bdb..fb2c0766b7 100644
|
|
||||||
--- a/build/pkgs/arb/package-version.txt
|
|
||||||
+++ b/build/pkgs/arb/package-version.txt
|
|
||||||
@@ -1 +1 @@
|
|
||||||
-2.12.0.p0
|
|
||||||
+2.13.0
|
|
||||||
diff --git a/build/pkgs/arb/patches/arb-pie-hardening-conflict.patch b/build/pkgs/arb/patches/arb-pie-hardening-conflict.patch
|
|
||||||
deleted file mode 100644
|
|
||||||
index 3e5c0e708b..0000000000
|
|
||||||
--- a/build/pkgs/arb/patches/arb-pie-hardening-conflict.patch
|
|
||||||
+++ /dev/null
|
|
||||||
@@ -1,17 +0,0 @@
|
|
||||||
-In newer binutils, ld options -r and -pie conflict.
|
|
||||||
-Patch due to Jörg-Volker Peetz
|
|
||||||
-(source : https://groups.google.com/d/msg/sage-devel/TduebNoZuBE/sEULolL0BQAJ),
|
|
||||||
-packaged by Emmanuel Charpentier
|
|
||||||
-
|
|
||||||
-diff -ru arb-2.8.1-orig/Makefile.subdirs arb-2.8.1-new/Makefile.subdirs
|
|
||||||
---- arb-2.8.1-orig/Makefile.subdirs 2015-12-31 17:30:01.000000000 +0100
|
|
||||||
-+++ arb-2.8.1-new/Makefile.subdirs 2016-11-07 18:50:34.540051779 +0100
|
|
||||||
-@@ -52,7 +52,7 @@
|
|
||||||
- $(QUIET_CC) $(CC) $(CFLAGS) $(INCS) -c $< -o $@ -MMD -MP -MF "$(BUILD_DIR)/$(MOD_DIR)_$*.d" -MT "$(BUILD_DIR)/$(MOD_DIR)_$*.d" -MT "$@"
|
|
||||||
-
|
|
||||||
- $(MOD_LOBJ): $(LOBJS)
|
|
||||||
-- $(QUIET_CC) $(CC) $(ABI_FLAG) -Wl,-r $^ -o $@ -nostdlib
|
|
||||||
-+ $(QUIET_CC) $(CC) $(ABI_FLAG) -r $^ -o $@ -nostdlib
|
|
||||||
-
|
|
||||||
- -include $(LOBJS:.lo=.d)
|
|
||||||
-
|
|
||||||
diff --git a/src/sage/rings/complex_arb.pyx b/src/sage/rings/complex_arb.pyx
|
|
||||||
index 70d51e655a..00e7caea2c 100644
|
|
||||||
--- a/src/sage/rings/complex_arb.pyx
|
|
||||||
+++ b/src/sage/rings/complex_arb.pyx
|
|
||||||
@@ -857,14 +857,14 @@ class ComplexBallField(UniqueRepresentation, Field):
|
|
||||||
[0.500000000000000 +/- 2.09e-16]
|
|
||||||
|
|
||||||
sage: CBF.integral(lambda x, _: x.gamma(), 1 - CBF(i), 1 + CBF(i))
|
|
||||||
- [+/- 3.95e-15] + [1.5723926694981 +/- 4.53e-14]*I
|
|
||||||
+ [+/- 4...e-15] + [1.5723926694981 +/- 4...e-14]*I
|
|
||||||
|
|
||||||
sage: C = ComplexBallField(100)
|
|
||||||
sage: C.integral(lambda x, _: x.cos() * x.sin(), 0, 1)
|
|
||||||
[0.35403670913678559674939205737 +/- 8.89e-30]
|
|
||||||
|
|
||||||
sage: CBF.integral(lambda x, _: (x + x.exp()).sin(), 0, 8)
|
|
||||||
- [0.34740017266 +/- 6.36e-12]
|
|
||||||
+ [0.34740017266 +/- 6...e-12]
|
|
||||||
|
|
||||||
sage: C = ComplexBallField(2000)
|
|
||||||
sage: C.integral(lambda x, _: (x + x.exp()).sin(), 0, 8) # long time
|
|
||||||
@@ -879,14 +879,14 @@ class ComplexBallField(UniqueRepresentation, Field):
|
|
||||||
....: else:
|
|
||||||
....: return z.sqrt()
|
|
||||||
sage: CBF.integral(my_sqrt, -1 + CBF(i), -1 - CBF(i))
|
|
||||||
- [+/- 1.14e-14] + [-0.4752076627926 +/- 5.18e-14]*I
|
|
||||||
+ [+/- 1.14e-14] + [-0.4752076627926 +/- 5...e-14]*I
|
|
||||||
|
|
||||||
Note, though, that proper handling of the ``analytic`` flag is required
|
|
||||||
even when the path does not touch the branch cut::
|
|
||||||
|
|
||||||
sage: correct = CBF.integral(my_sqrt, 1, 2); correct
|
|
||||||
[1.21895141649746 +/- 3.73e-15]
|
|
||||||
- sage: RBF(integral(sqrt(x), x, 1, 2))
|
|
||||||
+ sage: RBF(integral(sqrt(x), x, 1, 2)) # long time
|
|
||||||
[1.21895141649746 +/- 1.79e-15]
|
|
||||||
sage: wrong = CBF.integral(lambda z, _: z.sqrt(), 1, 2) # WRONG!
|
|
||||||
sage: correct - wrong
|
|
||||||
@@ -915,9 +915,9 @@ class ComplexBallField(UniqueRepresentation, Field):
|
|
||||||
the integrand is unbounded::
|
|
||||||
|
|
||||||
sage: CBF.integral(lambda x, _: 1/x, -1, 1)
|
|
||||||
- [+/- inf] + [+/- inf]*I
|
|
||||||
+ nan + nan*I
|
|
||||||
sage: CBF.integral(lambda x, _: 1/x, 10^-1000, 1)
|
|
||||||
- [+/- inf] + [+/- inf]*I
|
|
||||||
+ nan + nan*I
|
|
||||||
sage: CBF.integral(lambda x, _: 1/x, 10^-1000, 1, abs_tol=1e-10)
|
|
||||||
[2302.5850930 +/- 1.26e-8]
|
|
||||||
|
|
||||||
@@ -928,14 +928,15 @@ class ComplexBallField(UniqueRepresentation, Field):
|
|
||||||
sage: CBF.integral(lambda x, _: x.exp(), -1020, -1010, abs_tol=1e-450)
|
|
||||||
[2.304377150950e-439 +/- 9.74e-452]
|
|
||||||
sage: CBF.integral(lambda x, _: x.exp(), -1020, -1010, abs_tol=0)
|
|
||||||
- [2.304377150949e-439 +/- 7.53e-452]
|
|
||||||
- sage: CBF.integral(lambda x, _: x.exp(), -1020, -1010, rel_tol=1e-4, abs_tol=0)
|
|
||||||
- [2.30438e-439 +/- 3.90e-445]
|
|
||||||
+ [2.304377150950e-439 +/- 7...e-452]
|
|
||||||
+ sage: CBF.integral(lambda x, _: x.exp(), -1020, -1010, rel_tol=1e-2, abs_tol=0)
|
|
||||||
+ [2.30438e-439 +/- 5.94e-445]
|
|
||||||
|
|
||||||
- sage: CBF.integral(lambda x, _: x*(1/x).sin(), 0, 1)
|
|
||||||
- [+/- 0.644]
|
|
||||||
- sage: CBF.integral(lambda x, _: x*(1/x).sin(), 0, 1, use_heap=True)
|
|
||||||
- [0.3785300 +/- 4.32e-8]
|
|
||||||
+ sage: epsi = CBF(1e-10)
|
|
||||||
+ sage: CBF.integral(lambda x, _: x*(1/x).sin(), epsi, 1)
|
|
||||||
+ [0.38 +/- 8.54e-3]
|
|
||||||
+ sage: CBF.integral(lambda x, _: x*(1/x).sin(), epsi, 1, use_heap=True)
|
|
||||||
+ [0.37853002 +/- 8.73e-9]
|
|
||||||
|
|
||||||
ALGORITHM:
|
|
||||||
|
|
||||||
@@ -951,12 +952,12 @@ class ComplexBallField(UniqueRepresentation, Field):
|
|
||||||
|
|
||||||
sage: i = QuadraticField(-1).gen()
|
|
||||||
sage: CBF.integral(lambda x, _: (1 + i*x).gamma(), -1, 1)
|
|
||||||
- [1.5723926694981 +/- 4.53e-14] + [+/- 3.95e-15]*I
|
|
||||||
+ [1.5723926694981 +/- 4...e-14] + [+/- 4...e-15]*I
|
|
||||||
|
|
||||||
- sage: ComplexBallField(10000).integral(lambda x, _: x.sin(), 0, 1, rel_tol=1e-400)
|
|
||||||
- [0.459... +/- ...e-4...]
|
|
||||||
+ sage: ComplexBallField(10000).integral(lambda x, _: x.sin(), 0, 1, rel_tol=1e-300)
|
|
||||||
+ [0.459... +/- ...e-3...]
|
|
||||||
sage: CBF.integral(lambda x, _: x.sin(), 0, 100, rel_tol=10)
|
|
||||||
- [+/- 7.61]
|
|
||||||
+ [0.138 +/- 5.53e-4]
|
|
||||||
|
|
||||||
sage: ComplexBallField(10000).integral(lambda x, _: x.sin(), 0, 1, abs_tol=1e-400)
|
|
||||||
[0.459697... +/- ...e-4...]
|
|
||||||
@@ -2389,9 +2390,9 @@ cdef class ComplexBall(RingElement):
|
|
||||||
sage: ~CBF(i/3)
|
|
||||||
[-3.00000000000000 +/- 9.44e-16]*I
|
|
||||||
sage: ~CBF(0)
|
|
||||||
- [+/- inf]
|
|
||||||
+ nan
|
|
||||||
sage: ~CBF(RIF(10,11))
|
|
||||||
- [0.1 +/- 9.53e-3]
|
|
||||||
+ [0.1 +/- 9.10e-3]
|
|
||||||
"""
|
|
||||||
cdef ComplexBall res = self._new()
|
|
||||||
if _do_sig(prec(self)): sig_on()
|
|
||||||
@@ -2512,9 +2513,9 @@ cdef class ComplexBall(RingElement):
|
|
||||||
sage: CBF(-2, 1)/CBF(1, 1/3)
|
|
||||||
[-1.500000000000000 +/- 8.83e-16] + [1.500000000000000 +/- 5.64e-16]*I
|
|
||||||
sage: CBF(2+I)/CBF(0)
|
|
||||||
- [+/- inf] + [+/- inf]*I
|
|
||||||
+ nan + nan*I
|
|
||||||
sage: CBF(1)/CBF(0)
|
|
||||||
- [+/- inf]
|
|
||||||
+ nan
|
|
||||||
sage: CBF(1)/CBF(RBF(0, 1.))
|
|
||||||
nan
|
|
||||||
"""
|
|
||||||
@@ -2543,9 +2544,9 @@ cdef class ComplexBall(RingElement):
|
|
||||||
sage: CBF(0)^(1/3)
|
|
||||||
0
|
|
||||||
sage: CBF(0)^(-1)
|
|
||||||
- [+/- inf]
|
|
||||||
+ nan
|
|
||||||
sage: CBF(0)^(-2)
|
|
||||||
- [+/- inf] + [+/- inf]*I
|
|
||||||
+ nan + nan*I
|
|
||||||
|
|
||||||
TESTS::
|
|
||||||
|
|
||||||
@@ -2656,12 +2657,12 @@ cdef class ComplexBall(RingElement):
|
|
||||||
sage: CBF(1).rising_factorial(5)
|
|
||||||
120.0000000000000
|
|
||||||
sage: CBF(1/3, 1/2).rising_factorial(300)
|
|
||||||
- [-3.87949484514e+612 +/- 5.23e+600] + [-3.52042209763e+612 +/- 5.55e+600]*I
|
|
||||||
+ [-3.87949484514e+612 +/- 5...e+600] + [-3.52042209763e+612 +/- 5...e+600]*I
|
|
||||||
|
|
||||||
sage: CBF(1).rising_factorial(-1)
|
|
||||||
nan
|
|
||||||
sage: CBF(1).rising_factorial(2**64)
|
|
||||||
- [+/- 2.30e+347382171305201370464]
|
|
||||||
+ [+/- 2.30e+347382171326740403407]
|
|
||||||
sage: ComplexBallField(128)(1).rising_factorial(2**64)
|
|
||||||
[2.343691126796861348e+347382171305201285713 +/- 4.71e+347382171305201285694]
|
|
||||||
sage: CBF(1/2).rising_factorial(CBF(2,3))
|
|
||||||
@@ -2700,7 +2701,7 @@ cdef class ComplexBall(RingElement):
|
|
||||||
[1.000000000000000 +/- 2.83e-16] + [-0.441271200305303 +/- 2.82e-16]*I
|
|
||||||
|
|
||||||
sage: CBF('inf').log()
|
|
||||||
- nan + nan*I
|
|
||||||
+ [+/- inf]
|
|
||||||
sage: CBF(2).log(0)
|
|
||||||
nan + nan*I
|
|
||||||
"""
|
|
||||||
@@ -2808,7 +2809,7 @@ cdef class ComplexBall(RingElement):
|
|
||||||
sage: CBF(pi/2, 1/10).tan()
|
|
||||||
[+/- 2.87e-14] + [10.0333111322540 +/- 2.36e-14]*I
|
|
||||||
sage: CBF(pi/2).tan()
|
|
||||||
- [+/- inf]
|
|
||||||
+ nan
|
|
||||||
"""
|
|
||||||
cdef ComplexBall res = self._new()
|
|
||||||
if _do_sig(prec(self)): sig_on()
|
|
||||||
@@ -2825,7 +2826,7 @@ cdef class ComplexBall(RingElement):
|
|
||||||
sage: CBF(pi, 1/10).cot()
|
|
||||||
[+/- 5.74e-14] + [-10.0333111322540 +/- 2.81e-14]*I
|
|
||||||
sage: CBF(pi).cot()
|
|
||||||
- [+/- inf]
|
|
||||||
+ nan
|
|
||||||
"""
|
|
||||||
cdef ComplexBall res = self._new()
|
|
||||||
if _do_sig(prec(self)): sig_on()
|
|
||||||
@@ -3211,9 +3212,9 @@ cdef class ComplexBall(RingElement):
|
|
||||||
1.000000000000000*I
|
|
||||||
|
|
||||||
sage: CBF(2+3*I).hypergeometric([1/4,1/3],[1/2])
|
|
||||||
- [0.7871684267473 +/- 7.34e-14] + [0.2749254173721 +/- 9.23e-14]*I
|
|
||||||
+ [0.7871684267473 +/- 7...e-14] + [0.2749254173721 +/- 9...e-14]*I
|
|
||||||
sage: CBF(2+3*I).hypergeometric([1/4,1/3],[1/2],regularized=True)
|
|
||||||
- [0.4441122268685 +/- 3.96e-14] + [0.1551100567338 +/- 5.75e-14]*I
|
|
||||||
+ [0.4441122268685 +/- 3...e-14] + [0.1551100567338 +/- 5...e-14]*I
|
|
||||||
|
|
||||||
sage: CBF(5).hypergeometric([2,3], [-5])
|
|
||||||
nan + nan*I
|
|
||||||
@@ -4041,9 +4042,9 @@ cdef class ComplexBall(RingElement):
|
|
||||||
|
|
||||||
sage: phi = CBF(1,1)
|
|
||||||
sage: (CBF.pi()/2).elliptic_e_inc(phi)
|
|
||||||
- [1.283840957898 +/- 3.23e-13] + [-0.5317843366915 +/- 7.79e-14]*I
|
|
||||||
+ [1.283840957898 +/- 3...e-13] + [-0.5317843366915 +/- 7...e-14]*I
|
|
||||||
sage: phi.elliptic_e()
|
|
||||||
- [1.2838409578982 +/- 5.90e-14] + [-0.5317843366915 +/- 3.35e-14]*I
|
|
||||||
+ [1.2838409578982 +/- 5...e-14] + [-0.5317843366915 +/- 3...e-14]*I
|
|
||||||
|
|
||||||
sage: phi = CBF(2, 3/7)
|
|
||||||
sage: (CBF.pi()/2).elliptic_e_inc(phi)
|
|
||||||
@@ -4312,8 +4313,7 @@ cdef class ComplexBall(RingElement):
|
|
||||||
sage: CBF(10).laguerre_L(3, 2)
|
|
||||||
[-6.666666666667 +/- 4.15e-13]
|
|
||||||
sage: CBF(5,7).laguerre_L(CBF(2,3), CBF(1,-2))
|
|
||||||
- [5515.315030271 +/- 4.37e-10] + [-12386.942845271 +/- 5.47e-10]*I
|
|
||||||
-
|
|
||||||
+ [5515.315030271 +/- 4...e-10] + [-12386.942845271 +/- 5...e-10]*I
|
|
||||||
"""
|
|
||||||
cdef ComplexBall my_n = self._parent.coerce(n)
|
|
||||||
cdef ComplexBall my_m = self._parent.coerce(m)
|
|
||||||
@@ -4357,9 +4357,9 @@ cdef class ComplexBall(RingElement):
|
|
||||||
EXAMPLES::
|
|
||||||
|
|
||||||
sage: CBF(1/2).legendre_P(5)
|
|
||||||
- [0.08984375000000000 +/- 4.5...e-18]
|
|
||||||
+ [0.0898437500000000 +/- 7...e-17]
|
|
||||||
sage: CBF(1,2).legendre_P(CBF(2,3), CBF(0,1))
|
|
||||||
- [0.10996180744364 +/- 7.45e-15] + [0.14312767804055 +/- 8.38e-15]*I
|
|
||||||
+ [0.10996180744364 +/- 7.12e-15] + [0.14312767804055 +/- 8.07e-15]*I
|
|
||||||
sage: CBF(-10).legendre_P(5, 325/100)
|
|
||||||
[-22104403.487377 +/- 6.81e-7] + [53364750.687392 +/- 7.25e-7]*I
|
|
||||||
sage: CBF(-10).legendre_P(5, 325/100, type=3)
|
|
||||||
@@ -4393,9 +4393,9 @@ cdef class ComplexBall(RingElement):
|
|
||||||
sage: CBF(1/2).legendre_Q(5)
|
|
||||||
[0.55508089057168 +/- 2.79e-15]
|
|
||||||
sage: CBF(1,2).legendre_Q(CBF(2,3), CBF(0,1))
|
|
||||||
- [0.167678710 +/- 4.60e-10] + [-0.161558598 +/- 7.47e-10]*I
|
|
||||||
+ [0.167678710 +/- 3.91e-10] + [-0.161558598 +/- 6.77e-10]*I
|
|
||||||
sage: CBF(-10).legendre_Q(5, 325/100)
|
|
||||||
- [-83825154.36008 +/- 4.94e-6] + [-34721515.80396 +/- 5.40e-6]*I
|
|
||||||
+ [-83825154.36008 +/- 5.02e-6] + [-34721515.80396 +/- 5.42e-6]*I
|
|
||||||
sage: CBF(-10).legendre_Q(5, 325/100, type=3)
|
|
||||||
[-4.797306921692e-6 +/- 6.82e-19] + [-4.797306921692e-6 +/- 6.57e-19]*I
|
|
||||||
|
|
||||||
diff --git a/src/sage/rings/polynomial/polynomial_complex_arb.pyx b/src/sage/rings/polynomial/polynomial_complex_arb.pyx
|
|
||||||
index c436d4705b..ef611a566b 100644
|
|
||||||
--- a/src/sage/rings/polynomial/polynomial_complex_arb.pyx
|
|
||||||
+++ b/src/sage/rings/polynomial/polynomial_complex_arb.pyx
|
|
||||||
@@ -543,7 +543,7 @@ cdef class Polynomial_complex_arb(Polynomial):
|
|
||||||
sage: (1 - x/3).inverse_series_trunc(3)
|
|
||||||
([0.1111111111111111 +/- 5.99e-17])*x^2 + ([0.3333333333333333 +/- 7.04e-17])*x + 1.000000000000000
|
|
||||||
sage: x.inverse_series_trunc(1)
|
|
||||||
- [+/- inf]
|
|
||||||
+ nan
|
|
||||||
sage: Pol(0).inverse_series_trunc(2)
|
|
||||||
(nan + nan*I)*x + nan + nan*I
|
|
||||||
|
|
||||||
@@ -671,7 +671,7 @@ cdef class Polynomial_complex_arb(Polynomial):
|
|
||||||
sage: pol._sqrt_series(2)
|
|
||||||
([+/- 7.51e-3] + [+/- 0.501]*I)*x + [+/- 5.01e-3] + [+/- 1.01]*I
|
|
||||||
sage: x._sqrt_series(2)
|
|
||||||
- ([+/- inf] + [+/- inf]*I)*x
|
|
||||||
+ (nan + nan*I)*x
|
|
||||||
"""
|
|
||||||
cdef Polynomial_complex_arb res = self._new()
|
|
||||||
if n < 0:
|
|
||||||
diff --git a/src/sage/rings/real_arb.pyx b/src/sage/rings/real_arb.pyx
|
|
||||||
index c9f68e38d7..76e3037a9a 100644
|
|
||||||
--- a/src/sage/rings/real_arb.pyx
|
|
||||||
+++ b/src/sage/rings/real_arb.pyx
|
|
||||||
@@ -161,7 +161,7 @@ values and should be preferred::
|
|
||||||
|
|
||||||
sage: RBF(NaN) < RBF(infinity)
|
|
||||||
False
|
|
||||||
- sage: 1/RBF(0) <= RBF(infinity)
|
|
||||||
+ sage: RBF(0).add_error(infinity) <= RBF(infinity)
|
|
||||||
True
|
|
||||||
|
|
||||||
TESTS::
|
|
||||||
@@ -252,6 +252,8 @@ cdef void mpfi_to_arb(arb_t target, const mpfi_t source, const long precision):
|
|
||||||
(+infinity, +infinity)
|
|
||||||
sage: RBF(RIF(-infinity)).endpoints()
|
|
||||||
(-infinity, -infinity)
|
|
||||||
+ sage: RBF(RIF(-infinity, infinity)).endpoints()
|
|
||||||
+ (-infinity, +infinity)
|
|
||||||
sage: RIF(RBF(infinity)).endpoints()
|
|
||||||
(+infinity, +infinity)
|
|
||||||
sage: RIF(RBF(-infinity)).endpoints()
|
|
||||||
@@ -266,10 +268,11 @@ cdef void mpfi_to_arb(arb_t target, const mpfi_t source, const long precision):
|
|
||||||
if _do_sig(precision): sig_on()
|
|
||||||
mpfi_get_left(left, source)
|
|
||||||
mpfi_get_right(right, source)
|
|
||||||
- arb_set_interval_mpfr(target, left, right, precision)
|
|
||||||
- # Work around weakness of arb_set_interval_mpfr(tgt, inf, inf)
|
|
||||||
- if mpfr_equal_p(left, right):
|
|
||||||
- mag_zero(arb_radref(target))
|
|
||||||
+ if mpfr_inf_p(left) and mpfr_inf_p(right) and mpfr_sgn(left) < 0 < mpfr_sgn(right):
|
|
||||||
+ # Work around a weakness of arb_set_interval_mpfr(tgt, -inf, inf)
|
|
||||||
+ arb_zero_pm_inf(target)
|
|
||||||
+ else:
|
|
||||||
+ arb_set_interval_mpfr(target, left, right, precision)
|
|
||||||
if _do_sig(precision): sig_off()
|
|
||||||
|
|
||||||
mpfr_clear(left)
|
|
||||||
@@ -649,17 +652,15 @@ class RealBallField(UniqueRepresentation, Field):
|
|
||||||
EXAMPLES::
|
|
||||||
|
|
||||||
sage: RBF.some_elements()
|
|
||||||
- [1.000000000000000,
|
|
||||||
- [0.3333333333333333 +/- 7.04e-17],
|
|
||||||
+ [0, 1.000000000000000, [0.3333333333333333 +/- 7.04e-17],
|
|
||||||
[-4.733045976388941e+363922934236666733021124 +/- 3.46e+363922934236666733021108],
|
|
||||||
- [+/- inf],
|
|
||||||
- [+/- inf],
|
|
||||||
- nan]
|
|
||||||
+ [+/- inf], [+/- inf], [+/- inf], nan]
|
|
||||||
"""
|
|
||||||
import sage.symbolic.constants
|
|
||||||
- return [self(1), self(1)/3,
|
|
||||||
+ inf = self(sage.rings.infinity.Infinity)
|
|
||||||
+ return [self(0), self(1), self(1)/3,
|
|
||||||
-self(2)**(Integer(2)**80),
|
|
||||||
- self(sage.rings.infinity.Infinity), ~self(0),
|
|
||||||
+ inf, -inf, self.zero().add_error(inf),
|
|
||||||
self.element_class(self, sage.symbolic.constants.NotANumber())]
|
|
||||||
|
|
||||||
def _sum_of_products(self, terms):
|
|
||||||
@@ -881,7 +882,7 @@ class RealBallField(UniqueRepresentation, Field):
|
|
||||||
sage: RBF.gamma(5)
|
|
||||||
24.00000000000000
|
|
||||||
sage: RBF.gamma(10**20)
|
|
||||||
- [+/- 5.92e+1956570551809674821757]
|
|
||||||
+ [+/- 5.50e+1956570552410610660600]
|
|
||||||
sage: RBF.gamma(1/3)
|
|
||||||
[2.678938534707747 +/- 8.99e-16]
|
|
||||||
sage: RBF.gamma(-5)
|
|
||||||
@@ -2247,7 +2248,7 @@ cdef class RealBall(RingElement):
|
|
||||||
sage: inf = RBF(+infinity)
|
|
||||||
sage: other_inf = RBF(+infinity, 42.r)
|
|
||||||
sage: neg_inf = RBF(-infinity)
|
|
||||||
- sage: extended_line = 1/RBF(0)
|
|
||||||
+ sage: extended_line = RBF(0).add_error(infinity)
|
|
||||||
sage: exact_nan = inf - inf
|
|
||||||
sage: exact_nan.mid(), exact_nan.rad()
|
|
||||||
(NaN, 0.00000000)
|
|
||||||
@@ -2659,7 +2660,7 @@ cdef class RealBall(RingElement):
|
|
||||||
sage: ~RBF(5)
|
|
||||||
[0.2000000000000000 +/- 4.45e-17]
|
|
||||||
sage: ~RBF(0)
|
|
||||||
- [+/- inf]
|
|
||||||
+ nan
|
|
||||||
sage: RBF(RIF(-0.1,0.1))
|
|
||||||
[+/- 0.101]
|
|
||||||
|
|
||||||
@@ -2739,7 +2740,7 @@ cdef class RealBall(RingElement):
|
|
||||||
sage: RBF(pi)/RBF(e)
|
|
||||||
[1.155727349790922 +/- 8.43e-16]
|
|
||||||
sage: RBF(2)/RBF(0)
|
|
||||||
- [+/- inf]
|
|
||||||
+ nan
|
|
||||||
"""
|
|
||||||
cdef RealBall res = self._new()
|
|
||||||
if _do_sig(prec(self)): sig_on()
|
|
||||||
@@ -2765,7 +2766,7 @@ cdef class RealBall(RingElement):
|
|
||||||
sage: RBF(-1)^(1/3)
|
|
||||||
nan
|
|
||||||
sage: RBF(0)^(-1)
|
|
||||||
- [+/- inf]
|
|
||||||
+ nan
|
|
||||||
sage: RBF(-e)**RBF(pi)
|
|
||||||
nan
|
|
||||||
|
|
||||||
@@ -3129,7 +3130,7 @@ cdef class RealBall(RingElement):
|
|
||||||
sage: RBF(1).tan()
|
|
||||||
[1.557407724654902 +/- 3.26e-16]
|
|
||||||
sage: RBF(pi/2).tan()
|
|
||||||
- [+/- inf]
|
|
||||||
+ nan
|
|
||||||
"""
|
|
||||||
cdef RealBall res = self._new()
|
|
||||||
if _do_sig(prec(self)): sig_on()
|
|
||||||
@@ -3146,7 +3147,7 @@ cdef class RealBall(RingElement):
|
|
||||||
sage: RBF(1).cot()
|
|
||||||
[0.642092615934331 +/- 4.79e-16]
|
|
||||||
sage: RBF(pi).cot()
|
|
||||||
- [+/- inf]
|
|
||||||
+ nan
|
|
||||||
"""
|
|
||||||
cdef RealBall res = self._new()
|
|
||||||
if _do_sig(prec(self)): sig_on()
|
|
||||||
@@ -3257,7 +3258,7 @@ cdef class RealBall(RingElement):
|
|
||||||
sage: RBF(1).coth()
|
|
||||||
[1.313035285499331 +/- 4.97e-16]
|
|
||||||
sage: RBF(0).coth()
|
|
||||||
- [+/- inf]
|
|
||||||
+ nan
|
|
||||||
"""
|
|
||||||
cdef RealBall res = self._new()
|
|
||||||
if _do_sig(prec(self)): sig_on()
|
|
@ -0,0 +1,15 @@
|
|||||||
|
diff --git a/build/pkgs/openblas/package-version.txt b/build/pkgs/openblas/package-version.txt
|
||||||
|
index 3bc45c25d4..7c7c224887 100644
|
||||||
|
--- a/src/sage/schemes/elliptic_curves/padics.py
|
||||||
|
+++ b/src/sage/schemes/elliptic_curves/padics.py
|
||||||
|
@@ -292,8 +292,8 @@ def padic_regulator(self, p, prec=20, height=None, check_hypotheses=True):
|
||||||
|
|
||||||
|
sage: max_prec = 30 # make sure we get past p^2 # long time
|
||||||
|
sage: full = E.padic_regulator(5, max_prec) # long time
|
||||||
|
- sage: for prec in range(1, max_prec): # long time
|
||||||
|
- ....: assert E.padic_regulator(5, prec) == full # long time
|
||||||
|
+ sage: for prec in range(1, max_prec): # known bug (#25969) # long time
|
||||||
|
+ ....: assert E.padic_regulator(5, prec) == full # known bug (#25969) # long time
|
||||||
|
|
||||||
|
A case where the generator belongs to the formal group already
|
||||||
|
(:trac:`3632`)::
|
@ -1,48 +0,0 @@
|
|||||||
diff --git a/src/sage/interfaces/maxima_abstract.py b/src/sage/interfaces/maxima_abstract.py
|
|
||||||
index 961c20aaac..3d601d8939 100644
|
|
||||||
--- a/src/sage/interfaces/maxima_abstract.py
|
|
||||||
+++ b/src/sage/interfaces/maxima_abstract.py
|
|
||||||
@@ -1743,7 +1743,7 @@ class MaximaAbstractElement(ExtraTabCompletion, InterfaceElement):
|
|
||||||
sage: y,d = var('y,d')
|
|
||||||
sage: f = function('f')
|
|
||||||
sage: latex(maxima(derivative(f(x*y), x)))
|
|
||||||
- \left(\left.{{{\it \partial}}\over{{\it \partial}\, {\it t_0}}}\,f\left({\it t_0}\right) \right|_{{\it t_0}={\it x}\, {\it y}}\right)\,{\it y}
|
|
||||||
+ \left(\left.{{{\it \partial}}\over{{\it \partial}\, {\it t}_{0}}}\,f\left({\it t}_{0}\right) \right|_{{\it t}_{0}={\it x}\, {\it y}}\right)\,{\it y}
|
|
||||||
sage: latex(maxima(derivative(f(x,y,d), d,x,x,y)))
|
|
||||||
{{{\it \partial}^4}\over{{\it \partial}\,{\it d}\, {\it \partial}\,{\it x}^2\,{\it \partial}\, {\it y}}}\,f\left({\it x} , {\it y} , {\it d}\right)
|
|
||||||
sage: latex(maxima(d/(d-2)))
|
|
||||||
diff --git a/src/sage/manifolds/differentiable/metric.py b/src/sage/manifolds/differentiable/metric.py
|
|
||||||
index 3cd6ad3235..1e18af1a6b 100644
|
|
||||||
--- a/src/sage/manifolds/differentiable/metric.py
|
|
||||||
+++ b/src/sage/manifolds/differentiable/metric.py
|
|
||||||
@@ -993,7 +993,7 @@ class PseudoRiemannianMetric(TensorField):
|
|
||||||
2-dimensional differentiable manifold S^2
|
|
||||||
sage: g.riemann()[:]
|
|
||||||
[[[[0, 0], [0, 0]], [[0, sin(th)^2], [-sin(th)^2, 0]]],
|
|
||||||
- [[[0, (cos(th)^2 - 1)/sin(th)^2], [1, 0]], [[0, 0], [0, 0]]]]
|
|
||||||
+ [[[0, -1], [1, 0]], [[0, 0], [0, 0]]]]
|
|
||||||
|
|
||||||
In dimension 2, the Riemann tensor can be expressed entirely in terms of
|
|
||||||
the Ricci scalar `r`:
|
|
||||||
diff --git a/src/sage/symbolic/expression.pyx b/src/sage/symbolic/expression.pyx
|
|
||||||
index dfb8751467..27402e54ab 100644
|
|
||||||
--- a/src/sage/symbolic/expression.pyx
|
|
||||||
+++ b/src/sage/symbolic/expression.pyx
|
|
||||||
@@ -7154,7 +7154,7 @@ cdef class Expression(CommutativeRingElement):
|
|
||||||
sage: ex = lcm(sin(x)^2 - 1, sin(x)^2 + sin(x)); ex
|
|
||||||
(sin(x)^2 + sin(x))*(sin(x)^2 - 1)/(sin(x) + 1)
|
|
||||||
sage: ex.simplify_full()
|
|
||||||
- -cos(x)^2*sin(x)
|
|
||||||
+ sin(x)^3 - sin(x)
|
|
||||||
|
|
||||||
TESTS:
|
|
||||||
|
|
||||||
@@ -10004,7 +10004,7 @@ cdef class Expression(CommutativeRingElement):
|
|
||||||
|
|
||||||
sage: f=tan(3*x)
|
|
||||||
sage: f.simplify_trig()
|
|
||||||
- (4*cos(x)^2 - 1)*sin(x)/(4*cos(x)^3 - 3*cos(x))
|
|
||||||
+ -(4*cos(x)^2 - 1)*sin(x)/(4*cos(x)*sin(x)^2 - cos(x))
|
|
||||||
sage: f.simplify_trig(False)
|
|
||||||
sin(3*x)/cos(3*x)
|
|
||||||
|
|
@ -0,0 +1,18 @@
|
|||||||
|
diff --git a/src/sage/libs/pari/__init__.py b/src/sage/libs/pari/__init__.py
|
||||||
|
index e451766474..77eda66097 100644
|
||||||
|
--- a/src/sage/libs/pari/__init__.py
|
||||||
|
+++ b/src/sage/libs/pari/__init__.py
|
||||||
|
@@ -205,6 +205,13 @@ def _get_pari_instance():
|
||||||
|
# messages in Sage.
|
||||||
|
P.default("debugmem", 0)
|
||||||
|
|
||||||
|
+ # Make sure pari doesn't use threads, regardless of how it was compiled.
|
||||||
|
+ # Threads cause some doctest failures (memory issues). Those could probably
|
||||||
|
+ # be solved without disabling threads. But that would require figuring out
|
||||||
|
+ # some sensible values for `threadsizemax`. See
|
||||||
|
+ # https://pari.math.u-bordeaux.fr/dochtml/html/GP_defaults.html
|
||||||
|
+ P.default("nbthreads", 1)
|
||||||
|
+
|
||||||
|
return P
|
||||||
|
|
||||||
|
pari = _get_pari_instance()
|
@ -1,479 +0,0 @@
|
|||||||
diff --git a/src/sage/calculus/calculus.py b/src/sage/calculus/calculus.py
|
|
||||||
index 3a417d9d5c..fadaadbaf6 100644
|
|
||||||
--- a/src/sage/calculus/calculus.py
|
|
||||||
+++ b/src/sage/calculus/calculus.py
|
|
||||||
@@ -231,7 +231,7 @@ Another example::
|
|
||||||
sage: f(x=3)
|
|
||||||
arcsinh(1)
|
|
||||||
sage: f.derivative(x)
|
|
||||||
- 1/3/sqrt(1/9*x^2 + 1)
|
|
||||||
+ 1/sqrt(x^2 + 9)
|
|
||||||
|
|
||||||
We compute the length of the parabola from 0 to 2::
|
|
||||||
|
|
||||||
@@ -1509,8 +1509,8 @@ def laplace(ex, t, s, algorithm='maxima'):
|
|
||||||
Testing SymPy::
|
|
||||||
|
|
||||||
sage: laplace(t^n, t, s, algorithm='sympy')
|
|
||||||
- (s^(-n)*gamma(n + 1)/s, 0, -re(n) < 1)
|
|
||||||
-
|
|
||||||
+ (gamma(n + 1)/(s*s^n), 0, -re(n) < 1)
|
|
||||||
+
|
|
||||||
Testing Maxima::
|
|
||||||
|
|
||||||
sage: laplace(t^n, t, s, algorithm='maxima')
|
|
||||||
diff --git a/src/sage/functions/hypergeometric.py b/src/sage/functions/hypergeometric.py
|
|
||||||
index 1fc2db5c94..f3e49b9cdb 100644
|
|
||||||
--- a/src/sage/functions/hypergeometric.py
|
|
||||||
+++ b/src/sage/functions/hypergeometric.py
|
|
||||||
@@ -34,7 +34,7 @@ Simplification (note that ``simplify_full`` does not yet call
|
|
||||||
sage: a.simplify_hypergeometric()
|
|
||||||
1/((-e^x + 1)^e^x)
|
|
||||||
sage: a.simplify_hypergeometric(algorithm='sage')
|
|
||||||
- (-e^x + 1)^(-e^x)
|
|
||||||
+ 1/((-e^x + 1)^e^x)
|
|
||||||
|
|
||||||
Equality testing::
|
|
||||||
|
|
||||||
@@ -145,7 +145,7 @@ Series expansions of confluent hypergeometric functions::
|
|
||||||
|
|
||||||
sage: hypergeometric_M(2, 2, x).series(x, 3)
|
|
||||||
1 + 1*x + 1/2*x^2 + Order(x^3)
|
|
||||||
- sage: hypergeometric_U(2, 2, x).series(x == 3, 100).subs(x=1).n()
|
|
||||||
+ sage: hypergeometric_U(2, 2, x).series(x == 3, 100).subs(x=1).n() # known bug (see :trac:`25688`)
|
|
||||||
0.403652637676806
|
|
||||||
sage: hypergeometric_U(2, 2, 1).n()
|
|
||||||
0.403652637676806
|
|
||||||
@@ -773,7 +773,7 @@ def closed_form(hyp):
|
|
||||||
sage: closed_form(hypergeometric([], [], z))
|
|
||||||
e^z
|
|
||||||
sage: closed_form(hypergeometric([a], [], z))
|
|
||||||
- (-z + 1)^(-a)
|
|
||||||
+ 1/((-z + 1)^a)
|
|
||||||
sage: closed_form(hypergeometric([1, 1, 2], [1, 1], z))
|
|
||||||
(z - 1)^(-2)
|
|
||||||
sage: closed_form(hypergeometric([2, 3], [1], x))
|
|
||||||
@@ -1121,7 +1121,7 @@ class Hypergeometric_U(BuiltinFunction):
|
|
||||||
sage: var('a b z')
|
|
||||||
(a, b, z)
|
|
||||||
sage: hypergeometric_U(a, b, z).generalized()
|
|
||||||
- z^(-a)*hypergeometric((a, a - b + 1), (), -1/z)
|
|
||||||
+ hypergeometric((a, a - b + 1), (), -1/z)/z^a
|
|
||||||
sage: hypergeometric_U(1, 3, 1/2).generalized()
|
|
||||||
2*hypergeometric((1, -1), (), -2)
|
|
||||||
sage: hypergeometric_U(3, I, 2).generalized()
|
|
||||||
diff --git a/src/sage/functions/log.py b/src/sage/functions/log.py
|
|
||||||
index 75d1bf8060..61968582af 100644
|
|
||||||
--- a/src/sage/functions/log.py
|
|
||||||
+++ b/src/sage/functions/log.py
|
|
||||||
@@ -518,17 +518,17 @@ class Function_polylog(GinacFunction):
|
|
||||||
|
|
||||||
sage: BF = RealBallField(100)
|
|
||||||
sage: polylog(2, BF(1/3))
|
|
||||||
- [0.36621322997706348761674629766 +/- 4.51e-30]
|
|
||||||
+ [0.36621322997706348761674629766... +/- ...]
|
|
||||||
sage: polylog(2, BF(4/3))
|
|
||||||
- nan
|
|
||||||
+ [2.27001825336107090380391448586 +/- 5.64e-30] + [-0.90377988538400159956755721265 +/- 8.39e-30]*I
|
|
||||||
sage: parent(_)
|
|
||||||
- Real ball field with 100 bits of precision
|
|
||||||
+ Complex ball field with 100 bits of precision
|
|
||||||
sage: polylog(2, CBF(1/3))
|
|
||||||
- [0.366213229977063 +/- 5.85e-16]
|
|
||||||
+ [0.366213229977063 +/- ...]
|
|
||||||
sage: parent(_)
|
|
||||||
Complex ball field with 53 bits of precision
|
|
||||||
sage: polylog(2, CBF(1))
|
|
||||||
- [1.644934066848226 +/- 6.59e-16]
|
|
||||||
+ [1.644934066848226 +/- ...]
|
|
||||||
sage: parent(_)
|
|
||||||
Complex ball field with 53 bits of precision
|
|
||||||
"""
|
|
||||||
diff --git a/src/sage/functions/trig.py b/src/sage/functions/trig.py
|
|
||||||
index e7e7a311cd..1f2926d6c9 100644
|
|
||||||
--- a/src/sage/functions/trig.py
|
|
||||||
+++ b/src/sage/functions/trig.py
|
|
||||||
@@ -529,13 +529,8 @@ class Function_arcsin(GinacFunction):
|
|
||||||
arcsin
|
|
||||||
sage: asin(complex(1,1))
|
|
||||||
(0.6662394324925152+1.0612750619050357j)
|
|
||||||
-
|
|
||||||
- Check that :trac:`22823` is fixed::
|
|
||||||
-
|
|
||||||
- sage: bool(asin(SR(2.1)) == NaN)
|
|
||||||
- True
|
|
||||||
- sage: asin(SR(2.1)).is_real()
|
|
||||||
- False
|
|
||||||
+ sage: asin(SR(2.1))
|
|
||||||
+ 1.57079632679490 - 1.37285914424258*I
|
|
||||||
"""
|
|
||||||
GinacFunction.__init__(self, 'arcsin', latex_name=r"\arcsin",
|
|
||||||
conversions=dict(maxima='asin', sympy='asin', fricas="asin", giac="asin"))
|
|
||||||
@@ -595,13 +590,8 @@ class Function_arccos(GinacFunction):
|
|
||||||
arccos
|
|
||||||
sage: acos(complex(1,1))
|
|
||||||
(0.9045568943023814-1.0612750619050357j)
|
|
||||||
-
|
|
||||||
- Check that :trac:`22823` is fixed::
|
|
||||||
-
|
|
||||||
- sage: bool(acos(SR(2.1)) == NaN)
|
|
||||||
- True
|
|
||||||
- sage: acos(SR(2.1)).is_real()
|
|
||||||
- False
|
|
||||||
+ sage: acos(SR(2.1))
|
|
||||||
+ 1.37285914424258*I
|
|
||||||
"""
|
|
||||||
GinacFunction.__init__(self, 'arccos', latex_name=r"\arccos",
|
|
||||||
conversions=dict(maxima='acos', sympy='acos', fricas='acos', giac='acos'))
|
|
||||||
@@ -807,7 +797,7 @@ class Function_arcsec(GinacFunction):
|
|
||||||
sage: arcsec(2).n(100)
|
|
||||||
1.0471975511965977461542144611
|
|
||||||
sage: arcsec(1/2).n(100)
|
|
||||||
- NaN
|
|
||||||
+ 1.3169578969248167086250463473*I
|
|
||||||
sage: RDF(arcsec(2)) # abs tol 1e-15
|
|
||||||
1.0471975511965976
|
|
||||||
sage: arcsec(1 + I)
|
|
||||||
@@ -958,7 +948,9 @@ class Function_arctan2(GinacFunction):
|
|
||||||
sage: atan2(0,0,hold=True)
|
|
||||||
arctan2(0, 0)
|
|
||||||
sage: atan2(0,0,hold=True).n()
|
|
||||||
- NaN
|
|
||||||
+ Traceback (most recent call last):
|
|
||||||
+ ...
|
|
||||||
+ RuntimeError: atan2(): division by zero
|
|
||||||
|
|
||||||
Check if :trac:`10062` is fixed, this was caused by
|
|
||||||
``(I*I).is_positive()`` returning ``True``::
|
|
||||||
diff --git a/src/sage/geometry/hyperbolic_space/hyperbolic_geodesic.py b/src/sage/geometry/hyperbolic_space/hyperbolic_geodesic.py
|
|
||||||
index 3b5c8d1729..1c6b73a16c 100644
|
|
||||||
--- a/src/sage/geometry/hyperbolic_space/hyperbolic_geodesic.py
|
|
||||||
+++ b/src/sage/geometry/hyperbolic_space/hyperbolic_geodesic.py
|
|
||||||
@@ -1422,8 +1422,10 @@ class HyperbolicGeodesicUHP(HyperbolicGeodesic):
|
|
||||||
expressions do not generate runtime errors. ::
|
|
||||||
|
|
||||||
sage: g=HyperbolicPlane().UHP().get_geodesic(-1+I,1+I)
|
|
||||||
- sage: g.midpoint()
|
|
||||||
- Point in UHP 1/2*(sqrt(2)*e^(1/2*arccosh(3)) - sqrt(2) + (I - 1)*e^(1/2*arccosh(3)) + I - 1)/((1/4*I - 1/4)*sqrt(2)*e^(1/2*arccosh(3)) - (1/4*I - 1/4)*sqrt(2) + 1/2*e^(1/2*arccosh(3)) + 1/2)
|
|
||||||
+ sage: point = g.midpoint(); point
|
|
||||||
+ Point in UHP -1/2*(sqrt(2)*...
|
|
||||||
+ sage: QQbar(point.coordinates()).radical_expression()
|
|
||||||
+ I*sqrt(2)
|
|
||||||
|
|
||||||
Check that floating points remain floating points
|
|
||||||
in :meth:`midpoint` ::
|
|
||||||
diff --git a/src/sage/interfaces/fricas.py b/src/sage/interfaces/fricas.py
|
|
||||||
index 82aae78e37..8501ea2a18 100644
|
|
||||||
--- a/src/sage/interfaces/fricas.py
|
|
||||||
+++ b/src/sage/interfaces/fricas.py
|
|
||||||
@@ -1084,14 +1084,14 @@ class FriCASElement(ExpectElement):
|
|
||||||
0.451026811796262,
|
|
||||||
0.732815101786507,
|
|
||||||
0.837981225008390,
|
|
||||||
- NaN,
|
|
||||||
- NaN,
|
|
||||||
+ 1.57079632679490 - 0.467145308103262*I,
|
|
||||||
+ 0.467145308103262*I,
|
|
||||||
1.11976951499863,
|
|
||||||
0.451026811796262,
|
|
||||||
0.732815101786507,
|
|
||||||
0.837981225008390,
|
|
||||||
- NaN,
|
|
||||||
- NaN]
|
|
||||||
+ 1.57079632679490 - 0.467145308103262*I,
|
|
||||||
+ 0.467145308103262*I]
|
|
||||||
sage: l = [tanh, sinh, cosh, coth, sech, csch, asinh, acosh, atanh, acoth, asech, acsch, arcsinh, arccosh, arctanh, arccoth, arcsech, arccsch]
|
|
||||||
sage: [f(x)._fricas_().sage().subs(x=0.9) for f in l] # optional - fricas
|
|
||||||
[0.716297870199024,
|
|
||||||
diff --git a/src/sage/libs/pynac/pynac.pyx b/src/sage/libs/pynac/pynac.pyx
|
|
||||||
index 9e9d8f664b..e3406f007e 100644
|
|
||||||
--- a/src/sage/libs/pynac/pynac.pyx
|
|
||||||
+++ b/src/sage/libs/pynac/pynac.pyx
|
|
||||||
@@ -1824,7 +1824,7 @@ cdef py_atan2(x, y):
|
|
||||||
sage: atan2(CC(I), CC(I+1))
|
|
||||||
0.553574358897045 + 0.402359478108525*I
|
|
||||||
sage: atan2(CBF(I), CBF(I+1))
|
|
||||||
- [0.55357435889705 +/- 5.58e-15] + [0.402359478108525 +/- 7.11e-16]*I
|
|
||||||
+ [0.55357435889705 +/- ...] + [0.402359478108525 +/- ...]*I
|
|
||||||
|
|
||||||
Check that :trac:`23776` is fixed and RDF input gives real output::
|
|
||||||
|
|
||||||
diff --git a/src/sage/matrix/matrix_symbolic_dense.pyx b/src/sage/matrix/matrix_symbolic_dense.pyx
|
|
||||||
index 46a15e53eb..7a0beb437b 100644
|
|
||||||
--- a/src/sage/matrix/matrix_symbolic_dense.pyx
|
|
||||||
+++ b/src/sage/matrix/matrix_symbolic_dense.pyx
|
|
||||||
@@ -200,7 +200,7 @@ cdef class Matrix_symbolic_dense(Matrix_generic_dense):
|
|
||||||
sage: eval, [evec], mult = es[0]
|
|
||||||
sage: delta = eval*evec - evec*A
|
|
||||||
sage: abs(abs(delta)) < 1e-10
|
|
||||||
- sqrt(9/25*((2*sqrt(6) - 3)*(sqrt(6) - 2) + 7*sqrt(6) - 18)^2 + 9/25*((sqrt(6) - 2)*(sqrt(6) - 4) + 6*sqrt(6) - 14)^2) < (1.00000000000000e-10)
|
|
||||||
+ 3/5*sqrt(((2*sqrt(6) - 3)*(sqrt(6) - 2) + 7*sqrt(6) - 18)^2 + ((sqrt(6) - 2)*(sqrt(6) - 4) + 6*sqrt(6) - 14)^2) < (1.00000000000000e-10)
|
|
||||||
sage: abs(abs(delta)).n() < 1e-10
|
|
||||||
True
|
|
||||||
|
|
||||||
diff --git a/src/sage/modules/matrix_morphism.py b/src/sage/modules/matrix_morphism.py
|
|
||||||
index 17a1d6e290..03892ceec0 100644
|
|
||||||
--- a/src/sage/modules/matrix_morphism.py
|
|
||||||
+++ b/src/sage/modules/matrix_morphism.py
|
|
||||||
@@ -214,9 +214,9 @@ class MatrixMorphism_abstract(sage.categories.morphism.Morphism):
|
|
||||||
sage: f((1, 0))
|
|
||||||
Traceback (most recent call last):
|
|
||||||
...
|
|
||||||
- TypeError: Unable to coerce entries (=[1.00000000000000*I, 0.000000000000000]) to coefficients in Real Field with 53 bits of precision
|
|
||||||
+ TypeError: Unable to coerce entries (=[1.00000000000000*I, 0]) to coefficients in Real Field with 53 bits of precision
|
|
||||||
sage: f((1, 0), coerce=False)
|
|
||||||
- (1.00000000000000*I, 0.000000000000000)
|
|
||||||
+ (1.00000000000000*I, 0)
|
|
||||||
|
|
||||||
"""
|
|
||||||
if self.domain().is_ambient():
|
|
||||||
diff --git a/src/sage/plot/plot.py b/src/sage/plot/plot.py
|
|
||||||
index 77cdeb8c46..e501e74036 100644
|
|
||||||
--- a/src/sage/plot/plot.py
|
|
||||||
+++ b/src/sage/plot/plot.py
|
|
||||||
@@ -2061,7 +2061,7 @@ def _plot(funcs, xrange, parametric=False,
|
|
||||||
plot properly (:trac:`13246`)::
|
|
||||||
|
|
||||||
sage: parametric_plot((x, arcsec(x)), (x, -2, 2))
|
|
||||||
- Graphics object consisting of 1 graphics primitive
|
|
||||||
+ Graphics object consisting of 2 graphics primitives
|
|
||||||
|
|
||||||
"""
|
|
||||||
from sage.plot.colors import Color
|
|
||||||
diff --git a/src/sage/repl/display/formatter.py b/src/sage/repl/display/formatter.py
|
|
||||||
index 8ce2e839d7..948207c95e 100644
|
|
||||||
--- a/src/sage/repl/display/formatter.py
|
|
||||||
+++ b/src/sage/repl/display/formatter.py
|
|
||||||
@@ -25,11 +25,11 @@ generally, all sage expression as an ASCII art object::
|
|
||||||
sage: shell = get_test_shell()
|
|
||||||
sage: shell.run_cell('%display ascii_art')
|
|
||||||
sage: shell.run_cell('integral(x^2/pi^x, x)')
|
|
||||||
- / 2 2 \ -x*log(pi)
|
|
||||||
- -\x *log (pi) + 2*x*log(pi) + 2/*e
|
|
||||||
- ---------------------------------------------
|
|
||||||
- 3
|
|
||||||
- log (pi)
|
|
||||||
+ -x / 2 2 \
|
|
||||||
+ -pi *\x *log (pi) + 2*x*log(pi) + 2/
|
|
||||||
+ --------------------------------------
|
|
||||||
+ 3
|
|
||||||
+ log (pi)
|
|
||||||
sage: shell.run_cell("i = var('i')")
|
|
||||||
sage: shell.run_cell('sum(i*x^i, i, 0, 10)')
|
|
||||||
10 9 8 7 6 5 4 3 2
|
|
||||||
diff --git a/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py b/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
|
|
||||||
index d8ebbf4f76..8c60f65e99 100644
|
|
||||||
--- a/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
|
|
||||||
+++ b/src/sage/rings/asymptotic/asymptotics_multivariate_generating_functions.py
|
|
||||||
@@ -151,8 +151,8 @@ A multiple point example (Example 6.5 of [RaWi2012]_)::
|
|
||||||
[(x + 2*y - 1, 1), (2*x + y - 1, 1)])
|
|
||||||
sage: F1 = decomp[1]
|
|
||||||
sage: F1.asymptotics(p, alpha, 2)
|
|
||||||
- (-3*((2*a^2 - 5*a*b + 2*b^2)*r^2 + (a + b)*r + 3)*((1/3)^(-a)*(1/3)^(-b))^r,
|
|
||||||
- (1/3)^(-a)*(1/3)^(-b), -3*(2*a^2 - 5*a*b + 2*b^2)*r^2 - 3*(a + b)*r - 9)
|
|
||||||
+ (-3*((2*a^2 - 5*a*b + 2*b^2)*r^2 + (a + b)*r + 3)*(1/((1/3)^a*(1/3)^b))^r,
|
|
||||||
+ 1/((1/3)^a*(1/3)^b), -3*(2*a^2 - 5*a*b + 2*b^2)*r^2 - 3*(a + b)*r - 9)
|
|
||||||
sage: alpha = [4, 3]
|
|
||||||
sage: decomp = F.asymptotic_decomposition(alpha)
|
|
||||||
sage: F1 = decomp[1]
|
|
||||||
@@ -2159,7 +2159,7 @@ class FractionWithFactoredDenominator(RingElement):
|
|
||||||
sage: p = {x: 1/3, y: 1/3}
|
|
||||||
sage: alpha = (var('a'), var('b'))
|
|
||||||
sage: F.asymptotics_multiple(p, alpha, 2, var('r')) # long time
|
|
||||||
- (3*((1/3)^(-a)*(1/3)^(-b))^r*e^(2/3), (1/3)^(-a)*(1/3)^(-b), 3*e^(2/3))
|
|
||||||
+ (3*(1/((1/3)^a*(1/3)^b))^r*e^(2/3), 1/((1/3)^a*(1/3)^b), 3*e^(2/3))
|
|
||||||
"""
|
|
||||||
from itertools import product
|
|
||||||
from sage.calculus.functions import jacobian
|
|
||||||
diff --git a/src/sage/stats/basic_stats.py b/src/sage/stats/basic_stats.py
|
|
||||||
index 16a268a02c..5fd244e93b 100644
|
|
||||||
--- a/src/sage/stats/basic_stats.py
|
|
||||||
+++ b/src/sage/stats/basic_stats.py
|
|
||||||
@@ -183,7 +183,7 @@ def std(v, bias=False):
|
|
||||||
sage: std([])
|
|
||||||
NaN
|
|
||||||
sage: std([I, sqrt(2), 3/5])
|
|
||||||
- sqrt(1/450*(10*sqrt(2) - 5*I - 3)^2 + 1/450*(5*sqrt(2) - 10*I + 3)^2 + 1/450*(5*sqrt(2) + 5*I - 6)^2)
|
|
||||||
+ 1/15*sqrt(1/2)*sqrt((10*sqrt(2) - 5*I - 3)^2 + (5*sqrt(2) - 10*I + 3)^2 + (5*sqrt(2) + 5*I - 6)^2)
|
|
||||||
sage: std([RIF(1.0103, 1.0103), RIF(2)])
|
|
||||||
0.6998235813403261?
|
|
||||||
sage: import numpy
|
|
||||||
diff --git a/src/sage/symbolic/expression.pyx b/src/sage/symbolic/expression.pyx
|
|
||||||
index ab4c05de3a..60f0dc549a 100644
|
|
||||||
--- a/src/sage/symbolic/expression.pyx
|
|
||||||
+++ b/src/sage/symbolic/expression.pyx
|
|
||||||
@@ -622,7 +622,7 @@ cdef class Expression(CommutativeRingElement):
|
|
||||||
sage: x^(-5)
|
|
||||||
x^(-5)
|
|
||||||
sage: x^(-y)
|
|
||||||
- x^(-y)
|
|
||||||
+ 1/(x^y)
|
|
||||||
sage: 2*x^(-1)
|
|
||||||
2/x
|
|
||||||
sage: i*x
|
|
||||||
@@ -3621,14 +3621,14 @@ cdef class Expression(CommutativeRingElement):
|
|
||||||
sage: repl_dict = {b_0: b_0, b_3: b_1, b_2: b_3, b_1: b_2}
|
|
||||||
sage: P = precomp.substitute(repl_dict)
|
|
||||||
sage: P.expand()
|
|
||||||
- -2^(-b_0)*2^(-b_2)*2^b_3 - 2^b_0*2^(-b_2)*2^b_3 -
|
|
||||||
- 2^(-b_0)*2^b_2*2^b_3 + 2^b_0*2^b_2*2^b_3 - 2*2^(-b_0)*2^(-b_2)
|
|
||||||
- - 2*2^b_0*2^(-b_2) - 2*2^(-b_0)*2^b_2 + 2*2^b_0*2^b_2 +
|
|
||||||
- 2^(-b_0)*2^b_3 + 2^b_0*2^b_3 + 2^(-b_2)*2^b_3 + 2^b_2*2^b_3 +
|
|
||||||
- 2*2^(-b_0) + 2*2^b_0 + 2*2^(-b_2) + 2*2^b_2 - 9*2^b_3 -
|
|
||||||
- 2^(-b_0)*2^(-b_2)/2^b_3 - 2^b_0*2^(-b_2)/2^b_3 -
|
|
||||||
- 2^(-b_0)*2^b_2/2^b_3 + 2^b_0*2^b_2/2^b_3 + 2^(-b_0)/2^b_3 +
|
|
||||||
- 2^b_0/2^b_3 + 2^(-b_2)/2^b_3 + 2^b_2/2^b_3 - 9/2^b_3 - 18
|
|
||||||
+ 2^b_0*2^b_2*2^b_3 + 2*2^b_0*2^b_2 + 2^b_0*2^b_3 + 2^b_2*2^b_3 +
|
|
||||||
+ 2*2^b_0 + 2*2^b_2 - 9*2^b_3 + 2^b_0*2^b_2/2^b_3 -
|
|
||||||
+ 2^b_0*2^b_3/2^b_2 - 2^b_2*2^b_3/2^b_0 - 2*2^b_0/2^b_2 -
|
|
||||||
+ 2*2^b_2/2^b_0 + 2^b_0/2^b_3 + 2^b_2/2^b_3 + 2^b_3/2^b_0 +
|
|
||||||
+ 2^b_3/2^b_2 + 2/2^b_0 + 2/2^b_2 - 2^b_0/(2^b_2*2^b_3) -
|
|
||||||
+ 2^b_2/(2^b_0*2^b_3) - 9/2^b_3 - 2^b_3/(2^b_0*2^b_2) -
|
|
||||||
+ 2/(2^b_0*2^b_2) + 1/(2^b_0*2^b_3) + 1/(2^b_2*2^b_3) -
|
|
||||||
+ 1/(2^b_0*2^b_2*2^b_3) - 18
|
|
||||||
|
|
||||||
sage: _0,b_1,b_2=var('b_0,b_1,b_2')
|
|
||||||
sage: f = 1/27*b_2^2/(2^b_2)^2 + 1/27*b_1^2/(2^b_1)^2 + \
|
|
||||||
@@ -3809,7 +3809,7 @@ cdef class Expression(CommutativeRingElement):
|
|
||||||
|
|
||||||
sage: x = SR.symbol('x', domain='real')
|
|
||||||
sage: (x^3)^(1/3)
|
|
||||||
- (x^3)^(1/3)
|
|
||||||
+ x
|
|
||||||
sage: (x^4)^(1/4)
|
|
||||||
abs(x)
|
|
||||||
sage: (x^8)^(1/4)
|
|
||||||
@@ -3872,7 +3872,7 @@ cdef class Expression(CommutativeRingElement):
|
|
||||||
sage: 2^(x/log(2))
|
|
||||||
e^x
|
|
||||||
sage: 2^(-x^2/2/log(2))
|
|
||||||
- e^(-1/2*x^2)
|
|
||||||
+ 1/e^(1/2*x^2)
|
|
||||||
sage: x^(x/log(x))
|
|
||||||
x^(x/log(x))
|
|
||||||
sage: assume(x > 0)
|
|
||||||
@@ -4816,18 +4816,24 @@ cdef class Expression(CommutativeRingElement):
|
|
||||||
sage: ((x+y)^(x+y)).match(w0^w0)
|
|
||||||
{$0: x + y}
|
|
||||||
sage: t = ((a+b)*(a+c)).match((a+w0)*(a+w1))
|
|
||||||
- sage: t[w0], t[w1]
|
|
||||||
- (c, b)
|
|
||||||
+ sage: set([t[w0], t[w1]]) == set([b, c])
|
|
||||||
+ True
|
|
||||||
sage: ((a+b)*(a+c)).match((w0+b)*(w0+c))
|
|
||||||
{$0: a}
|
|
||||||
sage: t = ((a+b)*(a+c)).match((w0+w1)*(w0+w2))
|
|
||||||
- sage: t[w0], t[w1], t[w2]
|
|
||||||
- (a, c, b)
|
|
||||||
- sage: print(((a+b)*(a+c)).match((w0+w1)*(w1+w2)))
|
|
||||||
- None
|
|
||||||
+ sage: t[w0]
|
|
||||||
+ a
|
|
||||||
+ sage: set([t[w1], t[w2]]) == set([b, c])
|
|
||||||
+ True
|
|
||||||
+ sage: t = ((a+b)*(a+c)).match((w0+w1)*(w1+w2))
|
|
||||||
+ sage: t[w1]
|
|
||||||
+ a
|
|
||||||
+ sage: set([t[w0], t[w2]]) == set([b, c])
|
|
||||||
+ True
|
|
||||||
sage: t = (a*(x+y)+a*z+b).match(a*w0+w1)
|
|
||||||
- sage: t[w0], t[w1]
|
|
||||||
- (x + y, a*z + b)
|
|
||||||
+ sage: s = set([t[w0], t[w1]])
|
|
||||||
+ sage: s == set([x+y, a*z+b]) or s == set([z, a*(x+y)+b])
|
|
||||||
+ True
|
|
||||||
sage: print((a+b+c+d+f+g).match(c))
|
|
||||||
None
|
|
||||||
sage: (a+b+c+d+f+g).has(c)
|
|
||||||
@@ -4836,7 +4842,7 @@ cdef class Expression(CommutativeRingElement):
|
|
||||||
{$0: a + b + d + f + g}
|
|
||||||
sage: (a+b+c+d+f+g).match(c+g+w0)
|
|
||||||
{$0: a + b + d + f}
|
|
||||||
- sage: (a+b).match(a+b+w0)
|
|
||||||
+ sage: (a+b).match(a+b+w0) # known bug
|
|
||||||
{$0: 0}
|
|
||||||
sage: print((a*b^2).match(a^w0*b^w1))
|
|
||||||
None
|
|
||||||
@@ -5009,7 +5015,7 @@ cdef class Expression(CommutativeRingElement):
|
|
||||||
a^3 + b^3 + (x + y)^3
|
|
||||||
|
|
||||||
sage: t.subs(w0 == w0^2)
|
|
||||||
- (x^2 + y^2)^18 + a^16 + b^16
|
|
||||||
+ a^8 + b^8 + (x^2 + y^2)^6
|
|
||||||
|
|
||||||
sage: t.subs(a == b, b == c)
|
|
||||||
(x + y)^3 + b^2 + c^2
|
|
||||||
@@ -8392,9 +8398,13 @@ cdef class Expression(CommutativeRingElement):
|
|
||||||
sage: SR(I).arctan2(1)
|
|
||||||
arctan2(I, 1)
|
|
||||||
sage: SR(CDF(0,1)).arctan2(1)
|
|
||||||
- NaN + +infinity*I
|
|
||||||
- sage: SR(1).arctan2(CDF(0,1)) # known bug
|
|
||||||
- 0.7853981633974484 - 19.012501686914433*I
|
|
||||||
+ Traceback (most recent call last):
|
|
||||||
+ ...
|
|
||||||
+ ValueError: power::eval(): division by zero
|
|
||||||
+ sage: SR(1).arctan2(CDF(0,1))
|
|
||||||
+ Traceback (most recent call last):
|
|
||||||
+ ...
|
|
||||||
+ ValueError: power::eval(): division by zero
|
|
||||||
|
|
||||||
sage: arctan2(0,oo)
|
|
||||||
0
|
|
||||||
@@ -8656,7 +8666,7 @@ cdef class Expression(CommutativeRingElement):
|
|
||||||
1/2*I*pi
|
|
||||||
sage: SR(1/2).arccosh()
|
|
||||||
arccosh(1/2)
|
|
||||||
- sage: SR(CDF(1/2)).arccosh() # rel tol 1e-15
|
|
||||||
+ sage: SR(CDF(1/2)).arccosh() # rel tol 1e-15
|
|
||||||
1.0471975511965976*I
|
|
||||||
sage: maxima('acosh(0.5)')
|
|
||||||
1.04719755119659...*%i
|
|
||||||
@@ -11687,7 +11697,7 @@ cdef class Expression(CommutativeRingElement):
|
|
||||||
sage: a.solve(t)
|
|
||||||
[]
|
|
||||||
sage: b = a.canonicalize_radical(); b
|
|
||||||
- -23040.0*(-2.0*e^(1800*t) + 25.0*e^(900*t) - 32.0)*e^(-2400*t)
|
|
||||||
+ (46080.0*e^(1800*t) - 576000.0*e^(900*t) + 737280.0)*e^(-2400*t)
|
|
||||||
sage: b.solve(t)
|
|
||||||
[]
|
|
||||||
sage: b.solve(t, to_poly_solve=True)
|
|
||||||
@@ -12163,14 +12173,14 @@ cdef class Expression(CommutativeRingElement):
|
|
||||||
|
|
||||||
sage: (n,k,j)=var('n,k,j')
|
|
||||||
sage: sum(binomial(n,k)*binomial(k-1,j)*(-1)**(k-1-j),k,j+1,n)
|
|
||||||
- -(-1)^(-j)*sum((-1)^k*binomial(k - 1, j)*binomial(n, k), k, j + 1, n)
|
|
||||||
+ -(-1)^j*sum((-1)^k*binomial(k - 1, j)*binomial(n, k), k, j + 1, n)
|
|
||||||
sage: assume(j>-1)
|
|
||||||
sage: sum(binomial(n,k)*binomial(k-1,j)*(-1)**(k-1-j),k,j+1,n)
|
|
||||||
1
|
|
||||||
sage: forget()
|
|
||||||
sage: assume(n>=j)
|
|
||||||
sage: sum(binomial(n,k)*binomial(k-1,j)*(-1)**(k-1-j),k,j+1,n)
|
|
||||||
- -(-1)^(-j)*sum((-1)^k*binomial(k - 1, j)*binomial(n, k), k, j + 1, n)
|
|
||||||
+ -(-1)^j*sum((-1)^k*binomial(k - 1, j)*binomial(n, k), k, j + 1, n)
|
|
||||||
sage: forget()
|
|
||||||
sage: assume(j==-1)
|
|
||||||
sage: sum(binomial(n,k)*binomial(k-1,j)*(-1)**(k-1-j),k,j+1,n)
|
|
||||||
@@ -12178,7 +12188,7 @@ cdef class Expression(CommutativeRingElement):
|
|
||||||
sage: forget()
|
|
||||||
sage: assume(j<-1)
|
|
||||||
sage: sum(binomial(n,k)*binomial(k-1,j)*(-1)**(k-1-j),k,j+1,n)
|
|
||||||
- -(-1)^(-j)*sum((-1)^k*binomial(k - 1, j)*binomial(n, k), k, j + 1, n)
|
|
||||||
+ -(-1)^j*sum((-1)^k*binomial(k - 1, j)*binomial(n, k), k, j + 1, n)
|
|
||||||
sage: forget()
|
|
||||||
|
|
||||||
Check that :trac:`16176` is fixed::
|
|
||||||
diff --git a/src/sage/symbolic/relation.py b/src/sage/symbolic/relation.py
|
|
||||||
index da6f0eef42..4bd65ef572 100644
|
|
||||||
--- a/src/sage/symbolic/relation.py
|
|
||||||
+++ b/src/sage/symbolic/relation.py
|
|
||||||
@@ -895,7 +895,7 @@ def solve(f, *args, **kwds):
|
|
||||||
sage: (r[0][x], r[0][y])
|
|
||||||
(2*lambert_w(1/2), 1)
|
|
||||||
sage: solve(-2*x**3 + 4*x**2 - 2*x + 6 > 0, x, algorithm='sympy')
|
|
||||||
- [x < (1/6*sqrt(77) + 79/54)^(1/3) + 1/9/(1/6*sqrt(77) + 79/54)^(1/3) + 2/3]
|
|
||||||
+ [x < 1/3*(1/2)^(1/3)*(9*sqrt(77) + 79)^(1/3) + 2/3*(1/2)^(2/3)/(9*sqrt(77) + 79)^(1/3) + 2/3]
|
|
||||||
sage: solve(sqrt(2*x^2 - 7) - (3 - x),x,algorithm='sympy')
|
|
||||||
[x == -8, x == 2]
|
|
||||||
sage: solve(sqrt(2*x + 9) - sqrt(x + 1) - sqrt(x + 4),x,algorithm='sympy')
|
|
@ -1,40 +0,0 @@
|
|||||||
diff --git a/src/sage/tests/py3_syntax.py b/src/sage/tests/py3_syntax.py
|
|
||||||
index e564860b48..86ab3725f9 100644
|
|
||||||
--- a/src/sage/tests/py3_syntax.py
|
|
||||||
+++ b/src/sage/tests/py3_syntax.py
|
|
||||||
@@ -179,15 +179,30 @@ class Python3SyntaxTest(SortedDirectoryWalkerABC):
|
|
||||||
sage: py3_syntax = Python3SyntaxTest()
|
|
||||||
sage: py3_syntax.test(src.name)
|
|
||||||
Invalid Python 3 syntax found:
|
|
||||||
- File "...py", line 1
|
|
||||||
- print "invalid print statement"
|
|
||||||
- ^
|
|
||||||
- SyntaxError: Missing parentheses in call to 'print'
|
|
||||||
+ Missing parentheses in call to 'print'...
|
|
||||||
sage: os.unlink(src.name)
|
|
||||||
"""
|
|
||||||
+
|
|
||||||
+ # compile all given files in memory, printing all errors
|
|
||||||
+ # inspired by the py_compile module (but without writing to file)
|
|
||||||
+ script = """
|
|
||||||
+import sys
|
|
||||||
+import importlib.machinery
|
|
||||||
+rv = 0
|
|
||||||
+for file in sys.argv[1:]:
|
|
||||||
+ loader = importlib.machinery.SourceFileLoader('<sage_test>', file)
|
|
||||||
+ source_bytes = loader.get_data(file)
|
|
||||||
+ try:
|
|
||||||
+ code = loader.source_to_code(source_bytes, file)
|
|
||||||
+ except Exception as err:
|
|
||||||
+ print(err)
|
|
||||||
+ rv = 1
|
|
||||||
+sys.exit(rv)
|
|
||||||
+"""
|
|
||||||
cmd = [
|
|
||||||
'python3',
|
|
||||||
- '-m', 'py_compile'
|
|
||||||
+ '-c',
|
|
||||||
+ script,
|
|
||||||
] + list(filenames)
|
|
||||||
process = subprocess.Popen(
|
|
||||||
cmd,
|
|
@ -1,31 +0,0 @@
|
|||||||
From 7419e0246230594ebfd5e7a2fe6b80d67abfc98a Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jeroen Demeyer <jdemeyer@cage.ugent.be>
|
|
||||||
Date: Tue, 20 Mar 2018 10:40:41 +0100
|
|
||||||
Subject: Fix sphinxify doctests
|
|
||||||
|
|
||||||
---
|
|
||||||
sagenb/misc/sphinxify.py | 6 +++---
|
|
||||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/sagenb/misc/sphinxify.py b/sagenb/misc/sphinxify.py
|
|
||||||
index 4f76d41..15623d9 100644
|
|
||||||
--- a/sagenb/misc/sphinxify.py
|
|
||||||
+++ b/sagenb/misc/sphinxify.py
|
|
||||||
@@ -47,11 +47,11 @@ def sphinxify(docstring, format='html'):
|
|
||||||
|
|
||||||
sage: from sage.misc.sphinxify import sphinxify
|
|
||||||
sage: sphinxify('A test')
|
|
||||||
- '...<div class="docstring">\n \n <p>A test</p>\n\n\n</div>'
|
|
||||||
+ '<div class="docstring">\n \n <p>A test</p>\n\n\n</div>'
|
|
||||||
sage: sphinxify('**Testing**\n`monospace`')
|
|
||||||
- '...<div class="docstring"...<strong>Testing</strong>\n<span class="math"...</p>\n\n\n</div>'
|
|
||||||
+ '<div class="docstring"...<strong>Testing</strong>\n<span class="math notranslate"...</p>\n\n\n</div>'
|
|
||||||
sage: sphinxify('`x=y`')
|
|
||||||
- '...<div class="docstring">\n \n <p><span class="math">x=y</span></p>\n\n\n</div>'
|
|
||||||
+ '<div class="docstring">\n \n <p><span class="math notranslate">x=y</span></p>\n\n\n</div>'
|
|
||||||
sage: sphinxify('`x=y`', format='text')
|
|
||||||
'x=y\n'
|
|
||||||
sage: sphinxify(':math:`x=y`', format='text')
|
|
||||||
--
|
|
||||||
cgit v1.0-1-gd88e
|
|
||||||
|
|
@ -0,0 +1,274 @@
|
|||||||
|
diff --git a/src/sage/interfaces/singular.py b/src/sage/interfaces/singular.py
|
||||||
|
index 9d65c9fa6c..a028bbe719 100644
|
||||||
|
--- a/src/sage/interfaces/singular.py
|
||||||
|
+++ b/src/sage/interfaces/singular.py
|
||||||
|
@@ -654,7 +654,7 @@ class Singular(ExtraTabCompletion, Expect):
|
||||||
|
|
||||||
|
s = Expect.eval(self, x, **kwds)
|
||||||
|
|
||||||
|
- if s.find("error") != -1 or s.find("Segment fault") != -1:
|
||||||
|
+ if s.find("error occurred") != -1 or s.find("Segment fault") != -1:
|
||||||
|
raise SingularError('Singular error:\n%s'%s)
|
||||||
|
|
||||||
|
if get_verbose() > 0:
|
||||||
|
@@ -1079,7 +1079,7 @@ class Singular(ExtraTabCompletion, Expect):
|
||||||
|
sage: S = singular.ring('real', '(a,b)', 'lp')
|
||||||
|
sage: singular.current_ring()
|
||||||
|
polynomial ring, over a field, global ordering
|
||||||
|
- // coefficients: float
|
||||||
|
+ // coefficients: Float()
|
||||||
|
// number of vars : 2
|
||||||
|
// block 1 : ordering lp
|
||||||
|
// : names a b
|
||||||
|
@@ -1157,7 +1157,7 @@ class Singular(ExtraTabCompletion, Expect):
|
||||||
|
sage: singular._tab_completion()
|
||||||
|
['exteriorPower',
|
||||||
|
...
|
||||||
|
- 'flintZ']
|
||||||
|
+ 'crossprod']
|
||||||
|
"""
|
||||||
|
p = re.compile("// *([a-z0-9A-Z_]*).*") #compiles regular expression
|
||||||
|
proclist = self.eval("listvar(proc)").splitlines()
|
||||||
|
@@ -1183,7 +1183,7 @@ class Singular(ExtraTabCompletion, Expect):
|
||||||
|
EXAMPLES::
|
||||||
|
|
||||||
|
sage: singular.version()
|
||||||
|
- "Singular ... version 4.1.0 ...
|
||||||
|
+ "Singular ... version 4...
|
||||||
|
"""
|
||||||
|
return singular_version()
|
||||||
|
|
||||||
|
@@ -1562,7 +1562,7 @@ class SingularElement(ExtraTabCompletion, ExpectElement):
|
||||||
|
elif charstr[0] in ['0', 'QQ']:
|
||||||
|
from sage.all import QQ
|
||||||
|
br = QQ
|
||||||
|
- elif charstr[0]=='real':
|
||||||
|
+ elif charstr[0].startswith('Float'):
|
||||||
|
from sage.all import RealField, ceil, log
|
||||||
|
prec = singular.eval('ringlist(basering)[1][2][1]')
|
||||||
|
br = RealField(ceil((ZZ(prec)+1)/log(2,10)))
|
||||||
|
@@ -1750,7 +1750,7 @@ class SingularElement(ExtraTabCompletion, ExpectElement):
|
||||||
|
|
||||||
|
# Singular 4 puts parentheses around floats and sign outside them
|
||||||
|
charstr = self.parent().eval('charstr(basering)').split(',',1)
|
||||||
|
- if charstr[0] in ['real', 'complex']:
|
||||||
|
+ if charstr[0]=='complex' or charstr[0].startswith('Float'):
|
||||||
|
for i in range(coeff_start, 2 * coeff_start):
|
||||||
|
singular_poly_list[i] = singular_poly_list[i].replace('(','').replace(')','')
|
||||||
|
|
||||||
|
@@ -1992,7 +1992,7 @@ class SingularElement(ExtraTabCompletion, ExpectElement):
|
||||||
|
sage: S = singular.ring('real', '(a,b)', 'lp')
|
||||||
|
sage: singular.current_ring()
|
||||||
|
polynomial ring, over a field, global ordering
|
||||||
|
- // coefficients: float
|
||||||
|
+ // coefficients: Float()
|
||||||
|
// number of vars : 2
|
||||||
|
// block 1 : ordering lp
|
||||||
|
// : names a b
|
||||||
|
@@ -2072,7 +2072,7 @@ class SingularElement(ExtraTabCompletion, ExpectElement):
|
||||||
|
sage: R._tab_completion()
|
||||||
|
['exteriorPower',
|
||||||
|
...
|
||||||
|
- 'flintZ']
|
||||||
|
+ 'crossprod']
|
||||||
|
"""
|
||||||
|
return self.parent()._tab_completion()
|
||||||
|
|
||||||
|
@@ -2358,7 +2358,7 @@ def singular_version():
|
||||||
|
EXAMPLES::
|
||||||
|
|
||||||
|
sage: singular.version()
|
||||||
|
- "Singular ... version 4.1.0 ...
|
||||||
|
+ "Singular ... version 4...
|
||||||
|
"""
|
||||||
|
return singular.eval('system("--version");')
|
||||||
|
|
||||||
|
diff --git a/src/sage/libs/singular/decl.pxd b/src/sage/libs/singular/decl.pxd
|
||||||
|
index 4b658c4807..d863740419 100644
|
||||||
|
--- a/src/sage/libs/singular/decl.pxd
|
||||||
|
+++ b/src/sage/libs/singular/decl.pxd
|
||||||
|
@@ -170,7 +170,7 @@ cdef extern from "singular/Singular/libsingular.h":
|
||||||
|
|
||||||
|
int n_NumberOfParameters(const n_Procs_s* r)
|
||||||
|
|
||||||
|
- ctypedef struct poly "polyrec":
|
||||||
|
+ ctypedef struct poly "spolyrec":
|
||||||
|
poly *next
|
||||||
|
number *coef
|
||||||
|
unsigned long exp[1]
|
||||||
|
@@ -630,9 +630,13 @@ cdef extern from "singular/Singular/libsingular.h":
|
||||||
|
# return p*q, destroys p and q
|
||||||
|
poly *p_Mult_q(poly *p, poly *q, ring *r)
|
||||||
|
|
||||||
|
+ # polynomial division, ignoring the rest
|
||||||
|
+ # via singclap_pdivide resp. idLift, destroys p,q
|
||||||
|
+ poly *p_Divide(poly *p, poly *q, ring *r)
|
||||||
|
+
|
||||||
|
# divide monomial p by monomial q, p,q const
|
||||||
|
|
||||||
|
- poly *pDivide(poly *p,poly *q)
|
||||||
|
+ poly *pMDivide(poly *p,poly *q)
|
||||||
|
|
||||||
|
# return the i-th power of p; p destroyed, requires global ring
|
||||||
|
|
||||||
|
diff --git a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx
|
||||||
|
index 2a8d9ae021..aeff53af6c 100644
|
||||||
|
--- a/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx
|
||||||
|
+++ b/src/sage/rings/polynomial/multi_polynomial_libsingular.pyx
|
||||||
|
@@ -190,8 +190,8 @@ from sage.libs.singular.decl cimport (
|
||||||
|
n_IsUnit, n_Invers,
|
||||||
|
p_ISet, rChangeCurrRing, p_Copy, p_Init, p_SetCoeff, p_Setm, p_SetExp, p_Add_q,
|
||||||
|
p_NSet, p_GetCoeff, p_Delete, p_GetExp, pNext, rRingVar, omAlloc0, omStrDup,
|
||||||
|
- omFree, pDivide, p_SetCoeff0, n_Init, p_DivisibleBy, pLcm, p_LmDivisibleBy,
|
||||||
|
- pDivide, p_IsConstant, p_ExpVectorEqual, p_String, p_LmInit, n_Copy,
|
||||||
|
+ omFree, pMDivide, p_Divide, p_SetCoeff0, n_Init, p_DivisibleBy, pLcm, p_LmDivisibleBy,
|
||||||
|
+ pMDivide, p_IsConstant, p_ExpVectorEqual, p_String, p_LmInit, n_Copy,
|
||||||
|
p_IsUnit, p_Series, p_Head, idInit, fast_map_common_subexp, id_Delete,
|
||||||
|
p_IsHomogeneous, p_Homogen, p_Totaldegree,pLDeg1_Totaldegree, singclap_pdivide, singclap_factorize,
|
||||||
|
idLift, IDELEMS, On, Off, SW_USE_CHINREM_GCD, SW_USE_EZGCD,
|
||||||
|
@@ -1693,8 +1693,8 @@ cdef class MPolynomialRing_libsingular(MPolynomialRing_base):
|
||||||
|
if not g._poly:
|
||||||
|
raise ZeroDivisionError
|
||||||
|
|
||||||
|
- if r!=currRing: rChangeCurrRing(r) # pDivide
|
||||||
|
- res = pDivide(f._poly, g._poly)
|
||||||
|
+ if r!=currRing: rChangeCurrRing(r) # pMDivide
|
||||||
|
+ res = pMDivide(f._poly, g._poly)
|
||||||
|
if coeff:
|
||||||
|
if r.cf.type == n_unknown or r.cf.cfDivBy(p_GetCoeff(f._poly, r), p_GetCoeff(g._poly, r), r.cf):
|
||||||
|
n = r.cf.cfDiv( p_GetCoeff(f._poly, r) , p_GetCoeff(g._poly, r), r.cf)
|
||||||
|
@@ -1853,8 +1853,8 @@ cdef class MPolynomialRing_libsingular(MPolynomialRing_base):
|
||||||
|
and (<MPolynomial_libsingular>g) \
|
||||||
|
and g.parent() is self \
|
||||||
|
and p_LmDivisibleBy((<MPolynomial_libsingular>g)._poly, m, r):
|
||||||
|
- if r!=currRing: rChangeCurrRing(r) # pDivide
|
||||||
|
- flt = pDivide(f._poly, (<MPolynomial_libsingular>g)._poly)
|
||||||
|
+ if r!=currRing: rChangeCurrRing(r) # pMDivide
|
||||||
|
+ flt = pMDivide(f._poly, (<MPolynomial_libsingular>g)._poly)
|
||||||
|
#p_SetCoeff(flt, n_Div( p_GetCoeff(f._poly, r) , p_GetCoeff((<MPolynomial_libsingular>g)._poly, r), r), r)
|
||||||
|
p_SetCoeff(flt, n_Init(1, r), r)
|
||||||
|
return new_MP(self,flt), g
|
||||||
|
@@ -4023,16 +4023,6 @@ cdef class MPolynomial_libsingular(MPolynomial):
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
NotImplementedError: Division of multivariate polynomials over non fields by non-monomials not implemented.
|
||||||
|
-
|
||||||
|
- TESTS::
|
||||||
|
-
|
||||||
|
- sage: P.<x,y> = ZZ[]
|
||||||
|
- sage: p = 3*(-x^8*y^2 - x*y^9 + 6*x^8*y + 17*x^2*y^6 - x^3*y^2)
|
||||||
|
- sage: q = 7*(x^2 + x*y + y^2 + 1)
|
||||||
|
- sage: p*q//q == p
|
||||||
|
- True
|
||||||
|
- sage: p*q//p == q
|
||||||
|
- True
|
||||||
|
"""
|
||||||
|
cdef MPolynomialRing_libsingular parent = self._parent
|
||||||
|
cdef ring *r = self._parent_ring
|
||||||
|
@@ -4052,13 +4042,18 @@ cdef class MPolynomial_libsingular(MPolynomial):
|
||||||
|
_right = <MPolynomial_libsingular>right
|
||||||
|
|
||||||
|
if r.cf.type != n_unknown:
|
||||||
|
+ if r.cf.type == n_Z:
|
||||||
|
+ P = parent.change_ring(RationalField())
|
||||||
|
+ f = P(self)//P(right)
|
||||||
|
+ CM = list(f)
|
||||||
|
+ return parent(sum([c.floor()*m for c,m in CM]))
|
||||||
|
if _right.is_monomial():
|
||||||
|
p = _self._poly
|
||||||
|
quo = p_ISet(0,r)
|
||||||
|
- if r != currRing: rChangeCurrRing(r) # pDivide
|
||||||
|
+ if r != currRing: rChangeCurrRing(r) # pMDivide
|
||||||
|
while p:
|
||||||
|
if p_DivisibleBy(_right._poly, p, r):
|
||||||
|
- temp = pDivide(p, _right._poly)
|
||||||
|
+ temp = pMDivide(p, _right._poly)
|
||||||
|
p_SetCoeff0(temp, n_Copy(p_GetCoeff(p, r), r), r)
|
||||||
|
quo = p_Add_q(quo, temp, r)
|
||||||
|
p = pNext(p)
|
||||||
|
@@ -4794,6 +4789,8 @@ cdef class MPolynomial_libsingular(MPolynomial):
|
||||||
|
sage: p = -x*y + x*z + 54*x - 2
|
||||||
|
sage: (5*p^2).lcm(3*p) == 15*p^2
|
||||||
|
True
|
||||||
|
+ sage: lcm(2*x,2*x*y)
|
||||||
|
+ 2*x*y
|
||||||
|
"""
|
||||||
|
cdef ring *_ring = self._parent_ring
|
||||||
|
cdef poly *ret
|
||||||
|
@@ -4821,9 +4818,7 @@ cdef class MPolynomial_libsingular(MPolynomial):
|
||||||
|
if _ring!=currRing: rChangeCurrRing(_ring) # singclap_gcd
|
||||||
|
gcd = singclap_gcd(p_Copy(self._poly, _ring), p_Copy(_g._poly, _ring), _ring )
|
||||||
|
prod = pp_Mult_qq(self._poly, _g._poly, _ring)
|
||||||
|
- ret = singclap_pdivide(prod , gcd , _ring)
|
||||||
|
- p_Delete(&prod, _ring)
|
||||||
|
- p_Delete(&gcd, _ring)
|
||||||
|
+ ret = p_Divide(prod, gcd, _ring)
|
||||||
|
if count >= 20:
|
||||||
|
sig_off()
|
||||||
|
return new_MP(self._parent, ret)
|
||||||
|
@@ -4866,7 +4861,7 @@ cdef class MPolynomial_libsingular(MPolynomial):
|
||||||
|
sage: f.quo_rem(y)
|
||||||
|
(2*x^2, x + 1)
|
||||||
|
sage: f.quo_rem(3*x)
|
||||||
|
- (2*x*y + 1, -4*x^2*y - 2*x + 1)
|
||||||
|
+ (0, 2*x^2*y + x + 1)
|
||||||
|
|
||||||
|
TESTS::
|
||||||
|
|
||||||
|
@@ -4888,7 +4883,7 @@ cdef class MPolynomial_libsingular(MPolynomial):
|
||||||
|
if right.is_zero():
|
||||||
|
raise ZeroDivisionError
|
||||||
|
|
||||||
|
- if not self._parent._base.is_field() and not is_IntegerRing(self._parent._base):
|
||||||
|
+ if not self._parent._base.is_field():
|
||||||
|
py_quo = self//right
|
||||||
|
py_rem = self - right*py_quo
|
||||||
|
return py_quo, py_rem
|
||||||
|
diff --git a/src/sage/rings/polynomial/plural.pyx b/src/sage/rings/polynomial/plural.pyx
|
||||||
|
index d5439f7f08..ad20ebcca0 100644
|
||||||
|
--- a/src/sage/rings/polynomial/plural.pyx
|
||||||
|
+++ b/src/sage/rings/polynomial/plural.pyx
|
||||||
|
@@ -998,7 +998,7 @@ cdef class NCPolynomialRing_plural(Ring):
|
||||||
|
if not g._poly:
|
||||||
|
raise ZeroDivisionError
|
||||||
|
|
||||||
|
- res = pDivide(f._poly,g._poly)
|
||||||
|
+ res = pMDivide(f._poly,g._poly)
|
||||||
|
if coeff:
|
||||||
|
if (r.cf.type == n_unknown) or r.cf.cfDivBy(p_GetCoeff(f._poly, r), p_GetCoeff(g._poly, r), r.cf):
|
||||||
|
n = r.cf.cfDiv( p_GetCoeff(f._poly, r) , p_GetCoeff(g._poly, r), r.cf)
|
||||||
|
@@ -1193,7 +1193,7 @@ cdef class NCPolynomialRing_plural(Ring):
|
||||||
|
if isinstance(g, NCPolynomial_plural) \
|
||||||
|
and (<NCPolynomial_plural>g) \
|
||||||
|
and p_LmDivisibleBy((<NCPolynomial_plural>g)._poly, m, r):
|
||||||
|
- flt = pDivide(f._poly, (<NCPolynomial_plural>g)._poly)
|
||||||
|
+ flt = pMDivide(f._poly, (<NCPolynomial_plural>g)._poly)
|
||||||
|
#p_SetCoeff(flt, n_Div( p_GetCoeff(f._poly, r) , p_GetCoeff((<NCPolynomial_plural>g)._poly, r), r), r)
|
||||||
|
p_SetCoeff(flt, n_Init(1, r), r)
|
||||||
|
return new_NCP(self,flt), g
|
||||||
|
diff --git a/src/sage/rings/polynomial/polynomial_singular_interface.py b/src/sage/rings/polynomial/polynomial_singular_interface.py
|
||||||
|
index 9331169f8b..f753610fd3 100644
|
||||||
|
--- a/src/sage/rings/polynomial/polynomial_singular_interface.py
|
||||||
|
+++ b/src/sage/rings/polynomial/polynomial_singular_interface.py
|
||||||
|
@@ -81,8 +81,8 @@ class PolynomialRing_singular_repr:
|
||||||
|
sage: R.<x,y> = PolynomialRing(CC)
|
||||||
|
sage: singular(R)
|
||||||
|
polynomial ring, over a field, global ordering
|
||||||
|
- // coefficients: float[I](complex:15 digits, additional 0 digits)/(I^2+1)
|
||||||
|
- // number of vars : 2
|
||||||
|
+ // coefficients: real[I](complex:15 digits, additional 0 digits)/(I^2+1)
|
||||||
|
+ // number of vars : 2
|
||||||
|
// block 1 : ordering dp
|
||||||
|
// : names x y
|
||||||
|
// block 2 : ordering C
|
||||||
|
@@ -90,8 +90,8 @@ class PolynomialRing_singular_repr:
|
||||||
|
sage: R.<x,y> = PolynomialRing(RealField(100))
|
||||||
|
sage: singular(R)
|
||||||
|
polynomial ring, over a field, global ordering
|
||||||
|
- // coefficients: float
|
||||||
|
- // number of vars : 2
|
||||||
|
+ // coefficients: Float()
|
||||||
|
+ // number of vars : 2
|
||||||
|
// block 1 : ordering dp
|
||||||
|
// : names x y
|
||||||
|
// block 2 : ordering C
|
@ -1,62 +0,0 @@
|
|||||||
diff --git a/src/bin/sage b/src/bin/sage
|
|
||||||
index 397f30cbed..3fc473c343 100755
|
|
||||||
--- a/src/bin/sage
|
|
||||||
+++ b/src/bin/sage
|
|
||||||
@@ -980,8 +980,11 @@ if [ "$1" = '-rsyncdist' -o "$1" = "--rsyncdist" ]; then
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$1" = "-docbuild" -o "$1" = "--docbuild" ]; then
|
|
||||||
+ # Redirect stdin from /dev/null. This helps with running TeX which
|
|
||||||
+ # tends to ask interactive questions if something goes wrong. These
|
|
||||||
+ # cause the build to hang. If stdin is /dev/null, TeX just aborts.
|
|
||||||
shift
|
|
||||||
- exec sage-python23 -m "sage_setup.docbuild" "$@"
|
|
||||||
+ exec sage-python23 -m sage_setup.docbuild "$@" </dev/null
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$1" = '-gdb' -o "$1" = "--gdb" ]; then
|
|
||||||
diff --git a/src/doc/common/conf.py b/src/doc/common/conf.py
|
|
||||||
index 25f94f7b7d..3f07474d9b 100644
|
|
||||||
--- a/src/doc/common/conf.py
|
|
||||||
+++ b/src/doc/common/conf.py
|
|
||||||
@@ -627,7 +627,7 @@ def call_intersphinx(app, env, node, contnode):
|
|
||||||
sage: for line in open(thematic_index).readlines():
|
|
||||||
....: if "padics" in line:
|
|
||||||
....: sys.stdout.write(line)
|
|
||||||
- <li><a class="reference external" href="../reference/padics/sage/rings/padics/tutorial.html#sage-rings-padics-tutorial" title="(in Sage Reference Manual: p-Adics ...)"><span>Introduction to the -adics</span></a></li>
|
|
||||||
+ <li><a class="reference external" href="../reference/padics/sage/rings/padics/tutorial.html#sage-rings-padics-tutorial" title="(in Sage Reference Manual: p-Adics v...)"><span>Introduction to the -adics</span></a></li>
|
|
||||||
"""
|
|
||||||
debug_inf(app, "???? Trying intersphinx for %s"%node['reftarget'])
|
|
||||||
builder = app.builder
|
|
||||||
diff --git a/src/sage/misc/sphinxify.py b/src/sage/misc/sphinxify.py
|
|
||||||
index 4f76d4113a..8f426b5989 100644
|
|
||||||
--- a/src/sage/misc/sphinxify.py
|
|
||||||
+++ b/src/sage/misc/sphinxify.py
|
|
||||||
@@ -47,11 +47,11 @@ def sphinxify(docstring, format='html'):
|
|
||||||
|
|
||||||
sage: from sage.misc.sphinxify import sphinxify
|
|
||||||
sage: sphinxify('A test')
|
|
||||||
- '...<div class="docstring">\n \n <p>A test</p>\n\n\n</div>'
|
|
||||||
+ '<div class="docstring">\n \n <p>A test</p>\n\n\n</div>'
|
|
||||||
sage: sphinxify('**Testing**\n`monospace`')
|
|
||||||
- '...<div class="docstring"...<strong>Testing</strong>\n<span class="math"...</p>\n\n\n</div>'
|
|
||||||
+ '<div class="docstring"...<strong>Testing</strong>\n<span class="math...</p>\n\n\n</div>'
|
|
||||||
sage: sphinxify('`x=y`')
|
|
||||||
- '...<div class="docstring">\n \n <p><span class="math">x=y</span></p>\n\n\n</div>'
|
|
||||||
+ '<div class="docstring">\n \n <p><span class="math notranslate nohighlight">x=y</span></p>\n\n\n</div>'
|
|
||||||
sage: sphinxify('`x=y`', format='text')
|
|
||||||
'x=y\n'
|
|
||||||
sage: sphinxify(':math:`x=y`', format='text')
|
|
||||||
diff --git a/src/sage_setup/docbuild/sphinxbuild.py b/src/sage_setup/docbuild/sphinxbuild.py
|
|
||||||
index fda76a4174..d3413239dd 100644
|
|
||||||
--- a/src/sage_setup/docbuild/sphinxbuild.py
|
|
||||||
+++ b/src/sage_setup/docbuild/sphinxbuild.py
|
|
||||||
@@ -207,7 +207,7 @@ def runsphinx():
|
|
||||||
try:
|
|
||||||
sys.stdout = SageSphinxLogger(sys.stdout, os.path.basename(output_dir))
|
|
||||||
sys.stderr = SageSphinxLogger(sys.stderr, os.path.basename(output_dir))
|
|
||||||
- sphinx.cmdline.main(sys.argv)
|
|
||||||
+ sphinx.cmdline.main(sys.argv[1:])
|
|
||||||
finally:
|
|
||||||
sys.stdout = saved_stdout
|
|
||||||
sys.stderr = saved_stderr
|
|
@ -0,0 +1,46 @@
|
|||||||
|
commit f02714d4aea80e17cb8df62bab75d7c1a1b61a8e
|
||||||
|
Author: Timo Kaufmann <timokau@zoho.com>
|
||||||
|
Date: Mon Jul 9 18:26:18 2018 +0200
|
||||||
|
|
||||||
|
Don't attempt to create dirs when showing pkg info
|
||||||
|
|
||||||
|
The script dir cannot be assumed to be writeable after installation.
|
||||||
|
|
||||||
|
diff --git a/build/bin/sage-spkg b/build/bin/sage-spkg
|
||||||
|
index f3e02aeae5..190d558ad1 100755
|
||||||
|
--- a/build/bin/sage-spkg
|
||||||
|
+++ b/build/bin/sage-spkg
|
||||||
|
@@ -167,14 +167,6 @@ if [ -z "$SAGE_BUILD_DIR" ]; then
|
||||||
|
export SAGE_BUILD_DIR="$SAGE_LOCAL/var/tmp/sage/build"
|
||||||
|
fi
|
||||||
|
|
||||||
|
-for dir in "$SAGE_SPKG_INST" "$SAGE_SPKG_SCRIPTS"; do
|
||||||
|
- mkdir -p "$dir"
|
||||||
|
- if [ $? -ne 0 ]; then
|
||||||
|
- error_msg "Error creating directory $dir"
|
||||||
|
- exit 1
|
||||||
|
- fi
|
||||||
|
-done
|
||||||
|
-
|
||||||
|
|
||||||
|
# Remove '.' from PYTHONPATH, which may also come from SAGE_PATH, to avoid
|
||||||
|
# trouble with setuptools / easy_install (cf. #10192, #10176):
|
||||||
|
@@ -563,11 +555,13 @@ fi
|
||||||
|
# Setup directories
|
||||||
|
##################################################################
|
||||||
|
|
||||||
|
-mkdir -p "$SAGE_BUILD_DIR"
|
||||||
|
-if [ $? -ne 0 ]; then
|
||||||
|
- error_msg "Error creating directory $SAGE_BUILD_DIR"
|
||||||
|
- exit 1
|
||||||
|
-fi
|
||||||
|
+for dir in "$SAGE_SPKG_INST" "$SAGE_SPKG_SCRIPTS" "$SAGE_BUILD_DIR"; do
|
||||||
|
+ mkdir -p "$dir"
|
||||||
|
+ if [ $? -ne 0 ]; then
|
||||||
|
+ error_msg "Error creating directory $dir"
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
+done
|
||||||
|
|
||||||
|
# Trac #5852: check write permissions
|
||||||
|
if [ ! -w "$SAGE_BUILD_DIR" ]; then
|
@ -1,13 +0,0 @@
|
|||||||
diff --git a/src/sage/misc/package.py b/src/sage/misc/package.py
|
|
||||||
index 7ff4f21675..1d72168833 100644
|
|
||||||
--- a/src/sage/misc/package.py
|
|
||||||
+++ b/src/sage/misc/package.py
|
|
||||||
@@ -350,7 +350,7 @@ def package_versions(package_type, local=False):
|
|
||||||
sage: 'gap' in std
|
|
||||||
True
|
|
||||||
sage: std['zn_poly']
|
|
||||||
- ('0.9.p11', '0.9.p11')
|
|
||||||
+ ('0.9', '0.9.p11')
|
|
||||||
"""
|
|
||||||
return {pkg['name']: (pkg['installed_version'], pkg['remote_version']) for pkg in list_packages(package_type, local=local).values()}
|
|
||||||
|
|
@ -3,17 +3,20 @@
|
|||||||
, fetchpatch
|
, fetchpatch
|
||||||
}:
|
}:
|
||||||
stdenv.mkDerivation rec {
|
stdenv.mkDerivation rec {
|
||||||
version = "8.2";
|
version = "8.3";
|
||||||
name = "sage-src-${version}";
|
name = "sage-src-${version}";
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "sagemath";
|
owner = "sagemath";
|
||||||
repo = "sage";
|
repo = "sage";
|
||||||
rev = version;
|
rev = version;
|
||||||
sha256 = "0d7vc16s7dj23an2cb8v5bhbnc6nsw20qhnnxr0xh8qg629027b8";
|
sha256 = "0mbm99m5xry21xpi4q3q96gx392liwbifywf5awvl0j85a7rkfyx";
|
||||||
};
|
};
|
||||||
|
|
||||||
nixPatches = [
|
nixPatches = [
|
||||||
|
# https://trac.sagemath.org/ticket/25809
|
||||||
|
./patches/spkg-scripts.patch
|
||||||
|
|
||||||
# https://trac.sagemath.org/ticket/25309
|
# https://trac.sagemath.org/ticket/25309
|
||||||
(fetchpatch {
|
(fetchpatch {
|
||||||
name = "spkg-paths.patch";
|
name = "spkg-paths.patch";
|
||||||
@ -26,14 +29,7 @@ stdenv.mkDerivation rec {
|
|||||||
sha256 = "14s50yg3hpw9cp3v581dx7zfmpm2j972im7x30iwki8k45mjvk3i";
|
sha256 = "14s50yg3hpw9cp3v581dx7zfmpm2j972im7x30iwki8k45mjvk3i";
|
||||||
})
|
})
|
||||||
|
|
||||||
# https://trac.sagemath.org/ticket/25328
|
|
||||||
# https://trac.sagemath.org/ticket/25546
|
|
||||||
# https://trac.sagemath.org/ticket/25722
|
# https://trac.sagemath.org/ticket/25722
|
||||||
(fetchpatch {
|
|
||||||
name = "install-jupyter-kernel-in-correct-prefix.patch";
|
|
||||||
url = "https://git.sagemath.org/sage.git/patch?id=72167b98e3f64326df6b2c78785df25539472fcc";
|
|
||||||
sha256 = "0pscnjhm7r2yr2rxnv4kkkq626vwaja720lixa3m3w9rwlxll5a7";
|
|
||||||
})
|
|
||||||
./patches/test-in-tmpdir.patch
|
./patches/test-in-tmpdir.patch
|
||||||
|
|
||||||
# https://trac.sagemath.org/ticket/25358
|
# https://trac.sagemath.org/ticket/25358
|
||||||
@ -43,27 +39,13 @@ stdenv.mkDerivation rec {
|
|||||||
sha256 = "1hhannz7xzprijakn2w2d0rhd5zv2zikik9p51i87bas3nc658f7";
|
sha256 = "1hhannz7xzprijakn2w2d0rhd5zv2zikik9p51i87bas3nc658f7";
|
||||||
})
|
})
|
||||||
|
|
||||||
# https://trac.sagemath.org/ticket/25357 rebased on 8.2
|
# Unfortunately inclusion in upstream sage was rejected. Instead the bug was
|
||||||
./patches/python3-syntax-without-write.patch
|
# fixed in python, but of course not backported to 2.7. So we'll probably
|
||||||
|
# have to keep this around until 2.7 is deprecated.
|
||||||
# https://trac.sagemath.org/ticket/25314
|
|
||||||
(fetchpatch {
|
|
||||||
name = "make-qepcad-test-optional.patch";
|
|
||||||
url = "https://git.sagemath.org/sage.git/patch/?h=fe294c58bd035ef427e268901d54a6faa0058138";
|
|
||||||
sha256 = "003d5baf5c0n5rfg010ijwkwz8kg0s414cxwczs2vhdayxdixbix";
|
|
||||||
})
|
|
||||||
|
|
||||||
# https://trac.sagemath.org/ticket/25316
|
# https://trac.sagemath.org/ticket/25316
|
||||||
|
# https://github.com/python/cpython/pull/7476
|
||||||
./patches/python-5755-hotpatch.patch
|
./patches/python-5755-hotpatch.patch
|
||||||
|
|
||||||
# https://trac.sagemath.org/ticket/25354
|
|
||||||
# https://trac.sagemath.org/ticket/25531
|
|
||||||
(fetchpatch {
|
|
||||||
name = "cysignals-include.patch";
|
|
||||||
url = "https://git.sagemath.org/sage.git/patch/?h=28778bd25a37c80884d2b24e0683fb2989300cef";
|
|
||||||
sha256 = "0fiiiw91pgs8avm9ggj8hb64bhqzl6jcw094d94nhirmh8w2jmc5";
|
|
||||||
})
|
|
||||||
|
|
||||||
# https://trac.sagemath.org/ticket/25315
|
# https://trac.sagemath.org/ticket/25315
|
||||||
(fetchpatch {
|
(fetchpatch {
|
||||||
name = "find-libraries-in-dyld-library-path.patch";
|
name = "find-libraries-in-dyld-library-path.patch";
|
||||||
@ -71,16 +53,13 @@ stdenv.mkDerivation rec {
|
|||||||
sha256 = "1k3afq3qlzmgqwx6rzs5wv153vv9dsf5rk8pi61g57l3r3npbjmc";
|
sha256 = "1k3afq3qlzmgqwx6rzs5wv153vv9dsf5rk8pi61g57l3r3npbjmc";
|
||||||
})
|
})
|
||||||
|
|
||||||
# Pari upstream has since accepted a patch, so this patch won't be necessary once sage updates pari.
|
|
||||||
# https://trac.sagemath.org/ticket/25312
|
|
||||||
./patches/pari-stackwarn.patch
|
|
||||||
|
|
||||||
# https://trac.sagemath.org/ticket/25311
|
|
||||||
./patches/zn_poly_version.patch
|
|
||||||
|
|
||||||
# https://trac.sagemath.org/ticket/25345
|
# https://trac.sagemath.org/ticket/25345
|
||||||
# (upstream patch doesn't apply on 8.2 source)
|
# (upstream patch doesn't apply on 8.2 source)
|
||||||
./patches/dochtml-optional.patch
|
./patches/dochtml-optional.patch
|
||||||
|
|
||||||
|
# work with pari with threads enabled at compile time (disable them at runtime)
|
||||||
|
# https://trac.sagemath.org/ticket/26002
|
||||||
|
./patches/pari-no-threads.patch
|
||||||
];
|
];
|
||||||
|
|
||||||
packageUpgradePatches = [
|
packageUpgradePatches = [
|
||||||
@ -106,87 +85,62 @@ stdenv.mkDerivation rec {
|
|||||||
# the last version.
|
# the last version.
|
||||||
./patches/eclib-regulator-precision.patch
|
./patches/eclib-regulator-precision.patch
|
||||||
|
|
||||||
# sphinx 1.6 -> 1.7 upgrade
|
|
||||||
# https://trac.sagemath.org/ticket/24935
|
|
||||||
./patches/sphinx-1.7.patch
|
|
||||||
|
|
||||||
# Adapt hashes to new boost version
|
|
||||||
# https://trac.sagemath.org/ticket/22243
|
|
||||||
# (this ticket doesn't only upgrade boost but also avoids this problem in the future)
|
|
||||||
(fetchpatch {
|
|
||||||
name = "boost-upgrade.patch";
|
|
||||||
url = "https://git.sagemath.org/sage.git/patch?id=a24a9c6b30b93957333a3116196214a931325b69";
|
|
||||||
sha256 = "0z3870g2ms2a81vnw08dc2i4k7jr62w8fggvcdwaavgd1wvdxwfl";
|
|
||||||
})
|
|
||||||
|
|
||||||
# gfan 0.6.2
|
|
||||||
# https://trac.sagemath.org/ticket/23353
|
|
||||||
(fetchpatch {
|
|
||||||
name = "gfan-update.patch";
|
|
||||||
url = "https://git.sagemath.org/sage.git/patch/?h=420215fc469cde733ec7a339e59b78ad6eec804c&id=112498a293ea2bf563e41aed35f1aa608f01b349";
|
|
||||||
sha256 = "0ga3hkx8cr23dpc919lgvpi5lmy0d728jkq9z6kf0fl9s8g31mxb";
|
|
||||||
})
|
|
||||||
|
|
||||||
# New glpk version has new warnings, filter those out until upstream sage has found a solution
|
# New glpk version has new warnings, filter those out until upstream sage has found a solution
|
||||||
# https://trac.sagemath.org/ticket/24824
|
# https://trac.sagemath.org/ticket/24824
|
||||||
|
./patches/pari-stackwarn.patch # not actually necessary since tha pari upgrade, but necessary for the glpk patch to apply
|
||||||
(fetchpatch {
|
(fetchpatch {
|
||||||
url = "https://salsa.debian.org/science-team/sagemath/raw/58bbba93a807ca2933ca317501d093a1bb4b84db/debian/patches/dt-version-glpk-4.65-ignore-warnings.patch";
|
url = "https://salsa.debian.org/science-team/sagemath/raw/58bbba93a807ca2933ca317501d093a1bb4b84db/debian/patches/dt-version-glpk-4.65-ignore-warnings.patch";
|
||||||
sha256 = "0b9293v73wb4x13wv5zwyjgclc01zn16msccfzzi6znswklgvddp";
|
sha256 = "0b9293v73wb4x13wv5zwyjgclc01zn16msccfzzi6znswklgvddp";
|
||||||
stripLen = 1;
|
stripLen = 1;
|
||||||
})
|
})
|
||||||
|
|
||||||
# https://trac.sagemath.org/ticket/25329
|
|
||||||
(fetchpatch {
|
|
||||||
name = "dont-check-exact-glpk-version.patch";
|
|
||||||
url = "https://git.sagemath.org/sage.git/patch?id2=8bdc326ba57d1bb9664f63cf165a9e9920cc1afc&id=89d068d8d77316bfffa6bf8e9ebf70b3b3b88e5c";
|
|
||||||
sha256 = "00knwxs6fmymfgfl0q5kcavmxm9sf90a4r76y35n5s55gj8pl918";
|
|
||||||
})
|
|
||||||
|
|
||||||
# https://trac.sagemath.org/ticket/25355
|
|
||||||
(fetchpatch {
|
|
||||||
name = "maxima-5.41.0.patch";
|
|
||||||
url = "https://git.sagemath.org/sage.git/patch/?id=87328023c4739abdf24108038201e3fa9bdfc739";
|
|
||||||
sha256 = "0hxi7qr5mfx1bc32r8j7iba4gzd7c6v63asylyf5cbyp86azpb7i";
|
|
||||||
})
|
|
||||||
|
|
||||||
# Update cddlib from 0.94g to 0.94h.
|
|
||||||
# https://trac.sagemath.org/ticket/25341 (doesn't apply to 8.2 sources)
|
|
||||||
(fetchpatch {
|
|
||||||
url = "https://salsa.debian.org/science-team/sagemath/raw/58bbba93a807ca2933ca317501d093a1bb4b84db/debian/patches/u2-version-cddlib-094h.patch";
|
|
||||||
sha256 = "0fmw7pzbaxs2dshky6iw9pr8i23p9ih2y2lw661qypdrxh5xw03k";
|
|
||||||
stripLen = 1;
|
|
||||||
})
|
|
||||||
(fetchpatch {
|
|
||||||
name = "revert-cddlib-doctest-changes.patch";
|
|
||||||
url = "https://git.sagemath.org/sage.git/patch/?id=269c1e1551285566b8ba7a2b890989e5590e9f11";
|
|
||||||
sha256 = "12bcjhq7hm2pmmj2bgjvcffjyls2x7q61ivlnaj5v5bsvhc183iy";
|
|
||||||
revert = true;
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
# Only formatting changes.
|
# Only formatting changes.
|
||||||
# https://trac.sagemath.org/ticket/25260
|
# https://trac.sagemath.org/ticket/25260
|
||||||
./patches/numpy-1.14.3.patch
|
./patches/numpy-1.14.3.patch
|
||||||
|
|
||||||
# https://trac.sagemath.org/ticket/24374
|
|
||||||
(fetchpatch {
|
|
||||||
name = "networkx-2.1.patch";
|
|
||||||
url = "https://salsa.debian.org/science-team/sagemath/raw/487df9ae48ca1d93d9b1cb3af8745d31e30fb741/debian/patches/u0-version-networkx-2.1.patch";
|
|
||||||
sha256 = "1xxxawygbgxgvlv7b4w8hhzgdnva4rhmgdxaiaa3pwdwln0yc750";
|
|
||||||
stripLen = 1;
|
|
||||||
})
|
|
||||||
|
|
||||||
# https://trac.sagemath.org/ticket/24927 rebased
|
|
||||||
./patches/arb-2.13.0.patch
|
|
||||||
|
|
||||||
# https://trac.sagemath.org/ticket/24838 rebased
|
|
||||||
./patches/pynac-0.7.22.patch
|
|
||||||
|
|
||||||
# https://trac.sagemath.org/ticket/25862
|
# https://trac.sagemath.org/ticket/25862
|
||||||
./patches/eclib-20180710.patch
|
./patches/eclib-20180710.patch
|
||||||
|
|
||||||
|
# https://trac.sagemath.org/ticket/24735
|
||||||
|
./patches/singular-4.1.1p2.patch
|
||||||
|
|
||||||
|
# https://trac.sagemath.org/ticket/25567 and dependency #25635
|
||||||
|
(fetchpatch {
|
||||||
|
name = "pari-upgrade-dependency.patch";
|
||||||
|
url = "https://git.sagemath.org/sage.git/patch/?id=6995e7cae1b3476ad0145f8dfc897cf91f0c3c4d";
|
||||||
|
sha256 = "1dvhabl1c9pwd9xkjvbjjg15mvb14b24p1f3cby1mlqk34d4lrs6";
|
||||||
|
})
|
||||||
|
(fetchpatch {
|
||||||
|
name = "pari-2.11.0.patch";
|
||||||
|
url = "https://git.sagemath.org/sage.git/patch/?id=7af4748cab37d651eaa88be501db88f4a5ffc584";
|
||||||
|
sha256 = "13f740ly3c19gcmhjngiycvmc3mcfj61y00i6jv0wmfgpm2z3ank";
|
||||||
|
})
|
||||||
|
|
||||||
|
# ntl upgrade
|
||||||
|
(fetchpatch {
|
||||||
|
name = "lcalc-c++11.patch";
|
||||||
|
url = "https://git.archlinux.org/svntogit/community.git/plain/trunk/sagemath-lcalc-c++11.patch?h=packages/sagemath&id=0e31ae526ab7c6b5c0bfacb3f8b1c4fd490035aa";
|
||||||
|
sha256 = "0p5wnvbx65i7cp0bjyaqgp4rly8xgnk12pqwaq3dqby0j2bk6ijb";
|
||||||
|
})
|
||||||
|
|
||||||
|
# cddlib 0.94i -> 0.94j
|
||||||
|
(fetchpatch {
|
||||||
|
name = "cddlib-0.94j.patch";
|
||||||
|
url = "https://git.sagemath.org/sage.git/patch/?id=2ab1546b3e21d1d0ab3b4fcd58576848b3a2d888";
|
||||||
|
sha256 = "1c5gnasq7y9xxj762bn79bis0zi8d9bgg7jzlf64ifixsrc5cymb";
|
||||||
|
})
|
||||||
|
|
||||||
|
# arb 2.13.0 -> 2.14.0
|
||||||
|
(fetchpatch {
|
||||||
|
name = "arb-2.14.0.patch";
|
||||||
|
url = "https://git.sagemath.org/sage.git/patch?id2=8.4.beta0&id=8bef4fd2876a61969b516fe4eb3b8ad7cc076c5e";
|
||||||
|
sha256 = "00p3hfsfn3w2vxgd9fjd23mz7xfxjfravf8ysjxkyd657jbkpjmk";
|
||||||
|
})
|
||||||
];
|
];
|
||||||
|
|
||||||
patches = nixPatches ++ packageUpgradePatches;
|
patches = nixPatches ++ packageUpgradePatches ++ [
|
||||||
|
./patches/known-padics-bug.patch
|
||||||
|
];
|
||||||
|
|
||||||
postPatch = ''
|
postPatch = ''
|
||||||
# make sure shebangs etc are fixed, but sage-python23 still works
|
# make sure shebangs etc are fixed, but sage-python23 still works
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
let
|
let
|
||||||
name = "scilab-bin-${ver}";
|
name = "scilab-bin-${ver}";
|
||||||
|
|
||||||
ver = "5.5.2";
|
ver = "6.0.1";
|
||||||
|
|
||||||
majorVer = builtins.elemAt (lib.splitString "." ver) 0;
|
majorVer = builtins.elemAt (lib.splitString "." ver) 0;
|
||||||
|
|
||||||
@ -24,9 +24,9 @@ stdenv.mkDerivation rec {
|
|||||||
url = "https://www.scilab.org/download/${ver}/scilab-${ver}.bin.linux-${architecture}.tar.gz";
|
url = "https://www.scilab.org/download/${ver}/scilab-${ver}.bin.linux-${architecture}.tar.gz";
|
||||||
sha256 =
|
sha256 =
|
||||||
if stdenv.system == "i686-linux" then
|
if stdenv.system == "i686-linux" then
|
||||||
"6143a95ded40411a35630a89b365875a6526cd4db1e2865ac5612929a7db937a"
|
"0fgjc2ak3b2qi6yin3fy50qwk2bcj0zbz1h4lyyic9n1n1qcliib"
|
||||||
else if stdenv.system == "x86_64-linux" then
|
else if stdenv.system == "x86_64-linux" then
|
||||||
"c0dd7a5f06ec7a1df7a6b1b8b14407ff7f45e56821dff9b3c46bd09d4df8d350"
|
"1scswlznc14vyzg0gqa1q9gcpwx05kz1sbn563463mzkdp7nd35d"
|
||||||
else
|
else
|
||||||
badArch;
|
badArch;
|
||||||
};
|
};
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
{ stdenv, fetchurl, gmp, bison, perl, ncurses, readline, coreutils, pkgconfig
|
{ stdenv, fetchurl, gmp, bison, perl, ncurses, readline, coreutils, pkgconfig
|
||||||
, lib
|
, lib
|
||||||
|
, fetchpatch
|
||||||
, autoreconfHook
|
, autoreconfHook
|
||||||
, file
|
, file
|
||||||
, flint
|
, flint
|
||||||
@ -36,6 +37,18 @@ stdenv.mkDerivation rec {
|
|||||||
patchShebangs .
|
patchShebangs .
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
patches = [
|
||||||
|
# NTL error handler was introduced in the library part, preventing users of
|
||||||
|
# the library from implementing their own error handling
|
||||||
|
# https://www.singular.uni-kl.de/forum/viewtopic.php?t=2769
|
||||||
|
(fetchpatch {
|
||||||
|
name = "move_error_handler_out_of_libsingular.patch";
|
||||||
|
# rebased version of https://github.com/Singular/Sources/commit/502cf86d0bb2a96715be6764774b64a69c1ca34c.patch
|
||||||
|
url = "https://git.sagemath.org/sage.git/plain/build/pkgs/singular/patches/singular-ntl-error-handler.patch?h=50b9ae2fd233c30860e1cbb3e63a26f2cc10560a";
|
||||||
|
sha256 = "0vgh4m9zn1kjl0br68n04j4nmn5i1igfn28cph0chnwf7dvr9194";
|
||||||
|
})
|
||||||
|
];
|
||||||
|
|
||||||
# For reference (last checked on commit 75f460d):
|
# For reference (last checked on commit 75f460d):
|
||||||
# https://github.com/Singular/Sources/blob/spielwiese/doc/Building-Singular-from-source.md
|
# https://github.com/Singular/Sources/blob/spielwiese/doc/Building-Singular-from-source.md
|
||||||
# https://github.com/Singular/Sources/blob/spielwiese/doc/external-packages-dynamic-modules.md
|
# https://github.com/Singular/Sources/blob/spielwiese/doc/external-packages-dynamic-modules.md
|
||||||
|
@ -6,19 +6,19 @@
|
|||||||
|
|
||||||
stdenv.mkDerivation rec {
|
stdenv.mkDerivation rec {
|
||||||
name = "cgit-${version}";
|
name = "cgit-${version}";
|
||||||
version = "1.1";
|
version = "1.2.1";
|
||||||
|
|
||||||
src = fetchurl {
|
src = fetchurl {
|
||||||
url = "https://git.zx2c4.com/cgit/snapshot/${name}.tar.xz";
|
url = "https://git.zx2c4.com/cgit/snapshot/${name}.tar.xz";
|
||||||
sha256 = "142qcgs8dwnzhymn0a7xx47p9fc2z5wrb86ah4a9iz0mpqlsz288";
|
sha256 = "1gw2j5xc5qdx2hwiwkr8h6kgya7v9d9ff9j32ga1dys0cca7qm1w";
|
||||||
};
|
};
|
||||||
|
|
||||||
# cgit is tightly coupled with git and needs a git source tree to build.
|
# cgit is tightly coupled with git and needs a git source tree to build.
|
||||||
# IMPORTANT: Remember to check which git version cgit needs on every version
|
# IMPORTANT: Remember to check which git version cgit needs on every version
|
||||||
# bump (look for "GIT_VER" in the top-level Makefile).
|
# bump (look for "GIT_VER" in the top-level Makefile).
|
||||||
gitSrc = fetchurl {
|
gitSrc = fetchurl {
|
||||||
url = "mirror://kernel/software/scm/git/git-2.10.2.tar.xz";
|
url = "mirror://kernel/software/scm/git/git-2.18.0.tar.xz";
|
||||||
sha256 = "0wc64dzcxrzgi6kwcljz6y3cwm3ajdgf6aws7g58azbhvl1jk04l";
|
sha256 = "14hfwfkrci829a9316hnvkglnqqw1p03cw9k56p4fcb078wbwh4b";
|
||||||
};
|
};
|
||||||
|
|
||||||
nativeBuildInputs = [ pkgconfig ] ++ [ python wrapPython ];
|
nativeBuildInputs = [ pkgconfig ] ++ [ python wrapPython ];
|
||||||
|
@ -93,11 +93,12 @@ let
|
|||||||
|
|
||||||
doCheck = false; # fails 10 out of ~2300 tests
|
doCheck = false; # fails 10 out of ~2300 tests
|
||||||
|
|
||||||
meta = {
|
meta = with stdenv.lib; {
|
||||||
description = "A version control system intended to be a compelling replacement for CVS in the open source community";
|
description = "A version control system intended to be a compelling replacement for CVS in the open source community";
|
||||||
|
license = licenses.asl20;
|
||||||
homepage = http://subversion.apache.org/;
|
homepage = http://subversion.apache.org/;
|
||||||
maintainers = with stdenv.lib.maintainers; [ eelco lovek323 ];
|
maintainers = with maintainers; [ eelco lovek323 ];
|
||||||
platforms = stdenv.lib.platforms.linux ++ stdenv.lib.platforms.darwin;
|
platforms = platforms.linux ++ platforms.darwin;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // stdenv.lib.optionalAttrs stdenv.isDarwin {
|
} // stdenv.lib.optionalAttrs stdenv.isDarwin {
|
||||||
|
@ -2,13 +2,13 @@
|
|||||||
|
|
||||||
stdenv.mkDerivation rec {
|
stdenv.mkDerivation rec {
|
||||||
name = "mpc-qt-${version}";
|
name = "mpc-qt-${version}";
|
||||||
version = "18.03";
|
version = "18.08";
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "cmdrkotori";
|
owner = "cmdrkotori";
|
||||||
repo = "mpc-qt";
|
repo = "mpc-qt";
|
||||||
rev = "v${version}";
|
rev = "v${version}";
|
||||||
sha256 = "0mhzdgjgv08cvnscbfndpr0s8ndbcf91b61zfqspa1qv4wlqd716";
|
sha256 = "1rxlkg3vsrapazdlb1i6c5a1vvf2114bsqwzcm3n2wc5c93yqsna";
|
||||||
};
|
};
|
||||||
|
|
||||||
nativeBuildInputs = [ pkgconfig qmake qttools ];
|
nativeBuildInputs = [ pkgconfig qmake qttools ];
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user