@@ -14,8 +14,9 @@ import Data.Bifunctor (first)
1414import GHC.Generics (Generic )
1515import Data.Set (Set )
1616import Data.Text (Text )
17- import System.Nix.StorePath (StoreDir , StorePath , StorePathName , InvalidPathError )
17+ import System.Nix.StorePath (StoreDir ( .. ) , StorePath , StorePathName , InvalidPathError )
1818
19+ import qualified Data.ByteString.Char8
1920import qualified Data.Set
2021import qualified Data.Text
2122import qualified System.Nix.StorePath
@@ -33,6 +34,7 @@ data DerivedPath =
3334data ParseOutputsError =
3435 ParseOutputsError_InvalidPath InvalidPathError
3536 | ParseOutputsError_NoNames
37+ | ParseOutputsError_NoPrefix StoreDir Text
3638 deriving (Eq , Ord , Show )
3739
3840convertError
@@ -61,16 +63,32 @@ parseDerivedPath
6163 :: StoreDir
6264 -> Text
6365 -> Either ParseOutputsError DerivedPath
64- parseDerivedPath root p =
65- -- TODO: breaks when root contains !
66- case Data.Text. breakOn " !" p of
67- (s, r) ->
68- if Data.Text. null r
69- then DerivedPath_Opaque
70- <$> (convertError $ System.Nix.StorePath. parsePathFromText root s)
71- else DerivedPath_Built
72- <$> (convertError $ System.Nix.StorePath. parsePathFromText root s)
73- <*> parseOutputsSpec (Data.Text. drop (Data.Text. length " !" ) r)
66+ parseDerivedPath root@ (StoreDir sd) path =
67+ let -- We need to do a bit more legwork for case
68+ -- when StoreDir contains '!'
69+ -- which is generated by its Arbitrary instance
70+ textRoot = Data.Text. pack
71+ $ Data.ByteString.Char8. unpack sd
72+
73+ in case Data.Text. stripPrefix textRoot path of
74+ Nothing -> Left $ ParseOutputsError_NoPrefix root path
75+ Just woRoot ->
76+ case Data.Text. breakOn " !" woRoot of
77+ (pathNoPrefix, r) ->
78+ if Data.Text. null r
79+ then DerivedPath_Opaque
80+ <$> (convertError
81+ $ System.Nix.StorePath. parsePathFromText
82+ root
83+ path
84+ )
85+ else DerivedPath_Built
86+ <$> (convertError
87+ $ System.Nix.StorePath. parsePathFromText
88+ root
89+ (textRoot <> pathNoPrefix)
90+ )
91+ <*> parseOutputsSpec (Data.Text. drop (Data.Text. length " !" ) r)
7492
7593derivedPathToText :: StoreDir -> DerivedPath -> Text
7694derivedPathToText root = \ case
0 commit comments