* 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…
	
	Add table
		Add a link
		
	
		Reference in a new issue