[tbb-commits] [tor-browser-build/master] Bug 40221: Add tools/prune-old-builds
gk at torproject.org
gk at torproject.org
Mon Feb 1 07:50:39 UTC 2021
commit 52ba09265002299e7fcba1f181c1656c372dbbc1
Author: Nicolas Vigier <boklm at torproject.org>
Date: Sun Jan 31 22:57:20 2021 +0100
Bug 40221: Add tools/prune-old-builds
This script was already present in the directory
tools/ansible/roles/tbb-nightly-build/files, however this directory will
soon be removed as part of #40196.
---
tools/prune-old-builds | 136 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 136 insertions(+)
diff --git a/tools/prune-old-builds b/tools/prune-old-builds
new file mode 100755
index 0000000..852a9da
--- /dev/null
+++ b/tools/prune-old-builds
@@ -0,0 +1,136 @@
+#!/usr/bin/perl -w
+
+# Copyright (c) 2019, The Tor Project, Inc.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#
+# * Neither the names of the copyright owners nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+# 'prune-old-builds' is a script to prune old builds.
+#
+#
+# Usage:
+# $ ./prune-old-builds [options] <directory>
+#
+#
+# Available options:
+#
+# --dry-run
+# Don't delete anything, but say what would be deleted.
+#
+# --prefix <prefix>
+# Prefix of the directories to be removed. Default is 'tbb-nightly.'.
+#
+# --separator <c>
+# Separator character to separate the year, month, day in the directory
+# names. Default is '.'.
+#
+# --days <n>
+# Number of days that we should keep. Default is 6.
+#
+# --weeks <n>
+# Number of monday builds that we should keep. Default is 3.
+#
+# --months <n>
+# Number of 1st day of the month builds that we should keep.
+# Default is 3.
+
+use strict;
+use Getopt::Long;
+use DateTime;
+use DateTime::Duration;
+use File::Path qw(remove_tree);
+
+my %options = (
+ days => 6,
+ weeks => 3,
+ months => 3,
+ prefix => 'tbb-nightly.',
+ separator => '.',
+);
+
+sub keep_builds {
+ my %res;
+
+ my $day = DateTime::Duration->new(days => 1);
+ my $week = DateTime::Duration->new(weeks => 1);
+ my $month = DateTime::Duration->new(months => 1);
+
+ my $n = $options{days};
+ my $dt = DateTime->now;
+ while ($n) {
+ $res{ $options{prefix} . $dt->ymd($options{separator}) } = 1;
+ $dt = $dt - $day;
+ $n--;
+ }
+
+ my $w = $options{weeks};
+ while ($dt->day_of_week != 1) {
+ $dt = $dt - $day;
+ }
+ while ($w) {
+ $res{ $options{prefix} . $dt->ymd($options{separator}) } = 1;
+ $dt = $dt - $week;
+ $w--;
+ }
+
+ my $m = $options{months};
+ $dt = DateTime->now;
+ while ($dt->day != 1) {
+ $dt = $dt - $day;
+ }
+ while ($m) {
+ $res{ $options{prefix} . $dt->ymd($options{separator}) } = 1;
+ $dt = $dt - $month;
+ $m--;
+ }
+
+ return \%res;
+}
+
+sub clean_directory {
+ my ($directory) = @_;
+ my $k = keep_builds;
+ chdir $directory || die "Error entering $directory";
+ foreach my $file (glob "$options{prefix}*") {
+ next unless $file =~ m/^$options{prefix}\d{4}$options{separator}\d{2}$options{separator}\d{2}$/;
+ next if $k->{$file};
+ if ($options{'dry-run'}) {
+ print "Would remove $file\n";
+ } else {
+ remove_tree($file);
+ }
+ }
+}
+
+my @opts = qw(days=i weeks=i months=i prefix=s dry-run!);
+Getopt::Long::GetOptions(\%options, @opts);
+die "Missing argument: directory to clean" unless @ARGV;
+foreach my $dir (@ARGV) {
+ clean_directory($dir);
+}
More information about the tbb-commits
mailing list