Allow builders to create activities
Actually, currently they can only create download activities. Thus, downloads by builtins.fetchurl show up in the progress bar.
This commit is contained in:
		
							parent
							
								
									4c6a26539c
								
							
						
					
					
						commit
						4af2611bd1
					
				
					 4 changed files with 77 additions and 8 deletions
				
			
		
							
								
								
									
										2
									
								
								local.mk
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								local.mk
									
										
									
									
									
								
							| 
						 | 
					@ -3,7 +3,7 @@ ifeq ($(MAKECMDGOALS), dist)
 | 
				
			||||||
  dist-files += $(shell git --git-dir=.git ls-files || find * -type f)
 | 
					  dist-files += $(shell git --git-dir=.git ls-files || find * -type f)
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dist-files += configure config.h.in nix.spec perl/configure
 | 
					dist-files += configure config.h.in nix.spec perl/configure src/nlohmann/json.hpp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
clean-files += Makefile.config
 | 
					clean-files += Makefile.config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -43,6 +43,8 @@ let
 | 
				
			||||||
          (cd perl ; autoreconf --install --force --verbose)
 | 
					          (cd perl ; autoreconf --install --force --verbose)
 | 
				
			||||||
          # TeX needs a writable font cache.
 | 
					          # TeX needs a writable font cache.
 | 
				
			||||||
          export VARTEXFONTS=$TMPDIR/texfonts
 | 
					          export VARTEXFONTS=$TMPDIR/texfonts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          cp -rv ${nlohmann_json}/include/nlohmann src/nlohmann
 | 
				
			||||||
        '';
 | 
					        '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        distPhase =
 | 
					        distPhase =
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,6 +18,7 @@ with import ./release-common.nix { inherit pkgs; };
 | 
				
			||||||
        customMemoryManagement = false;
 | 
					        customMemoryManagement = false;
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
      autoreconfHook
 | 
					      autoreconfHook
 | 
				
			||||||
 | 
					      nlohmann_json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # For nix-perl
 | 
					      # For nix-perl
 | 
				
			||||||
      perl
 | 
					      perl
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -55,6 +55,8 @@
 | 
				
			||||||
#include <sys/statvfs.h>
 | 
					#include <sys/statvfs.h>
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <nlohmann/json.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace nix {
 | 
					namespace nix {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -839,6 +841,8 @@ private:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    std::unique_ptr<Activity> act;
 | 
					    std::unique_ptr<Activity> act;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    std::map<ActivityId, Activity> builderActivities;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    DerivationGoal(const Path & drvPath, const StringSet & wantedOutputs,
 | 
					    DerivationGoal(const Path & drvPath, const StringSet & wantedOutputs,
 | 
				
			||||||
        Worker & worker, BuildMode buildMode = bmNormal);
 | 
					        Worker & worker, BuildMode buildMode = bmNormal);
 | 
				
			||||||
| 
						 | 
					@ -2390,6 +2394,34 @@ void setupSeccomp()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct BuilderLogger : Logger
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    Logger & prevLogger;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    BuilderLogger(Logger & prevLogger) : prevLogger(prevLogger) { }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void log(Verbosity lvl, const FormatOrString & fs) override
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        prevLogger.log(lvl, fs);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void startActivity(ActivityId act, ActivityType type, const std::string & s) override
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        log(lvlError, fmt("@nix {\"action\": \"start\", \"id\": %d, \"type\": %d, \"text\": \"%s\"}", act, type, s));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void stopActivity(ActivityId act) override
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        log(lvlError, fmt("@nix {\"action\": \"stop\", \"id\": %d}", act));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void progress(ActivityId act, uint64_t done = 0, uint64_t expected = 0, uint64_t running = 0, uint64_t failed = 0) override
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        log(lvlError, fmt("@nix {\"action\": \"progress\", \"id\": %d, \"done\": %d, \"expected\": %d, \"running\": %d, \"failed\": %d}", act, done, expected, running, failed));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void DerivationGoal::runChild()
 | 
					void DerivationGoal::runChild()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    /* Warning: in the child we should absolutely not make any SQLite
 | 
					    /* Warning: in the child we should absolutely not make any SQLite
 | 
				
			||||||
| 
						 | 
					@ -2796,6 +2828,7 @@ void DerivationGoal::runChild()
 | 
				
			||||||
        /* Execute the program.  This should not return. */
 | 
					        /* Execute the program.  This should not return. */
 | 
				
			||||||
        if (drv->isBuiltin()) {
 | 
					        if (drv->isBuiltin()) {
 | 
				
			||||||
            try {
 | 
					            try {
 | 
				
			||||||
 | 
					                logger = new BuilderLogger(*logger);
 | 
				
			||||||
                if (drv->builder == "builtin:fetchurl")
 | 
					                if (drv->builder == "builtin:fetchurl")
 | 
				
			||||||
                    builtinFetchurl(*drv, netrcData);
 | 
					                    builtinFetchurl(*drv, netrcData);
 | 
				
			||||||
                else
 | 
					                else
 | 
				
			||||||
| 
						 | 
					@ -3250,6 +3283,36 @@ void DerivationGoal::handleEOF(int fd)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void DerivationGoal::flushLine()
 | 
					void DerivationGoal::flushLine()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    if (hasPrefix(currentLogLine, "@nix ")) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            auto json = nlohmann::json::parse(std::string(currentLogLine, 5));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            std::string action = json["action"];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (action == "start") {
 | 
				
			||||||
 | 
					                auto type = (ActivityType) json["type"];
 | 
				
			||||||
 | 
					                if (type == actDownload)
 | 
				
			||||||
 | 
					                    builderActivities.emplace(std::piecewise_construct,
 | 
				
			||||||
 | 
					                        std::forward_as_tuple(json["id"]),
 | 
				
			||||||
 | 
					                        std::forward_as_tuple(*logger, type, json["text"]));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            else if (action == "stop")
 | 
				
			||||||
 | 
					                builderActivities.erase((ActivityId) json["id"]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            else if (action == "progress") {
 | 
				
			||||||
 | 
					                auto i = builderActivities.find((ActivityId) json["id"]);
 | 
				
			||||||
 | 
					                if (i != builderActivities.end())
 | 
				
			||||||
 | 
					                    i->second.progress(json.value("done", 0), json.value("expected", 0), json.value("running", 0), json.value("failed", 0));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        } catch (std::exception & e) {
 | 
				
			||||||
 | 
					            printError("bad log message from builder: %s", e.what());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
        if (settings.verboseBuild &&
 | 
					        if (settings.verboseBuild &&
 | 
				
			||||||
            (settings.printRepeatedBuilds || curRound == 1))
 | 
					            (settings.printRepeatedBuilds || curRound == 1))
 | 
				
			||||||
            printError(filterANSIEscapes(currentLogLine, true));
 | 
					            printError(filterANSIEscapes(currentLogLine, true));
 | 
				
			||||||
| 
						 | 
					@ -3257,7 +3320,10 @@ void DerivationGoal::flushLine()
 | 
				
			||||||
            logTail.push_back(currentLogLine);
 | 
					            logTail.push_back(currentLogLine);
 | 
				
			||||||
            if (logTail.size() > settings.logLines) logTail.pop_front();
 | 
					            if (logTail.size() > settings.logLines) logTail.pop_front();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        act->result(resBuildLogLine, currentLogLine);
 | 
					        act->result(resBuildLogLine, currentLogLine);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    currentLogLine = "";
 | 
					    currentLogLine = "";
 | 
				
			||||||
    currentLogLinePos = 0;
 | 
					    currentLogLinePos = 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue