updateScript: initital work

This commit is contained in:
Rok Garbas 2016-12-01 18:58:16 +01:00
parent eee070e49c
commit 3a1d52ff4f
3 changed files with 176 additions and 49 deletions

View file

@ -38,6 +38,11 @@
, libpulseaudio
, systemd
, generated ? import ./sources.nix
, writeScript
, xidel
, coreutils
, gnused
, gnugrep
}:
assert stdenv.isLinux;
@ -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; };
@ -165,6 +172,46 @@ 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/
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`
shasums=`curl --silent $url$version/SHA512SUMS`
echo "{" > $tmpfile
echo " version = \"$version\";" >> $tmpfile
echo " sources = [" >> $tmpfile
for arch in linux-x86_64 linux-i686; do
for line in `echo "$shasums" | grep $arch | grep "firefox-$version.tar.bz2$" | tr " " ":"`; do
echo " { url = \"$url$version/$arch/`echo $line | cut -d\":\" -f3`\";" >> $tmpfile
echo " locale = \"`echo $line | cut -d\":\" -f3 | sed \"s/$arch\///\" | sed \"s/\/.*//\"`\";" >> $tmpfile
echo " arch = \"$arch\";" >> $tmpfile
echo " sha512 = \"`echo $line | cut -d\":\" -f1`\";" >> $tmpfile
echo " }" >> $tmpfile
done
done
echo " ];" >> $tmpfile
echo "}" >> $tmpfile
cat $tmpfile > ${if isBeta then "beta_" else ""}sources.nix
popd
'';
meta = with stdenv.lib; {
description = "Mozilla Firefox, free web browser (binary package)";

View file

@ -1,48 +0,0 @@
# TODO share code with thunderbird-bin/generate_sources.rb
require "open-uri"
version =
if ARGV.empty?
$stderr.puts("Usage: ruby generate_sources.rb <version> > sources.nix")
exit(-1)
else
ARGV[0]
end
base_path = "http://download-installer.cdn.mozilla.net/pub/firefox/releases"
Source = Struct.new(:hash, :arch, :locale, :filename)
sources = open("#{base_path}/#{version}/SHA512SUMS") do |input|
input.readlines
end.select do |line|
/\/firefox-.*\.tar\.bz2$/ === line && !(/source/ === line)
end.map do |line|
hash, name = line.chomp.split(/ +/)
Source.new(hash, *(name.split("/")))
end.sort_by do |source|
[source.locale, source.arch]
end
arches = ["linux-i686", "linux-x86_64"]
puts(<<"EOH")
# This file is generated from generate_sources.rb. DO NOT EDIT.
# Execute the following command to update the file.
#
# ruby generate_sources.rb 46.0.1 > sources.nix
{
version = "#{version}";
sources = [
EOH
sources.each do |source|
puts(%Q| { url = "#{base_path}/#{version}/#{source.arch}/#{source.locale}/firefox-#{version}.tar.bz2"; locale = "#{source.locale}"; arch = "#{source.arch}"; sha512 = "#{source.hash}"; }|)
end
puts(<<'EOF')
];
}
EOF

128
update.nix Executable file
View file

@ -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
'';
}