@@ -92,64 +92,67 @@ public PrunePlan GeneratePrunePlan()
92
92
. ToList ( ) ;
93
93
94
94
IList < string > taggedKeep = new List < string > ( ) ;
95
- IList < string > newKeep = new List < string > ( ) ;
96
95
IList < string > report = new List < string > ( ) ;
97
96
98
- int unhandled = 0 ;
99
-
100
- report . Add ( " ******************************** Prune audit start **********************************" ) ;
97
+ int ignoringNoBracketCount = 0 ;
101
98
102
99
IList < string > packageIds = _indexReader . GetAllPackageIds ( ) . ToList ( ) ;
103
100
packageIds = packageIds . OrderBy ( n => Guid . NewGuid ( ) ) . ToList ( ) ; // randomize collection order
104
101
105
102
DateTime utcNow = _timeprovider . GetUtcNow ( ) ;
106
- foreach ( PruneBracketProcess pruneBracketProcess in processBrackets )
107
- pruneBracketProcess . Floor = utcNow . AddDays ( - 1 * pruneBracketProcess . Days ) ;
103
+ DateTime ceiling = utcNow ;
104
+ foreach ( PruneBracketProcess pruneBracketProcess in processBrackets )
105
+ {
106
+ pruneBracketProcess . Ceiling = ceiling ;
107
+ pruneBracketProcess . Floor = ceiling . AddDays ( - 1 * pruneBracketProcess . Days ) ;
108
+ ceiling = pruneBracketProcess . Floor ;
109
+ }
108
110
109
111
int startingPackageCount = packageIds . Count ;
110
112
111
- report . Add ( $ "Server currently contains { packageIds . Count } packages.") ;
113
+ report . Add ( $ "Server currently holds { packageIds . Count } packages.") ;
112
114
113
115
foreach ( string packageId in packageIds )
114
116
{
115
117
Manifest manifest = _indexReader . GetManifestHead ( packageId ) ;
118
+ report . Add ( string . Empty ) ;
116
119
117
120
if ( manifest == null )
118
121
{
119
122
_log . LogWarning ( $ "Expected manifest for package { packageId } was not found, skipping.") ;
120
123
continue ;
121
- }
122
-
124
+ }
125
+
123
126
string flattenedTags = manifest . Tags . Count == 0 ? string . Empty : $ "Tags : { string . Join ( "," , manifest . Tags ) } ";
127
+ flattenedTags = string . IsNullOrEmpty ( flattenedTags ) ? "Package is untagged" : $ "Tagged with : { flattenedTags } ";
128
+
124
129
int ageInDays = ( int ) Math . Round ( ( utcNow - manifest . CreatedUtc ) . TotalDays , 0 ) ;
125
- report . Add ( $ "Analysing { packageId } , added { manifest . CreatedUtc . ToIso ( ) } ({ ageInDays } days ago). Tagged with: { flattenedTags } ") ;
130
+ report . Add ( $ "Analysing package \" { packageId } \" , added { manifest . CreatedUtc . ToIso ( ) } ({ ageInDays } days ago). { flattenedTags } . ") ;
126
131
127
- PruneBracketProcess matchingBracket = processBrackets . FirstOrDefault ( b => manifest . CreatedUtc < b . Floor ) ;
132
+ PruneBracketProcess matchingBracket = processBrackets . FirstOrDefault ( bracket => bracket . Contains ( manifest . CreatedUtc ) ) ;
128
133
if ( matchingBracket == null )
129
134
{
130
- report . Add ( $ "{ packageId } , created { manifest . CreatedUtc . ToIso ( ) } , does not land in any prune bracket , will be kept.") ;
131
- unhandled ++ ;
135
+ report . Add ( $ "Package \" { packageId } \" doesn't fit into any prune brackets , will be kept.") ;
136
+ ignoringNoBracketCount ++ ;
132
137
continue ;
133
138
}
134
139
135
- report . Add ( $ "{ packageId } , created { manifest . CreatedUtc . ToIso ( ) } , lands in prune bracket { matchingBracket . Days } Days.") ;
136
-
137
140
// try to find reasons to keep package
138
141
139
142
// packages can be tagged to never be deleted. This ignores keep count, but will push out packages that are not tagged
140
- bool isTaggedKeep = manifest . Tags . Any ( tag => _settings . PruneIgnoreTags . Any ( protectedTag => protectedTag . Equals ( tag ) ) ) ;
141
- if ( isTaggedKeep )
143
+ IEnumerable < string > keepTagsOnPackage = manifest . Tags . Where ( tag => _settings . PruneIgnoreTags . Any ( protectedTag => protectedTag . Equals ( tag ) ) ) ;
144
+ if ( keepTagsOnPackage . Any ( ) )
142
145
{
143
146
taggedKeep . Add ( packageId ) ;
144
147
matchingBracket . Keep . Add ( manifest ) ;
145
- report . Add ( $ "{ packageId } marked for keep based on tag.") ;
148
+ report . Add ( $ "Package \" { packageId } \" marked for keep based on tag(s) { string . Join ( "," , keepTagsOnPackage ) } .") ;
146
149
continue ;
147
150
}
148
151
149
152
// "group strategy" - the entire bracket is treated as one big bag
150
153
if ( matchingBracket . Grouping == PruneBracketGrouping . Grouped && matchingBracket . Keep . Count < matchingBracket . Amount )
151
154
{
152
- report . Add ( $ "{ packageId } marked for keep, { matchingBracket . Keep . Count } packages kept so far .") ;
155
+ report . Add ( $ "Package \" { packageId } \" marked for keep based on its date grouping (bracket { matchingBracket } ) { matchingBracket . Amount - matchingBracket . Keep . Count } slots left in bracket .") ;
153
156
matchingBracket . Keep . Add ( manifest ) ;
154
157
continue ;
155
158
}
@@ -158,8 +161,10 @@ public PrunePlan GeneratePrunePlan()
158
161
if ( matchingBracket . Grouping == PruneBracketGrouping . Daily )
159
162
{
160
163
int code = manifest . CreatedUtc . ToDayCode ( ) ;
161
- if ( matchingBracket . Keep . Count ( m => m . CreatedUtc . ToDayCode ( ) == code ) < matchingBracket . Amount )
164
+ int kept = matchingBracket . Keep . Count ( m => m . CreatedUtc . ToDayCode ( ) == code ) ;
165
+ if ( kept < matchingBracket . Amount )
162
166
{
167
+ report . Add ( $ "Package \" { packageId } \" marked for keep, bracket { matchingBracket . Days } had { matchingBracket . Amount - kept } slots left for day { code } .") ;
163
168
matchingBracket . Keep . Add ( manifest ) ;
164
169
continue ;
165
170
}
@@ -169,8 +174,10 @@ public PrunePlan GeneratePrunePlan()
169
174
if ( matchingBracket . Grouping == PruneBracketGrouping . Weekly )
170
175
{
171
176
int code = manifest . CreatedUtc . ToWeekCode ( ) ;
172
- if ( matchingBracket . Keep . Count ( m => m . CreatedUtc . ToWeekCode ( ) == code ) < matchingBracket . Amount )
177
+ int kept = matchingBracket . Keep . Count ( m => m . CreatedUtc . ToWeekCode ( ) == code ) ;
178
+ if ( kept < matchingBracket . Amount )
173
179
{
180
+ report . Add ( $ "Package \" { packageId } \" marked for keep, bracket { matchingBracket . Days } had { matchingBracket . Amount - kept } slots left for week { code } .") ;
174
181
matchingBracket . Keep . Add ( manifest ) ;
175
182
continue ;
176
183
}
@@ -180,53 +187,78 @@ public PrunePlan GeneratePrunePlan()
180
187
if ( matchingBracket . Grouping == PruneBracketGrouping . Monthly )
181
188
{
182
189
int code = manifest . CreatedUtc . ToMonthCode ( ) ;
183
- if ( matchingBracket . Keep . Count ( m => m . CreatedUtc . ToMonthCode ( ) == code ) < matchingBracket . Amount )
190
+ int kept = matchingBracket . Keep . Count ( m => m . CreatedUtc . ToMonthCode ( ) == code ) ;
191
+ if ( kept < matchingBracket . Amount )
184
192
{
193
+ report . Add ( $ "Package \" { packageId } \" marked for keep, bracket { matchingBracket . Days } had { matchingBracket . Amount - kept } slots left for month { code } .") ;
185
194
matchingBracket . Keep . Add ( manifest ) ;
186
195
continue ;
187
196
}
188
197
}
189
198
190
- // bracket is on x packages per month basis
199
+ // bracket is on x packages per year basis
191
200
if ( matchingBracket . Grouping == PruneBracketGrouping . Yearly )
192
201
{
193
- int code = manifest . CreatedUtc . ToMonthCode ( ) ;
194
- if ( matchingBracket . Keep . Count ( m => m . CreatedUtc . ToMonthCode ( ) == code ) < matchingBracket . Amount )
202
+ int code = manifest . CreatedUtc . Year ;
203
+ int kept = matchingBracket . Keep . Count ( m => m . CreatedUtc . Year == code ) ;
204
+ if ( kept < matchingBracket . Amount )
195
205
{
206
+ report . Add ( $ "Package \" { packageId } \" marked for keep, bracket { matchingBracket . Days } had { matchingBracket . Amount - kept } slots left for year { code } .") ;
196
207
matchingBracket . Keep . Add ( manifest ) ;
197
208
continue ;
198
209
}
199
210
}
200
211
201
-
202
212
// no reasons found, prune package
203
213
matchingBracket . Prune . Add ( manifest ) ;
204
- report . Add ( $ "{ packageId } marked for prune, { matchingBracket . Keep . Count } packages already kept.") ;
214
+ report . Add ( $ "Package \" { packageId } \" failed to pass any keep tests, marked for prune.") ;
215
+
205
216
} // for each
206
217
207
218
string pruneIdList = string . Empty ;
208
219
if ( packageIds . Count > 0 )
209
220
pruneIdList = $ " ({ string . Join ( "," , packageIds ) } )";
210
221
211
222
report . Add ( string . Empty ) ;
212
- report . Add ( $ "Pre-weekly ignore count is { newKeep . Count ( ) } - { string . Join ( "," , newKeep ) } ") ;
213
- report . Add ( $ "Unhandled: { unhandled } ") ;
214
-
215
- if ( taggedKeep . Count > 0 )
216
- report . Add ( $ "Kept due to tagging - { string . Join ( "," , taggedKeep ) } .") ;
217
-
218
- foreach ( PruneBracketProcess p in processBrackets )
219
- report . Add ( $ "Bracket { p } , keeping { p . Keep . Count } packages ({ string . Join ( "," , p . Keep ) } ), pruning { p . Prune . Count } packages ({ string . Join ( "," , p . Prune ) } )") ;
220
-
221
- report . Add ( string . Empty ) ;
222
- report . Add ( " ******************************** Prune audit end **********************************" ) ;
223
+
224
+ int totalKeep = 0 ;
225
+ int totalPrune = 0 ;
226
+
227
+ foreach ( PruneBracketProcess p in processBrackets )
228
+ {
229
+ totalKeep += p . Keep . Count ;
230
+ totalPrune += p . Prune . Count ;
231
+ report . Add ( $ "Bracket { p } .") ;
232
+ report . Add ( $ "Keeping { p . Keep . Count } { FlattenList ( p . Keep . Select ( p => p . Id ) ) } .") ;
233
+ report . Add ( $ "Pruning { p . Prune . Count } { FlattenList ( p . Prune . Select ( p => p . Id ) ) } .") ;
234
+ report . Add ( string . Empty ) ;
235
+ }
236
+
237
+ if ( taggedKeep . Any ( ) )
238
+ report . Add ( $ "Kept { taggedKeep . Count } packages because of tag matches{ FlattenList ( taggedKeep ) } .") ;
239
+ else
240
+ report . Add ( "No packages were kept due to tag matching. Note that packages need to fall into a bracket first before keep tagging rules are applied." ) ;
241
+
242
+ report . Add ( $ "Total packages in system:{ packageIds . Count } , no bracket match:{ ignoringNoBracketCount } , pruning:{ totalPrune } , keeping:{ totalKeep } .") ;
243
+
244
+ int totalHandled = totalKeep + totalPrune + ignoringNoBracketCount ;
245
+ if ( packageIds . Count != totalHandled )
246
+ report . Add ( $ "ERROR : Package handling count error, expected { packageIds . Count } , got { totalHandled } .") ;
223
247
224
248
return new PrunePlan {
225
249
Report = report ,
226
250
Brackets = processBrackets
227
251
} ;
228
252
}
229
253
254
+ private string FlattenList ( IEnumerable < object > packages )
255
+ {
256
+ if ( ! packages . Any ( ) )
257
+ return string . Empty ;
258
+
259
+ return $ " ({ string . Join ( "," , packages ) } )";
260
+ }
261
+
230
262
#endregion
231
263
}
232
264
}
0 commit comments