1
1
Fork 0
mirror of https://github.com/NixOS/nix.git synced 2025-11-26 04:00:59 +01:00

Removed collision-bug between repositorys, each group of repositorys and each individual repository has now a scannable unique hash

This commit is contained in:
Wouter den Breejen 2007-06-07 14:08:57 +00:00
parent 79d5604780
commit 01062b0563
7 changed files with 30 additions and 21 deletions

View file

@ -31,7 +31,7 @@ function subversionSingleStateDir {
excludelist=( "." ".." ".svn" ); excludelist=( "." ".." ".svn" );
cd $1; cd $1;
echo cd $1; #echo cd $1;
empty=$(ls) empty=$(ls)

View file

@ -473,9 +473,6 @@ static Expr prim_derivationStrict(EvalState & state, const ATermVector & args)
if(s[0] == '/' && s.length() != 1) if(s[0] == '/' && s.length() != 1)
s = s.substr(1, s.length()); s = s.substr(1, s.length());
if(s == stateRootRepos)
throw EvalError(format("The statedir `%1%' is a keyword and cannot be used, choose another name") % stateRootRepos);
dir.path = s; dir.path = s;
} }
else if (statekey == "type") { dir.type = s; } else if (statekey == "type") { dir.type = s; }

View file

@ -19,7 +19,6 @@ string nixSVNPath = "/UNINIT";
string nixConfDir = "/UNINIT"; string nixConfDir = "/UNINIT";
string nixLibexecDir = "/UNINIT"; string nixLibexecDir = "/UNINIT";
string nixBinDir = "/UNINIT"; string nixBinDir = "/UNINIT";
string stateRootRepos = "root_repos/";
bool keepFailed = false; bool keepFailed = false;
bool keepGoing = false; bool keepGoing = false;

View file

@ -75,9 +75,6 @@ extern string thisSystem;
infinity. */ infinity. */
extern unsigned int maxSilentTime; extern unsigned int maxSilentTime;
//TODO
extern string stateRootRepos;
Strings querySetting(const string & name, const Strings & def); Strings querySetting(const string & name, const Strings & def);
string querySetting(const string & name, const string & def); string querySetting(const string & name, const string & def);

View file

@ -31,14 +31,14 @@ bool isStorePath(const Path & path)
void assertStorePath(const Path & path) void assertStorePath(const Path & path)
{ {
if (!isStorePath(path)) if (!isStorePath(path))
throw Error(format("path `%1%' is not in the Nix store") % path); //TODO bug: this prints an empty path ... throw Error(format("path `%1%' is not in the Nix store (1)") % path); //TODO bug: this prints an empty path ...
} }
Path toStorePath(const Path & path) Path toStorePath(const Path & path)
{ {
if (!isInStore(path)) if (!isInStore(path))
throw Error(format("path `%1%' is not in the Nix store") % path); throw Error(format("path `%1%' is not in the Nix store (2)") % path);
Path::size_type slash = path.find('/', nixStore.size() + 1); Path::size_type slash = path.find('/', nixStore.size() + 1);
if (slash == Path::npos) if (slash == Path::npos)
return path; return path;
@ -102,10 +102,12 @@ Path makeStateReposPath(const string & type, const Path statePath, const string
//This is a little trick: we could use the same hash as the statepath, but we change it so the repository also gets a unique scannable hash //This is a little trick: we could use the same hash as the statepath, but we change it so the repository also gets a unique scannable hash
Hash hash = hashString(htSHA256, statePath); Hash hash = hashString(htSHA256, statePath);
//A little tick again, we dont want to add other repositorys in the root repository, so we rename it. //We also hash repository subfolders the prevent collisions
string subfolder_ = subfolder; if(subfolder.length() == 0)
if(subfolder == "") throw Error(format("Cannot create a repository for a subfolder without a name"));
subfolder_ = stateRootRepos;
string hash_subfolder = type + ":sha256:" + printHash(hash) + ":" + subfolder;
string subfolder_ = printHash32(compressHash(hashString(htSHA256, hash_subfolder), 20)) + "-" + subfolder;
string suffix_stateIdentifier = stateIdentifier; string suffix_stateIdentifier = stateIdentifier;
if(suffix_stateIdentifier != "") if(suffix_stateIdentifier != "")

View file

@ -22,6 +22,15 @@ void updatedStateDerivation(Path storePath)
//Create new repositorys, or use existing... //Create new repositorys, or use existing...
//createStateDirs already does that ... //createStateDirs already does that ...
printMsg(lvlError, format("Resetting state drv settings like repositorys"));
//Create a repository for this state location
//string repos = makeStateReposPath("stateOutput:staterepospath", stateDir, thisdir, drvName, stateIdentifier);
//executeAndPrintShellCommand("mkdir -p " + repos, "mkdir");
//executeAndPrintShellCommand(svnadminbin + " create " + repos, "svnadmin"); //TODO create as nixbld.nixbld chmod 700... can you still commit than ??
} }

View file

@ -39,16 +39,19 @@ Derivation getDerivation_andCheckArgs(Strings opFlags, Strings opArgs, Path & co
componentPath = fullPath.substr(0, pos + nixStore.size() + 1); componentPath = fullPath.substr(0, pos + nixStore.size() + 1);
binary = fullPath.substr(pos + nixStore.size() + 1, fullPath.size()); binary = fullPath.substr(pos + nixStore.size() + 1, fullPath.size());
//TODO CHECK for validity of componentPath ... ? //TODO REAL CHECK for validity of componentPath ... ?
//printMsg(lvlError, format("%1% - %2% - %3% - %4%") % componentPath % statePath % stateIdentifier % binary);
if(componentPath == "/nix/store")
throw UsageError("You must specify the full! binary path");
stateIdentifier = ""; stateIdentifier = "";
if(opArgs.size() == 2){ if(opArgs.size() == 2){
opArgs.pop_front(); opArgs.pop_front();
stateIdentifier = opArgs.front(); stateIdentifier = opArgs.front();
} }
//TODO check if this identifier exists !!!!!!!!!!!
//printMsg(lvlError, format("%1% - %2% - %3% - %4%") % componentPath % statePath % stateIdentifier % binary); //TODO check if this identifier exists !!!!!!!!!!!
Derivation drv = store->getStateDerivation(componentPath); Derivation drv = store->getStateDerivation(componentPath);
DerivationStateOutputs stateOutputs = drv.stateOutputs; DerivationStateOutputs stateOutputs = drv.stateOutputs;
@ -78,8 +81,10 @@ static void opShowStateReposRootPath(Strings opFlags, Strings opArgs)
string drvName = drv.env.find("name")->second; string drvName = drv.env.find("name")->second;
//Get the a repository for this state location //Get the a repository for this state location
string repos = makeStateReposPath("stateOutput:staterepospath", statePath, "", drvName, stateIdentifier); //this is a copy from store-state.cc string repos = makeStateReposPath("stateOutput:staterepospath", statePath, "/", drvName, stateIdentifier); //this is a copy from store-state.cc
repos = repos.substr(0, repos.length() - (stateRootRepos.length() + 1) );
//TODO Strip off
//repos = repos.substr(0, repos.length() - .... );
printMsg(lvlError, format("%1%") % repos); printMsg(lvlError, format("%1%") % repos);
} }
@ -93,7 +98,7 @@ static void opRunComponent(Strings opFlags, Strings opArgs)
Path statePath; Path statePath;
string stateIdentifier; string stateIdentifier;
string binary; string binary;
Derivation drv = getDerivation_andCheckArgs(opFlags, opArgs, componentPath, statePath, stateIdentifier, binary); Derivation drv = getDerivation_andCheckArgs(opFlags, opArgs, componentPath, statePath, stateIdentifier, binary);
DerivationStateOutputDirs stateOutputDirs = drv.stateOutputDirs; DerivationStateOutputDirs stateOutputDirs = drv.stateOutputDirs;
DerivationStateOutputs stateOutputs = drv.stateOutputs; DerivationStateOutputs stateOutputs = drv.stateOutputs;