@@ -104,34 +104,61 @@ func (c *CacheChains) Add(dgst digest.Digest, deps [][]solver.CacheLink, results
104
104
}
105
105
}
106
106
items := IntersectAll (matchDeps )
107
- if len (items ) > 0 {
108
- if len (items ) > 1 {
109
- return nil , false , errors .Errorf ("TODO: multiple matching dependencies for %s: %v" , dgst , items ) // merge?
107
+
108
+ if len (items ) > 1 {
109
+ var main * item
110
+ for it := range items {
111
+ main = it
112
+ break
110
113
}
111
114
for it := range items {
112
- r = it
113
- for _ , rr := range results {
114
- r .addResult (rr )
115
- }
116
-
117
- // make sure that none of the deps are childeren of r
118
- allChildren := map [* item ]struct {}{}
119
- if err := r .walkChildren (func (i * item ) error {
120
- allChildren [i ] = struct {}{}
121
- return nil
122
- }, map [* item ]struct {}{}); err != nil {
123
- return nil , false , errors .Wrapf (err , "failed to walk children of %s" , dgst )
115
+ if it == main {
116
+ continue
124
117
}
125
- for i , dd := range deps {
126
- for j , d := range dd {
127
- if _ , ok := allChildren [d .Src .(* item )]; ok {
128
- deps [i ][j ].Src = nil
118
+ for l , m := range it .children {
119
+ for ch := range m {
120
+ main.children [l ][ch ] = struct {}{}
121
+ for i , links := range ch .parents {
122
+ newlinks := map [link ]struct {}{}
123
+ for l := range links {
124
+ if l .src == it {
125
+ l .src = main
126
+ }
127
+ newlinks [l ] = struct {}{}
128
+ }
129
+ main .parents [i ] = newlinks
129
130
}
130
131
}
131
132
}
133
+ for _ , rr := range it .results {
134
+ main .addResult (rr )
135
+ }
136
+ }
137
+ items = map [* item ]struct {}{main : {}}
138
+ }
132
139
133
- break
140
+ for it := range items {
141
+ r = it
142
+ for _ , rr := range results {
143
+ r .addResult (rr )
144
+ }
145
+
146
+ // make sure that none of the deps are childeren of r
147
+ allChildren := map [* item ]struct {}{}
148
+ if err := r .walkChildren (func (i * item ) error {
149
+ allChildren [i ] = struct {}{}
150
+ return nil
151
+ }, map [* item ]struct {}{}); err != nil {
152
+ return nil , false , errors .Wrapf (err , "failed to walk children of %s" , dgst )
134
153
}
154
+ for i , dd := range deps {
155
+ for j , d := range dd {
156
+ if _ , ok := allChildren [d .Src .(* item )]; ok {
157
+ deps [i ][j ].Src = nil
158
+ }
159
+ }
160
+ }
161
+ break
135
162
}
136
163
for i , dd := range deps {
137
164
for _ , d := range dd {
0 commit comments