summaryrefslogtreecommitdiffstats
path: root/src/garbage.sh
diff options
context:
space:
mode:
authorP. J. McDermott <pj@pehjota.net>2017-07-22 13:26:23 (EDT)
committer P. J. McDermott <pj@pehjota.net>2017-07-22 13:26:23 (EDT)
commit65022fdd57f41b6250b2e29bdd7bac59b17f3cea (patch)
treec7f7e11c3e8f4f8e215789be9929d21ab14ccb6b /src/garbage.sh
parent8dcab4434333dc9c8170baa8fbbccc2538fa2401 (diff)
`git mv lib/*.sh src/`
Diffstat (limited to 'src/garbage.sh')
-rw-r--r--src/garbage.sh76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/garbage.sh b/src/garbage.sh
new file mode 100644
index 0000000..a6f1a3d
--- /dev/null
+++ b/src/garbage.sh
@@ -0,0 +1,76 @@
+# pro-archman
+# lib/garbage.sh
+# Functions for garbage collection
+#
+# Copyright (C) 2013 Patrick "P. J." McDermott
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+[ "x${_GARBAGE_SM+set}" = 'xset' ] && return 0
+_GARBAGE_SM=1
+
+use locale
+use output
+use dir
+
+collect_garbage()
+{
+ local cur_time=
+ local garbage=
+ local gar_time=
+ local dirs=
+ local file=
+
+ info_v "$(get_msg 'collecting_garbage')"
+
+ # NB: The %s format conversion specifier is not specified by POSIX, but
+ # it is supported by the GNU and BusyBox implementations of date.
+ cur_time=$(date '+%s')
+
+ for garbage in "${base_dir}/.db/garbage/"*; do
+ if [ ! -f "${garbage}" ]; then
+ continue
+ fi
+ gar_time=${garbage##*/}
+ if [ ${cur_time} -lt ${gar_time} ]; then
+ break
+ fi
+ while read -r dirs file; do
+ info_v "$(get_msg 'collecting_garbage_file')" "${file}"
+ rm -f "${base_dir}/${file}"
+ while [ ${dirs} -gt 0 ]; do
+ file="${file%/*}"
+ try_rmdir "${base_dir}/${file}"
+ dirs=$(($dirs - 1))
+ done
+ done <"${garbage}"
+ rm -f "${garbage}"
+ done
+}
+
+mark_pool_garbage()
+{
+ local file="${1}"
+ local time=
+
+ info_v "$(get_msg 'marking_garbage_file')" "${file}"
+
+ # NB: The %s format conversion specifier is not specified by POSIX, but
+ # it is supported by the GNU and BusyBox implementations of date.
+ time=$(date '+%s')
+ time=$(($time + $conf_pool_gc_delay))
+
+ mkdir -p "${base_dir}/.db/garbage"
+ printf '2 %s\n' "${file}" >>"${base_dir}/.db/garbage/${time}"
+}