packages feed

photoname 3.1 → 3.2

raw patch · 12 files changed

+720/−18 lines, 12 filesdep ~base

Dependency ranges changed: base

Files

LICENSE view
@@ -1,4 +1,4 @@-Copyright (c) 2007-2015 Dino Morelli+Copyright (c) 2007-2016 Dino Morelli All rights reserved.  Redistribution and use in source and binary forms, with or without
+ README.md view
@@ -0,0 +1,41 @@+# photoname+++## Synopsis++Rename photo image files based on EXIF shoot date (Haskell)+++## Description++photoname is a command-line utility for renaming/moving photo image+files. The new folder location and naming are determined by the+photo shoot date information contained within the file's EXIF tags.+++## Getting source++- Download the cabalized source package [from Hackage](http://hackage.haskell.org/package/photoname)+- epub-tools is available for Arch Linux [from the AUR](https://aur.archlinux.org/packages/photoname/)+- Get the source with darcs: `$ darcs get http://hub.darcs.net/dino/photoname`+- If you're just looking, [browse the source](http://hub.darcs.net/dino/photoname)++And once you have it, building the usual way:++    $ cabal configure --enable-tests+    $ cabal build+    $ cabal test+    $ cabal install+++## Installing++Build and install with cabal-install:+  `$ cabal update ; cabal install photoname`+++## Contact++Dino Morelli <[dino@ui3.info](mailto:dino@ui3.info)>++Past Debian 64-bit packaging work was performed by Magnus Therning
+ TODO.md view
@@ -0,0 +1,8 @@+- Allow user to specify permissions for newly-created dirs and+  files. Bonus points for parsing the octal codes everyone knows+  and loves.+- Add a `--force` switch to disregard existing links.+- Deal gracefully with unknown dates. This means not just putting+  pictures into the 0000/0000-00-00 directory, but making sure that+  the `_###` serial number part is incremented from the highest one+  in there.
+ changelog.md view
@@ -0,0 +1,79 @@+3.1 (2015-06-28)++   * Removed ambiguous import of `System.Locale.defaultTimeLocale`+   * Updated to use `Data.Version` to fish the version out of cabal info+   * Replaced deprecated ErrorT with ExceptT+   * Added pragma for Control.Applicative import+   * Updated README and cabal file with current info+   * Moved copyright year up to 2015+++3.0.1 (2012-11-01)++   * Updated test suite to build cleanly (without warnings) and+     run against modern cabal versions+   * Updated cabal file to modern cabal standards. Unit testing is+     now cabal-driven and we now fully support cabal sdist.+   * Fixed a problem where try is no longer available. Now importing+     Control.Exception to bring it into scope.+   * Adjusted usage to explain a change in how we find the EXIF+     date stamps+   * Moved copyright year up to 2012+++3.0.0 (2011-05-08)++   * New naming scheme that uses date/time only, no serial. This+     is a BIG change but the old naming scheme is still available.+   * Parent directory is now a switch+   * Subdirectory path creation of year and day can be suppressed+   * User can specify an arbitrary suffix string for the new names+   * User can now put switches into a config file+++2.3.0 (2010-01-25)++   * Problem fixed that had recently come up with the Exif+     library. Specifically, files with no EXIF data were causing+     an IO error to be thrown and processing to halt. (thanks to+     Josh Hoyt)+   * Other minor updates to things like copyright info and version+     number+++2.2 (2009-06-07)++   * No changes in how the software behaves+   * Updated build-depends to be explicit about base version+     requirement+   * Minor update to BSD3 copyright notices to bring them up to 2009+   * Debian binary package of v2.2 available+++2.1 (2008-10-11)++   * More big changes to the transformers used. No longer using+     WriterT. Now using ErrorT for error handling.+   * Changed to record-style data for the arg parsing. +++2.0 (2008-03-05)++   * Upgraded to build under GHC 6.8.2+   * Major internal changes. Now using ReaderT and WriterT+   * Changed version numbering scheme to be more conventional. Recent+     versions of cabal were not amused with the strange version+     string.+   * This project now added to HackageDB +++003 (2007-09-13)++   * Repairs for a build problem with GHC > 6.6 specifically related+     to depending on FilePath instead of filepath and now requiring+     import of Data.Time.Format+++002 (2007-04-28)++   * Initial release
+ doc/dev/notes view
@@ -0,0 +1,41 @@+-----+- To change the app version:+   - Edit photoname.cabal+   - Edit src/Photoname/Opts.hs, usageText near the bottom of footer++   I'd like to make a script in util/ to automate this.+   After such a script has been made, may want to put developer notes on using it in doc/dev/<somefile>++----------+File naming format:++yyyymmdd_[oth_]nnn[-e[n]].jpg+yyyymmdd-hhmmss[_oth][_ss].jpg++date: year month day+time: hour minute second+oth: could be photographer: 2 or 3 character initials+ss: edited or sized, optional number for more than one+   _sp _ep : sized/edited for printing+   _sd1920x1080 _ed : sized/edited for desktop+   _sw _ew : sized/edited for web+++These files are arranged into a dir structure++top-level/+   0000/+      0000-00-00/+         00000000_001.jpg   -- Unknown pictures+         00000000_002.jpg+   2006/+      2006-10-13/+         20061013_431.jpg+         20061013_509.jpg+   2007/+      2007-01-30/+         20070130_002.jpg+         20070130_119-ew.jpg+      2007-04-19/+         20070419_bmd_323.jpg+         20070419_bmd_325-sd.jpg
+ doc/hcar-photoname.tex view
@@ -0,0 +1,21 @@+\begin{hcarentry}{photoname}+\label{photoname}+\report{Dino Morelli}%11/08+\status{stable, maintained}+\makeheader++photoname is a command-line utility for renaming/moving photo image files. The new folder location and naming are determined by the EXIF photo shoot date and the usually-camera-assigned serial number, often appearing in the filename.++photoname is on Hackage and can be acquired using darcs or other methods. See the project page below for more.++\FurtherReading+\begin{compactitem}+\item Project page:++\url{http://ui3.info/d/proj/photoname.html}++\item Source repository:++\texttt{darcs get} \url{http://ui3.info/darcs/photoname}+\end{compactitem}+\end{hcarentry}
photoname.cabal view
@@ -1,10 +1,10 @@ name:                photoname cabal-version:       >= 1.8-version:             3.1+version:             3.2 build-type:          Simple license:             BSD3 license-file:        LICENSE-copyright:           2007-2015 Dino Morelli+copyright:           2007-2016 Dino Morelli author:              Dino Morelli  maintainer:          Dino Morelli <dino@ui3.info> stability:           stable@@ -14,7 +14,7 @@    Command-line utility for renaming/moving photo image files based on     EXIF tags. category:            Application, Console-tested-with:         GHC >= 7.6.1+tested-with:         GHC >= 8.0.1  extra-source-files:  testsuite/resources/*.jpg @@ -24,8 +24,15 @@  executable           photoname    main-is:          photoname.hs-   build-depends:    base >= 3 && < 5, directory, exif, filepath, mtl, -                     old-locale, parsec, time, unix+   build-depends:      base >=4.5 && < 5.0+                     , directory+                     , exif+                     , filepath+                     , mtl+                     , old-locale+                     , parsec+                     , time+                     , unix    other-modules:    Photoname.Common                      Photoname.DateFormat                      Photoname.Date@@ -38,9 +45,18 @@ test-suite           photoname-tests    type:             exitcode-stdio-1.0    main-is:          runtests.hs-   build-depends:    base, directory, exif, filepath, HUnit, mtl,-                     old-locale, parsec, process, regex-posix, time,-                     unix+   build-depends:      base >=4.5 && < 5.0+                     , directory+                     , exif+                     , filepath+                     , HUnit+                     , mtl+                     , old-locale+                     , parsec+                     , process+                     , regex-posix+                     , time+                     , unix    other-modules:    TestHelp                      TestLink                      Util
+ stack.yaml view
@@ -0,0 +1,71 @@+# This file was automatically generated by 'stack init'+#+# Some commonly used options have been documented as comments in this file.+# For advanced use and comprehensive documentation of the format, please see:+# http://docs.haskellstack.org/en/stable/yaml_configuration/++# Resolver to choose a 'specific' stackage snapshot or a compiler version.+# A snapshot resolver dictates the compiler version and the set of packages+# to be used for project dependencies. For example:+#+# resolver: lts-3.5+# resolver: nightly-2015-09-21+# resolver: ghc-7.10.2+# resolver: ghcjs-0.1.0_ghc-7.10.2+# resolver:+#  name: custom-snapshot+#  location: "./custom-snapshot.yaml"+resolver: lts-7.2++# User packages to be built.+# Various formats can be used as shown in the example below.+#+# packages:+# - some-directory+# - https://example.com/foo/bar/baz-0.0.2.tar.gz+# - location:+#    git: https://github.com/commercialhaskell/stack.git+#    commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a+# - location: https://github.com/commercialhaskell/stack/commit/e7b331f14bcffb8367cd58fbfc8b40ec7642100a+#   extra-dep: true+#  subdirs:+#  - auto-update+#  - wai+#+# A package marked 'extra-dep: true' will only be built if demanded by a+# non-dependency (i.e. a user package), and its test suites and benchmarks+# will not be run. This is useful for tweaking upstream packages.+#packages: []+packages:+- .+- https://hackage.haskell.org/package/exif-3000.0.0/exif-3000.0.0.tar.gz++# Dependency packages to be pulled from upstream that are not in the resolver+# (e.g., acme-missiles-0.3)+#extra-deps: []+extra-deps:+- exif-3000.0.0++# Override default flag values for local packages and extra-deps+flags: {}++# Extra package databases containing global packages+extra-package-dbs: []++# Control whether we use the GHC we find on the path+# system-ghc: true+#+# Require a specific version of stack, using version ranges+# require-stack-version: -any # Default+# require-stack-version: ">=1.2"+#+# Override the architecture used by stack, especially useful on Windows+# arch: i386+# arch: x86_64+#+# Extra directories used by stack for building+# extra-include-dirs: [/path/to/dir]+# extra-lib-dirs: [/path/to/dir]+#+# Allow a newer minor version of GHC than the snapshot specifies+# compiler-check: newer-minor
testsuite/Util.hs view
@@ -2,19 +2,20 @@ -- Author: Dino Morelli <dino@ui3.info>  module Util (-   binPath, resourcesPath,+   resourcesPath,    getProcessOutput, getBinaryOutput,    assertFalse )    where -import System.IO-import System.Process-import Test.HUnit+import Data.List ( intercalate )+import System.IO ( hGetContents )+import System.Process ( ProcessHandle, runInteractiveCommand )+import Test.HUnit ( Assertion, assertBool )  -binPath :: FilePath-binPath = "dist/build/photoname/photoname"+command :: String+command = "stack exec photoname"   resourcesPath :: FilePath@@ -24,17 +25,17 @@ {- Quick and dirty function to run a process and grab its output.    This evil thing doesn't watch STDERR at all or otherwise do anything    even remotely safe.-   XXX Move this somewhere logical like Photoname.Util -} getProcessOutput :: FilePath -> [String] -> IO (String, ProcessHandle) getProcessOutput path' args = do-   (_, outH, _, procH) <- runInteractiveProcess path' args Nothing Nothing+   (_, outH, _, procH) <- runInteractiveCommand+      $ path' ++ " -- " ++ (intercalate " " args)    output <- hGetContents outH    return (output, procH)   getBinaryOutput :: [String] -> IO (String, ProcessHandle)-getBinaryOutput = getProcessOutput binPath+getBinaryOutput = getProcessOutput command   assertFalse :: String -> Bool -> Assertion
+ util/install.hs view
@@ -0,0 +1,296 @@+#! /usr/bin/env stack+{- stack runghc -}++{-# LANGUAGE ScopedTypeVariables #-}++import Control.Exception+import Control.Monad+import Data.List+import Data.Version+import Distribution.Package+import Distribution.PackageDescription hiding ( error, options )+import Distribution.PackageDescription.Parse+import Distribution.Verbosity+import Distribution.Version+import System.Console.GetOpt+import System.Directory+import System.Environment+import System.Exit+import System.FilePath+import System.Process+import Text.Printf+import Text.Read+++defaultOptions :: Options+defaultOptions = Options+   { optClean = False+   , optDelete = False+   , optHelp = False+   , optPrefix = "/opt"+   , optRsrcCpVerbose = True+   , optInstType = FHS+   , optVersion = True+   }++data InstallType = Bundle | FHS+++main :: IO ()+main = do+   -- Parse args+   (opts, _) <- parseOpts =<< getArgs++   -- User asked for help+   when (optHelp opts) $ putStrLn usageText >> exitSuccess++   -- Locate cabal file+   cabalFiles <- (filter $ isSuffixOf ".cabal") <$> getDirectoryContents "."++   when (null cabalFiles) $ do+      die "Can't continue because no cabal files were found in ."++   -- Parse the cabal file and extract things we need from it+   -- then pass a pile of what we know to a function to create the+   -- installation dirs+   dirs <- constructDirs opts . package . packageDescription+      <$> readPackageDescription normal (head cabalFiles)+++   -- Perform the installation++   -- Remove existing install directory+   appDirExists <- doesDirectoryExist $ appDir dirs+   when (optDelete opts && appDirExists) $ do+      putStrLn $ "Removing existing directory " ++ (appDir dirs)+      removeDirectoryRecursive $ appDir dirs++   -- Clean before building+   when (optClean opts) $ system "stack clean" >> return ()++   -- Copy the binaries+   installExitCode <- system $ "stack install --local-bin-path=" ++ (binDir dirs)+   unless (ok installExitCode) $ die "Can't continue because stack install failed"++   -- Copy the license+   putStrLn "\nCopying LICENSE"+   createDirectoryIfMissing True $ docDir dirs+   copyFile "LICENSE" (docDir dirs </> "LICENSE")++   -- Copy the resources+   let rsrcDirSrc = "." </> "resources"+   rsrcsExist <- doesDirectoryExist rsrcDirSrc+   when rsrcsExist $ do+      putStrLn $ "\nCopying resources"+      copyTree (optRsrcCpVerbose opts) rsrcDirSrc (rsrcDir dirs)+      return ()++   exitSuccess+++data Dirs = Dirs+   { appDir :: FilePath+   , binDir :: FilePath+   , docDir :: FilePath+   , rsrcDir :: FilePath+   }+++constructDirs :: Options -> PackageId -> Dirs+constructDirs opts pkgId =+   Dirs appDir binDir' (appDir </> "doc") (appDir </> "resources")++   where+      project = unPackageName . pkgName $ pkgId+      version = showVersion . pkgVersion $ pkgId+      versionPart = if optVersion opts then "-" ++ version else ""+      appDir = case (optInstType opts) of+         Bundle -> optPrefix opts </> (project ++ versionPart)+         FHS    -> optPrefix opts </> "share" </> (project ++ versionPart)+      binDir' = case (optInstType opts) of+         Bundle -> appDir </> "bin"+         FHS    -> optPrefix opts </> "bin"+++{- Turn an exit code (say, from system) into a Bool+-}+ok :: ExitCode -> Bool+ok ExitSuccess = True+ok _           = False+++{-+   Argument parsing code+-}++data Options = Options+   { optClean :: Bool+   , optDelete :: Bool+   , optHelp :: Bool+   , optPrefix :: FilePath+   , optRsrcCpVerbose :: Bool+   , optInstType :: InstallType+   , optVersion :: Bool+   }+++instance Read InstallType where+   readsPrec _ "bundle" = [(Bundle, "")]+   readsPrec _ "fhs"    = [(FHS, "")]+   readsPrec _ _        = []++instance Show InstallType where+   show Bundle = "bundle"+   show FHS = "fhs"+++readInstallType :: String -> InstallType+readInstallType s =+   case (readEither s) of+      Left _ -> error $ printf "Can't continue because %s is not a valid install type\n\n%s" s usageText+      Right t -> t+++options :: [OptDescr (Options -> Options)]+options =+   [ Option ['c'] ["clean"]+      (NoArg (\opts -> opts { optClean = True } ))+      ("Do 'stack clean' first." ++ (defaultText . optClean $ defaultOptions))+   , Option ['C'] ["no-clean"]+      (NoArg (\opts -> opts { optClean = False } ))+      ("Do not 'stack clean' first."+         ++ (defaultText . not . optClean $ defaultOptions))+   , Option ['d'] ["delete"]+      (NoArg (\opts -> opts { optDelete = True } ))+      ("Delete the app directory before copying files."+         ++ (defaultText . optDelete $ defaultOptions))+   , Option ['D'] ["no-delete"]+      (NoArg (\opts -> opts { optDelete = False } ))+      ("Do not delete the app directory before copying files."+         ++ (defaultText . not . optDelete $ defaultOptions))+   , Option ['h'] ["help"]+      (NoArg (\opts -> opts { optHelp = True } ))+      "This help information."+   , Option ['p'] ["prefix"]+      (ReqArg (\s opts -> opts { optPrefix = s } ) "PREFIX" )+      (printf "Install prefix directory. Defaults to %s so what you'll end up with is %s/PROJECT-VERSION"+         (optPrefix defaultOptions) (optPrefix defaultOptions))+   , Option ['r'] ["resource-copy-verbose"]+      (NoArg (\opts -> opts { optRsrcCpVerbose = True } ))+      ("Be chatty when copying the resources directory."+         ++ (defaultText . optRsrcCpVerbose $ defaultOptions))+   , Option ['R'] ["no-resource-copy-verbose"]+      (NoArg (\opts -> opts { optRsrcCpVerbose = False } ))+      ("Don't be chatty when copying the resources directory. Useful when there are a LOT of resources."+         ++ (defaultText . not . optRsrcCpVerbose $ defaultOptions))+   , Option ['t'] ["type"]+      (ReqArg (\s opts -> opts { optInstType = readInstallType s } ) "INST_TYPE" )+      (printf "Installation type, see INSTALLATION TYPE below for details. Default: %s"+         (show . optInstType $ defaultOptions))+   , Option ['v'] ["version"]+      (NoArg (\opts -> opts { optVersion = True } ))+      (printf "Include version in installation path, meaning: %s/PROJECT-VERSION %s"+         (optPrefix defaultOptions) (defaultText . optVersion $ defaultOptions))+   , Option ['V'] ["no-version"]+      (NoArg (\opts -> opts { optVersion = False } ))+      (printf "Do not include version in installation path, meaning: %s/PROJECT %s"+         (optPrefix defaultOptions) (defaultText . not . optVersion $ defaultOptions))+   ]+++defaultText :: Bool -> String+defaultText True  = " Default"+defaultText False = ""+++parseOpts :: [String] -> IO (Options, [String])+parseOpts args =+   case getOpt Permute options args of+      (o,n,[]  ) -> return (foldl (flip id) defaultOptions o, n)+      (_,_,errs) -> ioError $ userError (concat errs ++ usageText)+++usageText :: String+usageText = (usageInfo header options) ++ "\n" ++ footer+   where+      header = init $ unlines+         [ "Usage: install.hs [OPTIONS]"+         , ""+         , "options:"+         ]+      footer = init $ unlines+         [ "INSTALLATION TYPE"+         , ""+         , "This is the topology used when copying files, one of: bundle, fhs"+         , ""+         , "bundle is sort-of a self-contained structure like this:"+         , ""+         , "  $PREFIX/"+         , "    $PROJECT-$VERSION/    <-- this is the \"app directory\""+         , "      bin/..."+         , "      doc/LICENSE"+         , "      resources/..."+         , ""+         , "fhs is the more traditional UNIX structure like this:"+         , ""+         , "  $PREFIX/"+         , "    bin/..."+         , "    share/"+         , "      $PROJECT-$VERSION/  <-- this is the \"app directory\""+         , "        doc/LICENSE"+         , "        resources/..."+         , ""+         , "Be aware that when the --delete switch is used along with fhs type, the binaries WILL NOT be deleted, only the \"app directory\"."+         , ""+         , "COMPILING"+         , ""+         , "install.hs was intentionally left as a script, but if you would prefer to compile it, do this:"+         , ""+         , "  $ stack ghc -- -o util/install util/install.hs"+         , ""+         , ""+         , "This script is part of the hsinstall package by Dino Morelli <dino@ui3.info>"+         ]+++{-+   Recursive file copying code++   It was desireable to have a standalone recursive file copy in+   this script for maximum cross-platform compatibility and to+   avoid Haskell library dependencies.++   Many thanks to [abuzittin gillifirca](https://codereview.stackexchange.com/users/20251/abuzittin-gillifirca) for the StackOverflow post [Copying files in Haskell](https://codereview.stackexchange.com/questions/68908/copying-files-in-haskell) where the following code was lifted.+-}++copyTree :: Bool -> FilePath -> FilePath -> IO ()+copyTree chatty s t = do+    createDirectoryIfMissing True t+    subItems <- getSubitems s+    mapM_ (copyItem chatty s t) subItems+++getSubitems :: FilePath -> IO [(Bool, FilePath)]+getSubitems path = getSubitems' ""+  where+    getChildren path =  (\\ [".", ".."]) <$> getDirectoryContents path++    getSubitems' relPath = do+        let absPath = path </> relPath+        isDir <- doesDirectoryExist absPath+        children <- if isDir then getChildren absPath else return []+        let relChildren = [relPath </> p | p <- children]+        ((isDir, relPath) :) . concat <$> mapM getSubitems' relChildren+++copyItem :: Bool -> FilePath -> FilePath -> (Bool, FilePath) -> IO ()+copyItem chatty baseSourcePath baseTargetPath (isDir, relativePath) = do+    let sourcePath = baseSourcePath </> relativePath+    let targetPath = baseTargetPath </> relativePath++    when chatty $+       putStrLn $ "Copying " ++ sourcePath ++ " to " ++ targetPath++    if isDir+      then createDirectoryIfMissing False targetPath+      else copyFile sourcePath targetPath
+ util/prefs/boring view
@@ -0,0 +1,124 @@+# This file contains a list of extended regular expressions, one per+# line. A file path matching any of these expressions will be filtered+# out during `darcs add', or when the `--look-for-adds' flag is passed+# to `darcs whatsnew' and `record'. The entries in ~/.darcs/boring (if+# it exists) supplement those in this file.+# +# Blank lines, and lines beginning with an octothorpe (#) are ignored.+# See regex(7) for a description of extended regular expressions.++### compiler and interpreter intermediate files+# haskell (ghc) interfaces+\.hi$+\.hi-boot$+\.o-boot$+# object files+\.o$+\.o\.cmd$+# profiling haskell+\.p_hi$+\.p_o$+# haskell program coverage resp. profiling info+\.tix$+\.prof$+# fortran module files+\.mod$+# linux kernel+\.ko\.cmd$+\.mod\.c$+(^|/)\.tmp_versions($|/)+# *.ko files aren't boring by default because they might+# be Korean translations rather than kernel modules+# \.ko$+# python, emacs, java byte code+\.py[co]$+\.elc$+\.class$+# objects and libraries; lo and la are libtool things+\.(obj|a|exe|so|lo|la)$+# compiled zsh configuration files+\.zwc$+# Common LISP output files for CLISP and CMUCL+\.(fas|fasl|sparcf|x86f)$++### build and packaging systems+# cabal intermediates+\.installed-pkg-config+\.setup-config+# standard cabal build dir, might not be boring for everybody+# ^dist(/|$)+# autotools+(^|/)autom4te\.cache($|/)+(^|/)config\.(log|status)$+# microsoft web expression, visual studio metadata directories+\_vti_cnf$+\_vti_pvt$+# gentoo tools+\.revdep-rebuild.*+# generated dependencies+^\.depend$++### version control systems+# cvs+(^|/)CVS($|/)+\.cvsignore$+# cvs, emacs locks+^\.#+# rcs+(^|/)RCS($|/)+,v$+# subversion+(^|/)\.svn($|/)+# mercurial+(^|/)\.hg($|/)+# git+(^|/)\.git($|/)+# bzr+\.bzr$+# sccs+(^|/)SCCS($|/)+# darcs+(^|/)_darcs($|/)+(^|/)\.darcsrepo($|/)+^\.darcs-temp-mail$+-darcs-backup[[:digit:]]+$+# gnu arch+(^|/)(\+|,)+(^|/)vssver\.scc$+\.swp$+(^|/)MT($|/)+(^|/)\{arch\}($|/)+(^|/).arch-ids($|/)+# bitkeeper+(^|/)BitKeeper($|/)+(^|/)ChangeSet($|/)++### miscellaneous+# backup files+~$+\.bak$+\.BAK$+# patch originals and rejects+\.orig$+\.rej$+# X server+\..serverauth.*+# image spam+\#+(^|/)Thumbs\.db$+# vi, emacs tags+(^|/)(tags|TAGS)$+#(^|/)\.[^/]+# core dumps+(^|/|\.)core$+# partial broken files (KIO copy operations)+\.part$+# waf files, see http://code.google.com/p/waf/+(^|/)\.waf-[[:digit:].]+-[[:digit:]]+($|/)+(^|/)\.lock-wscript$+# mac os finder+(^|/)\.DS_Store$+# emacs saved sessions (desktops)+(^|.*/)\.emacs\.desktop(\.lock)?$++(^|/).stack-work($|/)
+ util/resources/test.conf view
@@ -0,0 +1,4 @@+move+old-style+parent-dir=~/mypics+suffix=_dwm