+// _createNewCrossSDK Private function to create a new Cross SDK
+func (s *SDKs) _createNewCrossSDK(sdk xsapiv1.SDK, scriptDir string, installing bool, force bool) (*CrossSDK, error) {
+
+ cSdk, err := NewCrossSDK(s.Context, sdk, scriptDir)
+ if err != nil {
+ return cSdk, err
+ }
+
+ // Allow to overwrite not installed SDK or when force is set
+ if _, exist := s.Sdks[cSdk.sdk.ID]; exist {
+ if !force && cSdk.sdk.Path != "" && common.Exists(cSdk.sdk.Path) {
+ return cSdk, fmt.Errorf("SDK ID %s already installed in %s", cSdk.sdk.ID, cSdk.sdk.Path)
+ }
+ if !force && cSdk.sdk.Status != xsapiv1.SdkStatusNotInstalled {
+ return cSdk, fmt.Errorf("Duplicate SDK ID %s (use force to overwrite)", cSdk.sdk.ID)
+ }
+ }
+
+ // Sanity check
+ errMsg := "Invalid SDK definition "
+ if installing && cSdk.sdk.Path == "" {
+ return cSdk, fmt.Errorf(errMsg + "(path not set)")
+ }
+ if installing && cSdk.sdk.URL == "" {
+ return cSdk, fmt.Errorf(errMsg + "(url not set)")
+ }
+
+ // Add to list
+ s.Sdks[cSdk.sdk.ID] = cSdk
+
+ return cSdk, err
+}
+
+// Stop SDKs management
+func (s *SDKs) Stop() {
+ close(s.stop)
+}
+
+// monitorSDKInstallation
+/* TODO: used it or cleanup
+import "github.com/zillode/notify"
+
+func (s *SDKs) monitorSDKInstallation(watchingDirs []string) {
+
+ // Set up a watchpoint listening for inotify-specific events
+ c := make(chan notify.EventInfo, 1)
+
+ addWatcher := func(rootDir string) error {
+ s.Log.Debugf("SDK Register watcher: rootDir=%s", rootDir)
+
+ if err := notify.Watch(rootDir+"/...", c, notify.Create, notify.Remove); err != nil {
+ return fmt.Errorf("SDK monitor: rootDir=%v err=%v", rootDir, err)
+ }
+ return nil
+ }
+
+ // Add directory watchers
+ for _, dir := range watchingDirs {
+ if err := addWatcher(dir); err != nil {
+ s.Log.Errorln(err.Error())
+ }
+ }
+
+ // Wait inotify or stop events
+ for {
+ select {
+ case <-s.stop:
+ s.Log.Debugln("Stop monitorSDKInstallation")
+ notify.Stop(c)
+ return
+ case ei := <-c:
+ s.LogSillyf("monitorSDKInstallation SDKs event %v, path %v\n", ei.Event(), ei.Path())
+
+ // Filter out all event that doesn't match environment file
+ if !strings.Contains(ei.Path(), "environment-setup-") {
+ continue
+ }
+ dir := path.Dir(ei.Path())
+
+ sdk, err := s.GetByPath(dir)
+ if err != nil {
+ s.Log.Warningf("Cannot find SDK path to notify creation")
+ s.LogSillyf("event: %v", ei.Event())
+ continue
+ }
+
+ switch ei.Event() {
+ case notify.Create:
+ sdkDef, err := GetSDKInfo(scriptDir, sdk.URL, "", "", s.Log)
+ if err != nil {
+ s.Log.Warningf("Cannot get sdk info: %v", err)
+ continue
+ }
+ sdk.Path = sdkDef.Path
+ sdk.Path = sdkDef.SetupFile
+
+ // Emit Folder state change event
+ if err := s.events.Emit(xsapiv1.EVTSDKAdd, sdk, ""); err != nil {
+ s.Log.Warningf("Cannot notify SDK install: %v", err)
+ }
+
+ case notify.Remove, notify.InMovedFrom:
+ // Emit Folder state change event
+ if err := s.events.Emit(xsapiv1.EVTSDKRemove, sdk, ""); err != nil {
+ s.Log.Warningf("Cannot notify SDK remove: %v", err)
+ }
+ }
+ }
+ }
+}
+*/
+