public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] repo/proj/guru:dev commit in: app-eselect/eselect-swift/, app-eselect/eselect-swift/files/
@ 2024-10-13  1:31 Itai Ferber
  0 siblings, 0 replies; only message in thread
From: Itai Ferber @ 2024-10-13  1:31 UTC (permalink / raw
  To: gentoo-commits

commit:     bb12be00bf32ee33d45c8c0071f3603f60309a2d
Author:     Itai Ferber <itai <AT> itaiferber <DOT> net>
AuthorDate: Sat Oct 12 17:30:59 2024 +0000
Commit:     Itai Ferber <itai <AT> itaiferber <DOT> net>
CommitDate: Sun Oct 13 01:31:24 2024 +0000
URL:        https://gitweb.gentoo.org/repo/proj/guru.git/commit/?id=bb12be00

app-eselect/eselect-swift: new package, add 1.0

Signed-off-by: Itai Ferber <itai <AT> itaiferber.net>

 app-eselect/eselect-swift/eselect-swift-1.0.ebuild |  24 ++
 app-eselect/eselect-swift/files/swift-1.0.eselect  | 274 +++++++++++++++++++++
 app-eselect/eselect-swift/metadata.xml             |   8 +
 3 files changed, 306 insertions(+)

diff --git a/app-eselect/eselect-swift/eselect-swift-1.0.ebuild b/app-eselect/eselect-swift/eselect-swift-1.0.ebuild
new file mode 100644
index 000000000..c6b499b5c
--- /dev/null
+++ b/app-eselect/eselect-swift/eselect-swift-1.0.ebuild
@@ -0,0 +1,24 @@
+# Copyright 1999-2024 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DESCRIPTION="Manages Swift symlinks"
+HOMEPAGE="https://wiki.gentoo.org/wiki/No_homepage"
+
+S="${WORKDIR}"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="~amd64"
+
+RDEPEND="app-admin/eselect"
+
+src_install() {
+	insinto /usr/share/eselect/modules
+	newins "${FILESDIR}/swift-${PV}.eselect" swift.eselect || die
+}
+
+pkg_postinst() {
+	eselect swift update
+}

diff --git a/app-eselect/eselect-swift/files/swift-1.0.eselect b/app-eselect/eselect-swift/files/swift-1.0.eselect
new file mode 100644
index 000000000..2679b553c
--- /dev/null
+++ b/app-eselect/eselect-swift/files/swift-1.0.eselect
@@ -0,0 +1,274 @@
+# -*-eselect-*-  vim: ft=eselect
+# Copyright 2005-2024 Gentoo Authors
+# Distributed under the terms of the GNU GPL version 2 or later
+
+DESCRIPTION="Manage the Swift symlink"
+MAINTAINER="itai@itaiferber.net"
+VERSION="1.0"
+
+inherit path-manipulation
+
+BIN_DIR="${EROOT%/}/usr/bin"
+
+### Utility Functions ###
+
+# @FUNCTION: get_index
+# @USAGE: <element> <elements>...
+# @DESCRIPTION:
+# Returns the index of an element in an array, or the empty string if the
+# element was not found.
+get_index() {
+	local element="$1"
+	shift
+	local i elements=( "$@" )
+	for i in "${!elements[@]}"; do
+		if [[ "${elements[i]}" = "${element}" ]]; then
+			echo "${i}"
+			return 0
+		fi
+	done
+	return 1
+}
+
+# @FUNCTION: sort_swift_targets
+# @USAGE: <target identifier>...
+# @DESCRIPTION:
+# Lexicographically sorts an array of Swift target identifiers.
+sort_swift_targets() {
+	# `sort` may not support '--version-sort', so fall back on error
+	local vsort="sort --version-sort"
+	${vsort} </dev/null &>/dev/null || vsort="sort"
+	
+	# Stolen from `app-eselect/eselect-luajit`: to handle potential `_beta`
+	# version suffixes, we:
+	# 1. Turn `swift-x.y.z` into `x.y.z 1 swift-x.y.z`
+	# 2. Turn `swift-x.y.z_beta...` into `x.y.z 0 swift-x.y.z_beta...`
+	# 3. Sort, which moves `_beta` versions before corresponding non-beta
+	#    versions
+	# 4. Remove leading trivia
+	printf "%s\n" "$@" \
+		| sed -e 's/^\(swift-\)\?\([[:digit:].]\+\)[-_]beta/\2 0 &/' \
+		      -e 't;s/^\(swift-\)\?\([[:digit:].]\+\)/\2 1 &/' \
+		| LC_ALL=C ${vsort} \
+		| sed 's/.* //'
+}
+
+# @FUNCTION: list_targets
+# @DESCRIPTION:
+# Returns a lexicographically-sorted list of Swift targets found in `BIN_DIR`.
+list_targets() {
+	local identifiers
+	mapfile -t identifiers < <(find "${BIN_DIR}" -maxdepth 1 -type l -iname 'swift-[[:digit:]]*' -exec basename '{}' ';')
+	sort_swift_targets "${identifiers[@]}"
+}
+
+# @FUNCTION: list_target_links
+# @USAGE: <target identifier>
+# @DESCRIPTION:
+# Given a Swift target identifier, lists all of the symlinks found in `BIN_DIR`
+# that correspond to that Swift target.
+list_target_links() {
+	local target="$1"
+	local version_number="${target#swift-}"
+	local swift_dir="$(dirname "$(canonicalise "${BIN_DIR}/${target}")")"
+
+	local files
+	mapfile -t files < <(find "${BIN_DIR}" -maxdepth 1 -type l -iname "*-${version_number}")
+	for f in "${files[@]}"; do
+		local d="$(dirname "$(canonicalise "${f}")")"
+		if [[ "${d}" == "${swift_dir}"* ]]; then
+			echo "${f}"
+		fi
+	done
+}
+
+# @FUNCTION: current_target_index
+# @USAGE: <target identifier>...
+# @DESCRIPTION:
+# Returns the index of the currently-set target from the given list of available
+# Swift targets. If `/usr/bin/swift` does not point to any of the given Swift
+# targets, returns an empty string.
+current_target_index() {
+	local t canonical_targets=()
+	for t in "$@"; do
+		canonical_targets+=("$(canonicalise "${BIN_DIR}/${t}")")
+	done
+
+	local canonical_swift_path="$(canonicalise "${BIN_DIR}/swift")"
+	get_index "${canonical_swift_path}" "${canonical_targets[@]}"
+}
+
+# @FUNCTION: current_target
+# @USAGE: <target identifier>...
+# @DESCRIPTION:
+# Returns the target identifier of the currently-set target from the given list
+# of available Swift targets. If `/usr/bin/swift` does not point to any of the
+# given Swift targets, returns an empty string.
+current_target() {
+	local targets=( "$@" )
+	local target="$(current_target_index "${targets[@]}")"
+	if is_number "${target}"; then
+		echo "${targets[target]}"
+	else
+		return 1
+	fi
+}
+
+# @FUNCTION: unset_target
+# @USAGE: <target identifier>
+# @DESCRIPTION:
+# Unsets any unversioned links in `BIN_DIR` if they point to the given Swift
+# target identifier.
+unset_target() {
+	local target="$1"
+	local version_number="${target#swift-}"
+
+	local links
+	mapfile -t links < <(list_target_links "${target}")
+
+	local link
+	for link in "${links[@]}"; do
+		local unversioned_link="${link%-"${version_number}"}"
+		if [[ "$(canonicalise "${link}")" = "$(canonicalise "${unversioned_link}")" ]]; then
+			rm "${unversioned_link}" || die -q "Couldn't remove symlink '${unversioned_link}'"
+		fi
+	done
+}
+
+# @FUNCTION: set_target
+# @USAGE: <target identifier> <target identifiers>...
+# @DESCRIPTION:
+# Unsets the current Swift target and sets unversioned symlinks in `BIN_DIR` for
+# the given Swift target identifier. Does nothing if the given target identifier
+# is the same as the current target identifier.
+set_target() {
+	local target="$1"
+	shift
+	local current_target="$(current_target "$@")"
+	if [[ "${target}" = "${current_target}" ]]; then
+		return
+	fi
+
+	unset_target "${current_target}"
+
+	local version_number="${target#swift-}"
+	local links
+	mapfile -t links < <(list_target_links "${target}")
+
+	local link
+	for link in "${links[@]}"; do
+		local unversioned_link="${link%-"${version_number}"}"
+		ln -fs "${link}" "${unversioned_link}" || die -q "Couldn't create symlink '${unversioned_link}'"
+	done
+}
+
+### List Action ###
+
+describe_list() {
+	echo "Lists available Swift versions"
+}
+
+do_list() {
+	local targets
+	mapfile -t targets < <(list_targets)
+	if [[ -n "${targets}" ]]; then
+		local current_target="$(current_target_index "${targets[@]}")"
+
+		if is_number "${current_target}"; then
+			targets[current_target]="$(highlight_marker "${targets[current_target]}")"
+		fi
+
+		write_list_start "Available Swift versions:"
+		write_numbered_list "${targets[@]}"
+	else
+		write_list_start "No available Swift versions"
+	fi
+}
+
+### Show Action ###
+
+describe_show() {
+	echo "Show the current Swift implementation"
+}
+
+do_show() {
+	local targets
+	mapfile -t targets < <(list_targets)
+
+	if [[ -n "${targets[@]}" ]]; then 
+		write_list_start "Current Swift implementation:"
+		local target="$(current_target "${targets[@]}")"
+		write_kv_list_entry "${target:-(unset)}"
+	else
+		write_list_start "No available Swift versions"
+	fi
+}
+
+### Set Action ###
+
+describe_set() {
+	echo "Set active Swift version"
+}
+
+describe_set_parameters() {
+	echo "<target>"
+}
+
+describe_set_options() {
+	echo "target : Target number or name (from 'list')"
+}
+
+do_set() {
+	[[ $# -eq 0 || -z "$1" ]] && die -q "No Swift version specified"
+	[[ $# -gt 1 ]] && die -q "'set' takes only one parameter"
+
+	local targets
+	mapfile -t targets < <(list_targets)
+
+	local target="$1"
+	if is_number "${target}"; then
+		[[ "$target" -gt 0 && "$1" -le "${#targets[@]}" ]] || die -q "'$1' is not a valid target"
+		target="${targets[target-1]}"
+	else
+		target_index="$(get_index "$1" "${targets[@]}")"
+		is_number "${target_index}" || die -q "'$1' is not a valid target"
+	fi
+
+	set_target "${target}" "${targets[@]}"
+}
+
+### Unset Action ###
+
+describe_unset() {
+	echo "Unsets any active Swift version"
+}
+
+do_unset() {
+	[[ $# -eq 0 ]] || die -q "'unset' does not take any parameters"
+	local targets
+	mapfile -t targets < <(list_targets)
+	local target="$(current_target "${targets[@]}")"
+	unset_target "${target}"
+}
+
+### Update Action ###
+
+describe_update() {
+	echo "Switch to the most recent Swift version"
+}
+
+do_update() {
+	[[ $# -eq 0 ]] || die -q "'update' does not take any parameters"
+	
+	local targets
+	mapfile -t targets < <(list_targets)
+	[[ "${#targets[@]}" -gt 0 ]] || die -q "No Swift versions found"
+
+	local target="$(current_target "${targets[@]}")"
+	if [[ -n "${target}" ]]; then
+		unset_target "${target}"
+	fi
+
+	local new_target="${targets[-1]}"
+	set_target "${new_target}" "${targets[@]}"
+}

diff --git a/app-eselect/eselect-swift/metadata.xml b/app-eselect/eselect-swift/metadata.xml
new file mode 100644
index 000000000..564cdd4a2
--- /dev/null
+++ b/app-eselect/eselect-swift/metadata.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+  <maintainer type="person">
+    <email>itai@itaiferber.net</email>
+    <name>Itai Ferber</name>
+  </maintainer>
+</pkgmetadata>


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2024-10-13  1:31 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-13  1:31 [gentoo-commits] repo/proj/guru:dev commit in: app-eselect/eselect-swift/, app-eselect/eselect-swift/files/ Itai Ferber

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox