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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
#!/bin/sh
# Copyright 2025 Huawei Cloud Computing Technology Co., Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set -eu
readonly JUST_LOCK="${PWD}/bin/lock-tool-under-test"
readonly JUST="${PWD}/bin/tool-under-test"
readonly JUST_MR="${PWD}/bin/mr-tool-under-test"
readonly LBR="${TEST_TMPDIR}/local-build-root"
readonly LBR2="${TEST_TMPDIR}/local-build-root-2"
readonly LBR3="${TEST_TMPDIR}/local-build-root-3"
readonly LBR4="${TEST_TMPDIR}/local-build-root-4"
readonly OUT="${TEST_TMPDIR}/build-output"
readonly REPO_DIRS="${TEST_TMPDIR}/repos"
readonly WRKDIR="${PWD}/work"
# Git-tree generator and its own generator
mkdir -p bin
cat > bin/mock-vcs <<'EOF'
#!/bin/sh
if [ "$(cat ${CREDENTIAL_PATH:-/dev/null})" = "sEcReT" ]
then
mkdir -p data
echo "$1" > data/sources.txt
echo '{"":{"type":"install","dirs":[[["TREE",null,"."],"."]]}}' > data/TARGETS
else
echo 'not enough credentials available'
fi
EOF
chmod 755 bin/mock-vcs
cat > bin/mock-vcs-gen <<'EOF'
#!/bin/sh
echo '["mock-vcs", "checkout"]'
EOF
chmod 755 bin/mock-vcs-gen
export PATH="$(pwd)/bin:${PATH}"
mkdir -p etc
echo -n sEcReT > etc/pass
export CREDENTIAL_PATH="$(pwd)/etc/pass"
# Compute tree of our mock checkout
mkdir -p temp
( cd temp
mock-vcs "checkout" 2>&1
git init 2>&1
git config user.email "nobody@example.org" 2>&1
git config user.name "Nobody" 2>&1
git add . 2>&1
git commit -m "Sample output" 2>&1
)
readonly TREE_ID=$(cd temp && git log -n 1 --format="%T")
echo "Tree of checkout is ${TREE_ID}."
readonly SUBTREE_ID=$(cd temp && git rev-parse "${TREE_ID}":data)
echo "Tree of data is ${SUBTREE_ID}"
rm -rf temp
# Main repo
mkdir -p "${WRKDIR}"
cd "${WRKDIR}"
touch ROOT
cat > TARGETS <<'EOF'
{ "":
{ "type": "generic"
, "cmds": ["cat sources.txt > out.txt"]
, "outs": ["out.txt"]
, "deps": [["@", "foo", "", ""]]
}
}
EOF
cat > repos.in.json <<EOF
{ "repositories":
{ "":
{ "repository": {"type": "file", "path": "."}
, "bindings": {"foo": "foo"}
}
}
, "imports":
[ { "source": "git tree"
, "repos": [{"alias": "foo"}]
, "cmd": ["mock-vcs", "checkout"]
, "inherit env": ["PATH", "CREDENTIAL_PATH"]
, "subdir": "data"
, "as plain": true
}
]
}
EOF
echo
cat repos.in.json
echo
"${JUST_LOCK}" -C repos.in.json -o repos.json --local-build-root "${LBR}" 2>&1
cat repos.json
echo
# Check the expected Git tree identifier of the subdir in the configuration
grep -q "${SUBTREE_ID}" repos.json
# Check command generation
cat > repos.in.json <<EOF
{ "repositories":
{ "":
{ "repository": {"type": "file", "path": "."}
, "bindings": {"foo": "foo"}
}
}
, "imports":
[ { "source": "git tree"
, "repos": [{"alias": "foo"}]
, "cmd gen": ["mock-vcs-gen"]
, "inherit env": ["PATH", "CREDENTIAL_PATH"]
, "subdir": "data"
, "as plain": true
}
]
}
EOF
echo
cat repos.in.json
echo
"${JUST_LOCK}" -C repos.in.json -o repos-gen.json --local-build-root "${LBR2}" 2>&1
cat repos-gen.json
echo
# Check the same Git tree identifier of the subdir is in the configuration
grep -q "${SUBTREE_ID}" repos-gen.json
# Check successful build
"${JUST_MR}" --norc -L '["env", "PATH='"${PATH}"'"]' --just "${JUST}" \
--local-build-root "${LBR3}" install -o "${OUT}" 2>&1
echo
grep checkout "${OUT}/out.txt"
echo
# Verify the environment is needed
export CREDENTIAL_PATH=/dev/null
"${JUST_MR}" --norc -L '["env", "PATH='"${PATH}"'"]' \
--local-build-root "${LBR4}" setup 2>&1 && exit 1 || :
echo
echo "failed as expected"
echo
echo "OK"
|