X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=lib%2Fxdsserver%2Ffolders.go;h=5b3649e0fe9bb7e551bb813a3ac7d23de948c74f;hb=HEAD;hp=e36f84c41b5b7764f5f0236799ec737cf6eadd5e;hpb=2f7828d01f4c4ca2909f95f098627cd5475ed225;p=src%2Fxds%2Fxds-server.git diff --git a/lib/xdsserver/folders.go b/lib/xdsserver/folders.go index e36f84c..5b3649e 100644 --- a/lib/xdsserver/folders.go +++ b/lib/xdsserver/folders.go @@ -1,3 +1,20 @@ +/* + * Copyright (C) 2017-2018 "IoT.bzh" + * Author Sebastien Douheret + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package xdsserver import ( @@ -9,10 +26,10 @@ import ( "strings" "time" + common "gerrit.automotivelinux.org/gerrit/src/xds/xds-common.git" + "gerrit.automotivelinux.org/gerrit/src/xds/xds-server.git/lib/xdsconfig" + "gerrit.automotivelinux.org/gerrit/src/xds/xds-server.git/lib/xsapiv1" "github.com/franciscocpg/reflectme" - common "github.com/iotbzh/xds-common/golib" - "github.com/iotbzh/xds-server/lib/xsapiv1" - "github.com/iotbzh/xds-server/lib/xdsconfig" "github.com/syncthing/syncthing/lib/sync" ) @@ -34,8 +51,8 @@ type RegisteredCB struct { var fcMutex = sync.NewMutex() var ffMutex = sync.NewMutex() -// FoldersNew Create a new instance of Model Folders -func FoldersNew(ctx *Context) *Folders { +// FoldersConstructor Create a new instance of Model Folders +func FoldersConstructor(ctx *Context) *Folders { file, _ := xdsconfig.FoldersConfigFilenameGet() return &Folders{ Context: ctx, @@ -57,7 +74,9 @@ func (f *Folders) LoadConfig() error { f.Log.Infof("Use folder config file: %s", f.fileOnDisk) err := foldersConfigRead(f.fileOnDisk, &flds) if err != nil { - if strings.HasPrefix(err.Error(), "No folder config") { + if strings.HasPrefix(err.Error(), "EOF") { + f.Log.Warnf("Empty folder config file") + } else if strings.HasPrefix(err.Error(), "No folder config") { f.Log.Warnf(err.Error()) } else { return err @@ -160,7 +179,7 @@ func (f *Folders) ResolveID(id string) (string, error) { } else if len(match) == 0 { return id, fmt.Errorf("Unknown id") } - return id, fmt.Errorf("Multiple IDs found with provided prefix: " + id) + return id, fmt.Errorf("Multiple IDs found %v", match) } // Get returns the folder config or nil if not existing @@ -199,6 +218,7 @@ func (f *Folders) Add(newF xsapiv1.FolderConfig) (*xsapiv1.FolderConfig, error) // CreateUpdate creates or update a folder func (f *Folders) createUpdate(newF xsapiv1.FolderConfig, create bool, initial bool) (*xsapiv1.FolderConfig, error) { + var err error fcMutex.Lock() defer fcMutex.Unlock() @@ -252,12 +272,21 @@ func (f *Folders) createUpdate(newF xsapiv1.FolderConfig, create bool, initial b // Normalize path (needed for Windows path including bashlashes) newF.ClientPath = common.PathNormalize(newF.ClientPath) - // Add new folder - newFolder, err := fld.Add(newF) - if err != nil { - newF.Status = xsapiv1.StatusErrorConfig - log.Printf("ERROR Adding folder: %v\n", err) - return newFolder, err + var newFolder *xsapiv1.FolderConfig + if create { + // Add folder + if newFolder, err = fld.Add(newF); err != nil { + newF.Status = xsapiv1.StatusErrorConfig + log.Printf("ERROR Adding folder: %v\n", err) + return newFolder, err + } + } else { + // Just update project config + if newFolder, err = fld.Setup(newF); err != nil { + newF.Status = xsapiv1.StatusErrorConfig + log.Printf("ERROR Updating folder: %v\n", err) + return newFolder, err + } } // Add to folders list @@ -270,13 +299,6 @@ func (f *Folders) createUpdate(newF xsapiv1.FolderConfig, create bool, initial b } } - // Register event change callback - for _, rcb := range f.registerCB { - if err := fld.RegisterEventChange(rcb.cb, rcb.data); err != nil { - return newFolder, err - } - } - // Force sync after creation // (need to defer to be sure that WS events will arrive after HTTP creation reply) go func() { @@ -362,29 +384,6 @@ func (f *Folders) Update(id string, cfg xsapiv1.FolderConfig) (*xsapiv1.FolderCo return fld, err } -// RegisterEventChange requests registration for folder event change -func (f *Folders) RegisterEventChange(id string, cb *FolderEventCB, data *FolderEventCBData) error { - - flds := make(map[string]*IFOLDER) - if id != "" { - // Register to a specific folder - flds[id] = f.Get(id) - } else { - // Register to all folders - flds = f.folders - f.registerCB = append(f.registerCB, RegisteredCB{cb: cb, data: data}) - } - - for _, fld := range flds { - err := (*fld).RegisterEventChange(cb, data) - if err != nil { - return err - } - } - - return nil -} - // ForceSync Force the synchronization of a folder func (f *Folders) ForceSync(id string) error { fc := f.Get(id) @@ -408,8 +407,8 @@ func (f *Folders) IsFolderInSync(id string) (bool, error) { // Use XML format and not json to be able to save/load all fields including // ones that are masked in json (IOW defined with `json:"-"`) type xmlFolders struct { - XMLName xml.Name `xml:"folders"` - Version string `xml:"version,attr"` + XMLName xml.Name `xml:"folders"` + Version string `xml:"version,attr"` Folders []xsapiv1.FolderConfig `xml:"folders"` } @@ -431,6 +430,18 @@ func foldersConfigRead(file string, folders *[]xsapiv1.FolderConfig) error { data := xmlFolders{} err = xml.NewDecoder(fd).Decode(&data) if err == nil { + // Decode old type encoding (number) for backward compatibility + for i, d := range data.Folders { + switch d.Type { + case "1": + data.Folders[i].Type = xsapiv1.TypePathMap + case "2": + data.Folders[i].Type = xsapiv1.TypeCloudSync + case "3": + data.Folders[i].Type = xsapiv1.TypeCifsSmb + } + } + *folders = data.Folders } return err