Rewrite hoogleLocal expression
The old expression was broken. This began as an attempt to fix it, but the new expression is substantially different. It takes advantage of new features that obviate the need to patch Hoogle. It comes with several limitations. The new expression does not build the database in parallel, although it does not take long. The new expression also does not support downloading databases from the Hoogle instance at haskell.org; those databases link to Hackage for documentation, defying the meaning of local.
This commit is contained in:
parent
245f34fef7
commit
8c3f749eda
@ -0,0 +1,6 @@
|
||||
#! @shell@
|
||||
|
||||
COMMAND=$1
|
||||
shift
|
||||
HOOGLE_DOC_PATH=@out@/share/hoogle/doc exec @hoogle@/bin/hoogle \
|
||||
$COMMAND -d @out@/share/hoogle $@
|
@ -1,28 +0,0 @@
|
||||
diff --git a/src/CmdLine/All.hs b/src/CmdLine/All.hs
|
||||
index 94b1d48..f41f270 100644
|
||||
--- a/src/CmdLine/All.hs
|
||||
+++ b/src/CmdLine/All.hs
|
||||
@@ -86,8 +86,10 @@ guessLocal = do
|
||||
ghc <- findExecutable "ghc"
|
||||
home <- getHomeDirectory
|
||||
lib <- getLibDir
|
||||
+ path <- lookup "HOOGLE_DOC_PATH" <$> getEnvironment
|
||||
let xs = [takeDirectory (takeDirectory lib) </> "doc" {- Windows, installed with Cabal -} ] ++
|
||||
[takeDirectory (takeDirectory ghc) </> "doc/html/libraries" | Just ghc <- [ghc] {- Windows, installed by GHC -} ] ++
|
||||
+ maybeToList path ++
|
||||
[home </> ".cabal/share/doc" {- Linux -} ]
|
||||
filterM doesDirectoryExist xs
|
||||
|
||||
diff --git a/src/Hoogle/Language/Haskell.hs b/src/Hoogle/Language/Haskell.hs
|
||||
index b037f11..f2ac047 100644
|
||||
--- a/src/Hoogle/Language/Haskell.hs
|
||||
+++ b/src/Hoogle/Language/Haskell.hs
|
||||
@@ -112,7 +112,7 @@ setPriority pkg mod x = x{itemPriority = pri}
|
||||
|
||||
setModuleURL (Just pkg) _ x | itemLevel x == 1 = x{itemURL=if null $ itemURL x then f $ itemName x else itemURL x}
|
||||
where f xs = if "http://hackage.haskell.org/package/" `isPrefixOf` itemURL pkg
|
||||
- then "http://hackage.haskell.org/packages/archive/" ++ itemName pkg ++ "/latest/doc/html/" ++ file
|
||||
+ then "http://hackage.haskell.org/package/" ++ itemName pkg ++ "/docs/" ++ file
|
||||
else takeDirectory (itemURL pkg) ++ "/" ++ file
|
||||
where file = reps '.' '-' xs ++ ".html"
|
||||
setModuleURL _ _ x = x
|
@ -9,12 +9,12 @@
|
||||
# haskellPackages =
|
||||
# let callPackage = pkgs.lib.callPackageWith haskellPackages;
|
||||
# in pkgs.recurseIntoAttrs (pkgs.haskellPackages.override {
|
||||
# extraPrefs = self: {
|
||||
# extension = self: super: {
|
||||
# hoogleLocal = pkgs.haskellPackages.hoogleLocal.override {
|
||||
# packages = with pkgs.haskellPackages; [
|
||||
# mmorph
|
||||
# monadControl
|
||||
# ]
|
||||
# ];
|
||||
# };
|
||||
# };
|
||||
# });
|
||||
@ -23,43 +23,22 @@
|
||||
# This will build mmorph and monadControl, and have the hoogle installation
|
||||
# refer to their documentation via symlink so they are not garbage collected.
|
||||
|
||||
{ cabal, aeson, binary, blazeBuilder, Cabal, caseInsensitive
|
||||
, cmdargs, conduit, deepseq, filepath, haskellSrcExts, httpTypes
|
||||
, parsec, QuickCheck, random, resourcet, safe, shake, tagsoup, text
|
||||
, time, transformers, uniplate, vector, vectorAlgorithms, wai, warp
|
||||
, fetchurl
|
||||
|
||||
, parallel, perl, wget, rehoo, haskellPlatform
|
||||
, packages ? haskellPlatform.propagatedUserEnvPkgs
|
||||
{ stdenv, hoogle, rehoo
|
||||
, haskellPlatform, ghc, packages ? [ haskellPlatform ghc.ghc ]
|
||||
}:
|
||||
|
||||
cabal.mkDerivation (self: rec {
|
||||
pname = "hoogle";
|
||||
version = "4.2.32";
|
||||
sha256 = "1rhr7xh4x9fgflcszbsl176r8jq6rm81bwzmbz73f3pa1zf1v0zc";
|
||||
isLibrary = true;
|
||||
isExecutable = true;
|
||||
buildInputs = [self.ghc Cabal] ++ self.extraBuildInputs
|
||||
++ [ parallel perl wget rehoo ] ++ packages;
|
||||
buildDepends = [
|
||||
aeson binary blazeBuilder Cabal caseInsensitive cmdargs conduit
|
||||
deepseq filepath haskellSrcExts httpTypes parsec QuickCheck random
|
||||
resourcet safe shake tagsoup text time transformers uniplate vector
|
||||
vectorAlgorithms wai warp
|
||||
];
|
||||
testDepends = [ filepath ];
|
||||
testTarget = "--test-option=--no-net";
|
||||
let
|
||||
inherit (stdenv.lib) optional;
|
||||
wrapper = ./hoogle-local-wrapper.sh;
|
||||
in
|
||||
stdenv.mkDerivation {
|
||||
name = "hoogle-local-0.1";
|
||||
buildInputs = [hoogle rehoo];
|
||||
|
||||
# The tests will fail because of the added documentation.
|
||||
doCheck = false;
|
||||
patches = [ ./hoogle-local.diff
|
||||
(fetchurl { url = "https://github.com/ndmitchell/hoogle/commit/5fc294f2b5412fda107c7700f4d833b52f26184c.diff";
|
||||
sha256 = "1fn52g90p2jsy87gf5rqrcg49s8hfwway5hi4v9i2rpg5mzxaq3i"; })
|
||||
];
|
||||
phases = [ "installPhase" ];
|
||||
|
||||
docPackages = packages;
|
||||
|
||||
postInstall = ''
|
||||
installPhase = ''
|
||||
if [ -z "$docPackages" ]; then
|
||||
echo "ERROR: The packages attribute has not been set"
|
||||
exit 1
|
||||
@ -71,27 +50,38 @@ cabal.mkDerivation (self: rec {
|
||||
cd $out/share/hoogle
|
||||
|
||||
function import_dbs() {
|
||||
find $1 -name '*.txt' \
|
||||
| parallel -j$NIX_BUILD_CORES 'cp -p {} .; perl -i -pe "print \"\@url file://{//}/index.html\n\" if /^\@version/;" {/}; $out/bin/hoogle convert {/}'
|
||||
find $1 -name '*.txt' | while read f; do
|
||||
newname=$(basename "$f" | tr '[:upper:]' '[:lower:]')
|
||||
if [[ -f $f && ! -f ./$newname ]]; then
|
||||
cp -p $f ./$newname
|
||||
hoogle convert -d "$(dirname $f)" "./$newname"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
for i in $docPackages; do
|
||||
import_dbs $i/share/doc
|
||||
ln -sf $i/share/doc/*-ghc-*/* $out/share/hoogle/doc 2> /dev/null \
|
||||
|| ln -sf $i/share/doc/* $out/share/hoogle/doc
|
||||
findInputs $i docPackages propagated-native-build-inputs
|
||||
findInputs $i docPackages propagated-build-inputs
|
||||
done
|
||||
|
||||
import_dbs ${self.ghc}/share/doc/ghc*/html/libraries
|
||||
ln -sf ${self.ghc}/share/doc/ghc*/html/libraries/* $out/share/hoogle/doc
|
||||
for i in $docPackages; do
|
||||
if [[ ! $i == $out ]]; then
|
||||
for docdir in $i/share/doc/*-ghc-*/* $i/share/doc/*; do
|
||||
if [[ -d $docdir ]]; then
|
||||
import_dbs $docdir
|
||||
ln -sf $docdir $out/share/hoogle/doc
|
||||
fi
|
||||
done
|
||||
fi
|
||||
done
|
||||
|
||||
unset http_proxy
|
||||
unset ftp_proxy
|
||||
import_dbs ${ghc}/share/doc/ghc*/html/libraries
|
||||
ln -sf ${ghc}/share/doc/ghc*/html/libraries/* $out/share/hoogle/doc
|
||||
|
||||
chmod 644 *.hoo *.txt
|
||||
$out/bin/hoogle data -d $PWD --redownload -l $(echo *.txt | sed 's/\.txt//g')
|
||||
PATH=$out/bin:$PATH ${rehoo}/bin/rehoo -j4 -c64 .
|
||||
rehoo -j4 -c64 .
|
||||
|
||||
rm -fr downloads *.txt *.dep
|
||||
rm -fr downloads *.dep *.txt
|
||||
mv default.hoo x || exit 0
|
||||
rm -f *.hoo
|
||||
mv x default.hoo || exit 1
|
||||
@ -101,23 +91,17 @@ cabal.mkDerivation (self: rec {
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mv $out/bin/hoogle $out/bin/.hoogle-wrapped
|
||||
cat - > $out/bin/hoogle <<EOF
|
||||
#! ${self.stdenv.shell}
|
||||
COMMAND=\$1
|
||||
shift
|
||||
HOOGLE_DOC_PATH=$out/share/hoogle/doc exec $out/bin/.hoogle-wrapped \$COMMAND -d $out/share/hoogle "\$@"
|
||||
EOF
|
||||
mkdir -p $out/bin
|
||||
substitute ${wrapper} $out/bin/hoogle \
|
||||
--subst-var out --subst-var-by shell ${stdenv.shell} \
|
||||
--subst-var-by hoogle ${hoogle}
|
||||
chmod +x $out/bin/hoogle
|
||||
'';
|
||||
|
||||
meta = {
|
||||
homepage = "http://www.haskell.org/hoogle/";
|
||||
description = "Haskell API Search";
|
||||
license = self.stdenv.lib.licenses.bsd3;
|
||||
platforms = self.ghc.meta.platforms;
|
||||
maintainers = [ self.stdenv.lib.maintainers.jwiegley ];
|
||||
hydraPlatforms = self.stdenv.lib.platforms.none;
|
||||
broken = true;
|
||||
description = "A local Hoogle database";
|
||||
platforms = ghc.meta.platforms;
|
||||
hydraPlatforms = with stdenv.lib.platforms; none;
|
||||
maintainers = with stdenv.lib.maintainers; [ ttuegel ];
|
||||
};
|
||||
})
|
||||
}
|
||||
|
@ -1234,9 +1234,7 @@ self : let callPackage = x : y : modifyPrio (newScope self x y); in
|
||||
hoodleTypes = callPackage ../development/libraries/haskell/hoodle-types {};
|
||||
|
||||
hoogle = callPackage ../development/libraries/haskell/hoogle {};
|
||||
hoogleLocal = callPackage ../development/libraries/haskell/hoogle/local.nix {
|
||||
parallel = pkgs.parallel;
|
||||
};
|
||||
hoogleLocal = callPackage ../development/libraries/haskell/hoogle/local.nix {};
|
||||
|
||||
hopenssl = callPackage ../development/libraries/haskell/hopenssl {};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user