Repository navigation
Expand file tree
/
Copy pathamerge.sh
More file actions
executable file
·169 lines (142 loc) · 5.17 KB
/
Copy pathamerge.sh
File metadata and controls
executable file
·169 lines (142 loc) · 5.17 KB
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#!/bin/bash
# A (hopefully) comprehensive script to perform upgrades on a Gentoo system.
KJOBS=4
LAYMAN_PATH=/usr/bin/layman
REVDEP_PATH=/usr/bin/revdep-rebuild
GCC_AUTO=true
SECONDS=0
# Check if any package will be updated prior to world update.
function will_pkg_be_updated {
VER_INS="$(portageq best_version / "$1")"
VER_AVL="$(portageq best_visible / "$1")"
if [ "$VER_INS" == "$VER_AVL" ]; then
RESULT=false
else
RESULT=true
fi
}
# Print out a divider of width 60 with a label.
function printdiv {
printf "\033[1;31m\n-"
if [ -z "$1" ]; then
printf -- "-----------------------------------------------------------\n\033[0m"
return
else
SIZE=${#1}
REMAIN=$((57-$SIZE))
if [ $REMAIN -lt 0 ]; then
printf " PRINTDIV_ERR: String must be no greater than 56 characters. -\n\033[0m"
return
fi
printf " "
printf "%s " $1
while [ $REMAIN -gt 0 ]; do
printf "-"
let REMAIN=REMAIN-1
done
printf "\n\033[0m"
fi
}
function printerr {
printdiv ""
printf "%s " $1
printf "\n"
exit 128
}
printf "\033[1;34m\nStarting automerge on %s.\n\033[0m" "$(date)"
# Fetching the latest repos.
printdiv "Portage Sync"
emerge-webrsync
if (($? != 0)); then printerr "Caught error from emerge-webrsync during sync."; fi
if [ -e "$LAYMAN_PATH" ]; then
printdiv "Layman Sync"
layman -S
if (($? != 0)); then printerr "Caught error from layman during sync."; fi
else
printf "\n"
fi
# Check if gcc is going to be upgraded. If it is, check if the user wants to automatically handle this and act accordingly.
will_pkg_be_updated "sys-devel/gcc"
if [ "$RESULT" = true ]; then
if [ "$GCC_AUTO" = false ]; then
printdiv ""
printf "\033[1;34m\nGCC upgrade detected! Please perform this manually or change GCC_AUTO to true.\n\033[0m"
exit 128
fi
printdiv "GCC Upgrade: Emerge"
printf "\033[1;34m\nGCC upgrade detected! Performing auto-upgrade (set GCC_AUTO to false to disable this function).\n\n\033[0m"
emerge --oneshot sys-devel/gcc
if (($? != 0)); then printerr "Caught error from emerge during gcc upgrade."; fi
printdiv "GCC Upgrade: Config"
gcc-config 2
source /etc/profile
printdiv "GCC Upgrade: sys-devel/libtool"
emerge --oneshot --usepkg=n sys-devel/libtool
if (($? != 0)); then printerr "Caught error from emerge during libtool upgrade."; fi
printdiv "GCC Upgrade: Reverse Dependency Rebuild"
revdep-rebuild
if (($? != 0)); then printerr "Caught error from revdep-rebuild during gcc upgrade."; fi
fi
# Update portage first.
will_pkg_be_updated "sys-apps/portage"
if [ "$RESULT" = true ]; then
printdiv "Portage Upgrade"
emerge --tree --quiet-build sys-apps/portage
if (($? != 0)); then printerr "Caught error from emerge during portage upgrade."; fi
fi
# Update the kernel.
printdiv "Kernel Upgrade"
will_pkg_be_updated "sys-kernel/gentoo-sources"
if [ "$RESULT" = true ]; then
emerge sys-kernel/gentoo-sources
eselect kernel set 2
# Determining kernel versions.
CKERN=$(uname -r)
NKERN=$(eselect kernel show|grep "/usr/src/linux-" |sed -e 's/ \/usr\/src\/linux-//g')
printf "\033[1;34m\nUpdating the configuration for the new kernel.\n\033[0m"
cd /usr/src/linux
cp /usr/src/linux-${CKERN}/.config /usr/src/linux/.config
make olddefconfig
printf "\033[1;34m\nBuilding the new kernel.\n\033[0m"
cat /usr/src/linux/.config | grep --quiet MODULES=y
if (($? == 0)); then
# Make and install the kernel.
make -j${KJOBS} && make modules_install && make install
else
# Make and install the kernel (no modules).
make -j${KJOBS} && make install
fi
# Update extlinux config and store old kernel.
printf "\033[1;34m\nUpdating bootloader configuration.\n\033[0m"
cd /boot/
sed -i "s/$CKERN/$NKERN/g" /boot/extlinux/extlinux.conf
mkdir -p /boot/old_kernel/$CKERN/
mv *$CKERN /boot/old_kernel/$CKERN/
rm /boot/*.old
else
printf "\nNo new kernel, skipping auto-upgrade.\n"
fi
# If everything looks fine, continue with merging.
printdiv "Emerge World Update"
emerge --tree --deep --newuse --update --with-bdeps=y --quiet-build @world
if (($? != 0)); then printerr "Caught error from emerge during world update."; fi
# Rebuild any broken libraries.
printdiv "Reverse Dependency Rebuild"
if [ -e "$REVDEP_PATH" ]; then
revdep-rebuild
if (($? != 0)); then printerr "Caught error from revdep-rebuild during world update."; fi
else
printf "Please install 'gentoolkit' for reverse dependency rebuild support. This is recommended.\n"
fi
# Clean up the system.
printdiv "Emerge Dependency Clean"
emerge --depclean
if (($? != 0)); then printerr "Caught error from emerge during depclean."; fi
# Rebuild any packages still using older libraries.
printdiv "Emerge Preserved Rebuild"
emerge @preserved-rebuild
if (($? != 0)); then printerr "Caught error from emerge during preserved rebuild."; fi
printdiv ""
DURATION=$SECONDS
printf "\033[1;34m\nFinished automerge in %02dh %02dm %02ds.\n\n\033[0m" $(($DURATION / 3600)) $((($DURATION / 60) % 60)) $(($DURATION % 60))
exit 0