Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(96)

Side by Side Diff: archive_build.sh

Issue 6240018: This starts to fix the scripts so that they load from /usr/lib/crosutils (Closed) Base URL: http://git.chromium.org/git/crosutils.git@master
Patch Set: fixing bad merge Created 9 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | archive_hwqual » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/bin/bash 1 #!/bin/bash
2 2
3 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. 3 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
4 # Use of this source code is governed by a BSD-style license that can be 4 # Use of this source code is governed by a BSD-style license that can be
5 # found in the LICENSE file. 5 # found in the LICENSE file.
6 6
7 # Script to archive build results. Used by the buildbots. 7 # Script to archive build results. Used by the buildbots.
8 8
9 # Load common constants. This should be the first executable line. 9 # --- BEGIN COMMON.SH BOILERPLATE ---
10 # The path to common.sh should be relative to your script's location. 10 # Load common CrOS utilities. Inside the chroot this file is installed in
11 . "$(dirname "$0")/common.sh" 11 # /usr/lib/crosutils. Outside the chroot we find it relative to the script's
12 # location.
13 find_common_sh() {
14 local common_paths=(/usr/lib/crosutils $(dirname "$(readlink -f "$0")"))
15 local path
16
17 SCRIPT_ROOT=
18 for path in "${common_paths[@]}"; do
19 if [ -r "${path}/common.sh" ]; then
20 SCRIPT_ROOT=${path}
21 break
22 fi
23 done
24 }
25
26 find_common_sh
27 . "${SCRIPT_ROOT}/common.sh" || (echo "Unable to load common.sh" && exit 1)
28 # --- END COMMON.SH BOILERPLATE ---
12 29
13 # Script must be run outside the chroot 30 # Script must be run outside the chroot
14 assert_outside_chroot 31 assert_outside_chroot
15 32
16 IMAGES_DIR="${DEFAULT_BUILD_ROOT}/images" 33 IMAGES_DIR="${DEFAULT_BUILD_ROOT}/images"
17 # Default to the most recent image 34 # Default to the most recent image
18 DEFAULT_TO="${GCLIENT_ROOT}/archive" 35 DEFAULT_TO="${GCLIENT_ROOT}/archive"
19 DEFAULT_FROM="${IMAGES_DIR}/$DEFAULT_BOARD/$(ls -t1 \ 36 DEFAULT_FROM="${IMAGES_DIR}/$DEFAULT_BOARD/$(ls -t1 \
20 $IMAGES_DIR/$DEFAULT_BOARD 2>&-| head -1)" 37 $IMAGES_DIR/$DEFAULT_BOARD 2>&-| head -1)"
21 38
(...skipping 14 matching lines...) Expand all
36 "Directory to archive" 53 "Directory to archive"
37 DEFINE_string gsutil "gsutil" \ 54 DEFINE_string gsutil "gsutil" \
38 "Location of gsutil" 55 "Location of gsutil"
39 DEFINE_string gsd_gen_index "" \ 56 DEFINE_string gsd_gen_index "" \
40 "Location of gsd_generate_index.py" 57 "Location of gsd_generate_index.py"
41 DEFINE_string acl "private" \ 58 DEFINE_string acl "private" \
42 "ACL to set on GSD archives" 59 "ACL to set on GSD archives"
43 DEFINE_string gsutil_archive "" \ 60 DEFINE_string gsutil_archive "" \
44 "Optional datastore archive location" 61 "Optional datastore archive location"
45 DEFINE_integer keep_max 0 "Maximum builds to keep in archive (0=all)" 62 DEFINE_integer keep_max 0 "Maximum builds to keep in archive (0=all)"
46 DEFINE_boolean official_build $FLAGS_FALSE "Set CHROMEOS_OFFICIAL=1 for release builds." 63 DEFINE_boolean official_build $FLAGS_FALSE \
64 "Set CHROMEOS_OFFICIAL=1 for release builds."
47 DEFINE_boolean test_mod $FLAGS_TRUE "Modify image for testing purposes" 65 DEFINE_boolean test_mod $FLAGS_TRUE "Modify image for testing purposes"
48 DEFINE_boolean prebuilt_upload $FLAGS_FALSE "Upload prebuilt binary packages." 66 DEFINE_boolean prebuilt_upload $FLAGS_FALSE "Upload prebuilt binary packages."
49 DEFINE_string to "$DEFAULT_TO" "Directory of build archive" 67 DEFINE_string to "$DEFAULT_TO" "Directory of build archive"
50 DEFINE_string zipname "image.zip" "Name of zip file to create." 68 DEFINE_string zipname "image.zip" "Name of zip file to create."
51 69
52 # Parse command line 70 # Parse command line
53 FLAGS "$@" || exit 1 71 FLAGS "$@" || exit 1
54 eval set -- "${FLAGS_ARGV}" 72 eval set -- "${FLAGS_ARGV}"
55 73
56 # Set if default from path is used 74 # Set if default from path is used
57 DEFAULT_USED= 75 DEFAULT_USED=
58 76
59 # Reset "default" FLAGS_from based on passed-in board if not set on cmd-line 77 # Reset "default" FLAGS_from based on passed-in board if not set on cmd-line
60 if [ "$FLAGS_from" = "$DEFAULT_FROM" ] 78 if [ "$FLAGS_from" = "$DEFAULT_FROM" ]; then
61 then
62 # Keep the directory name of the current image set (*.bin). 79 # Keep the directory name of the current image set (*.bin).
63 IMG_DIR="$(readlink ${IMAGES_DIR}/${FLAGS_board}/latest)" 80 IMG_DIR="$(readlink ${IMAGES_DIR}/${FLAGS_board}/latest)"
64 FLAGS_from="${IMAGES_DIR}/${FLAGS_board}/${IMG_DIR}" 81 FLAGS_from="${IMAGES_DIR}/${FLAGS_board}/${IMG_DIR}"
65 DEFAULT_USED=1 82 DEFAULT_USED=1
66 fi 83 fi
67 84
68 # Die on any errors. 85 # Die on any errors.
69 set -e 86 set -e
70 87
71 if [ -z "$DEFAULT_USED" ] 88 if [ -z "$DEFAULT_USED" ]; then
72 then
73 if [ $FLAGS_test_mod -eq $FLAGS_TRUE ] || \ 89 if [ $FLAGS_test_mod -eq $FLAGS_TRUE ] || \
74 [ $FLAGS_factory_install_mod -eq $FLAGS_TRUE ] || \ 90 [ $FLAGS_factory_install_mod -eq $FLAGS_TRUE ] || \
75 [ $FLAGS_factory_test_mod -eq $FLAGS_TRUE ] 91 [ $FLAGS_factory_test_mod -eq $FLAGS_TRUE ]
76 then 92 then
77 echo "test_mod requires that the default from path be used." 93 echo "test_mod requires that the default from path be used."
78 echo "If non default behavior is desired, run mod_image_for_test manually" 94 echo "If non default behavior is desired, run mod_image_for_test manually"
79 echo "re-run archive build without test_mod" 95 echo "re-run archive build without test_mod"
80 exit 1 96 exit 1
81 fi 97 fi
82 fi 98 fi
83 99
84 if [ ! -d "$FLAGS_from" ] 100 if [ ! -d "$FLAGS_from" ]; then
85 then
86 echo "$FLAGS_from does not exist. Exiting..." 101 echo "$FLAGS_from does not exist. Exiting..."
87 exit 1 102 exit 1
88 fi 103 fi
89 104
90 if [ $FLAGS_official_build -eq $FLAGS_TRUE ] 105 if [ $FLAGS_official_build -eq $FLAGS_TRUE ]; then
91 then
92 CHROMEOS_OFFICIAL=1 106 CHROMEOS_OFFICIAL=1
93 fi 107 fi
94 108
95 # Get version information 109 # Get version information
96 . ${SRC_ROOT}/third_party/chromiumos-overlay/chromeos/config/chromeos_version.sh 110 . ${SRC_ROOT}/third_party/chromiumos-overlay/chromeos/config/chromeos_version.sh
97 111
98 # Get git hash 112 # Get git hash
99 # Use git:8 chars of sha1 113 # Use git:8 chars of sha1
100 REVISION=$(git rev-parse HEAD) 114 REVISION=$(git rev-parse HEAD)
101 REVISION=${REVISION:0:8} 115 REVISION=${REVISION:0:8}
102 116
103 # Use the version number plus revision as the last change. (Need both, since 117 # Use the version number plus revision as the last change. (Need both, since
104 # trunk builds multiple times with the same version string.) 118 # trunk builds multiple times with the same version string.)
105 LAST_CHANGE="${CHROMEOS_VERSION_STRING}-r${REVISION}" 119 LAST_CHANGE="${CHROMEOS_VERSION_STRING}-r${REVISION}"
106 if [ -n "$FLAGS_build_number" ] 120 if [ -n "$FLAGS_build_number" ]; then
107 then
108 LAST_CHANGE="$LAST_CHANGE-b${FLAGS_build_number}" 121 LAST_CHANGE="$LAST_CHANGE-b${FLAGS_build_number}"
109 fi 122 fi
110 123
111 # The Chromium buildbot scripts only create a clickable link to the archive 124 # The Chromium buildbot scripts only create a clickable link to the archive
112 # if an output line of the form "last change: XXX" exists 125 # if an output line of the form "last change: XXX" exists
113 echo "last change: $LAST_CHANGE" 126 echo "last change: $LAST_CHANGE"
114 echo "archive from: $FLAGS_from" 127 echo "archive from: $FLAGS_from"
115 128
116 # Create the output directory 129 # Create the output directory
117 OUTDIR="${FLAGS_to}/${LAST_CHANGE}" 130 OUTDIR="${FLAGS_to}/${LAST_CHANGE}"
(...skipping 16 matching lines...) Expand all
134 MOD_ARGS=$2 147 MOD_ARGS=$2
135 OUTPUT_IMAGE=$1 148 OUTPUT_IMAGE=$1
136 cp -f "${SRC_IMAGE}" "${BACKUP_IMAGE}" 149 cp -f "${SRC_IMAGE}" "${BACKUP_IMAGE}"
137 ./enter_chroot.sh -- ./mod_image_for_test.sh --board $FLAGS_board \ 150 ./enter_chroot.sh -- ./mod_image_for_test.sh --board $FLAGS_board \
138 --yes ${MOD_ARGS} 151 --yes ${MOD_ARGS}
139 mv "${SRC_IMAGE}" "${OUTPUT_IMAGE}" 152 mv "${SRC_IMAGE}" "${OUTPUT_IMAGE}"
140 mv "${BACKUP_IMAGE}" "${SRC_IMAGE}" 153 mv "${BACKUP_IMAGE}" "${SRC_IMAGE}"
141 } 154 }
142 155
143 # Modify image for test if flag set. 156 # Modify image for test if flag set.
144 if [ $FLAGS_test_mod -eq $FLAGS_TRUE ] 157 if [ $FLAGS_test_mod -eq $FLAGS_TRUE ]; then
145 then
146 echo "Modifying image for test" 158 echo "Modifying image for test"
147 do_chroot_mod "${FLAGS_from}/chromiumos_test_image.bin" "" 159 do_chroot_mod "${FLAGS_from}/chromiumos_test_image.bin" ""
148 160
149 pushd "${FLAGS_chroot}/build/${FLAGS_board}/usr/local" 161 pushd "${FLAGS_chroot}/build/${FLAGS_board}/usr/local"
150 echo "Archiving autotest build artifacts" 162 echo "Archiving autotest build artifacts"
151 tar cjf "${FLAGS_from}/autotest.tar.bz2" --checkpoint=1000 autotest 163 tar cjf "${FLAGS_from}/autotest.tar.bz2" --checkpoint=1000 autotest
152 popd 164 popd
153 fi 165 fi
154 166
155 if [ $FLAGS_factory_test_mod -eq $FLAGS_TRUE ] 167 if [ $FLAGS_factory_test_mod -eq $FLAGS_TRUE ]; then
156 then
157 echo "Modifying image for factory test" 168 echo "Modifying image for factory test"
158 do_chroot_mod "${FLAGS_from}/chromiumos_factory_image.bin" \ 169 do_chroot_mod "${FLAGS_from}/chromiumos_factory_image.bin" \
159 "--factory" 170 "--factory"
160 fi 171 fi
161 172
162 # Modify for recovery 173 # Modify for recovery
163 if [ $FLAGS_official_build -eq $FLAGS_TRUE ] 174 if [ $FLAGS_official_build -eq $FLAGS_TRUE ]; then
164 then
165 BUILDVER="$(readlink ${IMAGES_DIR}/${FLAGS_board}/latest)" 175 BUILDVER="$(readlink ${IMAGES_DIR}/${FLAGS_board}/latest)"
166 CHROOT_IMAGE_DIR=/home/$USER/trunk/src/build/images/$FLAGS_board/$BUILDVER 176 CHROOT_IMAGE_DIR=/home/$USER/trunk/src/build/images/$FLAGS_board/$BUILDVER
167 ./enter_chroot.sh -- ./mod_image_for_recovery.sh --board $FLAGS_board \ 177 ./enter_chroot.sh -- ./mod_image_for_recovery.sh --board $FLAGS_board \
168 --image $CHROOT_IMAGE_DIR/chromiumos_base_image.bin 178 --image $CHROOT_IMAGE_DIR/chromiumos_base_image.bin
169 fi 179 fi
170 180
171 # Remove the developer build if test image is also built. 181 # Remove the developer build if test image is also built.
172 if [ $FLAGS_test_mod -eq $FLAGS_TRUE ] ; then 182 if [ $FLAGS_test_mod -eq $FLAGS_TRUE ] ; then
173 rm -f ${SRC_IMAGE} 183 rm -f ${SRC_IMAGE}
174 fi 184 fi
175 185
176 # Build differently sized shims. Currently only factory install shim is 186 # Build differently sized shims. Currently only factory install shim is
177 # supported, TODO(tgao): Add developer shim. 187 # supported, TODO(tgao): Add developer shim.
178 if [ $FLAGS_factory_install_mod -eq $FLAGS_TRUE ] 188 if [ $FLAGS_factory_install_mod -eq $FLAGS_TRUE ]; then
179 then
180 echo "Building factory install shim." 189 echo "Building factory install shim."
181 # HACK: The build system can't currently handle more than one image size 190 # HACK: The build system can't currently handle more than one image size
182 # at a time. Therefor eit's necessary to do another round of build after 191 # at a time. Therefor eit's necessary to do another round of build after
183 # archiving the original build. This should be fixed in Chromite. 192 # archiving the original build. This should be fixed in Chromite.
184 193
185 # HACK: cbuild has a special case when running on chrome-bot that 194 # HACK: cbuild has a special case when running on chrome-bot that
186 # zeroes out the current revision, which makes calling build_image directly 195 # zeroes out the current revision, which makes calling build_image directly
187 # fail. You must explictly call replace and specify a unique name numerically 196 # fail. You must explictly call replace and specify a unique name numerically
188 # using build_attempt. 197 # using build_attempt.
189 ./enter_chroot.sh -- ./build_image --board $FLAGS_board --factory_install \ 198 ./enter_chroot.sh -- ./build_image --board $FLAGS_board --factory_install \
190 --replace --build_attempt 7 199 --replace --build_attempt 7
191 200
192 # Get the install shim dir: It is the newest build. 201 # Get the install shim dir: It is the newest build.
193 # This is the output dir for the factory shim, the factory test and 202 # This is the output dir for the factory shim, the factory test and
194 # release images will remain in IMG_DIR, defined previously. 203 # release images will remain in IMG_DIR, defined previously.
195 SHIM_DIR="$(readlink ${IMAGES_DIR}/${FLAGS_board}/latest)" 204 SHIM_DIR="$(readlink ${IMAGES_DIR}/${FLAGS_board}/latest)"
196 205
197 echo "Factory image dir: ${IMG_DIR}" 206 echo "Factory image dir: ${IMG_DIR}"
198 echo "Factory install shim dir: ${SHIM_DIR}" 207 echo "Factory install shim dir: ${SHIM_DIR}"
199 fi 208 fi
200 209
201 # Zip the build 210 # Zip the build
202 echo "Compressing and archiving build..." 211 echo "Compressing and archiving build..."
203 cd "$FLAGS_from" 212 cd "$FLAGS_from"
204 MANIFEST=`ls | grep -v factory` 213 MANIFEST=`ls | grep -v factory`
205 zip -r "${ZIPFILE}" ${MANIFEST} 214 zip -r "${ZIPFILE}" ${MANIFEST}
206 215
207 if [ $FLAGS_factory_test_mod -eq $FLAGS_TRUE ] || \ 216 if [ $FLAGS_factory_test_mod -eq $FLAGS_TRUE ] || \
208 [ $FLAGS_factory_install_mod -eq $FLAGS_TRUE ] 217 [ $FLAGS_factory_install_mod -eq $FLAGS_TRUE ]; then
209 then
210 # We need to have directory structure for factory package, as 218 # We need to have directory structure for factory package, as
211 # signing and packaging utilities need unpack_partitions.sh. 219 # signing and packaging utilities need unpack_partitions.sh.
212 echo "Compressing factory software" 220 echo "Compressing factory software"
213 pushd .. 221 pushd ..
214 [ -n "${SHIM_DIR}" ] && rm -f factory_shim && ln -s "${SHIM_DIR}" factory_shim 222 [ -n "${SHIM_DIR}" ] && rm -f factory_shim && ln -s "${SHIM_DIR}" factory_shim
215 [ -n "${IMG_DIR}" ] && rm -f factory_test && ln -s "${IMG_DIR}" factory_test 223 [ -n "${IMG_DIR}" ] && rm -f factory_test && ln -s "${IMG_DIR}" factory_test
216 224
217 # Restore "latest" status to the original image. 225 # Restore "latest" status to the original image.
218 # The "latest" symlink and latest timestamp are used extensively 226 # The "latest" symlink and latest timestamp are used extensively
219 # throughout the build scripts rather than explicitly specifying an image. 227 # throughout the build scripts rather than explicitly specifying an image.
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 then 269 then
262 echo "Creating hwqual archive" 270 echo "Creating hwqual archive"
263 HWQUAL_NAME="chromeos-hwqual-${FLAGS_board}-${CHROMEOS_VERSION_STRING}" 271 HWQUAL_NAME="chromeos-hwqual-${FLAGS_board}-${CHROMEOS_VERSION_STRING}"
264 "${SCRIPTS_DIR}/archive_hwqual" --from "${OUTDIR}" \ 272 "${SCRIPTS_DIR}/archive_hwqual" --from "${OUTDIR}" \
265 --output_tag "${HWQUAL_NAME}" 273 --output_tag "${HWQUAL_NAME}"
266 gsutil_archive "${OUTDIR}/${HWQUAL_NAME}.tar.bz2" \ 274 gsutil_archive "${OUTDIR}/${HWQUAL_NAME}.tar.bz2" \
267 "${LAST_CHANGE}/${HWQUAL_NAME}.tar.bz2" 275 "${LAST_CHANGE}/${HWQUAL_NAME}.tar.bz2"
268 fi 276 fi
269 277
270 278
271 if [ $FLAGS_prebuilt_upload -eq $FLAGS_TRUE ] 279 if [ $FLAGS_prebuilt_upload -eq $FLAGS_TRUE ]; then
272 then
273 # Construct prebuilt upload command. 280 # Construct prebuilt upload command.
274 # This will upload prebuilt packages to Google Storage. 281 # This will upload prebuilt packages to Google Storage.
275 prebuilt_cmd="${SCRIPTS_DIR}/prebuilt.py" 282 prebuilt_cmd="${SCRIPTS_DIR}/prebuilt.py"
276 prebuilt_cmd="$prebuilt_cmd -u gs://chromeos-prebuilt --git-sync -V master" 283 prebuilt_cmd="$prebuilt_cmd -u gs://chromeos-prebuilt --git-sync -V master"
277 prebuilt_cmd="$prebuilt_cmd -p ${GCLIENT_ROOT} -b ${FLAGS_board}" 284 prebuilt_cmd="$prebuilt_cmd -p ${GCLIENT_ROOT} -b ${FLAGS_board}"
278 285
279 if [ "${FLAGS_board}" == "x86-generic" ] 286 if [ "${FLAGS_board}" == "x86-generic" ]
280 then 287 then
281 prebuilt_cmd="$prebuilt_cmd --sync-host" 288 prebuilt_cmd="$prebuilt_cmd --sync-host"
282 fi 289 fi
283 290
284 echo "Running $prebuilt_cmd" 291 echo "Running $prebuilt_cmd"
285 $prebuilt_cmd 292 $prebuilt_cmd
286 fi 293 fi
287 294
288 gsutil_archive "${ZIPFILE}" "${LAST_CHANGE}/${FLAGS_zipname}" 295 gsutil_archive "${ZIPFILE}" "${LAST_CHANGE}/${FLAGS_zipname}"
289 296
290 if [ $FLAGS_archive_debug -eq $FLAGS_TRUE ] 297 if [ $FLAGS_archive_debug -eq $FLAGS_TRUE ]; then
291 then
292 echo "Generating Breakpad symbols" 298 echo "Generating Breakpad symbols"
293 ! ${SCRIPTS_DIR}/cros_generate_breakpad_symbols --board=${FLAGS_board} 299 ! ${SCRIPTS_DIR}/cros_generate_breakpad_symbols --board=${FLAGS_board}
294 echo "Creating debug archive" 300 echo "Creating debug archive"
295 pushd "${FLAGS_chroot}/build/${FLAGS_board}/usr/lib" 301 pushd "${FLAGS_chroot}/build/${FLAGS_board}/usr/lib"
296 sudo tar czf "${OUTDIR}/debug.tgz" --checkpoint=1000 --exclude\ 302 sudo tar czf "${OUTDIR}/debug.tgz" --checkpoint=1000 --exclude\
297 debug/usr/local/autotest --exclude debug/tests debug 303 debug/usr/local/autotest --exclude debug/tests debug
298 CMD="chown \${SUDO_UID}:\${SUDO_GID} ${OUTDIR}/debug.tgz" 304 CMD="chown \${SUDO_UID}:\${SUDO_GID} ${OUTDIR}/debug.tgz"
299 sudo sh -c "${CMD}" 305 sudo sh -c "${CMD}"
300 popd 306 popd
301 gsutil_archive "${OUTDIR}/debug.tgz" "${LAST_CHANGE}/debug.tgz" 307 gsutil_archive "${OUTDIR}/debug.tgz" "${LAST_CHANGE}/debug.tgz"
302 fi 308 fi
303 309
304 if [ $FLAGS_factory_test_mod -eq $FLAGS_TRUE ] || \ 310 if [ $FLAGS_factory_test_mod -eq $FLAGS_TRUE ] || \
305 [ $FLAGS_factory_install_mod -eq $FLAGS_TRUE ] 311 [ $FLAGS_factory_install_mod -eq $FLAGS_TRUE ]; then
306 then
307 gsutil_archive "${FACTORY_ZIPFILE}" \ 312 gsutil_archive "${FACTORY_ZIPFILE}" \
308 "${LAST_CHANGE}/factory_${FLAGS_zipname}" 313 "${LAST_CHANGE}/factory_${FLAGS_zipname}"
309 fi 314 fi
310 gsutil_archive "${FLAGS_to}/LATEST" "LATEST" 315 gsutil_archive "${FLAGS_to}/LATEST" "LATEST"
311 316
312 # Purge old builds if necessary 317 # Purge old builds if necessary
313 if [ $FLAGS_keep_max -gt 0 ] 318 if [ $FLAGS_keep_max -gt 0 ]; then
314 then
315 echo "Deleting old builds (all but the newest ${FLAGS_keep_max})..." 319 echo "Deleting old builds (all but the newest ${FLAGS_keep_max})..."
316 cd "$FLAGS_to" 320 cd "$FLAGS_to"
317 # +2 because line numbers start at 1 and need to skip LATEST file 321 # +2 because line numbers start at 1 and need to skip LATEST file
318 rm -rf `ls -t1 | tail --lines=+$(($FLAGS_keep_max + 2))` 322 rm -rf `ls -t1 | tail --lines=+$(($FLAGS_keep_max + 2))`
319 cd - 323 cd -
320 fi 324 fi
321 325
322 echo "Done." 326 echo "Done."
OLDNEW
« no previous file with comments | « no previous file | archive_hwqual » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698