27
27
import com .google .devtools .build .lib .actions .ActionOwner ;
28
28
import com .google .devtools .build .lib .actions .Artifact ;
29
29
import com .google .devtools .build .lib .actions .ArtifactExpander ;
30
+ import com .google .devtools .build .lib .actions .ExecException ;
31
+ import com .google .devtools .build .lib .actions .UserExecException ;
32
+ import com .google .devtools .build .lib .analysis .Runfiles .ConflictType ;
30
33
import com .google .devtools .build .lib .analysis .actions .AbstractFileWriteAction ;
31
34
import com .google .devtools .build .lib .analysis .actions .DeterministicWriter ;
32
35
import com .google .devtools .build .lib .analysis .starlark .UnresolvedSymlinkAction ;
35
38
import com .google .devtools .build .lib .collect .nestedset .Order ;
36
39
import com .google .devtools .build .lib .concurrent .ThreadSafety .Immutable ;
37
40
import com .google .devtools .build .lib .events .EventHandler ;
41
+ import com .google .devtools .build .lib .events .StoredEventHandler ;
42
+ import com .google .devtools .build .lib .server .FailureDetails ;
43
+ import com .google .devtools .build .lib .server .FailureDetails .FailureDetail ;
38
44
import com .google .devtools .build .lib .util .Fingerprint ;
39
45
import com .google .devtools .build .lib .vfs .PathFragment ;
40
46
import java .io .BufferedWriter ;
47
53
import java .util .Comparator ;
48
54
import java .util .List ;
49
55
import java .util .Map ;
56
+ import java .util .function .BiConsumer ;
50
57
import javax .annotation .Nullable ;
51
58
52
59
/**
@@ -199,9 +206,7 @@ public synchronized NestedSet<Artifact> getInputs() {
199
206
@ VisibleForTesting
200
207
public void writeOutputFile (OutputStream out , @ Nullable EventHandler eventHandler )
201
208
throws IOException {
202
- writeFile (
203
- out ,
204
- runfiles .getRunfilesInputs (eventHandler , getOwner ().getLocation (), repoMappingManifest ));
209
+ writeFile (out , runfiles .getRunfilesInputs (repoMappingManifest ));
205
210
}
206
211
207
212
/**
@@ -222,10 +227,33 @@ public String getStarlarkContent() throws IOException {
222
227
}
223
228
224
229
@ Override
225
- public DeterministicWriter newDeterministicWriter (ActionExecutionContext ctx ) {
226
- final Map <PathFragment , Artifact > runfilesInputs =
227
- runfiles .getRunfilesInputs (
228
- ctx .getEventHandler (), getOwner ().getLocation (), repoMappingManifest );
230
+ public DeterministicWriter newDeterministicWriter (ActionExecutionContext ctx )
231
+ throws ExecException {
232
+ StoredEventHandler eventHandler = new StoredEventHandler ();
233
+ BiConsumer <ConflictType , String > eventReceiver =
234
+ runfiles .eventRunfilesConflictReceiver (eventHandler , getOwner ().getLocation ());
235
+ boolean seenNestedRunfilesTree [] = new boolean [] {false };
236
+ BiConsumer <ConflictType , String > receiver =
237
+ (conflictType , message ) -> {
238
+ eventReceiver .accept (conflictType , message );
239
+ if (conflictType == ConflictType .NESTED_RUNFILES_TREE ) {
240
+ seenNestedRunfilesTree [0 ] = true ;
241
+ }
242
+ };
243
+
244
+ Map <PathFragment , Artifact > runfilesInputs =
245
+ runfiles .getRunfilesInputs (receiver , repoMappingManifest );
246
+ eventHandler .replayOn (ctx .getEventHandler ());
247
+ if (seenNestedRunfilesTree [0 ]) {
248
+ FailureDetail failureDetail =
249
+ FailureDetail .newBuilder ()
250
+ .setMessage ("Cannot create input manifest for runfiles tree" )
251
+ .setAnalysis (
252
+ FailureDetails .Analysis .newBuilder ()
253
+ .setCode (FailureDetails .Analysis .Code .INVALID_RUNFILES_TREE ))
254
+ .build ();
255
+ throw new UserExecException (failureDetail );
256
+ }
229
257
return out -> writeFile (out , runfilesInputs );
230
258
}
231
259
0 commit comments