Updating Haskell packages on Arch
A few days ago I noticed that there were a few Haskell packages on AUR that had received updates. This was the excuse I had been waiting for to address the second part of keeping my Haskell packages up-to-date (I’ve written about the first part before, dealing with an update to GHC).
It’s easy to find the packages with available updates:
% yaourt -Su --aur
Unfortunately it isn’t as easy as just updating the listed packages. Any
package that depends on an updated package really should be re-compiled and
re-installed to guarantee that the entire system behaves as expected after the
upgrade. Of course pacman can handle it:
% pacman -Rcn <all pkgs with updates>
This will list all packages that will be removed. After removing them all, they can all be re-installed. That is of course not quite as nice as it could be, since they all then will be explicitly installed, it would be nicer to just re-install the “top-level packages”. This is one way to achieve this.
I did a bit of refactoring and put the Arch-related functions from the
previous post in their own module, Arch. Then I added a function that takes
a package and recursively inspects Required By until a “top-level package”
(i.e. a package that doesn’t require any other package) is reached:
getTopRequiredBy pkg = let tops = do first <- getRequiredBy pkg if null first then return [pkg] else liftM concat $ mapM getTopRequiredBy first in liftM nub tops
After that it’s straight forward to write up a little tool which offers some advice on what to do:
main = do pkgsToUpgrade <- getArgs pkgsToReinstall <- liftM (nub . concat) $ mapM Arch.getTopRequiredBy pkgsToUpgrade putStrLn $ "To remove : pacman -Rnc " ++ unwords pkgsToUpgrade putStrLn $ "To re-install : yaourt -S " ++ unwords pkgsToReinstall
Using it on the packages I wanted to upgrade gave the following output:
% runhaskell PkgUpgrade.hs haskell-{configfile,haxml,json,missingh,safe,testpack,time} To remove : pacman -Rnc haskell-configfile haskell-haxml haskell-json haskell-missingh haskell-safe haskell-testpack haskell-time To re-install : yaourt -S haskell-configfile haskell-haxml haskell-json haskell-hsh haskell-safe
Following that advice seemed to work just like I intended.
![[Digg]](http://therning.org/magnus/wp-content/plugins/bookmarkify/digg.png)
![[Reddit]](http://therning.org/magnus/wp-content/plugins/bookmarkify/reddit.png)
Can this be used to update other packages from AUR or is this not necessary? I’ve been doing
Could you post the complete
PkgUpgrade.hs? I’m not familiar with Haskell but would like to use this utility. Thanks.@David, this is not necessary for other packages in AUR, only for Haskell packages compiled with GHC.