From 89769cff6d310d57f8181cbf279d197b46b0a0cf Mon Sep 17 00:00:00 2001 From: jolheiser Date: Fri, 21 May 2021 21:28:03 -0500 Subject: [PATCH] Initial commit Signed-off-by: jolheiser --- .drone.yml | 18 ++++++++++++++ epoch/epoch.go | 5 ++++ epoch/epoch_test.go | 7 ++++++ file/copy.go | 36 ++++++++++++++++++++++++++++ file/copy_test.go | 57 +++++++++++++++++++++++++++++++++++++++++++++ go.mod | 2 +- random/random.go | 23 ++++++++++++++++++ 7 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 .drone.yml create mode 100644 file/copy.go create mode 100644 file/copy_test.go create mode 100644 random/random.go diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..05a9330 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,18 @@ +--- +kind: pipeline +name: compliance +trigger: + event: + - pull_request +steps: + - name: test + pull: always + image: golang:1.16 + commands: + - make test + - name: check + pull: always + image: golang:1.16 + commands: + - make vet + - diff <(gofmt -d .) <(echo -n) \ No newline at end of file diff --git a/epoch/epoch.go b/epoch/epoch.go index 42aba81..bd68ae2 100644 --- a/epoch/epoch.go +++ b/epoch/epoch.go @@ -19,3 +19,8 @@ func (e Epoch) Time() time.Time { func Now() Epoch { return Epoch(time.Now().Unix()) } + +// Time returns an Epoch based on the given time.Time +func Time(t time.Time) Epoch { + return Epoch(t.Unix()) +} diff --git a/epoch/epoch_test.go b/epoch/epoch_test.go index cebc19e..70145d0 100644 --- a/epoch/epoch_test.go +++ b/epoch/epoch_test.go @@ -21,4 +21,11 @@ func TestEpochZero(t *testing.T) { t.Log("epoch did not match zero-time") t.FailNow() } + + var z time.Time + e := Time(z) + if !e.Time().Equal(Zero.Time()) { + t.Log("zero-time did not match zero-epoch") + t.FailNow() + } } diff --git a/file/copy.go b/file/copy.go new file mode 100644 index 0000000..11586ac --- /dev/null +++ b/file/copy.go @@ -0,0 +1,36 @@ +package file + +import ( + "fmt" + "io" + "os" +) + +// Copy copies a file from src to dest +func Copy(src, dest string) error { + fi, err := os.Lstat(src) + if err != nil { + return err + } + + srcFi, err := os.Open(src) + if err != nil { + return fmt.Errorf("could not open src: %w", err) + } + defer srcFi.Close() + + destFi, err := os.Create(dest) + if err != nil { + return fmt.Errorf("could not create dest: %w", err) + } + defer destFi.Close() + + if err := os.Chmod(dest, fi.Mode()); err != nil { + return err + } + + if _, err := io.Copy(destFi, srcFi); err != nil { + return fmt.Errorf("could not copy %s to %s: %w", src, dest, err) + } + return nil +} diff --git a/file/copy_test.go b/file/copy_test.go new file mode 100644 index 0000000..8d1097c --- /dev/null +++ b/file/copy_test.go @@ -0,0 +1,57 @@ +package file + +import ( + "fmt" + "os" + "path/filepath" + "testing" +) + +func TestCopy(t *testing.T) { + contents := "COPY TEST" + + tmpDir, err := os.MkdirTemp(os.TempDir(), "go-common") + if err != nil { + t.Logf("could not create temp dir: %v", err) + t.FailNow() + } + defer func() { + if err := os.RemoveAll(tmpDir); err != nil { + t.Logf("could not remove temp dir at %s: %v", tmpDir, err) + } + }() + + tmp1, err := setupCopy(tmpDir, contents) + if err != nil { + t.Log(err) + t.FailNow() + } + + tmp2 := filepath.Join(tmpDir, "tmp2") + if err := Copy(tmp1, tmp2); err != nil { + t.Logf("could not copy file: %v", err) + t.FailNow() + } + + b, err := os.ReadFile(tmp2) + if err != nil { + t.Logf("could not read tmp2: %v", err) + t.FailNow() + } + + if string(b) != contents { + t.Logf("contents did not match") + t.FailNow() + } +} + +func setupCopy(tmpDir, contents string) (string, error) { + tmp, err := os.CreateTemp(tmpDir, "go-common") + if err != nil { + return "", fmt.Errorf("could not create temp file 1: %v", err) + } + if _, err := tmp.WriteString(contents); err != nil { + return "", fmt.Errorf("could not write to temp file 1: %v", err) + } + return tmp.Name(), tmp.Close() +} diff --git a/go.mod b/go.mod index 59164f2..c50d4fa 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ -module go.jolheiser.com/go-common +module git.jojodev.com/jolheiser/go-common go 1.16 diff --git a/random/random.go b/random/random.go new file mode 100644 index 0000000..ea5b3ff --- /dev/null +++ b/random/random.go @@ -0,0 +1,23 @@ +package random + +import "math/rand" + +// Intn returns a random number between min and max. +// It panics if min <= max. +// Remember to seed rand first! +func Intn(min, max int) int { + return RandIntn(nil, min, max) +} + +// RandIntn returns a random number between min and max for the given rand.Rand. +// +// It panics if min <= max. +func RandIntn(r *rand.Rand, min, max int) int { + if min < max { + panic("min cannot be less than or equal to max") + } + if r == nil { + return rand.Intn(max-min) + min + } + return r.Intn(max-min) + min +}