X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/a98594f82f1786b09d9d1e0f57a651d4eae3474a..5bc52dbe43040297c622900797c55e686b377e9b:/services/crunch-run/upload.go?ds=sidebyside diff --git a/services/crunch-run/upload.go b/services/crunch-run/upload.go index 7802fedb6c..bb2776a426 100644 --- a/services/crunch-run/upload.go +++ b/services/crunch-run/upload.go @@ -1,3 +1,7 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: AGPL-3.0 + package main // Originally based on sdk/go/crunchrunner/upload.go @@ -14,14 +18,15 @@ import ( "crypto/md5" "errors" "fmt" - "git.curoverse.com/arvados.git/sdk/go/keepclient" - "git.curoverse.com/arvados.git/sdk/go/manifest" "io" "log" "os" "path/filepath" "strings" "sync" + + "git.curoverse.com/arvados.git/sdk/go/keepclient" + "git.curoverse.com/arvados.git/sdk/go/manifest" ) // Block is a data block in a manifest stream @@ -261,8 +266,26 @@ type WalkUpload struct { // WalkFunc walks a directory tree, uploads each file found and adds it to the // CollectionWriter. func (m *WalkUpload) WalkFunc(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + targetPath, targetInfo := path, info + if info.Mode()&os.ModeSymlink != 0 { + // Update targetpath/info to reflect the symlink + // target, not the symlink itself + targetPath, err = filepath.EvalSymlinks(path) + if err != nil { + return err + } + targetInfo, err = os.Stat(targetPath) + if err != nil { + return fmt.Errorf("stat symlink %q target %q: %s", path, targetPath, err) + } + } - if info.IsDir() { + if targetInfo.Mode()&os.ModeType != 0 { + // Skip directories, pipes, other non-regular files return nil }