action.yml 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. name: Setup pinned root implementation
  2. description: 'Clone exactly one supported root implementation at a verified commit for Samsung'
  3. inputs:
  4. flavor:
  5. description: 'kernelsu, next, or resukisu'
  6. required: true
  7. commit:
  8. description: 'Full immutable commit SHA'
  9. required: true
  10. runs:
  11. using: composite
  12. steps:
  13. - name: Clone and integrate selected root
  14. shell: bash
  15. run: |
  16. set -euo pipefail
  17. flavor="${{ inputs.flavor }}"
  18. expected_commit="${{ inputs.commit }}"
  19. case "$flavor" in
  20. kernelsu)
  21. repo="https://github.com/tiann/KernelSU.git"
  22. directory="KernelSU"
  23. manager="KernelSU Manager"
  24. ;;
  25. next)
  26. repo="https://github.com/KernelSU-Next/KernelSU-Next.git"
  27. directory="KernelSU-Next"
  28. manager="KernelSU Next Manager"
  29. ;;
  30. resukisu)
  31. repo="https://github.com/ReSukiSU/ReSukiSU.git"
  32. directory="ReSukiSU"
  33. manager="ReSukiSU Manager"
  34. ;;
  35. *)
  36. echo "Unsupported root flavor: $flavor" >&2
  37. exit 2
  38. ;;
  39. esac
  40. if ! [[ "$expected_commit" =~ ^[0-9a-f]{40}$ ]]; then
  41. echo "Root commit must be a full 40-character SHA." >&2
  42. exit 2
  43. fi
  44. if [ -n "${COMMON:-}" ] && [ -d "$COMMON" ]; then
  45. KROOT="$COMMON"
  46. CLONE_BASE="$CONFIG"
  47. elif [ -n "${CONFIG:-}" ] && [ -d "$CONFIG" ]; then
  48. if [ -d "$CONFIG/kernel_platform/common" ]; then KROOT="$CONFIG/kernel_platform/common"
  49. elif [ -d "$CONFIG/common" ]; then KROOT="$CONFIG/common"
  50. elif [ -d "$CONFIG/kernel-6.6" ]; then KROOT="$CONFIG/kernel-6.6"
  51. elif [ -d "$CONFIG/kernel-6.1" ]; then KROOT="$CONFIG/kernel-6.1"
  52. elif [ -d "$CONFIG/kernel-5.10" ]; then KROOT="$CONFIG/kernel-5.10"
  53. elif [ -d "$CONFIG/kernel" ]; then KROOT="$CONFIG/kernel"
  54. else KROOT="$CONFIG"
  55. fi
  56. CLONE_BASE="$CONFIG"
  57. else
  58. echo "Cannot resolve kernel root (COMMON/CONFIG not set)." >&2
  59. exit 1
  60. fi
  61. echo "KROOT=$KROOT CLONE_BASE=$CLONE_BASE flavor=$flavor"
  62. for candidate in KernelSU KernelSU-Next ReSukiSU; do
  63. if [ "$candidate" != "$directory" ] && [ -e "$CLONE_BASE/$candidate" ]; then
  64. echo "Refusing mixed root implementations: found $candidate." >&2
  65. exit 1
  66. fi
  67. done
  68. drivers_dir="$KROOT/drivers"
  69. if [ ! -d "$drivers_dir" ]; then
  70. echo "Kernel drivers directory not found at $drivers_dir" >&2
  71. exit 1
  72. fi
  73. if [ -e "$drivers_dir/kernelsu" ] || [ -L "$drivers_dir/kernelsu" ]; then
  74. echo "Refusing to replace an existing kernelsu integration." >&2
  75. exit 1
  76. fi
  77. if [ -e "$CLONE_BASE/$directory" ]; then
  78. echo "Refusing to reuse an existing root checkout: $directory." >&2
  79. exit 1
  80. fi
  81. git clone --no-checkout "$repo" "$CLONE_BASE/$directory"
  82. git -C "$CLONE_BASE/$directory" fetch --depth=1 origin "$expected_commit"
  83. git -C "$CLONE_BASE/$directory" checkout --detach "$expected_commit"
  84. actual_commit="$(git -C "$CLONE_BASE/$directory" rev-parse HEAD)"
  85. if [ "$actual_commit" != "$expected_commit" ]; then
  86. echo "Root commit mismatch: expected $expected_commit, got $actual_commit." >&2
  87. exit 1
  88. fi
  89. if [ ! -f "$CLONE_BASE/$directory/kernel/Kconfig" ] || [ ! -f "$CLONE_BASE/$directory/kernel/Makefile" ]; then
  90. echo "Selected root checkout does not contain a kernel integration." >&2
  91. exit 1
  92. fi
  93. root_version="$(git -C "$CLONE_BASE/$directory" describe --tags --always --dirty)"
  94. relative_kernel="$(realpath --relative-to="$drivers_dir" "$CLONE_BASE/$directory/kernel" 2>/dev/null || echo "$CLONE_BASE/$directory/kernel")"
  95. ln -s "$relative_kernel" "$drivers_dir/kernelsu"
  96. grep -q 'obj-$(CONFIG_KSU) += kernelsu/' "$drivers_dir/Makefile" || printf '\nobj-$(CONFIG_KSU) += kernelsu/\n' >> "$drivers_dir/Makefile"
  97. grep -q 'source "drivers/kernelsu/Kconfig"' "$drivers_dir/Kconfig" || sed -i '/endmenu/i source "drivers/kernelsu/Kconfig"' "$drivers_dir/Kconfig"
  98. ln -sf "$CLONE_BASE/$directory" "$COMMON/KernelSU-Next" 2>/dev/null || true
  99. echo "ROOT_IMPLEMENTATION=$flavor" >> "$GITHUB_ENV"
  100. echo "ROOT_MANAGER=$manager" >> "$GITHUB_ENV"
  101. echo "ROOT_VERSION=$root_version" >> "$GITHUB_ENV"
  102. echo "ROOT_COMMIT=$actual_commit" >> "$GITHUB_ENV"
  103. echo "ROOT_DIR=$CLONE_BASE/$directory" >> "$GITHUB_ENV"
  104. - name: Enable root configuration
  105. shell: bash
  106. run: |
  107. "$COMMON/scripts/config" --file "$GKI_DEFCONFIG" --enable CONFIG_KSU