libreoffice: add update-script for darwin

This commit is contained in:
Thibault Gagnaux 2022-05-24 13:06:19 +02:00
parent 9b7d990c70
commit 8395d7a4d3
No known key found for this signature in database
GPG Key ID: 44BD0764ACAE8E25
5 changed files with 160 additions and 52 deletions

View File

@ -1,51 +0,0 @@
{ stdenv
, lib
, fetchurl
, undmg
}:
let
appName = "LibreOffice.app";
version = "7.2.5";
dist = {
aarch64-darwin = {
arch = "aarch64";
sha256 = "bdbcb9a98211f866ca089d440aebcd1d313aa99e8ab4104aae4e65ea3cee74ca";
};
x86_64-darwin = {
arch = "x86_64";
sha256 = "0b7ef18ed08341ac6c15339fe9a161ad17f6b469009d987cfc7d50c628d12a4e";
};
}."${stdenv.hostPlatform.system}";
in
stdenv.mkDerivation {
inherit version;
pname = "libreoffice";
src = fetchurl {
url = "https://download.documentfoundation.org/libreoffice/stable/${version}/mac/${dist.arch}/LibreOffice_${version}_MacOS_${dist.arch}.dmg";
inherit (dist) sha256;
};
nativeBuildInputs = [ undmg ];
sourceRoot = "${appName}";
dontPatch = true;
dontConfigure = true;
dontBuild = true;
installPhase = ''
runHook preInstallPhase
mkdir -p $out/{Applications/${appName},bin}
cp -R . $out/Applications/${appName}
ln -s $out/Applications/${appName}/Contents/MacOS/soffice $out/bin
runHook postInstallPhase
'';
meta = with lib; {
description = "Comprehensive, professional-quality productivity suite, a variant of openoffice.org";
homepage = "https://libreoffice.org/";
license = licenses.lgpl3;
maintainers = with maintainers; [ tricktron ];
platforms = [ "aarch64-darwin" "x86_64-darwin" ];
};
}

View File

@ -0,0 +1,73 @@
{ stdenv
, lib
, fetchurl
, undmg
, writeScript
}:
let
appName = "LibreOffice.app";
version = "7.2.5";
baseUrl = "https://download.documentfoundation.org/libreoffice/stable";
dist = {
aarch64-darwin = rec {
arch = "aarch64";
archSuffix = arch;
url = "${baseUrl}/${version}/mac/${arch}/LibreOffice_${version}_MacOS_${archSuffix}.dmg";
sha256 = "bdbcb9a98211f866ca089d440aebcd1d313aa99e8ab4104aae4e65ea3cee74ca";
};
x86_64-darwin = rec {
arch = "x86_64";
archSuffix = "x86-64";
url = "${baseUrl}/${version}/mac/${arch}/LibreOffice_${version}_MacOS_${archSuffix}.dmg";
sha256 = "0b7ef18ed08341ac6c15339fe9a161ad17f6b469009d987cfc7d50c628d12a4e";
};
};
in
stdenv.mkDerivation rec {
inherit version;
pname = "libreoffice";
src = fetchurl {
inherit (dist."${stdenv.hostPlatform.system}") url sha256;
};
nativeBuildInputs = [ undmg ];
sourceRoot = "${appName}";
dontPatch = true;
dontConfigure = true;
dontBuild = true;
installPhase = ''
runHook preInstallPhase
mkdir -p $out/{Applications/${appName},bin}
cp -R . $out/Applications/${appName}
ln -s $out/Applications/${appName}/Contents/MacOS/soffice $out/bin
runHook postInstallPhase
'';
passthru.updateScript =
let
inherit (import ./update-utils.nix { inherit lib; }) getLatestStableVersion getSha256 nullHash;
newVersion = getLatestStableVersion;
in
writeScript "update-libreoffice.sh"
''
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p common-updater-scripts
set -o errexit
set -o nounset
set -o pipefail
update-source-version libreoffice ${newVersion} ${getSha256 dist."aarch64-darwin".url version newVersion} --system=aarch64-darwin
update-source-version libreoffice 0 ${nullHash} --system=x86_64-darwin
update-source-version libreoffice ${newVersion} ${getSha256 dist."x86_64-darwin".url version newVersion} --system=x86_64-darwin
'';
meta = with lib; {
description = "Comprehensive, professional-quality productivity suite, a variant of openoffice.org";
homepage = "https://libreoffice.org/";
license = licenses.lgpl3;
maintainers = with maintainers; [ tricktron ];
platforms = [ "aarch64-darwin" "x86_64-darwin" ];
};
}

View File

@ -0,0 +1,41 @@
{ pkgs ? import <nixpkgs> {}, nixt }:
let
inherit (import ./update-utils.nix { inherit (pkgs) lib; })
extractLatestVersionFromHtml
extractSha256FromHtml;
in
nixt.mkSuite "LibreOffice Updater"
{
"should extract latest stable version from html" = let
latestVersionHtmlMock =
''
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Index of /libreoffice/stable</title>
<link rel="stylesheet" href="/mirrorbrain.css" type="text/css" />
</head>
<body>
<h1>Index of /libreoffice/stable</h1>
<table><tr><th>&nbsp;</th><th><a href="?C=N;O=D">Name</a></th><th><a href="?C=M;O=A">Last modified</a></th><th><a href="?C=S;O=A">Size</a></th><th>Metadata</th></tr><tr><th colspan="5"><hr /></th></tr>
<tr><td valign="top">&nbsp;</td><td><a href="/libreoffice/">Parent Directory</a></td><td>&nbsp;</td><td align="right"> - </td><td>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</td><td><a href="7.2.7/">7.2.7/</a></td><td align="right">10-Mar-2022 11:12 </td><td align="right"> - </td><td>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</td><td><a href="7.3.3/">7.3.3/</a></td><td align="right">12-May-2022 10:06 </td><td align="right"> - </td><td>&nbsp;</td></tr>
<tr><td valign="top">&nbsp;</td><td><a href="7.2.6/">7.2.6/</a></td><td align="right">05-May-2022 07:57 </td><td align="right"> - </td><td>&nbsp;</td></tr>
<tr><th colspan="5"><hr /></th></tr>
</table>
<address>Apache Server at <a href="mailto:hostmaster@documentfoundation.org">download.documentfoundation.org</a> Port 80</address>
<br/><address><a href="http://mirrorbrain.org/">MirrorBrain</a> powered by <a href="http://httpd.apache.org/">Apache</a></address>
</body></html>
'';
actual = extractLatestVersionFromHtml latestVersionHtmlMock;
in "7.3.3" == actual;
"should extract sha256 from html" = let
sha256Html = "50ed3deb8d9c987516e2687ebb865bca15486c69da79f1b6d74381e43f2ec863 LibreOffice_7.3.3_MacOS_aarch64.dmg\n";
actual = extractSha256FromHtml sha256Html;
in "50ed3deb8d9c987516e2687ebb865bca15486c69da79f1b6d74381e43f2ec863" == actual;
}

View File

@ -0,0 +1,45 @@
{ lib }:
let
# extractLatestVersionFromHtml :: String -> String
extractLatestVersionFromHtml = htmlString:
let
majorMinorPatchGroup = "([0-9]+\\.[0-9]+\\.[0-9]+)";
splittedVersions = builtins.split "href=\"${majorMinorPatchGroup}" htmlString;
stableVersions = builtins.concatLists (builtins.filter (e: builtins.isList e) splittedVersions);
in
if stableVersions == []
then abort "Failed to extract versions from html."
else lib.last (builtins.sort builtins.lessThan stableVersions);
# getHtml :: String -> String
getHtml = url:
builtins.readFile (builtins.fetchurl url);
# getLatestStableVersion :: String
getLatestStableVersion =
extractLatestVersionFromHtml (getHtml "https://download.documentfoundation.org/libreoffice/stable/");
# extractSha256FromHtml :: String -> String
extractSha256FromHtml = htmlString:
let
sha256 = (builtins.match ".*([0-9a-fA-F]{64}).*" htmlString);
in
if sha256 == []
then abort "Failed to extract sha256 from html."
else builtins.head sha256;
# getSha256 :: String -> String
getSha256 = dmgUrl: oldVersion: newVersion:
extractSha256FromHtml (getHtml (getSha256Url dmgUrl oldVersion newVersion));
# getSha256Url :: String -> String -> String -> String
getSha256Url = dmgUrl: oldVersion: newVersion:
(builtins.replaceStrings [ oldVersion ] [ newVersion ] dmgUrl) + ".sha256";
# nullHash :: String
nullHash = "0000000000000000000000000000000000000000000000000000000000000000";
in
{
inherit extractLatestVersionFromHtml getHtml getLatestStableVersion
extractSha256FromHtml getSha256 getSha256Url nullHash;
}

View File

@ -27773,7 +27773,7 @@ with pkgs;
};
libreoffice = if stdenv.isDarwin
then callPackage ../applications/office/libreoffice/darwin.nix {}
then callPackage ../applications/office/libreoffice/darwin/darwin.nix {}
else hiPrio libreoffice-still;
libreoffice-unwrapped = (hiPrio libreoffice-still).libreoffice;