summary refs log tree commit diff
path: root/pkgs/os-specific/linux/kernel/update.sh
blob: 560edced36eade84e167b00fa81363b4384f2e54 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#!/usr/bin/env bash
set -e

# Get the latest versions from kernel.org
LINUXSED='s/.*linux-\([0-9]\+\(.[0-9]\+\)*\).*/\1/p'
KDATA="$(curl -s https://www.kernel.org | sed -n -e '/Download complete/p')"
VERSIONS=($(sed -n -e $LINUXSED <<< "$KDATA" | sort -Vr))

# Remove mainline version if there is a stable update
# Note due to sorting these two will always exist at the bottom
if grep -q "^${VERSIONS[1]}" <<< "${VERSIONS[0]}"; then
  VERSIONS=(${VERSIONS[@]:0:1} ${VERSIONS[@]:2})
fi

# Inspect each file and see if it has the latest version
NIXPKGS="$(git rev-parse --show-toplevel)"
ls $NIXPKGS/pkgs/os-specific/linux/kernel | while read FILE; do
  KERNEL="$(sed -n -e $LINUXSED <<< "$FILE")"
  [ -z "$KERNEL" ] && continue

  # Find the matching new kernel version
  MATCHING=""
  for V in "${VERSIONS[@]}"; do
    if grep -q "^$KERNEL" <<< "$V"; then
      MATCHING="$V"
      break
    fi
  done
  if [ -z "$MATCHING" ]; then
    echo "Out-of-support $KERNEL"
    continue
  fi

  # Inspect the nix expression to check for changes
  DATA="$(<$NIXPKGS/pkgs/os-specific/linux/kernel/$FILE)"
  URL="$(sed -n -e 's/.*url = "\(.*\)";.*/\1/p' <<< "$DATA" | sed -e "s/\${version}/$MATCHING/g")"
  OLDVER=$(sed -n -e 's/.*version = "\(.*\)".*/\1/p' <<< "$DATA")
  if [ "$OLDVER" = "$V" ]; then
    echo "No updates for $KERNEL"
    continue
  fi

  # Download the new file for the hash
  if ! HASH="$(nix-prefetch-url $URL 2>/dev/null)"; then
    echo "Failed to get hash of $URL"
    continue
  fi
  sed -i -e "s/sha256 = \".*\"/sha256 = \"$HASH\"/g" $NIXPKGS/pkgs/os-specific/linux/kernel/$FILE

  # Rewrite the expression
  sed -i -e '/version = /d' $NIXPKGS/pkgs/os-specific/linux/kernel/$FILE
  sed -i -e "\#buildLinux (args // rec {#a \  version = \"$V\";" $NIXPKGS/pkgs/os-specific/linux/kernel/$FILE

  # Commit the changes
  git add -u $NIXPKGS/pkgs/os-specific/linux/kernel/$FILE
  git commit -m "linux: $OLDVER -> $V" >/dev/null 2>&1

  echo "Updated $OLDVER -> $V"
done

# Update linux-rt
COMMIT=1 $NIXPKGS/pkgs/os-specific/linux/kernel/update-rt.sh

# Update linux-libre
COMMIT=1 $NIXPKGS/pkgs/os-specific/linux/kernel/update-libre.sh

# Update linux-hardened
COMMIT=1 $NIXPKGS/pkgs/os-specific/linux/kernel/hardened/update.py