* Validate derivation names. In particular don't allow spaces.
* Drop support for the outPath attribute in derivations.
This commit is contained in:
		
							parent
							
								
									8f58733ef1
								
							
						
					
					
						commit
						9994c1dd9f
					
				
					 1 changed files with 19 additions and 8 deletions
				
			
		| 
						 | 
					@ -181,7 +181,6 @@ static Expr primDerivation(EvalState & state, const ATermVector & _args)
 | 
				
			||||||
    ne.type = StoreExpr::neDerivation;
 | 
					    ne.type = StoreExpr::neDerivation;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    string drvName;
 | 
					    string drvName;
 | 
				
			||||||
    Path outPath;
 | 
					 | 
				
			||||||
    Hash outHash;
 | 
					    Hash outHash;
 | 
				
			||||||
    bool outHashGiven = false;
 | 
					    bool outHashGiven = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -217,7 +216,6 @@ static Expr primDerivation(EvalState & state, const ATermVector & _args)
 | 
				
			||||||
            if (key == "builder") ne.derivation.builder = s;
 | 
					            if (key == "builder") ne.derivation.builder = s;
 | 
				
			||||||
            else if (key == "system") ne.derivation.platform = s;
 | 
					            else if (key == "system") ne.derivation.platform = s;
 | 
				
			||||||
            else if (key == "name") drvName = s;
 | 
					            else if (key == "name") drvName = s;
 | 
				
			||||||
            else if (key == "outPath") outPath = s;
 | 
					 | 
				
			||||||
            else if (key == "id") { 
 | 
					            else if (key == "id") { 
 | 
				
			||||||
                outHash = parseHash(s);
 | 
					                outHash = parseHash(s);
 | 
				
			||||||
                outHashGiven = true;
 | 
					                outHashGiven = true;
 | 
				
			||||||
| 
						 | 
					@ -233,12 +231,25 @@ static Expr primDerivation(EvalState & state, const ATermVector & _args)
 | 
				
			||||||
    if (drvName == "")
 | 
					    if (drvName == "")
 | 
				
			||||||
        throw Error("required attribute `name' missing");
 | 
					        throw Error("required attribute `name' missing");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Determine the output path. */
 | 
					    /* Check the derivation name.  It shouldn't contain whitespace,
 | 
				
			||||||
 | 
					       but we are conservative here: we check whether only
 | 
				
			||||||
 | 
					       alphanumerics and some other characters appear. */
 | 
				
			||||||
 | 
					    string validChars = "+-._?=";
 | 
				
			||||||
 | 
					    for (string::iterator i = drvName.begin(); i != drvName.end(); ++i)
 | 
				
			||||||
 | 
					        if (!((*i >= 'A' && *i <= 'Z') ||
 | 
				
			||||||
 | 
					              (*i >= 'a' && *i <= 'z') ||
 | 
				
			||||||
 | 
					              (*i >= '0' && *i <= '9') ||
 | 
				
			||||||
 | 
					              validChars.find(*i) != string::npos))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            throw Error(format("invalid character `%1%' in derivation name `%2%'")
 | 
				
			||||||
 | 
					                % *i % drvName);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					    /* Determine the output path by hashing the Nix expression with no
 | 
				
			||||||
 | 
					       outputs to produce a unique but deterministic path name for
 | 
				
			||||||
 | 
					       this derivation. */
 | 
				
			||||||
    if (!outHashGiven) outHash = hashDerivation(state, ne);
 | 
					    if (!outHashGiven) outHash = hashDerivation(state, ne);
 | 
				
			||||||
    if (outPath == "")
 | 
					    Path outPath = canonPath(nixStore + "/" + 
 | 
				
			||||||
        /* Hash the Nix expression with no outputs to produce a
 | 
					 | 
				
			||||||
           unique but deterministic path name for this derivation. */
 | 
					 | 
				
			||||||
        outPath = canonPath(nixStore + "/" + 
 | 
					 | 
				
			||||||
        ((string) outHash).c_str() + "-" + drvName);
 | 
					        ((string) outHash).c_str() + "-" + drvName);
 | 
				
			||||||
    ne.derivation.env["out"] = outPath;
 | 
					    ne.derivation.env["out"] = outPath;
 | 
				
			||||||
    ne.derivation.outputs.insert(outPath);
 | 
					    ne.derivation.outputs.insert(outPath);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue