mirror of
https://github.com/NixOS/nix.git
synced 2025-11-26 04:00:59 +01:00
the command /nixstate/nix/bin/nix-state --run /nix/store/sig2qgvaayydrwy5hn6b2dm5r2ayhv5s-hellohardcodedstateworld-1.0 now causes state to be checked and comitted
This commit is contained in:
parent
653e557e81
commit
25117fd165
10 changed files with 378 additions and 202 deletions
|
|
@ -4,7 +4,7 @@ bin_SCRIPTS = nix-collect-garbage \
|
||||||
nix-pack-closure nix-unpack-closure \
|
nix-pack-closure nix-unpack-closure \
|
||||||
nix-copy-closure
|
nix-copy-closure
|
||||||
|
|
||||||
noinst_SCRIPTS = nix-profile.sh generate-patches.pl find-runtime-roots.pl
|
noinst_SCRIPTS = nix-profile.sh generate-patches.pl find-runtime-roots.pl nix-statecommit.sh
|
||||||
|
|
||||||
nix-pull nix-push: readmanifest.pm readconfig.pm download-using-manifests.pl
|
nix-pull nix-push: readmanifest.pm readconfig.pm download-using-manifests.pl
|
||||||
|
|
||||||
|
|
@ -17,6 +17,7 @@ install-exec-local: readmanifest.pm download-using-manifests.pl find-runtime-roo
|
||||||
$(INSTALL_PROGRAM) download-using-manifests.pl $(DESTDIR)$(libexecdir)/nix
|
$(INSTALL_PROGRAM) download-using-manifests.pl $(DESTDIR)$(libexecdir)/nix
|
||||||
$(INSTALL_PROGRAM) find-runtime-roots.pl $(DESTDIR)$(libexecdir)/nix
|
$(INSTALL_PROGRAM) find-runtime-roots.pl $(DESTDIR)$(libexecdir)/nix
|
||||||
$(INSTALL_PROGRAM) generate-patches.pl $(DESTDIR)$(libexecdir)/nix
|
$(INSTALL_PROGRAM) generate-patches.pl $(DESTDIR)$(libexecdir)/nix
|
||||||
|
$(INSTALL_PROGRAM) nix-statecommit.sh $(DESTDIR)$(libexecdir)/nix
|
||||||
$(INSTALL) -d $(DESTDIR)$(sysconfdir)/nix
|
$(INSTALL) -d $(DESTDIR)$(sysconfdir)/nix
|
||||||
|
|
||||||
include ../substitute.mk
|
include ../substitute.mk
|
||||||
|
|
@ -32,4 +33,5 @@ EXTRA_DIST = nix-collect-garbage.in \
|
||||||
generate-patches.pl.in \
|
generate-patches.pl.in \
|
||||||
nix-pack-closure.in nix-unpack-closure.in \
|
nix-pack-closure.in nix-unpack-closure.in \
|
||||||
nix-copy-closure.in \
|
nix-copy-closure.in \
|
||||||
find-runtime-roots.pl.in
|
find-runtime-roots.pl.in \
|
||||||
|
nix-statecommit.sh.in
|
||||||
|
|
|
||||||
92
scripts/nix-statecommit.sh.in
Executable file
92
scripts/nix-statecommit.sh.in
Executable file
|
|
@ -0,0 +1,92 @@
|
||||||
|
#! /bin/sh
|
||||||
|
# we cant do a -e since ...
|
||||||
|
|
||||||
|
#check if there are enough arguments, if not, exit with an error
|
||||||
|
|
||||||
|
debug=""; #set to "" for no debugging, set to "echo " to debug the commands
|
||||||
|
|
||||||
|
if [ "$#" != 5 ] ; then
|
||||||
|
echo "Incorrect number of arguments"
|
||||||
|
exit 1;
|
||||||
|
fi
|
||||||
|
|
||||||
|
svnbin=$1
|
||||||
|
subversionedpaths=( $2 ) #arrays
|
||||||
|
subversionedpathsCommitBools=( $3 )
|
||||||
|
nonversionedpaths=( $4 )
|
||||||
|
checkouts=( $5 )
|
||||||
|
|
||||||
|
#echo svnbin: $svnbin
|
||||||
|
#echo subversionedpaths: $subversionedpaths
|
||||||
|
#echo subversionedpathsCommitBools: $subversionedpathsCommitBools
|
||||||
|
#echo nonversionedpaths: $nonversionedpaths
|
||||||
|
#echo checkouts: $checkouts
|
||||||
|
|
||||||
|
i=0
|
||||||
|
for path in ${subversionedpaths[@]}
|
||||||
|
do
|
||||||
|
if test -d $path; then
|
||||||
|
cd $path;
|
||||||
|
|
||||||
|
output=$($svnbin stat 2>&1 | grep "is not a working copy");
|
||||||
|
if [ "$output" != "" ] ; then #if the dir exists but is not yet an svn dir: create repos, if it doenst exits (is removed or something) than we dont do anything
|
||||||
|
$debug ${checkouts[$i]};
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${subversionedpathsCommitBools[$i]}" = "true" ]; then #Check if we need to commit this folder
|
||||||
|
|
||||||
|
echo "Entering $path"
|
||||||
|
|
||||||
|
allsubdirs=( $(echo *) ) #TODO, maybe also add hidden files starting with a '.' , but we dont want to add .svn dirs
|
||||||
|
|
||||||
|
subdirs=();
|
||||||
|
for subdir in ${allsubdirs[@]} #add all, exlucding explicity stated direct versioned-subdirs or explicity stated nonversioned-subdirs
|
||||||
|
do #this is only to prevent some warnings, ultimately we would like svn add to have a option 'exclude dirs'
|
||||||
|
subdir="$(pwd)/$subdir/";
|
||||||
|
exclude=0;
|
||||||
|
|
||||||
|
for svnp in ${subversionedpaths[@]} #check if the subdir is in the list of subverioned paths
|
||||||
|
do
|
||||||
|
if [ "$svnp" = "$subdir" ]; then
|
||||||
|
exclude=1;
|
||||||
|
#echo "exclude versioned $svnp"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
for nonvp in ${nonversionedpaths[@]} #check if the subdir is in the list of dirs that aren't supposed to be versioned
|
||||||
|
do
|
||||||
|
if [ "$nonvp" = "$subdir" ]; then
|
||||||
|
exclude=1;
|
||||||
|
#echo "exclude nonversioned $svnp"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ $exclude = 0 ]; then #Exclude the subdir if nessecary
|
||||||
|
subdirs[${#subdirs[*]}]=$subdir
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$subdirs" != "" ]; then
|
||||||
|
echo "adding ${subdirs[@]}"
|
||||||
|
$debug svn add ${subdirs[@]} #add all subdirs
|
||||||
|
|
||||||
|
for revpath in ${nonversionedpaths[@]} #We need to revert sub-sub* dirs, since these havent been excluded
|
||||||
|
do
|
||||||
|
if test -d $revpath; then
|
||||||
|
if [ "${revpath:0:${#path}}" == "$path" ]; then
|
||||||
|
echo "Revert $revpath";
|
||||||
|
$debug svn revert $revpath;
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
$debug svn -m "" commit; #Finally, we commit
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd - &> /dev/null;
|
||||||
|
fi
|
||||||
|
let "i+=1"
|
||||||
|
done
|
||||||
|
|
||||||
|
|
@ -42,7 +42,7 @@ struct DerivationStateOutput
|
||||||
string stateIdentifier; //the identifier
|
string stateIdentifier; //the identifier
|
||||||
string enabled; //enable or disable state
|
string enabled; //enable or disable state
|
||||||
string shared; //none, full, group
|
string shared; //none, full, group
|
||||||
string synchronization; //none (no locks), exclusive-lock-on-own-state-dir, exclusive-lock-on-all-(sub)-states-dir
|
string synchronization; //none (no locks), exclusive-lock, recursive-exclusive-lock
|
||||||
|
|
||||||
string commitReferences; //TODO none, direct, recursive-all
|
string commitReferences; //TODO none, direct, recursive-all
|
||||||
string commitBinaries; //TODO list of binaries that need (or not) to be committed when these binaries are called
|
string commitBinaries; //TODO list of binaries that need (or not) to be committed when these binaries are called
|
||||||
|
|
@ -54,6 +54,15 @@ struct DerivationStateOutput
|
||||||
}
|
}
|
||||||
DerivationStateOutput(Path statepath, string hashAlgo, string hash, string stateIdentifier, string enabled, string shared, string synchronization, string createDirsBeforeInstall, string runtimeStateParamters)
|
DerivationStateOutput(Path statepath, string hashAlgo, string hash, string stateIdentifier, string enabled, string shared, string synchronization, string createDirsBeforeInstall, string runtimeStateParamters)
|
||||||
{
|
{
|
||||||
|
if(shared != "none" || shared != "full" || shared != "group")
|
||||||
|
throw Error(format("shared '%1%' is not a correct type") % shared);
|
||||||
|
if(synchronization != "none" || synchronization != "exclusive-lock" || synchronization != "recursive-exclusive-lock")
|
||||||
|
throw Error(format("synchronization '%1%' is not a correct type") % synchronization);
|
||||||
|
|
||||||
|
//TODO
|
||||||
|
//commitReferences
|
||||||
|
//commitBinaries
|
||||||
|
|
||||||
this->statepath = statepath;
|
this->statepath = statepath;
|
||||||
this->hashAlgo = hashAlgo;
|
this->hashAlgo = hashAlgo;
|
||||||
this->hash = hash;
|
this->hash = hash;
|
||||||
|
|
@ -84,6 +93,9 @@ struct DerivationStateOutputDir
|
||||||
}
|
}
|
||||||
DerivationStateOutputDir(string path, string type, string interval)
|
DerivationStateOutputDir(string path, string type, string interval)
|
||||||
{
|
{
|
||||||
|
if(type != "none" || type != "manual" || type != "interval" || type != "full")
|
||||||
|
throw Error(format("interval '%1%' is not a correct type") % type);
|
||||||
|
|
||||||
this->path = path;
|
this->path = path;
|
||||||
this->type = type;
|
this->type = type;
|
||||||
this->interval = interval;
|
this->interval = interval;
|
||||||
|
|
|
||||||
|
|
@ -1140,7 +1140,12 @@ vector<int> getStatePathsInterval(const PathSet & statePaths)
|
||||||
for (PathSet::iterator i = statePaths.begin(); i != statePaths.end(); ++i)
|
for (PathSet::iterator i = statePaths.begin(); i != statePaths.end(); ++i)
|
||||||
{
|
{
|
||||||
nixDB.queryString(txn, dbStateCounters, *i, data);
|
nixDB.queryString(txn, dbStateCounters, *i, data);
|
||||||
printMsg(lvlError, format("Data %1%") % data); //TODO
|
|
||||||
|
//TODO check if every key returns a value from the db
|
||||||
|
|
||||||
|
int n;
|
||||||
|
if (!string2Int(data, n)) throw Error("number expected");
|
||||||
|
intervals.push_back(n);
|
||||||
|
|
||||||
}
|
}
|
||||||
txn.commit();
|
txn.commit();
|
||||||
|
|
|
||||||
|
|
@ -67,56 +67,5 @@ void createStateDirs(const DerivationStateOutputDirs & stateOutputDirs, const De
|
||||||
store->setStatePathsInterval(intervalPaths, empty, true);
|
store->setStatePathsInterval(intervalPaths, empty, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
//executes a shell command and captures and prints the output.
|
|
||||||
void executeAndPrintShellCommand(const string & command, const string & commandName)
|
|
||||||
{
|
|
||||||
string tempoutput = "svnoutput.txt";
|
|
||||||
string newcommand = command + " > " + tempoutput;
|
|
||||||
|
|
||||||
int kidstatus, deadpid;
|
|
||||||
pid_t kidpid = fork();
|
|
||||||
switch (kidpid) {
|
|
||||||
case -1:
|
|
||||||
throw SysError("unable to fork");
|
|
||||||
case 0:
|
|
||||||
try { // child
|
|
||||||
int rv = system(newcommand.c_str());
|
|
||||||
//int rv = execlp(svnbin.c_str(), svnbin.c_str(), ">", tempoutput.c_str(), NULL); //TODO make this work ... ?
|
|
||||||
|
|
||||||
string line;
|
|
||||||
std::ifstream myfile (tempoutput.c_str());
|
|
||||||
if (myfile.is_open()){
|
|
||||||
while (! myfile.eof() )
|
|
||||||
{
|
|
||||||
getline (myfile,line);
|
|
||||||
if(trim(line) != "")
|
|
||||||
printMsg(lvlError, format("[%2%]: %1%") % line % commandName);
|
|
||||||
}
|
|
||||||
myfile.close();
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
throw SysError("svn state error");
|
|
||||||
quickExit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rv == -1) {
|
|
||||||
throw SysError("svn state error");
|
|
||||||
quickExit(99);
|
|
||||||
}
|
|
||||||
quickExit(0);
|
|
||||||
|
|
||||||
} catch (std::exception & e) {
|
|
||||||
std::cerr << format("state child error: %1%\n") % e.what();
|
|
||||||
quickExit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
deadpid = waitpid(kidpid, &kidstatus, 0);
|
|
||||||
if (deadpid == -1) {
|
|
||||||
std::cerr << format("state child waitpid error\n");
|
|
||||||
quickExit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
remove(tempoutput.c_str()); //Remove the tempoutput file
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,8 @@
|
||||||
#include <cerrno>
|
#include <cerrno>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
|
|
@ -1008,4 +1010,59 @@ string trim(const string & s) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//executes a shell command and captures and prints the output.
|
||||||
|
|
||||||
|
//TODO , check if we can integrate with runProgram
|
||||||
|
|
||||||
|
void executeAndPrintShellCommand(const string & command, const string & commandName)
|
||||||
|
{
|
||||||
|
string tempoutput = "svnoutput.txt";
|
||||||
|
string newcommand = command + " &> " + tempoutput; //the &> sends also stderr to stdout
|
||||||
|
|
||||||
|
int kidstatus, deadpid;
|
||||||
|
pid_t kidpid = fork();
|
||||||
|
switch (kidpid) {
|
||||||
|
case -1:
|
||||||
|
throw SysError("unable to fork");
|
||||||
|
case 0:
|
||||||
|
try { // child
|
||||||
|
int rv = system(newcommand.c_str());
|
||||||
|
//int rv = execlp(svnbin.c_str(), svnbin.c_str(), ">", tempoutput.c_str(), NULL); //TODO make this work ... ?
|
||||||
|
|
||||||
|
string line;
|
||||||
|
std::ifstream myfile (tempoutput.c_str());
|
||||||
|
if (myfile.is_open()){
|
||||||
|
while (! myfile.eof() )
|
||||||
|
{
|
||||||
|
getline (myfile,line);
|
||||||
|
if(trim(line) != "")
|
||||||
|
printMsg(lvlError, format("[%2%]: %1%") % line % commandName);
|
||||||
|
}
|
||||||
|
myfile.close();
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
throw SysError("svn state error");
|
||||||
|
quickExit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rv == -1) {
|
||||||
|
throw SysError("svn state error");
|
||||||
|
quickExit(99);
|
||||||
|
}
|
||||||
|
quickExit(0);
|
||||||
|
|
||||||
|
} catch (std::exception & e) {
|
||||||
|
std::cerr << format("state child error: %1%\n") % e.what();
|
||||||
|
quickExit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
deadpid = waitpid(kidpid, &kidstatus, 0);
|
||||||
|
if (deadpid == -1) {
|
||||||
|
std::cerr << format("state child waitpid error\n");
|
||||||
|
quickExit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
remove(tempoutput.c_str()); //Remove the tempoutput file
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -290,6 +290,8 @@ string trimr(const string & s);
|
||||||
//return modified string s with spaces trimmed from edges
|
//return modified string s with spaces trimmed from edges
|
||||||
string trim(const string & s);
|
string trim(const string & s);
|
||||||
|
|
||||||
|
//excecute a shell command
|
||||||
|
void executeAndPrintShellCommand(const string & command, const string & commandName);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,8 +24,47 @@ void printHelp()
|
||||||
cout << string((char *) helpText, sizeof helpText);
|
cout << string((char *) helpText, sizeof helpText);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
static Derivation getDerivation_oneArgumentNoFlags(const Strings opFlags, const Strings opArgs)
|
||||||
|
{
|
||||||
|
if (!opFlags.empty()) throw UsageError("unknown flag");
|
||||||
|
if (opArgs.size() != 1) throw UsageError("only one argument allowed");
|
||||||
|
string path = *opArgs.begin();
|
||||||
|
string component = path; //TODO Parse
|
||||||
|
Path componentPath = component; //TODO call coerce function
|
||||||
|
return store->getStateDerivation(componentPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//********
|
||||||
|
|
||||||
|
|
||||||
|
static void opShowStatePath(Strings opFlags, Strings opArgs)
|
||||||
|
{
|
||||||
|
Derivation drv = getDerivation_oneArgumentNoFlags(opFlags, opArgs);
|
||||||
|
DerivationStateOutputs stateOutputs = drv.stateOutputs;
|
||||||
|
Path statePath = stateOutputs.find("state")->second.statepath;
|
||||||
|
printMsg(lvlError, format("%1%") % statePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void opShowStateReposRootPath(Strings opFlags, Strings opArgs)
|
||||||
|
{
|
||||||
|
Derivation drv = getDerivation_oneArgumentNoFlags(opFlags, opArgs);
|
||||||
|
DerivationStateOutputs stateOutputs = drv.stateOutputs;
|
||||||
|
Path statePath = stateOutputs.find("state")->second.statepath;
|
||||||
|
|
||||||
|
string drvName = drv.env.find("name")->second;
|
||||||
|
string stateIdentifier = stateOutputs.find("state")->second.stateIdentifier;
|
||||||
|
|
||||||
|
//Get the a repository for this state location
|
||||||
|
string repos = makeStateReposPath("stateOutput:staterepospath", statePath, "", drvName, stateIdentifier); //this is a copy from store-state.cc
|
||||||
|
repos = repos.substr(0, repos.length() - stateRootRepos.length());
|
||||||
|
|
||||||
|
printMsg(lvlError, format("%1%") % repos);
|
||||||
|
}
|
||||||
|
|
||||||
//Look up the references of all (runtime) dependencies that maintain have state
|
|
||||||
|
|
||||||
static void opCommitReferencesClosure(Strings opFlags, Strings opArgs)
|
static void opCommitReferencesClosure(Strings opFlags, Strings opArgs)
|
||||||
{
|
{
|
||||||
|
|
@ -40,9 +79,21 @@ static void opCommitReferencesClosure(Strings opFlags, Strings opArgs)
|
||||||
printMsg(lvlError, format("NIX-STATE: `%1%'") % *i);
|
printMsg(lvlError, format("NIX-STATE: `%1%'") % *i);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
|
//get the derivation of the current component
|
||||||
|
Derivation drv = getDerivation_oneArgumentNoFlags(opFlags, opArgs);
|
||||||
|
DerivationStateOutputDirs stateOutputDirs = drv.stateOutputDirs;
|
||||||
|
DerivationStateOutputs stateOutputs = drv.stateOutputs;
|
||||||
|
DerivationOutputs outputs = drv.outputs;
|
||||||
|
string drvName = drv.env.find("name")->second;
|
||||||
|
string stateIdentifier = stateOutputs.find("state")->second.stateIdentifier;
|
||||||
|
|
||||||
|
|
||||||
|
string path = *opArgs.begin();
|
||||||
|
|
||||||
//Data from user / profile
|
//Data from user / profile
|
||||||
string component = "/nix/store/s0g22b5lw693cjpclypkzan27d11v5pg-hellohardcodedstateworld-1.0";
|
string component = path; //TODO Parse
|
||||||
Path componentPath = component; //TODO call coerce function
|
Path componentPath = component; //TODO call coerce function
|
||||||
|
|
||||||
string identifier = "test";
|
string identifier = "test";
|
||||||
string binary = "hello";
|
string binary = "hello";
|
||||||
|
|
||||||
|
|
@ -53,45 +104,53 @@ static void opCommitReferencesClosure(Strings opFlags, Strings opArgs)
|
||||||
|
|
||||||
//********************* Commit state *********************
|
//********************* Commit state *********************
|
||||||
|
|
||||||
//get the derivation of the current component
|
|
||||||
Derivation drv = store->getStateDerivation(componentPath);
|
|
||||||
DerivationStateOutputDirs stateOutputDirs = drv.stateOutputDirs;
|
|
||||||
DerivationStateOutputs stateOutputs = drv.stateOutputs;
|
|
||||||
DerivationOutputs outputs = drv.outputs;
|
|
||||||
string drvName = drv.env.find("name")->second;
|
|
||||||
string stateIdentifier = stateOutputs.find("state")->second.stateIdentifier;
|
|
||||||
|
|
||||||
|
|
||||||
//get dependecies (if neccecary) of all state components that need to be updated
|
//get dependecies (if neccecary) of all state components that need to be updated
|
||||||
PathSet paths = store->getStateReferencesClosure(componentPath);
|
PathSet paths = store->getStateReferencesClosure(componentPath);
|
||||||
|
|
||||||
//get their derivations
|
//get their derivations
|
||||||
//...
|
//...
|
||||||
|
|
||||||
//Get and update the intervals
|
|
||||||
//store->getStatePathsInterval(a);
|
|
||||||
//store->setStatePathsInterval(a);
|
|
||||||
|
|
||||||
//call the bash script on all the the store-state components
|
//call the bash script on all the the store-state components
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//******************* Call the commit script (recursively)
|
||||||
|
|
||||||
|
//for(...){
|
||||||
|
//
|
||||||
|
//}
|
||||||
|
|
||||||
string svnbin = nixSVNPath + "/svn";
|
string svnbin = nixSVNPath + "/svn";
|
||||||
string svnadminbin = nixSVNPath + "/svnadmin";
|
string svnadminbin = nixSVNPath + "/svnadmin";
|
||||||
|
|
||||||
Path statePath = stateOutputs.find("state")->second.statepath;
|
Path statePath = stateOutputs.find("state")->second.statepath;
|
||||||
string stateDir = statePath;
|
|
||||||
|
|
||||||
//Vector includeing all commit scripts:
|
//Vector includeing all commit scripts:
|
||||||
vector<string> commitscript;
|
|
||||||
vector<string> subversionedpaths;
|
vector<string> subversionedpaths;
|
||||||
vector<int> subversionedpathsInterval;
|
vector<bool> subversionedpathsCommitBoolean;
|
||||||
vector<string> nonversionedpaths; //of type none, no versioning needed
|
vector<string> nonversionedpaths; //of type none, no versioning needed
|
||||||
vector<string> checkoutcommands;
|
vector<string> checkoutcommands;
|
||||||
|
|
||||||
|
//Get all the inverals from the database at once
|
||||||
|
PathSet intervalPaths;
|
||||||
for (DerivationStateOutputDirs::const_reverse_iterator i = stateOutputDirs.rbegin(); i != stateOutputDirs.rend(); ++i){
|
for (DerivationStateOutputDirs::const_reverse_iterator i = stateOutputDirs.rbegin(); i != stateOutputDirs.rend(); ++i){
|
||||||
DerivationStateOutputDir d = i->second;
|
DerivationStateOutputDir d = i->second;
|
||||||
|
|
||||||
string thisdir = d.path;
|
string thisdir = d.path;
|
||||||
string fullstatedir = stateDir + "/" + thisdir;
|
string fullstatedir = statePath + "/" + thisdir;
|
||||||
|
Path statePath = fullstatedir; //TODO call coerce function
|
||||||
|
|
||||||
|
if(d.type == "interval"){
|
||||||
|
intervalPaths.insert(statePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vector<int> intervals = store->getStatePathsInterval(intervalPaths);
|
||||||
|
|
||||||
|
int intervalAt=0;
|
||||||
|
for (DerivationStateOutputDirs::const_reverse_iterator i = stateOutputDirs.rbegin(); i != stateOutputDirs.rend(); ++i){
|
||||||
|
DerivationStateOutputDir d = i->second;
|
||||||
|
|
||||||
|
string thisdir = d.path;
|
||||||
|
string fullstatedir = statePath + "/" + thisdir;
|
||||||
Path statePath = fullstatedir; //TODO call coerce function
|
Path statePath = fullstatedir; //TODO call coerce function
|
||||||
|
|
||||||
if(d.type == "none"){
|
if(d.type == "none"){
|
||||||
|
|
@ -100,64 +159,69 @@ static void opCommitReferencesClosure(Strings opFlags, Strings opArgs)
|
||||||
}
|
}
|
||||||
|
|
||||||
//Get the a repository for this state location
|
//Get the a repository for this state location
|
||||||
string repos = makeStateReposPath("stateOutput:staterepospath", stateDir, thisdir, drvName, stateIdentifier); //this is a copy from store-state.cc
|
string repos = makeStateReposPath("stateOutput:staterepospath", statePath, thisdir, drvName, stateIdentifier); //this is a copy from store-state.cc
|
||||||
|
|
||||||
//
|
//
|
||||||
checkoutcommands.push_back(svnbin + " checkout file://" + repos + " " + fullstatedir);
|
checkoutcommands.push_back(svnbin + " checkout file://" + repos + " " + fullstatedir);
|
||||||
subversionedpaths.push_back(fullstatedir);
|
subversionedpaths.push_back(fullstatedir);
|
||||||
|
|
||||||
if(d.type == "interval"){
|
if(d.type == "interval"){
|
||||||
subversionedpathsInterval.push_back(d.getInterval());
|
|
||||||
|
//TODO comment
|
||||||
|
|
||||||
|
//Get the interval-counter from the database, and update it.
|
||||||
|
//printMsg(lvlError, format("Interval: %1% - %2%") % % );
|
||||||
|
|
||||||
|
int interval_counter = intervals[intervalAt];
|
||||||
|
int interval = d.getInterval();
|
||||||
|
|
||||||
|
subversionedpathsCommitBoolean.push_back(interval_counter % interval == 0);
|
||||||
|
|
||||||
|
//update the interval
|
||||||
|
intervals[intervalAt] = interval_counter + 1;
|
||||||
|
|
||||||
|
intervalAt++;
|
||||||
}
|
}
|
||||||
|
else if(d.type == "full")
|
||||||
|
subversionedpathsCommitBoolean.push_back(true);
|
||||||
|
else if(d.type == "manual") //TODO !!!!!
|
||||||
|
subversionedpathsCommitBoolean.push_back(false);
|
||||||
else
|
else
|
||||||
subversionedpathsInterval.push_back(0);
|
throw Error(format("interval '%1%' is not handled in nix-state") % d.type);
|
||||||
}
|
}
|
||||||
|
|
||||||
//create super commit script
|
//Update the intervals again
|
||||||
printMsg(lvlError, format("svnbin=%1%") % svnbin);
|
//store->setStatePathsInterval(intervalPaths, intervals); //TODO
|
||||||
string subversionedstatepathsarray = "subversionedpaths=( ";
|
|
||||||
|
//Call the commit script with the appropiate paramenters
|
||||||
|
string subversionedstatepathsarray;
|
||||||
for (vector<string>::iterator i = subversionedpaths.begin(); i != subversionedpaths.end(); ++i)
|
for (vector<string>::iterator i = subversionedpaths.begin(); i != subversionedpaths.end(); ++i)
|
||||||
{
|
{
|
||||||
subversionedstatepathsarray += *(i) + " ";
|
subversionedstatepathsarray += *(i) + " ";
|
||||||
}
|
}
|
||||||
printMsg(lvlError, format("%1%)") % subversionedstatepathsarray);
|
string subversionedpathsCommitBooleansarray;
|
||||||
string subversionedpathsIntervalsarray = "subversionedpathsInterval=( ";
|
for (vector<bool>::iterator i = subversionedpathsCommitBoolean.begin(); i != subversionedpathsCommitBoolean.end(); ++i)
|
||||||
for (vector<int>::iterator i = subversionedpathsInterval.begin(); i != subversionedpathsInterval.end(); ++i)
|
|
||||||
{
|
{
|
||||||
subversionedpathsIntervalsarray += int2String(*i) + " ";
|
subversionedpathsCommitBooleansarray += bool2string(*i) + " ";
|
||||||
}
|
}
|
||||||
printMsg(lvlError, format("%1%)") % subversionedpathsIntervalsarray);
|
string nonversionedstatepathsarray;
|
||||||
string nonversionedstatepathsarray = "nonversionedpaths=( ";
|
|
||||||
for (vector<string>::iterator i = nonversionedpaths.begin(); i != nonversionedpaths.end(); ++i)
|
for (vector<string>::iterator i = nonversionedpaths.begin(); i != nonversionedpaths.end(); ++i)
|
||||||
{
|
{
|
||||||
nonversionedstatepathsarray += *(i) + " ";
|
nonversionedstatepathsarray += *(i) + " ";
|
||||||
}
|
}
|
||||||
printMsg(lvlError, format("%1%)") % nonversionedstatepathsarray);
|
string commandsarray;
|
||||||
string commandsarray = "checkouts=( ";
|
|
||||||
for (vector<string>::iterator i = checkoutcommands.begin(); i != checkoutcommands.end(); ++i)
|
for (vector<string>::iterator i = checkoutcommands.begin(); i != checkoutcommands.end(); ++i)
|
||||||
{
|
{
|
||||||
commandsarray += "\"" + *(i) + "\" ";
|
commandsarray += "\\\"" + *(i) + "\\\" ";
|
||||||
}
|
|
||||||
printMsg(lvlError, format("%1%)") % commandsarray);
|
|
||||||
for (vector<string>::iterator i = commitscript.begin(); i != commitscript.end(); ++i)
|
|
||||||
{
|
|
||||||
string s = *(i);
|
|
||||||
printMsg(lvlError, format("%1%") % s);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//make the call
|
||||||
|
executeAndPrintShellCommand(nixLibexecDir + "/nix/nix-statecommit.sh " + svnbin +
|
||||||
//svnbin=/nix/var/nix/profiles/per-user/root/profile/bin/svn
|
" \"" + subversionedstatepathsarray + "\" " +
|
||||||
//subversionedpaths=( /nix/state/v6rr3yi5ilgn3k0kwxkk633ap4z0m1zi-hellohardcodedstateworld-1.0/ /nix/state/v6rr3yi5ilgn3k0kwxkk633ap4z0m1zi-hellohardcodedstateworld-1.0/log/ )
|
" \"" + subversionedpathsCommitBooleansarray + "\" " +
|
||||||
//subversionedpathsInterval=( 0 0 )
|
" \"" + nonversionedstatepathsarray + "\" " +
|
||||||
//nonversionedpaths=( /nix/state/v6rr3yi5ilgn3k0kwxkk633ap4z0m1zi-hellohardcodedstateworld-1.0/cache/ /nix/state/v6rr3yi5ilgn3k0kwxkk633ap4z0m1zi-hellohardcodedstateworld-1.0/log/test/ /nix/state/v6rr3yi5ilgn3k0kwxkk633ap4z0m1zi-hellohardcodedstateworld-1.0/log/test2/test2/ /nix/state/v6rr3yi5ilgn3k0kwxkk633ap4z0m1zi-hellohardcodedstateworld-1.0/logging/ )
|
" \"" + commandsarray + "\" ",
|
||||||
//checkouts=( "/nix/var/nix/profiles/per-user/root/profile/bin/svn checkout file:///nix/staterepos/99dj5zg1ginj5as75nkb0psnp02krv2s-hellohardcodedstateworld-1.0 /nix/state/v6rr3yi5ilgn3k0kwxkk633ap4z0m1zi-hellohardcodedstateworld-1.0/" "/nix/var/nix/profiles/per-user/root/profile/bin/svn checkout file:///nix/staterepos/9ph3nd4irpvgs66h24xjvxrwpnrwy9n0-hellohardcodedstateworld-1.0 /nix/state/v6rr3yi5ilgn3k0kwxkk633ap4z0m1zi-hellohardcodedstateworld-1.0/log/" )
|
"commit-script");
|
||||||
|
|
||||||
|
|
||||||
//for(...){
|
|
||||||
//
|
|
||||||
//}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -173,27 +237,18 @@ void run(Strings args)
|
||||||
|
|
||||||
if (arg == "--run" || arg == "-r")
|
if (arg == "--run" || arg == "-r")
|
||||||
op = opCommitReferencesClosure;
|
op = opCommitReferencesClosure;
|
||||||
|
else if (arg == "--showstatepath")
|
||||||
|
op = opShowStatePath;
|
||||||
|
else if (arg == "--showstatereposrootpath")
|
||||||
|
op = opShowStateReposRootPath;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
--commit
|
--commit
|
||||||
|
|
||||||
--run-without-commit
|
--run-without-commit
|
||||||
|
|
||||||
--backup
|
--backup
|
||||||
|
|
||||||
--showlocation
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
else if (arg == "--add" || arg == "-A")
|
|
||||||
op = opAdd;
|
|
||||||
else if (arg == "--add-fixed")
|
|
||||||
op = opAddFixed;
|
|
||||||
else if (arg == "--print-fixed-path")
|
|
||||||
op = opPrintFixedPath;
|
|
||||||
else if (arg[0] == '-')
|
|
||||||
opFlags.push_back(arg);
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|
|
||||||
80
src/nix-state/statecommit.sh
Executable file
80
src/nix-state/statecommit.sh
Executable file
|
|
@ -0,0 +1,80 @@
|
||||||
|
#! /bin/sh
|
||||||
|
|
||||||
|
#TODO EXCLUDE PATHS AND MAKE PARAMETERS AND STORE OBJECT!
|
||||||
|
#check if all needed ... exists, if not, exit with an error
|
||||||
|
|
||||||
|
svnbin=/nix/var/nix/profiles/per-user/root/profile/bin/svn
|
||||||
|
subversionedpaths=( /nix/state/v6rr3yi5ilgn3k0kwxkk633ap4z0m1zi-hellohardcodedstateworld-1.0/ /nix/state/v6rr3yi5ilgn3k0kwxkk633ap4z0m1zi-hellohardcodedstateworld-1.0/log/ )
|
||||||
|
subversionedpathsInterval=( 0 0 )
|
||||||
|
nonversionedpaths=( /nix/state/v6rr3yi5ilgn3k0kwxkk633ap4z0m1zi-hellohardcodedstateworld-1.0/cache/ /nix/state/v6rr3yi5ilgn3k0kwxkk633ap4z0m1zi-hellohardcodedstateworld-1.0/log/test/ /nix/state/v6rr3yi5ilgn3k0kwxkk633ap4z0m1zi-hellohardcodedstateworld-1.0/log/test2/test2/ /nix/state/v6rr3yi5ilgn3k0kwxkk633ap4z0m1zi-hellohardcodedstateworld-1.0/logging/ )
|
||||||
|
checkouts=( "/nix/var/nix/profiles/per-user/root/profile/bin/svn checkout file:///nix/staterepos/99dj5zg1ginj5as75nkb0psnp02krv2s-hellohardcodedstateworld-1.0 /nix/state/v6rr3yi5ilgn3k0kwxkk633ap4z0m1zi-hellohardcodedstateworld-1.0/" "/nix/var/nix/profiles/per-user/root/profile/bin/svn checkout file:///nix/staterepos/9ph3nd4irpvgs66h24xjvxrwpnrwy9n0-hellohardcodedstateworld-1.0 /nix/state/v6rr3yi5ilgn3k0kwxkk633ap4z0m1zi-hellohardcodedstateworld-1.0/log/" )
|
||||||
|
|
||||||
|
# if a dir exists, get his rev. number or check it out again (maybe the dir was deleted)
|
||||||
|
|
||||||
|
i=0
|
||||||
|
for path in ${subversionedpaths[@]}
|
||||||
|
do
|
||||||
|
if test -d $path; then
|
||||||
|
cd $path;
|
||||||
|
output=$($svnbin stat 2>&1 | grep "is not a working copy");
|
||||||
|
if [ "$output" != "" ] ; then #if the dir exists but is not yet an svn dir: create repos, if it doenst exits (is removed or something) than we dont do anything
|
||||||
|
${checkouts[$i]};
|
||||||
|
|
||||||
|
repos=$(svn info | grep "Repository Root" | sed 's/Repository Root: //'); # get the revision number of the repository
|
||||||
|
revision=$(svn info $repos | grep "Revision: " | sed 's/Revision: //');
|
||||||
|
interval=${subversionedpathsInterval[$i]};
|
||||||
|
|
||||||
|
#TODO BUG !!!!!!!! THE REVISION DOESNT GO UP WE NEED A DB CONNECTION OR A FILE TO HOLD A COUNTER ...!
|
||||||
|
|
||||||
|
if [ "$interval" = "0" ] || [ "$($revision % $interval)" = "0" ]; then # if we dont have an interval or the interval is due... commit
|
||||||
|
|
||||||
|
allsubdirs=( $(echo *) );
|
||||||
|
subdirs=();
|
||||||
|
for subdir in ${allsubdirs[@]} #add all, exlucding explicity stated direct versioned-subdirs or explicity stated nonversioned-subdirs
|
||||||
|
do #this is only to prevent some warnings, ultimately we would like svn add to have a option 'exclude dirs'
|
||||||
|
subdir="$(pwd)/$subdir/";
|
||||||
|
exclude=0;
|
||||||
|
|
||||||
|
for svnp in ${subversionedpaths[@]} #check if the subdir is in the list of subverioned paths
|
||||||
|
do
|
||||||
|
if [ "$svnp" = "$subdir" ]; then
|
||||||
|
exclude=1;
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
for nonvp in ${nonversionedpaths[@]} #check if the subdir is in the list of dirs that aren't supposed to be versioned
|
||||||
|
do
|
||||||
|
if [ "$nonvp" = "$subdir" ]; then
|
||||||
|
exclude=1;
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ $exclude = 0 ]; then #If it is ... that we exclude the subdir
|
||||||
|
subdirs[${#subdirs[*]}]=$subdir
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$subdirs" != "" ]; then
|
||||||
|
svn add $subdirs; #add all subdirs
|
||||||
|
|
||||||
|
for revpath in ${nonversionedpaths[@]} #We need to revert sub-sub* dirs, since these havent been excluded
|
||||||
|
do
|
||||||
|
if test -d $revpath; then
|
||||||
|
if [ "${revpath:0:${#path}}" == "$path" ]; then
|
||||||
|
#echo "$path revert $revpath";
|
||||||
|
svn revert $revpath;
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
svn -m "" commit; #Finally, we commit
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd - &> /dev/null;
|
||||||
|
fi
|
||||||
|
let "i+=1"
|
||||||
|
done
|
||||||
|
|
||||||
|
|
@ -1,78 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
|
|
||||||
#TODO EXCLUDE PATHS AND MAKE PARAMETERS AND STORE OBJECT!
|
|
||||||
|
|
||||||
svnbin=/nix/var/nix/profiles/per-user/root/profile/bin/svn
|
|
||||||
subversionedpaths=( /nix/state/v6rr3yi5ilgn3k0kwxkk633ap4z0m1zi-hellohardcodedstateworld-1.0/ /nix/state/v6rr3yi5ilgn3k0kwxkk633ap4z0m1zi-hellohardcodedstateworld-1.0/log/ )
|
|
||||||
subversionedpathsInterval=( 0 0 )
|
|
||||||
nonversionedpaths=( /nix/state/v6rr3yi5ilgn3k0kwxkk633ap4z0m1zi-hellohardcodedstateworld-1.0/cache/ /nix/state/v6rr3yi5ilgn3k0kwxkk633ap4z0m1zi-hellohardcodedstateworld-1.0/log/test/ /nix/state/v6rr3yi5ilgn3k0kwxkk633ap4z0m1zi-hellohardcodedstateworld-1.0/log/test2/test2/ /nix/state/v6rr3yi5ilgn3k0kwxkk633ap4z0m1zi-hellohardcodedstateworld-1.0/logging/ )
|
|
||||||
checkouts=( "/nix/var/nix/profiles/per-user/root/profile/bin/svn checkout file:///nix/staterepos/99dj5zg1ginj5as75nkb0psnp02krv2s-hellohardcodedstateworld-1.0 /nix/state/v6rr3yi5ilgn3k0kwxkk633ap4z0m1zi-hellohardcodedstateworld-1.0/" "/nix/var/nix/profiles/per-user/root/profile/bin/svn checkout file:///nix/staterepos/9ph3nd4irpvgs66h24xjvxrwpnrwy9n0-hellohardcodedstateworld-1.0 /nix/state/v6rr3yi5ilgn3k0kwxkk633ap4z0m1zi-hellohardcodedstateworld-1.0/log/" )
|
|
||||||
|
|
||||||
# if a dir exists, get his rev. number or check it out again (maybe the dir was deleted)
|
|
||||||
|
|
||||||
i=0
|
|
||||||
for path in ${subversionedpaths[@]}
|
|
||||||
do
|
|
||||||
if test -d $path; then
|
|
||||||
cd $path;
|
|
||||||
output=$($svnbin stat 2>&1 | grep "is not a working copy");
|
|
||||||
if [ "$output" != "" ] ; then #if dirs exists but is not yet an svn dir: create repos
|
|
||||||
${checkouts[$i]};
|
|
||||||
fi
|
|
||||||
|
|
||||||
repos=$(svn info | grep "Repository Root" | sed 's/Repository Root: //'); # get the revision number of the repository
|
|
||||||
revision=$(svn info $repos | grep "Revision: " | sed 's/Revision: //');
|
|
||||||
interval=${subversionedpathsInterval[$i]};
|
|
||||||
|
|
||||||
#TODO BUG !!!!!!!! THE REVISION DOESNT GO UP WE NEED A DB CONNECTION OR A FILE TO HOLD A COUNTER ...!
|
|
||||||
|
|
||||||
if [ "$interval" = "0" ] || [ "$($revision % $interval)" = "0" ]; then # if we dont have an interval or the interval is due... commit
|
|
||||||
|
|
||||||
allsubdirs=( $(echo *) );
|
|
||||||
subdirs=();
|
|
||||||
for subdir in ${allsubdirs[@]} #add all, exlucding explicity stated direct versioned-subdirs or explicity stated nonversioned-subdirs
|
|
||||||
do #this is only to prevent some warnings, ultimately we would like svn add to have a option 'exclude dirs'
|
|
||||||
subdir="$(pwd)/$subdir/";
|
|
||||||
exclude=0;
|
|
||||||
|
|
||||||
for svnp in ${subversionedpaths[@]}
|
|
||||||
do
|
|
||||||
if [ "$svnp" = "$subdir" ]; then
|
|
||||||
exclude=1;
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
for nonvp in ${nonversionedpaths[@]}
|
|
||||||
do
|
|
||||||
if [ "$nonvp" = "$subdir" ]; then
|
|
||||||
exclude=1;
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ $exclude = 0 ]; then
|
|
||||||
subdirs[${#subdirs[*]}]=$subdir
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ "$subdirs" != "" ]; then
|
|
||||||
svn add $subdirs;
|
|
||||||
|
|
||||||
for revpath in ${nonversionedpaths[@]} #revert sub-sub* dirs that havent been excluded
|
|
||||||
do
|
|
||||||
if test -d $revpath; then
|
|
||||||
if [ "${revpath:0:${#path}}" == "$path" ]; then
|
|
||||||
#echo "$path revert $revpath";
|
|
||||||
svn revert $revpath;
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
svn -m "" commit;
|
|
||||||
fi
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
cd - &> /dev/null;
|
|
||||||
fi
|
|
||||||
let "i+=1"
|
|
||||||
done
|
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue