Browse code

builder: fix bugs when pruning buildkit cache with filters

Only the filters the user specified should be added as cache filters to buildkit.
Make an AND operation of the provided filters.
ID filter now does prefix-matching.

Signed-off-by: Tibor Vass <tibor@docker.com>

Tibor Vass authored on 2018/10/17 03:51:25
Showing 1 changed files
... ...
@@ -530,20 +530,26 @@ func toBuildkitPruneInfo(opts types.BuildCachePruneOptions) (client.PruneInfo, e
530 530
 
531 531
 	bkFilter := make([]string, 0, opts.Filters.Len())
532 532
 	for cacheField := range cacheFields {
533
-		values := opts.Filters.Get(cacheField)
534
-		switch len(values) {
535
-		case 0:
536
-			bkFilter = append(bkFilter, cacheField)
537
-		case 1:
538
-			bkFilter = append(bkFilter, cacheField+"=="+values[0])
539
-		default:
540
-			return client.PruneInfo{}, errMultipleFilterValues
533
+		if opts.Filters.Include(cacheField) {
534
+			values := opts.Filters.Get(cacheField)
535
+			switch len(values) {
536
+			case 0:
537
+				bkFilter = append(bkFilter, cacheField)
538
+			case 1:
539
+				if cacheField == "id" {
540
+					bkFilter = append(bkFilter, cacheField+"~="+values[0])
541
+				} else {
542
+					bkFilter = append(bkFilter, cacheField+"=="+values[0])
543
+				}
544
+			default:
545
+				return client.PruneInfo{}, errMultipleFilterValues
546
+			}
541 547
 		}
542 548
 	}
543 549
 	return client.PruneInfo{
544 550
 		All:          opts.All,
545 551
 		KeepDuration: unusedFor,
546 552
 		KeepBytes:    opts.KeepStorage,
547
-		Filter:       bkFilter,
553
+		Filter:       []string{strings.Join(bkFilter, ",")},
548 554
 	}, nil
549 555
 }