A bit late to the party, but I just tried #12653 and noticed some non-intuitive behavior (on macOS), that's probably worth explaining release notes and help.

Before this new feature I kept the entire datadir on an SSD drive, so I launch with: `bitcoind -datadir=/Volumes/SSD/Bitcoin`.

Initially I naively moved `/Volumes/SSD/Bitcoin/blocks` to `/Users/bitcoin/blocks` and added a line to `/Volumes/SSD/Bitcoin/bitcoin.conf`: `blocksdir=/Users/bitcoin/blocks`.

I then realized that I shouldn't have moved the `index` subdirectory, so I moved that back to `/Volumes/SSD/Bitcoin/blocks/index`. Having an empty `blocks` dir with just and `index` subdir is a bit weird. Perhaps after @jimpo's #11857 is merged, we could just move / assume all indexes to be there (if `-blocksdir` is set)?

Worse, it created a directory `/Users/bitcoin/blocks/blocks`, which seems like a bug. I had to set `blocksdir=/Users/bitcoin` instead.
if (fPruneMode) {
        LogPrintf("Unsetting NODE_NETWORK on prune mode\n");
        nLocalServices = ServiceFlags(nLocalServices & ~NODE_NETWORK);
        if (!fReindex) {
            uiInterface.InitMessage(_("Pruning blockstore..."));
            PruneAndFlush();
        }
    }
    if (chainparams.GetConsensus().vDeployments[Consensus::DEPLOYMENT_SEGWIT].nTimeout != 0) {
        
        
        
        
        
        nLocalServices = ServiceFlags(nLocalServices | NODE_WITNESS);
    }
    
    if (!CheckDiskSpace() && !CheckDiskSpace(0, true))
        return false;
    
    
    if (chainActive.Tip() == nullptr) {
        uiInterface.NotifyBlockTip_connect(BlockNotifyGenesisWait);
    } else {
        fHaveGenesis = true;
    }
    if (gArgs.IsArgSet("-blocknotify"))
        uiInterface.NotifyBlockTip_connect(BlockNotifyCallback);
    std::vector<fs::path> vImportFiles;
    for (const std::string& strFile : gArgs.GetArgs("-loadblock")) {