vagrant/plugins/providers/virtualbox/action/clean_machine_folder.rb
Chris Roberts ea25996b21
Update Vagrant behavior outside of installers
Remove customized require behaviors and modify the bin executable
to check for missing tools that Vagrant expects to exist when
running outside of an installer.
2025-04-02 11:40:17 -07:00

55 lines
1.6 KiB
Ruby

# Copyright (c) HashiCorp, Inc.
# SPDX-License-Identifier: BUSL-1.1
require "fileutils"
module VagrantPlugins
module ProviderVirtualBox
module Action
# Cleans up the VirtualBox machine folder for any ".xml-prev"
# files which VirtualBox may have left over. This is a bug in
# VirtualBox. As soon as this is fixed, this middleware can and
# will be removed.
class CleanMachineFolder
def initialize(app, env)
@app = app
end
def call(env)
machine_folder = env[:machine].provider.driver.read_machine_folder
begin
clean_machine_folder(machine_folder)
rescue Errno::EPERM
raise Vagrant::Errors::MachineFolderNotAccessible,
name: env[:machine].name,
path: machine_folder
end
@app.call(env)
end
def clean_machine_folder(machine_folder)
folder = File.join(machine_folder, "*")
# Small safeguard against potentially unwanted rm-rf, since the default
# machine folder will typically always be greater than 10 characters long.
# For users with it < 10, out of luck?
return if folder.length < 10
Dir[folder].each do |f|
next unless File.directory?(f)
keep = Dir["#{f}/**/*"].find do |d|
# Find a file that doesn't have ".xml-prev" as the suffix,
# which signals that we want to keep this folder
File.file?(d) && !(File.basename(d) =~ /\.vbox-prev$/)
end
FileUtils.rm_rf(f) if !keep
end
end
end
end
end
end