Skip to content
/ xch Public

Create a small CLI programm to swap file contests atomically

License

Notifications You must be signed in to change notification settings

WanzenBug/xch

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

35 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

xch

A Rust library and CLI program to exchange the content of paths. If possible, this try to change contents atomically.

Current release: 1.1.0

Note: Currently only supports atomic exchange on Windows or on Linux using nightly rust

CLI

The program xch can be used to eXCHange the content of two paths.

Install

cargo install xch

Usage

USAGE:
    xch [FLAGS] <PATH1> <PATH2>

FLAGS:
    -h, --help          Prints help information
    -n, --non-atomic    Use non atomic exchange if atomic is not available
    -V, --version       Prints version information

ARGS:
    <PATH1>    One path to exchange
    <PATH2>    The other path to exchange

After the program call, first/path will point to the previous content of second/path and vice versa. This not only works for files but also for directories or one file and a directory.

By default all changes are made atomically, you can never observe one change without the other (e.g. if first/path points to the old content of second/path, second/path also points to the old content of first/path). This only works on Windows and Linux.

On other platforms such as any BSD or MacOS, you always need to specify --non-atomic to get results.

platform atomic xch non-atomic xch
windows ✔️ ✔️
linux ✔️ ✔️
others ✔️

Crate

The functionality is also available as a crate. Add xch = "1.1.0" to your Cargo.toml. Then you need to import the crate to your code

use libxch;

Then you can start exchanging the content of files

if let Err(e) = libxch::xch("file1", "path/to/file2") {
    // Error handling here
}

This is is the equivalent of running xch in default mode, i.e. it only works on Windows and Linux. use libxch::xch_non_atomic("file1", "path/to/file2") to get a portable, but non-atomic exchange.

Documentation

License

Licensed under MIT license

Future

Here are some missing features that will hopefully be added in the future:

  • MacOS atomic exchange using the ExchangeData syscall.
  • Better error messages
  • More options.

Please feel free to open an issue if you have a specific request

About

Create a small CLI programm to swap file contests atomically

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published