nix-diff 1.0.15 → 1.0.16
raw patch · 4 files changed
+39/−3 lines, 4 filesdep +filepathdep +process
Dependencies added: filepath, process
Files
- CHANGELOG.md +6/−0
- README.md +7/−0
- nix-diff.cabal +3/−1
- src/Main.hs +23/−2
CHANGELOG.md view
@@ -1,3 +1,9 @@+1.0.16++* [Accept realised store paths as input](https://github.com/Gabriel439/nix-diff/pull/47)+ * `nix-diff` will attempt to find the corresponding derivations using+ `nix-store --query --deriver` if you provide a realised store path as input+ 1.0.15 * [Fix non-exhaustive pattern match](https://github.com/Gabriel439/nix-diff/pull/45)
README.md view
@@ -77,6 +77,13 @@  +It's also possible to pass store paths or links to store paths, for example:++```ShellSession+$ nix-build example.nix+$ nix-diff /run/current-system ./result+```+ ## Development status [](https://travis-ci.org/Gabriel439/nix-diff)
nix-diff.cabal view
@@ -1,5 +1,5 @@ name: nix-diff-version: 1.0.15+version: 1.0.16 synopsis: Explain why two Nix derivations differ description: This package provides a @nix-diff@ executable which explains why two Nix derivations (i.e. @*.drv@ files)@@ -30,6 +30,8 @@ , text >= 1.2 && < 1.3 , unix < 2.8 , vector >= 0.12 && < 0.13+ , process < 1.7+ , filepath < 1.5 hs-source-dirs: src default-language: Haskell2010 ghc-options: -Wall
src/Main.hs view
@@ -15,6 +15,7 @@ import Control.Monad.Reader (MonadReader, ReaderT, ask, local) import Control.Monad.State (MonadState, StateT, get, put) import Data.Attoparsec.Text (IResult(..))+import Data.List.NonEmpty (NonEmpty(..)) import Data.Map (Map) import Data.Monoid ((<>)) import Data.Set (Set)@@ -29,8 +30,10 @@ import qualified Control.Monad.State import qualified Data.Attoparsec.Text import qualified Data.Char as Char+import qualified Data.List.NonEmpty import qualified Data.Map import qualified Data.Set+import qualified Data.String as String import qualified Data.Text as Text import qualified Data.Text.IO as Text.IO import qualified Data.Vector@@ -39,8 +42,10 @@ import qualified Options.Applicative import qualified Patience import qualified System.Directory as Directory+import qualified System.FilePath as FilePath import qualified System.Posix.IO import qualified System.Posix.Terminal+import qualified System.Process as Process #if MIN_VERSION_base(4,9,0) import Control.Monad.Fail (MonadFail)@@ -214,6 +219,22 @@ _ -> do fail ("Could not parse a derivation from this file: " ++ string) +-- | Read and parse a derivation from a store path that can be a derivation+-- (.drv) or a realized path, in which case the corresponding derivation is+-- queried.+readInput :: FilePath -> Diff (Derivation FilePath Text)+readInput path =+ if FilePath.isExtensionOf ".drv" path+ then readDerivation path+ else do+ let string = path+ result <- liftIO (Process.readProcess "nix-store" [ "--query", "--deriver", string ] [])+ case String.lines result of+ [] -> fail ("Could not obtain the derivation of " ++ string)+ l : ls -> do+ let drv_path = Data.List.NonEmpty.last (l :| ls)+ readDerivation drv_path+ {-| Join two `Map`s on shared keys, discarding keys which are not present in both `Map`s -}@@ -623,8 +644,8 @@ then do echo (explain "The requested outputs do not match") else do- leftDerivation <- readDerivation leftPath- rightDerivation <- readDerivation rightPath+ leftDerivation <- readInput leftPath+ rightDerivation <- readInput rightPath let leftOuts = Nix.Derivation.outputs leftDerivation let rightOuts = Nix.Derivation.outputs rightDerivation