From 15289ad2dc3f7ef8adffc58da6227ade216b4128 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Fri, 10 Oct 2025 13:23:07 +0200 Subject: [PATCH] client: Filters: add Clone method This method returns a deep-copy of the filter, which can be used in situations where the original filter must not be mutated, but additional filters need to be added for a specific request. Signed-off-by: Sebastiaan van Stijn --- client/filters.go | 13 +++++++++++ client/filters_test.go | 23 +++++++++++++++++++ vendor/github.com/moby/moby/client/filters.go | 13 +++++++++++ 3 files changed, 49 insertions(+) diff --git a/client/filters.go b/client/filters.go index ac9202e2c5..347ad5c689 100644 --- a/client/filters.go +++ b/client/filters.go @@ -30,6 +30,19 @@ func (f Filters) Add(term string, values ...string) Filters { return f } +// Clone returns a deep copy of f. +func (f Filters) Clone() Filters { + out := make(Filters, len(f)) + for term, values := range f { + inner := make(map[string]bool, len(values)) + for v, ok := range values { + inner[v] = ok + } + out[term] = inner + } + return out +} + // updateURLValues sets the "filters" key in values to the marshalled value of // f, replacing any existing values. When f is empty, any existing "filters" key // is removed. diff --git a/client/filters_test.go b/client/filters_test.go index 93c78097d3..18be15f8dd 100644 --- a/client/filters_test.go +++ b/client/filters_test.go @@ -46,3 +46,26 @@ func TestFilters_UpdateURLValues(t *testing.T) { Filters{"foo": map[string]bool{"bar": true}}.updateURLValues(v) assert.Check(t, is.DeepEqual(v, url.Values{"filters": []string{`{"foo":{"bar":true}}`}})) } + +func TestFilters_Clone(t *testing.T) { + f1 := make(Filters).Add("foo", "one") + f2 := f1.Clone() + + f2.Add("foo", "f2-extra").Add("f2", "f2-value") + assert.Check(t, is.DeepEqual(f1, Filters{"foo": {"one": true}})) + assert.Check(t, is.DeepEqual(f2, Filters{ + "foo": {"one": true, "f2-extra": true}, + "f2": {"f2-value": true}, + })) + + f1.Add("foo", "f1-extra").Add("f1", "f1-value") + assert.Check(t, is.DeepEqual(f1, Filters{ + "foo": {"one": true, "f1-extra": true}, + "f1": {"f1-value": true}, + })) + + assert.Check(t, is.DeepEqual(f2, Filters{ + "foo": {"one": true, "f2-extra": true}, + "f2": {"f2-value": true}, + })) +} diff --git a/vendor/github.com/moby/moby/client/filters.go b/vendor/github.com/moby/moby/client/filters.go index ac9202e2c5..347ad5c689 100644 --- a/vendor/github.com/moby/moby/client/filters.go +++ b/vendor/github.com/moby/moby/client/filters.go @@ -30,6 +30,19 @@ func (f Filters) Add(term string, values ...string) Filters { return f } +// Clone returns a deep copy of f. +func (f Filters) Clone() Filters { + out := make(Filters, len(f)) + for term, values := range f { + inner := make(map[string]bool, len(values)) + for v, ok := range values { + inner[v] = ok + } + out[term] = inner + } + return out +} + // updateURLValues sets the "filters" key in values to the marshalled value of // f, replacing any existing values. When f is empty, any existing "filters" key // is removed.