5JMO43B45WLRDAZJ4QIDFHSI7BVESV7CJ4BYXPJ5Q3MILZ23SECAC H46LUUZY3N7DDOIZFDZ7SJP76BICH4G6Z4SC7GBPMIKHW2JPZRTAC BTSZJ7W2DGNGOOBOMTTZTUOAQ3IYMCYZLT2MJ7C3UZX5KSOZ4ZVAC 5AIYUMTBY6TFQTBRP3MJ2PYWUMRF57I77NIVWYE74UMEVQMBWZVQC 73YR46NJNYZQKHA3QDJCAZYAKC2CGEF5LIS44NOIPDZU6FX6BDPQC BYVRA54QBKHLFOPIRBJKZZI7JYBYHSOK7MIA3TUZTALZQJGG3G7QC EFWDY2V7ILJBFQ6NADBESYZTPHQBXKNO5N4DPNABL7X4XMNNTNYAC SL3WSRACCX2IMJHHLTRAUQT7QDLCOKYLVO2FEHWIHXM5GPKSRJTQC EBJP3MNAC4CRYGMJJHMKUYWTXP3N4WMMORRLDSDHQVF5ZLOTIENQC FITVNQ2SVM6KSOF5P3HHWJYQ3WMQYDJGAONCBIZ7OF7CPXGMA36QC WV4SSAIYM4SVBQ2VISDTAXQJCPKRGTLSVFH44CQFEMC4COWG5OKQC UVNTWTWGQOFKDAJ2ROJYT4U2N4EUXKNWZWPHOM42WPLUL4ALXRJQC // FIXME: use Store::topoSortPaths().StorePaths topoSortPaths(const std::map<StorePath, ValidPathInfo> & paths){StorePaths sorted;StorePathSet visited;std::function<void(const StorePath & path)> dfsVisit;dfsVisit = [&](const StorePath & path) {if (!visited.insert(path).second) return;auto info = paths.find(path);auto references = info == paths.end() ? StorePathSet() : info->second.references;for (auto & i : references)/* Don't traverse into paths that don't exist. That canhappen due to substitutes for non-existent paths. */if (i != path && paths.count(i))dfsVisit(i);sorted.push_back(path);};for (auto & i : paths)dfsVisit(i.first);std::reverse(sorted.begin(), sorted.end());return sorted;}
totalNarSize += readLongLong(from);
info.narSize = readLongLong(from);totalNarSize += info.narSize;info.narHash = Hash(readString(from), htSHA256);info.ca = parseContentAddressOpt(readString(from));readStrings<StringSet>(from); // sigsinfos.insert_or_assign(info.path, info);
to << cmdExportPaths << 0;writeStorePaths(*localStore, to, outputs);to.flush();destStore->importPaths(from, /* result.accessor, */ NoCheckSigs);
auto pathsSorted = topoSortPaths(infos);for (auto & path : pathsSorted) {auto & info = infos.find(path)->second;to << cmdDumpStorePath << localStore->printStorePath(path);to.flush();destStore->addToStore(info, from);}