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

Fixed bugs, cleaned up some code

This commit is contained in:
Wouter den Breejen 2007-07-09 00:28:38 +00:00
parent afb445957d
commit bc2fbabc12
6 changed files with 74 additions and 57 deletions

View file

@ -10,6 +10,4 @@ if [ "$#" != 4 ] ; then
exit 1;
fi
cd $statepath
$svnbin merge -r HEAD:$torevision $repos
cd -
$svnbin merge -r HEAD:$torevision $repos $statepath

View file

@ -10,6 +10,4 @@ if [ "$#" != 4 ] ; then
exit 1;
fi
cd $statepath
$svnbin merge -r HEAD:$torevision $repos
cd -
$svnbin merge -r HEAD:$torevision $repos $statepath

View file

@ -546,8 +546,16 @@ bool Database::queryStateReferences(const Transaction & txn, TableId table,
Strings keys;
enumTable(txn, table, keys); //get all revisions
string key;
if(revision == -1){
//Check if this revision exists key in the table
string key = makeStatePathRevision(statePath, revision);
bool found = false;
for (Strings::const_iterator i = keys.begin(); i != keys.end(); ++i) {
if(key == *i)
found = true;
}
key = ""; //reset
if(revision == -1 || (!found)){
bool foundsomething = lookupHighestRevivison(keys, statePath, key);
if(!foundsomething)
return false;
@ -555,23 +563,18 @@ bool Database::queryStateReferences(const Transaction & txn, TableId table,
else
key = makeStatePathRevision(statePath, revision);
if(!found)
printMsg(lvlError, format("Warning: References for revision '%1%' not was not found, so taking the highest rev-key possible for statePath '%2%'") % revision % statePath);
return queryStrings(txn, table, key, references); //now that we have the key, we can query the references
}
bool Database::queryStateReferrers(const Transaction & txn, TableId table,
const Path & statePath, Strings & referrers, int revision)
{
//PathSet referrers;
Strings keys;
Path revisionedStatePath = makeStatePathRevision(statePath, revision);
enumTable(txn, table, keys, revisionedStatePath + string(1, (char) 0));
for (Strings::iterator i = keys.begin(); i != keys.end(); ++i)
printMsg(lvlError, format("queryStateReferrers %1%") % *i);
//referrers.insert(stripPrefix(storePath, *i));
return false;
//Exactly the same as queryStateReferences
return queryStateReferences(txn, table, statePath, referrers, revision);
}
@ -591,10 +594,8 @@ void Database::setStateRevisions(const Transaction & txn, TableId table,
sorted_revisions.push_back(revisions.at(*i));
//////////////////
for (vector<Path>::const_iterator i = sortedStatePaths.begin(); i != sortedStatePaths.end(); ++i){
for (vector<Path>::const_iterator i = sortedStatePaths.begin(); i != sortedStatePaths.end(); ++i)
printMsg(lvlError, format("Insert: %1% into %2%") % int2String(revisions.at(*i)) % *i);
}
//////////////////
//Convert the int's into Strings
@ -639,6 +640,9 @@ bool Database::queryStateRevisions(const Transaction & txn, TableId table,
revisions.push_back(getRevision);
}
if(!succeed)
throw Error(format("Revision '%1%' not found of statePath '%2%'") % int2String(revision) % statePath);
return succeed;
}

View file

@ -446,7 +446,7 @@ void setReferences(const Transaction & txn, const Path & store_or_statePath,
if (references.size() > 0 && !isRealisableComponentOrStatePath(txn, store_or_statePath))
throw Error(format("cannot set references for path `%1%' which is invalid and has no substitutes") % store_or_statePath);
printMsg(lvlError, format("Setting references for %1%") % store_or_statePath);
printMsg(lvlError, format("Setting references for %1% (revision:%2%)") % store_or_statePath % int2String(revision));
for (PathSet::iterator i = references.begin(); i != references.end(); ++i)
printMsg(lvlError, format("'%2%' has references: %1%") % *i % store_or_statePath);
for (PathSet::iterator i = stateReferences.begin(); i != stateReferences.end(); ++i)
@ -1598,8 +1598,6 @@ PathSet mergeNewDerivationIntoList(const Path & storepath, const Path & newdrv,
*/
void storePathRequisites(const Path & storeOrstatePath, const bool includeOutputs, PathSet & paths, const bool & withComponents, const bool & withState, const int revision)
{
//TODO !!!!!!!!!!!!!!!!!!!!!!!!!!!!
computeFSClosure(storeOrstatePath, paths, withComponents, withState, revision);
if (includeOutputs) {
@ -1752,9 +1750,6 @@ void scanAndUpdateAllReferencesTxn(const Transaction & txn, const Path & statePa
/*
Register Valid again if neccesary
update the extra references in a new table??? why???
(remember we need to keep the old as the basis, and things can change, the db is not consistent anymore then ....)
But we also dont want useless refereces ......
Update the 2 references tables: all state paths get: Path statepath --> List(int revnumber, List(References))
TODO EDIT TABLES references,references_state,referrers,referrers_state
@ -1783,9 +1778,9 @@ void scanAndUpdateAllReferencesTxn(const Transaction & txn, const Path & statePa
Hash(), //emtpy hash
state_references,
state_stateReferences,
drvPath);
}
*/
drvPath
);
}*/
}
void LocalStore::scanAndUpdateAllReferences(const Path & statePath)

View file

@ -260,35 +260,50 @@ static void revertToRevision(Strings opFlags, Strings opArgs)
bool recursive = true; //TODO !!!!!!!!!!!!!!!!!
//Insert the direct statePath or all recursive statePaths into the list
PathSet drvs;
if(recursive)
drvs = getAllStateDerivationsRecursively(componentPath, revision_arg); //get dependecies (if neccecary | recusively) of all state components that need to be updated
else
drvs.insert(derivationPath);
drvs.insert(derivationPath); //Insert direct state path
//Revert each statePath in the list
for (PathSet::iterator d = drvs.begin(); d != drvs.end(); ++d)
//Get the revisions recursively to also roll them back
RevisionNumbers getRivisions;
bool b = store->queryStateRevisions(statePath, getRivisions, revision_arg);
//Sort the statePaths from all drvs
map<Path, string> state_repos;
vector<Path> sorted_paths;
for (PathSet::iterator d = drvs.begin(); d != drvs.end(); ++d)
{
Path drvPath = *d;
Derivation drv = derivationFromPath(drvPath);
DerivationStateOutputs stateOutputs = drv.stateOutputs;
Path statePath = stateOutputs.find("state")->second.statepath;
string drvName = drv.env.find("name")->second;
RevisionNumbers getRivisions;
bool b = store->queryStateRevisions(statePath, getRivisions, revision_arg);
string drvName = drv.env.find("name")->second;
string repos = getStateReposPath("stateOutput:staterepospath", statePath, drvName, stateIdentifier); //this is a copy from store-state.cc
state_repos[statePath] = repos;
sorted_paths.push_back(statePath);
}
sort(sorted_paths.begin(), sorted_paths.end());
//Revert each statePath in the list
for (vector<Path>::iterator i = sorted_paths.begin(); i != sorted_paths.end(); ++i){
Path statePath = *i;
string repos = state_repos[statePath];
int revision = getRivisions.front();
getRivisions.pop_front();
printMsg(lvlError, format("Reverting statePath '%1%' to revision: %2%") % statePath % int2String(revision));
Strings p_args;
p_args.push_back(nixSVNPath + "/svn");
p_args.push_back(int2String(revision_arg));
p_args.push_back(int2String(revision));
p_args.push_back("file://" + repos);
p_args.push_back(statePath);
string output = runProgram(nixLibexecDir + "/nix/nix-restorerevision.sh", true, p_args); //run
runProgram_AndPrintOutput(nixLibexecDir + "/nix/nix-restorerevision.sh", true, p_args, "svn"); //run
printMsg(lvlError, format("Reverted statePath '%1%' to revision: %2%") % statePath % int2String(revision_arg));
//TODO !!!!!!!!!!!!!!!!!!!!! do a commit
//TODO !!!!!!!!!!!!!!!!!!!!! check if statePath is a working copy
}
}
@ -315,6 +330,7 @@ static void opRunComponent(Strings opFlags, Strings opArgs)
//get all current dependecies (if neccecary | recusively) of all state components that need to be updated
PathSet root_drvs = getAllStateDerivationsRecursively(root_componentPath, -1);
//TODO WHAT ABOUT YOURSELF??????????
//TODO maybe also scan the parameters for state or component hashes?
//program_args
@ -430,10 +446,10 @@ static void opRunComponent(Strings opFlags, Strings opArgs)
runProgram_AndPrintOutput(nixLibexecDir + "/nix/nix-statecommit.sh", true, p_args, "svn");
//Update the intervals again
//store->setStatePathsInterval(intervalPaths, intervals); //TODO!!!!!!!!!!!!!!!!!!!!!!
//store->setStatePathsInterval(intervalPaths, intervals); //TODO!!!!!!!!!!!!!!!!!!!!!! uncomment
//TODO
//Scan if needed
//Scan if needed //TODO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! needs a new revision number
if(false)
store->scanAndUpdateAllReferencesRecusively(statePath);

View file

@ -246,6 +246,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
bool includeOutputs = false;
bool forceRealise = false;
string bindingName;
int revision = -1; //last revision
for (Strings::iterator i = opFlags.begin();
i != opFlags.end(); ++i)
@ -274,6 +275,11 @@ static void opQuery(Strings opFlags, Strings opArgs)
else if (*i == "--use-output" || *i == "-u") useOutput = true;
else if (*i == "--force-realise" || *i == "-f") forceRealise = true;
else if (*i == "--include-outputs") includeOutputs = true;
else if ((*i).substr(0,11) == "--revision="){
bool succeed = string2Int((*i).substr(11,(*i).length()), revision);
if(!succeed)
throw UsageError("The given revision is not a valid number");
}
else throw UsageError(format("unknown flag `%1%'") % *i);
switch (query) {
@ -304,15 +310,15 @@ static void opQuery(Strings opFlags, Strings opArgs)
i != opArgs.end(); ++i)
{
Path path = maybeUseOutput(fixStoreOrStatePath(*i), useOutput, forceRealise);
if (query == qRequisites) store->storePathRequisites(path, includeOutputs, paths, true, false, -1);
else if (query == qRequisitesState) store->storePathRequisites(path, includeOutputs, paths, false, true, -1);
else if (query == qRequisitesFull) store->storePathRequisites(path, includeOutputs, paths, true, true, -1);
else if (query == qReferences) store->queryReferences(path, paths, -1);
else if (query == qStateReferences) store->queryStateReferences(path, paths, -1); //latest revision
else if (query == qReferrers) store->queryReferrers(path, paths, -1);
else if (query == qStateReferrers) store->queryStateReferrers(path, paths, -1); //latest revision
else if (query == qReferrersClosure) computeFSClosure(path, paths, true, false, -1, true);
else if (query == qReferrersClosureWithState) computeFSClosure(path, paths, true, true, -1, true);
if (query == qRequisites) store->storePathRequisites(path, includeOutputs, paths, true, false, revision);
else if (query == qRequisitesState) store->storePathRequisites(path, includeOutputs, paths, false, true, revision);
else if (query == qRequisitesFull) store->storePathRequisites(path, includeOutputs, paths, true, true, revision);
else if (query == qReferences) store->queryReferences(path, paths, revision);
else if (query == qStateReferences) store->queryStateReferences(path, paths, revision);
else if (query == qReferrers) store->queryReferrers(path, paths, revision);
else if (query == qStateReferrers) store->queryStateReferrers(path, paths, revision);
else if (query == qReferrersClosure) computeFSClosure(path, paths, true, false, revision, true);
else if (query == qReferrersClosureWithState) computeFSClosure(path, paths, true, true, revision, true);
}
Paths sorted = topoSortPaths(paths);
for (Paths::reverse_iterator i = sorted.rbegin();