MyNixOS website logo
Description

Failure-tolerant file and directory editing.

Plan B

License BSD3 Hackage Stackage Nightly Stackage LTS Build Status Coverage Status

This is a Haskell library helping perform failure-tolerant operations on files and directories.

Quick start

The library allows to create and/or edit files, directories, and containers. By “container” we mean archive-like object that can contain representation of a directory inside it. Consequently, we have six functions available:

  • withNewFile
  • withExstingFile
  • withNewDir
  • withExistingDir
  • withNewContainer
  • withExistingContainer

You specify name of an object to edit or create, options (more on them below), and an action that gets a Path argument with the same type as object you intend to edit (we use type-safe file paths from path package here to prevent a certain class of potential bugs). Then, having that path, you can perform all actions you want to and if at some point during this editing an exception is thrown, state of file system is rolled back—you get no corrupted files, half-way edited directories, everything is intact as if nothing happened at all. If, however, the action is executed successfully (i.e. no exceptions thrown), all your manipulations are reflected in the file system.

This is a lightweight solution that makes it harder to corrupt sensitive information. And since file system exists in the real world, all sorts of bad things can (and will) happen. You should always have plan B.

Temporary files and back-ups are handled and deleted automatically, however you can pass options to change default behaviors. Not all options can be used with every function, but wrong combinations won't type-check, so it's OK.

Collection of options is a monoid. mempty corresponds to the default behavior, while non-standard behavioral deviations can be mappended to it.

By default, when we want to create a new object and it already exists, we get an exception, two alternative options exist (only work when you create a new object):

  • overrideIfExist
  • useIfExist

There is no way to prevent exception when you want to edit object that does not exist, though.

All functions make use of temporary directories. You can control certain aspects of this business:

  • tempDir dir—tells the library to create temporary directories and files inside dir. By default system's standard temporary directory (e.g. /tmp/ on Unix-like systems) is used.

  • nameTemplate template—specifies template to use for generation of unique file and directory names. By default "plan-b" is used.

  • preserveCorpse—if you add this to options, in case of failure (exception), temporary directory is not automatically deleted and can be inspected. However, if operation succeeds, temporary directory is always deleted.

  • moveByRenaming—by default files and directories are moved by copying, this option enables moving by renaming. If you also specify tempDir that is on the same disk/partition as the final file you're generating, this may speed up things considerably.

That should be enough for a quick intro, for more information regarding concrete functions, consult Haddocks.

License

Copyright © 2016–2017 Mark Karpov

Distributed under BSD 3 clause license.

Metadata

Version

0.2.1

Platforms (75)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows