Merge remote-tracking branch 'origin/master' into hardened-stdenv

This commit is contained in:
Franz Pletz 2016-07-13 19:05:09 +02:00
commit 0cee9febc5
322 changed files with 8058 additions and 3822 deletions

View file

@ -89,27 +89,27 @@ in ...</programlisting>
<title>&lt;pkg&gt;.overrideDerivation</title>
<warning>
<para>Do not use this function in Nixpkgs. Because it breaks
package abstraction and doesnt provide error checking for
function arguments, it is only intended for ad-hoc customisation
(such as in <filename>~/.nixpkgs/config.nix</filename>).
</para>
<para>
Additionally, <varname>overrideDerivation</varname> forces an evaluation
of the Derivation which can be quite a performance penalty if there are many
overrides used.
<para>Do not use this function in Nixpkgs as it evaluates a Derivation
before modifying it, which breaks package abstraction and removes
error-checking of function arguments. In addition, this
evaluation-per-function application incurs a performance penalty,
which can become a problem if many overrides are used.
It is only intended for ad-hoc customisation, such as in
<filename>~/.nixpkgs/config.nix</filename>.
</para>
</warning>
<para>
The function <varname>overrideDerivation</varname> is usually available for all the
derivations in the nixpkgs expression (<varname>pkgs</varname>).
The function <varname>overrideDerivation</varname> creates a new derivation
based on an existing one by overriding the original's attributes with
the attribute set produced by the specified function.
This function is available on all
derivations defined using the <varname>makeOverridable</varname> function.
Most standard derivation-producing functions, such as
<varname>stdenv.mkDerivation</varname>, are defined using this
function, which means most packages in the nixpkgs expression,
<varname>pkgs</varname>, have this function.
</para>
<para>
It is used to create a new derivation by overriding the attributes of
the original derivation according to the given function.
</para>
<para>
Example usage:
@ -125,9 +125,9 @@ in ...</programlisting>
</para>
<para>
In the above example, the name, src and patches of the derivation
will be overridden, while all other attributes will be retained from the
original derivation.
In the above example, the <varname>name</varname>, <varname>src</varname>,
and <varname>patches</varname> of the derivation will be overridden, while
all other attributes will be retained from the original derivation.
</para>
<para>
@ -135,6 +135,20 @@ in ...</programlisting>
the original derivation.
</para>
<note>
<para>
A package's attributes are evaluated *before* being modified by
the <varname>overrideDerivation</varname> function.
For example, the <varname>name</varname> attribute reference
in <varname>url = "mirror://gnu/hello/${name}.tar.gz";</varname>
is filled-in *before* the <varname>overrideDerivation</varname> function
modifies the attribute set. This means that overriding the
<varname>name</varname> attribute, in this example, *will not* change the
value of the <varname>url</varname> attribute. Instead, we need to override
both the <varname>name</varname> *and* <varname>url</varname> attributes.
</para>
</note>
</section>
<section xml:id="sec-lib-makeOverridable">

View file

@ -457,7 +457,6 @@ rec {
/*** deprecated stuff ***/
deepSeqAttrs = throw "removed 2016-02-29 because unused and broken";
zipWithNames = zipAttrsWithNames;
zip = builtins.trace
"lib.zip is deprecated, use lib.zipAttrsWith instead" zipAttrsWith;

View file

@ -374,8 +374,4 @@ rec {
*/
subtractLists = e: filter (x: !(elem x e));
/*** deprecated stuff ***/
deepSeqList = throw "removed 2016-02-29 because unused and broken";
}

View file

@ -15,6 +15,7 @@
adev = "Adrien Devresse <adev@adev.name>";
Adjective-Object = "Maxwell Huang-Hobbs <mhuan13@gmail.com>";
adnelson = "Allen Nelson <ithinkican@gmail.com>";
adolfogc = "Adolfo E. García Castro <adolfo.garcia.cr@gmail.com>";
aespinosa = "Allan Espinosa <allan.espinosa@outlook.com>";
aflatter = "Alexander Flatter <flatter@fastmail.fm>";
aforemny = "Alexander Foremny <alexanderforemny@googlemail.com>";
@ -185,6 +186,7 @@
joamaki = "Jussi Maki <joamaki@gmail.com>";
joelmo = "Joel Moberg <joel.moberg@gmail.com>";
joelteon = "Joel Taylor <me@joelt.io>";
joko = "Ioannis Koutras <ioannis.koutras@gmail.com>";
jpbernardy = "Jean-Philippe Bernardy <jeanphilippe.bernardy@gmail.com>";
jraygauthier = "Raymond Gauthier <jraygauthier@gmail.com>";
juliendehos = "Julien Dehos <dehos@lisic.univ-littoral.fr>";
@ -231,6 +233,7 @@
markus1189 = "Markus Hauck <markus1189@gmail.com>";
markWot = "Markus Wotringer <markus@wotringer.de>";
martijnvermaat = "Martijn Vermaat <martijn@vermaat.name>";
martingms = "Martin Gammelsæter <martin@mg.am>";
matejc = "Matej Cotman <cotman.matej@gmail.com>";
mathnerd314 = "Mathnerd314 <mathnerd314.gph+hs@gmail.com>";
matthiasbeyer = "Matthias Beyer <mail@beyermatthias.de>";
@ -420,6 +423,7 @@
wscott = "Wayne Scott <wsc9tt@gmail.com>";
wyvie = "Elijah Rum <elijahrum@gmail.com>";
yarr = "Dmitry V. <savraz@gmail.com>";
yurrriq = "Eric Bailey <eric@ericb.me>";
z77z = "Marco Maggesi <maggesi@math.unifi.it>";
zagy = "Christian Zagrodnick <cz@flyingcircus.io>";
zef = "Zef Hemel <zef@zef.me>";

View file

@ -1,3 +1,3 @@
#!/bin/sh
./fetch-kde-qt.sh http://download.kde.org/stable/frameworks/5.22/ -A '*.tar.xz'
./fetch-kde-qt.sh http://download.kde.org/stable/frameworks/5.24/ -A '*.tar.xz'

View file

@ -1,3 +1,3 @@
#!/bin/sh
./fetch-kde-qt.sh http://download.kde.org/stable/plasma/5.6.5/ -A '*.tar.xz'
./fetch-kde-qt.sh http://download.kde.org/stable/plasma/5.7.0/ -A '*.tar.xz'

View file

@ -0,0 +1,102 @@
<refentry xmlns="http://docbook.org/ns/docbook"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xi="http://www.w3.org/2001/XInclude">
<refmeta>
<refentrytitle><command>nixos-version</command></refentrytitle>
<manvolnum>8</manvolnum>
<refmiscinfo class="source">NixOS</refmiscinfo>
</refmeta>
<refnamediv>
<refname><command>nixos-version</command></refname>
<refpurpose>show the version of nixpkgs NixOS was built from</refpurpose>
</refnamediv>
<refsynopsisdiv>
<cmdsynopsis>
<command>nixos-version</command>
<arg><option>--hash</option></arg>
<arg><option>--revision</option></arg>
</cmdsynopsis>
</refsynopsisdiv>
<refsection><title>Description</title>
<para>This command describes the version of nixpkgs used to build
NixOS.</para>
<para>By default the output includes:</para>
<itemizedlist>
<listitem><para>The NixOS release</para></listitem>
<listitem><para>Number of commits since the release</para></listitem>
<listitem><para>Git SHA of the released commit</para></listitem>
<listitem><para>Codename of the NixOS release</para></listitem>
</itemizedlist>
</refsection>
<refsection><title>Example</title>
<para>Here is an example output, and corresponding information:
<screen>$ nixos-version
16.03.1011.6317da4 (Emu)
</screen>
</para>
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>Attribute</entry>
<entry>Value</entry>
</row>
</thead>
<tbody>
<row>
<entry>NixOS Release</entry>
<entry><literal>16.03</literal></entry>
</row>
<row>
<entry>Commit Count</entry>
<entry><literal>1011</literal></entry>
</row>
<row>
<entry>Commit SHA</entry>
<entry><literal>6317da4</literal></entry>
</row>
<row>
<entry>Release Codename</entry>
<entry><literal>Emu</literal></entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>
</para>
</refsection>
<refsection><title>Options</title>
<para>This command accepts the following options:</para>
<variablelist>
<varlistentry>
<term><option>--hash</option></term>
<term><option>--revision</option></term>
<listitem>
<para>The output will be the full hash of the git commit
<screen>$ nixos-version --hash
6317da40006f6bc2480c6781999c52d88dde2acf
</screen>
</para>
</listitem>
</varlistentry>
</variablelist>
</refsection>
</refentry>

View file

@ -27,5 +27,6 @@
<xi:include href="man-nixos-install.xml" />
<xi:include href="man-nixos-option.xml" />
<xi:include href="man-nixos-rebuild.xml" />
<xi:include href="man-nixos-version.xml" />
</reference>

View file

@ -13,8 +13,11 @@ echo "NixOS version is $version ($major)"
rm -f ec2-amis.nix
types="hvm pv"
stores="ebs s3"
regions="eu-west-1 eu-central-1 us-east-1 us-west-1 us-west-2 ap-southeast-1 ap-southeast-2 ap-northeast-1 ap-northeast-2 sa-east-1 ap-south-1"
for type in hvm pv; do
for type in $types; do
link=$stateDir/$type
imageFile=$link/nixos.qcow2
system=x86_64-linux
@ -31,7 +34,7 @@ for type in hvm pv; do
--arg configuration "{ imports = [ <nixpkgs/nixos/maintainers/scripts/ec2/amazon-image.nix> ]; ec2.hvm = $hvmFlag; }"
fi
for store in ebs s3; do
for store in $stores; do
bucket=nixos-amis
bucketDir="$version-$type-$store"
@ -39,7 +42,7 @@ for type in hvm pv; do
prevAmi=
prevRegion=
for region in eu-west-1 eu-central-1 us-east-1 us-west-1 us-west-2 ap-southeast-1 ap-southeast-2 ap-northeast-1 sa-east-1; do
for region in $regions; do
name=nixos-$version-$arch-$type-$store
description="NixOS $system $version ($type-$store)"
@ -51,10 +54,11 @@ for type in hvm pv; do
echo "doing $name in $region..."
if [ -n "$prevAmi" ]; then
ami=$(ec2-copy-image \
ami=$(aws ec2 copy-image \
--region "$region" \
--source-region "$prevRegion" --source-ami-id "$prevAmi" \
--name "$name" --description "$description" | cut -f 2)
--source-region "$prevRegion" --source-image-id "$prevAmi" \
--name "$name" --description "$description" | json -q .ImageId)
if [ "$ami" = null ]; then break; fi
else
if [ $store = s3 ]; then
@ -85,12 +89,12 @@ for type in hvm pv; do
ec2-upload-bundle \
-m $imageDir/$type.raw.manifest.xml \
-b "$bucket/$bucketDir" \
-a "$EC2_ACCESS_KEY" -s "$EC2_SECRET_KEY" \
-a "$AWS_ACCESS_KEY_ID" -s "$AWS_SECRET_ACCESS_KEY" \
--location EU
touch $imageDir/uploaded
fi
extraFlags="$bucket/$bucketDir/$type.raw.manifest.xml"
extraFlags="--image-location $bucket/$bucketDir/$type.raw.manifest.xml"
else
@ -115,7 +119,8 @@ for type in hvm pv; do
if [ -z "$snapId" -a -z "$volId" -a -z "$taskId" ]; then
echo "importing $vhdFile..."
taskId=$(ec2-import-volume $vhdFile --no-upload -f vhd \
-o "$EC2_ACCESS_KEY" -w "$EC2_SECRET_KEY" \
-O "$AWS_ACCESS_KEY_ID" -W "$AWS_SECRET_ACCESS_KEY" \
-o "$AWS_ACCESS_KEY_ID" -w "$AWS_SECRET_ACCESS_KEY" \
--region "$region" -z "${region}a" \
--bucket "$bucket" --prefix "$bucketDir/" \
| tee /dev/stderr \
@ -125,15 +130,16 @@ for type in hvm pv; do
if [ -z "$snapId" -a -z "$volId" ]; then
ec2-resume-import $vhdFile -t "$taskId" --region "$region" \
-o "$EC2_ACCESS_KEY" -w "$EC2_SECRET_KEY"
-O "$AWS_ACCESS_KEY_ID" -W "$AWS_SECRET_ACCESS_KEY" \
-o "$AWS_ACCESS_KEY_ID" -w "$AWS_SECRET_ACCESS_KEY"
fi
# Wait for the volume creation to finish.
if [ -z "$snapId" -a -z "$volId" ]; then
echo "waiting for import to finish..."
while true; do
volId=$(ec2-describe-conversion-tasks "$taskId" --region "$region" | sed 's/.*VolumeId.*\(vol-[0-9a-f]\+\).*/\1/ ; t ; d')
if [ -n "$volId" ]; then break; fi
volId=$(aws ec2 describe-conversion-tasks --conversion-task-ids "$taskId" --region "$region" | jq -r .ConversionTasks[0].ImportVolume.Volume.Id)
if [ "$volId" != null ]; then break; fi
sleep 10
done
@ -143,22 +149,24 @@ for type in hvm pv; do
# Delete the import task.
if [ -n "$volId" -a -n "$taskId" ]; then
echo "removing import task..."
ec2-delete-disk-image -t "$taskId" --region "$region" -o "$EC2_ACCESS_KEY" -w "$EC2_SECRET_KEY" || true
ec2-delete-disk-image -t "$taskId" --region "$region" \
-O "$AWS_ACCESS_KEY_ID" -W "$AWS_SECRET_ACCESS_KEY" \
-o "$AWS_ACCESS_KEY_ID" -w "$AWS_SECRET_ACCESS_KEY" || true
rm -f $stateDir/$region.$type.task-id
fi
# Create a snapshot.
if [ -z "$snapId" ]; then
echo "creating snapshot..."
snapId=$(ec2-create-snapshot "$volId" --region "$region" | cut -f 2)
snapId=$(aws ec2 create-snapshot --volume-id "$volId" --region "$region" --description "$description" | jq -r .SnapshotId)
if [ "$snapId" = null ]; then exit 1; fi
echo -n "$snapId" > $stateDir/$region.$type.snap-id
ec2-create-tags "$snapId" -t "Name=$description" --region "$region"
fi
# Wait for the snapshot to finish.
echo "waiting for snapshot to finish..."
while true; do
status=$(ec2-describe-snapshots "$snapId" --region "$region" | head -n1 | cut -f 4)
status=$(aws ec2 describe-snapshots --snapshot-ids "$snapId" --region "$region" | jq -r .Snapshots[0].State)
if [ "$status" = completed ]; then break; fi
sleep 10
done
@ -166,35 +174,50 @@ for type in hvm pv; do
# Delete the volume.
if [ -n "$volId" ]; then
echo "deleting volume..."
ec2-delete-volume "$volId" --region "$region" || true
aws ec2 delete-volume --volume-id "$volId" --region "$region" || true
rm -f $stateDir/$region.$type.vol-id
fi
extraFlags="-b /dev/sda1=$snapId:$vhdFileLogicalGigaBytes:true:gp2"
blockDeviceMappings="DeviceName=/dev/sda1,Ebs={SnapshotId=$snapId,VolumeSize=$vhdFileLogicalGigaBytes,DeleteOnTermination=true,VolumeType=gp2}"
extraFlags=""
if [ $type = pv ]; then
extraFlags+=" --root-device-name=/dev/sda1"
extraFlags+=" --root-device-name /dev/sda1"
else
extraFlags+=" --root-device-name /dev/sda1"
extraFlags+=" --sriov-net-support simple"
extraFlags+=" --ena-support"
fi
extraFlags+=" -b /dev/sdb=ephemeral0 -b /dev/sdc=ephemeral1 -b /dev/sdd=ephemeral2 -b /dev/sde=ephemeral3"
blockDeviceMappings+=" DeviceName=/dev/sdb,VirtualName=ephemeral0"
blockDeviceMappings+=" DeviceName=/dev/sdc,VirtualName=ephemeral1"
blockDeviceMappings+=" DeviceName=/dev/sdd,VirtualName=ephemeral2"
blockDeviceMappings+=" DeviceName=/dev/sde,VirtualName=ephemeral3"
fi
if [ $type = hvm ]; then
extraFlags+=" --sriov-net-support simple"
extraFlags+=" --ena-support"
fi
# Register the AMI.
if [ $type = pv ]; then
kernel=$(ec2-describe-images -o amazon --filter "manifest-location=*pv-grub-hd0_1.04-$arch*" --region "$region" | cut -f 2)
[ -n "$kernel" ]
kernel=$(aws ec2 describe-images --owner amazon --filters "Name=name,Values=pv-grub-hd0_1.04-$arch.gz" | jq -r .Images[0].ImageId)
if [ "$kernel" = null ]; then break; fi
echo "using PV-GRUB kernel $kernel"
extraFlags+=" --virtualization-type paravirtual --kernel $kernel"
else
extraFlags+=" --virtualization-type hvm"
fi
ami=$(ec2-register \
-n "$name" \
-d "$description" \
ami=$(aws ec2 register-image \
--name "$name" \
--description "$description" \
--region "$region" \
--architecture "$arch" \
$extraFlags | cut -f 2)
--block-device-mappings $blockDeviceMappings \
$extraFlags | jq -r .ImageId)
if [ "$ami" = null ]; then break; fi
fi
echo -n "$ami" > $amiFile
@ -204,23 +227,45 @@ for type in hvm pv; do
ami=$(cat $amiFile)
fi
if [ -z "$NO_WAIT" -o -z "$prevAmi" ]; then
echo "waiting for AMI..."
while true; do
status=$(ec2-describe-images "$ami" --region "$region" | head -n1 | cut -f 5)
if [ "$status" = available ]; then break; fi
sleep 10
done
ec2-modify-image-attribute \
--region "$region" "$ami" -l -a all
fi
echo "region = $region, type = $type, store = $store, ami = $ami"
if [ -z "$prevAmi" ]; then
prevAmi="$ami"
prevRegion="$region"
fi
done
done
done
for type in $types; do
link=$stateDir/$type
system=x86_64-linux
arch=x86_64
for store in $stores; do
for region in $regions; do
name=nixos-$version-$arch-$type-$store
amiFile=$stateDir/$region.$type.$store.ami-id
ami=$(cat $amiFile)
echo "region = $region, type = $type, store = $store, ami = $ami"
echo -n "waiting for AMI..."
while true; do
status=$(aws ec2 describe-images --image-ids "$ami" --region "$region" | jq -r .Images[0].State)
if [ "$status" = available ]; then break; fi
sleep 10
echo -n '.'
done
echo
# Make the image public.
aws ec2 modify-image-attribute \
--image-id "$ami" --region "$region" --launch-permission 'Add={Group=all}'
echo " \"$major\".$region.$type-$store = \"$ami\";" >> ec2-amis.nix
done

View file

@ -4,7 +4,7 @@ with lib;
let
cfg = config.i18n.inputMethod.fcitx;
fcitxPackage = pkgs.fcitx-with-plugins.override { plugins = cfg.engines; };
fcitxPackage = pkgs.fcitx.override { plugins = cfg.engines; };
fcitxEngine = types.package // {
name = "fcitx-engine";
check = x: (lib.types.package.check x) && (attrByPath ["meta" "isFcitxEngine"] false x);

View file

@ -1,6 +1,10 @@
#! @shell@
case "$1" in
-h|--help)
exec man nixos-version
exit 1
;;
--hash|--revision)
echo "@nixosRevision@"
;;

View file

@ -368,6 +368,7 @@
./services/networking/ntopng.nix
./services/networking/ntpd.nix
./services/networking/nylon.nix
./services/networking/offlineimap.nix
./services/networking/oidentd.nix
./services/networking/openfire.nix
./services/networking/openntpd.nix

View file

@ -6,6 +6,7 @@ set meta-flag on
set input-meta on
set convert-meta off
set output-meta on
set colored-stats on
#set mark-symlinked-directories on

View file

@ -78,7 +78,7 @@ in
test -e ${stateDir}/saves/${cfg.saveName}.zip || \
${pkgs.factorio-headless}/bin/factorio \
--config=${cfg.configFile} \
--create=${cfg.saveName}
--create=${stateDir}/saves/${cfg.saveName}.zip
'';
serviceConfig = {
@ -93,7 +93,7 @@ in
"${pkgs.factorio-headless}/bin/factorio"
"--config=${cfg.configFile}"
"--port=${toString cfg.port}"
"--start-server=${cfg.saveName}"
"--start-server=${stateDir}/saves/${cfg.saveName}.zip"
];
};
};

View file

@ -7,22 +7,8 @@ let
stateDir = "/var/spool/ddclient";
ddclientUser = "ddclient";
ddclientFlags = "-foreground -verbose -noquiet -file ${ddclientCfg}";
ddclientFlags = "-foreground -verbose -noquiet -file /etc/ddclient.conf";
ddclientPIDFile = "${stateDir}/ddclient.pid";
ddclientCfg = pkgs.writeText "ddclient.conf" ''
daemon=600
cache=${stateDir}/ddclient.cache
pid=${ddclientPIDFile}
use=${config.services.ddclient.use}
login=${config.services.ddclient.username}
password=${config.services.ddclient.password}
protocol=${config.services.ddclient.protocol}
server=${config.services.ddclient.server}
ssl=${if config.services.ddclient.ssl then "yes" else "no"}
wildcard=YES
${config.services.ddclient.domain}
${config.services.ddclient.extraConfig}
'';
in
@ -122,10 +108,30 @@ in
home = stateDir;
};
environment.etc."ddclient.conf" = {
uid = config.ids.uids.ddclient;
mode = "0600";
text = ''
daemon=600
cache=${stateDir}/ddclient.cache
pid=${ddclientPIDFile}
use=${config.services.ddclient.use}
login=${config.services.ddclient.username}
password=${config.services.ddclient.password}
protocol=${config.services.ddclient.protocol}
server=${config.services.ddclient.server}
ssl=${if config.services.ddclient.ssl then "yes" else "no"}
wildcard=YES
${config.services.ddclient.domain}
${config.services.ddclient.extraConfig}
'';
};
systemd.services.ddclient = {
description = "Dynamic DNS Client";
wantedBy = [ "multi-user.target" ];
after = [ "network.target" ];
restartTriggers = [ config.environment.etc."ddclient.conf".source ];
serviceConfig = {
# Uncomment this if too many problems occur:

View file

@ -0,0 +1,73 @@
{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.services.offlineimap;
in {
options.services.offlineimap = {
enable = mkEnableOption "Offlineimap, a software to dispose your mailbox(es) as a local Maildir(s).";
install = mkOption {
type = types.bool;
default = false;
example = true;
description = ''
Whether to install a user service for Offlineimap. Once
the service is started, emails will be fetched automatically.
The service must be manually started for each user with
"systemctl --user start offlineimap" or globally through
<varname>services.offlineimap.enable</varname>.
'';
};
package = mkOption {
type = types.package;
default = pkgs.offlineimap;
defaultText = "pkgs.offlineimap";
description = "Offlineimap derivation to use.";
};
path = mkOption {
type = types.listOf types.path;
default = [];
example = literalExample "[ pkgs.pass pkgs.bash pkgs.notmuch ]";
description = "List of derivations to put in Offlineimap's path.";
};
onCalendar = mkOption {
type = types.str;
default = "*:0/3"; # every 3 minutes
description = "How often is offlineimap started. Default is '*:0/3' meaning every 3 minutes. See systemd.time(7) for more information about the format.";
};
timeoutStartSec = mkOption {
type = types.str;
default = "120sec"; # Kill if still alive after 2 minutes
description = "How long waiting for offlineimap before killing it. Default is '120sec' meaning every 2 minutes. See systemd.time(7) for more information about the format.";
};
};
config = mkIf (cfg.enable || cfg.install) {
systemd.user.services.offlineimap = {
description = "Offlineimap: a software to dispose your mailbox(es) as a local Maildir(s)";
serviceConfig = {
Type = "oneshot";
ExecStart = "${cfg.package}/bin/offlineimap -u basic -o -1";
TimeoutStartSec = cfg.timeoutStartSec;
};
path = cfg.path;
};
environment.systemPackages = [ "${cfg.package}" ];
systemd.user.timers.offlineimap = {
description = "offlineimap timer";
timerConfig = {
Unit = "offlineimap.service";
OnCalendar = cfg.onCalendar;
# start immediately after computer is started:
Persistent = "true";
};
} // optionalAttrs cfg.enable { wantedBy = [ "default.target" ]; };
};
}

View file

@ -36,6 +36,8 @@ with lib;
config = mkMerge [
(mkIf config.systemd.coredump.enable {
systemd.additionalUpstreamSystemUnits = [ "systemd-coredump.socket" "systemd-coredump@.service" ];
environment.etc."systemd/coredump.conf".text =
''
[Coredump]
@ -45,7 +47,7 @@ with lib;
# Have the kernel pass core dumps to systemd's coredump helper binary.
# From systemd's 50-coredump.conf file. See:
# <https://github.com/systemd/systemd/blob/v218/sysctl.d/50-coredump.conf.in>
boot.kernel.sysctl."kernel.core_pattern" = "|${pkgs.systemd}/lib/systemd/systemd-coredump %p %u %g %s %t %e";
boot.kernel.sysctl."kernel.core_pattern" = "|${pkgs.systemd}/lib/systemd/systemd-coredump %P %u %g %s %t %c %e";
})
(mkIf (!config.systemd.coredump.enable) {

View file

@ -5,5 +5,4 @@ pkgs.substituteAll {
isExecutable = true;
path = [pkgs.coreutils pkgs.gnused pkgs.gnugrep];
inherit (pkgs) bash;
kernelDTB = pkgs.stdenv.platform.kernelDTB or false;
}

View file

@ -75,9 +75,10 @@ addEntry() {
copyToKernelsDir "$path/kernel"; kernel=$result
copyToKernelsDir "$path/initrd"; initrd=$result
if [ -n "@kernelDTB@" ]; then
# XXX UGLY: maybe the system config should have a top-level "dtbs" entry?
copyToKernelsDir $(readlink -m "$path/kernel/../dtbs"); dtbs=$result
# XXX UGLY: maybe the system config should have a top-level "dtbs" entry?
dtbDir=$(readlink -m "$path/kernel/../dtbs")
if [ -d "$dtbDir" ]; then
copyToKernelsDir "$dtbDir"; dtbs=$result
fi
timestampEpoch=$(stat -L -c '%Z' $path)
@ -95,7 +96,7 @@ addEntry() {
fi
echo " LINUX ../nixos/$(basename $kernel)"
echo " INITRD ../nixos/$(basename $initrd)"
if [ -n "@kernelDTB@" ]; then
if [ -d "$dtbDir" ]; then
echo " FDTDIR ../nixos/$(basename $dtbs)"
fi
echo " APPEND systemConfig=$path init=$path/init $extraParams"

View file

@ -764,7 +764,7 @@ in
{ wantedBy = [ "timers.target" ];
timerConfig.OnCalendar = service.startAt;
})
(filterAttrs (name: service: service.startAt != "") cfg.services);
(filterAttrs (name: service: service.enable && service.startAt != "") cfg.services);
# Generate timer units for all services that have a startAt value.
systemd.user.timers =

View file

@ -20,8 +20,12 @@ let cfg = config.ec2; in
autoResize = true;
};
boot.extraModulePackages = [ config.boot.kernelPackages.ixgbevf ];
boot.initrd.kernelModules = [ "xen-blkfront" "xen-netfront" "ixgbevf" ];
boot.extraModulePackages =
[ config.boot.kernelPackages.ixgbevf
config.boot.kernelPackages.ena
];
boot.initrd.kernelModules = [ "xen-blkfront" "xen-netfront" ];
boot.initrd.availableKernelModules = [ "ixgbevf" "ena" ];
boot.kernelParams = mkIf cfg.hvm [ "console=ttyS0" ];
# Prevent the nouveau kernel module from being loaded, as it

View file

@ -90,40 +90,48 @@
"15.09".us-west-2.pv-ebs = "ami-005fb160";
"15.09".us-west-2.pv-s3 = "ami-cd55bbad";
"16.03".ap-northeast-1.hvm-ebs = "ami-b6edf5d8";
"16.03".ap-northeast-1.hvm-s3 = "ami-b1e3fbdf";
"16.03".ap-northeast-1.pv-ebs = "ami-6190880f";
"16.03".ap-northeast-1.pv-s3 = "ami-908d95fe";
"16.03".ap-southeast-1.hvm-ebs = "ami-35b16656";
"16.03".ap-southeast-1.hvm-s3 = "ami-41be6922";
"16.03".ap-southeast-1.pv-ebs = "ami-4cb96e2f";
"16.03".ap-southeast-1.pv-s3 = "ami-3bb96e58";
"16.03".ap-southeast-2.hvm-ebs = "ami-debc91bd";
"16.03".ap-southeast-2.hvm-s3 = "ami-55bc9136";
"16.03".ap-southeast-2.pv-ebs = "ami-b38ba6d0";
"16.03".ap-southeast-2.pv-s3 = "ami-9e8ba6fd";
"16.03".eu-central-1.hvm-ebs = "ami-7c967413";
"16.03".eu-central-1.hvm-s3 = "ami-b29072dd";
"16.03".eu-central-1.pv-ebs = "ami-7a947615";
"16.03".eu-central-1.pv-s3 = "ami-729b791d";
"16.03".eu-west-1.hvm-ebs = "ami-ff27a98c";
"16.03".eu-west-1.hvm-s3 = "ami-6c21af1f";
"16.03".eu-west-1.pv-ebs = "ami-a33cb2d0";
"16.03".eu-west-1.pv-s3 = "ami-ec38b69f";
"16.03".sa-east-1.hvm-ebs = "ami-5bef6637";
"16.03".sa-east-1.hvm-s3 = "ami-55f87139";
"16.03".sa-east-1.pv-ebs = "ami-76e56c1a";
"16.03".sa-east-1.pv-s3 = "ami-e1f8718d";
"16.03".us-east-1.hvm-ebs = "ami-4bfd1926";
"16.03".us-east-1.hvm-s3 = "ami-60c5210d";
"16.03".us-east-1.pv-ebs = "ami-c0c92dad";
"16.03".us-east-1.pv-s3 = "ami-f9d63294";
"16.03".us-west-1.hvm-ebs = "ami-13aad473";
"16.03".us-west-1.hvm-s3 = "ami-e1a8d681";
"16.03".us-west-1.pv-ebs = "ami-c0a6d8a0";
"16.03".us-west-1.pv-s3 = "ami-6aa9d70a";
"16.03".us-west-2.hvm-ebs = "ami-265dad46";
"16.03".us-west-2.hvm-s3 = "ami-cd40b0ad";
"16.03".us-west-2.pv-ebs = "ami-7b4aba1b";
"16.03".us-west-2.pv-s3 = "ami-0849b968";
"16.03".ap-northeast-1.hvm-ebs = "ami-40619d21";
"16.03".ap-northeast-1.hvm-s3 = "ami-ce629eaf";
"16.03".ap-northeast-1.pv-ebs = "ami-ef639f8e";
"16.03".ap-northeast-1.pv-s3 = "ami-a1609cc0";
"16.03".ap-northeast-2.hvm-ebs = "ami-deca00b0";
"16.03".ap-northeast-2.hvm-s3 = "ami-a3b77dcd";
"16.03".ap-northeast-2.pv-ebs = "ami-7bcb0115";
"16.03".ap-northeast-2.pv-s3 = "ami-a2b77dcc";
"16.03".ap-south-1.hvm-ebs = "ami-0dff9562";
"16.03".ap-south-1.hvm-s3 = "ami-13f69c7c";
"16.03".ap-south-1.pv-ebs = "ami-0ef39961";
"16.03".ap-south-1.pv-s3 = "ami-e0c8a28f";
"16.03".ap-southeast-1.hvm-ebs = "ami-5e964a3d";
"16.03".ap-southeast-1.hvm-s3 = "ami-4d964a2e";
"16.03".ap-southeast-1.pv-ebs = "ami-ec9b478f";
"16.03".ap-southeast-1.pv-s3 = "ami-999b47fa";
"16.03".ap-southeast-2.hvm-ebs = "ami-9f7359fc";
"16.03".ap-southeast-2.hvm-s3 = "ami-987359fb";
"16.03".ap-southeast-2.pv-ebs = "ami-a2705ac1";
"16.03".ap-southeast-2.pv-s3 = "ami-a3705ac0";
"16.03".eu-central-1.hvm-ebs = "ami-17a45178";
"16.03".eu-central-1.hvm-s3 = "ami-f9a55096";
"16.03".eu-central-1.pv-ebs = "ami-c8a550a7";
"16.03".eu-central-1.pv-s3 = "ami-6ea45101";
"16.03".eu-west-1.hvm-ebs = "ami-b5b3d5c6";
"16.03".eu-west-1.hvm-s3 = "ami-c986e0ba";
"16.03".eu-west-1.pv-ebs = "ami-b083e5c3";
"16.03".eu-west-1.pv-s3 = "ami-3c83e54f";
"16.03".sa-east-1.hvm-ebs = "ami-f6eb7f9a";
"16.03".sa-east-1.hvm-s3 = "ami-93e773ff";
"16.03".sa-east-1.pv-ebs = "ami-cbb82ca7";
"16.03".sa-east-1.pv-s3 = "ami-abb82cc7";
"16.03".us-east-1.hvm-ebs = "ami-c123a3d6";
"16.03".us-east-1.hvm-s3 = "ami-bc25a5ab";
"16.03".us-east-1.pv-ebs = "ami-bd25a5aa";
"16.03".us-east-1.pv-s3 = "ami-a325a5b4";
"16.03".us-west-1.hvm-ebs = "ami-748bcd14";
"16.03".us-west-1.hvm-s3 = "ami-a68dcbc6";
"16.03".us-west-1.pv-ebs = "ami-048acc64";
"16.03".us-west-1.pv-s3 = "ami-208dcb40";
"16.03".us-west-2.hvm-ebs = "ami-8263a0e2";
"16.03".us-west-2.hvm-s3 = "ami-925c9ff2";
"16.03".us-west-2.pv-ebs = "ami-5e61a23e";
"16.03".us-west-2.pv-s3 = "ami-734c8f13";
}

View file

@ -220,6 +220,7 @@ in rec {
tests.docker = hydraJob (import tests/docker.nix { system = "x86_64-linux"; });
tests.dockerRegistry = hydraJob (import tests/docker-registry.nix { system = "x86_64-linux"; });
tests.dnscrypt-proxy = callTest tests/dnscrypt-proxy.nix { system = "x86_64-linux"; };
tests.ecryptfs = callTest tests/ecryptfs.nix {};
tests.etcd = hydraJob (import tests/etcd.nix { system = "x86_64-linux"; });
tests.ec2-nixops = hydraJob (import tests/ec2.nix { system = "x86_64-linux"; }).boot-ec2-nixops;
tests.ec2-config = hydraJob (import tests/ec2.nix { system = "x86_64-linux"; }).boot-ec2-config;

81
nixos/tests/ecryptfs.nix Normal file
View file

@ -0,0 +1,81 @@
import ./make-test.nix ({ pkgs, ... }:
{
name = "ecryptfs";
machine = { config, pkgs, ... }: {
imports = [ ./common/user-account.nix ];
boot.kernelModules = [ "ecryptfs" ];
security.pam.enableEcryptfs = true;
environment.systemPackages = with pkgs; [ keyutils ];
};
testScript = ''
$machine->waitForUnit("default.target");
# Set alice up with a password and a home
$machine->succeed("(echo foobar; echo foobar) | passwd alice");
$machine->succeed("chown -R alice.users ~alice");
# Migrate alice's home
my $out = $machine->succeed("echo foobar | ecryptfs-migrate-home -u alice");
$machine->log("ecryptfs-migrate-home said: $out");
# Log alice in (ecryptfs passwhrase is wrapped during first login)
$machine->sleep(2); # urgh: wait for username prompt
$machine->sendChars("alice\n");
$machine->sleep(1);
$machine->sendChars("foobar\n");
$machine->sleep(2);
$machine->sendChars("logout\n");
$machine->sleep(2);
# Why do I need to do this??
$machine->succeed("su alice -c ecryptfs-umount-private");
$machine->sleep(1);
$machine->fail("mount | grep ecryptfs"); # check that encrypted home is not mounted
# Show contents of the user keyring
my $out = $machine->succeed("su - alice -c 'keyctl list \@u'");
$machine->log("keyctl unlink said: " . $out);
# Log alice again
$machine->sendChars("alice\n");
$machine->sleep(1);
$machine->sendChars("foobar\n");
$machine->sleep(2);
# Create some files in encrypted home
$machine->succeed("su alice -c 'touch ~alice/a'");
$machine->succeed("su alice -c 'echo c > ~alice/b'");
# Logout
$machine->sendChars("logout\n");
$machine->sleep(2);
# Why do I need to do this??
$machine->succeed("su alice -c ecryptfs-umount-private");
$machine->sleep(1);
# Check that the filesystem is not accessible
$machine->fail("mount | grep ecryptfs");
$machine->succeed("su alice -c 'test \! -f ~alice/a'");
$machine->succeed("su alice -c 'test \! -f ~alice/b'");
# Log alice once more
$machine->sendChars("alice\n");
$machine->sleep(1);
$machine->sendChars("foobar\n");
$machine->sleep(2);
# Check that the files are there
$machine->sleep(1);
$machine->succeed("su alice -c 'test -f ~alice/a'");
$machine->succeed("su alice -c 'test -f ~alice/b'");
$machine->succeed(qq%test "\$(cat ~alice/b)" = "c"%);
# Catch https://github.com/NixOS/nixpkgs/issues/16766
$machine->succeed("su alice -c 'ls -lh ~alice/'");
$machine->sendChars("logout\n");
'';
})

View file

@ -15,7 +15,7 @@ import ./make-test.nix ({ pkgs, ...} : {
services.xserver.displayManager.auto.user = "alice";
services.xserver.desktopManager.gnome3.enable = true;
environment.gnome3.packageSet = pkgs.gnome3_20;
environment.gnome3.packageSet = pkgs.gnome3_18;
virtualisation.memorySize = 512;
};

View file

@ -3,7 +3,7 @@
cln,
cmake,
fetchgit,
gcc5,
gcc,
ginac,
jamomacore,
kde5,
@ -37,7 +37,7 @@ stdenv.mkDerivation rec {
cln
cmake
ginac
gcc5
gcc
jamomacore
kde5.kdnssd
libsndfile

View file

@ -1,7 +1,7 @@
{ stdenv, fetchurl, gtk2, which, pkgconfig, intltool, file }:
let
version = "1.27";
version = "1.28";
in
stdenv.mkDerivation rec {
@ -9,7 +9,7 @@ stdenv.mkDerivation rec {
src = fetchurl {
url = "http://download.geany.org/${name}.tar.bz2";
sha256 = "846ff699a5944c5c3c068ae0199d4c13946a668bfc6d03f8c79765667c20cadf";
sha256 = "0nha21rbdhl10vdpaq8d5v5fszvggl1xar555pvrnvm2y443ffpp";
};
buildInputs = [ gtk2 which pkgconfig intltool file ];

View file

@ -189,13 +189,13 @@ in
idea-community = buildIdea rec {
name = "idea-community-${version}";
version = "2016.1.3";
build = "IC-145.1617.8";
version = "2016.2";
build = "IC-162.1121";
description = "Integrated Development Environment (IDE) by Jetbrains, community edition";
license = stdenv.lib.licenses.asl20;
src = fetchurl {
url = "https://download.jetbrains.com/idea/ideaIC-${version}.tar.gz";
sha256 = "0yd1jqz4arywyjsiakszrr48w2xqnik6vnl1a6l0ph2hssgkzkfi";
sha256 = "164x4l0q31zpc1jh3js1xx9y6afrzsshmnkx1mwhmq8qmvzc4w32";
};
wmClass = "jetbrains-idea-ce";
};
@ -228,13 +228,13 @@ in
idea-ultimate = buildIdea rec {
name = "idea-ultimate-${version}";
version = "2016.1.3";
build = "IU-145.1617.8";
version = "2016.2";
build = "IU-162.1121";
description = "Integrated Development Environment (IDE) by Jetbrains, requires paid license";
license = stdenv.lib.licenses.unfree;
src = fetchurl {
url = "https://download.jetbrains.com/idea/ideaIU-${version}.tar.gz";
sha256 = "1zzxwdnw2bbnl86kj7fjk5p8c99d0hdn1ki2alw5xm8wp4k0w7rv";
sha256 = "10hiqh6ccmai2cnc5p72vqjcz9kzmmcpn0hy5v514h4mq6vs4zk4";
};
wmClass = "jetbrains-idea";
};

View file

@ -1,29 +1,25 @@
{ stdenv, fetchgit, libpng, python3, boost, mesa, qtbase, qmakeHook, ncurses }:
{ stdenv, fetchFromGitHub, libpng, python3, boost, mesa, qtbase, ncurses, cmake, flex, lemon }:
let
gitRev = "745eca3a2d2657c495d5509e9083c884e021d09c";
gitRev = "e8480c718e8c49ae3cc2d7af10ea93ea4c2fff9a";
gitBranch = "master";
gitTag = "0.8.0b";
gitTag = "0.9.2";
in
stdenv.mkDerivation rec {
name = "antimony-${version}";
version = gitTag;
src = fetchgit {
url = "git://github.com/mkeeter/antimony.git";
rev = gitRev;
sha256 = "0azjdkbixz2pyk2yy7a0ya5xk60xgw3l2pd4pj4ijyqxx5jmh0sy";
src = fetchFromGitHub {
owner = "mkeeter";
repo = "antimony";
rev = gitTag;
sha256 = "0fpgy5cb4knz2z9q078206k8wzxfs8b9g76mf4bz1ic77931ykjz";
};
patches = [ ./paths-fix.patch ];
# fix build with glibc-2.23
postPatch = ''
sed 's/\<isinf(/std::isinf(/g' -i \
src/export/export_heightmap.cpp \
src/fab/types/bounds.cpp \
src/graph/hooks/meta.cpp \
src/ui/dialogs/resolution_dialog.cpp \
src/render/render_task.cpp
sed -i "s,/usr/local,$out,g" app/CMakeLists.txt app/app/app.cpp app/app/main.cpp
'';
buildInputs = [
@ -31,15 +27,13 @@ in
mesa qtbase ncurses
];
nativeBuildHooks = [ qmakeHook ];
nativeBuildInputs = [ cmake flex lemon ];
preConfigure = ''
export GITREV=${gitRev}
export GITBRANCH=${gitBranch}
export GITTAG=${gitTag}
cd qt
'';
cmakeFlags= [
"-DGITREV=${gitRev}"
"-DGITTAG=${gitTag}"
"-DGITBRANCH=${gitBranch}"
];
enableParallelBuilding = true;
@ -48,6 +42,5 @@ in
homepage = "https://github.com/mkeeter/antimony";
license = licenses.mit;
platforms = platforms.linux;
broken = true;
};
}

View file

@ -1,99 +1,21 @@
diff --git a/qt/antimony.pro b/qt/antimony.pro
index 9d586f4..b055a6d 100644
--- a/qt/antimony.pro
+++ b/qt/antimony.pro
@@ -12,14 +12,9 @@ QMAKE_CXXFLAGS_RELEASE += -O3
diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt
index ddc5c9b..d80728a 100644
--- a/app/CMakeLists.txt
+++ b/app/CMakeLists.txt
@@ -158,16 +158,6 @@ target_link_libraries(${ANTIMONY_APP}
QMAKE_CXXFLAGS += -Werror=switch
################################################################################
-GITREV = $$system(git log --pretty=format:'%h' -n 1)
-GITDIFF = $$system(git diff --quiet --exit-code || echo "+")
-GITTAG = $$system(git describe --exact-match --tags 2> /dev/null)
-GITBRANCH = $$system(git rev-parse --abbrev-ref HEAD)
-execute_process(COMMAND git log --pretty=format:'%h' -n 1
- OUTPUT_VARIABLE GITREV)
-execute_process(COMMAND bash -c "git diff --quiet --exit-code || echo +"
- OUTPUT_VARIABLE GITDIFF)
-execute_process(COMMAND git describe --exact-match --tags
- OUTPUT_VARIABLE GITTAG
- ERROR_QUIET)
-execute_process(COMMAND git rev-parse --abbrev-ref HEAD
- OUTPUT_VARIABLE GITBRANCH)
-
-QMAKE_CXXFLAGS += "-D'GITREV=\"$${GITREV}$${GITDIFF}\"'"
-QMAKE_CXXFLAGS += "-D'GITTAG=\"$${GITTAG}\"'"
-QMAKE_CXXFLAGS += "-D'GITBRANCH=\"$${GITBRANCH}\"'"
+QMAKE_CXXFLAGS += "-D'GITREV=\"$$(GITREV)\"'"
+QMAKE_CXXFLAGS += "-D'GITTAG=\"$$(GITTAG)\"'"
+QMAKE_CXXFLAGS += "-D'GITBRANCH=\"$$(GITBRANCH)\"'"
OLD_GL_SET = $$(OLD_GL)
equals(OLD_GL_SET, "true") {
@@ -125,11 +120,11 @@ macx {
}
linux {
- executable.path = /usr/local/bin
+ executable.path = $$(out)/bin
executable.files = antimony
- nodes_folder.path = /usr/local/bin/sb/nodes
+ nodes_folder.path = $$(out)/bin/sb/nodes
nodes_folder.files = ../py/nodes/*
- fab_folder.path = /usr/local/bin/sb/fab
+ fab_folder.path = $$(out)/bin/sb/fab
fab_folder.files = ../py/fab/*
INSTALLS += executable nodes_folder fab_folder
}
diff --git a/qt/fab.pri b/qt/fab.pri
index a54813b..b500536 100644
--- a/qt/fab.pri
+++ b/qt/fab.pri
@@ -54,7 +54,7 @@ DEFINES += '_STATIC_= '
linux {
QMAKE_CFLAGS += -std=gnu99
- QMAKE_CXXFLAGS += $$system(/usr/bin/python3-config --includes)
+ QMAKE_CXXFLAGS += $$system(python3-config --includes)
LIBS += -lpng
}
diff --git a/qt/shared.pri b/qt/shared.pri
index e7d0e3a..026eae3 100644
--- a/qt/shared.pri
+++ b/qt/shared.pri
@@ -39,41 +39,11 @@ macx {
}
linux {
- QMAKE_CXXFLAGS += $$system(/usr/bin/python3-config --includes)
- QMAKE_LFLAGS += $$system(/usr/bin/python3-config --ldflags)
+ QMAKE_CXXFLAGS += $$system(python3-config --includes)
+ QMAKE_LFLAGS += $$system(python3-config --ldflags)
# Even though this is in QMAKE_LFLAGS, the linker is picky about
# library ordering (so it needs to be here too).
LIBS += -lpython3.4m
-
- # ldconfig is being used to find libboost_python, but it's in a different
- # place in different distros (and is not in the default $PATH on Debian).
- # First, check to see if it's on the default $PATH.
- system(which ldconfig > /dev/null) {
- LDCONFIG_BIN = "ldconfig"
- }
- # If that failed, then search for it in its usual places.
- isEmpty(LDCONFIG_BIN) {
- for(p, $$list(/sbin/ldconfig /usr/bin/ldconfig)) {
- exists($$p): LDCONFIG_BIN = $$p
- }
- }
- # If that search failed too, then exit with an error.
- isEmpty(LDCONFIG_BIN) {
- error("Could not find ldconfig!")
- }
-
- # Check for different boost::python naming schemes
- LDCONFIG_OUT = $$system($$LDCONFIG_BIN -p|grep python)
- for (b, $$list(boost_python-py34 boost_python3)) {
- contains(LDCONFIG_OUT, "lib$${b}.so") {
- LIBS += "-l$$b"
- GOT_BOOST_PYTHON = True
- }
- }
-
- # If we couldn't find boost::python, exit with an error.
- isEmpty(GOT_BOOST_PYTHON) {
- error("Could not find boost::python3")
- }
+ LIBS += -lboost_python3
}
add_definitions(-D'GITREV="${GITREV}${GITDIFF}"'
-D'GITTAG="${GITTAG}"'
-D'GITBRANCH="${GITBRANCH}"')

View file

@ -2,11 +2,11 @@
, libXinerama, curl, libexif, perlPackages }:
stdenv.mkDerivation rec {
name = "feh-2.15.4";
name = "feh-2.16.1";
src = fetchurl {
url = "http://feh.finalrewind.org/${name}.tar.bz2";
sha256 = "b8a9c29f37b1349228b19866f712b677e2a150837bc46be8c5d6348dd4850758";
sha256 = "1cxnc8dxyl7s4qnkvdjaqx7gdvc6brxpq0qbg91mljg47fd2hmbf";
};
outputs = [ "out" "doc" ];

View file

@ -2,14 +2,14 @@
, libjpeg, libpng, libtiff, libxml2, zlib, libtool, xz
, libX11, libwebp, quantumdepth ? 8}:
let version = "1.3.23"; in
let version = "1.3.24"; in
stdenv.mkDerivation {
name = "graphicsmagick-${version}";
src = fetchurl {
url = "mirror://sourceforge/graphicsmagick/GraphicsMagick-${version}.tar.xz";
sha256 = "03g6l2h8cmf231y1vma0z7x85070jm1ysgs9ppqcd3jj56jka9gx";
sha256 = "1q40w5hcl8rcpszm0r7rpr3a9lj390p39zfvavkvlgxyyk7bmgsj";
};
patches = [ ./disable-popen.patch ];

View file

@ -2,13 +2,13 @@
stdenv.mkDerivation rec {
name = "iterm2-${version}";
version = "3.0.2";
version = "3.0.4";
src = fetchFromGitHub {
owner = "gnachman";
repo = "iTerm2";
rev = "v${version}";
sha256 = "121g759i814y1g1g1jwhsmxgg4wrzv08vq7a7qwc7b85a17zbd3h";
sha256 = "0ffg9l2jvv503h13nd5rjkn5xrahswcqqwmm052qzd6d0lmqjm93";
};
patches = [ ./disable_updates.patch ];

View file

@ -0,0 +1,31 @@
# Description: Fix lighthouse Makefile
Index: Makefile
===================================================================
--- ./Makefile 1970-01-01 02:00:01.000000000 +0200
+++ ./Makefile 1970-01-01 02:00:01.000000000 +0200
@@ -19,21 +19,10 @@
endif
# Library specific
-HAS_GDK := $(shell pkg-config --exists gdk-2.0 echo $?)
-ifdef $(HAS_GDK)
- CFLAGS+=`pkg-config --cflags gdk-2.0`
- LDFLAGS+=`pkg-config --libs gdk-2.0`
-else
- CFLAGS+=-DNO_GDK
-endif
-HAS_PANGO := $(shell pkg-config --exists pango echo $?)
-ifdef $(HAS_PANGO)
- CFLAGS+=`pkg-config --cflags pango`
- LDFLAGS+=`pkg-config --libs pango`
-else
- CFLAGS+=-DNO_PANGO
-endif
-
+CFLAGS+=$(shell pkg-config --cflags gdk-2.0)
+LDFLAGS+=$(shell pkg-config --libs gdk-2.0)
+CFLAGS+=$(shell pkg-config --cflags pango)
+LDFLAGS+=$(shell pkg-config --libs pango)
all: lighthouse

View file

@ -0,0 +1,49 @@
{ stdenv, fetchFromGitHub, pkgconfig
, libX11, libxcb, cairo, gtk, pango, python27, python3
}:
stdenv.mkDerivation rec {
name = "lighthouse-${date}";
date = "2016-01-26";
src = fetchFromGitHub {
owner = "emgram769";
repo = "lighthouse";
rev = "bf11f111572475e855b0329202a14c9e128c7e57";
sha256 = "1ppika61vg4sc9mczbkjqy2mhgxqg57xrnsmmq0h2lyvj0yhg3qn";
};
buildInputs = [
pkgconfig libX11 libxcb cairo gtk pango python27 python3
];
patches = [ ./Makefile.patch ];
lighthouseInstaller = ''
#!${stdenv.shell}
cp -r $out/share/lighthouse/.config/lighthouse \$HOME/.config
chmod -R +w \$HOME/.config/lighthouse
'';
installPhase = ''
mkdir -p $out/bin
cp lighthouse $out/bin
chmod +x config/lighthouse/cmd*
chmod +x config/lighthouse/google.py
patchShebangs config/lighthouse/
patchShebangs config/lighthouse/scripts/
mkdir -p $out/share/lighthouse/.config
cp -r config/lighthouse $out/share/lighthouse/.config
echo "${lighthouseInstaller}" > $out/bin/lighthouse-install
chmod +x $out/bin/lighthouse-install
'';
meta = with stdenv.lib; {
description = "A simple flexible popup dialog to run on X";
homepage = https://github.com/emgram769/lighthouse;
license = licenses.mit;
maintainers = with maintainers; [ ramkromberg ];
platforms = platforms.linux;
};
}

View file

@ -0,0 +1,30 @@
{ stdenv, lib, buildGoPackage, fetchgit }:
buildGoPackage rec {
name = "mop-${version}";
version = "0.2.0";
rev = "bc666ec165d08b43134f7ec0bf29083ad5466243";
goPackagePath = "github.com/michaeldv/mop";
goDeps = ./deps.json;
preConfigure = ''
for i in $(find . -type f);do
substituteInPlace $i --replace michaeldv/termbox-go nsf/termbox-go
done
substituteInPlace Makefile --replace mop/cmd mop/mop
mv cmd mop
'';
src = fetchgit {
inherit rev;
url = "https://github.com/mop-tracker/mop";
sha256 = "0zp51g9i8rw6acs4vnrxclbxa5z1v0a0m1xx27szszp0rphcczkx";
};
meta = {
description = "Simple stock tracker implemented in go";
homepage = https://github.com/mop-tracker/mop;
platforms = stdenv.lib.platforms.all;
};
}

View file

@ -0,0 +1,8 @@
[
{
"include": "../../libs.json",
"packages": [
"github.com/nsf/termbox-go"
]
}
]

View file

@ -1,4 +1,4 @@
{ stdenv, fetchurl, fetchpatch, pkgconfig, gnome_doc_utils, intltool
{ stdenv, fetchurl, fetchpatch, pkgconfig, gnome_doc_utils, intltool, lib
, mono, gtk-sharp, gnome-sharp, hyena
, which, makeWrapper, glib, gnome3, poppler, wrapGAppsHook
}:
@ -33,12 +33,7 @@ stdenv.mkDerivation rec {
--add-flags "$out/lib/pdfmod/PdfMod.exe" \
--prefix MONO_GAC_PREFIX : ${gtk-sharp} \
--prefix MONO_GAC_PREFIX : ${gnome-sharp} \
--prefix LD_LIBRARY_PATH : ${glib}/lib \
--prefix LD_LIBRARY_PATH : ${gtk-sharp}/lib \
--prefix LD_LIBRARY_PATH : ${gnome-sharp}/lib \
--prefix LD_LIBRARY_PATH : ${gtk-sharp.gtk}/lib \
--prefix LD_LIBRARY_PATH : ${gnome3.gconf}/lib \
--prefix LD_LIBRARY_PATH : ${poppler.out}/lib
--prefix LD_LIBRARY_PATH : ${lib.makeLibraryPath [ glib gnome-sharp gnome3.gconf gtk-sharp gtk-sharp.gtk poppler ]}
'';
dontStrip = true;

View file

@ -42,12 +42,9 @@ assert stdenv.isLinux;
let
generated = if channel == "stable" then (import ./sources.nix)
else if channel == "beta" then (import ./beta_sources.nix)
else if channel == "developer" then { version = "49.0a2"; sources = [
{ locale = "en-US"; arch = "linux-i686"; sha512 = "45dad182bf7a4e753c1be6b8f966393a06531e7b5530238d20cb67b26324e8f5d0eeec983a0855418f31187d3ae508c28810ab86269848b4e48ab2ca3b5d21e7"; }
{ locale = "en-US"; arch = "linux-x86_64"; sha512 = "cfcbfc633b51612a62267c8a1afc25af212eb832d1fa876a1ffd82421e9378f96b3ac1488446f804518290abd99c21c9f10e4d0e0f699432aeb74b63305d7edc"; }
]; }
generated = if channel == "stable" then (import ./sources.nix)
else if channel == "beta" then (import ./beta_sources.nix)
else if channel == "developer" then (import ./dev_sources.nix)
else builtins.abort "Wrong channel! Channel must be one of `stable`, `beta` or `developer`";
inherit (generated) version sources;

View file

@ -0,0 +1,12 @@
# This file is generated from generate_sources_dev.rb. DO NOT EDIT.
# Execute the following command to update the file.
#
# ruby generate_sources_dev.rb 49.0a2 > dev_sources.nix
{
version = "49.0a2";
sources = [
{ locale = "en-US"; arch = "linux-i686"; sha512 = "85c4289e561d2246f96a05e3b8df011337984b9f176670826a705c2cd68a1284056ba507e4b6e4887595bf37f25386d9f7b28a20bc1f125865b9fd7b8be17eaa"; }
{ locale = "en-US"; arch = "linux-x86_64"; sha512 = "2bf9518dbfbb48348f74929c19d03e8daf51020bf9ba6db577a202b6e98ad7ffb9e9a0b4ca92af010cd3f864ae84940b65438f4230e6de3165f72e4e7280086d"; }
];
}

View file

@ -0,0 +1,53 @@
#!/usr/bin/env ruby
require "open-uri"
version =
if ARGV.empty?
$stderr.puts("Usage: ruby generate_sources_dev.rb <version> > dev_sources.nix")
exit(-1)
else
ARGV[0]
end
base_url = "http://download-installer.cdn.mozilla.net/pub/firefox/nightly/latest-mozilla-aurora"
arches = ["linux-i686", "linux-x86_64"]
locales = ["en-US"]
sources = []
Source = Struct.new(:hash, :arch, :locale, :filename)
locales.each do |locale|
arches.each do |arch|
basename = "firefox-#{version}.#{locale}.#{arch}"
filename = basename + ".tar.bz2"
sha512 = open("#{base_url}/#{basename}.checksums").each_line
.find(filename).first
.split(" ").first
sources << Source.new(sha512, arch, locale, filename)
end
end
sources = sources.sort_by do |source|
[source.locale, source.arch]
end
puts(<<"EOH")
# This file is generated from generate_sources_dev.rb. DO NOT EDIT.
# Execute the following command to update the file.
#
# ruby generate_sources_dev.rb 49.0a2 > dev_sources.nix
{
version = "#{version}";
sources = [
EOH
sources.each do |source|
puts(%Q| { locale = "#{source.locale}"; arch = "#{source.arch}"; sha512 = "#{source.hash}"; }|)
end
puts(<<'EOF')
];
}
EOF

View file

@ -17,11 +17,11 @@ in
stdenv.mkDerivation rec {
name = "bluejeans-${version}";
version = "2.160.49.8";
version = "2.160.63.8";
src = fetchurl {
url = "https://swdl.bluejeans.com/skinny/bjnplugin_${version}-1_amd64.deb";
sha256 = "1hf4jx0d1wiv622rwck0mm8cckm121yszviw47jsw0mjnp91hqch";
sha256 = "1sfz9xvvrbw7gg7fxxwg9wmgbxgv3fa14p7i4m85mg10l3qxaqfc";
};
phases = [ "unpackPhase" "installPhase" "fixupPhase" ];

View file

@ -1,13 +1,13 @@
{ stdenv, fetchurl, dbus, gnutls, wxGTK30, libidn, tinyxml, gettext
, pkgconfig, xdg_utils, gtk2, sqlite, pugixml, libfilezilla, nettle }:
let version = "3.18.0"; in
let version = "3.19.0"; in
stdenv.mkDerivation {
name = "filezilla-${version}";
src = fetchurl {
url = "mirror://sourceforge/project/filezilla/FileZilla_Client/${version}/FileZilla_${version}_src.tar.bz2";
sha256 = "1qnpbx2684r529ldih6fi5anjlcgqn2xfcls0q38iadrk1qnqr1p";
sha256 = "0827z1jmn8pkzrcpjgh5yh2r23vgv73yb4rikraxa9i7l118g9l2";
};
configureFlags = [

View file

@ -0,0 +1,105 @@
{ alsaLib
, fetchurl
, gcc
, glib
, gst_plugins_base
, gstreamer
, icu_54_1
, libpulseaudio
, libuuid
, libxml2
, libxslt
, makeQtWrapper
, qt55
, sqlite
, stdenv
, xlibs
, xorg
, zlib
}:
stdenv.mkDerivation rec {
name = "zoom-us";
meta = {
homepage = http://zoom.us;
description = "zoom.us instant messenger";
license = stdenv.lib.licenses.unfree;
platforms = stdenv.lib.platforms.linux;
};
version = "2.0.52458.0531";
src = fetchurl {
url = "https://zoom.us/client/latest/zoom_${version}_x86_64.tar.xz";
sha256 = "16d64pn9j27v3fnh4c9i32vpkr10q1yr26w14964n0af1mv5jf7a";
};
phases = [ "unpackPhase" "installPhase" ];
nativeBuildInputs = [ makeQtWrapper ];
libPath = stdenv.lib.makeLibraryPath [
alsaLib
gcc.cc
glib
gst_plugins_base
gstreamer
icu_54_1
libpulseaudio
libuuid
libxml2
libxslt
qt55.qtbase
qt55.qtdeclarative
qt55.qtscript
qt55.qtwebkit
sqlite
xlibs.xcbutilkeysyms
xorg.libX11
xorg.libxcb
xorg.libXcomposite
xorg.libXext
xorg.libXfixes
xorg.libXrender
xorg.xcbutilimage
zlib
];
installPhase = ''
mkdir -p $out/share
cp -r \
application-x-zoom.png \
audio \
imageformats \
chrome.bmp \
config-dump.sh \
dingdong1.pcm \
dingdong.pcm \
doc \
Droplet.pcm \
Droplet.wav \
platforminputcontexts \
platforms \
platformthemes \
Qt \
QtMultimedia \
QtQml \
QtQuick \
QtQuick.2 \
QtWebKit \
QtWebProcess \
ring.pcm \
ring.wav \
version.txt \
xcbglintegrations \
zcacert.pem \
zoom \
Zoom.png \
ZXMPPROOT.cer \
$out/share
patchelf \
--set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
--set-rpath ${libPath} \
$out/share/zoom
wrapQtProgram "$out/share/zoom"
mkdir -p $out/bin
ln -s $out/share/zoom $out/bin/zoom-us
'';
}

View file

@ -1,43 +1,51 @@
{ stdenv, fetchurl, ncurses, which, perl, autoreconfHook
, sslSupport ? true
, imapSupport ? true
, headerCache ? true
, saslSupport ? true
, gpgmeSupport ? true
, gdbm ? null
, openssl ? null
, cyrus_sasl ? null
, gpgme ? null
, withSidebar ? false
, aclocal ? null
, headerCache ? true
, sslSupport ? true
, saslSupport ? true
, gpgmeSupport ? true
, imapSupport ? true
, withSidebar ? false
, withTrash ? false
}:
assert headerCache -> gdbm != null;
assert sslSupport -> openssl != null;
assert saslSupport -> cyrus_sasl != null;
assert gpgmeSupport -> gpgme != null;
assert headerCache -> gdbm != null;
assert sslSupport -> openssl != null;
assert saslSupport -> cyrus_sasl != null;
assert gpgmeSupport -> gpgme != null;
with stdenv.lib;
let
version = "1.6.0";
in
stdenv.mkDerivation rec {
name = "mutt${stdenv.lib.optionalString withSidebar "-with-sidebar"}-${version}";
name = "mutt-${version}";
version = "1.6.2";
src = fetchurl {
url = "http://ftp.mutt.org/pub/mutt/mutt-${version}.tar.gz";
sha256 = "06bc2drbgalkk68rzg7hq2v5m5qgjxff5357wg0419dpi8ivdbr9";
url = "http://ftp.mutt.org/pub/mutt/${name}.tar.gz";
sha256 = "13hxmji7v9m2agmvzrs7gzx8s3c9jiwrv7pbkr7z1kc6ckq2xl65";
};
buildInputs = with stdenv.lib;
buildInputs =
[ ncurses which perl ]
++ optional headerCache gdbm
++ optional sslSupport openssl
++ optional saslSupport cyrus_sasl
++ optional gpgmeSupport gpgme;
nativeBuildInputs = stdenv.lib.optional withSidebar autoreconfHook;
++ optional headerCache gdbm
++ optional sslSupport openssl
++ optional saslSupport cyrus_sasl
++ optional gpgmeSupport gpgme
++ optional withSidebar autoreconfHook;
configureFlags = [
"--with-mailpath=" "--enable-smtp"
(enableFeature headerCache "hcache")
(enableFeature gpgmeSupport "gpgme")
(enableFeature imapSupport "imap")
(enableFeature withSidebar "sidebar")
"--enable-smtp"
"--enable-pop"
"--enable-imap"
"--with-mailpath="
# Look in $PATH at runtime, instead of hardcoding /usr/bin/sendmail
"ac_cv_path_SENDMAIL=sendmail"
@ -45,36 +53,22 @@ stdenv.mkDerivation rec {
# This allows calls with "-d N", that output debug info into ~/.muttdebug*
"--enable-debug"
"--enable-pop" "--enable-imap"
# The next allows building mutt without having anything setgid
# set by the installer, and removing the need for the group 'mail'
# I set the value 'mailbox' because it is a default in the configure script
"--with-homespool=mailbox"
(if headerCache then "--enable-hcache" else "--disable-hcache")
(if sslSupport then "--with-ssl" else "--without-ssl")
(if imapSupport then "--enable-imap" else "--disable-imap")
(if saslSupport then "--with-sasl" else "--without-sasl")
(if gpgmeSupport then "--enable-gpgme" else "--disable-gpgme")
];
] ++ optional sslSupport "--with-ssl"
++ optional saslSupport "--with-sasl";
# Adding the sidebar
patches = stdenv.lib.optional withSidebar [
./trash-folder.patch
./sidebar.patch
./sidebar-dotpathsep.patch
./sidebar-utf8.patch
./sidebar-newonly.patch
./sidebar-delimnullwide.patch
./sidebar-compose.patch
./sidebar-new.patch
];
patches =
optional withTrash ./trash.patch ++
optional withSidebar ./sidebar.patch;
meta = with stdenv.lib; {
meta = {
description = "A small but very powerful text-based mail client";
homepage = http://www.mutt.org;
license = stdenv.lib.licenses.gpl2Plus;
license = licenses.gpl2Plus;
platforms = platforms.unix;
maintainers = with maintainers; [ the-kenny ];
maintainers = with maintainers; [ the-kenny rnhmjoj ];
};
}

View file

@ -1,40 +0,0 @@
From: Evgeni Golov <evgeni@debian.org>
Date: Fri, 14 Mar 2014 08:54:47 +0100
Subject: sidebar-compose
draw_sidebar sets SidebarWidth to 0 when sidebar_visible is false.
However, if you start mutt in compose mode, draw_sidebar won't be
called until the next redraw and your header lines will be off by
the width of the sidebar, even when you did not want a sidebar at
all.
Can be tested with:
HOME=/ LC_ALL=C mutt -e 'unset sidebar_visible' -s test recipient
Closes: #502627
Gbp-Pq: Topic mutt-patched
---
compose.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/compose.c b/compose.c
index b63695f..0fa6df2 100644
--- a/compose.c
+++ b/compose.c
@@ -32,6 +32,7 @@
#include "mailbox.h"
#include "sort.h"
#include "charset.h"
+#include "sidebar.h"
#ifdef MIXMASTER
#include "remailer.h"
@@ -248,6 +249,7 @@ static void draw_envelope_addr (int line, ADDRESS *addr)
static void draw_envelope (HEADER *msg, char *fcc)
{
+ draw_sidebar (MENU_COMPOSE);
draw_envelope_addr (HDR_FROM, msg->env->from);
draw_envelope_addr (HDR_TO, msg->env->to);
draw_envelope_addr (HDR_CC, msg->env->cc);

View file

@ -1,38 +0,0 @@
From: Evgeni Golov <sargentd@die-welt.net>
Date: Wed, 5 Mar 2014 17:46:07 +0100
Subject: sidebar-delimnullwide
SidebarDelim can be NULL and strlen(NULL) is a bad idea, as it will segfault.
Wrap it with NONULL().
While at it, change strlen to mbstowcs for better utf8 support.
Closes: #696145, #663883
Gbp-Pq: Topic mutt-patched
---
sidebar.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/sidebar.c b/sidebar.c
index 51a25ca..c3ea338 100644
--- a/sidebar.c
+++ b/sidebar.c
@@ -88,7 +88,7 @@ char *make_sidebar_entry(char *box, int size, int new, int flagged)
int box_len, box_bytes;
int int_len;
int right_offset = 0;
- int delim_len = strlen(SidebarDelim);
+ int delim_len = mbstowcs(NULL, NONULL(SidebarDelim), 0);
static char *entry;
right_width = left_width = 0;
@@ -178,7 +178,7 @@ int draw_sidebar(int menu) {
#ifndef USE_SLANG_CURSES
attr_t attrs;
#endif
- short delim_len = strlen(SidebarDelim);
+ short delim_len = mbstowcs(NULL, NONULL(SidebarDelim), 0);
short color_pair;
static bool initialized = false;

View file

@ -1,98 +0,0 @@
From: Fabian Groffen <grobian@gentoo.org>
Date: Tue, 4 Mar 2014 21:12:15 +0100
Subject: sidebar-dotpathsep
Make path separators for sidebar folders configurable.
When using IMAP, a '.' is often used as path separator, hence make the
path separators configurable through sidebar_delim_chars variable.
It defaults to "/." to work for both mboxes as well as IMAP folders. It
can be set to only "/" or "." or whichever character desired as needed.
Gbp-Pq: Topic mutt-patched
---
globals.h | 1 +
init.h | 8 ++++++++
sidebar.c | 31 ++++++++++++++++++++++++-------
3 files changed, 33 insertions(+), 7 deletions(-)
diff --git a/globals.h b/globals.h
index 004c795..602f932 100644
--- a/globals.h
+++ b/globals.h
@@ -119,6 +119,7 @@ WHERE char *SendCharset;
WHERE char *Sendmail;
WHERE char *Shell;
WHERE char *SidebarDelim;
+WHERE char *SidebarDelimChars INITVAL (NULL);
WHERE char *Signature;
WHERE char *SimpleSearch;
#if USE_SMTP
diff --git a/init.h b/init.h
index c664e5f..166671b 100644
--- a/init.h
+++ b/init.h
@@ -2051,6 +2051,14 @@ struct option_t MuttVars[] = {
** .pp
** The width of the sidebar.
*/
+ { "sidebar_delim_chars", DT_STR, R_NONE, UL &SidebarDelimChars, UL "/." },
+ /*
+ ** .pp
+ ** This contains the list of characters which you would like to treat
+ ** as folder separators for displaying paths in the sidebar. If
+ ** you're not using IMAP folders, you probably prefer setting this to "/"
+ ** alone.
+ */
{ "pgp_use_gpg_agent", DT_BOOL, R_NONE, OPTUSEGPGAGENT, 0},
/*
** .pp
diff --git a/sidebar.c b/sidebar.c
index 6098c2a..4356ffc 100644
--- a/sidebar.c
+++ b/sidebar.c
@@ -249,20 +249,37 @@ int draw_sidebar(int menu) {
// calculate depth of current folder and generate its display name with indented spaces
int sidebar_folder_depth = 0;
char *sidebar_folder_name;
- sidebar_folder_name = basename(tmp->path);
+ int i;
+ sidebar_folder_name = tmp->path;
+ /* disregard a trailing separator, so strlen() - 2
+ * https://bugs.gentoo.org/show_bug.cgi?id=373197#c16 */
+ for (i = strlen(sidebar_folder_name) - 2; i >= 0; i--) {
+ if (SidebarDelimChars &&
+ strchr(SidebarDelimChars, sidebar_folder_name[i]))
+ {
+ sidebar_folder_name += i + 1;
+ break;
+ }
+ }
if ( maildir_is_prefix ) {
char *tmp_folder_name;
- int i;
+ int lastsep = 0;
tmp_folder_name = tmp->path + strlen(Maildir);
- for (i = 0; i < strlen(tmp->path) - strlen(Maildir); i++) {
- if (tmp_folder_name[i] == '/') sidebar_folder_depth++;
- }
+ for (i = 0; i < strlen(tmp_folder_name) - 1; i++) {
+ if (SidebarDelimChars &&
+ strchr(SidebarDelimChars, tmp_folder_name[i]))
+ {
+ sidebar_folder_depth++;
+ lastsep = i + 1;
+ }
+ }
if (sidebar_folder_depth > 0) {
- sidebar_folder_name = malloc(strlen(basename(tmp->path)) + sidebar_folder_depth + 1);
+ tmp_folder_name += lastsep; /* basename */
+ sidebar_folder_name = malloc(strlen(tmp_folder_name) + sidebar_folder_depth + 1);
for (i=0; i < sidebar_folder_depth; i++)
sidebar_folder_name[i]=' ';
sidebar_folder_name[i]=0;
- strncat(sidebar_folder_name, basename(tmp->path), strlen(basename(tmp->path)) + sidebar_folder_depth);
+ strncat(sidebar_folder_name, tmp_folder_name, strlen(tmp_folder_name) + sidebar_folder_depth);
}
}
printw( "%.*s", SidebarWidth - delim_len + 1,

View file

@ -1,97 +0,0 @@
From 355399bde98203af59d20821f9e840fc056bd383 Mon Sep 17 00:00:00 2001
From: Julius Haertl <jus@bitgrid.net>
Date: Tue, 9 Sep 2014 22:31:49 +0200
Subject: Patch for sidebar iteration functionality
sidebar-new will move the selected folder to the next with new messages.
If the end is reached, it will start at the top.
Useful macros would be:
macro index <esc>a "<sidebar-new><sidebar-open>"
macro pager <esc>a "<exit><sidebar-new><sidebar-open>"
---
OPS | 1 +
curs_main.c | 1 +
functions.h | 2 ++
pager.c | 1 +
sidebar.c | 10 ++++++++++
5 files changed, 15 insertions(+)
diff --git a/OPS b/OPS
index 1ed9c96..3ffb82a 100644
--- a/OPS
+++ b/OPS
@@ -187,3 +187,4 @@ OP_SIDEBAR_PREV "go to previous mailbox"
OP_SIDEBAR_OPEN "open hilighted mailbox"
OP_SIDEBAR_NEXT_NEW "go down to next mailbox with new mail"
OP_SIDEBAR_PREV_NEW "go to previous mailbox with new mail"
+OP_SIDEBAR_NEW "iterate though mailboxes with new mail"
diff --git a/curs_main.c b/curs_main.c
index acb106d..2e35f90 100644
--- a/curs_main.c
+++ b/curs_main.c
@@ -2328,6 +2328,7 @@ int mutt_index_menu (void)
case OP_SIDEBAR_PREV:
case OP_SIDEBAR_NEXT_NEW:
case OP_SIDEBAR_PREV_NEW:
+ case OP_SIDEBAR_NEW:
scroll_sidebar(op, menu->menu);
break;
default:
diff --git a/functions.h b/functions.h
index 363b4d5..1485080 100644
--- a/functions.h
+++ b/functions.h
@@ -176,6 +176,7 @@ const struct binding_t OpMain[] = { /* map: index */
{ "sidebar-prev", OP_SIDEBAR_PREV, NULL },
{ "sidebar-next-new", OP_SIDEBAR_NEXT_NEW, NULL},
{ "sidebar-prev-new", OP_SIDEBAR_PREV_NEW, NULL},
+ { "sidebar-new", OP_SIDEBAR_NEW, NULL },
{ "sidebar-open", OP_SIDEBAR_OPEN, NULL },
{ NULL, 0, NULL }
};
@@ -287,6 +288,7 @@ const struct binding_t OpPager[] = { /* map: pager */
{ "sidebar-prev", OP_SIDEBAR_PREV, NULL },
{ "sidebar-next-new", OP_SIDEBAR_NEXT_NEW, NULL},
{ "sidebar-prev-new", OP_SIDEBAR_PREV_NEW, NULL},
+ { "sidebar-new", OP_SIDEBAR_NEW, NULL },
{ "sidebar-open", OP_SIDEBAR_OPEN, NULL },
{ NULL, 0, NULL }
};
diff --git a/pager.c b/pager.c
index 8d64fe1..696e55c 100644
--- a/pager.c
+++ b/pager.c
@@ -2791,6 +2791,7 @@ search_next:
case OP_SIDEBAR_PREV:
case OP_SIDEBAR_NEXT_NEW:
case OP_SIDEBAR_PREV_NEW:
+ case OP_SIDEBAR_NEW:
scroll_sidebar(ch, MENU_PAGER);
break;
diff --git a/sidebar.c b/sidebar.c
index c3ea338..eb8ecd2 100644
--- a/sidebar.c
+++ b/sidebar.c
@@ -429,6 +429,16 @@ void scroll_sidebar(int op, int menu)
CurBuffy = CurBuffy->next;
}
break;
+ case OP_SIDEBAR_NEW:
+ if ( (tmp = exist_next_new()) == NULL)
+ tmp = TopBuffy;
+ if ( tmp->msg_unread == 0 ) {
+ CurBuffy = tmp;
+ tmp = exist_next_new();
+ }
+ if ( tmp != NULL )
+ CurBuffy = tmp;
+ break;
default:
return;
}
--
2.6.0.rc0.2.g7662973.dirty

View file

@ -1,198 +0,0 @@
From: Steve Kemp <steve@steve.org.uk>
Date: Tue, 4 Mar 2014 22:07:06 +0100
Subject: sidebar-newonly
patches written by Steve Kemp, it adds two new functionalities to the sidebar,
so only the mailbox with new messages will be shown (and/or) selected
See Debian bug http://bugs.debian.org/532510
Gbp-Pq: Topic mutt-patched
---
OPS | 2 ++
curs_main.c | 2 ++
functions.h | 4 ++++
init.h | 5 +++++
mutt.h | 2 ++
pager.c | 2 ++
sidebar.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
7 files changed, 70 insertions(+), 2 deletions(-)
diff --git a/OPS b/OPS
index b036db9..1ed9c96 100644
--- a/OPS
+++ b/OPS
@@ -185,3 +185,5 @@ OP_SIDEBAR_SCROLL_DOWN "scroll the mailbox pane down 1 page"
OP_SIDEBAR_NEXT "go down to next mailbox"
OP_SIDEBAR_PREV "go to previous mailbox"
OP_SIDEBAR_OPEN "open hilighted mailbox"
+OP_SIDEBAR_NEXT_NEW "go down to next mailbox with new mail"
+OP_SIDEBAR_PREV_NEW "go to previous mailbox with new mail"
diff --git a/curs_main.c b/curs_main.c
index ea530a6..acb106d 100644
--- a/curs_main.c
+++ b/curs_main.c
@@ -2326,6 +2326,8 @@ int mutt_index_menu (void)
case OP_SIDEBAR_SCROLL_DOWN:
case OP_SIDEBAR_NEXT:
case OP_SIDEBAR_PREV:
+ case OP_SIDEBAR_NEXT_NEW:
+ case OP_SIDEBAR_PREV_NEW:
scroll_sidebar(op, menu->menu);
break;
default:
diff --git a/functions.h b/functions.h
index ef8937a..363b4d5 100644
--- a/functions.h
+++ b/functions.h
@@ -174,6 +174,8 @@ const struct binding_t OpMain[] = { /* map: index */
{ "sidebar-scroll-down", OP_SIDEBAR_SCROLL_DOWN, NULL },
{ "sidebar-next", OP_SIDEBAR_NEXT, NULL },
{ "sidebar-prev", OP_SIDEBAR_PREV, NULL },
+ { "sidebar-next-new", OP_SIDEBAR_NEXT_NEW, NULL},
+ { "sidebar-prev-new", OP_SIDEBAR_PREV_NEW, NULL},
{ "sidebar-open", OP_SIDEBAR_OPEN, NULL },
{ NULL, 0, NULL }
};
@@ -283,6 +285,8 @@ const struct binding_t OpPager[] = { /* map: pager */
{ "sidebar-scroll-down", OP_SIDEBAR_SCROLL_DOWN, NULL },
{ "sidebar-next", OP_SIDEBAR_NEXT, NULL },
{ "sidebar-prev", OP_SIDEBAR_PREV, NULL },
+ { "sidebar-next-new", OP_SIDEBAR_NEXT_NEW, NULL},
+ { "sidebar-prev-new", OP_SIDEBAR_PREV_NEW, NULL},
{ "sidebar-open", OP_SIDEBAR_OPEN, NULL },
{ NULL, 0, NULL }
};
diff --git a/init.h b/init.h
index 166671b..a5d4238 100644
--- a/init.h
+++ b/init.h
@@ -2059,6 +2059,11 @@ struct option_t MuttVars[] = {
** you're not using IMAP folders, you probably prefer setting this to "/"
** alone.
*/
+ {"sidebar_newmail_only", DT_BOOL, R_BOTH, OPTSIDEBARNEWMAILONLY, 0 },
+ /*
+ ** .pp
+ ** Show only new mail in the sidebar.
+ */
{ "pgp_use_gpg_agent", DT_BOOL, R_NONE, OPTUSEGPGAGENT, 0},
/*
** .pp
diff --git a/mutt.h b/mutt.h
index 5f25406..d73e514 100644
--- a/mutt.h
+++ b/mutt.h
@@ -529,6 +529,8 @@ enum
OPTDONTHANDLEPGPKEYS, /* (pseudo) used to extract PGP keys */
OPTUNBUFFEREDINPUT, /* (pseudo) don't use key buffer */
+ OPTSIDEBARNEWMAILONLY,
+
OPTMAX
};
diff --git a/pager.c b/pager.c
index 5cfcb75..8d64fe1 100644
--- a/pager.c
+++ b/pager.c
@@ -2789,6 +2789,8 @@ search_next:
case OP_SIDEBAR_SCROLL_DOWN:
case OP_SIDEBAR_NEXT:
case OP_SIDEBAR_PREV:
+ case OP_SIDEBAR_NEXT_NEW:
+ case OP_SIDEBAR_PREV_NEW:
scroll_sidebar(ch, MENU_PAGER);
break;
diff --git a/sidebar.c b/sidebar.c
index 8f58f85..51a25ca 100644
--- a/sidebar.c
+++ b/sidebar.c
@@ -269,8 +269,21 @@ int draw_sidebar(int menu) {
SETCOLOR(MT_COLOR_NEW);
else if ( tmp->msg_flagged > 0 )
SETCOLOR(MT_COLOR_FLAGGED);
- else
- SETCOLOR(MT_COLOR_NORMAL);
+ else {
+ /* make sure the path is either:
+ 1. Containing new mail.
+ 2. The inbox.
+ 3. The current box.
+ */
+ if ((option (OPTSIDEBARNEWMAILONLY)) &&
+ ( (tmp->msg_unread <= 0) &&
+ ( tmp != Incoming ) &&
+ Context &&
+ ( strcmp( tmp->path, Context->path ) != 0 ) ) )
+ continue;
+ else
+ SETCOLOR(MT_COLOR_NORMAL);
+ }
move( lines, 0 );
if ( Context && !strcmp( tmp->path, Context->path ) ) {
@@ -336,6 +349,29 @@ int draw_sidebar(int menu) {
return 0;
}
+BUFFY * exist_next_new()
+{
+ BUFFY *tmp = CurBuffy;
+ if(tmp == NULL) return NULL;
+ while (tmp->next != NULL)
+ {
+ tmp = tmp->next;
+ if(tmp->msg_unread) return tmp;
+ }
+ return NULL;
+}
+
+BUFFY * exist_prev_new()
+{
+ BUFFY *tmp = CurBuffy;
+ if(tmp == NULL) return NULL;
+ while (tmp->prev != NULL)
+ {
+ tmp = tmp->prev;
+ if(tmp->msg_unread) return tmp;
+ }
+ return NULL;
+}
void set_buffystats(CONTEXT* Context)
{
@@ -352,18 +388,33 @@ void set_buffystats(CONTEXT* Context)
void scroll_sidebar(int op, int menu)
{
+ BUFFY *tmp;
if(!SidebarWidth) return;
if(!CurBuffy) return;
switch (op) {
case OP_SIDEBAR_NEXT:
+ if (!option (OPTSIDEBARNEWMAILONLY)) {
if ( CurBuffy->next == NULL ) return;
CurBuffy = CurBuffy->next;
break;
+ }
+ case OP_SIDEBAR_NEXT_NEW:
+ if ( (tmp = exist_next_new()) == NULL)
+ return;
+ else CurBuffy = tmp;
+ break;
case OP_SIDEBAR_PREV:
+ if (!option (OPTSIDEBARNEWMAILONLY)) {
if ( CurBuffy->prev == NULL ) return;
CurBuffy = CurBuffy->prev;
break;
+ }
+ case OP_SIDEBAR_PREV_NEW:
+ if ( (tmp = exist_prev_new()) == NULL)
+ return;
+ else CurBuffy = tmp;
+ break;
case OP_SIDEBAR_SCROLL_UP:
CurBuffy = TopBuffy;
if ( CurBuffy != Incoming ) {

View file

@ -1,132 +0,0 @@
From: Antonio Radici <antonio@debian.org>
Date: Tue, 4 Mar 2014 15:39:14 +0100
Subject: sidebar-utf8
This patch fixes a problem with utf-8 strings and the sidebar,
it rewrites entirely make_sidebar_entry so it also fixes some
segfaults due to misallocations and overflows.
See:
http://bugs.debian.org/584581
http://bugs.debian.org/603287
Gbp-Pq: Topic mutt-patched
---
sidebar.c | 97 +++++++++++++++++++++++++++++++++++++++++++--------------------
1 file changed, 67 insertions(+), 30 deletions(-)
diff --git a/sidebar.c b/sidebar.c
index 4356ffc..8f58f85 100644
--- a/sidebar.c
+++ b/sidebar.c
@@ -30,6 +30,7 @@
#include <libgen.h>
#include "keymap.h"
#include <stdbool.h>
+#include <wchar.h>
/*BUFFY *CurBuffy = 0;*/
static BUFFY *TopBuffy = 0;
@@ -82,36 +83,72 @@ void calc_boundaries (int menu)
char *make_sidebar_entry(char *box, int size, int new, int flagged)
{
- static char *entry = 0;
- char *c;
- int i = 0;
- int delim_len = strlen(SidebarDelim);
-
- c = realloc(entry, SidebarWidth - delim_len + 2);
- if ( c ) entry = c;
- entry[SidebarWidth - delim_len + 1] = 0;
- for (; i < SidebarWidth - delim_len + 1; entry[i++] = ' ' );
- i = strlen(box);
- strncpy( entry, box, i < (SidebarWidth - delim_len + 1) ? i : (SidebarWidth - delim_len + 1) );
-
- if (size == -1)
- sprintf(entry + SidebarWidth - delim_len - 3, "?");
- else if ( new ) {
- if (flagged > 0) {
- sprintf(
- entry + SidebarWidth - delim_len - 5 - quick_log10(size) - quick_log10(new) - quick_log10(flagged),
- "% d(%d)[%d]", size, new, flagged);
- } else {
- sprintf(
- entry + SidebarWidth - delim_len - 3 - quick_log10(size) - quick_log10(new),
- "% d(%d)", size, new);
- }
- } else if (flagged > 0) {
- sprintf( entry + SidebarWidth - delim_len - 3 - quick_log10(size) - quick_log10(flagged), "% d[%d]", size, flagged);
- } else {
- sprintf( entry + SidebarWidth - delim_len - 1 - quick_log10(size), "% d", size);
- }
- return entry;
+ char int_store[20]; // up to 64 bits integers
+ int right_width, left_width;
+ int box_len, box_bytes;
+ int int_len;
+ int right_offset = 0;
+ int delim_len = strlen(SidebarDelim);
+ static char *entry;
+
+ right_width = left_width = 0;
+ box_len = box_bytes = 0;
+
+ // allocate an entry big enough to contain SidebarWidth wide chars
+ entry = malloc((SidebarWidth*4)+1); // TODO: error check
+
+ // determine the right space (i.e.: how big are the numbers that we want to print)
+ if ( size > 0 ) {
+ int_len = snprintf(int_store, sizeof(int_store), "%d", size);
+ right_width += int_len;
+ } else {
+ right_width = 1; // to represent 0
+ }
+ if ( new > 0 ) {
+ int_len = snprintf(int_store, sizeof(int_store), "%d", new);
+ right_width += int_len + 2; // 2 is for ()
+ }
+ if ( flagged > 0 ) {
+ int_len = snprintf(int_store, sizeof(int_store), "%d", flagged);
+ right_width += int_len + 2; // 2 is for []
+ }
+
+ // determine how much space we have for *box and its padding (if any)
+ left_width = SidebarWidth - right_width - 1 - delim_len; // 1 is for the space
+ //fprintf(stdout, "left_width: %d right_width: %d\n", left_width, right_width);
+ // right side overflow case
+ if ( left_width <= 0 ) {
+ snprintf(entry, SidebarWidth*4, "%-*.*s ...", SidebarWidth-4-delim_len, SidebarWidth-4-delim_len, box);
+ return entry;
+ }
+ right_width -= delim_len;
+
+ // to support utf-8 chars we need to add enough space padding in case there
+ // are less chars than bytes in *box
+ box_len = mbstowcs(NULL, box, 0);
+ box_bytes = strlen(box);
+ // debug
+ //fprintf(stdout, "box_len: %d box_bytes: %d (diff: %d)\n", box_len, box_bytes, (box_bytes-box_len));
+ // if there is less string than the space we allow, then we will add the
+ // spaces
+ if ( box_len != -1 && box_len < left_width ) {
+ left_width += (box_bytes - box_len);
+ }
+ // otherwise sprintf will truncate the string for us (therefore, no else case)
+
+ // print the sidebar entry (without new and flagged messages, at the moment)
+ //fprintf(stdout, "left_width: %d right_width: %d\n", left_width, right_width);
+ right_offset = snprintf(entry, SidebarWidth*4, "%-*.*s %d", left_width, left_width, box, size);
+
+ // then pad new and flagged messages if any
+ if ( new > 0 ) {
+ right_offset += snprintf(entry+right_offset, SidebarWidth*4-right_offset, "(%d)", new);
+ }
+ if ( flagged > 0 ) {
+ right_offset += snprintf(entry+right_offset, SidebarWidth*4-right_offset, "[%d]", flagged);
+ }
+
+ return entry;
}
void set_curbuffy(char buf[LONG_STRING])

File diff suppressed because it is too large Load diff

View file

@ -1,316 +0,0 @@
From: Cedric Duval <cedricduval@free.fr>
Date: Thu, 27 Feb 2014 12:27:41 +0100
Subject: trash-folder
With this patch, if the trash variable is set to a path (unset by default), the
deleted mails will be moved to a trash folder instead of being irremediably
purged when syncing the mailbox.
For instance, set trash="~/Mail/trash" will cause every deleted mail to go to
this folder.
Note that the append to the trash folder doesn't occur until the resync is
done. This allows you to change your mind and undo deletes, and thus the moves
to the trash folder are unnecessary.
Notes
* You might also want to have a look at the purge message feature below
which is related to this patch.
* IMAP is now supported. To retain the previous behavior, add this to your
muttrc:
folder-hook ^imap:// 'unset trash'
FAQ
Every once in a while, someone asks what are the advantages of this patch over
a macro based solution. Here's an attempt to answer this question:
* The folder history doesn't clutter up with unwanted trash entries.
* Delayed move to the trash allows to change one's mind.
* No need to treat the case of "normal folders" and trash folders
separately with folder-hooks, and to create two sets of macros (one for
the index, one for the pager).
* Works not only with delete-message, but also with every deletion
functions like delete-pattern, delete-thread or delete-subthread.
To sum up, it's more integrated and transparent to the user.
* Patch last synced with upstream:
- Date: 2007-02-15
- File: http://cedricduval.free.fr/mutt/patches/download/patch-1.5.5.1.cd.trash_folder.3.4
* Changes made:
- Updated to 1.5.13:
- structure of _mutt_save_message changed (commands.c)
- context of option (OPTCONFIRMAPPEND) changed (muttlib.c)
- Fixed indentation of "appended" in mutt.h.
Signed-off-by: Matteo F. Vescovi <mfvescovi@gmail.com>
Gbp-Pq: Topic features
---
commands.c | 1 +
flags.c | 19 +++++++++++++++++-
globals.h | 1 +
imap/message.c | 2 ++
init.h | 10 ++++++++++
mutt.h | 3 +++
muttlib.c | 4 +++-
mx.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
postpone.c | 3 +++
9 files changed, 103 insertions(+), 2 deletions(-)
diff --git a/commands.c b/commands.c
index 5dbd100..7fd014b 100644
--- a/commands.c
+++ b/commands.c
@@ -720,6 +720,7 @@ int _mutt_save_message (HEADER *h, CONTEXT *ctx, int delete, int decode, int dec
if (option (OPTDELETEUNTAG))
mutt_set_flag (Context, h, M_TAG, 0);
}
+ mutt_set_flag (Context, h, M_APPENDED, 1);
return 0;
}
diff --git a/flags.c b/flags.c
index f0f3d81..dfa6a50 100644
--- a/flags.c
+++ b/flags.c
@@ -65,7 +65,13 @@ void _mutt_set_flag (CONTEXT *ctx, HEADER *h, int flag, int bf, int upd_ctx)
{
h->deleted = 0;
update = 1;
- if (upd_ctx) ctx->deleted--;
+ if (upd_ctx)
+ {
+ ctx->deleted--;
+ if (h->appended)
+ ctx->appended--;
+ }
+ h->appended = 0; /* when undeleting, also reset the appended flag */
#ifdef USE_IMAP
/* see my comment above */
if (ctx->magic == M_IMAP)
@@ -87,6 +93,17 @@ void _mutt_set_flag (CONTEXT *ctx, HEADER *h, int flag, int bf, int upd_ctx)
}
break;
+ case M_APPENDED:
+ if (bf)
+ {
+ if (!h->appended)
+ {
+ h->appended = 1;
+ if (upd_ctx) ctx->appended++;
+ }
+ }
+ break;
+
case M_NEW:
if (!mutt_bit_isset(ctx->rights,M_ACL_SEEN))
diff --git a/globals.h b/globals.h
index e77030c..6a1b8da 100644
--- a/globals.h
+++ b/globals.h
@@ -144,6 +144,7 @@ WHERE char *Tochars;
WHERE char *TSStatusFormat;
WHERE char *TSIconFormat;
WHERE short TSSupported;
+WHERE char *TrashPath;
WHERE char *Username;
WHERE char *Visual;
diff --git a/imap/message.c b/imap/message.c
index 3877381..039fda6 100644
--- a/imap/message.c
+++ b/imap/message.c
@@ -884,6 +884,7 @@ int imap_copy_messages (CONTEXT* ctx, HEADER* h, char* dest, int delete)
if (ctx->hdrs[n]->tagged)
{
mutt_set_flag (ctx, ctx->hdrs[n], M_DELETE, 1);
+ mutt_set_flag (ctx, ctx->hdrs[n], M_APPENDED, 1);
if (option (OPTDELETEUNTAG))
mutt_set_flag (ctx, ctx->hdrs[n], M_TAG, 0);
}
@@ -891,6 +892,7 @@ int imap_copy_messages (CONTEXT* ctx, HEADER* h, char* dest, int delete)
else
{
mutt_set_flag (ctx, h, M_DELETE, 1);
+ mutt_set_flag (ctx, h, M_APPENDED, 1);
if (option (OPTDELETEUNTAG))
mutt_set_flag (ctx, h, M_TAG, 0);
}
diff --git a/init.h b/init.h
index 6b49341..d3206f9 100644
--- a/init.h
+++ b/init.h
@@ -3341,6 +3341,16 @@ struct option_t MuttVars[] = {
** provided that ``$$ts_enabled'' has been set. This string is identical in
** formatting to the one used by ``$$status_format''.
*/
+ { "trash", DT_PATH, R_NONE, UL &TrashPath, 0 },
+ /*
+ ** .pp
+ ** If set, this variable specifies the path of the trash folder where the
+ ** mails marked for deletion will be moved, instead of being irremediably
+ ** purged.
+ ** .pp
+ ** NOTE: When you delete a message in the trash folder, it is really
+ ** deleted, so that you have a way to clean the trash.
+ */
#ifdef USE_SOCKET
{ "tunnel", DT_STR, R_NONE, UL &Tunnel, UL 0 },
/*
diff --git a/mutt.h b/mutt.h
index f8565fa..29bb6c2 100644
--- a/mutt.h
+++ b/mutt.h
@@ -185,6 +185,7 @@ enum
M_DELETE,
M_UNDELETE,
M_DELETED,
+ M_APPENDED,
M_FLAG,
M_TAG,
M_UNTAG,
@@ -713,6 +714,7 @@ typedef struct header
unsigned int mime : 1; /* has a MIME-Version header? */
unsigned int flagged : 1; /* marked important? */
unsigned int tagged : 1;
+ unsigned int appended : 1; /* has been saved */
unsigned int deleted : 1;
unsigned int changed : 1;
unsigned int attach_del : 1; /* has an attachment marked for deletion */
@@ -885,6 +887,7 @@ typedef struct _context
int new; /* how many new messages? */
int unread; /* how many unread messages? */
int deleted; /* how many deleted messages */
+ int appended; /* how many saved messages? */
int flagged; /* how many flagged messages */
int msgnotreadyet; /* which msg "new" in pager, -1 if none */
diff --git a/muttlib.c b/muttlib.c
index 02067cc..0fd9766 100644
--- a/muttlib.c
+++ b/muttlib.c
@@ -1505,7 +1505,9 @@ int mutt_save_confirm (const char *s, struct stat *st)
if (magic > 0 && !mx_access (s, W_OK))
{
- if (option (OPTCONFIRMAPPEND))
+ if (option (OPTCONFIRMAPPEND) &&
+ (!TrashPath || (mutt_strcmp (s, TrashPath) != 0)))
+ /* if we're appending to the trash, there's no point in asking */
{
snprintf (tmp, sizeof (tmp), _("Append messages to %s?"), s);
if ((rc = mutt_yesorno (tmp, M_YES)) == M_NO)
diff --git a/mx.c b/mx.c
index 4c5cb07..c0a6d30 100644
--- a/mx.c
+++ b/mx.c
@@ -776,6 +776,53 @@ static int sync_mailbox (CONTEXT *ctx, int *index_hint)
return rc;
}
+/* move deleted mails to the trash folder */
+static int trash_append (CONTEXT *ctx)
+{
+ CONTEXT *ctx_trash;
+ int i = 0;
+ struct stat st, stc;
+
+ if (!TrashPath || !ctx->deleted ||
+ (ctx->magic == M_MAILDIR && option (OPTMAILDIRTRASH)))
+ return 0;
+
+ for (;i < ctx->msgcount && (!ctx->hdrs[i]->deleted ||
+ ctx->hdrs[i]->appended); i++);
+ if (i == ctx->msgcount)
+ return 0; /* nothing to be done */
+
+ if (mutt_save_confirm (TrashPath, &st) != 0)
+ {
+ mutt_error _("message(s) not deleted");
+ return -1;
+ }
+
+ if (lstat (ctx->path, &stc) == 0 && stc.st_ino == st.st_ino
+ && stc.st_dev == st.st_dev && stc.st_rdev == st.st_rdev)
+ return 0; /* we are in the trash folder: simple sync */
+
+ if ((ctx_trash = mx_open_mailbox (TrashPath, M_APPEND, NULL)) != NULL)
+ {
+ for (i = 0 ; i < ctx->msgcount ; i++)
+ if (ctx->hdrs[i]->deleted && !ctx->hdrs[i]->appended
+ && mutt_append_message (ctx_trash, ctx, ctx->hdrs[i], 0, 0) == -1)
+ {
+ mx_close_mailbox (ctx_trash, NULL);
+ return -1;
+ }
+
+ mx_close_mailbox (ctx_trash, NULL);
+ }
+ else
+ {
+ mutt_error _("Can't open trash folder");
+ return -1;
+ }
+
+ return 0;
+}
+
/* save changes and close mailbox */
int mx_close_mailbox (CONTEXT *ctx, int *index_hint)
{
@@ -912,6 +959,7 @@ int mx_close_mailbox (CONTEXT *ctx, int *index_hint)
if (mutt_append_message (&f, ctx, ctx->hdrs[i], 0, CH_UPDATE_LEN) == 0)
{
mutt_set_flag (ctx, ctx->hdrs[i], M_DELETE, 1);
+ mutt_set_flag (ctx, ctx->hdrs[i], M_APPENDED, 1);
}
else
{
@@ -936,6 +984,14 @@ int mx_close_mailbox (CONTEXT *ctx, int *index_hint)
return 0;
}
+ /* copy mails to the trash before expunging */
+ if (purge && ctx->deleted && mutt_strcmp(ctx->path, TrashPath))
+ if (trash_append (ctx) != 0)
+ {
+ ctx->closing = 0;
+ return -1;
+ }
+
#ifdef USE_IMAP
/* allow IMAP to preserve the deleted flag across sessions */
if (ctx->magic == M_IMAP)
@@ -1133,6 +1189,12 @@ int mx_sync_mailbox (CONTEXT *ctx, int *index_hint)
msgcount = ctx->msgcount;
deleted = ctx->deleted;
+ if (purge && ctx->deleted && mutt_strcmp(ctx->path, TrashPath))
+ {
+ if (trash_append (ctx) == -1)
+ return -1;
+ }
+
#ifdef USE_IMAP
if (ctx->magic == M_IMAP)
rc = imap_sync_mailbox (ctx, purge, index_hint);
diff --git a/postpone.c b/postpone.c
index a703161..7a4cbb1 100644
--- a/postpone.c
+++ b/postpone.c
@@ -277,6 +277,9 @@ int mutt_get_postponed (CONTEXT *ctx, HEADER *hdr, HEADER **cur, char *fcc, size
/* finished with this message, so delete it. */
mutt_set_flag (PostContext, h, M_DELETE, 1);
+ /* and consider it saved, so that it won't be moved to the trash folder */
+ mutt_set_flag (PostContext, h, M_APPENDED, 1);
+
/* update the count for the status display */
PostCount = PostContext->msgcount - PostContext->deleted;

View file

@ -0,0 +1,797 @@
diff -urN mutt-1.6.1/commands.c mutt-1.6.1-trash/commands.c
--- mutt-1.6.1/commands.c 2016-06-12 18:43:00.397447512 +0100
+++ mutt-1.6.1-trash/commands.c 2016-06-12 18:43:04.892517610 +0100
@@ -720,6 +720,7 @@
if (option (OPTDELETEUNTAG))
mutt_set_flag (Context, h, M_TAG, 0);
}
+ mutt_set_flag (Context, h, M_APPENDED, 1);
return 0;
}
diff -urN mutt-1.6.1/curs_main.c mutt-1.6.1-trash/curs_main.c
--- mutt-1.6.1/curs_main.c 2016-06-12 18:43:00.399447544 +0100
+++ mutt-1.6.1-trash/curs_main.c 2016-06-12 18:43:04.895517656 +0100
@@ -1919,6 +1919,7 @@
MAYBE_REDRAW (menu->redraw);
break;
+ case OP_PURGE_MESSAGE:
case OP_DELETE:
CHECK_MSGCOUNT;
@@ -1930,6 +1931,7 @@
if (tag)
{
mutt_tag_set_flag (M_DELETE, 1);
+ mutt_tag_set_flag (M_PURGED, (op != OP_PURGE_MESSAGE) ? 0 : 1);
if (option (OPTDELETEUNTAG))
mutt_tag_set_flag (M_TAG, 0);
menu->redraw = REDRAW_INDEX;
@@ -1937,6 +1939,8 @@
else
{
mutt_set_flag (Context, CURHDR, M_DELETE, 1);
+ mutt_set_flag (Context, CURHDR, M_PURGED,
+ (op != OP_PURGE_MESSAGE) ? 0 : 1);
if (option (OPTDELETEUNTAG))
mutt_set_flag (Context, CURHDR, M_TAG, 0);
if (option (OPTRESOLVE))
@@ -2242,11 +2246,13 @@
if (tag)
{
mutt_tag_set_flag (M_DELETE, 0);
+ mutt_tag_set_flag (M_PURGED, 0);
menu->redraw = REDRAW_INDEX;
}
else
{
mutt_set_flag (Context, CURHDR, M_DELETE, 0);
+ mutt_set_flag (Context, CURHDR, M_PURGED, 0);
if (option (OPTRESOLVE) && menu->current < Context->vcount - 1)
{
menu->current++;
@@ -2268,9 +2274,11 @@
CHECK_ACL(M_ACL_DELETE, _("Cannot undelete message(s)"));
rc = mutt_thread_set_flag (CURHDR, M_DELETE, 0,
- op == OP_UNDELETE_THREAD ? 0 : 1);
+ op == OP_UNDELETE_THREAD ? 0 : 1)
+ + mutt_thread_set_flag (CURHDR, M_PURGED, 0,
+ (op == OP_UNDELETE_THREAD) ? 0 : 1);
- if (rc != -1)
+ if (rc > -1)
{
if (option (OPTRESOLVE))
{
diff -urN mutt-1.6.1/doc/manual.xml.head mutt-1.6.1-trash/doc/manual.xml.head
--- mutt-1.6.1/doc/manual.xml.head 2016-06-12 18:43:00.402447590 +0100
+++ mutt-1.6.1-trash/doc/manual.xml.head 2016-06-12 18:43:04.901517750 +0100
@@ -7467,6 +7467,16 @@
</sect2>
+<sect2 id="mutt-patches">
+<title>Mutt Patches</title>
+<para>
+Mutt may also be <quote>patched</quote> to support smaller features.
+These patches should add a free-form string to the end Mutt's version string.
+Running <literal>mutt -v</literal> might show:
+<screen>patch-1.6.1.sidebar.20160502</screen>
+</para>
+</sect2>
+
<sect2 id="url-syntax">
<title>URL Syntax</title>
@@ -8081,6 +8091,175 @@
</sect1>
+<sect1 id="trash-folder">
+ <title>Trash Folder Patch</title>
+ <subtitle>Automatically move "deleted" emails to a trash bin</subtitle>
+
+ <sect2 id="trash-folder-patch">
+ <title>Patch</title>
+
+ <para>
+ To check if Mutt supports <quote>Trash Folder</quote>, look for
+ <quote>patch-trash</quote> in the mutt version.
+ See: <xref linkend="mutt-patches"/>.
+ </para>
+
+ If IMAP is enabled, this patch will use it
+
+ <itemizedlist>
+ <title>Dependencies:</title>
+ <listitem><para>mutt-1.6.1</para></listitem>
+ <listitem><para>IMAP support</para></listitem>
+ </itemizedlist>
+
+ <para>This patch is part of the <ulink url="http://www.neomutt.org/">NeoMutt Project</ulink>.</para>
+ </sect2>
+
+ <sect2 id="trash-folder-intro">
+ <title>Introduction</title>
+
+ <para>
+ In Mutt, when you <quote>delete</quote> an email it is first marked
+ deleted. The email isn't really gone until
+ <link linkend="index-map">&lt;sync-mailbox&gt;</link> is called.
+ This happens when the user leaves the folder, or the function is called
+ manually.
+ </para>
+
+ <para>
+ After <literal>&lt;sync-mailbox&gt;</literal> has been called the email is gone forever.
+ </para>
+
+ <para>
+ The <link linkend="trash">$trash</link> variable defines a folder in
+ which to keep old emails. As before, first you mark emails for
+ deletion. When &lt;sync-mailbox&gt; is called the emails are moved to
+ the trash folder.
+ </para>
+
+ <para>
+ The <literal>$trash</literal> path can be either a full directory,
+ or be relative to the <link linkend="folder">$folder</link>
+ variable, like the <literal>mailboxes</literal> command.
+ </para>
+
+ <note>
+ Emails deleted from the trash folder are gone forever.
+ </note>
+ </sect2>
+
+ <sect2 id="trash-folder-variables">
+ <title>Variables</title>
+ <table id="table-trash-variables">
+ <title>Trash Variables</title>
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>Name</entry>
+ <entry>Type</entry>
+ <entry>Default</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>trash</entry>
+ <entry>string</entry>
+ <entry>(none)</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </sect2>
+
+ <sect2 id="trash-folder-functions">
+ <title>Functions</title>
+ <table id="table-trash-functions">
+ <title>Trash Functions</title>
+ <tgroup cols="4">
+ <thead>
+ <row>
+ <entry>Menus</entry>
+ <entry>Default Key</entry>
+ <entry>Function</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>index,pager</entry>
+ <entry>(none)</entry>
+ <entry><literal>&lt;purge-message&gt;</literal></entry>
+ <entry>really delete the current entry, bypassing the trash folder</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </sect2>
+
+<!--
+ <sect2 id="trash-folder-commands">
+ <title>Commands</title>
+ <para>None</para>
+ </sect2>
+
+ <sect2 id="trash-folder-colors">
+ <title>Colors</title>
+ <para>None</para>
+ </sect2>
+
+ <sect2 id="trash-folder-sort">
+ <title>Sort</title>
+ <para>None</para>
+ </sect2>
+-->
+
+ <sect2 id="trash-folder-muttrc">
+ <title>Muttrc</title>
+<screen>
+<emphasis role="comment"># Example Mutt config file for the 'trash' feature.
+
+# This feature defines a new 'trash' folder.
+# When mail is deleted it will be moved to this folder.
+
+# Folder in which to put deleted emails</emphasis>
+set trash='+Trash'
+set trash='/home/flatcap/Mail/Trash'
+
+<emphasis role="comment"># The default delete key 'd' will move an email to the 'trash' folder
+# Bind 'D' to REALLY delete an email</emphasis>
+bind index D purge-message
+
+<emphasis role="comment"># Note: Deleting emails from the 'trash' folder will REALLY delete them.
+
+# vim: syntax=muttrc</emphasis>
+</screen>
+ </sect2>
+
+ <sect2 id="trash-folder-see-also">
+ <title>See Also</title>
+
+ <itemizedlist>
+ <listitem><para><ulink url="http://www.neomutt.org/">NeoMutt Project</ulink></para></listitem>
+ <listitem><para><link linkend="folder-hook">folder-hook</link></para></listitem>
+ </itemizedlist>
+ </sect2>
+
+ <sect2 id="trash-folder-known-bugs">
+ <title>Known Bugs</title>
+ <para>None</para>
+ </sect2>
+
+ <sect2 id="trash-folder-credits">
+ <title>Credits</title>
+ <itemizedlist>
+ <listitem><para>Cedric Duval <email>cedricduval@free.fr</email></para></listitem>
+ <listitem><para>Benjamin Kuperman <email>kuperman@acm.org</email></para></listitem>
+ <listitem><para>Paul Miller <email>paul@voltar.org</email></para></listitem>
+ <listitem><para>Richard Russon <email>rich@flatcap.org</email></para></listitem>
+ </itemizedlist>
+ </sect2>
+</sect1>
+
</chapter>
<chapter id="security">
diff -urN mutt-1.6.1/doc/muttrc.trash mutt-1.6.1-trash/doc/muttrc.trash
--- mutt-1.6.1/doc/muttrc.trash 1970-01-01 01:00:00.000000000 +0100
+++ mutt-1.6.1-trash/doc/muttrc.trash 2016-06-12 18:43:04.768515676 +0100
@@ -0,0 +1,16 @@
+# Example Mutt config file for the 'trash' feature.
+
+# This feature defines a new 'trash' folder.
+# When mail is deleted it will be moved to this folder.
+
+# Folder in which to put deleted emails
+set trash='+Trash'
+set trash='/home/flatcap/Mail/Trash'
+
+# The default delete key 'd' will move an email to the 'trash' folder
+# Bind 'D' to REALLY delete an email
+bind index D purge-message
+
+# Note: Deleting emails from the 'trash' folder will REALLY delete them.
+
+# vim: syntax=muttrc
diff -urN mutt-1.6.1/doc/vimrc.trash mutt-1.6.1-trash/doc/vimrc.trash
--- mutt-1.6.1/doc/vimrc.trash 1970-01-01 01:00:00.000000000 +0100
+++ mutt-1.6.1-trash/doc/vimrc.trash 2016-06-12 18:43:04.769515692 +0100
@@ -0,0 +1,7 @@
+" Vim syntax file for the mutt trash patch
+
+syntax keyword muttrcVarStr contained skipwhite trash nextgroup=muttrcVarEqualsIdxFmt
+
+syntax match muttrcFunction contained "\<purge-message\>"
+
+" vim: syntax=vim
diff -urN mutt-1.6.1/flags.c mutt-1.6.1-trash/flags.c
--- mutt-1.6.1/flags.c 2016-06-12 18:43:00.403447606 +0100
+++ mutt-1.6.1-trash/flags.c 2016-06-12 18:43:04.902517766 +0100
@@ -65,7 +65,13 @@
{
h->deleted = 0;
update = 1;
- if (upd_ctx) ctx->deleted--;
+ if (upd_ctx) {
+ ctx->deleted--;
+ if (h->appended) {
+ ctx->appended--;
+ }
+ }
+ h->appended = 0; /* when undeleting, also reset the appended flag */
#ifdef USE_IMAP
/* see my comment above */
if (ctx->magic == M_IMAP)
@@ -87,6 +93,27 @@
}
break;
+ case M_APPENDED:
+ if (bf) {
+ if (!h->appended) {
+ h->appended = 1;
+ if (upd_ctx) {
+ ctx->appended++;
+ }
+ }
+ }
+ break;
+
+ case M_PURGED:
+ if (bf) {
+ if (!h->purged) {
+ h->purged = 1;
+ }
+ } else if (h->purged) {
+ h->purged = 0;
+ }
+ break;
+
case M_NEW:
if (!mutt_bit_isset(ctx->rights,M_ACL_SEEN))
diff -urN mutt-1.6.1/functions.h mutt-1.6.1-trash/functions.h
--- mutt-1.6.1/functions.h 2016-06-12 18:43:00.403447606 +0100
+++ mutt-1.6.1-trash/functions.h 2016-06-12 18:43:04.902517766 +0100
@@ -121,6 +121,7 @@
{ "toggle-write", OP_TOGGLE_WRITE, "%" },
{ "next-thread", OP_MAIN_NEXT_THREAD, "\016" },
{ "next-subthread", OP_MAIN_NEXT_SUBTHREAD, "\033n" },
+ { "purge-message", OP_PURGE_MESSAGE, NULL },
{ "query", OP_QUERY, "Q" },
{ "quit", OP_QUIT, "q" },
{ "reply", OP_REPLY, "r" },
@@ -213,6 +214,7 @@
{ "print-message", OP_PRINT, "p" },
{ "previous-thread", OP_MAIN_PREV_THREAD, "\020" },
{ "previous-subthread",OP_MAIN_PREV_SUBTHREAD, "\033p" },
+ { "purge-message", OP_PURGE_MESSAGE, NULL },
{ "quit", OP_QUIT, "Q" },
{ "exit", OP_EXIT, "q" },
{ "reply", OP_REPLY, "r" },
diff -urN mutt-1.6.1/globals.h mutt-1.6.1-trash/globals.h
--- mutt-1.6.1/globals.h 2016-06-12 18:43:00.403447606 +0100
+++ mutt-1.6.1-trash/globals.h 2016-06-12 18:43:04.903517781 +0100
@@ -141,6 +141,7 @@
WHERE char *Status;
WHERE char *Tempdir;
WHERE char *Tochars;
+WHERE char *TrashPath;
WHERE char *TSStatusFormat;
WHERE char *TSIconFormat;
WHERE short TSSupported;
diff -urN mutt-1.6.1/imap/imap.c mutt-1.6.1-trash/imap/imap.c
--- mutt-1.6.1/imap/imap.c 2016-06-12 18:43:00.405447637 +0100
+++ mutt-1.6.1-trash/imap/imap.c 2016-06-12 18:43:04.905517812 +0100
@@ -888,6 +888,12 @@
if (hdrs[n]->deleted != HEADER_DATA(hdrs[n])->deleted)
match = invert ^ hdrs[n]->deleted;
break;
+ case M_EXPIRED: /* imap_fast_trash version of M_DELETED */
+ if (hdrs[n]->purged)
+ break;
+ if (hdrs[n]->deleted != HEADER_DATA(hdrs[n])->deleted)
+ match = invert ^ (hdrs[n]->deleted && !hdrs[n]->appended);
+ break;
case M_FLAG:
if (hdrs[n]->flagged != HEADER_DATA(hdrs[n])->flagged)
match = invert ^ hdrs[n]->flagged;
@@ -2038,3 +2044,53 @@
return -1;
}
+
+/**
+ * imap_fast_trash - XXX
+ */
+int
+imap_fast_trash (void)
+{
+ if ((Context->magic == M_IMAP) && mx_is_imap (TrashPath)) {
+ IMAP_MBOX mx;
+ IMAP_DATA *idata = (IMAP_DATA *) Context->data;
+ char mbox[LONG_STRING];
+ char mmbox[LONG_STRING];
+ int rc;
+ dprint (1, (debugfile, "[itf] trashcan seems to be on imap.\n"));
+
+ if (imap_parse_path (TrashPath, &mx) == 0) {
+ if (mutt_account_match (&(idata->conn->account), &(mx.account))) {
+ dprint (1, (debugfile, "[itf] trashcan seems to be on the same account.\n"));
+
+ imap_fix_path (idata, mx.mbox, mbox, sizeof (mbox));
+ if (!*mbox)
+ strfcpy (mbox, "INBOX", sizeof (mbox));
+ imap_munge_mbox_name (idata, mmbox, sizeof (mmbox), mbox);
+
+ rc = imap_exec_msgset (idata, "UID COPY", mmbox, M_EXPIRED, 0, 0);
+ if (rc == 0) {
+ dprint (1, (debugfile, "imap_copy_messages: No messages del-tagged\n"));
+ rc = -1;
+ goto old_way;
+ } else if (rc < 0) {
+ dprint (1, (debugfile, "could not queue copy\n"));
+ goto old_way;
+ } else {
+ mutt_message (_("Copying %d messages to %s..."), rc, mbox);
+ return 0;
+ }
+ } else {
+ dprint (1, (debugfile, "[itf] trashcan seems to be on a different account.\n"));
+ }
+old_way:
+ FREE(&mx.mbox); /* we probably only need to free this when the parse works */
+ } else {
+ dprint (1, (debugfile, "[itf] failed to parse TrashPath.\n"));
+ }
+
+ dprint (1, (debugfile, "[itf] giving up and trying old fasioned way.\n"));
+ }
+
+ return 1;
+}
diff -urN mutt-1.6.1/imap/imap.h mutt-1.6.1-trash/imap/imap.h
--- mutt-1.6.1/imap/imap.h 2016-06-12 18:43:00.405447637 +0100
+++ mutt-1.6.1-trash/imap/imap.h 2016-06-12 18:43:04.774515769 +0100
@@ -72,4 +72,7 @@
int imap_account_match (const ACCOUNT* a1, const ACCOUNT* a2);
+/* trash */
+int imap_fast_trash (void);
+
#endif
diff -urN mutt-1.6.1/imap/message.c mutt-1.6.1-trash/imap/message.c
--- mutt-1.6.1/imap/message.c 2016-06-12 18:43:00.406447652 +0100
+++ mutt-1.6.1-trash/imap/message.c 2016-06-12 18:43:04.906517828 +0100
@@ -886,6 +886,7 @@
if (ctx->hdrs[n]->tagged)
{
mutt_set_flag (ctx, ctx->hdrs[n], M_DELETE, 1);
+ mutt_set_flag (ctx, ctx->hdrs[n], M_APPENDED, 1);
if (option (OPTDELETEUNTAG))
mutt_set_flag (ctx, ctx->hdrs[n], M_TAG, 0);
}
@@ -893,6 +894,7 @@
else
{
mutt_set_flag (ctx, h, M_DELETE, 1);
+ mutt_set_flag (ctx, h, M_APPENDED, 1);
if (option (OPTDELETEUNTAG))
mutt_set_flag (ctx, h, M_TAG, 0);
}
diff -urN mutt-1.6.1/init.h mutt-1.6.1-trash/init.h
--- mutt-1.6.1/init.h 2016-06-12 18:43:00.408447684 +0100
+++ mutt-1.6.1-trash/init.h 2016-06-12 18:43:04.909517875 +0100
@@ -3419,6 +3419,16 @@
** provided that ``$$ts_enabled'' has been set. This string is identical in
** formatting to the one used by ``$$status_format''.
*/
+ { "trash", DT_PATH, R_NONE, UL &TrashPath, 0 },
+ /*
+ ** .pp
+ ** If set, this variable specifies the path of the trash folder where the
+ ** mails marked for deletion will be moved, instead of being irremediably
+ ** purged.
+ ** .pp
+ ** NOTE: When you delete a message in the trash folder, it is really
+ ** deleted, so that you have a way to clean the trash.
+ */
#ifdef USE_SOCKET
{ "tunnel", DT_STR, R_NONE, UL &Tunnel, UL 0 },
/*
diff -urN mutt-1.6.1/mutt.h mutt-1.6.1-trash/mutt.h
--- mutt-1.6.1/mutt.h 2016-06-12 18:43:00.410447715 +0100
+++ mutt-1.6.1-trash/mutt.h 2016-06-12 18:43:04.912517922 +0100
@@ -182,6 +182,8 @@
M_DELETE,
M_UNDELETE,
M_DELETED,
+ M_APPENDED,
+ M_PURGED,
M_FLAG,
M_TAG,
M_UNTAG,
@@ -719,6 +721,8 @@
unsigned int mime : 1; /* has a MIME-Version header? */
unsigned int flagged : 1; /* marked important? */
unsigned int tagged : 1;
+ unsigned int appended : 1; /* has been saved */
+ unsigned int purged : 1; /* bypassing the trash folder */
unsigned int deleted : 1;
unsigned int changed : 1;
unsigned int attach_del : 1; /* has an attachment marked for deletion */
@@ -891,6 +895,7 @@
int new; /* how many new messages? */
int unread; /* how many unread messages? */
int deleted; /* how many deleted messages */
+ int appended; /* how many saved messages? */
int flagged; /* how many flagged messages */
int msgnotreadyet; /* which msg "new" in pager, -1 if none */
diff -urN mutt-1.6.1/muttlib.c mutt-1.6.1-trash/muttlib.c
--- mutt-1.6.1/muttlib.c 2016-06-12 18:43:00.411447731 +0100
+++ mutt-1.6.1-trash/muttlib.c 2016-06-12 18:43:04.913517937 +0100
@@ -1511,7 +1511,9 @@
if (magic > 0 && !mx_access (s, W_OK))
{
- if (option (OPTCONFIRMAPPEND))
+ if (option (OPTCONFIRMAPPEND) &&
+ (!TrashPath || (mutt_strcmp (s, TrashPath) != 0)))
+ /* if we're appending to the trash, there's no point in asking */
{
snprintf (tmp, sizeof (tmp), _("Append messages to %s?"), s);
if ((rc = mutt_yesorno (tmp, M_YES)) == M_NO)
diff -urN mutt-1.6.1/mx.c mutt-1.6.1-trash/mx.c
--- mutt-1.6.1/mx.c 2016-06-12 18:43:00.411447731 +0100
+++ mutt-1.6.1-trash/mx.c 2016-06-12 18:43:04.914517953 +0100
@@ -776,6 +776,62 @@
return rc;
}
+/**
+ * trash_append - XXX
+ *
+ * move deleted mails to the trash folder
+ */
+static int trash_append (CONTEXT *ctx)
+{
+ CONTEXT *ctx_trash;
+ int i = 0;
+ struct stat st, stc;
+
+ if (!TrashPath || !ctx->deleted ||
+ ((ctx->magic == M_MAILDIR) && option (OPTMAILDIRTRASH))) {
+ return 0;
+ }
+
+ for (; i < ctx->msgcount && (!ctx->hdrs[i]->deleted || ctx->hdrs[i]->appended); i++);
+ /* nothing */
+
+ if (i == ctx->msgcount)
+ return 0; /* nothing to be done */
+
+ if (mutt_save_confirm (TrashPath, &st) != 0) {
+ mutt_error _("message(s) not deleted");
+ return -1;
+ }
+
+ if (lstat (ctx->path, &stc) == 0 && stc.st_ino == st.st_ino
+ && stc.st_dev == st.st_dev && stc.st_rdev == st.st_rdev) {
+ return 0; /* we are in the trash folder: simple sync */
+ }
+
+#ifdef USE_IMAP
+ if (!imap_fast_trash())
+ return 0;
+#endif
+
+ if ((ctx_trash = mx_open_mailbox (TrashPath, M_APPEND, NULL)) != NULL) {
+ for (i = 0 ; i < ctx->msgcount ; i++) {
+ if (ctx->hdrs[i]->deleted && !ctx->hdrs[i]->appended
+ && !ctx->hdrs[i]->purged
+ && mutt_append_message (ctx_trash, ctx, ctx->hdrs[i], 0, 0) == -1) {
+ mx_close_mailbox (ctx_trash, NULL);
+ return -1;
+ }
+ }
+
+ mx_close_mailbox (ctx_trash, NULL);
+ } else {
+ mutt_error _("Can't open trash folder");
+ return -1;
+ }
+
+ return 0;
+}
+
/* save changes and close mailbox */
int mx_close_mailbox (CONTEXT *ctx, int *index_hint)
{
@@ -912,6 +968,7 @@
if (mutt_append_message (&f, ctx, ctx->hdrs[i], 0, CH_UPDATE_LEN) == 0)
{
mutt_set_flag (ctx, ctx->hdrs[i], M_DELETE, 1);
+ mutt_set_flag (ctx, ctx->hdrs[i], M_APPENDED, 1);
}
else
{
@@ -936,6 +993,14 @@
return 0;
}
+ /* copy mails to the trash before expunging */
+ if (purge && ctx->deleted && mutt_strcmp (ctx->path, TrashPath)) {
+ if (trash_append (ctx) != 0) {
+ ctx->closing = 0;
+ return -1;
+ }
+ }
+
#ifdef USE_IMAP
/* allow IMAP to preserve the deleted flag across sessions */
if (ctx->magic == M_IMAP)
@@ -1140,6 +1205,12 @@
msgcount = ctx->msgcount;
deleted = ctx->deleted;
+ if (purge && ctx->deleted && mutt_strcmp (ctx->path, TrashPath)) {
+ if (trash_append (ctx) == -1) {
+ return -1;
+ }
+ }
+
#ifdef USE_IMAP
if (ctx->magic == M_IMAP)
rc = imap_sync_mailbox (ctx, purge, index_hint);
diff -urN mutt-1.6.1/OPS mutt-1.6.1-trash/OPS
--- mutt-1.6.1/OPS 2016-06-12 18:43:00.389447388 +0100
+++ mutt-1.6.1-trash/OPS 2016-06-12 18:43:04.883517469 +0100
@@ -142,6 +142,7 @@
OP_PREV_LINE "scroll up one line"
OP_PREV_PAGE "move to the previous page"
OP_PRINT "print the current entry"
+OP_PURGE_MESSAGE "really delete the current entry, bypassing the trash folder"
OP_QUERY "query external program for addresses"
OP_QUERY_APPEND "append new query results to current results"
OP_QUIT "save changes to mailbox and quit"
diff -urN mutt-1.6.1/pager.c mutt-1.6.1-trash/pager.c
--- mutt-1.6.1/pager.c 2016-06-12 18:43:00.412447746 +0100
+++ mutt-1.6.1-trash/pager.c 2016-06-12 18:43:04.915517968 +0100
@@ -2351,6 +2351,7 @@
MAYBE_REDRAW (redraw);
break;
+ case OP_PURGE_MESSAGE:
case OP_DELETE:
CHECK_MODE(IsHeader (extra));
CHECK_READONLY;
@@ -2358,6 +2359,8 @@
CHECK_ACL(M_ACL_DELETE, _("Cannot delete message"));
mutt_set_flag (Context, extra->hdr, M_DELETE, 1);
+ mutt_set_flag (Context, extra->hdr, M_PURGED,
+ ch != OP_PURGE_MESSAGE ? 0 : 1);
if (option (OPTDELETEUNTAG))
mutt_set_flag (Context, extra->hdr, M_TAG, 0);
redraw = REDRAW_STATUS | REDRAW_INDEX;
@@ -2688,6 +2691,7 @@
CHECK_ACL(M_ACL_DELETE, _("Cannot undelete message"));
mutt_set_flag (Context, extra->hdr, M_DELETE, 0);
+ mutt_set_flag (Context, extra->hdr, M_PURGED, 0);
redraw = REDRAW_STATUS | REDRAW_INDEX;
if (option (OPTRESOLVE))
{
@@ -2704,9 +2708,11 @@
CHECK_ACL(M_ACL_DELETE, _("Cannot undelete message(s)"));
r = mutt_thread_set_flag (extra->hdr, M_DELETE, 0,
+ ch == OP_UNDELETE_THREAD ? 0 : 1)
+ + mutt_thread_set_flag (extra->hdr, M_PURGED, 0,
ch == OP_UNDELETE_THREAD ? 0 : 1);
- if (r != -1)
+ if (r > -1)
{
if (option (OPTRESOLVE))
{
diff -urN mutt-1.6.1/PATCHES mutt-1.6.1-trash/PATCHES
--- mutt-1.6.1/PATCHES 2016-06-12 18:43:00.395447481 +0100
+++ mutt-1.6.1-trash/PATCHES 2016-06-12 18:43:04.889517563 +0100
@@ -0,0 +1 @@
+patch-trash-neo-20160612
diff -urN mutt-1.6.1/pattern.c mutt-1.6.1-trash/pattern.c
--- mutt-1.6.1/pattern.c 2016-06-12 18:43:00.413447762 +0100
+++ mutt-1.6.1-trash/pattern.c 2016-06-12 18:43:04.916517984 +0100
@@ -1367,8 +1367,9 @@
{
switch (op)
{
- case M_DELETE:
case M_UNDELETE:
+ mutt_set_flag (Context, Context->hdrs[Context->v2r[i]], M_PURGED, 0);
+ case M_DELETE:
mutt_set_flag (Context, Context->hdrs[Context->v2r[i]], M_DELETE,
(op == M_DELETE));
break;
diff -urN mutt-1.6.1/postpone.c mutt-1.6.1-trash/postpone.c
--- mutt-1.6.1/postpone.c 2016-06-12 18:43:00.414447777 +0100
+++ mutt-1.6.1-trash/postpone.c 2016-06-12 18:43:04.917518000 +0100
@@ -277,6 +277,9 @@
/* finished with this message, so delete it. */
mutt_set_flag (PostContext, h, M_DELETE, 1);
+ /* and consider it saved, so that it won't be moved to the trash folder */
+ mutt_set_flag (PostContext, h, M_APPENDED, 1);
+
/* update the count for the status display */
PostCount = PostContext->msgcount - PostContext->deleted;
diff -urN mutt-1.6.1/README.trash mutt-1.6.1-trash/README.trash
--- mutt-1.6.1/README.trash 1970-01-01 01:00:00.000000000 +0100
+++ mutt-1.6.1-trash/README.trash 2016-06-12 18:43:04.748515364 +0100
@@ -0,0 +1,74 @@
+Trash Folder Patch
+==================
+
+ Automatically move "deleted" emails to a trash bin
+
+Patch
+-----
+
+ To check if Mutt supports "Trash Folder", look for "patch-trash" in the
+ mutt version.
+
+ If IMAP is enabled, this patch will use it
+
+ Dependencies
+ * mutt-1.6.1
+ * IMAP support
+
+Introduction
+------------
+
+ In Mutt, when you "delete" an email it is first marked deleted. The email
+ isn't really gone until <sync-mailbox> is called. This happens when the
+ user leaves the folder, or the function is called manually.
+
+ After '<sync-mailbox>' has been called the email is gone forever.
+
+ The $trash variable defines a folder in which to keep old emails. As
+ before, first you mark emails for deletion. When <sync-mailbox> is called
+ the emails are moved to the trash folder.
+
+ The '$trash' path can be either a full directory, or be relative to the
+ $folder variable, like the 'mailboxes' command.
+
+ > Note
+ >
+ > Emails deleted from the trash folder are gone forever.
+
+Variables
+---------
+
+ Trash Variables
+
+ | Name | Type | Default |
+ |-------|--------|---------|
+ | trash | string | (none) |
+
+Functions
+---------
+
+ Trash Functions
+
+ | Menus | Default Key | Function | Description |
+ |-------------|-------------|-------------------|-------------------------------------------------------------|
+ | index,pager | (none) | '<purge-message>' | really delete the current entry, bypassing the trash folder |
+
+See Also
+--------
+
+ * NeoMutt project
+ * folder-hook
+
+Known Bugs
+----------
+
+ None
+
+Credits
+-------
+
+ * Cedric Duval <cedricduval@free.fr>
+ * Benjamin Kuperman <kuperman@acm.org>
+ * Paul Miller <paul@voltar.org>
+ * Richard Russon <rich@flatcap.org>
+

View file

@ -11,7 +11,7 @@ assert withQt -> !withGtk && qt4 != null;
with stdenv.lib;
let
version = "2.0.3";
version = "2.0.4";
variant = if withGtk then "gtk" else if withQt then "qt" else "cli";
in
@ -20,7 +20,7 @@ stdenv.mkDerivation {
src = fetchurl {
url = "http://www.wireshark.org/download/src/all-versions/wireshark-${version}.tar.bz2";
sha256 = "1z358k65frp9m0l07cppwxhvbcp1w9ya5sml87pzs8gyfmp3g5p1";
sha256 = "19g11m8m8qd7dkcvcb27lyppklg608d9ap7wr3mr88clm4nwiacy";
};
buildInputs = [

View file

@ -20,7 +20,7 @@
libogg, libtheora, libvorbis, libdvdcss, a52dec, fdk_aac,
lame, faac, ffmpeg, libdvdread, libdvdnav, libbluray,
mp4v2, mpeg2dec, x264, libmkv,
fontconfig, freetype,
fontconfig, freetype, hicolor_icon_theme,
glib, gtk, webkitgtk, intltool, libnotify,
gst_all_1, dbus_glib, udev, libgudev,
useGtk ? true,
@ -45,7 +45,7 @@ stdenv.mkDerivation rec {
nativeBuildInputs = [ python pkgconfig yasm autoconf automake libtool m4 ];
buildInputs = [
fribidi fontconfig freetype
fribidi fontconfig freetype hicolor_icon_theme
libass libsamplerate libxml2 bzip2
libogg libtheora libvorbis libdvdcss a52dec libmkv fdk_aac
lame ffmpeg libdvdread libdvdnav libbluray mp4v2 mpeg2dec x264

View file

@ -1,4 +1,4 @@
{ stdenv, fetchgit, pkgconfig, autoconf, automake
{ stdenv, fetchFromGitHub, pkgconfig, autoconf, automake
, ruby, file, xdg_utils, gettext, expat, qt5, boost
, libebml, zlib, libmatroska, libogg, libvorbis, flac
, withGUI ? true
@ -10,18 +10,19 @@ with stdenv.lib;
stdenv.mkDerivation rec {
name = "mkvtoolnix-${version}";
version = "8.9.0";
version = "9.2.0";
src = fetchgit {
url = "https://github.com/mbunkus/mkvtoolnix.git";
rev = "54e6b52b3dde07f89da4542997ef059e18802128";
sha256 = "1gipydk1xisqy110rr38dgjzpxl8zxbm12kf7b2f4xh4iw17j0k2";
src = fetchFromGitHub {
owner = "mbunkus";
repo = "mkvtoolnix";
rev = "release-${version}";
sha256 = "02w3161iqaijs3bz5w2wily9nz55xnhq1bdm2s5qi8v3sbcqd6df";
};
nativeBuildInputs = [ gettext ruby ];
nativeBuildInputs = [ pkgconfig autoconf automake gettext ruby ];
buildInputs = [
pkgconfig autoconf automake expat
expat
file xdg_utils boost libebml zlib
libmatroska libogg libvorbis flac
(optional withGUI qt5.qtbase)

View file

@ -62,11 +62,11 @@ in
stdenv.mkDerivation rec {
name = "mpv-${version}";
version = "0.17.0";
version = "0.18.1";
src = fetchurl {
url = "https://github.com/mpv-player/mpv/archive/v${version}.tar.gz";
sha256 = "0vms3viwqcwl1mrgmf2yy4c69fvv7xpbkyrl693l6zpwynqd4b30";
sha256 = "0ab3lkvx1j06x7qlp9m4r4zk28dr7z8ki3w4kfgkpm2axizxa4z4";
};
patchPhase = ''

View file

@ -1,18 +1,23 @@
{ stdenv, fetchsvn, automake, autoconf, zlib, popt, xorg, libvorbis, libtheora }:
{ stdenv, fetchsvn, autoreconfHook, zlib, popt, alsaLib, libvorbis, libtheora
, libICE, libSM, libX11, libXext, libXfixes, libXdamage }:
stdenv.mkDerivation rec {
name = "recordmydesktop-${version}";
version = "0.3.8.1-svn602";
version = "0.3.8.1-svn${rev}";
rev = "602";
src = fetchsvn {
url = https://recordmydesktop.svn.sourceforge.net/svnroot/recordmydesktop/trunk/recordmydesktop;
rev = 602;
inherit rev;
sha256 = "1avirkc4ymrd575m616pi6wpgq1i0r5sb3qahps1g18sjpxks0lf";
};
buildInputs = [ automake autoconf zlib popt xorg.libICE xorg.libSM xorg.libX11 xorg.libXext xorg.libXfixes xorg.libXdamage libvorbis libtheora ];
nativeBuildInputs = [ autoreconfHook ];
preConfigure = ''./autogen.sh'';
buildInputs = [
zlib popt alsaLib libICE libSM libX11 libXext
libXfixes libXdamage libvorbis libtheora
];
meta = with stdenv.lib; {
description = "Desktop session recorder";

View file

@ -0,0 +1,37 @@
{ stdenv, lib, fetchsvn, recordmydesktop, autoreconfHook, pkgconfig, glib
, pythonPackages, jack2, xwininfo }:
let
binPath = lib.makeBinPath [ recordmydesktop jack2 xwininfo ];
in stdenv.mkDerivation rec {
name = "gtk-recordmydesktop-${version}";
version = "0.3.8-svn${recordmydesktop.rev}";
src = fetchsvn {
url = https://recordmydesktop.svn.sourceforge.net/svnroot/recordmydesktop/trunk/gtk-recordmydesktop;
inherit (recordmydesktop) rev;
sha256 = "010aykgjfxhyiixq9a9fg3p1a1ixz59m1vkn16hpy0lybgf4dsby";
};
nativeBuildInputs = [ autoreconfHook pkgconfig ];
buildInputs = with pythonPackages; [
python pygtk wrapPython
];
pythonPath = with pythonPackages; [ pygtk ];
postInstall = ''
makeWrapperArgs="--prefix PATH : ${binPath}"
wrapPythonPrograms
'';
meta = with stdenv.lib; {
description = "GTK frontend for recordmydesktop";
homepage = http://recordmydesktop.sourceforge.net/;
license = licenses.gpl2;
platforms = platforms.linux;
maintainers = [ maintainers.DamienCassou ];
};
}

View file

@ -0,0 +1,37 @@
{ stdenv, lib, fetchsvn, recordmydesktop, autoreconfHook, pkgconfig
, glib, pythonPackages, qt4, jack2, xwininfo }:
let
binPath = lib.makeBinPath [ recordmydesktop jack2 xwininfo ];
in stdenv.mkDerivation rec {
name = "qt-recordmydesktop-${version}";
version = "0.3.8-svn${recordmydesktop.rev}";
src = fetchsvn {
url = https://recordmydesktop.svn.sourceforge.net/svnroot/recordmydesktop/trunk/qt-recordmydesktop;
inherit (recordmydesktop) rev;
sha256 = "0vz7amrmz317sbx2cv2186d0r57as4l26xa9rpim5gbvzk20caqc";
};
nativeBuildInputs = [ autoreconfHook pkgconfig ];
buildInputs = [ glib qt4 ] ++ (with pythonPackages; [
python wrapPython pyqt4
]);
pythonPath = with pythonPackages; [ pyqt4 ];
postInstall = ''
makeWrapperArgs="--prefix PATH : ${binPath}"
wrapPythonPrograms
'';
meta = with stdenv.lib; {
description = "GTK frontend for recordmydesktop";
homepage = http://recordmydesktop.sourceforge.net/;
license = licenses.gpl2;
platforms = platforms.linux;
maintainers = [ maintainers.DamienCassou ];
};
}

View file

@ -11,7 +11,18 @@ stdenv.mkDerivation rec {
sha256 = "1d89ncspjd8c4mckf0nb6y3hrxpv4rjpbj868pznhvfmdgr5nvql";
};
postPatch = "sed '1i#include <random>' -i src/Benchmark.cpp";
patches = [ ./fix-paths.patch ];
postPatch = ''
# #455
sed '1i#include <random>' -i src/Benchmark.cpp
for i in scripts/ssr-glinject src/AV/Input/GLInjectInput.cpp; do
substituteInPlace $i \
--subst-var out \
--subst-var-by sh ${stdenv.shell}
done
'';
buildInputs = [
alsaLib ffmpeg libjack2 libX11 libXext libXfixes mesa pkgconfig

View file

@ -0,0 +1,35 @@
diff --git a/scripts/ssr-glinject b/scripts/ssr-glinject
index 48be48d..5038d4c 100755
--- a/scripts/ssr-glinject
+++ b/scripts/ssr-glinject
@@ -59,6 +59,6 @@ do
fi
done
-echo "ssr-glinject: LD_PRELOAD = $LD_PRELOAD:libssr-glinject.so"
+echo "ssr-glinject: LD_PRELOAD = $LD_PRELOAD:@out@/lib/libssr-glinject.so"
echo "ssr-glinject: command = $@"
-LD_PRELOAD="$LD_PRELOAD:libssr-glinject.so" "$@"
+LD_PRELOAD="$LD_PRELOAD:@out@/lib/libssr-glinject.so" "$@"
diff --git a/src/AV/Input/GLInjectInput.cpp b/src/AV/Input/GLInjectInput.cpp
index 6b378f8..cbcf82b 100644
--- a/src/AV/Input/GLInjectInput.cpp
+++ b/src/AV/Input/GLInjectInput.cpp
@@ -96,7 +96,7 @@ void GLInjectInput::SetCapturing(bool capturing) {
bool GLInjectInput::LaunchApplication(const QString& channel, bool relax_permissions, const QString& command, const QString& working_directory) {
// prepare command
- QString full_command = "LD_PRELOAD=\"libssr-glinject.so\" ";
+ QString full_command = "LD_PRELOAD=\"@out@/lib/libssr-glinject.so\" ";
full_command += "SSR_CHANNEL=\"" + ShellEscape(channel) + "\" ";
if(relax_permissions)
full_command += "SSR_STREAM_RELAX_PERMISSIONS=1 ";
@@ -106,7 +106,7 @@ bool GLInjectInput::LaunchApplication(const QString& channel, bool relax_permiss
QStringList args;
args.push_back("-c");
args.push_back(full_command);
- return QProcess::startDetached("/bin/sh", args, working_directory);
+ return QProcess::startDetached("@sh@", args, working_directory);
}

View file

@ -20,11 +20,11 @@ assert (!withQt5 -> qt4 != null);
stdenv.mkDerivation rec {
name = "vlc-${version}";
version = "2.2.3";
version = "2.2.4";
src = fetchurl {
url = "http://get.videolan.org/vlc/${version}/${name}.tar.xz";
sha256 = "0nxzspnyzlm17imlggi8ypnwiizi0f5wrj3436c3qg7i6mymimxr";
sha256 = "1gjkrwlg8ab3skzl67cxb9qzg4187ifckd1z9kpy11q058fyjchn";
};
# Comment-out the Qt 5.5 version check, as we do apply the relevant patch.

View file

@ -2,11 +2,11 @@
pam, libX11, libev, cairo, libxkbcommon, libxkbfile }:
stdenv.mkDerivation rec {
name = "i3lock-2.7";
name = "i3lock-2.8";
src = fetchurl {
url = "http://i3wm.org/i3lock/${name}.tar.bz2";
sha256 = "1qlgafbyqjpqdfs50f2y0xphn2jdigafkqqsmpikk97cs0z1i0k8";
sha256 = "028fc0f74df10826514d5a4ed38f6895935d1f5d47ca9fcffc64b076aaf6e2f4";
};
buildInputs = [ which pkgconfig libxcb xcbutilkeysyms xcbutilimage pam libX11

View file

@ -1,9 +1,11 @@
{ stdenv, intltool, fetchurl, python, pygobject3, atk
{ stdenv, intltool, fetchurl, atk
, pkgconfig, gtk3, glib, libsoup
, bash, makeWrapper, itstool, libxml2, python3Packages
, gnome3, librsvg, gdk_pixbuf, file, libnotify }:
, bash, makeWrapper, itstool, libxml2, python2Packages
, gnome3, librsvg, gdk_pixbuf, file, libnotify, gobjectIntrospection, wrapGAppsHook }:
stdenv.mkDerivation rec {
let
python = python2Packages.python.withPackages ( ps: with ps; [ pygobject3 ] );
in stdenv.mkDerivation rec {
inherit (import ./src.nix fetchurl) name src;
doCheck = true;
@ -15,17 +17,15 @@ stdenv.mkDerivation rec {
buildInputs = [ pkgconfig gtk3 glib intltool itstool libxml2
gnome3.gsettings_desktop_schemas makeWrapper file
gdk_pixbuf gnome3.defaultIconTheme librsvg
python pygobject3 libnotify gnome3.gnome_shell
libnotify gnome3.gnome_shell
libsoup gnome3.gnome_settings_daemon gnome3.nautilus
gnome3.gnome_desktop ];
gnome3.gnome_desktop wrapGAppsHook ];
preFixup = ''
wrapProgram "$out/bin/gnome-tweak-tool" \
--set GDK_PIXBUF_MODULE_FILE "$GDK_PIXBUF_MODULE_FILE" \
--suffix XDG_DATA_DIRS : "${gtk3}/share:${gnome3.gnome_themes_standard}/share:$out/share:$XDG_ICON_DIRS:$GSETTINGS_SCHEMAS_PATH" \
--prefix GI_TYPELIB_PATH : "$GI_TYPELIB_PATH" \
--prefix PYTHONPATH : "$PYTHONPATH:$(toPythonPath $out)"
'';
propagatedBuildInputs = [ python gobjectIntrospection ];
PYTHONPATH = "$out/${python.python.sitePackages}";
wrapPrefixVariables = [ "PYTHONPATH" ];
patches = [
./find_gsettings.patch

View file

@ -0,0 +1,10 @@
--- a/app/org.kde.ark.desktop.cmake
+++ b/app/org.kde.ark.desktop.cmake
@@ -154,7 +154,6 @@
Terminal=false
X-DBUS-StartupType=Multi
X-DBUS-ServiceName=org.kde.ark
-X-KDE-HasTempFileOption=true
Categories=Qt;KDE;Utility;Archiving;Compression;X-KDE-Utilities-File;
InitialPreference=3
Comment=Work with file archives

View file

@ -35,6 +35,9 @@ kdeApp {
khtml ki18n kio karchive kconfig kcrash kdbusaddons kiconthemes kservice
kpty kwidgetsaddons libarchive
];
patches = [
./0001-fix-start-from-plasma.patch
];
postInstall = ''
wrapQtProgram "$out/bin/ark" \
--prefix PATH : "${PATH}"

View file

@ -31,7 +31,7 @@ let
kdelibs = callPackage ./kdelibs { inherit (pkgs) attica phonon; };
ark = callPackage ./ark.nix {};
ark = callPackage ./ark/default.nix {};
baloo-widgets = callPackage ./baloo-widgets.nix {};
dolphin = callPackage ./dolphin.nix {};
dolphin-plugins = callPackage ./dolphin-plugins.nix {};

View file

@ -1,581 +0,0 @@
# DO NOT EDIT! This file is generated automatically by fetchsrcs.sh
{ fetchurl, mirror }:
{
attica = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/attica-5.22.0.tar.xz";
sha256 = "1i26nwxyrb62icw49znlyz9y670cv7xvibzbdfnnxq9czsalwym7";
name = "attica-5.22.0.tar.xz";
};
};
baloo = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/baloo-5.22.0.tar.xz";
sha256 = "0h51j41pa8b18jkdna0247z5alqfbvgfzlxc6s6p0c7g7658z0w3";
name = "baloo-5.22.0.tar.xz";
};
};
bluez-qt = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/bluez-qt-5.22.0.tar.xz";
sha256 = "1lrkkg2f2qjj8cy968l3scdrvi506m5hr9x22d1zn6r12fvq6304";
name = "bluez-qt-5.22.0.tar.xz";
};
};
breeze-icons = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/breeze-icons-5.22.0.tar.xz";
sha256 = "162698h01cs7116la4jfygn8ka4ffjmnv7nxjl6yhcqrs25nky7l";
name = "breeze-icons-5.22.0.tar.xz";
};
};
extra-cmake-modules = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/extra-cmake-modules-5.22.0.tar.xz";
sha256 = "042ad7kp2ijp66gvz0q60glk95wj9f0fymrjyw68253rqynf3zj3";
name = "extra-cmake-modules-5.22.0.tar.xz";
};
};
frameworkintegration = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/frameworkintegration-5.22.0.tar.xz";
sha256 = "0jf9y738r86ss520hqhfll8prrfpha73myj99hbz3sqrix7b0va9";
name = "frameworkintegration-5.22.0.tar.xz";
};
};
kactivities = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kactivities-5.22.0.tar.xz";
sha256 = "068jhc6lw47hcibvys968m4wa1b278ccy2gas9iymzzys1ccv6kr";
name = "kactivities-5.22.0.tar.xz";
};
};
kactivities-stats = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kactivities-stats-5.22.0.tar.xz";
sha256 = "1gx5wm337nwbwqb56xvl16vhk47v7a5qpx5hhn7ygpfxkgxh6wiq";
name = "kactivities-stats-5.22.0.tar.xz";
};
};
kapidox = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kapidox-5.22.0.tar.xz";
sha256 = "0cs133g1rvbcrdvy7zvk5c14p5iwwn0x0m76c2ifal0g8qh0hmd1";
name = "kapidox-5.22.0.tar.xz";
};
};
karchive = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/karchive-5.22.0.tar.xz";
sha256 = "1ywd38j6jpwj21kdp504gs0pfvlnvg6ak8hjk6a269pkci3dyf91";
name = "karchive-5.22.0.tar.xz";
};
};
kauth = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kauth-5.22.0.tar.xz";
sha256 = "1c0kp25g57nldh1x5vfq9fypbznc991jrry2lydvb06d3jh44vbn";
name = "kauth-5.22.0.tar.xz";
};
};
kbookmarks = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kbookmarks-5.22.0.tar.xz";
sha256 = "093rlg8pprjg7ba52dh2z9j2x5ir7s9kjas6ni4fqxxzpp15hh3p";
name = "kbookmarks-5.22.0.tar.xz";
};
};
kcmutils = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kcmutils-5.22.0.tar.xz";
sha256 = "1s7gw9l2n92rrcdzy9pnwq8na65axd8bkk9nphyhpbxk76zj1gyy";
name = "kcmutils-5.22.0.tar.xz";
};
};
kcodecs = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kcodecs-5.22.0.tar.xz";
sha256 = "0rlqs8m2ib2kkj679gn74zqqxzsddfcbywpgwlcd6b992i4cad87";
name = "kcodecs-5.22.0.tar.xz";
};
};
kcompletion = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kcompletion-5.22.0.tar.xz";
sha256 = "07jqjrddigdqsdy2adzari7g626sakilg9d765s75vncv5amrvzy";
name = "kcompletion-5.22.0.tar.xz";
};
};
kconfig = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kconfig-5.22.0.tar.xz";
sha256 = "0n0dzgba96pkabbvk1cfm34j9jirgbd84xha6adscpxs28506cg0";
name = "kconfig-5.22.0.tar.xz";
};
};
kconfigwidgets = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kconfigwidgets-5.22.0.tar.xz";
sha256 = "0jr6ygd8c0gap2ay2685wj3fx4scrahzbpaaj4bjhq2s79nvmlyg";
name = "kconfigwidgets-5.22.0.tar.xz";
};
};
kcoreaddons = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kcoreaddons-5.22.0.tar.xz";
sha256 = "0zzwcw0n9bd3pi3rv7cdwynb67x1bqf1bh3s59hjipf9d412wl15";
name = "kcoreaddons-5.22.0.tar.xz";
};
};
kcrash = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kcrash-5.22.0.tar.xz";
sha256 = "1r0i9ngk5jypzfhhssjm5b3n5sqli3jhh896r1qwpfcq9w15x7qg";
name = "kcrash-5.22.0.tar.xz";
};
};
kdbusaddons = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kdbusaddons-5.22.0.tar.xz";
sha256 = "0w9spb5i5qi2r5kfgrylpvw6mwjxfhd4j7yslc9jy0q4y8j3f1dk";
name = "kdbusaddons-5.22.0.tar.xz";
};
};
kdeclarative = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kdeclarative-5.22.0.tar.xz";
sha256 = "06n6wqy8dm2hv6dbar453z4rmiyf6f34zak1fhs38sqkfy6syva1";
name = "kdeclarative-5.22.0.tar.xz";
};
};
kded = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kded-5.22.0.tar.xz";
sha256 = "1zfggr6pmiypw5bnh6hr22agms589hm7hw35nhfhc4r7qd1drf6q";
name = "kded-5.22.0.tar.xz";
};
};
kdelibs4support = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/portingAids/kdelibs4support-5.22.0.tar.xz";
sha256 = "1mmrr54kkicnz4pjksnrh40md80m18mr5ba2la7kwjxmdyl6znm3";
name = "kdelibs4support-5.22.0.tar.xz";
};
};
kdesignerplugin = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kdesignerplugin-5.22.0.tar.xz";
sha256 = "0cfnmpz845l39qpy5r6pknzm78js81bci9qi0xfnrf8gm3lvjg5l";
name = "kdesignerplugin-5.22.0.tar.xz";
};
};
kdesu = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kdesu-5.22.0.tar.xz";
sha256 = "1jsr9m32dyzvsvsy743h3jih8v4yyr2zf15hh908anbamp7449bd";
name = "kdesu-5.22.0.tar.xz";
};
};
kdewebkit = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kdewebkit-5.22.0.tar.xz";
sha256 = "0rmxa4j3jx7689jcf45fghh7jff16x34xrzrw0clg3fj4w47ik0b";
name = "kdewebkit-5.22.0.tar.xz";
};
};
kdnssd = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kdnssd-5.22.0.tar.xz";
sha256 = "1b0s5gwn51zh2h5w2mzpzjj86qaz6pl7gzqf5q88vpzsiqjg14vp";
name = "kdnssd-5.22.0.tar.xz";
};
};
kdoctools = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kdoctools-5.22.0.tar.xz";
sha256 = "0y4ayms0hyj4nv5flr0a198lb545plfbxkwhqsmzc0c77gagcw5k";
name = "kdoctools-5.22.0.tar.xz";
};
};
kemoticons = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kemoticons-5.22.0.tar.xz";
sha256 = "1swrpqm441ngmps00hr15pgvw1382zbf2q2ncndj7i30725nfq1g";
name = "kemoticons-5.22.0.tar.xz";
};
};
kfilemetadata = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kfilemetadata-5.22.0.tar.xz";
sha256 = "0p6s1r2qv5396ghkw79wyf7yf4hzj562yp83wgplwmr6lgh4b2fc";
name = "kfilemetadata-5.22.0.tar.xz";
};
};
kglobalaccel = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kglobalaccel-5.22.0.tar.xz";
sha256 = "1m1aviz5g0vwk58j0z9jckz4rzns7md7mr3zlqqpvp1r032qc30k";
name = "kglobalaccel-5.22.0.tar.xz";
};
};
kguiaddons = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kguiaddons-5.22.0.tar.xz";
sha256 = "10chxcvf4hxyfkgprsj7rg4dv788dzqjgsm6m0a4m6qmx12zhckh";
name = "kguiaddons-5.22.0.tar.xz";
};
};
khtml = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/portingAids/khtml-5.22.0.tar.xz";
sha256 = "1w5q41fjrqqq91j3dvhc9lrrhvrwy1izws6af7srh768gn6yig0m";
name = "khtml-5.22.0.tar.xz";
};
};
ki18n = {
version = "5.22.1";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/ki18n-5.22.1.tar.xz";
sha256 = "0fasp8akj6wysn4acf9vyivcgb8x9dlnhkqmw7j0g7z1qgvjn4pv";
name = "ki18n-5.22.1.tar.xz";
};
};
kiconthemes = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kiconthemes-5.22.0.tar.xz";
sha256 = "1bh76f7kpha4c5qs3n8z6g1qah0rsk99yqcz8j1dlss4ws65j9j3";
name = "kiconthemes-5.22.0.tar.xz";
};
};
kidletime = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kidletime-5.22.0.tar.xz";
sha256 = "0dgw0rin6wz31xdspbjpvcs5x1b163ggqkz2zn73zavbr7f5jypc";
name = "kidletime-5.22.0.tar.xz";
};
};
kimageformats = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kimageformats-5.22.0.tar.xz";
sha256 = "0g3f73m3yj5iqivcsn83pm32w4l13zbyzz5azgm3jjfhgnd00c18";
name = "kimageformats-5.22.0.tar.xz";
};
};
kinit = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kinit-5.22.0.tar.xz";
sha256 = "1f71y6gf00p4jkqvpzyjlbnwc4gvjl2h4wi61xhpjz8lrmpsb6ac";
name = "kinit-5.22.0.tar.xz";
};
};
kio = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kio-5.22.0.tar.xz";
sha256 = "02knylbs9ymb8qm7fkp3dkdqc9cvgw2dwfl4phzl1iax2fx2zkqy";
name = "kio-5.22.0.tar.xz";
};
};
kitemmodels = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kitemmodels-5.22.0.tar.xz";
sha256 = "03gnglfhpzrc67bi0xdcy4xdhankic5cqnpahp9wwsis12ac6i83";
name = "kitemmodels-5.22.0.tar.xz";
};
};
kitemviews = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kitemviews-5.22.0.tar.xz";
sha256 = "0nhwg7bmv1c8p6pnbfsz96mq9wbq339ir9yp7kfnhfrg0wqi44ar";
name = "kitemviews-5.22.0.tar.xz";
};
};
kjobwidgets = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kjobwidgets-5.22.0.tar.xz";
sha256 = "1inqrb0j64b3519qcr0wk9izd4c1zi4kfjc8wa04s2kwxg6z7j1p";
name = "kjobwidgets-5.22.0.tar.xz";
};
};
kjs = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/portingAids/kjs-5.22.0.tar.xz";
sha256 = "0xqlkhm8r021xd5a25nwp9a4r7cbjkpqkc89fjma8qyvq5785qxw";
name = "kjs-5.22.0.tar.xz";
};
};
kjsembed = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/portingAids/kjsembed-5.22.0.tar.xz";
sha256 = "0fcc1lm5l8r0lj35r3niliyn8zxr90by2vjc9krzfm4i7kwij7wb";
name = "kjsembed-5.22.0.tar.xz";
};
};
kmediaplayer = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/portingAids/kmediaplayer-5.22.0.tar.xz";
sha256 = "1pn3fmaixcxba1wl63hblhnpj7jblrala9j3xrj8z2abhhfl5vzy";
name = "kmediaplayer-5.22.0.tar.xz";
};
};
knewstuff = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/knewstuff-5.22.0.tar.xz";
sha256 = "1gr566k95bg58hpn569kkarmlxk5rp12jcxdp7ksw1j8mp6la7a7";
name = "knewstuff-5.22.0.tar.xz";
};
};
knotifications = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/knotifications-5.22.0.tar.xz";
sha256 = "0fh6ahfr9pa8643i1ma40h7afnd1jn0m6dw5f9hgndxhwi6h3bps";
name = "knotifications-5.22.0.tar.xz";
};
};
knotifyconfig = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/knotifyconfig-5.22.0.tar.xz";
sha256 = "0p4g7wv2w6cpjzhlkh7rnzzhwcj86sgz98fl97is1fl65q8f0szr";
name = "knotifyconfig-5.22.0.tar.xz";
};
};
kpackage = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kpackage-5.22.0.tar.xz";
sha256 = "1nbwjc4n8f2iisdckm5ll3qyls1sq02ia6vmhj4mfm4w44q4s1bk";
name = "kpackage-5.22.0.tar.xz";
};
};
kparts = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kparts-5.22.0.tar.xz";
sha256 = "091wm2flhqgpqsffdd8nlwbdffvsj7cyd0c46949d9chm64723cg";
name = "kparts-5.22.0.tar.xz";
};
};
kpeople = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kpeople-5.22.0.tar.xz";
sha256 = "0rbwxzmyaig92vcd26v1yqd13swk15pp0lpvjp6hdpxbhpxijyf7";
name = "kpeople-5.22.0.tar.xz";
};
};
kplotting = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kplotting-5.22.0.tar.xz";
sha256 = "0ljiyxa2320v937lkqkxx3jc7sg45z4vjl74lxfybwspgs6y5hqk";
name = "kplotting-5.22.0.tar.xz";
};
};
kpty = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kpty-5.22.0.tar.xz";
sha256 = "12lfwv45d06ksx5xc4hgk075mj2ckkqpc8mksx99f700yvcyk1db";
name = "kpty-5.22.0.tar.xz";
};
};
kross = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/portingAids/kross-5.22.0.tar.xz";
sha256 = "1ika9ha06vspjn8hy6mv5vi5n7xj7sj45csmjjxcqwhn2wlcdj4l";
name = "kross-5.22.0.tar.xz";
};
};
krunner = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/krunner-5.22.0.tar.xz";
sha256 = "09jhdy48dciqd8hwxmvjyw547fr48mzns5f0yknsnnb8a47yhrd4";
name = "krunner-5.22.0.tar.xz";
};
};
kservice = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kservice-5.22.0.tar.xz";
sha256 = "1c5q8cxghbji3imamjbxymcd5cz9a9rapqriy1wmskys3ms3fag9";
name = "kservice-5.22.0.tar.xz";
};
};
ktexteditor = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/ktexteditor-5.22.0.tar.xz";
sha256 = "1jsa8cfq0245bsris46i3k8f8g7l0sc5jpj4iwkxrl9m0nk5j1v0";
name = "ktexteditor-5.22.0.tar.xz";
};
};
ktextwidgets = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/ktextwidgets-5.22.0.tar.xz";
sha256 = "01a2vkdpq06libap5g6a90jrcc0phmfd859kilraqyxhbrp9sw5l";
name = "ktextwidgets-5.22.0.tar.xz";
};
};
kunitconversion = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kunitconversion-5.22.0.tar.xz";
sha256 = "1phbqxddp8ks36nr4982n4bwwx7d6yxll629gpb0ddc4yfsjv48p";
name = "kunitconversion-5.22.0.tar.xz";
};
};
kwallet = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kwallet-5.22.0.tar.xz";
sha256 = "1i20kp1gkdiwmwy8vf7vd6r89qx6lpxwr6nib35khp93ci9l3838";
name = "kwallet-5.22.0.tar.xz";
};
};
kwayland = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kwayland-5.22.0.tar.xz";
sha256 = "1jfibqai7vy1vklj19x7z0r4qc0rc7yd5r4wpp98mmdwzpnhlrgy";
name = "kwayland-5.22.0.tar.xz";
};
};
kwidgetsaddons = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kwidgetsaddons-5.22.0.tar.xz";
sha256 = "1bwmnfa1l3s33nc6b0ryk78gxhrynyd07ffqw7mw211r34pg4c14";
name = "kwidgetsaddons-5.22.0.tar.xz";
};
};
kwindowsystem = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kwindowsystem-5.22.0.tar.xz";
sha256 = "05jwmjqk03pc2g09rnyb9qh0dfi0c46awbaxgc7i7z4i9swv1k30";
name = "kwindowsystem-5.22.0.tar.xz";
};
};
kxmlgui = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kxmlgui-5.22.0.tar.xz";
sha256 = "16q222jvnsd6pj49ih44qpks97lcjsamcpjg5x5ysn4a6w5h4mds";
name = "kxmlgui-5.22.0.tar.xz";
};
};
kxmlrpcclient = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/kxmlrpcclient-5.22.0.tar.xz";
sha256 = "00qj4pa7r0ny6pwivq6qqw80v4dsg9lgwd2qdlp9kddi0f8i2p1b";
name = "kxmlrpcclient-5.22.0.tar.xz";
};
};
modemmanager-qt = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/modemmanager-qt-5.22.0.tar.xz";
sha256 = "1b1gx33vrw7qcvy3zlc01x7wlalx5csfl590gfxlf870i3m7dnhf";
name = "modemmanager-qt-5.22.0.tar.xz";
};
};
networkmanager-qt = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/networkmanager-qt-5.22.0.tar.xz";
sha256 = "03b710n4107qw9c3p7wdma9fz9vqixrjydfa02f7vgzw1rixmmqq";
name = "networkmanager-qt-5.22.0.tar.xz";
};
};
oxygen-icons5 = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/oxygen-icons5-5.22.0.tar.xz";
sha256 = "1m3f5wrgahqlzzl3jyfymh6n515fsmsi8ckimvma2d8qqpb0dc2l";
name = "oxygen-icons5-5.22.0.tar.xz";
};
};
plasma-framework = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/plasma-framework-5.22.0.tar.xz";
sha256 = "1wn7ib030dw8rj5dprl8bzz4c3dv4nlmrfb9wgr6x78w4ac967zc";
name = "plasma-framework-5.22.0.tar.xz";
};
};
solid = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/solid-5.22.0.tar.xz";
sha256 = "04a7z5g2ylhbj2572wa6w51cs98ddn4d7lfirzawxf0f8d2693w2";
name = "solid-5.22.0.tar.xz";
};
};
sonnet = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/sonnet-5.22.0.tar.xz";
sha256 = "0y8l3mfa65a59vjj424ga87q3bixx8inicp2jp9zi36p4g7xwww8";
name = "sonnet-5.22.0.tar.xz";
};
};
threadweaver = {
version = "5.22.0";
src = fetchurl {
url = "${mirror}/stable/frameworks/5.22/threadweaver-5.22.0.tar.xz";
sha256 = "1ax58k6nl8za79j99spa2r76m9xz8ih9iflksgpng40wlnkwlp59";
name = "threadweaver-5.22.0.tar.xz";
};
};
}

View file

@ -106,6 +106,7 @@ let
ktextwidgets = callPackage ./ktextwidgets.nix {};
kunitconversion = callPackage ./kunitconversion.nix {};
kwallet = callPackage ./kwallet.nix {};
kwayland = callPackage ./kwayland.nix {};
kwidgetsaddons = callPackage ./kwidgetsaddons.nix {};
kwindowsystem = callPackage ./kwindowsystem.nix {};
kxmlgui = callPackage ./kxmlgui.nix {};

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