aferocopy

package module
v2.0.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 16, 2024 License: MIT Imports: 6 Imported by: 2

README

aferocopy

GitHub Releases Build Status codecov Go Report Card GoDevDoc Donate

aferocopy copies directories recursively using spf13/afero

The idea and logic is ported from otiai10/copy

Prerequisites

  • Go >= 1.17

Install

go get go.nhat.io/aferocopy/v2

Usage

package main

import (
	"fmt"

	"go.nhat.io/aferocopy/v2"
)

func main() {
	err := aferocopy.Copy("your/src", "your/dest", aferocopy.Options{
		// Specify the source and destination fs of your choice, default is afero.OsFs.
		// SrcFs: ...,
		// DestFs: ...,
	})

	fmt.Println(err) // nil
}

Advanced Usage

// Options specifies optional actions on copying.
type Options struct {
	// Source filesystem. Default is afero.NewOsFs().
	SrcFs afero.Fs

	// Source filesystem. Default is Options.SrcFs.
	DestFs afero.Fs

	// OnSymlink can specify what to do on symlink
	OnSymlink func(src string) SymlinkAction

	// OnDirExists can specify what to do when there is a directory already existing in destination.
	OnDirExists func(src, dest string) DirExistsAction

	// Skip can specify which files should be skipped
	Skip func(src string) (bool, error)

	// PermissionControl can control permission of
	// every entry.
	// When you want to add permission 0222, do like
	//
	//		PermissionControl = AddPermission(0222)
	//
	// or if you even don't want to touch permission,
	//
	//		PermissionControl = DoNothing
	//
	// By default, PermissionControl = PreservePermission
	PermissionControl PermissionControlFunc

	// Sync file after copy.
	// Useful in case when file must be on the disk
	// (in case crash happens, for example),
	// at the expense of some performance penalty
	Sync bool

	// Preserve the atime and the mtime of the entries
	// On linux we can preserve only up to 1 millisecond accuracy
	PreserveTimes bool

	// Preserve the uid and the gid of all entries.
	PreserveOwner bool

	// The byte size of the buffer to use for copying files.
	// If zero, the internal default buffer of 32KB is used.
	// See https://golang.org/pkg/io/#CopyBuffer for more information.
	CopyBufferSize uint
}
package main

import (
	"fmt"
	"strings"

	"go.nhat.io/aferocopy/v2"
)

func main() {
	err := aferocopy.Copy("your/src", "your/dest", aferocopy.Options{
		Skip: func(src string) (bool, error) {
			return strings.HasSuffix(src, ".git"), nil
		},
	})

	fmt.Println(err) // nil
}

Donation

If this project help you reduce time to develop, you can give me a cup of coffee :)

Paypal donation

paypal

       or scan this

Documentation

Overview

Package aferocopy provides copy functionalities with afero.

Index

Examples

Constants

This section is empty.

Variables

View Source
var (
	// AddPermission controls the permission of the destination file.
	AddPermission = func(perm os.FileMode) PermissionControlFunc {
		return func(srcInfo os.FileInfo, destFs afero.Fs, dest string) (func(*error), error) {
			orig := srcInfo.Mode()

			if srcInfo.IsDir() {
				if err := destFs.MkdirAll(dest, tmpPermissionForDirectory); err != nil {
					return func(*error) {}, err
				}
			}

			return func(err *error) {
				chmod(destFs, dest, orig|perm, err)
			}, nil
		}
	}

	// PreservePermission preserves the original permission.
	PreservePermission = AddPermission(0)

	// DoNothing do not touch the permission.
	DoNothing = PermissionControlFunc(func(srcInfo os.FileInfo, destFs afero.Fs, dest string) (func(*error), error) {
		if srcInfo.IsDir() {
			if err := destFs.MkdirAll(dest, srcInfo.Mode()); err != nil {
				return func(*error) {}, err
			}
		}

		return func(*error) {}, nil
	})
)

Functions

func Copy

func Copy(src, dest string, opt ...Options) error

Copy copies src to dest, doesn't matter if src is a directory or a file.

Example
err := Copy("resources/fixtures/data/example", "resources/test/data.copy/example")
fmt.Println("Error:", err)

info, _ := os.Stat("resources/test/data.copy/example") //nolint: errcheck
fmt.Println("IsDir:", info.IsDir())
Output:

Error: <nil>
IsDir: true

Types

type DirExistsAction

type DirExistsAction int

DirExistsAction represents what to do on dest dir.

const (
	// Merge preserves or overwrites existing files under the dir (default behavior).
	Merge DirExistsAction = iota
	// Replace deletes all contents under the dir and copy src files.
	Replace
	// Untouchable does nothing for the dir, and leaves it as it is.
	Untouchable
)

type Options

type Options struct {
	// Source filesystem.
	SrcFs afero.Fs

	// Source filesystem.
	DestFs afero.Fs

	// OnSymlink can specify what to do on symlink.
	OnSymlink func(srcFs afero.Fs, src string) SymlinkAction

	// OnDirExists can specify what to do when there is a directory already existing in destination.
	OnDirExists func(srcFs afero.Fs, src string, destFs afero.Fs, dest string) DirExistsAction

	// Skip can specify which files should be skipped
	Skip func(srcFs afero.Fs, src string) (bool, error)

	// AddPermission to every entities,
	// NO MORE THAN 0777
	//
	// Deprecated: use PermissionControl instead, for example: `PermissionControl: AddPermission(perm)`.
	AddPermission os.FileMode

	// PermissionControl can control permission of
	// every entry.
	// When you want to add permission 0222, do like
	//
	//		PermissionControl = AddPermission(0222)
	//
	// or if you even don't want to touch permission,
	//
	//		PermissionControl = DoNothing
	//
	// By default, PermissionControl = PreservePermission
	PermissionControl PermissionControlFunc

	// Sync file after copy.
	// Useful in case when file must be on the disk
	// (in case crash happens, for example),
	// at the expense of some performance penalty
	Sync bool

	// Preserve the atime and the mtime of the entries.
	// On linux we can preserve only up to 1 millisecond accuracy.
	PreserveTimes bool

	// Preserve the uid and the gid of all entries.
	PreserveOwner bool

	// The byte size of the buffer to use for copying files.
	// If zero, the internal default buffer of 32KB is used.
	// See https://golang.org/pkg/io/#CopyBuffer for more information.
	CopyBufferSize uint
	// contains filtered or unexported fields
}

Options specifies optional actions on copying.

Example
err := Copy(
	"resources/fixtures/data/example",
	"resources/test/data.copy/example_with_options",
	Options{
		Skip: func(_ afero.Fs, src string) (bool, error) {
			return strings.HasSuffix(src, ".git-like"), nil
		},
		OnSymlink: func(afero.Fs, string) SymlinkAction {
			return Skip
		},
		PermissionControl: AddPermission(0o200),
	},
)
fmt.Println("Error:", err)

_, err = os.Stat("resources/test/data.copy/example_with_options/.git-like")
fmt.Println("Skipped:", os.IsNotExist(err))
Output:

Error: <nil>
Skipped: true

type PermissionControlFunc

type PermissionControlFunc func(srcInfo os.FileInfo, destFs afero.Fs, dest string) (chmodFunc func(*error), err error)

PermissionControlFunc is a function that can be used to control the permission of a file or directory while copying.

type SymlinkAction

type SymlinkAction int

SymlinkAction represents what to do on symlink.

const (
	// Deep creates hard-copy of contents.
	Deep SymlinkAction = iota
	// Shallow creates new symlink to the dest of symlink.
	Shallow
	// Skip does nothing with symlink.
	Skip
)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL