rpm-build/scripts/percolate.in

78 lines
2.4 KiB
Plaintext
Raw Normal View History

#!/bin/bash -e
#
# percolate annotations from "wet" nodes through a "dry" graph of links.
# (A more formal description can be found below after the input
# parameters are introduced.)
#
# The remainder is:
# the links which have got no annotation (possibly, with cycles).
#
# The name is borrowed from morphology; cf, e.g., the illustration
# (of the structure of the English verb "withstand")
# at <http://www2.let.uu.nl/uil-ots/lexicon/zoek.pl?lemma=Feature+Percolation>:
#
# V V
# / \ [+abl]
# / \ / \
# P V P V
# with stand => with stand
# [+abl] [+abl]
#
# Copyright (C) 2016 Ivan Zakharyaschev <imz@altlinux.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# Some nodes with annotations.
# Two fields: node_id annotation
readonly WET="$1" # the file will be appended to.
# Some links (must be sorted on the 2nd field).
# Two fields: node_id node_id
readonly DRY_LINKS="$2" # the file will be re-written (with the "remainder").
# JFS env var is used as the field separator.
# What this script does (in other words).
#
# It appends (to WET) all the nodes that link to WET (transitively).
# It leaves as the remainder of DRY_LINKS the subgraph which has no
# links leading to WET.
export LC_ALL=C
. @RPMCONFIGDIR@/tmpdir.sh
join_and_remainder()
{
join ${JFS:+-t"$JFS"} -1 2 -2 1 -o 1.1,2.2 "$1" "$2"
join ${JFS:+-t"$JFS"} -v 1 -1 2 -2 1 -o 1.1,1.2 "$1" "$2" >&3
}
new="$tmpdir"/new
wet="$tmpdir"/wet
rem="$tmpdir"/rem
cat <"$WET" >"$new"
while [ -s "$new" ]; do
sort ${JFS:+-t"$JFS"} -k1 <"$new" >"$wet"
join_and_remainder "$DRY_LINKS" "$wet" >"$new" 3>"$rem"
[ -s "$new" ] || break
# append WET and update DRY_LINKS:
cat <"$new" >>"$WET"
cat <"$rem" >"$DRY_LINKS"
done