Add arncdu

This commit is contained in:
Austen Adler 2023-11-14 22:54:32 -05:00
parent 4c1cd186ad
commit 0d45390b40
6 changed files with 287 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/target

109
Cargo.lock generated Normal file
View File

@ -0,0 +1,109 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "arncdu"
version = "0.1.0"
[[package]]
name = "autocfg"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
name = "itoa"
version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
[[package]]
name = "ncdufmt"
version = "0.1.0"
dependencies = [
"num-traits",
"serde",
"serde_json",
]
[[package]]
name = "num-traits"
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c"
dependencies = [
"autocfg",
]
[[package]]
name = "proc-macro2"
version = "1.0.69"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
dependencies = [
"proc-macro2",
]
[[package]]
name = "ryu"
version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
[[package]]
name = "serde"
version = "1.0.192"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.192"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "serde_json"
version = "1.0.108"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b"
dependencies = [
"itoa",
"ryu",
"serde",
]
[[package]]
name = "syn"
version = "2.0.39"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "unicode-ident"
version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"

18
Cargo.toml Normal file
View File

@ -0,0 +1,18 @@
[package]
name = "arncdu"
version = "0.1.0"
edition = "2021"
[workspace]
members = [
".",
"./ncdufmt/",
]
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
# num-traits = "0.2.17"
# serde = { version = "1.0.192", features = ["derive"] }
# serde_json = "1.0.108"
# tar = "0.4.40"

11
ncdufmt/Cargo.toml Normal file
View File

@ -0,0 +1,11 @@
[package]
name = "ncdufmt"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
num-traits = "0.2.17"
serde = { version = "1.0.192", features = ["derive"] }
serde_json = "1.0.108"

145
ncdufmt/src/lib.rs Normal file
View File

@ -0,0 +1,145 @@
// use crate::async_temp_buf::AsyncTempBuf;
// use anyhow::Result;
use std::time::{Duration, SystemTime};
use std::ops::Not;
use num_traits::identities::Zero;
use num_traits::identities::One;
// use std::{os::unix::prelude::MetadataExt, path::Path};
use serde::{Deserialize, Serialize};
// use tokio::fs::metadata;
// This is based on https://dev.yorhel.nl/ncdu/jsonfmt
pub type DeviceId = u64;
#[derive(Serialize, Deserialize, Debug)]
pub struct Header {
pub majorver: u64,
pub minorver: u64,
pub header_metadata: HeaderMetadata,
}
impl Default for Header {
fn default() -> Self {
Self {
majorver: 1,
minorver: 2,
header_metadata: HeaderMetadata::default(),
}
}
}
#[derive(Serialize, Deserialize, Debug)]
pub struct HeaderMetadata {
pub progname: String,
pub progver: String,
pub timestamp: u64,
}
impl Default for HeaderMetadata {
fn default() -> Self {
Self {
progname: String::from("ncdu"),
progver: String::from("1.17"),
timestamp: SystemTime::now()
.duration_since(SystemTime::UNIX_EPOCH)
.as_ref()
.map(Duration::as_secs)
.unwrap_or(0_u64),
}
}
}
/// String. Set if this file or directory is to be excluded from calculation for some reason.
#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "lowercase")]
pub enum Excluded {
/// If the path matched an exclude pattern.
Pattern,
/// If the item is on a different device/filesystem.
OtherFs,
/// If the item has been excluded with --exclude-kernfs (since ncdu 1.15).
KernFs,
/// If the item is a firmlink and hasnt been followed with --follow-firmlinks (since ncdu 1.15).
FrmLink,
}
#[derive(Serialize, Deserialize, Debug, Default)]
pub struct InfoBlock {
/// Basename
/// TODO: Max 32768 bytes
pub name: String,
/// Device ID. A unique ID within the context of the exported dump. Could be a serialization of lstat().st_dev, but could be randomly generated and used within this file
///
/// Accepted values are in the range of 0 <= dev < 2^64.
pub dev: DeviceId,
/// Apparent filesize
/// Reported by lstat().st_size. If absent, 0 is assumed. Accepted values are in the range of 0 <= asize < 2^63
#[serde(skip_serializing_if = "Zero::is_zero")]
pub asize: u64,
/// Size of the file, as consumed on the disk.
/// This is obtained through lstat().st_blocks*S_BLKSIZE. If absent, 0 is assumed. Accepted values are in the range of 0 <= dsize < 2^63.
#[serde(skip_serializing_if = "Zero::is_zero")]
pub dsize: u64,
/// Hardlinks
/// true if this is a file with lstat().st_nlink > 1
#[serde(skip_serializing_if = "Not::not")]
pub hlnkc: bool,
/// Inode number as reported by lstat().st_ino. Together with the Device ID this uniquely identifies a file in this dump.
/// In the case of hard links, two objects may appear with the same (dev,ino) combination. As of ncdu 1.16, this field is only exported if st_nlink > 1. A value of 0 is assumed if this field is absent, which is fine as long as the hlnkc field is false and nlink is 1, otherwise everything with the same dev and empty ino values will be considered as a single hardlinked file. Accepted values are in the range of 0 <= ino < 2^64.
#[serde(skip_serializing_if = "Zero::is_zero")]
pub ino: u64,
/// Number of hardlinks to this inode. The value of lstat().st_nlink
/// Accepted values are in the range 1 <= nlink < 2^32. If absent, 1 is assumed.
#[serde(skip_serializing_if = "One::is_one")]
pub nlink: u64,
/// Something went wrong while reading this entry
/// For files, this indicates that the lstat() call failed. For directories, this means that an error occurred while obtaining the file listing, and some items may be missing
#[serde(skip_serializing_if = "Not::not")]
pub read_error: bool,
// TODO: Implement this one
/// String. Set if this file or directory is to be excluded from calculation for some reason. The following values are recognized:
/// "pattern"
/// If the path matched an exclude pattern.
/// "otherfs"
/// If the item is on a different device/filesystem.
/// "kernfs"
/// If the item has been excluded with --exclude-kernfs (since ncdu 1.15).
/// "frmlink"
/// If the item is a firmlink and hasnt been followed with --follow-firmlinks (since ncdu 1.15).
/// Excluded items may still be included in the export, but only by name. size, asize and other information may be absent. If this item was excluded by a pattern, ncdu will not do an lstat() on it, and may thus report this item as a file even if it is a directory.
#[serde(skip_serializing_if = "Option::is_none")]
pub excluded: Option<Excluded>,
/// This is true if neither S_ISREG() nor S_ISDIR() evaluates to true. I.e. this is a symlink, character device, block device, FIFO, socket, or whatever else your system may support.
#[serde(skip_serializing_if = "Not::not")]
pub notreg: bool,
/// Extended info if it was specified to generate
#[serde(skip_serializing_if = "Option::is_none", flatten)]
pub extended_info_block: Option<ExtendedInfoBlock>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct ExtendedInfoBlock {
/// Number, user ID who owns the file. Accepted values are in the range 0 <= uid < 2^31.
uid: u32,
/// Number, group ID who owns the file. Accepted values are in the range 0 <= uid < 2^31.
gid: u32,
/// Number, the raw file mode as returned by lstat(3). For Linux systems, see inode(7) for the interpretation of this field. Accepted range: 0 <= mode < 2^16.
mode: u16,
/// Number, last modification time as a UNIX timestamp. Accepted range: 0 <= mtime < 2^64. As of ncdu 1.16, this number may also include an (infinite precision) decimal part for fractional seconds, though the decimal part is (currently) discarded during import.
mtime: u64,
}

3
src/main.rs Normal file
View File

@ -0,0 +1,3 @@
fn main() {
println!("Hello, world!");
}