summaryrefslogtreecommitdiff
path: root/pkg/ctime
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/ctime')
-rw-r--r--pkg/ctime/ctime.go12
-rw-r--r--pkg/ctime/ctime_linux_32.go14
-rw-r--r--pkg/ctime/ctime_linux_64.go14
-rw-r--r--pkg/ctime/ctime_test.go63
-rw-r--r--pkg/ctime/ctime_unsupported.go12
5 files changed, 115 insertions, 0 deletions
diff --git a/pkg/ctime/ctime.go b/pkg/ctime/ctime.go
new file mode 100644
index 000000000..f5c69c7e3
--- /dev/null
+++ b/pkg/ctime/ctime.go
@@ -0,0 +1,12 @@
+// Package ctime includes a utility for determining file-creation times.
+package ctime
+
+import (
+ "os"
+ "time"
+)
+
+// Created returns the file-creation time.
+func Created(fi os.FileInfo) time.Time {
+ return created(fi)
+}
diff --git a/pkg/ctime/ctime_linux_32.go b/pkg/ctime/ctime_linux_32.go
new file mode 100644
index 000000000..00c1a9a8e
--- /dev/null
+++ b/pkg/ctime/ctime_linux_32.go
@@ -0,0 +1,14 @@
+// +build arm,linux 386,linux
+
+package ctime
+
+import (
+ "os"
+ "syscall"
+ "time"
+)
+
+func created(fi os.FileInfo) time.Time {
+ st := fi.Sys().(*syscall.Stat_t)
+ return time.Unix(int64(st.Ctim.Sec), int64(st.Ctim.Nsec))
+}
diff --git a/pkg/ctime/ctime_linux_64.go b/pkg/ctime/ctime_linux_64.go
new file mode 100644
index 000000000..1251c1ded
--- /dev/null
+++ b/pkg/ctime/ctime_linux_64.go
@@ -0,0 +1,14 @@
+// +build !arm,!386,linux
+
+package ctime
+
+import (
+ "os"
+ "syscall"
+ "time"
+)
+
+func created(fi os.FileInfo) time.Time {
+ st := fi.Sys().(*syscall.Stat_t)
+ return time.Unix(st.Ctim.Sec, st.Ctim.Nsec)
+}
diff --git a/pkg/ctime/ctime_test.go b/pkg/ctime/ctime_test.go
new file mode 100644
index 000000000..abfc627da
--- /dev/null
+++ b/pkg/ctime/ctime_test.go
@@ -0,0 +1,63 @@
+package ctime
+
+import (
+ "io/ioutil"
+ "os"
+ "testing"
+ "time"
+)
+
+func TestCreated(t *testing.T) {
+ before := time.Now()
+
+ fileA, err := ioutil.TempFile("", "ctime-test-")
+ if err != nil {
+ t.Error(err)
+ }
+ defer os.Remove(fileA.Name())
+
+ fileB, err := ioutil.TempFile("", "ctime-test-")
+ if err != nil {
+ t.Error(err)
+ }
+ defer os.Remove(fileB.Name())
+
+ after := time.Now()
+
+ infoA, err := fileA.Stat()
+ if err != nil {
+ t.Error(err)
+ }
+
+ err = fileA.Close()
+ if err != nil {
+ t.Error(err)
+ }
+
+ infoB, err := fileB.Stat()
+ if err != nil {
+ t.Error(err)
+ }
+
+ err = fileB.Close()
+ if err != nil {
+ t.Error(err)
+ }
+
+ createdA := Created(infoA)
+ beforeToCreateA := createdA.Sub(before)
+ if beforeToCreateA.Nanoseconds() < -1000000000 {
+ t.Errorf("created file A %s is %v nanoseconds before %s", createdA, -beforeToCreateA.Nanoseconds(), before)
+ }
+
+ createdB := Created(infoB)
+ createAToCreateB := createdB.Sub(createdA)
+ if createAToCreateB.Nanoseconds() < 0 {
+ t.Errorf("created file B %s is %v nanoseconds before file A %s", createdB, -createAToCreateB.Nanoseconds(), createdA)
+ }
+
+ createBToAfter := after.Sub(createdB)
+ if createBToAfter.Nanoseconds() < 0 {
+ t.Errorf("created file B %s is %v nanoseconds after %s", createdB, -createBToAfter.Nanoseconds(), after)
+ }
+}
diff --git a/pkg/ctime/ctime_unsupported.go b/pkg/ctime/ctime_unsupported.go
new file mode 100644
index 000000000..325731353
--- /dev/null
+++ b/pkg/ctime/ctime_unsupported.go
@@ -0,0 +1,12 @@
+// +build !linux
+
+package ctime
+
+import (
+ "os"
+ "time"
+)
+
+func created(fi os.FileInfo) time.Time {
+ return fi.ModTime()
+}