* In `--list-generations', show what the current generation is.

This commit is contained in:
Eelco Dolstra 2004-02-06 16:16:55 +00:00
parent 73ab2ed4fd
commit b8675aee54
3 changed files with 30 additions and 13 deletions

View file

@ -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)" : "");
} }
} }

View file

@ -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. */

View file

@ -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);