You are not logged in.
Hi all,
I'm working on a script which will bump the pkgver of a package
and reset pkgrel to 1. It also starts the build and reverts
back to the old version if the build failed. However, I can't
find out a way to remove the md5sums of the old source,
so that it can be replaced.
Here's the current code:
#!/bin/sh
PKGDIR="/home/sol/arch/pkgbuilds"
err() {
echo $1
exit 1
}
if [ -z $1 ]; then echo "usage: upgpkg package-name newver"; exit; fi
if [ ! -d "$PKGDIR/$1" ]; then err "upgpkg: package $1 not in $PKGDIR."; fi
if [ -z $2 ]; then err "upgpkg: no new version specified for $1."; fi
cd "$PKGDIR/$1"
. PKGBUILD
if [ $(vercmp $2 $pkgver) -gt 0 ]; then
sed -i "s/pkgver=.*$/pkgver=$2/g" PKGBUILD
sed -i "s/pkgrel=.*$/pkgrel=1/g" PKGBUILD
else
err "upgpkg: $1 - new version ($2) older than current $pkgver"
fi
makepkg -m
if [ $? -gt 0 ]; then
sed -i "s/pkgver=.*$/pkgver=$pkgver/g" PKGBUILD
sed -i "s/pkgrel=.*$/pkgrel=$pkgrel/g" PKGBUILD
err "upgpkg: $1 - build failed for $2, reverting to $pkgver"
fi
Offline
You should be able to use sed with an address range... If you can guarantee that the md5sum will always be the last part of the pkgbuild it becomes simpler. I'm not sure if this will always work, but:
sed -n '/md5sum/,/)/ p' PKGBUILD
md5sums=('ff115b184d090deae11afc67f56094eb'
'e93463bba9168624e7c8b9cf28bdc47b'
'adc46727c22d790454b2137a8f3d2c88'
'45050fc57c3cabf85debbfcbd4825b9e'
'3788d4d6900bfaad04e97b47d0ac1b70'
'e711a94744171b66ca41c8ad157fb4bd'
'79e306084c11059d6b15bccc44557af8'
'1e3b1c6efcca3d7ae64a85d12d769ffa'
'b60b17497f9679ff05f19c6674f543e9'
'0ec3dbb726830035d067c91e625dd5ed'
'1d7fdb5a445fd9e9b1816872909c17a7'
'3456bbd52daac40e771e7ab619e9378b')
So this should work...
sed -i '/^md5sums=(/,/)/ d' PKGBUILD
Also, once you get this working, would you mind if I include the script in my pkgtools package?
Last edited by Daenyth (2008-08-31 18:50:16)
[git] | [AURpkgs] | [arch-games]
Offline
Hi,
Thanks for the hint, though if the script has to be generally
applicable, it must be able to remove the md5sums array
from all PKGBUILDs (though for my PKGBUILDs it'll work).
I'll give it a try this weekend on my own PKGBUILD set, and
also on some others. Once the holes are ironed out, I think
this will go nicely with the other tools in your pkgtools package
Offline
I'm not sure, but Daenyth's suggestion may fail if the close ')' is on the same line as the 'md5sums=(' line.
I think you need to do something like this instead:
sed -r -e '/^\s*md5sums=/ { :a; /\)/d; n; ba; }'
In English: when you find a line starting with (optional whitespace) and md5sums=, then execute the following block:
{
label a
if the line contains a ), then delete this line and restart all processing on the next line (exiting this block)
otherwise read the next line (if this results in the earlier lines being printed, then use "N" instead, which will append the new lines to the buffer rather than overwriting the buffer)
and go to label a
}
The = after md5sums may need to be escaped, I'm not sure. I haven't debugged or tested this, but am just trying to convey the idea.
Last edited by Profjim (2008-09-03 11:16:00)
Offline
@Daenyth:
The sed line you posted is giving a problem
when md5sums is only one line (it deletes the next line as well).
@Profjim:
Using your sed script, the first line of the md5sums is remaining.
I'll look into this further over the weekend. Thanks for the hints!
Offline
I'm not experienced enough to know if his will work, but it would be easy to check before running sed; grep -E '\s*md5sums=(.*)'
If his works as expected though, it's smarter than my solution.
[git] | [AURpkgs] | [arch-games]
Offline
OK, it's as I expected, the 'n' command is flushing the buffer to output before reading the next line. (I'd expect that every line before the terminating ')' gets printed, not just the initial md5sum= line.) Just change the 'n;' to 'N;' and it should work.
echo -e 'alpha\nbeta\ngamma\ndelta\n\epsilon' | sed -r '/beta/{:a; /delta/d; N; ba;}'
gives me this output:
alpha
epsilon
Offline
neat stuff Profjim.
this seems to work
cat PKGBUILD | sed -r '/md5sums[ ]?\=/{:a; /\)/d; N; ba;}'
"Be conservative in what you send; be liberal in what you accept." -- Postel's Law
"tacos" -- Cactus' Law
"t̥͍͎̪̪͗a̴̻̩͈͚ͨc̠o̩̙͈ͫͅs͙͎̙͊ ͔͇̫̜t͎̳̀a̜̞̗ͩc̗͍͚o̲̯̿s̖̣̤̙͌ ̖̜̈ț̰̫͓ạ̪͖̳c̲͎͕̰̯̃̈o͉ͅs̪ͪ ̜̻̖̜͕" -- -̖͚̫̙̓-̺̠͇ͤ̃ ̜̪̜ͯZ͔̗̭̞ͪA̝͈̙͖̩L͉̠̺͓G̙̞̦͖O̳̗͍
Offline
Send me an email or talk to me on irc when you think this is ready for me to include
If you want, I can give you direct git access.
[git] | [AURpkgs] | [arch-games]
Offline
Does anybody know how I could replace the md5sums of a pkgbuild with makepkg -g instead of just removing them. I want to place them at the same location and not just adding them to the end.
If the md56sums are just one line the following works:
md5=$(makepkg -g | cat)
sed -r "s|md5sums=.*|${md5}|g" -i PKGBUILD
But I just don't get it working with several lines. Any ideas?
Offline
I don't know how to replace the md5sums in place... but the md5sums
can be deleted and then regenerated by makepkg -g (even for
md5sums spanning multiple lines).
Anyway, here goes the upgpkg code. I've modified a bit to work nicely
with pkgtools, but it can be easily changed to make it standalone if
the user wants.
#!/bin/bash
# upgpkg: Upgrades package versions in PKGBUILD and starts build.
# Author: Abhishek Dasgupta <abhidg@gmail.com>
# Thanks to cactus, profjim and daenyth for all the sed help!
# Requires: pkgtools.
# I place this script in the public domain.
MYVERSION=0.1
PROGNAME="upgpkg"
if [ -r /usr/share/pkgtools/functions ]; then
source /usr/share/pkgtools/functions
else
printf "$(gettext "upgpkg: Unable to source function file!\n")" >&2
exit 1
fi
die() {
local message="$1"
shift
printf "$message" "$@"
exit 1
}
if [ -r /etc/pkgtools/newpkg.conf ]; then
source /etc/pkgtools/newpkg.conf
fi
if [ -r "${HOME}/.pkgtools/newpkg.conf" ]; then
source "${HOME}/.pkgtools/newpkg.conf"
fi
if [ -z $BASEDIR ]; then die "$(gettext "upgpkg: unable to locate BASEDIR in configuration.")"; fi
if [ -z $1 ]; then printf "upgpkg %s\n" "$MYVERSION"; printf "$(gettext "usage: upgpkg package-name newver\n")"; exit; fi
if [ ! -d "$BASEDIR/$1" ]; then die "$(gettext "upgpkg: package %s not in %s.\n")" "$1" "$BASEDIR"; fi
if [ -z $2 ]; then die "$(gettext "upgpkg: no new version specified for %s\n")" "$1"; fi
# Main code follows
cd "$BASEDIR/$1"
sed -ri '/md5sums[ ]?\=/{:a; /\)/d; N; ba;}' PKGBUILD || die "upgpkg: could not bump pkgver of $1\n"
source PKGBUILD
if [ $(vercmp $2 $pkgver) -gt 0 ]; then
sed -i "s/pkgver=.*$/pkgver=$2/g" PKGBUILD
sed -i "s/pkgrel=.*$/pkgrel=1/g" PKGBUILD
makepkg -g >> PKGBUILD
else
die "$(gettext "upgpkg: %s - new version (%s) older or equal to current %s\n")" "$1" "$2" "$pkgver"
fi
makepkg -m
if [ $? -gt 0 ]; then
sed -i "s/pkgver=.*$/pkgver=$pkgver/g" PKGBUILD
sed -i "s/pkgrel=.*$/pkgrel=$pkgrel/g" PKGBUILD
die "$(gettext "upgpkg: %s - build failed for %s, reverting to %s\n")" "$1" "$2" "$pkgver"
fi
Offline
You could use grep to find the line number of the old md5sums and then used sed's insert function to add them in the same place. I think it's much more KISS to add it to the end.
Also, regarding pkgtools, I just want to make a few tweaks.. I think your gettext stuff isn't complete (no pot file, no domain specified), so I was thinking I'd gettextify all mine (luckily I designed my functions with i18n in mind), and I also wanted to have your script use my functions instead of the ones in there. It's on my todo list... don't know when I'll have the motivation and the time at the same moment.
EDIT: Just realized you are already using the functions.. haha. I think I'll add the gettext stuff there. (Domain, etc). I was wondering, why did you use a different die()?
Last edited by Daenyth (2008-09-21 12:48:47)
[git] | [AURpkgs] | [arch-games]
Offline
Ah, I think I misunderstood the line
warn "${warning:-Unknown error}" "$@"
Initially, I thought it would print "warning" before every error. It is
actually to print "-Unknown error" in case ${warning} is null, right?
In that case, my die() isn't required.
Offline
This one is nearly working: sed -e '1h;1!H;${;g;s/md5sums=[^\)]*)/md5sums/g;p;}' -e "s/md5sums/$(echo $(makepkg -g))/g" PKGBUILD
Offline
OK, I think sed is not the right tool for this:
makepkg -g | php -n -r 'file_put_contents("PKGBUILD", preg_replace("/md5sums=\([^\)]+\)/s", file_get_contents("php://stdin"), file_get_contents("PKGBUILD")));'
;-)
Offline
Initially, I thought it would print "warning" before every error. It is
actually to print "-Unknown error" in case ${warning} is null, right?
In that case, my die() isn't required.
Correct, it uses $warning if it has content, but if it does not, then it uses "Unknown error"
OK, I think sed is not the right tool for this:
makepkg -g | php -n -r 'file_put_contents("PKGBUILD", preg_replace("/md5sums=\([^\)]+\)/s", file_get_contents("php://stdin"), file_get_contents("PKGBUILD")));'
;-)
I strongly recommend against that. I want to keep the dependencies to a minimum if I include this, so please stick to coreutils if possible, and if not that, then python or perl. Awk should be able to do this, by the way.
[git] | [AURpkgs] | [arch-games]
Offline
Don't mind. It's just for my personal use. :-)
Offline
Awk should be able to do this, by the way.
Did someone order two pounds of ugly code?
{ rm PKGBUILD; awk '$0 ~ /^md5sums/ {i = 1; system("makepkg -g 2>/dev/null")}; !i {print}; $0 ~ /\)/ {i = 0}' > PKGBUILD; } < PKGBUILD
Last edited by foutrelis (2008-09-21 17:02:01)
Offline
Great one. I must say this is a little above of my awk knowledge. :-)
Offline