On Wednesday 26 September 2007, Donnie Berkholz wrote: > On 17:53 Wed 26 Sep , Doug Goldstein wrote: > > Mike Frysinger wrote: > > > Donnie Berkholz wrote: > > > also, ebuilds do change over time, so what line # may be correct one > > > day may not be relevant the next ... > > > > True. I will concede this point. I could attempt to argue this is why > > it's important to know the version and revision of the package you are > > emerging. But the counter point is evident, times when the ebuild is > > changed without a bump pose a problem. > > > > Which could bring up a point of would it be useful to see if we can > > print out the actual line that caused the die. Now, I don't know if this > > feasible or something the Portage devs want to do. But again, in the > > effort to streamline this might be something to consider. > > The backtrace code is in ebuild.sh:dump_trace(). If you can find a way > in bash to print the source line, that would be great. I took another > glance through the bash man page and didn't see much from that end. But > since we do have the source file and line number, we could just grab it > with some hack like: > > sed -ne "${lineno}p" ${filename} > > Anyone got something better?
how about this: + eerror "The specific snippet of code:" + # This scans the file that called die and prints out the logic that + # ended in the call to die. This really only handles lines that end + # with '|| die' and any preceding lines with line continuations (\). + # This tends to be the most common usage though, so let's do it. + # Due to the usage of appending to the hold space (even when empty), + # we always end up with the first line being a blank (thus the 2nd sed). + sed -n \ + -e "# When we get to the line that failed, append it to the + # hold space, move the hold space to the pattern space, + # then print out the pattern space and quit immediately + ${BASH_LINENO[0]}{H;g;p;q}" \ + -e '# If this line ends with a line continuation, append it + # to the hold space + /\\$/H' \ + -e '# If this line does not end with a line continuation, + # erase the line and set the hold buffer to it (thus + # erasing the hold buffer in the process) + /[^\]$/{s:^.*$::;h}' \ + ${BASH_SOURCE[1]} \ + | sed -e '1d' \ + | (OFS=${IFS} IFS=$'\n'; while read -r n ; do (IFS=${OFS}; eerror " ${n}") ; done) -mike
signature.asc
Description: This is a digitally signed message part.