111111
112112package_file_name () {
113113 local package_file=" $1 "
114+ local package_name=" "
115+ local file_name file_stem
114116
115117 case " $package_file " in
116118 * .deb)
117- dpkg-deb -f " $package_file " Package 2> /dev/null || true
119+ package_name= " $( dpkg-deb -f " $package_file " Package 2> /dev/null || true) "
118120 ;;
119121 * .rpm)
120- rpm -qp --qf ' %{NAME}\n' " $package_file " 2> /dev/null || true
122+ package_name=" $( rpm -qp --qf ' %{NAME}\n' " $package_file " 2> /dev/null || true) "
123+ ;;
124+ esac
125+
126+ if [ -n " $package_name " ]; then
127+ printf ' %s\n' " $package_name "
128+ return 0
129+ fi
130+
131+ file_name=" ${package_file##*/ } "
132+ case " $file_name " in
133+ * .deb)
134+ printf ' %s\n' " ${file_name%% _* } "
135+ ;;
136+ * .rpm)
137+ file_stem=" ${file_name% .rpm} "
138+ file_stem=" ${file_stem% .* } "
139+ file_stem=" ${file_stem% -* } "
140+ printf ' %s\n' " ${file_stem% -[0-9]* } "
121141 ;;
122142 esac
123143}
@@ -126,21 +146,85 @@ stage_package_artifacts() {
126146 find " $DIST_DIR " -maxdepth 1 -type f \( -name " *.deb" -o -name " *.rpm" \) -exec cp {} " $PACKAGE_REPO_STAGE_DIR " / \;
127147}
128148
149+ current_package_names=()
150+
151+ append_current_package_name () {
152+ local package_name=" $1 "
153+ local current_package_name
154+
155+ [ -n " $package_name " ] || return 0
156+
157+ for current_package_name in " ${current_package_names[@]} " ; do
158+ if [ " $current_package_name " = " $package_name " ]; then
159+ return 0
160+ fi
161+ done
162+
163+ current_package_names+=(" $package_name " )
164+ }
165+
166+ collect_current_package_names () {
167+ local package_file
168+
169+ current_package_names=()
170+
171+ while IFS= read -r -d ' ' package_file; do
172+ append_current_package_name " $( package_file_name " $package_file " ) "
173+ done < <( find " $DIST_DIR " -maxdepth 1 -type f \( -name " *.deb" -o -name " *.rpm" \) -print0)
174+
175+ if [ ${# current_package_names[@]} -eq 0 ]; then
176+ append_current_package_name " $PACKAGE_NAME "
177+ fi
178+ }
179+
180+ is_current_package_name () {
181+ local package_name=" $1 "
182+ local current_package_name
183+
184+ [ -n " $package_name " ] || return 1
185+
186+ for current_package_name in " ${current_package_names[@]} " ; do
187+ if [ " $current_package_name " = " $package_name " ]; then
188+ return 0
189+ fi
190+ done
191+
192+ return 1
193+ }
194+
129195prune_stage_package_history () {
196+ local staged_package package_name
197+
198+ collect_current_package_names
199+
130200 while IFS= read -r -d ' ' staged_package; do
131- if [ " $( package_file_name " $staged_package " ) " = " $PACKAGE_NAME " ]; then
201+ package_name=" $( package_file_name " $staged_package " ) "
202+ if is_current_package_name " $package_name " ; then
132203 rm -f " $staged_package "
133204 fi
134205 done < <( find " $PACKAGE_REPO_STAGE_DIR " -type f \( -name " *.deb" -o -name " *.rpm" \) -print0)
135206}
136207
208+ prune_stage_release_history () {
209+ local entry release_name
210+
211+ for entry in " $PACKAGE_REPO_STAGE_DIR " /* ; do
212+ [ -d " $entry " ] || continue
213+ release_name=" ${entry##*/ } "
214+ if [[ " $release_name " =~ ^v? [0-9]+ (\. [0-9]+){1,2}([-.+~][A-Za-z0-9._~+-]+)? $ ]]; then
215+ rm -rf " $entry "
216+ fi
217+ done
218+ }
219+
137220acquire_lock
138221
139222gcloud storage rsync \
140223 --recursive \
141224 " $destination " \
142225 " $PACKAGE_REPO_STAGE_DIR " > /dev/null 2>&1 || true
143226
227+ prune_stage_release_history
144228prune_stage_package_history
145229stage_package_artifacts
146230
0 commit comments