forked from lix-project/lix
* In `--list-generations', show what the current generation is.
This commit is contained in:
parent
73ab2ed4fd
commit
b8675aee54
3 changed files with 30 additions and 13 deletions
|
@ -480,15 +480,17 @@ static void opListGenerations(Globals & globals,
|
||||||
if (opArgs.size() != 0)
|
if (opArgs.size() != 0)
|
||||||
throw UsageError(format("no arguments expected"));
|
throw UsageError(format("no arguments expected"));
|
||||||
|
|
||||||
Generations gens = findGenerations(globals.profile);
|
int curGen;
|
||||||
|
Generations gens = findGenerations(globals.profile, curGen);
|
||||||
|
|
||||||
for (Generations::iterator i = gens.begin(); i != gens.end(); ++i) {
|
for (Generations::iterator i = gens.begin(); i != gens.end(); ++i) {
|
||||||
tm t;
|
tm t;
|
||||||
if (!localtime_r(&i->creationTime, &t)) throw Error("cannot convert time");
|
if (!localtime_r(&i->creationTime, &t)) throw Error("cannot convert time");
|
||||||
cout << format("%|4| %|4|-%|02|-%|02| %|02|:%|02|:%|02|\n")
|
cout << format("%|4| %|4|-%|02|-%|02| %|02|:%|02|:%|02| %||\n")
|
||||||
% i->number
|
% i->number
|
||||||
% (t.tm_year + 1900) % (t.tm_mon + 1) % t.tm_mday
|
% (t.tm_year + 1900) % (t.tm_mon + 1) % t.tm_mday
|
||||||
% t.tm_hour % t.tm_min % t.tm_sec;
|
% t.tm_hour % t.tm_min % t.tm_sec
|
||||||
|
% (i->number == curGen ? "(current)" : "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,22 @@ static bool cmpGensByNumber(const Generation & a, const Generation & b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Generations findGenerations(Path profile)
|
/* Parse a generation name of the format
|
||||||
|
`<profilename>-<number>-link'. */
|
||||||
|
static int parseName(const string & profileName, const string & name)
|
||||||
|
{
|
||||||
|
if (string(name, 0, profileName.size() + 1) != profileName + "-") return -1;
|
||||||
|
string s = string(name, profileName.size() + 1);
|
||||||
|
int p = s.find("-link");
|
||||||
|
if (p == string::npos) return -1;
|
||||||
|
istringstream str(string(s, 0, p));
|
||||||
|
unsigned int n;
|
||||||
|
if (str >> n && str.eof()) return n; else return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Generations findGenerations(Path profile, int & curGen)
|
||||||
{
|
{
|
||||||
Generations gens;
|
Generations gens;
|
||||||
|
|
||||||
|
@ -20,13 +35,8 @@ Generations findGenerations(Path profile)
|
||||||
|
|
||||||
Strings names = readDirectory(profileDir);
|
Strings names = readDirectory(profileDir);
|
||||||
for (Strings::iterator i = names.begin(); i != names.end(); ++i) {
|
for (Strings::iterator i = names.begin(); i != names.end(); ++i) {
|
||||||
if (string(*i, 0, profileName.size() + 1) != profileName + "-") continue;
|
int n;
|
||||||
string s = string(*i, profileName.size() + 1);
|
if ((n = parseName(profileName, *i)) != -1) {
|
||||||
int p = s.find("-link");
|
|
||||||
if (p == string::npos) continue;
|
|
||||||
istringstream str(string(s, 0, p));
|
|
||||||
unsigned int n;
|
|
||||||
if (str >> n && str.eof()) {
|
|
||||||
Generation gen;
|
Generation gen;
|
||||||
gen.path = profileDir + "/" + *i;
|
gen.path = profileDir + "/" + *i;
|
||||||
gen.number = n;
|
gen.number = n;
|
||||||
|
@ -40,6 +50,10 @@ Generations findGenerations(Path profile)
|
||||||
|
|
||||||
gens.sort(cmpGensByNumber);
|
gens.sort(cmpGensByNumber);
|
||||||
|
|
||||||
|
curGen = pathExists(profile)
|
||||||
|
? parseName(profileName, readLink(profile))
|
||||||
|
: -1;
|
||||||
|
|
||||||
return gens;
|
return gens;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,7 +62,8 @@ Path createGeneration(Path profile, Path outPath, Path drvPath)
|
||||||
{
|
{
|
||||||
/* The new generation number should be higher than old the
|
/* The new generation number should be higher than old the
|
||||||
previous ones. */
|
previous ones. */
|
||||||
Generations gens = findGenerations(profile);
|
int dummy;
|
||||||
|
Generations gens = findGenerations(profile, dummy);
|
||||||
unsigned int num = gens.size() > 0 ? gens.front().number : 0;
|
unsigned int num = gens.size() > 0 ? gens.front().number : 0;
|
||||||
|
|
||||||
/* Create the new generation. */
|
/* Create the new generation. */
|
||||||
|
|
|
@ -18,7 +18,7 @@ typedef list<Generation> Generations;
|
||||||
|
|
||||||
/* Returns the list of currently present generations for the specified
|
/* Returns the list of currently present generations for the specified
|
||||||
profile, sorted by generation number. */
|
profile, sorted by generation number. */
|
||||||
Generations findGenerations(Path profile);
|
Generations findGenerations(Path profile, int & curGen);
|
||||||
|
|
||||||
Path createGeneration(Path profile, Path outPath, Path drvPath);
|
Path createGeneration(Path profile, Path outPath, Path drvPath);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue