You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
3.4 KiB
90 lines
3.4 KiB
#!/bin/sh |
|
|
|
# Usage: prioritize [FILE] [OPTIONAL_DIRECTORY] |
|
file_path=$1 |
|
directory=$2 |
|
|
|
# Check if the target file exists |
|
if [ ! -f "$file_path" ]; then |
|
echo "Error: The file '$file_path' does not exist." |
|
exit 1 |
|
fi |
|
|
|
# Get the hash of the target file |
|
hashchant "$file_path" > /dev/null |
|
target_hash=$(read-magic "$file_path" hash 2>/dev/null) |
|
|
|
# Get the directory the file is in, if a target directory was not provided as the second optional argument |
|
if [ -z "$directory" ]; then |
|
directory=$(dirname "$file_path") |
|
fi |
|
|
|
# Get the file's priority, or default to 0 |
|
target_priority=$(read-magic "$file_path" priority 2>/dev/null || echo 0) |
|
|
|
# Retrieving the priority list from the directory's extended attributes |
|
priorities=$(read-magic "$directory" priorities 2>/dev/null) |
|
|
|
# If there are no priorities, we add the target file as the only priority |
|
if [ -z "$priorities" ] || [ "$priorities" = "Error: The attribute does not exist." ]; then |
|
enchant "$directory" priorities "$target_hash" > /dev/null |
|
enchant "$file_path" priority 1 > /dev/null |
|
echo "Prioritized '$(basename "$file_path")' as the only priority." |
|
exit 0 |
|
fi |
|
|
|
# Get the priority of the first item in the current list of priorities |
|
first_hash=$(echo "$priorities" | cut -d',' -f1) |
|
first_file=$(get-card "$first_hash") |
|
first_priority=$(read-magic "$first_file" priority 2>/dev/null || echo 0) |
|
|
|
# If the target file is already the first priority, we exit |
|
if [ "$target_hash" = "$first_hash" ]; then |
|
echo "'$(basename "$file_path")' is already the highest priority." |
|
exit 0 |
|
fi |
|
|
|
# Filter the target hash from the current priorities list, so it doesn't duplicate |
|
priorities=$(echo "$priorities" | tr ',' '\n' | sed "/^$target_hash\$/d" | tr '\n' ',' | sed 's/,$//') |
|
|
|
# If the target file's priority is already equal the first item's priority, reprioritize it with a higher priority |
|
if [ "$first_priority" -gt "0" ] && [ "$target_priority" = "$first_priority" ]; then |
|
rebuilt_priorities="$target_hash,$priorities" |
|
enchant "$file_path" priority $(($first_priority + 1)) > /dev/null |
|
enchant "$directory" priorities "$rebuilt_priorities" > /dev/null |
|
echo "Reprioritized '$(basename "$file_path")'." |
|
exit 0 |
|
fi |
|
|
|
# Loop through the comma-delimited string of hashes in a POSIX-compliant way |
|
rebuilt_priorities="" |
|
added=0 |
|
for hash in $(echo "$priorities" | tr ',' ' '); do |
|
file=$(get-card "$hash") |
|
current_priority=$(read-magic "$file" priority 2>/dev/null || echo 0) |
|
|
|
# If the target file's priority is already higher than the current hash's priority |
|
# or the current hash's priority is different from the first hash's priority |
|
# we insert the target file's hash at this point |
|
if [ ! $added ] && [ "$target_priority" -gt "$current_priority" ] || [ "$current_priority" != "$first_priority" ]; then |
|
rebuilt_priorities="$rebuilt_priorities$target_hash," |
|
added=1 |
|
fi |
|
rebuilt_priorities="$rebuilt_priorities$hash," |
|
done |
|
|
|
# If we reached the end of the loop without adding the target hash, add it now |
|
if [ "$added" -eq 0 ]; then |
|
rebuilt_priorities="$rebuilt_priorities$target_hash" |
|
fi |
|
|
|
# Trim trailing comma |
|
rebuilt_priorities=$(echo "$rebuilt_priorities" | sed 's/,$//') |
|
|
|
# Setting the priority value of the target file to the value of the first item's priority |
|
enchant "$file_path" priority "$first_priority" > /dev/null |
|
|
|
# Updating the directory's extended attributes with the new priorities list |
|
enchant "$directory" priorities "$rebuilt_priorities" > /dev/null |
|
|
|
echo "Prioritized '$(basename "$file_path")'." |