Merge pull request #997 from syncthing/lig

Minor fixes
This commit is contained in:
Jakob Borg 2014-11-23 11:35:19 +01:00
commit fe2ae4c6c3
4 changed files with 18 additions and 13 deletions

View File

@ -1004,6 +1004,9 @@ func (m *Model) AddFolder(cfg config.FolderConfiguration) {
m.deviceFolders[device.DeviceID] = append(m.deviceFolders[device.DeviceID], cfg.ID) m.deviceFolders[device.DeviceID] = append(m.deviceFolders[device.DeviceID], cfg.ID)
} }
ignores, _ := ignore.Load(filepath.Join(cfg.Path, ".stignore"), m.cfg.Options().CacheIgnoredFiles)
m.folderIgnores[cfg.ID] = ignores
m.addedFolder = true m.addedFolder = true
m.fmut.Unlock() m.fmut.Unlock()
} }

View File

@ -367,12 +367,13 @@ func (p *Puller) handleDir(file protocol.FileInfo) {
l.Debugf("need dir\n\t%v\n\t%v", file, curFile) l.Debugf("need dir\n\t%v\n\t%v", file, curFile)
} }
info, err := os.Stat(realName) info, err := os.Lstat(realName)
isLink, _ := symlinks.IsSymlink(realName)
switch { switch {
// There is already something under that name, but it's a file. // There is already something under that name, but it's a file/link.
// Most likely a file is getting replaced with a directory. // Most likely a file/link is getting replaced with a directory.
// Remove the file and fall through to directory creation. // Remove the file/link and fall through to directory creation.
case err == nil && !info.IsDir(): case isLink || (err == nil && !info.IsDir()):
err = osutil.InWritableDir(os.Remove, realName) err = osutil.InWritableDir(os.Remove, realName)
if err != nil { if err != nil {
l.Infof("Puller (folder %q, dir %q): %v", p.folder, file.Name, err) l.Infof("Puller (folder %q, dir %q): %v", p.folder, file.Name, err)
@ -792,7 +793,14 @@ func (p *Puller) finisherRoutine(in <-chan *sharedPullerState) {
} }
} }
// Replace the original file with the new one // If the target path is a symlink or a directory, we cannot copy
// over it, hence remove it before proceeding.
stat, err := os.Lstat(state.realName)
isLink, _ := symlinks.IsSymlink(state.realName)
if isLink || (err == nil && stat.IsDir()) {
osutil.InWritableDir(os.Remove, state.realName)
}
// Replace the original content with the new one
err = osutil.Rename(state.tempName, state.realName) err = osutil.Rename(state.tempName, state.realName)
if err != nil { if err != nil {
l.Warnln("puller: final:", err) l.Warnln("puller: final:", err)

View File

@ -16,7 +16,7 @@
// +build integration // +build integration
// This currently fails; it should be fixed // This currently fails; it should be fixed
package integration_test_disabled package integration_test
import ( import (
"log" "log"

View File

@ -191,8 +191,6 @@ func TestSymlinks(t *testing.T) {
} }
fd.Close() fd.Close()
/* Currently fails, to be fixed with #80
// Replace one with a directory // Replace one with a directory
err = os.Remove("s1/repDirLink") err = os.Remove("s1/repDirLink")
@ -204,7 +202,6 @@ func TestSymlinks(t *testing.T) {
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
*/
// Replace a file with a symlink // Replace a file with a symlink
@ -217,8 +214,6 @@ func TestSymlinks(t *testing.T) {
log.Fatal(err) log.Fatal(err)
} }
/* Currently fails, to be fixed with #80
// Replace a directory with a symlink // Replace a directory with a symlink
err = os.RemoveAll("s1/dirToReplace") err = os.RemoveAll("s1/dirToReplace")
@ -229,7 +224,6 @@ func TestSymlinks(t *testing.T) {
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
*/
// Sync these changes and recheck // Sync these changes and recheck