Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- (find-es "lua" "apt-move.lua") -- (find-angg "LUA/inc.lua") dofile(getenv("HOME").."/LUA/inc.lua") -- «.read_and_split» (to "read_and_split") -- «.P_apply» (to "P_apply") -- «.foundlocaldeb» (to "foundlocaldeb") -- «.feeding_debs» (to "feeding_debs") -- «.debversions» (to "debversions") --##### --# --# Functions for reading deb lines from files and splitting them --# --##### -- «read_and_split» (to ".read_and_split") function for_each_line(fname, func) local file, line file = openfile(fname, "r") while 1 do line = read(file) if not line then closefile(file) return end func(line) end end -- (find-fline "~/tmp/lua-manual.txt" "%") function for_each_split_line(fname, splchar, func) for_each_line(fname, function (line) call(%func, split1(line, %splchar)) end) end function for_each_stemv_line(fname, func) for_each_line(fname, function (line) local stem, version = stem_and_version(line) %func(stem, version, line) end) end -- px(stem_and_version("/var/cache/apt/archives/gcc_1%3a2.95.2-12_i386.deb")) -- ==> "gcc" "2.95.2-12" -- function stem_and_version(s) local a = split1(s, "/") s = a[a.n] if strsub(s, -4) == ".deb" then s = strsub(s, 1, -5) end a = split1(s, "_") if strsub(a[2], 2, 4) == "%3a" then a[2] = strsub(a[2], 5) end return a[1], a[2] end stems = {} installed = {} --##### --# --# Functions to iterate over the debs in the array "installed" --# --##### -- A basic building block: "for_each_stem" -- (find-fline "~/tmp/lua-manual.txt" "for index, value in exp do block end") -- (find-fline "~/tmp/lua-manual.txt" "foreachi") function for_each_stem(f) local stem for i=1,getn(stems) do f(stems[i], installed[stems[i]]) end end --##### --# --# Best way to iterate to produce output: P_apply("cond", "fargs", f) --# --##### -- «P_apply» (to ".P_apply") -- (find-es "lua" "apt-move.lua_P_apply") -- Args: -- i - an entire installed[] structure, e.g. installed["gcc"] -- s - a stem, e.g. "gcc" -- v - a version, without epoch; e.g. "0.9.5d-2" -- p - a path (from a "find"); -- e.g. "/var/cache/apt/archives/arena_1%3a0.3.62-1.1_i386.deb" -- op - an official path taken from a "Packages" file, -- e.g. "dists/potato/main/binary-i386/admin/eql_1.2-1.deb" -- Conditions: -- RV - right version deb -- WV - wrong version deb -- ND - no deb -- OP - has an "official path" -- function i_to_rv(i) return i.methods[1] == "RIGHTVERSIONDEB"; end function i_to_wv(i) return i.methods[1] == "WRONGVERSIONDEB"; end function i_to_nd(i) return i.methods[1] == "NODEB"; end function i_to_has_op(i) return i.officialfname; end -- conditions = { ["RV"] = function (s, i) return i_to_rv(i); end, ["WV"] = function (s, i) return i_to_wv(i); end, ["ND"] = function (s, i) return i_to_nd(i); end, ["RV&OP"] = function (s, i) return i_to_rv(i) and i_to_has_op(i); end, ["RV&~OP"] = function (s, i) return i_to_rv(i) and not i_to_has_op(i); end, } fargsfunctions = { ["s,i"] = function (s, i) return s, i; end, ["s,p,op"] = function (s, i) return s, i.path, i.officialfname; end, ["s,p"] = function (s, i) return s, i.path; end, ["s,v"] = function (s, i) return s, i.version; end, ["s"] = function (s, i) return s; end, } -- function P_apply(condstr, fargsstr, f) condition = conditions[condstr] fargsfunction = fargsfunctions[fargsstr] if not condition then print("Bad condstr:", condstr) end if not fargsfunction then print("Bad fargsstr:", fargsstr) end for_each_stem( function (s, i) if %condition(s, i) then %f(%fargsfunction(s, i)) end end) end --##### --# --# Methods and method tables (for registering debs) --# --##### -- «foundlocaldeb» (to ".foundlocaldeb") -- Our method tables start with only _[1]="class name". NODEB = {"NODEB"} WRONGVERSIONDEB = {"WRONGVERSIONDEB"} RIGHTVERSIONDEB = {"RIGHTVERSIONDEB"} function NODEB.foundlocaldeb(i_stem, stem, version, path) tinsert(stems, stem) if i_stem.version == version then i_stem.methods = RIGHTVERSIONDEB i_stem.path = path else i_stem.methods = WRONGVERSIONDEB i_stem.badversions = {[version]=path} end end function WRONGVERSIONDEB.foundlocaldeb(i_stem, stem, version, path) if i_stem.version == version then i_stem.methods = RIGHTVERSIONDEB i_stem.path = path else -- keep only the last path to a certain bad-version deb i_stem.badversions[version] = path end end function RIGHTVERSIONDEB.foundlocaldeb(i_stem, stem, version, path) end --##### --# --# Functions to take deb names from various sources and feed them --# into the "installed" array in different ways --# --##### -- «feeding_debs» (to ".feeding_debs") -- Process the list of installed debs. -- (find-angg ".zshrc" "installeddebs") function Installed(fname) for_each_stemv_line(fname, function (stem, version, line) if not installed[stem] then installed[stem] = {methods=NODEB, version=version} tinsert(stems, stem) end end) end -- Process a list of debs obtained with "find". function Found(fname) for_each_stemv_line(fname, function (stem, version, path) i_stem = installed[stem] if i_stem then i_stem.methods.foundlocaldeb(i_stem, stem, version, path) end end) end -- Process a listing of deb paths extracted from a "Packages" file -- (find-angg ".zshrc" "pfilenames") function Pfilenames(fname) for_each_stemv_line(fname, function (stem, version, path) i_stem = installed[stem] if i_stem then -- only for installed packages -- keep only the first official path. i_stem.officialfname = i_stem.officialfname or path end end) end --##### --# --# Functions to compare versions of .debs --# 2001jun13 --# --##### -- «debversions» (to ".debversions") -- (find-es "dpkg" "dpkg:debversions") -- (defun find-pmt (str) (find-fline (ee-packfile "packaging.text.gz") str)) -- (find-pmt "5. Version numbering") -- (find-pmt "<debian-revision>\n") -- (find-pmt "compared lexically") -- (find-pmt "--compare-versions") -- (find-node "(lua)Patterns") -- The <upstream-version> may contain only alphanumerics and the -- characters `.' `+' `-' `:' (full stop, plus, hyphen, colon) and should -- start with a digit. If there is no <debian-revision> then hyphens are -- not allowed; if there is no <epoch> then colons are not allowed. -- (find-fline "/var/cache/apt/archives/") -- (find-luafile "README.rttpatch") debv_epoch_re = regex("^(([0-9]+)(:|%3a))?(.*)") debv_revision_re = regex("^([0-9][-A-Za-z0-9+.:]*)(-)([A-Za-z0-9+.]+)$") debv_revisionless_re = regex("^([0-9][A-Za-z0-9+.:]*)$") function parse_debversion(str) local p1, p2, a = match(str, debv_epoch_re) -- debv_epoch_re always succeeds local epoch, epochsep, rest = a[2], a[3], a[4] if not epoch then epoch, epochsep = 0, "" else epoch = tonumber(epoch) end p1, p2, a = match(rest, debv_revision_re) if p1 then local upversion, revisionsep, revision = a[1], a[2], a[3] return epoch, epochsep, upversion, revisionsep, revision end p1, p2, a = match(rest, debv_revisionless_re) if p1 then return epoch, epochsep, rest, "", "" end return nil, nil, nil, nil, nil, "Bad debversion: \""..str.."\"" -- not checking: "if there is no <epoch> then colons are not allowed." end function debv_compare_nondigits(str1, str2) if str1 == str2 then return "=" end local plus128 = function (c) return format("%c", strbyte(c)+128) end str1 = gsub(str1, "([^A-Za-z])", plus128) str2 = gsub(str2, "([^A-Za-z])", plus128) if str1 < str2 then return "older" else return "newer" end end function debv_compare_halfversions(str1, str2) while 1 do if str1 == str2 then return "=" end _, _, nondig1, dig1, str1 = strfind(str1, "^([^0-9]*)([0-9]*)(.*)$") _, _, nondig2, dig2, str2 = strfind(str2, "^([^0-9]*)([0-9]*)(.*)$") if not nondig1 == nondig2 then return nondig1 < nondig2 and "older" or "newer" end dig1 = tonumber(dig1) or 0 dig2 = tonumber(dig2) or 0 if not dig1 == dig2 then return nondig1 < nondig2 and "older" or "newer" end end end function debv_compare_versions(str1, str2) if str1 == str2 then return "=" end local epoch1, upversion1, debrevversion1, _ local epoch2, upversion2, debrevversion2, rslt epoch1, _, upversion1, _, debrevversion1 = parse_debversion(str1) epoch2, _, upversion2, _, debrevversion2 = parse_debversion(str2) if epoch1 ~= epoch2 then return epoch1 < epoch2 and "older" or "newer" end rslt = debv_compare_halfversions(upversion1, upversion2) if rslt ~= "=" then return rslt end return debv_compare_halfversions(debrevversion1, debrevversion2) end -- Installed(arg[1]) -- Pfilenames(arg[2]) -- Found(arg[3]) -- p(installed) -- (find-es "lua" "apt-move.lua") -- (find-es "lua" "apt-move.lua_prep") -- (find-es "lua" "apt-move.lua_P_apply") comment = [[ # (find-angg ".zshrc" "debbasename") #* # «apt-move.lua_prep» (to ".apt-move.lua_prep") # (find-angg ".zshrc" "installeddebs") installeddebs | sort \ > /tmp/idebs cat $SDEBIAN/dists/potato/main/binary-i386/Packages | pfilenames \ > /tmp/pdebs-main cat $SDEBIAN/dists/potato/contrib/binary-i386/Packages | pfilenames \ > /tmp/pdebs-contrib cat $SDEBIAN/dists/potato/non-free/binary-i386/Packages | pfilenames \ > /tmp/pdebs-non-free cat /tmp/pdebs-{main,contrib,non-free} > /tmp/pdebs find /hdd6/debian/ -name '*.deb' | sort > /tmp/fdebs-CB find $SDEBIAN/dists/potato -name '*.deb' | sort > /tmp/fdebs-S find /var/cache/apt/archives/ -name '*.deb' | sort > /tmp/fdebs-c cat /tmp/fdebs-{CB,S,c} > /tmp/fdebs # (find-fline "/tmp/") # (find-fline "/tmp/idebs") # (find-fline "/tmp/pdebs") # (find-fline "/tmp/fdebs") # (find-fline "$SDEBIAN/") # (find-fline "/var/state/apt/lists/") #* # «apt-move.lua_P_apply» (to ".apt-move.lua_P_apply") # (find-angg "LUA/apt-move.lua" "P_apply") # The preparation stage that produces the /tmp/?debs files is above. lua ~/LUA/apt-move.lua -e ' Installed ("/tmp/idebs") Pfilenames("/tmp/pdebs") Found ("/tmp/fdebs") P_apply("RV&OP", "s,p,op", function (s, p, op) write(format("mv -iv %s %s\n", p, op)) end) print() P_apply("RV&~OP", "s,p", function (s, p) write(format("# No official path: %s %s\n", s, p)) end) print() P_apply("WV", "s,v", function (s, v) write(format("# No deb of the right version: %s_%s\n", s, v)) end) print() P_apply("ND", "s,v", function (s, v) write(format("# No deb at all: %s_%s\n", s, v)) end) ' |& tee ~/o # (find-fline "~/o") # (progn (find-fline "~/o") (wrap 0)) #* cd ~/LUA/ a2ps -=p2iso apt-move.lua make -f ~/LATEX/Makefile /tmp/o.p01 gv /tmp/o.ps & #* ]] -- Local Variables: -- coding: no-conversion -- ee-anchor-format: "«%s»" -- ee-charset-indicator: "Ñ" -- End: