packages feed

cabal-bounds 0.2 → 0.2.1

raw patch · 4 files changed

+90/−67 lines, 4 filesdep +unordered-containers

Dependencies added: unordered-containers

Files

cabal-bounds.cabal view
@@ -1,5 +1,5 @@ name: cabal-bounds-version: 0.2+version: 0.2.1 cabal-version: >=1.9.2 build-type: Simple license: BSD3@@ -26,20 +26,20 @@              .              > # update the version infos of all libraries              > $> cabal update-             > +             >              > # drops the upper bound of all dependencies in 'myproject.cabal',              > # most likely you want to ignore 'base'              > $> cabal-bounds drop --upper --ignore=base myproject.cabal-             > +             >              > # create a cabal sandbox for building of 'myproject'              > $> cabal sandbox init-             >   +             >              > # build 'myproject'              > $> cabal install-             > +             >              > # update the upper bound of all dependencies in 'myproject.cabal'              > # by the cabal build information-             > $> cabal-bounds update --upper --ignore=base myproject.cabal dist/dist-sandbox-*/setup-config +             > $> cabal-bounds update --upper --ignore=base myproject.cabal dist/dist-sandbox-*/setup-config              .              .              .@@ -51,7 +51,7 @@              .              > $> cabal-bounds drop ...              > lens >=4.0.1 && <4.1   =>   lens-             > +             >              > $> cabal-bounds drop --upper ...              > lens >=4.0.1 && <4.1   =>   lens >=4.0.1              .@@ -100,8 +100,8 @@              .              > $> cabal --version              > cabal-install version 1.18.0.2-             > using version 1.18.1 of the Cabal library -             > +             > using version 1.18.1 of the Cabal library+             >              > $> cabal install --constraint="Cabal == 1.18.1" cabal-bounds              .              If you update the 'cabal' binary and the used 'Cabal' library changes, then you have to rebuild 'cabal-bounds'.@@ -164,8 +164,10 @@   library     build-depends: base >=3 && <5, cmdargs >=0.10.5 && <0.11,-                   lens >=4.0.1 && <4.1, strict >=0.3.2 && <0.4, Cabal >=1.18.0 && <1.19-    exposed-modules: CabalBounds.Args CabalBounds.Main CabalBounds.VersionComp+                   lens >=4.0.1 && <4.1, strict >=0.3.2 && <0.4,+                   unordered-containers >=0.2.3.3 && <0.3, Cabal >=1.18.0 && <1.19+    exposed-modules: CabalBounds.Args CabalBounds.Main+                     CabalBounds.VersionComp     exposed: True     buildable: True     cpp-options: -DCABAL@@ -177,7 +179,8 @@   executable cabal-bounds     build-depends: base >=3 && <5, cmdargs >=0.10.5 && <0.11,-                   lens >=4.0.1 && <4.1, strict >=0.3.2 && <0.4, Cabal >=1.18.0 && <1.19+                   lens >=4.0.1 && <4.1, strict >=0.3.2 && <0.4,+                   unordered-containers >=0.2.3.3 && <0.3, Cabal >=1.18.0 && <1.19     main-is: Main.hs     buildable: True     cpp-options: -DCABAL@@ -190,7 +193,8 @@   test-suite cabal-bounds-tests     build-depends: base >=3 && <5, cmdargs >=0.10.5 && <0.11,-                   lens >=4.0.1 && <4.1, strict >=0.3.2 && <0.4, Cabal >=1.18.0 && <1.19,+                   lens >=4.0.1 && <4.1, strict >=0.3.2 && <0.4,+                   unordered-containers >=0.2.3.3 && <0.3, Cabal >=1.18.0 && <1.19,                    tasty ==0.7.*, tasty-golden >=2.2.0.2 && <2.3,                    filepath >=1.3.0.1 && <1.4, cabal-bounds -any     type: exitcode-stdio-1.0
src/CabalBounds/Drop.hs view
@@ -18,10 +18,7 @@  drop :: DropBound -> Targets -> Dependencies -> GenericPackageDescription -> GenericPackageDescription drop bound AllTargets deps pkgDescrp =-   pkgDescrp & L.dependenciesOfLib        . filterDeps %~ dropFromDep-             & L.dependenciesOfAllExes    . filterDeps %~ dropFromDep-             & L.dependenciesOfAllTests   . filterDeps %~ dropFromDep-             & L.dependenciesOfAllBenchms . filterDeps %~ dropFromDep+   pkgDescrp & L.allDependencies . filterDeps %~ dropFromDep    where       filterDeps  = filterDependencies deps       dropFromDep = dropFromDependency bound
src/CabalBounds/Lenses.hs view
@@ -3,6 +3,7 @@ module CabalBounds.Lenses    ( vbranch    , vtags+   , allDependencies    , dependenciesOfLib    , dependenciesOfAllExes    , dependenciesOfExe@@ -27,6 +28,10 @@ makeLensesFor [ ("versionBranch", "vbranch")               , ("versionTags"  , "vtags")               ] ''Version+++allDependencies :: Traversal' GenericPackageDescription [Dependency]+allDependencies = biplate  dependenciesOfLib :: Traversal' GenericPackageDescription [Dependency] dependenciesOfLib = condLibraryL . _Just . biplate
src/CabalBounds/Update.hs view
@@ -7,30 +7,31 @@ import qualified Distribution.PackageDescription as D import qualified Distribution.Package as P import qualified Distribution.Version as V-import qualified Distribution.Simple.LocalBuildInfo as L+import qualified Distribution.Simple.LocalBuildInfo as BI import qualified Distribution.Simple.PackageIndex as PX import qualified Distribution.InstalledPackageInfo as PI import Control.Lens+import Control.Applicative ((<$>)) import CabalBounds.Bound (UpdateBound(..)) import CabalBounds.Targets (Targets(..), dependenciesOf) import CabalBounds.Dependencies (Dependencies, filterDependencies) import CabalBounds.VersionComp (VersionComp(..), defaultLowerComp)-import CabalBounds.Lenses-import Data.List (sort, foldl', find)+import qualified CabalBounds.Lenses as L+import Data.List (sort, foldl')+import qualified Data.HashMap.Strict as HM+import Data.Maybe (fromMaybe, listToMaybe) -type InstalledPackages = [(P.PackageName, V.Version)]+type PkgName           = String+type InstalledPackages = HM.HashMap PkgName V.Version -update :: UpdateBound -> Targets -> Dependencies -> D.GenericPackageDescription -> L.LocalBuildInfo -> D.GenericPackageDescription++update :: UpdateBound -> Targets -> Dependencies -> D.GenericPackageDescription -> BI.LocalBuildInfo -> D.GenericPackageDescription update bound AllTargets deps pkgDescrp buildInfo =-   pkgDescrp & dependenciesOfLib        . filterDeps %~ updateDep-             & dependenciesOfAllExes    . filterDeps %~ updateDep-             & dependenciesOfAllTests   . filterDeps %~ updateDep-             & dependenciesOfAllBenchms . filterDeps %~ updateDep+   pkgDescrp & L.allDependencies . filterDeps %~ updateDep    where       filterDeps = filterDependencies deps       updateDep  = updateDependency bound (installedPackages buildInfo) - update bound (Targets targets) deps pkgDescrp buildInfo =    foldl' updateTarget pkgDescrp targets    where@@ -42,65 +43,81 @@   updateDependency :: UpdateBound -> InstalledPackages -> P.Dependency -> P.Dependency-updateDependency (UpdateLower comp) instPkgs dep@(P.Dependency pkgName _)-   | Just (_, version) <- find ((== pkgName) . fst) instPkgs-   , Just intervals    <- versionIntervals (versionComp comp version) Nothing-   = P.Dependency pkgName (V.fromVersionIntervals intervals)--   | otherwise-   = dep--updateDependency (UpdateUpper comp) instPkgs dep@(P.Dependency pkgName versionRange)-   | not . V.isAnyVersion $ versionRange-   , Just (_, upperVersion)             <- find ((== pkgName) . fst) instPkgs-   , (V.LowerBound lowerVersion _, _):_ <- V.asVersionIntervals versionRange-   , Just intervals                     <- versionIntervals lowerVersion (Just $ nextVersion $ versionComp comp upperVersion)-   = P.Dependency pkgName (V.fromVersionIntervals intervals)+updateDependency (UpdateLower comp) instPkgs dep =+   fromMaybe dep $ do+      let pkgName_ = pkgName dep+      version <- HM.lookup pkgName_ instPkgs+      vrange  <- mkVersionRange (comp `compOf` version) Nothing+      return $ mkDependency pkgName_ vrange -   | otherwise+updateDependency (UpdateUpper comp) instPkgs dep+   | V.isAnyVersion versionRange_    = updateDependency (UpdateBoth defaultLowerComp comp) instPkgs dep -updateDependency (UpdateBoth lowerComp upperComp) instPkgs dep@(P.Dependency pkgName _)-   | Just (_, version) <- find ((== pkgName) . fst) instPkgs-   , Just intervals    <- versionIntervals (versionComp lowerComp version) (Just $ nextVersion $ versionComp upperComp version)-   = P.Dependency pkgName (V.fromVersionIntervals intervals)-    | otherwise-   = dep+   = fromMaybe dep $ do+        upperVersion                <- HM.lookup pkgName_ instPkgs+        V.LowerBound lowerVersion _ <- fst <$> (listToMaybe $ V.asVersionIntervals versionRange_)+        vrange                      <- mkVersionRange lowerVersion (Just $ nextVersion $ comp `compOf` upperVersion)+        return $ mkDependency pkgName_ vrange+   where+      versionRange_ = versionRange dep+      pkgName_      = pkgName dep +updateDependency (UpdateBoth lowerComp upperComp) instPkgs dep =+   fromMaybe dep $ do+      let pkgName_ = pkgName dep+      version <- HM.lookup pkgName_ instPkgs+      vrange  <- mkVersionRange (lowerComp `compOf` version) (Just $ nextVersion $ upperComp `compOf` version)+      return $ mkDependency pkgName_ vrange -versionIntervals :: V.Version -> Maybe V.Version -> Maybe V.VersionIntervals-versionIntervals lowerVersion Nothing =-   V.mkVersionIntervals [(V.LowerBound lowerVersion V.InclusiveBound, V.NoUpperBound)] -versionIntervals lowerVersion (Just upperVersion) =-   V.mkVersionIntervals [(V.LowerBound lowerVersion V.InclusiveBound, V.UpperBound upperVersion V.ExclusiveBound)]+mkVersionRange :: V.Version -> Maybe V.Version -> Maybe V.VersionRange+mkVersionRange lowerVersion Nothing =+   V.fromVersionIntervals <$> V.mkVersionIntervals [(V.LowerBound lowerVersion V.InclusiveBound, V.NoUpperBound)] +mkVersionRange lowerVersion (Just upperVersion) =+   V.fromVersionIntervals <$> V.mkVersionIntervals [(V.LowerBound lowerVersion V.InclusiveBound,+                                                     V.UpperBound upperVersion V.ExclusiveBound)] -versionComp :: VersionComp -> V.Version -> V.Version-versionComp Major1 version =-   version & vbranch %~ take 1-           & vtags   .~ [] -versionComp Major2 version =-   version & vbranch %~ take 2-           & vtags   .~ []+compOf :: VersionComp -> V.Version -> V.Version+Major1 `compOf` version =+   version & L.vbranch %~ take 1+           & L.vtags   .~ [] -versionComp Minor version =-   version & vtags .~ []+Major2 `compOf` version =+   version & L.vbranch %~ take 2+           & L.vtags   .~ [] +Minor `compOf` version =+   version & L.vtags .~ [] + nextVersion :: V.Version -> V.Version nextVersion version =-   version & vbranch %~ increaseLast+   version & L.vbranch %~ increaseLastComp    where-      increaseLast = reverse . (& ix 0 %~ (+ 1)) . reverse+      increaseLastComp = reverse . (& ix 0 %~ (+ 1)) . reverse  -installedPackages :: L.LocalBuildInfo -> InstalledPackages-installedPackages = map (& _2 %~ newestVersion)+installedPackages :: BI.LocalBuildInfo -> InstalledPackages+installedPackages = HM.fromList+                    . map (\(P.PackageName n, v) -> (n, newestVersion v))                     . filter ((not . null) . snd)-                    . PX.allPackagesByName . L.installedPkgs+                    . PX.allPackagesByName . BI.installedPkgs    where       newestVersion :: [PI.InstalledPackageInfo] -> V.Version       newestVersion = last . sort . map (P.pkgVersion . PI.sourcePackageId)+++pkgName :: P.Dependency -> PkgName+pkgName (P.Dependency (P.PackageName name) _) = name+++versionRange :: P.Dependency -> V.VersionRange+versionRange (P.Dependency _ vrange) = vrange+++mkDependency :: PkgName -> V.VersionRange -> P.Dependency+mkDependency name vrange = P.Dependency (P.PackageName name) vrange