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:
Thomas Tuegel 2014-09-08 06:26:29 -05:00
parent 245f34fef7
commit 8c3f749eda
4 changed files with 52 additions and 92 deletions

View File

@ -0,0 +1,6 @@
#! @shell@
COMMAND=$1
shift
HOOGLE_DOC_PATH=@out@/share/hoogle/doc exec @hoogle@/bin/hoogle \
$COMMAND -d @out@/share/hoogle $@

View File

@ -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

View File

@ -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 ];
};
})
}

View File

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