#!/usr/bin/env lua -- script to compare the packages versions in 2 iso images -- usage: compare-apks maxlen = 0 function read_package_list(file) local a = {} local h -- h = io.popen("tar -O -zxf ".. file.." -- apks/INDEX.md5.gz | gunzip -c | awk '{ print $2}'") h = io.popen("isoinfo -R -f -i "..file.." | grep '.apk$' | sed 's:.*/::'") for line in h:lines() do p, v = string.match(line, "^(.+)-(%d.*).apk") a[p] = v if maxlen < #p + #v + 2 then maxlen = #p + #v + 2 end end h:close() return a end -- print all packages that exist in a1 but not in a2 function missing_packages(a1, a2) local ret = {} local p,v for p,v in pairs(a1) do if a2[p] == nil then table.insert(ret, p.."-"..v) end end table.sort(ret) return ret end function unexpand_tabs(s, tab) tab = tab or 8 local pat = string.rep(".", tab) s = string.gsub(s, pat, "%0\1") s = string.gsub(s, " +\1", "\t") s = string.gsub(s, "\1", "") return s end function upgraded_packages(a1, a2) local p,v, tmp local a = {} for p,v in pairs(a2) do if a1[p] and a1[p] ~= v then tmp = unexpand_tabs(string.format("%-"..tostring(maxlen).."s(%s)", p.."-"..v, a1[p])) table.insert(a, tmp) end end table.sort(a) return a end apks1 = read_package_list(arg[1]) apks2 = read_package_list(arg[2]) print("Removed packages:") for dummy,line in ipairs(missing_packages(apks1, apks2)) do print(line) end print("\n") print("New packages:") for dummy,line in ipairs(missing_packages(apks2, apks1)) do print(line) end print("\n") print("Upgraded/downgraded packages (from version):") for dummy,line in ipairs(upgraded_packages(apks1, apks2)) do print(line) end