88
99 "github.com/Sirupsen/logrus"
1010 "github.com/docker/docker/api/types"
11- derr "github.com/docker/docker/errors"
1211 "github.com/docker/docker/image"
1312 "github.com/docker/docker/pkg/graphdb"
1413 "github.com/docker/docker/pkg/nat"
@@ -136,64 +135,65 @@ func (daemon *Daemon) foldFilter(config *ContainersConfig) (*listContext, error)
136135 }
137136
138137 var filtExited []int
139- if i , ok := psFilters ["exited" ]; ok {
140- for _ , value := range i {
141- code , err := strconv .Atoi (value )
142- if err != nil {
143- return nil , err
144- }
145- filtExited = append (filtExited , code )
138+ err = psFilters .WalkValues ("exited" , func (value string ) error {
139+ code , err := strconv .Atoi (value )
140+ if err != nil {
141+ return err
146142 }
143+ filtExited = append (filtExited , code )
144+ return nil
145+ })
146+ if err != nil {
147+ return nil , err
147148 }
148149
149- if i , ok := psFilters ["status" ]; ok {
150- for _ , value := range i {
151- if ! isValidStateString (value ) {
152- return nil , errors .New ("Unrecognised filter value for status" )
153- }
154-
155- config .All = true
150+ err = psFilters .WalkValues ("status" , func (value string ) error {
151+ if ! isValidStateString (value ) {
152+ return fmt .Errorf ("Unrecognised filter value for status: %s" , value )
156153 }
154+
155+ config .All = true
156+ return nil
157+ })
158+ if err != nil {
159+ return nil , err
157160 }
158161
159162 var beforeContFilter , sinceContFilter * Container
160- if i , ok := psFilters ["before" ]; ok {
161- for _ , value := range i {
162- beforeContFilter , err = daemon .Get (value )
163- if err != nil {
164- return nil , err
165- }
166- }
163+ err = psFilters .WalkValues ("before" , func (value string ) error {
164+ beforeContFilter , err = daemon .Get (value )
165+ return err
166+ })
167+ if err != nil {
168+ return nil , err
167169 }
168170
169- if i , ok := psFilters ["since" ]; ok {
170- for _ , value := range i {
171- sinceContFilter , err = daemon .Get (value )
172- if err != nil {
173- return nil , err
174- }
175- }
171+ err = psFilters .WalkValues ("since" , func (value string ) error {
172+ sinceContFilter , err = daemon .Get (value )
173+ return err
174+ })
175+ if err != nil {
176+ return nil , err
176177 }
177178
178179 imagesFilter := map [image.ID ]bool {}
179180 var ancestorFilter bool
180- if ancestors , ok := psFilters [ "ancestor" ]; ok {
181+ if psFilters . Include ( "ancestor" ) {
181182 ancestorFilter = true
182- // The idea is to walk the graph down the most "efficient" way.
183- for _ , ancestor := range ancestors {
184- // First, get the imageId of the ancestor filter (yay)
183+ psFilters .WalkValues ("ancestor" , func (ancestor string ) error {
185184 id , err := daemon .GetImageID (ancestor )
186185 if err != nil {
187186 logrus .Warnf ("Error while looking up for image %v" , ancestor )
188- continue
187+ return nil
189188 }
190189 if imagesFilter [id ] {
191190 // Already seen this ancestor, skip it
192- continue
191+ return nil
193192 }
194193 // Then walk down the graph and put the imageIds in imagesFilter
195194 populateImageFilterByParents (imagesFilter , id , daemon .imageStore .Children )
196- }
195+ return nil
196+ })
197197 }
198198
199199 names := make (map [string ][]string )
@@ -202,14 +202,14 @@ func (daemon *Daemon) foldFilter(config *ContainersConfig) (*listContext, error)
202202 return nil
203203 }, 1 )
204204
205- if config .Before != "" {
205+ if config .Before != "" && beforeContFilter == nil {
206206 beforeContFilter , err = daemon .Get (config .Before )
207207 if err != nil {
208208 return nil , err
209209 }
210210 }
211211
212- if config .Since != "" {
212+ if config .Since != "" && sinceContFilter == nil {
213213 sinceContFilter , err = daemon .Get (config .Since )
214214 if err != nil {
215215 return nil , err
@@ -397,17 +397,8 @@ func (daemon *Daemon) Volumes(filter string) ([]*types.Volume, error) {
397397 return nil , err
398398 }
399399
400- filterUsed := false
401- if i , ok := volFilters ["dangling" ]; ok {
402- if len (i ) > 1 {
403- return nil , derr .ErrorCodeDanglingOne
404- }
405-
406- filterValue := i [0 ]
407- if strings .ToLower (filterValue ) == "true" || filterValue == "1" {
408- filterUsed = true
409- }
410- }
400+ filterUsed := volFilters .Include ("dangling" ) &&
401+ (volFilters .ExactMatch ("dangling" , "true" ) || volFilters .ExactMatch ("dangling" , "1" ))
411402
412403 volumes := daemon .volumes .List ()
413404 for _ , v := range volumes {
0 commit comments