Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/stackbuilders/atomic-write
Writes files atomically in Haskell while preserving permissions
https://github.com/stackbuilders/atomic-write
atomic-actions file-management hacktoberfest hacktoberfest-2023 haskell
Last synced: 15 days ago
JSON representation
Writes files atomically in Haskell while preserving permissions
- Host: GitHub
- URL: https://github.com/stackbuilders/atomic-write
- Owner: stackbuilders
- License: mit
- Created: 2015-02-06T16:30:11.000Z (almost 10 years ago)
- Default Branch: main
- Last Pushed: 2024-08-30T15:12:30.000Z (4 months ago)
- Last Synced: 2024-12-05T21:51:21.300Z (28 days ago)
- Topics: atomic-actions, file-management, hacktoberfest, hacktoberfest-2023, haskell
- Language: Haskell
- Homepage:
- Size: 1.17 MB
- Stars: 18
- Watchers: 27
- Forks: 1
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: docs/CONTRIBUTING.md
- License: LICENSE
- Code of conduct: docs/CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
[![Build](https://github.com/stackbuilders/atomic-write/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/stackbuilders/atomic-write/actions/workflows/build.yml)
[![Hackage version](https://img.shields.io/hackage/v/atomic-write.svg)](http://hackage.haskell.org/package/atomic-write)[![All Contributors](https://img.shields.io/badge/all_contributors-6-orange.svg?style=flat-square)](#contributors-)
# Atomic Write
Atomic Write assists with atomic modification of files using
Haskell. It is a wrapper for using the atomic mv(1) operation which
correctly sets permissions based on the original file, or on system
defaults if no file previously exists.## How it works
On most Unix systems, mv is an atomic operation. This makes it simple to write to a file atomically just by using the mv operation. However, this will destroy the permissions on the original file. This library does the following to preserve permissions while atomically writing to a file:If an original file exists, take those permissions and apply them to the temp file before mving the file into place.
If the original file does not exist, create a following with default permissions (based on the currently-active umask).
This way, when the file is mv'ed into place, the permissions will be the ones held by the original file.
This library is based on similar implementations found in common libraries in Ruby and Python:
- [Ruby on Rails includes a similar method called atomic_write](https://apidock.com/rails/File/atomic_write/class)
- [Chef includes atomic update functionality](https://github.com/chef/chef/blob/c4631816132fcfefaba3d123a1d0dfe8bc2866bb/lib/chef/file_content_management/deploy/mv_unix.rb#L23:L71)
- [There is a python library for atomically updating a file](https://github.com/sashka/atomicfile)
## Usage
To use `atomic-write`, import the module corresponding to the type you wish to write atomically, e.g., to write a (strict) ByteString atomically:
```import System.AtomicWrite.Writer.ByteString```
Then you can use the atomicWriteFile function that accepts a FilePath and a ByteString, e.g.:
```atomicWriteFile myFilePath myByteString```
See the
[Haddock documentation](http://hackage.haskell.org/package/atomic-write).## Contributors β¨
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
Justin S. Leitgeb
π»
William R. Arellano
π»
Alexander MejΓa
π»
Agustin Camino
π»
Juan Paucar
π»
Barbara Morantes
π‘
Add your contributions
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
## License
MIT, see [the LICENSE file](LICENSE).
## Contributing
Do you want to contribute to this project? Please take a look at our [contributing guideline](/docs/CONTRIBUTING.md) to know how you can help us build it.
---
[Check out our libraries](https://github.com/stackbuilders/) | [Join our team](https://www.stackbuilders.com/join-us/)