copyurl: add option to print resulting auto-filename (#5095)

Fixes #5094
This commit is contained in:
albertony 2021-03-18 10:04:59 +01:00 committed by GitHub
parent 97fc3b9046
commit ce182adf46
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 9 deletions

View File

@ -3,6 +3,7 @@ package copyurl
import ( import (
"context" "context"
"errors" "errors"
"fmt"
"os" "os"
"github.com/rclone/rclone/cmd" "github.com/rclone/rclone/cmd"
@ -13,15 +14,17 @@ import (
) )
var ( var (
autoFilename = false autoFilename = false
stdout = false printFilename = false
noClobber = false stdout = false
noClobber = false
) )
func init() { func init() {
cmd.Root.AddCommand(commandDefinition) cmd.Root.AddCommand(commandDefinition)
cmdFlags := commandDefinition.Flags() cmdFlags := commandDefinition.Flags()
flags.BoolVarP(cmdFlags, &autoFilename, "auto-filename", "a", autoFilename, "Get the file name from the URL and use it for destination file path") flags.BoolVarP(cmdFlags, &autoFilename, "auto-filename", "a", autoFilename, "Get the file name from the URL and use it for destination file path")
flags.BoolVarP(cmdFlags, &printFilename, "print-filename", "p", printFilename, "Print the resulting name from --auto-filename")
flags.BoolVarP(cmdFlags, &noClobber, "no-clobber", "", noClobber, "Prevent overwriting file with same name") flags.BoolVarP(cmdFlags, &noClobber, "no-clobber", "", noClobber, "Prevent overwriting file with same name")
flags.BoolVarP(cmdFlags, &stdout, "stdout", "", stdout, "Write the output to stdout rather than a file") flags.BoolVarP(cmdFlags, &stdout, "stdout", "", stdout, "Write the output to stdout rather than a file")
} }
@ -33,15 +36,16 @@ var commandDefinition = &cobra.Command{
Download a URL's content and copy it to the destination without saving Download a URL's content and copy it to the destination without saving
it in temporary storage. it in temporary storage.
Setting --auto-filename will cause the file name to be retrieved from Setting ` + "`--auto-filename`" + `will cause the file name to be retrieved from
the from URL (after any redirections) and used in the destination the from URL (after any redirections) and used in the destination
path. path. With ` + "`--print-filename`" + ` in addition, the resuling file name will
be printed.
Setting --no-clobber will prevent overwriting file on the Setting ` + "`--no-clobber`" + ` will prevent overwriting file on the
destination if there is one with the same name. destination if there is one with the same name.
Setting --stdout or making the output file name "-" will cause the Setting ` + "`--stdout`" + ` or making the output file name ` + "`-`" + `
output to be written to standard output. will cause the output to be written to standard output.
`, `,
RunE: func(command *cobra.Command, args []string) (err error) { RunE: func(command *cobra.Command, args []string) (err error) {
cmd.CheckArgs(1, 2, command, args) cmd.CheckArgs(1, 2, command, args)
@ -61,10 +65,14 @@ output to be written to standard output.
} }
} }
cmd.Run(true, true, command, func() error { cmd.Run(true, true, command, func() error {
var dst fs.Object
if stdout { if stdout {
err = operations.CopyURLToWriter(context.Background(), args[0], os.Stdout) err = operations.CopyURLToWriter(context.Background(), args[0], os.Stdout)
} else { } else {
_, err = operations.CopyURL(context.Background(), fsdst, dstFileName, args[0], autoFilename, noClobber) dst, err = operations.CopyURL(context.Background(), fsdst, dstFileName, args[0], autoFilename, noClobber)
if printFilename && err == nil && dst != nil {
fmt.Println(dst.Remote())
}
} }
return err return err
}) })

View File

@ -1635,6 +1635,7 @@ func copyURLFn(ctx context.Context, dstFileName string, url string, dstFileNameF
if dstFileName == "." || dstFileName == "/" { if dstFileName == "." || dstFileName == "/" {
return errors.Errorf("CopyURL failed: file name wasn't found in url") return errors.Errorf("CopyURL failed: file name wasn't found in url")
} }
fs.Debugf(dstFileName, "File name found in url")
} }
return fn(ctx, dstFileName, resp.Body, resp.ContentLength, modTime) return fn(ctx, dstFileName, resp.Body, resp.ContentLength, modTime)
} }