packages feed

shellmate 0.2.1 → 0.2.2

raw patch · 2 files changed

+57/−34 lines, 2 filesdep ~transformers

Dependency ranges changed: transformers

Files

Control/Shell.hs view
@@ -128,60 +128,83 @@ --   current name. cpdir :: FilePath -> FilePath -> Shell () cpdir fromdir todir = do-    dir <- isDirectory todir-    if dir-      then go fromdir todir id-      else go fromdir todir (joinPath . drop 1 . splitPath)+    exists <- isDirectory todir+    if exists+      then do+        mkdir True (todir </> takeFileName fromdir)+        go fromdir (todir </> takeFileName fromdir)+      else mkdir True todir >> go fromdir todir   where-    go from to dropFirstDir = do-      forEachDirectory_ from (\dir -> mkdir True (to </> dropFirstDir dir))+    go from to = do+      forEachDirectory_ from (\dir -> mkdir True (to </> dir))       forEachFile_ from $ \file -> do-        let file' = to </> dropFirstDir file+        let file' = to </> file         assert (errOverwrite file') (not <$> isDirectory file')-        cp file file'+        cp (from </> file) file'     errOverwrite f = "cannot overwrite directory `" ++ f                      ++ "' with non-directory"  -- | Recursively perform an action on each subdirectory of the given directory.+--   The path passed to the callback is relative to the given directory. --   The action will *not* be performed on the given directory itself. forEachDirectory :: FilePath -> (FilePath -> Shell a) -> Shell [a]-forEachDirectory dir f = do-  files <- map (dir </>) <$> ls dir-  fromdirs <- filterM isDirectory files-  xs <- forM fromdirs $ \d -> do-    x <- f d-    xs <- forEachDirectory d f-    return (x:xs)-  return (concat xs)+forEachDirectory root f = go ""+  where+    dir = if null root then "." else root+    go subdir = do+      let dir' = dir </> subdir+      files <- ls dir'+      fromdirs <- filterM (\d -> isDirectory (dir' </> d)) files+      xs <- forM fromdirs $ \d -> do+        let d' = subdir </> d+        x <- f d'+        (x:) <$> go d'+      return (concat xs)  -- | Like 'forEachDirectory', but discards its result. forEachDirectory_ :: FilePath -> (FilePath -> Shell ()) -> Shell ()-forEachDirectory_ dir f = do-  files <- map (dir </>) <$> ls dir-  fromdirs <- filterM isDirectory files-  forM_ fromdirs $ \d -> f d >> forEachDirectory d f+forEachDirectory_ root f = go ""+  where+    dir = if null root then "." else root+    go subdir = do+      let dir' = dir </> subdir+      files <- ls dir'+      fromdirs <- filterM (\d -> isDirectory (dir' </> d)) files+      forM_ fromdirs $ \d -> let d' = subdir </> d in f d' >> go d'  -- | Perform an action on each file in the given directory. --   This function will traverse any subdirectories of the given as well. --   File paths are given relative to the given directory; the current working --   directory is not affected. forEachFile :: FilePath -> (FilePath -> Shell a) -> Shell [a]-forEachFile dir f = do-  files <- map (dir </>) <$> ls dir-  xs <- filterM isFile files >>= mapM f-  fromdirs <- filterM isDirectory files-  xss <- forM fromdirs $ \d -> do-    forEachFile d f-  return $ concat (xs:xss)+forEachFile root f = go ""+  where+    dir = if null root then "." else root+    go subdir = do+      let dir' = dir </> subdir+      files <- ls dir'+      +      -- For each file in this directory...+      onlyfiles <- filterM (\fl -> isFile (dir' </> fl)) files+      xs <- mapM (\x -> f (subdir </> x)) onlyfiles +      -- For each subdirectory...+      fromdirs <- filterM (\fl -> isDirectory (dir' </> fl)) files+      xss <- forM fromdirs $ \d -> do+        go (subdir </> d)+      return $ concat (xs:xss)+ -- | Like @forEachFile@ but only performs a side effect. forEachFile_ :: FilePath -> (FilePath -> Shell ()) -> Shell ()-forEachFile_ dir f = do-  files <- map (dir </>) <$> ls dir-  filterM isFile files >>= mapM_ f-  fromdirs <- filterM isDirectory files-  forM_ fromdirs $ \d -> do-    forEachFile d f+forEachFile_ root f = go ""+  where+    dir = if null root then "." else root+    go subdir = do+      let dir' = dir </> subdir+      files <- ls dir'+      filterM (\fl -> isFile (dir' </> fl)) files >>= mapM_ (f . (subdir </>))+      fromdirs <- filterM (\fl -> isDirectory (dir' </> fl)) files+      forM_ fromdirs $ \d -> go (subdir </> d)  -- | Copy a file. Fails if the source is a directory. If the target is a --   directory, the source file is copied into that directory using its current
shellmate.cabal view
@@ -1,5 +1,5 @@ name:                shellmate-version:             0.2.1+version:             0.2.2 synopsis:            Simple interface for shell scripting in Haskell. description:         Aims to simplify development of cross-platform shell scripts and similar things. homepage:            http://github.com/valderman/shellmate