diff options
author | Michael Olbrich <m.olbrich@pengutronix.de> | 2019-10-06 19:26:17 +0200 |
---|---|---|
committer | Michael Olbrich <m.olbrich@pengutronix.de> | 2019-10-06 20:02:55 +0200 |
commit | ec29df1274f596712f375745526f9de27847aa36 (patch) | |
tree | 2531a9408014b7deb16bb2e216f04a06b376f8c8 /scripts/lib/ptxd_make_pkghash.awk | |
parent | 683521e253aa231e42d9f7ef93ec1251b3dd03c9 (diff) | |
download | ptxdist-ec29df1274f596712f375745526f9de27847aa36.tar.gz ptxdist-ec29df1274f596712f375745526f9de27847aa36.tar.xz |
ptxd_lib_dgen: speed up hash generation
To create the hash for patch files, ptxdist executes several processes for
each package with patches. With many packages with patches, this creates
quite a lot of startup overhead.
To avoid this, collect all patch directories first and handle them with an
extra awk script and one find call.
Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
Diffstat (limited to 'scripts/lib/ptxd_make_pkghash.awk')
-rwxr-xr-x | scripts/lib/ptxd_make_pkghash.awk | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/scripts/lib/ptxd_make_pkghash.awk b/scripts/lib/ptxd_make_pkghash.awk new file mode 100755 index 000000000..5f90923a9 --- /dev/null +++ b/scripts/lib/ptxd_make_pkghash.awk @@ -0,0 +1,68 @@ +#!/usr/bin/gawk -f +# +# Copyright (C) 2019 by Michael Olbrich <m.olbrich@pengutronix.de> +# +# For further information about the PTXdist project and license conditions +# see the README file. +# + +BEGIN { + PTXDIST_TEMPDIR = ENVIRON["PTXDIST_TEMPDIR"]; + dirs = "" +} + +$1 == "PATCHES:" { + pkg = $2 + patch_dir = $3 + pkgs[patch_dir] = pkgs[patch_dir] " " pkg + dirs = dirs " " patch_dir +} + +$1 == "CONFIG:" { + pkg = $2 + config = $3 + configs[pkg] = configs[pkg] " " config +} + +function dump_file(src, dst, tmp) { + if (!src) + return + + old_RS = RS + RS = "^$" + getline tmp < src + printf "%s", tmp >> dst + RS = old_RS + close(src) + close(dst) +} + +END { + for (pkg in configs) { + config = configs[pkg] + f1 = PTXDIST_TEMPDIR "/pkghash-" pkg + split(configs[pkg], cfgs) + asort(cfgs, cfgs) + for (config in cfgs) + dump_file(cfgs[config], f1) + } + command = "find " dirs " -type f ! -name '.*' -printf '%H %P\\n'" + while (command | getline) + files[$1] = files[$1] " " $2 + close(command) + for (dir in pkgs) { + split(pkgs[dir], list, " ") + split(files[dir], file_list, " ") + asort(file_list, file_list) + for (pkg in list) { + pkg = list[pkg] + f1 = PTXDIST_TEMPDIR "/pkghash-" pkg + f2 = PTXDIST_TEMPDIR "/pkghash-" pkg "_EXTRACT" + for (file in file_list) { + file = dir "/" file_list[file] + dump_file(file, f1) + dump_file(file, f2) + } + } + } +} |