This is an automated email from the ASF dual-hosted git repository.
shamrick pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git
The following commit(s) were added to refs/heads/master by this push:
new f8d72a94e8 Update Go version to 1.21.0 (#7705)
f8d72a94e8 is described below
commit f8d72a94e8f8201ef6ea2a5970fda180dbc8bb0f
Author: Zach Hoffman <[email protected]>
AuthorDate: Mon Aug 14 15:17:12 2023 -0600
Update Go version to 1.21.0 (#7705)
* Disable cgo entirely instead of specifying osusergo and netgo
* Remove musl libc hack
* Pull alpine digest if it is not found
* Update Go version to 1.21.0
---
.env | 2 +-
.github/actions/go-fmt/Dockerfile | 5 -----
.github/actions/go-test/Dockerfile | 5 -----
.github/actions/save-alpine-tar/entrypoint.sh | 1 +
.github/actions/todb-init/Dockerfile | 5 -----
.github/actions/tvdb-init/Dockerfile | 5 -----
GO_VERSION | 2 +-
cache-config/build/build_rpm.sh | 24 ++++++++++++------------
grove/build/build_rpm.sh | 4 ++--
grove/grovetccfg/build/build_rpm.sh | 4 ++--
tc-health-client/build/build_rpm.sh | 4 ++--
test/fakeOrigin/build/build_rpm.sh | 4 ++--
tools/golang/Dockerfile | 1 +
traffic_monitor/build/build_rpm.sh | 4 ++--
traffic_ops/build/build_rpm.sh | 10 +++++-----
traffic_stats/build/build_rpm.sh | 26 +++++++++++++-------------
16 files changed, 44 insertions(+), 62 deletions(-)
diff --git a/.env b/.env
index 07ad8c08aa..77eb847f1f 100644
--- a/.env
+++ b/.env
@@ -1,2 +1,2 @@
ATS_VERSION=9.1.2
-GO_VERSION=1.19.12
+GO_VERSION=1.21.0
diff --git a/.github/actions/go-fmt/Dockerfile
b/.github/actions/go-fmt/Dockerfile
index 144380a3f0..b2ae299d30 100644
--- a/.github/actions/go-fmt/Dockerfile
+++ b/.github/actions/go-fmt/Dockerfile
@@ -18,11 +18,6 @@
# alpine:3.13
FROM
alpine@sha256:08d6ca16c60fe7490c03d10dc339d9fd8ea67c6466dea8d558526b1330a85930
-RUN architecture=$(uname -m) && \
- mkdir lib64 && \
- # Use musl libc where the go binary expects glibc
- # Less-generalized: ln -s /lib/ld-musl-x86_64.so.1
/lib64/ld-linux-x86-64.so.2
- ln -s /lib/ld-musl-${architecture}.so.[0-9]
/lib64/ld-linux-${architecture//_/-}.so.2
ENV GOROOT=/usr/local/go \
CGO_ENABLED=0
diff --git a/.github/actions/go-test/Dockerfile
b/.github/actions/go-test/Dockerfile
index f19ba80a2c..a0ca4e93c5 100644
--- a/.github/actions/go-test/Dockerfile
+++ b/.github/actions/go-test/Dockerfile
@@ -18,11 +18,6 @@
# alpine:3.13
FROM
alpine@sha256:08d6ca16c60fe7490c03d10dc339d9fd8ea67c6466dea8d558526b1330a85930
-RUN architecture=$(uname -m) && \
- mkdir lib64 && \
- # Use musl libc where the go binary expects glibc
- # Less-generalized: ln -s /lib/ld-musl-x86_64.so.1
/lib64/ld-linux-x86-64.so.2
- ln -s /lib/ld-musl-${architecture}.so.[0-9]
/lib64/ld-linux-${architecture//_/-}.so.2
ENV GOROOT=/usr/local/go \
CGO_ENABLED=0
diff --git a/.github/actions/save-alpine-tar/entrypoint.sh
b/.github/actions/save-alpine-tar/entrypoint.sh
index e4160e29f2..fb8d4c7087 100755
--- a/.github/actions/save-alpine-tar/entrypoint.sh
+++ b/.github/actions/save-alpine-tar/entrypoint.sh
@@ -24,6 +24,7 @@ load() {
docker image load -i "$archive_filename"
else
echo "No tarred image found named ${archive_filename}"
+ docker pull "alpine@${alpine_digest}"
fi
}
diff --git a/.github/actions/todb-init/Dockerfile
b/.github/actions/todb-init/Dockerfile
index 8d6f3924ad..6677c0fafe 100644
--- a/.github/actions/todb-init/Dockerfile
+++ b/.github/actions/todb-init/Dockerfile
@@ -18,11 +18,6 @@
# alpine:3.13
FROM
alpine@sha256:08d6ca16c60fe7490c03d10dc339d9fd8ea67c6466dea8d558526b1330a85930
-RUN architecture=$(uname -m) && \
- mkdir lib64 && \
- # Use musl libc where the go binary expects glibc
- # Less-generalized: ln -s /lib/ld-musl-x86_64.so.1
/lib64/ld-linux-x86-64.so.2
- ln -s /lib/ld-musl-${architecture}.so.[0-9]
/lib64/ld-linux-${architecture//_/-}.so.2
ENV GOROOT=/usr/local/go \
CGO_ENABLED=0
diff --git a/.github/actions/tvdb-init/Dockerfile
b/.github/actions/tvdb-init/Dockerfile
index 8d6f3924ad..6677c0fafe 100644
--- a/.github/actions/tvdb-init/Dockerfile
+++ b/.github/actions/tvdb-init/Dockerfile
@@ -18,11 +18,6 @@
# alpine:3.13
FROM
alpine@sha256:08d6ca16c60fe7490c03d10dc339d9fd8ea67c6466dea8d558526b1330a85930
-RUN architecture=$(uname -m) && \
- mkdir lib64 && \
- # Use musl libc where the go binary expects glibc
- # Less-generalized: ln -s /lib/ld-musl-x86_64.so.1
/lib64/ld-linux-x86-64.so.2
- ln -s /lib/ld-musl-${architecture}.so.[0-9]
/lib64/ld-linux-${architecture//_/-}.so.2
ENV GOROOT=/usr/local/go \
CGO_ENABLED=0
diff --git a/GO_VERSION b/GO_VERSION
index e54f3135a7..3500250a4b 100644
--- a/GO_VERSION
+++ b/GO_VERSION
@@ -1 +1 @@
-1.19.12
+1.21.0
diff --git a/cache-config/build/build_rpm.sh b/cache-config/build/build_rpm.sh
index 3e80f1ed33..5aa82fb9a9 100755
--- a/cache-config/build/build_rpm.sh
+++ b/cache-config/build/build_rpm.sh
@@ -51,7 +51,7 @@ initBuildArea() {
gcflags=''
ldflags=''
- tags='osusergo netgo'
+ export CGO_ENABLED=0
{ set +o nounset;
if [ "$DEBUG_BUILD" = true ]; then
echo 'DEBUG_BUILD is enabled, building without optimization or
inlining...';
@@ -63,67 +63,67 @@ initBuildArea() {
(
cd t3c;
- go build -v -gcflags "$gcflags" -ldflags "${ldflags} -X
main.GitRevision=$(git rev-parse HEAD) -X main.BuildTimestamp=$(date
+'%Y-%M-%dT%H:%M:%s') -X main.Version=${TC_VERSION}" -tags "$tags";
+ go build -v -gcflags "$gcflags" -ldflags "${ldflags} -X
main.GitRevision=$(git rev-parse HEAD) -X main.BuildTimestamp=$(date
+'%Y-%M-%dT%H:%M:%s') -X main.Version=${TC_VERSION}";
buildManpage 't3c';
)
(
cd t3c-apply;
- go build -v -gcflags "$gcflags" -ldflags "${ldflags} -X
main.GitRevision=$(git rev-parse HEAD) -X main.BuildTimestamp=$(date
+'%Y-%M-%dT%H:%M:%s') -X main.Version=${TC_VERSION}" -tags "$tags";
+ go build -v -gcflags "$gcflags" -ldflags "${ldflags} -X
main.GitRevision=$(git rev-parse HEAD) -X main.BuildTimestamp=$(date
+'%Y-%M-%dT%H:%M:%s') -X main.Version=${TC_VERSION}";
buildManpage 't3c-apply';
)
(
cd t3c-generate;
- go build -v -gcflags "$gcflags" -ldflags "${ldflags} -X
main.GitRevision=$(git rev-parse HEAD) -X main.BuildTimestamp=$(date
+'%Y-%M-%dT%H:%M:%s') -X main.Version=${TC_VERSION}" -tags "$tags";
+ go build -v -gcflags "$gcflags" -ldflags "${ldflags} -X
main.GitRevision=$(git rev-parse HEAD) -X main.BuildTimestamp=$(date
+'%Y-%M-%dT%H:%M:%s') -X main.Version=${TC_VERSION}";
buildManpage 't3c-generate';
)
(
cd t3c-request;
- go build -v -gcflags "$gcflags" -ldflags "${ldflags} -X
main.GitRevision=$(git rev-parse HEAD) -X main.BuildTimestamp=$(date
+'%Y-%M-%dT%H:%M:%s') -X main.Version=${TC_VERSION}" -tags "$tags";
+ go build -v -gcflags "$gcflags" -ldflags "${ldflags} -X
main.GitRevision=$(git rev-parse HEAD) -X main.BuildTimestamp=$(date
+'%Y-%M-%dT%H:%M:%s') -X main.Version=${TC_VERSION}";
buildManpage 't3c-request';
)
(
cd t3c-update;
- go build -v -gcflags "$gcflags" -ldflags "${ldflags} -X
main.GitRevision=$(git rev-parse HEAD) -X main.BuildTimestamp=$(date
+'%Y-%M-%dT%H:%M:%s') -X main.Version=${TC_VERSION}" -tags "$tags";
+ go build -v -gcflags "$gcflags" -ldflags "${ldflags} -X
main.GitRevision=$(git rev-parse HEAD) -X main.BuildTimestamp=$(date
+'%Y-%M-%dT%H:%M:%s') -X main.Version=${TC_VERSION}";
buildManpage 't3c-update';
)
(
cd t3c-check;
- go build -v -gcflags "$gcflags" -ldflags "${ldflags} -X
main.GitRevision=$(git rev-parse HEAD) -X main.BuildTimestamp=$(date
+'%Y-%M-%dT%H:%M:%s') -X main.Version=${TC_VERSION}" -tags "$tags"
+ go build -v -gcflags "$gcflags" -ldflags "${ldflags} -X
main.GitRevision=$(git rev-parse HEAD) -X main.BuildTimestamp=$(date
+'%Y-%M-%dT%H:%M:%s') -X main.Version=${TC_VERSION}";
buildManpage 't3c-check';
)
(
cd t3c-check-refs;
- go build -v -gcflags "$gcflags" -ldflags "${ldflags} -X
main.GitRevision=$(git rev-parse HEAD) -X main.BuildTimestamp=$(date
+'%Y-%M-%dT%H:%M:%s') -X main.Version=${TC_VERSION}" -tags "$tags";
+ go build -v -gcflags "$gcflags" -ldflags "${ldflags} -X
main.GitRevision=$(git rev-parse HEAD) -X main.BuildTimestamp=$(date
+'%Y-%M-%dT%H:%M:%s') -X main.Version=${TC_VERSION}";
buildManpage 't3c-check-refs';
)
(
cd t3c-check-reload;
- go build -v -gcflags "$gcflags" -ldflags "${ldflags} -X
main.GitRevision=$(git rev-parse HEAD) -X main.BuildTimestamp=$(date
+'%Y-%M-%dT%H:%M:%s') -X main.Version=${TC_VERSION}" -tags "$tags"
+ go build -v -gcflags "$gcflags" -ldflags "${ldflags} -X
main.GitRevision=$(git rev-parse HEAD) -X main.BuildTimestamp=$(date
+'%Y-%M-%dT%H:%M:%s') -X main.Version=${TC_VERSION}";
buildManpage 't3c-check-reload';
)
(
cd t3c-diff;
- go build -v -gcflags "$gcflags" -ldflags "${ldflags} -X
main.GitRevision=$(git rev-parse HEAD) -X main.BuildTimestamp=$(date
+'%Y-%M-%dT%H:%M:%s') -X main.Version=${TC_VERSION}" -tags "$tags";
+ go build -v -gcflags "$gcflags" -ldflags "${ldflags} -X
main.GitRevision=$(git rev-parse HEAD) -X main.BuildTimestamp=$(date
+'%Y-%M-%dT%H:%M:%s') -X main.Version=${TC_VERSION}";
buildManpage 't3c-diff';
)
(
cd t3c-tail;
- go build -v -gcflags "$gcflags" -ldflags "${ldflags} -X
main.GitRevision=$(git rev-parse HEAD) -X main.BuildTimestamp=$(date
+'%Y-%M-%dT%H:%M:%s') -X main.Version=${TC_VERSION}" -tags "$tags";
+ go build -v -gcflags "$gcflags" -ldflags "${ldflags} -X
main.GitRevision=$(git rev-parse HEAD) -X main.BuildTimestamp=$(date
+'%Y-%M-%dT%H:%M:%s') -X main.Version=${TC_VERSION}";
buildManpage 't3c-tail';
)
(
cd t3c-preprocess;
- go build -v -gcflags "$gcflags" -ldflags "${ldflags} -X
main.GitRevision=$(git rev-parse HEAD) -X main.BuildTimestamp=$(date
+'%Y-%M-%dT%H:%M:%s') -X main.Version=${TC_VERSION}" -tags "$tags";
+ go build -v -gcflags "$gcflags" -ldflags "${ldflags} -X
main.GitRevision=$(git rev-parse HEAD) -X main.BuildTimestamp=$(date
+'%Y-%M-%dT%H:%M:%s') -X main.Version=${TC_VERSION}";
buildManpage 't3c-preprocess';
)
diff --git a/grove/build/build_rpm.sh b/grove/build/build_rpm.sh
index 1fe2df529d..3ae7b20850 100755
--- a/grove/build/build_rpm.sh
+++ b/grove/build/build_rpm.sh
@@ -77,9 +77,9 @@ initBuildArea() {
buildRpmGrove() {
# build
ldflags='-s -w'
- tags='osusergo netgo'
+ export CGO_ENABLED=0
go mod vendor -v || { echo "Failed to vendor go dependencies: $?" >&2;
return 1; }
- go build -v -ldflags "${ldflags} -X main.Version=$GROVE_VERSION" -tags
"$tags" || { echo "Failed to build grove: $?" >&2; return 1; }
+ go build -v -ldflags "${ldflags} -X main.Version=$GROVE_VERSION" || {
echo "Failed to build grove: $?" >&2; return 1; }
# tar
tar -cvzf "${RPMBUILD}/SOURCES/grove-${GROVE_VERSION}.tgz" grove
conf/grove.cfg build/grove.init build/grove.logrotate || { echo "Failed to
create archive for rpmbuild: $?" >&2; return 1; }
diff --git a/grove/grovetccfg/build/build_rpm.sh
b/grove/grovetccfg/build/build_rpm.sh
index 578543f469..225494ca96 100755
--- a/grove/grovetccfg/build/build_rpm.sh
+++ b/grove/grovetccfg/build/build_rpm.sh
@@ -78,9 +78,9 @@ initBuildArea() {
buildRpmGrove() {
# build
ldflags='-s -w'
- tags='osusergo netgo'
+ export CGO_ENABLED=0
go mod vendor -v || { echo "Failed to vendor go dependencies: $?" >&2;
return 1; }
- go build -v -ldflags "${ldflags} -X main.Version=$GROVE_VERSION" -tags
"$tags" || { echo "Failed to build $PACKAGE: $?" >&2; return 1; }
+ go build -v -ldflags "${ldflags} -X main.Version=$GROVE_VERSION" || {
echo "Failed to build $PACKAGE: $?" >&2; return 1; }
# tar
tar -cvzf "${RPMBUILD}/SOURCES/${PACKAGE}-${GROVE_VERSION}.tgz"
${PACKAGE}|| { echo "Failed to create archive for rpmbuild: $?" >&2; return 1; }
diff --git a/tc-health-client/build/build_rpm.sh
b/tc-health-client/build/build_rpm.sh
index 077cce7a1c..b4ffa287e1 100755
--- a/tc-health-client/build/build_rpm.sh
+++ b/tc-health-client/build/build_rpm.sh
@@ -51,7 +51,7 @@ initBuildArea() {
gcflags=''
ldflags=''
- tags='osusergo netgo'
+ export CGO_ENABLED=0
{ set +o nounset;
if [ "$DEBUG_BUILD" = true ]; then
echo 'DEBUG_BUILD is enabled, building without optimization or
inlining...';
@@ -62,7 +62,7 @@ initBuildArea() {
set -o nounset; }
(
- go build -v -gcflags "$gcflags" -ldflags "${ldflags} -X
main.BuildTimestamp=$(date +'%Y-%m-%dT%H:%M:%S') -X
main.Version=${TC_VERSION}-${BUILD_NUMBER}" -tags "$tags";
+ go build -v -gcflags "$gcflags" -ldflags "${ldflags} -X
main.BuildTimestamp=$(date +'%Y-%m-%dT%H:%M:%S') -X
main.Version=${TC_VERSION}-${BUILD_NUMBER}";
buildManpage 'tc-health-client';
)
diff --git a/test/fakeOrigin/build/build_rpm.sh
b/test/fakeOrigin/build/build_rpm.sh
index b6df50f118..461b8c078e 100755
--- a/test/fakeOrigin/build/build_rpm.sh
+++ b/test/fakeOrigin/build/build_rpm.sh
@@ -62,7 +62,7 @@ initBuildArea() {
# compile fakeOrigin
gcflags=''
ldflags="-X main.GitRevision=$(git rev-parse HEAD) -X
main.BuildTimestamp=$(date +'%Y-%M-%dT%H:%M:%s') -X main.Version=${TC_VERSION}"
- tags='osusergo netgo'
+ export CGO_ENABLED=0
{ set +o nounset;
if [ "$DEBUG_BUILD" = true ]; then
echo 'DEBUG_BUILD is enabled, building without optimization or
inlining...';
@@ -71,7 +71,7 @@ initBuildArea() {
ldflags="${ldflags} -s -w"; #strip binary
fi;
set -o nounset; }
- go build -v -gcflags "$gcflags" -ldflags "$ldflags" -tags "$tags" || \
+ go build -v -gcflags "$gcflags" -ldflags "$ldflags" || \
{ echo "Could not build fakeOrigin binary"; return 1; }
cp -av ./ "$fo_dest"/ || \
diff --git a/tools/golang/Dockerfile b/tools/golang/Dockerfile
index 617405a083..b40be5a00f 100644
--- a/tools/golang/Dockerfile
+++ b/tools/golang/Dockerfile
@@ -21,6 +21,7 @@ FROM alpine:3.13 AS base
COPY --from=get-go /usr/local/go /usr/local/go
ENV PATH=/usr/local/go/bin:${PATH} \
+ CGO_ENABLED=0 \
GOPATH=/go
RUN set -o errexit; \
diff --git a/traffic_monitor/build/build_rpm.sh
b/traffic_monitor/build/build_rpm.sh
index 6755d4221a..b6a0bd8d67 100755
--- a/traffic_monitor/build/build_rpm.sh
+++ b/traffic_monitor/build/build_rpm.sh
@@ -57,7 +57,7 @@ initBuildArea() {
# compile traffic_monitor
gcflags=''
ldflags="-X main.GitRevision=$(git rev-parse HEAD) -X
main.BuildTimestamp=$(date +'%Y-%M-%dT%H:%M:%s') -X main.Version=${TC_VERSION}"
- tags='osusergo netgo'
+ export CGO_ENABLED=0
{ set +o nounset;
if [ "$DEBUG_BUILD" = true ]; then
echo 'DEBUG_BUILD is enabled, building without optimization or
inlining...';
@@ -66,7 +66,7 @@ initBuildArea() {
ldflags="${ldflags} -s -w"; #strip binary
fi;
set -o nounset; }
- go build -v -gcflags "$gcflags" -ldflags "$ldflags" -tags "$tags" || \
+ go build -v -gcflags "$gcflags" -ldflags "$ldflags" || \
{ echo "Could not build traffic_monitor binary"; return 1; }
cp -av ./ "$tm_dest"/ || \
diff --git a/traffic_ops/build/build_rpm.sh b/traffic_ops/build/build_rpm.sh
index e035df2430..96043dedaf 100755
--- a/traffic_ops/build/build_rpm.sh
+++ b/traffic_ops/build/build_rpm.sh
@@ -57,7 +57,7 @@ initBuildArea() {
cd traffic_ops_golang
gcflags=''
ldflags=''
- tags='osusergo netgo'
+ export CGO_ENABLED=0
{ set +o nounset;
if [ "$DEBUG_BUILD" = true ]; then
echo 'DEBUG_BUILD is enabled, building without optimization or
inlining...';
@@ -66,18 +66,18 @@ initBuildArea() {
ldflags="${ldflags} -s -w"; # strip binary
fi;
set -o nounset; }
- go build -v -gcflags "$gcflags" -ldflags "${ldflags} -X
main.version=traffic_ops-${TC_VERSION}-${BUILD_NUMBER}.${RHEL_VERSION} -B
0x$(git rev-parse HEAD)" -tags "$tags" || \
+ go build -v -gcflags "$gcflags" -ldflags "${ldflags} -X
main.version=traffic_ops-${TC_VERSION}-${BUILD_NUMBER}.${RHEL_VERSION} -B
0x$(git rev-parse HEAD)" || \
{ echo "Could
not build traffic_ops_golang binary"; return 1; }
cd -
# compile db/admin
(cd app/db
- go build -v -o admin -gcflags "$gcflags" -ldflags "$ldflags" -tags
"$tags" || \
+ go build -v -o admin -gcflags "$gcflags" -ldflags "$ldflags" || \
{ echo "Could
not build db/admin binary"; return 1;})
# compile ToDnssecRefresh.go
(cd app/bin/checks/DnssecRefresh
- go build -v -o ToDnssecRefresh -gcflags "$gcflags" -ldflags "$ldflags"
-tags "$tags" || \
+ go build -v -o ToDnssecRefresh -gcflags "$gcflags" -ldflags "$ldflags"
|| \
{ echo "Could
not build ToDnssecRefresh binary"; return 1;})
# compile db/reencrypt
@@ -92,7 +92,7 @@ initBuildArea() {
# compile TO profile converter
(cd install/bin/convert_profile
- go build -v -gcflags "$gcflags" -ldflags "$ldflags" -tags="$tags" || \
+ go build -v -gcflags "$gcflags" -ldflags "$ldflags" || \
{ echo "Could
not build convert_profile binary"; return 1; })
rsync -av etc install "$dest"/ || \
diff --git a/traffic_stats/build/build_rpm.sh b/traffic_stats/build/build_rpm.sh
index bfd3e632ee..54f5d5c62f 100755
--- a/traffic_stats/build/build_rpm.sh
+++ b/traffic_stats/build/build_rpm.sh
@@ -57,25 +57,25 @@ initBuildArea() {
cd "$TS_DIR" || \
{ echo "Could not cd to $TS_DIR: $?"; return 1; }
- echo "PATH: $PATH"
- echo "GOPATH: $GOPATH"
- go version
- go env
- tags='osusergo netgo'
+ echo "PATH: $PATH"
+ echo "GOPATH: $GOPATH"
+ go version
+ go env
+ export CGO_ENABLED=0
- # get x/* packages (everything else should be
properly vendored)
- go mod vendor -v || \
- { echo "Could
not vendor go module dependencies"; return 1; }
+ # get x/* packages (everything else should be properly vendored)
+ go mod vendor -v || \
+ { echo "Could not vendor go module
dependencies"; return 1; }
- # compile traffic_stats
- go build -v -gcflags "$gcflags" -ldflags
"$ldflags" -tags "$tags" || \
- { echo "Could
not build traffic_stats binary"; return 1; }
+ # compile traffic_stats
+ go build -v -gcflags "$gcflags" -ldflags "$ldflags" || \
+ { echo "Could not build traffic_stats
binary"; return 1; }
# compile influx_db_tools
(cd influxdb_tools
- go build -v -gcflags "$gcflags" -ldflags "$ldflags" -tags="$tags"
sync/sync_ts_databases.go || \
+ go build -v -gcflags "$gcflags" -ldflags "$ldflags"
sync/sync_ts_databases.go || \
{ echo "Could
not build sync_ts_databases binary"; return 1; }
- go build -v -gcflags "$gcflags" -ldflags "$ldflags" -tags="$tags"
create/create_ts_databases.go || \
+ go build -v -gcflags "$gcflags" -ldflags "$ldflags"
create/create_ts_databases.go || \
{ echo "Could
not build create_ts_databases binary"; return 1; })
rsync -aLv ./ "$ts_dest"/ || \