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
|
#!/usr/bin/ruby -w
# Parse log files and extract info about packages that failed to build
# because of dependancies problems.
#
# Usage:
# (in the directory containing all the logs:)
# agf.rb <aptgf|ld> <file with TODO lines>
def gcc_getlines(lines, file)
g = lines.grep(/\d: error: /)
ig = lines.index(g[0])
ih = ig - 1
while (ih > 0)
if lines[ih] =~ /^\s+from / or
lines[ih] =~ /^In file included from / or
lines[ih] =~ /: In (member )?function / or
lines[ih] =~ /: warning: / or
lines[ih] =~ /: In constructor / or
lines[ih] =~ /^\s*\^+\s*$/ or
lines[ih] =~ / is deprecated. Use/ or
lines[ih] =~ /: At global scope:/
ih -= 1
else
if lines[ih] !~ /^\s*(gcc|cc|g\+\+|c\+\+|nasm)/
# puts "FNML: #{lines[ih]}"
end
ih += 1
break
end
end
return lines[ih..ig]
end
def ld_getlines(lines, file)
g = lines.grep(/ld returned 1 exit status$/)
ig = lines.index(g[0])
ih = ig - 1
while (ih > 0)
if lines[ih] =~ /undefined reference to/ or
lines[ih] =~ / In function / or
lines[ih] =~ / final link failed:/ or
lines[ih] =~ /: first defined here/ or
lines[ih] =~ /: cannot find / or
lines[ih] =~ /: unknown architecture of input file/ or
lines[ih] =~ /: hidden symbol / or
lines[ih] =~ /: multiple definition of / or
lines[ih] =~ /: warning: .* is deprecated; use .* instead/ or
lines[ih] =~ / cannot be preloaded: ignored./
ih -= 1
else
if lines[ih] !~ /^(gcc|cc|g\+\+|ld|c\+\+)/
# puts "FNML: #{lines[ih]}"
end
ih = ih += 1
break
end
end
if ih == ig
puts "NO LINES FOUND #{file}"
exit 1
end
return lines[ih...ig]
end
def aptgf_getlines(lines, file)
if not (g = lines.grep(/^The following packages have unmet dependencies:$/)).empty?
bps = lines.index(g[0]) + 1
g = lines.grep(/^E: Broken packages$/)
agf = lines.index(g[0]) - 1
buglog = lines[bps..agf]
return buglog
elsif not (g = lines.grep(/^E: Couldn't find package /)).empty?
return g
elsif not (g = lines.grep(/^E: Package .* has no installation candidate$/)).empty?
return g
elsif not (g = lines.grep(/^Errors were encountered while processing:$/)).empty?
bps = lines.index(g[0])
g = lines.grep(/^apt-get failed.$/)
agf = lines.index(g[0]) - 1
buglog = lines[bps..agf]
return buglog
else
puts "NO LINES FOUND #{file}"
exit 1
end
end
type = ARGV[0]
todo = ' TODO'
#todo = '' # for debugging
regexp = {
'aptgf' => / APT_GET_FAILED.*#{todo}/,
'ld' => /LD_ERROR.*#{todo}/,
'gcc' => /GCC_ERROR.*#{todo}/
}
IO::read(ARGV[1]).split(/\n/).grep(regexp[type]).each do |l|
pkg, rest = l.split(' ')
lst = Dir::glob("#{pkg}_*")
if lst.length == 0
puts "No matching logfile."
exit 1
elsif lst.length > 1
lst2 = lst.join("\n ")
puts "Several matching logfiles:\n #{lst2}"
exit 1
else
file = lst[0]
end
flines = IO::read(file).split(/\n/)
case type
when 'aptgf' then
lines = aptgf_getlines(flines, file)
when 'ld' then
lines = ld_getlines(flines, file)
when 'gcc' then
lines = gcc_getlines(flines, file)
end
lines.each do |l2|
printf "%-20s %s\n" % [pkg, l2]
end
end
|