Fix fatal "broken pipe" error when $NIX_BUILD_HOOK is missing
This commit is contained in:
		
							parent
							
								
									ffcf9d24a6
								
							
						
					
					
						commit
						2f992692e2
					
				
					 1 changed files with 38 additions and 26 deletions
				
			
		| 
						 | 
					@ -1580,37 +1580,49 @@ HookReply DerivationGoal::tryBuildHook()
 | 
				
			||||||
    if (!worker.hook)
 | 
					    if (!worker.hook)
 | 
				
			||||||
        worker.hook = std::make_unique<HookInstance>();
 | 
					        worker.hook = std::make_unique<HookInstance>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Tell the hook about system features (beyond the system type)
 | 
					    try {
 | 
				
			||||||
       required from the build machine.  (The hook could parse the
 | 
					 | 
				
			||||||
       drv file itself, but this is easier.) */
 | 
					 | 
				
			||||||
    Strings features = tokenizeString<Strings>(get(drv->env, "requiredSystemFeatures"));
 | 
					 | 
				
			||||||
    for (auto & i : features) checkStoreName(i); /* !!! abuse */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Send the request to the hook. */
 | 
					        /* Tell the hook about system features (beyond the system type)
 | 
				
			||||||
    writeLine(worker.hook->toHook.writeSide.get(), (format("%1% %2% %3% %4%")
 | 
					           required from the build machine.  (The hook could parse the
 | 
				
			||||||
        % (worker.getNrLocalBuilds() < settings.maxBuildJobs ? "1" : "0")
 | 
					           drv file itself, but this is easier.) */
 | 
				
			||||||
        % drv->platform % drvPath % concatStringsSep(",", features)).str());
 | 
					        Strings features = tokenizeString<Strings>(get(drv->env, "requiredSystemFeatures"));
 | 
				
			||||||
 | 
					        for (auto & i : features) checkStoreName(i); /* !!! abuse */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Read the first line of input, which should be a word indicating
 | 
					        /* Send the request to the hook. */
 | 
				
			||||||
       whether the hook wishes to perform the build. */
 | 
					        writeLine(worker.hook->toHook.writeSide.get(), (format("%1% %2% %3% %4%")
 | 
				
			||||||
    string reply;
 | 
					                % (worker.getNrLocalBuilds() < settings.maxBuildJobs ? "1" : "0")
 | 
				
			||||||
    while (true) {
 | 
					                % drv->platform % drvPath % concatStringsSep(",", features)).str());
 | 
				
			||||||
        string s = readLine(worker.hook->fromHook.readSide.get());
 | 
					
 | 
				
			||||||
        if (string(s, 0, 2) == "# ") {
 | 
					        /* Read the first line of input, which should be a word indicating
 | 
				
			||||||
            reply = string(s, 2);
 | 
					           whether the hook wishes to perform the build. */
 | 
				
			||||||
            break;
 | 
					        string reply;
 | 
				
			||||||
 | 
					        while (true) {
 | 
				
			||||||
 | 
					            string s = readLine(worker.hook->fromHook.readSide.get());
 | 
				
			||||||
 | 
					            if (string(s, 0, 2) == "# ") {
 | 
				
			||||||
 | 
					                reply = string(s, 2);
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            s += "\n";
 | 
				
			||||||
 | 
					            writeToStderr(s);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        s += "\n";
 | 
					
 | 
				
			||||||
        writeToStderr(s);
 | 
					        debug(format("hook reply is ‘%1%’") % reply);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (reply == "decline" || reply == "postpone")
 | 
				
			||||||
 | 
					            return reply == "decline" ? rpDecline : rpPostpone;
 | 
				
			||||||
 | 
					        else if (reply != "accept")
 | 
				
			||||||
 | 
					            throw Error(format("bad hook reply ‘%1%’") % reply);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } catch (SysError & e) {
 | 
				
			||||||
 | 
					        if (e.errNo == EPIPE) {
 | 
				
			||||||
 | 
					            printError("build hook died unexpectedly: %s",
 | 
				
			||||||
 | 
					                chomp(drainFD(worker.hook->fromHook.readSide.get())));
 | 
				
			||||||
 | 
					            worker.hook = 0;
 | 
				
			||||||
 | 
					            return rpDecline;
 | 
				
			||||||
 | 
					        } else
 | 
				
			||||||
 | 
					            throw;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    debug(format("hook reply is ‘%1%’") % reply);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (reply == "decline" || reply == "postpone")
 | 
					 | 
				
			||||||
        return reply == "decline" ? rpDecline : rpPostpone;
 | 
					 | 
				
			||||||
    else if (reply != "accept")
 | 
					 | 
				
			||||||
        throw Error(format("bad hook reply ‘%1%’") % reply);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    printMsg(lvlTalkative, format("using hook to build path(s) %1%") % showPaths(missingPaths));
 | 
					    printMsg(lvlTalkative, format("using hook to build path(s) %1%") % showPaths(missingPaths));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    hook = std::move(worker.hook);
 | 
					    hook = std::move(worker.hook);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue