From 8801e030b71f16d5cbef0ec0e0e67230f486d393 Mon Sep 17 00:00:00 2001 From: sophia Date: Mon, 14 Feb 2022 17:08:32 -0600 Subject: [PATCH] Get default synced folder type (cherry picked from commit cd6baafb9238a58e992519e0576565d1a57bf8f5) (but modified to work) --- internal/core/machine.go | 50 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/internal/core/machine.go b/internal/core/machine.go index b00bc0331..b521c69df 100644 --- a/internal/core/machine.go +++ b/internal/core/machine.go @@ -231,6 +231,49 @@ func StringToPathFunc() mapstructure.DecodeHookFunc { } } +func (m *Machine) defaultSyncedFolderType() (folderType *string, err error) { + // Get all available synced folder plugins + syncedFolders, err := m.project.basis.typeComponents(m.ctx, component.SyncedFolderType) + if err != nil { + return + } + + // Get all plugin components + syncedFoldersComponents := make([]*Component, 0, len(syncedFolders)) + for _, value := range syncedFolders { + syncedFoldersComponents = append(syncedFoldersComponents, value) + } + + // Sort by plugin priority. Higher is first + // TODO: reintroduce priority + // sort.SliceStable(syncedFoldersComponents, func(i, j int) bool { + // return syncedFoldersComponents[i].Info.Priority > syncedFoldersComponents[j].Info.Priority + // }) + + // Remove unallowed types + config := m.target.Configuration + machineConfig := config.ConfigVm + if machineConfig.AllowedSyncedFolderTypes != nil { + // TODO + } + + for _, component := range syncedFoldersComponents { + syncedFolder := component.Value.(core.SyncedFolder) + usable, err := syncedFolder.Usable(m) + if err != nil { + m.logger.Error("synced folder error on usable check", + "plugin", component.Info.Name, + "type", "SyncedFolder", + "error", err) + continue + } + if usable { + return &component.Info.Name, nil + } + } + return nil, fmt.Errorf("failed to detect guest plugin for current platform") +} + // SyncedFolders implements core.Machine func (m *Machine) SyncedFolders() (folders []*core.MachineSyncedFolder, err error) { config := m.target.Configuration @@ -239,10 +282,9 @@ func (m *Machine) SyncedFolders() (folders []*core.MachineSyncedFolder, err erro folders = []*core.MachineSyncedFolder{} for _, folder := range syncedFolders { - if folder.Type == nil { - // TODO: get default synced folder type - defaultType := "virtualbox" - folder.Type = &defaultType + folder.Type, err = m.defaultSyncedFolderType() + if err != nil { + return nil, err } lookup := "syncedfolder_" + *(folder.Type) v := m.cache.Get(lookup)