Add readDir primop
This commit is contained in:
		
							parent
							
								
									3fd2d2187e
								
							
						
					
					
						commit
						c08c802bf3
					
				
					 1 changed files with 37 additions and 0 deletions
				
			
		|  | @ -800,6 +800,42 @@ static void prim_findFile(EvalState & state, const Pos & pos, Value * * args, Va | ||||||
|     mkPath(v, state.findFile(searchPath, path).c_str()); |     mkPath(v, state.findFile(searchPath, path).c_str()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /* Read a directory (without . or ..) */ | ||||||
|  | static void prim_readDir(EvalState & state, const Pos & pos, Value * * args, Value & v) | ||||||
|  | { | ||||||
|  |     PathSet ctx; | ||||||
|  |     Path path = state.coerceToPath(pos, *args[0], ctx); | ||||||
|  |     try { | ||||||
|  |         realiseContext(ctx); | ||||||
|  |     } catch (InvalidPathError & e) { | ||||||
|  |         throw EvalError(format("cannot read ‘%1%’, since path ‘%2%’ is not valid, at %3%") | ||||||
|  |             % path % e.path % pos); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     DirEntries entries = readDirectory(path); | ||||||
|  |     state.mkAttrs(v, entries.size()); | ||||||
|  | 
 | ||||||
|  |     for (const auto & ent : entries) { | ||||||
|  |         Value * ent_val = state.allocAttr(v, state.symbols.create(ent.name)); | ||||||
|  |         if (ent.type == DT_UNKNOWN) { | ||||||
|  |             struct stat st = lstat(path + "/" + ent.name); | ||||||
|  |             mkString(*ent_val, | ||||||
|  |                 S_ISREG(st.st_mode) ? "regular" : | ||||||
|  |                 S_ISDIR(st.st_mode) ? "directory" : | ||||||
|  |                 S_ISLNK(st.st_mode) ? "symlink" : | ||||||
|  |                 "unknown"); | ||||||
|  |         } else { | ||||||
|  |             mkString(*ent_val, | ||||||
|  |                 ent.type == DT_REG ? "regular" : | ||||||
|  |                 ent.type == DT_DIR ? "directory" : | ||||||
|  |                 ent.type == DT_LNK ? "symlink" : | ||||||
|  |                 "unknown"); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     v.attrs->sort(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| /*************************************************************
 | /*************************************************************
 | ||||||
|  * Creating files |  * Creating files | ||||||
|  | @ -1460,6 +1496,7 @@ void EvalState::createBaseEnv() | ||||||
|     addPrimOp("baseNameOf", 1, prim_baseNameOf); |     addPrimOp("baseNameOf", 1, prim_baseNameOf); | ||||||
|     addPrimOp("dirOf", 1, prim_dirOf); |     addPrimOp("dirOf", 1, prim_dirOf); | ||||||
|     addPrimOp("__readFile", 1, prim_readFile); |     addPrimOp("__readFile", 1, prim_readFile); | ||||||
|  |     addPrimOp("__readDir", 1, prim_readDir); | ||||||
|     addPrimOp("__findFile", 2, prim_findFile); |     addPrimOp("__findFile", 2, prim_findFile); | ||||||
| 
 | 
 | ||||||
|     // Creating files
 |     // Creating files
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue