Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 76 additions & 1 deletion pkgs/applications/networking/browsers/firefox-bin/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@
, libpulseaudio
, systemd
, generated ? import ./sources.nix
, writeScript
, xidel
, coreutils
, gnused
, gnugrep
}:

assert stdenv.isLinux;
Expand All @@ -62,10 +67,12 @@ let

source = stdenv.lib.findFirst (sourceMatches systemLocale) defaultSource sources;

name = "firefox-bin-unwrapped-${version}";

in

stdenv.mkDerivation {
name = "firefox-bin-unwrapped-${version}";
inherit name;

src = fetchurl { inherit (source) url sha512; };

Expand Down Expand Up @@ -165,6 +172,74 @@ stdenv.mkDerivation {
'';

passthru.ffmpegSupport = true;
passthru.updateScript =
let
version = (builtins.parseDrvName name).version;
isBeta = builtins.stringLength version + 1 == builtins.stringLength (builtins.replaceStrings ["b"] ["bb"] version);
in
writeScript "update-firefox-bin" ''
PATH=${coreutils}/bin:${gnused}/bin:${gnugrep}/bin:${xidel}/bin:${curl}/bin

pushd pkgs/applications/networking/browsers/firefox-bin

tmpfile=`mktemp`
url=http://archive.mozilla.org/pub/firefox/releases/

# retriving latest released version
# - extracts all links from the $url
# - removes . and ..
# - this line remove everything not starting with a number
# - this line sorts everything with semver in mind
# - we remove lines that are mentioning funnelcake
# - this line removes beta version if we are looking for final release
# versions or removes release versions if we are looking for beta
# versions
# - this line pick up latest release
version=`xidel -q $url --extract "//a" | \
sed s"/.$//" | \
grep "^[0-9]" | \
sort --version-sort | \
grep -v "funnelcake" | \
grep -e "${if isBeta then "b" else ""}\([[:digit:]]\|[[:digit:]][[:digit:]]\)$" | ${if isBeta then "" else "grep -v \"b\" |"} \
tail -1`

# this is a list of sha512 and tarballs for both arches
shasums=`curl --silent $url$version/SHA512SUMS`

cat > $tmpfile <<EOF
{
version = "$version";
sources = [
EOF
for arch in linux-x86_64 linux-i686; do
# retriving a list of all tarballs for each arch
# - only select tarballs for current arch
# - only select tarballs for current version
# - rename space with colon so that for loop doesnt
# - inteprets sha and path as 2 lines
for line in `echo "$shasums" | \
grep $arch | \
grep "firefox-$version.tar.bz2$" | \
tr " " ":"`; do
# create an entry for every locale
cat >> $tmpfile <<EOF
{ url = "$url$version/$arch/`echo $line | cut -d":" -f3`";"
locale = "`echo $line | cut -d":" -f3 | sed "s/$arch\///" | sed "s/\/.*//"`";
arch = "$arch";
sha512 = "`echo $line | cut -d":" -f1`";
}
EOF
done
done
cat >> $tmpfile <<EOF
];
}
EOF

cat $tmpfile > ${if isBeta then "beta_" else ""}sources.nix

popd
'';

meta = with stdenv.lib; {
description = "Mozilla Firefox, free web browser (binary package)";
Expand Down

This file was deleted.

128 changes: 128 additions & 0 deletions update.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
{ package ? null
, maintainer ? null
}:

# TODO: add assert statements

let

pkgs = import ./default.nix { };

packagesWith = cond: return: set:
pkgs.lib.flatten
(pkgs.lib.mapAttrsToList
(name: pkg:
let
result = builtins.tryEval (
if pkgs.lib.isDerivation pkg && cond name pkg
then [(return name pkg)]
else if pkg.recurseForFerivations or false || pkg.recureseForRelease or false
then packagesWith cond return pkg
else []
);
in
if result.success then result.value
else []
)
set
);

packagesWithUpdateScriptAndMaintainer = maintainer':
let
maintainer =
if ! builtins.hasAttr maintainer' pkgs.lib.maintainers then
builtins.throw "Maintainer with name `${maintainer'} does not exist in `lib/maintainers.nix`."
else
builtins.getAttr maintainer' pkgs.lib.maintainers;
in
packagesWith (name: pkg: builtins.hasAttr "updateScript" pkg &&
(if builtins.hasAttr "maintainers" pkg.meta
then (if builtins.isList pkg.meta.maintainers
then builtins.elem maintainer pkg.meta.maintainers
else maintainer == pkg.meta.maintainers
)
else false
)
)
(name: pkg: pkg)
pkgs;

packageByName = name:
if ! builtins.hasAttr name pkgs then
builtins.throw "Package with an attribute name `${name}` does not exists."
else if ! builtins.hasAttr "updateScript" (builtins.getAttr name pkgs) then
builtins.throw "Package with an attribute name `${name}` does have an `passthru.updateScript` defined."
else
builtins.getAttr name pkgs;

packages =
if package != null then
[ (packageByName package) ]
else if maintainer != null then
packagesWithUpdateScriptAndMaintainer maintainer
else
builtins.throw "No arguments provided.\n\n${helpText}";

helpText = ''
Please run:

% nix-shell update.nix --argstr maintainer garbas

to run all update scripts for all packages that lists \`garbas\` as a maintainer
and have \`updateScript\` defined, or:

% nix-shell update.nix --argstr package garbas

to run update script for specific package.
'';

runUpdateScript = package: ''
echo -ne " - ${package.name}: UPDATING ..."\\r
${package.updateScript} &> ${(builtins.parseDrvName package.name).name}.log
CODE=$?
if [ "$CODE" != "0" ]; then
echo " - ${package.name}: ERROR "
echo ""
echo "--- SHOWING ERROR LOG FOR ${package.name} ----------------------"
echo ""
cat ${(builtins.parseDrvName package.name).name}.log
echo ""
echo "--- SHOWING ERROR LOG FOR ${package.name} ----------------------"
exit $CODE
else
rm ${(builtins.parseDrvName package.name).name}.log
fi
echo " - ${package.name}: DONE. "
'';

in pkgs.stdenv.mkDerivation {
name = "nixpkgs-update-script";
buildCommand = ''
echo ""
echo "----------------------------------------------------------------"
echo ""
echo "Not possible to update packages using \`nix-build\`"
echo ""
echo "${helpText}"
echo "----------------------------------------------------------------"
exit 1
'';
shellHook = ''
echo ""
echo "Going to be running update for following packages:"
echo "${builtins.concatStringsSep "\n" (map (x: " - ${x.name}") packages)}"
echo ""
read -n1 -r -p "Press space to continue..." confirm
if [ "$confirm" = "" ]; then
echo ""
echo "Running update for:"
${builtins.concatStringsSep "\n" (map runUpdateScript packages)}
echo ""
echo "Packages updated!"
exit 0
else
echo "Aborting!"
exit 1
fi
'';
}