RemoteStore: Propagate InvalidPath exceptions from the daemon
This commit is contained in:
		
							parent
							
								
									c0c4ddcd9c
								
							
						
					
					
						commit
						ddea253ff8
					
				
					 3 changed files with 28 additions and 9 deletions
				
			
		|  | @ -243,7 +243,18 @@ std::shared_ptr<ValidPathInfo> RemoteStore::queryPathInfoUncached(const Path & p | ||||||
| { | { | ||||||
|     auto conn(connections->get()); |     auto conn(connections->get()); | ||||||
|     conn->to << wopQueryPathInfo << path; |     conn->to << wopQueryPathInfo << path; | ||||||
|  |     try { | ||||||
|         conn->processStderr(); |         conn->processStderr(); | ||||||
|  |     } catch (Error & e) { | ||||||
|  |         // Ugly backwards compatibility hack.
 | ||||||
|  |         if (e.msg().find("is not valid") != std::string::npos) | ||||||
|  |             throw InvalidPath(e.what()); | ||||||
|  |         throw; | ||||||
|  |     } | ||||||
|  |     if (GET_PROTOCOL_MINOR(conn->daemonVersion) >= 17) { | ||||||
|  |         bool valid = readInt(conn->from) != 0; | ||||||
|  |         if (!valid) throw InvalidPath(format("path ‘%s’ is not valid") % path); | ||||||
|  |     } | ||||||
|     auto info = std::make_shared<ValidPathInfo>(); |     auto info = std::make_shared<ValidPathInfo>(); | ||||||
|     info->path = path; |     info->path = path; | ||||||
|     info->deriver = readString(conn->from); |     info->deriver = readString(conn->from); | ||||||
|  |  | ||||||
|  | @ -6,7 +6,7 @@ namespace nix { | ||||||
| #define WORKER_MAGIC_1 0x6e697863 | #define WORKER_MAGIC_1 0x6e697863 | ||||||
| #define WORKER_MAGIC_2 0x6478696f | #define WORKER_MAGIC_2 0x6478696f | ||||||
| 
 | 
 | ||||||
| #define PROTOCOL_VERSION 0x110 | #define PROTOCOL_VERSION 0x111 | ||||||
| #define GET_PROTOCOL_MAJOR(x) ((x) & 0xff00) | #define GET_PROTOCOL_MAJOR(x) ((x) & 0xff00) | ||||||
| #define GET_PROTOCOL_MINOR(x) ((x) & 0x00ff) | #define GET_PROTOCOL_MINOR(x) ((x) & 0x00ff) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -495,15 +495,23 @@ static void performOp(ref<LocalStore> store, bool trusted, unsigned int clientVe | ||||||
| 
 | 
 | ||||||
|     case wopQueryPathInfo: { |     case wopQueryPathInfo: { | ||||||
|         Path path = readStorePath(from); |         Path path = readStorePath(from); | ||||||
|  |         std::shared_ptr<const ValidPathInfo> info; | ||||||
|         startWork(); |         startWork(); | ||||||
|         auto info = store->queryPathInfo(path); |         try { | ||||||
|  |             info = store->queryPathInfo(path); | ||||||
|  |         } catch (InvalidPath &) { | ||||||
|  |             if (GET_PROTOCOL_MINOR(clientVersion) < 17) throw; | ||||||
|  |         } | ||||||
|         stopWork(); |         stopWork(); | ||||||
|         to << info->deriver << printHash(info->narHash) << info->references |         if (info) { | ||||||
|  |             to << 1 << info->deriver << printHash(info->narHash) << info->references | ||||||
|                << info->registrationTime << info->narSize; |                << info->registrationTime << info->narSize; | ||||||
|             if (GET_PROTOCOL_MINOR(clientVersion) >= 16) { |             if (GET_PROTOCOL_MINOR(clientVersion) >= 16) { | ||||||
|                 to << info->ultimate |                 to << info->ultimate | ||||||
|                    << info->sigs; |                    << info->sigs; | ||||||
|             } |             } | ||||||
|  |         } else | ||||||
|  |             to << 0; | ||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue