aboutgitcodebugslistschat
path: root/test/lib/util
blob: dee6c8d92890fcc6b32d846a78866b63123fb2d6 (plain) (blame)
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
122
123
124
125
#!/bin/sh
#
# SPDX-License-Identifier: AGPL-3.0-or-later
#
# PASST - Plug A Simple Socket Transport
#  for qemu/UNIX domain socket mode
#
# PASTA - Pack A Subtle Tap Abstraction
#  for network namespace/tap device mode
#
# test/lib/util - Convenience functions
#
# Copyright (c) 2021 Red Hat GmbH
# Author: Stefano Brivio <sbrivio@redhat.com>

# list_has() - Check whether a tab-separated list contains a given token
# $1:	List
# $2:	Token
# Return: 0 if token was found or is empty, 1 otherwise
list_has() {
	[ -z "${2}" ] && return 0

	__ifs="${IFS}"
	IFS='	'
	for __t in ${1}; do
		[ "${__t}" = "${2}" ] && IFS="${__ifs}" && return 0
	done

	IFS="${__ifs}"
	return 1
}

# list_add() - Add token to tab-separated list, unless it's already present
# $1:	List
# $2:	Token
list_add() {
	list_has "${1}" "${2}" && return
	[ -n "${1}" ] && printf '%s\t%s\n' "${1}" "${2}" || printf '%s\n' "${2}"
}

# list_remove_pair() - Drop pair with given key if present
# $1:	List
# $2:	Key
list_remove_pair()
{
	__ifs="${IFS}"
	IFS='	'
	__skip_next=0
	for __t in ${1}; do
		[ ${__skip_next} -eq 1 ] && __skip_next=0 && continue
		[ "${__t}" = "${2}" ] && __skip_next=1 && continue
		printf '%s\t' "${__t}"
	done
	printf "\n"
	IFS="${__ifs}"
}

# list_add_pair() - Add token pair to list, replace if the first one is present
# $1:	List
# $2:	First token
# $3:	Second token
list_add_pair() {
	[ -z "${3}" ] && return


	if [ -n "${1}" ]; then
		__new_list="$(list_remove_pair "${1}" "${2}")"
		printf '%s\t%s\t%s' "${__new_list}" "${2}" "${3}"
	else
		printf '%s\t%s' "${2}" "${3}"
	fi
	printf "\n"
}

# list_has_all() - Check whether a list contains all given IFS-separated tokens
# $1:	List
# $2:	List of tokens
# Return: 0 if list of tokens was found or is empty, 1 otherwise
list_has_all() {
	[ -z "${2}" ] && return 0

	for __i in ${2}; do
		list_has "${1}" "${__i}" || return 1
	done
	return 0
}

# file_def() - List of tokens tab-separated line from file, starting with key
# $1:	Filename
# $2:	Token
file_def() {
	sed -n 's/^'"${2}"'\t\(.*\)/\1/p' "${1}" | tr ' ' '\t'
}

# subs_apply() - Apply substitutions using a list of token pairs
# $1:	List of substitutions
# $2:	String where substitutions have to be applied
subs_apply() {
	__ifs="${IFS}"
	IFS='	'
	__newarg="${2}"
	__s=
	for __t in ${1}; do
		[ -z "${__s}" ] && __s="${__t}" && continue

		__et="$(printf '%s\n' "$__t" | sed -e 's/[\/&]/\\&/g')"
		__es="$(printf '%s\n' "$__s" | sed -e 's/[]\/$*.^[]/\\&/g')"

		__newarg="$(printf '%s' "${__newarg}" | sed "s/${__es}/${__et}/g")"
		__s=
	done

	printf '%s' "${__newarg}"
	IFS="${__ifs}"
}

# get_info_cols() - Get number of columns for info pane
get_info_cols() {
	__log_pane_cols=
	__j=0
	for __i in $(tmux list-panes -t passt_test:1.0 -F "#{pane_width}"); do
		[ ${__j} -eq ${PANE_INFO} ] && STATUS_COLS=${__i} && break
		__j=$((__j + 1))
	done
}