diff --git a/drive.inc b/drive.inc index df4dab6..b8d6603 100644 --- a/drive.inc +++ b/drive.inc @@ -23,4 +23,69 @@ function rename_partition parted -s "$drive" -- name "$partition" '"'"$new_label"'"' } +function drive_list +{ + drives="$(lsblk -nd -o NAME,TYPE \ + /dev/nvme+([0-9])n+([0-9]) /dev/sd+([a-z]) | \ + grep ' disk' |cut -d\ -f1)" +} + +function partition_list +{ + local drive="$1" + partitions="$(parted -m "$drive" -- print| \ + awk --field-separator=":" \ + '{if (NR > 2) + print $1 + }')" +} + +function find_unused +{ + local drive="$1" + unused="$(parted -m "$drive" -- print|awk --field-separator=":" \ + '{if (NR > 2 && $1 >= 2 && $6 == "root unused") { + print $1 + }}')|head -1" +} + +function find_oldest +{ + local drive="$1" + oldest="$(parted -m "$drive" -- print|awk --field-separator=":" \ + 'BEGIN + {min="ZZZZ"} + {if (NR > 2 && $1 >= 2 && $1 <= 4 && + $6 < min && $6 != "root unused") { + min=$6; part=$1 + }} + END + {print part}')" +} + +function find_newest +{ + local drive="$1" + newest="$(parted -m "$drive" -- print|awk --field-separator=":" \ + 'BEGIN + {max=""} + {if (NR > 2 && $1 >= 2 && $1 <= 4 && + $6 > max && $6 != "root unused") { + max=$6; part=$1 + }} + END + {print part}')" +} + +function version_from_partnum +{ + local drive="$1" + local partnum="$2" + version="$(parted -m "$drive" -- print|awk --field-separator=":" \ + '{if (NR > 2 && $1 == "'"$partnum"') { + print $6 + }}')" + version="$(echo "$version"|cut -d\ -f2)" +} + # vim: set ft=sh: diff --git a/tests/data/rename.dat b/tests/data/rename.dat index 6badbe6..5cc68aa 100644 --- a/tests/data/rename.dat +++ b/tests/data/rename.dat @@ -1,7 +1,7 @@ BYT; T_E_M_P:17.2GB:file:512:512:gpt::; 1:1049kB:1074MB:1073MB::EFI system partition:boot, legacy_boot, esp; -2:1075MB:2147MB:1073MB::root renamed:; +2:1075MB:2147MB:1073MB::root 20210228:; 3:2149MB:3221MB:1073MB::root unused:; 4:3222MB:4295MB:1073MB::root unused:; 5:4296MB:17.2GB:12.9GB::Encrypted:; diff --git a/tests/drive.sh b/tests/drive.sh index fc57b75..377a86e 100755 --- a/tests/drive.sh +++ b/tests/drive.sh @@ -3,16 +3,46 @@ function test_partitioning() { local img + local test_version=20210228 + local min_version=20210101 + local max_version=20211231 + img=$(mktemp -u) dd if=/dev/zero of="$img" bs=1M seek=16384 count=0 2> /dev/null + setup_drive "$img" output=$(parted -ms "$img" -- print) sed -i "s|T_E_M_P|$img|g;" tests/data/parted.dat assertEquals "$(cat tests/data/parted.dat)" "$output" - rename_partition "$img" 2 "root renamed" + + rename_partition "$img" 2 "root $test_version" output=$(parted -ms "$img" -- print) sed -i "s|T_E_M_P|$img|g;" tests/data/rename.dat assertEquals "$(cat tests/data/rename.dat)" "$output" + + version_from_partnum "$img" 2 + assertEquals "$test_version" "$version" + + version_from_partnum "$img" 3 + assertEquals "$min_version" "$version" + + version_from_partnum "$img" 4 + assertEquals "$max_version" "$version" + + find_unused "$img" + assertContains " 3 4 " "$unused" + + rename_partition "$img" 3 "root $min_version" + find_oldest "$img" + assertEquals "$min_version" "$oldest" + + rename_partition "$img" 4 "root $max_version" + find_newest "$img" + assertEquals "$max_version" "$newest" + + partition-list "$img" + assertEquals "1 2 3 4 5" "$partitions" + rm -f "$img" }