Message ID | 20210721221338.159114-2-apw@canonical.com |
---|---|
State | New |
Headers | show |
Series | LP:1928921 LRMv5 -- switch primary version handling to kernel-versions data set | expand |
On 22.07.21 00:13, Andy Whitcroft wrote: > Update our internal debian/dkms-versions files from the common > kernel-versions dataset. > > BugLink: https://bugs.launchpad.net/bugs/1928921 > Signed-off-by: Andy Whitcroft <apw@canonical.com> > --- I think I would prefer to find this repository not hidden and under the cranky namespace. As for the general code, I assume it is doing what you want. To read and understand all the code you created in weeks would take more time than you likely can wait. -Stefan > update-dkms-versions | 150 +++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 150 insertions(+) > create mode 100755 update-dkms-versions > > diff --git a/update-dkms-versions b/update-dkms-versions > new file mode 100755 > index 0000000..ea807a6 > --- /dev/null > +++ b/update-dkms-versions > @@ -0,0 +1,150 @@ > +#!/bin/bash > + > +remote_repo='' > +sru_cycle= > +while : > +do > + if [ "$1" = "--remote-repo" ]; then > + remote_repo="$2" > + shift 2 > + > + elif [ "$1" = "--sru-cycle" ]; then > + sru_cycle="$2" > + shift 2 > + > + else > + break > + fi > +done > +if [ "$#" -ne 0 ]; then > + { > + echo "Usage: $0 [<options>]" > + echo " --remote-repo <url>" > + echo " --sru-cycle <cycle>" > + } 1>&2 > + exit 1 > +fi > + > +default_sru_cycle() > +{ > + local tracking_bug > + local version > + > + # Pick out the cycle from the tracking bug file. > + if [ -f "$DEBIAN/tracking-bug" ]; then > + read tracking_bug sru_cycle X <"$DEBIAN/tracking-bug" > + fi > + > + if [ -z "$sru_cycle" ]; then > + echo "$0: sru-cycle not found via debian/tracking-bug; specify --sru-cycle" 1>&2 > + exit 1 > + fi > + > + sru_cycle=$(echo "$sru_cycle" | sed -e 's/-[0-9][0-9]*$//') > + > + #echo "default_sru_cycle: version<$version> sru_cycle<$sru_cycle>" > +} > + > +# Determine where our changelog is. > +DEBIAN=debian > +[ -f 'debian/debian.env' ] && . 'debian/debian.env' > + > +[ -z "$sru_cycle" ] && default_sru_cycle > +if [ -z "$remote_repo" ]; then > + case "$sru_cycle" in > + s[0-9][0-9][0-9][0-9].[0-9][0-9].[0-9][0-9]) > + remote_repo='security' ;; > + *) > + remote_repo='main' ;; > + esac > +fi > +case "$remote_repo" in > +security) > + remote_repo='ssh+git://git.launchpad.net/~canonical-kernel-security-team/canonical-kernel-private/+git/kernel-versions' > + remote_name='security' > + ;; > +main) > + remote_repo='git://git.launchpad.net/~canonical-kernel/+git/kernel-versions' > + remote_name='main' > + ;; > +*) > + remote_name='adhoc' > + ;; > +esac > + > +kv_repo="$HOME/.kernel-versions" > +git_base="$remote_name/$sru_cycle" > + > +# Now we know where our repo is and what it called update it. > +# We maintain "persistent" remotes for main and security, but assume > +# any manually supplied entries are transient. > +( > + [ ! -d "$kv_repo" ] && mkdir -p "$kv_repo" > + cd "$kv_repo" || exit 1 > + [ ! -f config ] && git init -q --bare --initial-branch master > + current_url=$(git config "remote.$remote_name.url") > + if [ -z "$current_url" ]; then > + git remote add "$remote_name" "$remote_repo" > + elif [ "$current_url" != "$remote_repo" ]; then > + git config "remote.$remote_name.url" "$remote_repo" > + fi > + git fetch -q -p "$remote_name" > +) || exit 1 > + > +cat_file() > +{ > + (cd "$kv_repo" && git cat-file "$@") || exit 1 > +} > + > +# Determine if we have this cycle. > +present=$(cat_file -t "$git_base" 2>/dev/null) > +if [ "$present" = "" ]; then > + echo "$sru_cycle: cycle not found in $remote_repo" 2>&1 > + exit 1 > +fi > + > +# Determine our series and mainline version from our own changelog. > +our_series=$(LC_ALL=C dpkg-parsechangelog -l"$DEBIAN/changelog" -SDistribution) > +if [ "$series" = "UNRELEASED" ]; then > + our_series=$(LC_ALL=C dpkg-parsechangelog -l"$DEBIAN/changelog" -c1 -SDistribution) > +fi > +our_mainline=$(LC_ALL=C dpkg-parsechangelog -l"$DEBIAN/changelog" -SVersion | sed -e 's/-.*//') > + > +# Update rules are complex. We update development series kernels to the > +# versions in development. For stable series we update versions against > +# the series in which our prime kernel was built. This is expressed > +# via the map/dkms-versions namespace. Attempt to map via our series > +# and then our mainline-version. > + > +# Attempt to map via our series, if that works assume we are development. > +versions_path=$(cat_file -p "$git_base:map/dkms-versions/$our_series" 2>/dev/null) > + > +# If we do not yet have a mapping re-map using our mainline version. > +if [ -z "$versions_path" ]; then > + versions_path=$(cat_file -p "$git_base:map/dkms-versions/$our_mainline") > +fi > + > +echo "git_base<$git_base> versions_path<$versions_path>" > +echo "II: grabbing dkms-versions from $sru_cycle $versions_path" > + > +cat_file -p "$git_base:$versions_path" >"debian/dkms-versions.new" > +rc="$?" > +if [ "$rc" -ne 0 ]; then > + echo "$0: unable to download an updated dkms-versions file" 1>&2 > + exit 1 > + > +elif [ "$rc" -eq 0 ]; then > + mv "debian/dkms-versions.new" "debian/dkms-versions" > + > +else > + rm -f "debian/dkms-versions.new" > +fi > + > +thing="debian/dkms-versions" > +if ! git diff --exit-code -- "$thing" >/dev/null; then > + git commit -m "UBUNTU: $thing -- update from kernel-versions ($git_base)" -s -- "$thing" > +else > + echo "$thing: no changes from kernel-versions" > +fi > + > +exit "$rc" >
On Thu, Jul 22, 2021 at 02:22:24PM +0200, Stefan Bader wrote: > On 22.07.21 00:13, Andy Whitcroft wrote: > > Update our internal debian/dkms-versions files from the common > > kernel-versions dataset. > > > > BugLink: https://bugs.launchpad.net/bugs/1928921 > > Signed-off-by: Andy Whitcroft <apw@canonical.com> > > --- > > I think I would prefer to find this repository not hidden and under the > cranky namespace. As for the general code, I assume it is doing what you > want. To read and understand all the code you created in weeks would take > more time than you likely can wait. This is actually not a cranky related item, though it used in cranking. We have tried hard to make the internal update-version not be cranky dependant. I would also point out (as it is not obvious) that the kernel-versions respository this builds to obtain the necessary commit contents is a bare repo and not in a consumable form; it is not intended to be seen. It is very literally a performance cache, and as such it should be in .cache. I will move it there. To consume the real repository you would checkout the master from launchpad in the normal way via a simple git clone. -apw
diff --git a/update-dkms-versions b/update-dkms-versions new file mode 100755 index 0000000..ea807a6 --- /dev/null +++ b/update-dkms-versions @@ -0,0 +1,150 @@ +#!/bin/bash + +remote_repo='' +sru_cycle= +while : +do + if [ "$1" = "--remote-repo" ]; then + remote_repo="$2" + shift 2 + + elif [ "$1" = "--sru-cycle" ]; then + sru_cycle="$2" + shift 2 + + else + break + fi +done +if [ "$#" -ne 0 ]; then + { + echo "Usage: $0 [<options>]" + echo " --remote-repo <url>" + echo " --sru-cycle <cycle>" + } 1>&2 + exit 1 +fi + +default_sru_cycle() +{ + local tracking_bug + local version + + # Pick out the cycle from the tracking bug file. + if [ -f "$DEBIAN/tracking-bug" ]; then + read tracking_bug sru_cycle X <"$DEBIAN/tracking-bug" + fi + + if [ -z "$sru_cycle" ]; then + echo "$0: sru-cycle not found via debian/tracking-bug; specify --sru-cycle" 1>&2 + exit 1 + fi + + sru_cycle=$(echo "$sru_cycle" | sed -e 's/-[0-9][0-9]*$//') + + #echo "default_sru_cycle: version<$version> sru_cycle<$sru_cycle>" +} + +# Determine where our changelog is. +DEBIAN=debian +[ -f 'debian/debian.env' ] && . 'debian/debian.env' + +[ -z "$sru_cycle" ] && default_sru_cycle +if [ -z "$remote_repo" ]; then + case "$sru_cycle" in + s[0-9][0-9][0-9][0-9].[0-9][0-9].[0-9][0-9]) + remote_repo='security' ;; + *) + remote_repo='main' ;; + esac +fi +case "$remote_repo" in +security) + remote_repo='ssh+git://git.launchpad.net/~canonical-kernel-security-team/canonical-kernel-private/+git/kernel-versions' + remote_name='security' + ;; +main) + remote_repo='git://git.launchpad.net/~canonical-kernel/+git/kernel-versions' + remote_name='main' + ;; +*) + remote_name='adhoc' + ;; +esac + +kv_repo="$HOME/.kernel-versions" +git_base="$remote_name/$sru_cycle" + +# Now we know where our repo is and what it called update it. +# We maintain "persistent" remotes for main and security, but assume +# any manually supplied entries are transient. +( + [ ! -d "$kv_repo" ] && mkdir -p "$kv_repo" + cd "$kv_repo" || exit 1 + [ ! -f config ] && git init -q --bare --initial-branch master + current_url=$(git config "remote.$remote_name.url") + if [ -z "$current_url" ]; then + git remote add "$remote_name" "$remote_repo" + elif [ "$current_url" != "$remote_repo" ]; then + git config "remote.$remote_name.url" "$remote_repo" + fi + git fetch -q -p "$remote_name" +) || exit 1 + +cat_file() +{ + (cd "$kv_repo" && git cat-file "$@") || exit 1 +} + +# Determine if we have this cycle. +present=$(cat_file -t "$git_base" 2>/dev/null) +if [ "$present" = "" ]; then + echo "$sru_cycle: cycle not found in $remote_repo" 2>&1 + exit 1 +fi + +# Determine our series and mainline version from our own changelog. +our_series=$(LC_ALL=C dpkg-parsechangelog -l"$DEBIAN/changelog" -SDistribution) +if [ "$series" = "UNRELEASED" ]; then + our_series=$(LC_ALL=C dpkg-parsechangelog -l"$DEBIAN/changelog" -c1 -SDistribution) +fi +our_mainline=$(LC_ALL=C dpkg-parsechangelog -l"$DEBIAN/changelog" -SVersion | sed -e 's/-.*//') + +# Update rules are complex. We update development series kernels to the +# versions in development. For stable series we update versions against +# the series in which our prime kernel was built. This is expressed +# via the map/dkms-versions namespace. Attempt to map via our series +# and then our mainline-version. + +# Attempt to map via our series, if that works assume we are development. +versions_path=$(cat_file -p "$git_base:map/dkms-versions/$our_series" 2>/dev/null) + +# If we do not yet have a mapping re-map using our mainline version. +if [ -z "$versions_path" ]; then + versions_path=$(cat_file -p "$git_base:map/dkms-versions/$our_mainline") +fi + +echo "git_base<$git_base> versions_path<$versions_path>" +echo "II: grabbing dkms-versions from $sru_cycle $versions_path" + +cat_file -p "$git_base:$versions_path" >"debian/dkms-versions.new" +rc="$?" +if [ "$rc" -ne 0 ]; then + echo "$0: unable to download an updated dkms-versions file" 1>&2 + exit 1 + +elif [ "$rc" -eq 0 ]; then + mv "debian/dkms-versions.new" "debian/dkms-versions" + +else + rm -f "debian/dkms-versions.new" +fi + +thing="debian/dkms-versions" +if ! git diff --exit-code -- "$thing" >/dev/null; then + git commit -m "UBUNTU: $thing -- update from kernel-versions ($git_base)" -s -- "$thing" +else + echo "$thing: no changes from kernel-versions" +fi + +exit "$rc"
Update our internal debian/dkms-versions files from the common kernel-versions dataset. BugLink: https://bugs.launchpad.net/bugs/1928921 Signed-off-by: Andy Whitcroft <apw@canonical.com> --- update-dkms-versions | 150 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100755 update-dkms-versions