cmd/copy/main.go (50 lines of code) (raw):
package main
import (
"fmt"
"io"
"os"
"path/filepath"
"github.com/spf13/cobra"
)
// copyFile copies file to destination directory
func copyFile(sourceFile, destDir string) error {
file, err := os.Open(sourceFile)
if err != nil {
return fmt.Errorf("failed to open source file: %w", err)
}
defer file.Close()
sourceDir := filepath.Dir(sourceFile)
fileName, err := filepath.Rel(sourceDir, sourceFile)
if err != nil {
return fmt.Errorf("failed to calculate file name: %w", err)
}
destFilePath := filepath.Join(destDir, fileName)
destFile, err := os.OpenFile(destFilePath, os.O_CREATE|os.O_WRONLY, 0755)
if err != nil {
return fmt.Errorf("failed to open destination file: %w", err)
}
defer destFile.Close()
_, err = io.Copy(destFile, file)
if err != nil {
return fmt.Errorf("failed to copy %q to %q: %w", sourceFile, destFilePath, err)
}
fmt.Printf("copied %q to %q\n", sourceFile, destFilePath)
return nil
}
func main() {
var src, dst string
var rootCmd = &cobra.Command{
Use: "copy",
Short: "Copy file from source to destination directory",
Long: "Copy file from source to destination directory. NOTE that it will not create directory if destination does not exist",
RunE: func(cmd *cobra.Command, args []string) error {
return copyFile(src, dst)
},
}
rootCmd.Flags().StringVarP(&src, "source", "s", "", "The path of file to copy")
rootCmd.Flags().StringVarP(&dst, "destination", "d", "", "Destination directory")
rootCmd.MarkFlagRequired("source") //nolint:errcheck
rootCmd.MarkFlagRequired("destination") //nolint:errcheck
if err := rootCmd.Execute(); err != nil {
os.Exit(1)
}
}