commercialhaskell / stack

The Haskell Tool Stack
http://haskellstack.org
BSD 3-Clause "New" or "Revised" License
3.99k stars 844 forks source link

`stack path --local-doc-root` produces redundant output for `hpack` projects. #5334

Closed TerrorJack closed 4 years ago

TerrorJack commented 4 years ago

General summary/comments (optional)

stack path --local-doc-root produces redundant output for hpack projects.

Steps to reproduce

  1. Run stack build --haddock in an hpack project's root directory
  2. Run stack path --local-doc-root

Expected

A one-line output which is the documentation root path.

Actual

The output looks something like:

inline-js-core.cabal is up-to-date
/home/terrorjack/haskell/inline-js/.stack-work/install/x86_64-linux-tinfo6/db4a0546ce86c09c9ef2e568e724b605f381dadc2ec4d59436c6a3dc47e64d4a/8.10.1/doc
inline-js-core.cabal is up-to-date

The verbose log is available at https://gist.github.com/TerrorJack/604f516e90ce9cc379e0b5174da9a60b

Stack version

$ stack --version
Version 2.3.1 x86_64
Compiled with:
- Cabal-3.0.1.0
- Glob-0.10.0
- StateVar-1.2
- aeson-1.4.7.1
- annotated-wl-pprint-0.7.0
- ansi-terminal-0.10.3
- ansi-wl-pprint-0.6.9
- array-0.5.4.0
- asn1-encoding-0.9.6
- asn1-parse-0.9.5
- asn1-types-0.3.4
- async-2.2.2
- attoparsec-0.13.2.4
- attoparsec-iso8601-1.0.1.0
- auto-update-0.1.6
- base-4.13.0.0
- base-compat-0.11.1
- base-compat-batteries-0.11.1
- base-orphans-0.8.2
- base16-bytestring-0.1.1.6
- base64-bytestring-1.0.0.3
- basement-0.0.11
- bifunctors-5.5.7
- binary-0.8.7.0
- bitarray-0.0.1.1
- blaze-builder-0.4.1.0
- blaze-html-0.9.1.2
- blaze-markup-0.8.2.5
- bytestring-0.10.10.0
- casa-client-0.0.1
- casa-types-0.0.1
- case-insensitive-1.2.1.0
- cereal-0.5.8.1
- clock-0.8
- colour-2.3.5
- comonad-5.0.6
- conduit-1.3.2
- conduit-combinators-1.3.0
- conduit-extra-1.3.5
- connection-0.3.1
- constraints-0.12
- containers-0.6.2.1
- contravariant-1.5.2
- cookie-0.4.5
- cryptohash-sha256-0.11.101.0
- cryptonite-0.26
- cryptonite-conduit-0.2.2
- data-default-class-0.1.2.0
- deepseq-1.4.4.0
- digest-0.0.1.2
- directory-1.3.6.0
- distributive-0.6.2
- dlist-0.8.0.8
- easy-file-0.2.2
- echo-0.1.3
- ed25519-0.0.5.0
- either-5.0.1.1
- enclosed-exceptions-1.0.3
- exceptions-0.10.4
- extra-1.7.3
- fast-logger-3.0.1
- file-embed-0.0.11.2
- filelock-0.1.1.4
- filepath-1.4.2.1
- fsnotify-0.3.0.1
- generic-deriving-1.13.1
- ghc-boot-th-8.8.3
- ghc-prim-0.5.3
- githash-0.1.4.0
- hackage-security-0.6.0.1
- hashable-1.3.0.0
- hi-file-parser-0.1.0.0
- hinotify-0.4
- hourglass-0.2.12
- hpack-0.34.2
- hpc-0.6.0.3
- http-api-data-0.4.1.1
- http-client-0.6.4.1
- http-client-tls-0.3.5.3
- http-conduit-2.3.7.3
- http-download-0.2.0.0
- http-types-0.12.3
- infer-license-0.2.0
- integer-gmp-1.0.2.0
- integer-logarithms-1.0.3
- libyaml-0.1.2
- lifted-async-0.10.0.6
- lifted-base-0.2.3.12
- lukko-0.1.1.2
- megaparsec-8.0.0
- memory-0.15.0
- microlens-0.4.11.2
- microlens-mtl-0.2.0.1
- microlens-th-0.4.3.5
- mime-types-0.1.0.9
- mintty-0.1.2
- monad-control-1.0.2.3
- monad-logger-0.3.32
- monad-loops-0.4.3
- mono-traversable-1.0.15.1
- mtl-2.2.2
- mustache-2.3.1
- neat-interpolation-0.3.2.6
- network-3.1.1.1
- network-uri-2.6.3.0
- old-locale-1.0.0.7
- old-time-1.1.0.3
- open-browser-0.2.1.0
- optparse-applicative-0.15.1.0
- optparse-simple-0.1.1.2
- pantry-0.4.0.1
- parsec-3.1.14.0
- parser-combinators-1.2.1
- path-0.7.0
- path-io-1.6.0
- path-pieces-0.2.1
- pem-0.2.4
- persistent-2.10.5.2
- persistent-sqlite-2.10.6.2
- persistent-template-2.8.2.3
- pretty-1.1.3.6
- primitive-0.7.0.1
- process-1.6.8.0
- profunctors-5.5.2
- project-template-0.2.0.1
- random-1.1
- regex-applicative-0.3.3.1
- regex-applicative-text-0.1.0.1
- resource-pool-0.2.3.2
- resourcet-1.2.4.1
- retry-0.8.1.2
- rio-0.1.17.0
- rio-orphans-0.1.1.0
- rio-prettyprint-0.1.0.0
- rts-1.0
- safe-0.3.19
- safe-exceptions-0.1.7.0
- scientific-0.3.6.2
- semigroupoids-5.3.4
- semigroups-0.19.1
- shelly-1.9.0
- silently-1.2.5.1
- socks-0.6.1
- split-0.2.3.4
- stm-2.5.0.0
- stm-chans-3.0.0.4
- streaming-commons-0.2.1.2
- syb-0.7.1
- tagged-0.8.6
- tar-0.5.1.1
- tar-conduit-0.3.2
- template-haskell-2.15.0.0
- temporary-1.3
- text-1.2.4.0
- text-metrics-0.3.0
- th-abstraction-0.3.2.0
- th-expand-syns-0.4.6.0
- th-lift-0.8.1
- th-lift-instances-0.1.17
- th-reify-many-0.1.9
- time-1.9.3
- time-compat-1.9.3
- tls-1.5.4
- transformers-0.5.6.2
- transformers-base-0.4.5.2
- transformers-compat-0.6.5
- type-equality-1
- typed-process-0.2.6.0
- unicode-transforms-0.3.6
- unix-2.7.2.2
- unix-compat-0.5.2
- unix-time-0.4.7
- unliftio-0.2.13
- unliftio-core-0.1.2.0
- unordered-containers-0.2.10.0
- uuid-types-1.0.3
- vector-0.12.1.2
- vector-algorithms-0.8.0.3
- x509-1.7.5
- x509-store-1.6.7
- x509-system-1.6.6
- x509-validation-1.6.11
- yaml-0.11.4.0
- zip-archive-0.4.1
- zlib-0.6.2.1

Warning: this is an unsupported build that may use different versions of
dependencies and GHC than the officially released binaries, and therefore may
not behave identically.  If you encounter problems, please try the latest
official build by running 'stack upgrade --force-download'.

Method of installation

Built using a lts-16 stackage snapshot and stack

TerrorJack commented 4 years ago

Just figured out the problem goes away if the with-hpack option is commented out in ~/.stack/config.yaml. It may still be a bug, but of course, feel free to close this one.

mattaudesse commented 4 years ago

Thanks for reporting this @TerrorJack.

Tracing through the code quickly, it looks to me like your fix is the only safe solution since the with-hpack configuration knob you mention ultimately toggles what happens here in the Pantry codebase:

case he of
  HpackBundled -> do
    r <- liftIO $ Hpack.hpackResult $ Hpack.setProgramName "stack" $ Hpack.setTarget (toFilePath hpackFile) Hpack.defaultOptions
    forM_ (Hpack.resultWarnings r) (logWarn . fromString)
    let cabalFile = fromString . Hpack.resultCabalFile $ r
    case Hpack.resultStatus r of
      Hpack.Generated -> logDebug $ "hpack generated a modified version of " <> cabalFile
      Hpack.OutputUnchanged -> logDebug $ "hpack output unchanged in " <> cabalFile
      Hpack.AlreadyGeneratedByNewerHpack -> logWarn $
        cabalFile <>
        " was generated with a newer version of hpack,\n" <>
        "please upgrade and try again."
      Hpack.ExistingCabalFileWasModifiedManually -> logWarn $
        cabalFile <>
        " was modified manually. Ignoring " <>
        fromString (toFilePath hpackFile) <>
        " in favor of the cabal file.\nIf you want to use the " <>
        fromString (toFilePath (filename hpackFile)) <>
        " file instead of the cabal file,\n" <>
        "then please delete the cabal file."
  HpackCommand command ->
    withWorkingDir (toFilePath pkgDir) $
    proc command [] runProcess_

Spawning an external hpack in the HpackCommand stanza rather than using an integrated library means we can't know exactly how to intercept its output (because it may differ by version), so I'd say this is working as expected.