mirror of
https://github.com/keylase/nvidia-patch.git
synced 2024-08-30 18:32:50 +00:00
88 lines
2.3 KiB
Bash
88 lines
2.3 KiB
Bash
|
#!/bin/bash
|
||
|
|
||
|
set -euo pipefail
|
||
|
|
||
|
print_usage() { printf '
|
||
|
SYNOPSIS
|
||
|
update_patch.sh -f PATCH_FILE [-v VERSION [-o OLD_VERSION] | -b PATCHSTR | -h]
|
||
|
|
||
|
DESCRIPTION
|
||
|
Update the patch for Nvidia NVENC or NVFBC drivers for a new version
|
||
|
|
||
|
-f PATCH_FILE The file (patch.sh/patch-fbc.sh) that should be updated
|
||
|
-v VERSION Driver version (by default copies latest existing patch)
|
||
|
-o OLD_VERSION Copy patch string from this older driver version
|
||
|
-b PATCHSTR Append PATCHSTR to the patch_list
|
||
|
-h Print help
|
||
|
'
|
||
|
}
|
||
|
|
||
|
opmode="copy"
|
||
|
|
||
|
while getopts 'hf:v:o:b:' flag; do
|
||
|
case "${flag}" in
|
||
|
f) patch_file="$OPTARG" ;;
|
||
|
v) new_version="$OPTARG" ;;
|
||
|
o) old_version="$OPTARG" ;;
|
||
|
b) opmode="new" ; patch_string="$OPTARG" ;;
|
||
|
h) opmode="help" ;;
|
||
|
*) echo "Incorrect option specified in command line" ; exit 2 ;;
|
||
|
esac
|
||
|
done
|
||
|
|
||
|
|
||
|
get_last_line() {
|
||
|
if [[ -v old_version ]]; then
|
||
|
# Find old patch line
|
||
|
last=$(grep -n "\s.*\[\"$old_version\"\]='.*/g\?'" $patch_file | tail -1)
|
||
|
else
|
||
|
# Find the latest patch line
|
||
|
last=$(grep -n "\s.*\[\".*\"\]='.*/g\?'" $patch_file | tail -1)
|
||
|
fi
|
||
|
echo $last
|
||
|
}
|
||
|
|
||
|
get_last_line_number() {
|
||
|
last=$1
|
||
|
|
||
|
# Find the line number to insert at
|
||
|
line=$(cut -d : -f 1 <<<"$last")
|
||
|
line=$((line + 1))
|
||
|
|
||
|
echo $line
|
||
|
}
|
||
|
|
||
|
copy_patch() {
|
||
|
last=$(get_last_line)
|
||
|
line=$(get_last_line_number $last)
|
||
|
|
||
|
# Use the same bytecode, and escape it
|
||
|
bytecode=$(cut -d = -f 2 <<<"$last")
|
||
|
bytecode=$(printf '%s\n' "$bytecode" | sed -e 's/[]\/$*.^[]/\\&/g');
|
||
|
|
||
|
# Insert bytecode
|
||
|
sed -i "${line} i \ \ \ \ [\"${new_version}\"]=${bytecode}" $patch_file
|
||
|
|
||
|
echo "Successfully inserted bytecode for $new_version"
|
||
|
}
|
||
|
|
||
|
apply_new_patch() {
|
||
|
line=$(get_last_line_number $(get_last_line))
|
||
|
|
||
|
# Escape the patch string
|
||
|
bytecode=$(printf '%s\n' "$patch_string" | sed -e 's/[]\/$*.^[]/\\&/g');
|
||
|
|
||
|
# Insert it at the end
|
||
|
sed -i "${line} i \ \ \ \ ${bytecode}" $patch_file
|
||
|
|
||
|
echo "Successfully inserted $patch_string"
|
||
|
}
|
||
|
|
||
|
case "${opmode}" in
|
||
|
help) print_usage ; exit 2 ;;
|
||
|
copy) copy_patch ;;
|
||
|
new) apply_new_patch ;;
|
||
|
*) echo "Incorrect combination of flags. Use option -h to get help."
|
||
|
exit 2 ;;
|
||
|
esac
|