Scrap IsSymlink for native support on Go 1.4

Obviously needs Go 1.4 to go back in.

I am still open to doing fix-up's on rescan interval on Windows, which
would still allow getting rid of all the Windows code.

Frankly, we could just defer creations of links (like we defer deletions of files)
in hopes that the target gets created, and if it doesn't, well tough luck, you'll
get a file symlink.

To be honest, nobody would even notice this 'issue' as I am sure nobody on
Windows uses symlinks.

But at the same time, this ugly code is hidden away in some creppy file in
it's own module far far away, and the interface that it exports is fine'ish,
so I wouldn't mind keeping it as it is.
This commit is contained in:
Audrius Butkevicius 2014-12-04 23:02:57 +00:00
parent 7f97037190
commit 604a4e7dbc
4 changed files with 6 additions and 32 deletions

View File

@ -373,12 +373,11 @@ func (p *Puller) handleDir(file protocol.FileInfo) {
} }
info, err := os.Lstat(realName) info, err := os.Lstat(realName)
isLink, _ := symlinks.IsSymlink(realName)
switch { switch {
// There is already something under that name, but it's a file/link. // There is already something under that name, but it's a file/link.
// Most likely a file/link is getting replaced with a directory. // Most likely a file/link is getting replaced with a directory.
// Remove the file/link and fall through to directory creation. // Remove the file/link and fall through to directory creation.
case isLink || (err == nil && !info.IsDir()): case err == nil && (!info.IsDir() || info.Mode()&os.ModeSymlink != 0):
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)
@ -795,8 +794,7 @@ func (p *Puller) performFinish(state *sharedPullerState) {
// If the target path is a symlink or a directory, we cannot copy // If the target path is a symlink or a directory, we cannot copy
// over it, hence remove it before proceeding. // over it, hence remove it before proceeding.
stat, err := os.Lstat(state.realName) stat, err := os.Lstat(state.realName)
isLink, _ := symlinks.IsSymlink(state.realName) if err == nil && (stat.IsDir() || stat.Mode()&os.ModeSymlink != 0) {
if isLink || (err == nil && stat.IsDir()) {
osutil.InWritableDir(os.Remove, state.realName) osutil.InWritableDir(os.Remove, state.realName)
} }
// Replace the original content with the new one // Replace the original content with the new one

View File

@ -131,12 +131,9 @@ func (w *Walker) walkAndHashFiles(fchan chan protocol.FileInfo) filepath.WalkFun
return nil return nil
} }
// We must perform this check, as symlinks on Windows are always
// .IsRegular or .IsDir unlike on Unix.
// Index wise symlinks are always files, regardless of what the target // Index wise symlinks are always files, regardless of what the target
// is, because symlinks carry their target path as their content. // is, because symlinks carry their target path as their content.
isSymlink, _ := symlinks.IsSymlink(p) if info.Mode()&os.ModeSymlink != 0 {
if isSymlink {
var rval error var rval error
// If the target is a directory, do NOT descend down there. // If the target is a directory, do NOT descend down there.
// This will cause files to get tracked, and removing the symlink // This will cause files to get tracked, and removing the symlink
@ -199,7 +196,7 @@ func (w *Walker) walkAndHashFiles(fchan chan protocol.FileInfo) filepath.WalkFun
if w.CurrentFiler != nil { if w.CurrentFiler != nil {
cf := w.CurrentFiler.CurrentFile(rn) cf := w.CurrentFiler.CurrentFile(rn)
permUnchanged := w.IgnorePerms || !cf.HasPermissionBits() || PermsEqual(cf.Flags, uint32(info.Mode())) permUnchanged := w.IgnorePerms || !cf.HasPermissionBits() || PermsEqual(cf.Flags, uint32(info.Mode()))
if !cf.IsDeleted() && cf.IsDirectory() && permUnchanged { if !cf.IsDeleted() && cf.IsDirectory() && permUnchanged && !cf.IsSymlink() {
return nil return nil
} }
} }

View File

@ -41,14 +41,6 @@ func Read(path string) (string, uint32, error) {
return osutil.NormalizedFilename(path), mode, err return osutil.NormalizedFilename(path), mode, err
} }
func IsSymlink(path string) (bool, error) {
lstat, err := os.Lstat(path)
if err != nil {
return false, err
}
return lstat.Mode()&os.ModeSymlink != 0, nil
}
func Create(source, target string, flags uint32) error { func Create(source, target string, flags uint32) error {
return os.Symlink(osutil.NativeFilename(target), source) return os.Symlink(osutil.NativeFilename(target), source)
} }

View File

@ -69,8 +69,8 @@ func init() {
return return
} }
isLink, err := IsSymlink(path) stat, err := os.Lstat(path)
if err != nil || !isLink { if err != nil || stat.Mode()&os.ModeSymlink == 0 {
return return
} }
@ -139,19 +139,6 @@ func Read(path string) (string, uint32, error) {
return osutil.NormalizedFilename(data.PrintName()), flags, nil return osutil.NormalizedFilename(data.PrintName()), flags, nil
} }
func IsSymlink(path string) (bool, error) {
ptr, err := syscall.UTF16PtrFromString(path)
if err != nil {
return false, err
}
attr, err := syscall.GetFileAttributes(ptr)
if err != nil {
return false, err
}
return attr&FILE_ATTRIBUTE_REPARSE_POINT != 0, nil
}
func Create(source, target string, flags uint32) error { func Create(source, target string, flags uint32) error {
srcp, err := syscall.UTF16PtrFromString(source) srcp, err := syscall.UTF16PtrFromString(source)
if err != nil { if err != nil {