photoname 3.1 → 3.2
raw patch · 12 files changed
+720/−18 lines, 12 filesdep ~base
Dependency ranges changed: base
Files
- LICENSE +1/−1
- README.md +41/−0
- TODO.md +8/−0
- changelog.md +79/−0
- doc/dev/notes +41/−0
- doc/hcar-photoname.tex +21/−0
- photoname.cabal +24/−8
- stack.yaml +71/−0
- testsuite/Util.hs +10/−9
- util/install.hs +296/−0
- util/prefs/boring +124/−0
- util/resources/test.conf +4/−0
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