mirror of
https://github.com/rclone/rclone.git
synced 2024-12-23 15:38:57 +01:00
vendor: vfs add vendor/github.com/djherbis/times
This commit is contained in:
parent
e946a8eab0
commit
bb0ce0cb5f
8
Gopkg.lock
generated
8
Gopkg.lock
generated
@ -79,6 +79,12 @@
|
|||||||
revision = "d2709f9f1f31ebcda9651b03077758c1f3a0018c"
|
revision = "d2709f9f1f31ebcda9651b03077758c1f3a0018c"
|
||||||
version = "v3.0.0"
|
version = "v3.0.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/djherbis/times"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "95292e44976d1217cf3611dc7c8d9466877d3ed5"
|
||||||
|
version = "v1.0.1"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
name = "github.com/dropbox/dropbox-sdk-go-unofficial"
|
name = "github.com/dropbox/dropbox-sdk-go-unofficial"
|
||||||
@ -303,6 +309,6 @@
|
|||||||
[solve-meta]
|
[solve-meta]
|
||||||
analyzer-name = "dep"
|
analyzer-name = "dep"
|
||||||
analyzer-version = 1
|
analyzer-version = 1
|
||||||
inputs-digest = "f53d8d2a21862f225ba86e4575a68ce73db8957959ca507e5eded837c5dbcf73"
|
inputs-digest = "9d4dcfb143037fc27aa71f0eb309c9754ba348ff7585a39e575fba28265cac7d"
|
||||||
solver-name = "gps-cdcl"
|
solver-name = "gps-cdcl"
|
||||||
solver-version = 1
|
solver-version = 1
|
||||||
|
22
vendor/github.com/djherbis/times/.travis.yml
generated
vendored
Normal file
22
vendor/github.com/djherbis/times/.travis.yml
generated
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
language: go
|
||||||
|
go:
|
||||||
|
- 1.5
|
||||||
|
before_install:
|
||||||
|
- go get github.com/golang/lint/golint
|
||||||
|
- go get github.com/axw/gocov/gocov
|
||||||
|
- go get github.com/mattn/goveralls
|
||||||
|
- if ! go get code.google.com/p/go.tools/cmd/cover; then go get golang.org/x/tools/cmd/cover;
|
||||||
|
fi
|
||||||
|
script:
|
||||||
|
- '[ "${TRAVIS_PULL_REQUEST}" != "false" ] || $HOME/gopath/bin/goveralls -service=travis-ci
|
||||||
|
-repotoken $COVERALLS_TOKEN'
|
||||||
|
- "$HOME/gopath/bin/golint ./..."
|
||||||
|
- go vet
|
||||||
|
- go test -bench=.* -v ./...
|
||||||
|
notifications:
|
||||||
|
email:
|
||||||
|
on_success: never
|
||||||
|
on_failure: change
|
||||||
|
env:
|
||||||
|
global:
|
||||||
|
secure: JLdvT4dl+oifYzbQN5I0G8mZi1KVj3D3zTC8N3D9eLEvHY26QggS2I6M5CNAYkbGSB2RDp7gZLHui8zVzvudD5GuxP2xZe+WN4+n9lf+jLnCuB77ZjKCuDa1+Wg/o466L4PK0BaiTQahbk9qsDNOdfTzXXLEnqBDo1WtvLJ1mn02pL5Wyt3aAA4yeK3z7eUYFNxyi/KJ22bwhjIv6Qa9RHT7ZfR6x9YQSGeLZIWPUx5S+vmySd7sM7gRTw+lRmR/i0PNMHjlOKoyedAT8YLAWX28xgPtc7E5j+pBm6ZmDcN79tTelhiAS9uifEKkdsugZZjfnLBl9gks19bmXP4mxUIo1iKQgIbKVs7R/QMdH7RXW+isfQP/vtk6SNC86os+r7tSJ1EOtF1cZfQ7H4o2RevA3VVTVZ+45gnrK8v00eckbLmsGGho7RGORIt+JGvD0oe84dXdk/lFtBTzWhOJn2Ujlm6L3z3r/YMN2CGFfH5JGpsUKJh1uRzJ5MPqkdxRwcGrtN4DGC1L8tRMfYPo06dQxa8p4TnbYQSZ6qwuVZMMcNvr9c/edwLizMh9KXivPodmHpLAMAUPSyWLtF8pp305DUhajpRsUEvTvs082KJAK4bUNE+AxRIBwtuB0Z2r0DpgfVwAUIXh42l9RDxEA1mwUyX2EKolyRqxQGPv9NQ=
|
22
vendor/github.com/djherbis/times/LICENSE
generated
vendored
Normal file
22
vendor/github.com/djherbis/times/LICENSE
generated
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2015 Dustin H
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
63
vendor/github.com/djherbis/times/README.md
generated
vendored
Normal file
63
vendor/github.com/djherbis/times/README.md
generated
vendored
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
times
|
||||||
|
==========
|
||||||
|
|
||||||
|
[![GoDoc](https://godoc.org/github.com/djherbis/times?status.svg)](https://godoc.org/github.com/djherbis/times)
|
||||||
|
[![Release](https://img.shields.io/github/release/djherbis/times.svg)](https://github.com/djherbis/times/releases/latest)
|
||||||
|
[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg)](LICENSE.txt)
|
||||||
|
[![Build Status](https://travis-ci.org/djherbis/times.svg?branch=master)](https://travis-ci.org/djherbis/times)
|
||||||
|
[![Coverage Status](https://coveralls.io/repos/djherbis/times/badge.svg?branch=master)](https://coveralls.io/r/djherbis/times?branch=master)
|
||||||
|
[![Go Report Card](https://goreportcard.com/badge/github.com/djherbis/times)](https://goreportcard.com/report/github.com/djherbis/times)
|
||||||
|
|
||||||
|
Usage
|
||||||
|
------------
|
||||||
|
File Times for #golang
|
||||||
|
|
||||||
|
Go has a hidden time functions for most platforms, this repo makes them accessible.
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"github.com/djherbis/times"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
t, err := times.Stat("myfile")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Println(t.AccessTime())
|
||||||
|
log.Println(t.ModTime())
|
||||||
|
|
||||||
|
if t.HasChangeTime() {
|
||||||
|
log.Println(t.ChangeTime())
|
||||||
|
}
|
||||||
|
|
||||||
|
if t.HasBirthTime() {
|
||||||
|
log.Println(t.BirthTime())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Supported Times
|
||||||
|
------------
|
||||||
|
| | windows | linux | solaris | dragonfly | nacl | freebsd | darwin | netbsd | openbsd | plan9 |
|
||||||
|
|:-----:|:-------:|:-----:|:-------:|:---------:|:------:|:-------:|:----:|:------:|:-------:|:-----:|
|
||||||
|
| atime | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
|
||||||
|
| mtime | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
|
||||||
|
| ctime | ✓* | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |
|
||||||
|
| btime | ✓ | | | | | ✓ | ✓| ✓ |
|
||||||
|
|
||||||
|
* Windows XP does not have ChangeTime so HasChangeTime = false,
|
||||||
|
however Vista onward does have ChangeTime so Timespec.HasChangeTime() will
|
||||||
|
only return false on those platforms when the syscall used to obtain them fails.
|
||||||
|
* Also note, Get(FileInfo) will now only return values available in FileInfo.Sys(), this means Stat() is required to get ChangeTime on Windows
|
||||||
|
|
||||||
|
Installation
|
||||||
|
------------
|
||||||
|
```sh
|
||||||
|
go get github.com/djherbis/times
|
||||||
|
```
|
29
vendor/github.com/djherbis/times/bench_test.go
generated
vendored
Normal file
29
vendor/github.com/djherbis/times/bench_test.go
generated
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
package times
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func BenchmarkGet(t *testing.B) {
|
||||||
|
fileTest(t, func(f *os.File) {
|
||||||
|
fi, err := os.Stat(f.Name())
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < t.N; i++ {
|
||||||
|
Get(fi)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
t.ReportAllocs()
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkStat(t *testing.B) {
|
||||||
|
fileTest(t, func(f *os.File) {
|
||||||
|
for i := 0; i < t.N; i++ {
|
||||||
|
Stat(f.Name())
|
||||||
|
}
|
||||||
|
})
|
||||||
|
t.ReportAllocs()
|
||||||
|
}
|
96
vendor/github.com/djherbis/times/ctime_windows.go
generated
vendored
Normal file
96
vendor/github.com/djherbis/times/ctime_windows.go
generated
vendored
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
package times
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"syscall"
|
||||||
|
"time"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
type timespecEx struct {
|
||||||
|
atime
|
||||||
|
mtime
|
||||||
|
ctime
|
||||||
|
btime
|
||||||
|
}
|
||||||
|
|
||||||
|
// StatFile finds a Windows Timespec with ChangeTime.
|
||||||
|
func StatFile(file *os.File) (Timespec, error) {
|
||||||
|
return statFile(syscall.Handle(file.Fd()))
|
||||||
|
}
|
||||||
|
|
||||||
|
func statFile(h syscall.Handle) (Timespec, error) {
|
||||||
|
var fileInfo fileBasicInfo
|
||||||
|
if err := getFileInformationByHandleEx(h, &fileInfo); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var t timespecEx
|
||||||
|
t.atime.v = time.Unix(0, fileInfo.LastAccessTime.Nanoseconds())
|
||||||
|
t.mtime.v = time.Unix(0, fileInfo.LastWriteTime.Nanoseconds())
|
||||||
|
t.ctime.v = time.Unix(0, fileInfo.ChangeTime.Nanoseconds())
|
||||||
|
t.btime.v = time.Unix(0, fileInfo.CreationTime.Nanoseconds())
|
||||||
|
return t, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
const hasPlatformSpecificStat = true
|
||||||
|
|
||||||
|
func platformSpecficStat(name string) (Timespec, error) {
|
||||||
|
if findProcErr != nil {
|
||||||
|
return nil, findProcErr
|
||||||
|
}
|
||||||
|
|
||||||
|
f, err := os.Open(name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
return statFile(syscall.Handle(f.Fd()))
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
findProcErr error
|
||||||
|
procGetFileInformationByHandleEx *syscall.Proc
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
var modkernel32 *syscall.DLL
|
||||||
|
if modkernel32, findProcErr = syscall.LoadDLL("kernel32.dll"); findProcErr == nil {
|
||||||
|
procGetFileInformationByHandleEx, findProcErr = modkernel32.FindProc("GetFileInformationByHandleEx")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// fileBasicInfo holds the C++ data for FileTimes.
|
||||||
|
//
|
||||||
|
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa364217(v=vs.85).aspx
|
||||||
|
type fileBasicInfo struct {
|
||||||
|
CreationTime syscall.Filetime
|
||||||
|
LastAccessTime syscall.Filetime
|
||||||
|
LastWriteTime syscall.Filetime
|
||||||
|
ChangeTime syscall.Filetime
|
||||||
|
FileAttributes uint32
|
||||||
|
_ uint32 // padding
|
||||||
|
}
|
||||||
|
|
||||||
|
type fileInformationClass int
|
||||||
|
|
||||||
|
const (
|
||||||
|
fileBasicInfoClass fileInformationClass = iota
|
||||||
|
)
|
||||||
|
|
||||||
|
func getFileInformationByHandleEx(handle syscall.Handle, data *fileBasicInfo) (err error) {
|
||||||
|
if findProcErr != nil {
|
||||||
|
return findProcErr
|
||||||
|
}
|
||||||
|
|
||||||
|
r1, _, e1 := syscall.Syscall6(procGetFileInformationByHandleEx.Addr(), 4, uintptr(handle), uintptr(fileBasicInfoClass), uintptr(unsafe.Pointer(data)), unsafe.Sizeof(*data), 0, 0)
|
||||||
|
if r1 == 0 {
|
||||||
|
if e1 != 0 {
|
||||||
|
err = error(e1)
|
||||||
|
} else {
|
||||||
|
err = syscall.EINVAL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
79
vendor/github.com/djherbis/times/times.go
generated
vendored
Normal file
79
vendor/github.com/djherbis/times/times.go
generated
vendored
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
// Package times provides a platform-independent way to get atime, mtime, ctime and btime for files.
|
||||||
|
package times
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Get returns the Timespec for the given FileInfo
|
||||||
|
func Get(fi os.FileInfo) Timespec {
|
||||||
|
return getTimespec(fi)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stat returns the Timespec for the given filename.
|
||||||
|
func Stat(name string) (Timespec, error) {
|
||||||
|
if hasPlatformSpecificStat {
|
||||||
|
if ts, err := platformSpecficStat(name); err == nil {
|
||||||
|
return ts, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fi, err := os.Stat(name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return getTimespec(fi), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Timespec provides access to file times.
|
||||||
|
// ChangeTime() panics unless HasChangeTime() is true and
|
||||||
|
// BirthTime() panics unless HasBirthTime() is true.
|
||||||
|
type Timespec interface {
|
||||||
|
ModTime() time.Time
|
||||||
|
AccessTime() time.Time
|
||||||
|
ChangeTime() time.Time
|
||||||
|
BirthTime() time.Time
|
||||||
|
HasChangeTime() bool
|
||||||
|
HasBirthTime() bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type atime struct {
|
||||||
|
v time.Time
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a atime) AccessTime() time.Time { return a.v }
|
||||||
|
|
||||||
|
type ctime struct {
|
||||||
|
v time.Time
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ctime) HasChangeTime() bool { return true }
|
||||||
|
|
||||||
|
func (c ctime) ChangeTime() time.Time { return c.v }
|
||||||
|
|
||||||
|
type mtime struct {
|
||||||
|
v time.Time
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m mtime) ModTime() time.Time { return m.v }
|
||||||
|
|
||||||
|
type btime struct {
|
||||||
|
v time.Time
|
||||||
|
}
|
||||||
|
|
||||||
|
func (btime) HasBirthTime() bool { return true }
|
||||||
|
|
||||||
|
func (b btime) BirthTime() time.Time { return b.v }
|
||||||
|
|
||||||
|
type noctime struct{}
|
||||||
|
|
||||||
|
func (noctime) HasChangeTime() bool { return false }
|
||||||
|
|
||||||
|
func (noctime) ChangeTime() time.Time { panic("ctime not available") }
|
||||||
|
|
||||||
|
type nobtime struct{}
|
||||||
|
|
||||||
|
func (nobtime) HasBirthTime() bool { return false }
|
||||||
|
|
||||||
|
func (nobtime) BirthTime() time.Time { panic("birthtime not available") }
|
40
vendor/github.com/djherbis/times/times_darwin.go
generated
vendored
Normal file
40
vendor/github.com/djherbis/times/times_darwin.go
generated
vendored
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// http://golang.org/src/os/stat_darwin.go
|
||||||
|
|
||||||
|
package times
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"syscall"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// HasChangeTime and HasBirthTime are true if and only if
|
||||||
|
// the target OS supports them.
|
||||||
|
const (
|
||||||
|
HasChangeTime = true
|
||||||
|
HasBirthTime = true
|
||||||
|
)
|
||||||
|
|
||||||
|
type timespec struct {
|
||||||
|
atime
|
||||||
|
mtime
|
||||||
|
ctime
|
||||||
|
btime
|
||||||
|
}
|
||||||
|
|
||||||
|
func timespecToTime(ts syscall.Timespec) time.Time {
|
||||||
|
return time.Unix(int64(ts.Sec), int64(ts.Nsec))
|
||||||
|
}
|
||||||
|
|
||||||
|
func getTimespec(fi os.FileInfo) (t timespec) {
|
||||||
|
stat := fi.Sys().(*syscall.Stat_t)
|
||||||
|
t.atime.v = timespecToTime(stat.Atimespec)
|
||||||
|
t.mtime.v = timespecToTime(stat.Mtimespec)
|
||||||
|
t.ctime.v = timespecToTime(stat.Ctimespec)
|
||||||
|
t.btime.v = timespecToTime(stat.Birthtimespec)
|
||||||
|
return t
|
||||||
|
}
|
39
vendor/github.com/djherbis/times/times_dragonfly.go
generated
vendored
Normal file
39
vendor/github.com/djherbis/times/times_dragonfly.go
generated
vendored
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// http://golang.org/src/os/stat_dragonfly.go
|
||||||
|
|
||||||
|
package times
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"syscall"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// HasChangeTime and HasBirthTime are true if and only if
|
||||||
|
// the target OS supports them.
|
||||||
|
const (
|
||||||
|
HasChangeTime = true
|
||||||
|
HasBirthTime = false
|
||||||
|
)
|
||||||
|
|
||||||
|
type timespec struct {
|
||||||
|
atime
|
||||||
|
mtime
|
||||||
|
ctime
|
||||||
|
nobtime
|
||||||
|
}
|
||||||
|
|
||||||
|
func timespecToTime(ts syscall.Timespec) time.Time {
|
||||||
|
return time.Unix(int64(ts.Sec), int64(ts.Nsec))
|
||||||
|
}
|
||||||
|
|
||||||
|
func getTimespec(fi os.FileInfo) (t timespec) {
|
||||||
|
stat := fi.Sys().(*syscall.Stat_t)
|
||||||
|
t.atime.v = timespecToTime(stat.Atim)
|
||||||
|
t.mtime.v = timespecToTime(stat.Mtim)
|
||||||
|
t.ctime.v = timespecToTime(stat.Ctim)
|
||||||
|
return t
|
||||||
|
}
|
40
vendor/github.com/djherbis/times/times_freebsd.go
generated
vendored
Normal file
40
vendor/github.com/djherbis/times/times_freebsd.go
generated
vendored
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// http://golang.org/src/os/stat_freebsd.go
|
||||||
|
|
||||||
|
package times
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"syscall"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// HasChangeTime and HasBirthTime are true if and only if
|
||||||
|
// the target OS supports them.
|
||||||
|
const (
|
||||||
|
HasChangeTime = true
|
||||||
|
HasBirthTime = true
|
||||||
|
)
|
||||||
|
|
||||||
|
type timespec struct {
|
||||||
|
atime
|
||||||
|
mtime
|
||||||
|
ctime
|
||||||
|
btime
|
||||||
|
}
|
||||||
|
|
||||||
|
func timespecToTime(ts syscall.Timespec) time.Time {
|
||||||
|
return time.Unix(int64(ts.Sec), int64(ts.Nsec))
|
||||||
|
}
|
||||||
|
|
||||||
|
func getTimespec(fi os.FileInfo) (t timespec) {
|
||||||
|
stat := fi.Sys().(*syscall.Stat_t)
|
||||||
|
t.atime.v = timespecToTime(stat.Atimespec)
|
||||||
|
t.mtime.v = timespecToTime(stat.Mtimespec)
|
||||||
|
t.ctime.v = timespecToTime(stat.Ctimespec)
|
||||||
|
t.btime.v = timespecToTime(stat.Birthtimespec)
|
||||||
|
return t
|
||||||
|
}
|
39
vendor/github.com/djherbis/times/times_linux.go
generated
vendored
Normal file
39
vendor/github.com/djherbis/times/times_linux.go
generated
vendored
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// http://golang.org/src/os/stat_linux.go
|
||||||
|
|
||||||
|
package times
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"syscall"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// HasChangeTime and HasBirthTime are true if and only if
|
||||||
|
// the target OS supports them.
|
||||||
|
const (
|
||||||
|
HasChangeTime = true
|
||||||
|
HasBirthTime = false
|
||||||
|
)
|
||||||
|
|
||||||
|
type timespec struct {
|
||||||
|
atime
|
||||||
|
mtime
|
||||||
|
ctime
|
||||||
|
nobtime
|
||||||
|
}
|
||||||
|
|
||||||
|
func timespecToTime(ts syscall.Timespec) time.Time {
|
||||||
|
return time.Unix(int64(ts.Sec), int64(ts.Nsec))
|
||||||
|
}
|
||||||
|
|
||||||
|
func getTimespec(fi os.FileInfo) (t timespec) {
|
||||||
|
stat := fi.Sys().(*syscall.Stat_t)
|
||||||
|
t.atime.v = timespecToTime(stat.Atim)
|
||||||
|
t.mtime.v = timespecToTime(stat.Mtim)
|
||||||
|
t.ctime.v = timespecToTime(stat.Ctim)
|
||||||
|
return t
|
||||||
|
}
|
39
vendor/github.com/djherbis/times/times_nacl.go
generated
vendored
Normal file
39
vendor/github.com/djherbis/times/times_nacl.go
generated
vendored
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// http://golang.org/src/os/stat_nacl.go
|
||||||
|
|
||||||
|
package times
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"syscall"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// HasChangeTime and HasBirthTime are true if and only if
|
||||||
|
// the target OS supports them.
|
||||||
|
const (
|
||||||
|
HasChangeTime = true
|
||||||
|
HasBirthTime = false
|
||||||
|
)
|
||||||
|
|
||||||
|
type timespec struct {
|
||||||
|
atime
|
||||||
|
mtime
|
||||||
|
ctime
|
||||||
|
nobtime
|
||||||
|
}
|
||||||
|
|
||||||
|
func timespecToTime(sec, nsec int64) time.Time {
|
||||||
|
return time.Unix(sec, nsec)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getTimespec(fi os.FileInfo) (t timespec) {
|
||||||
|
stat := fi.Sys().(*syscall.Stat_t)
|
||||||
|
t.atime.v = timespecToTime(stat.Atime, stat.AtimeNsec)
|
||||||
|
t.mtime.v = timespecToTime(stat.Mtime, stat.MtimeNsec)
|
||||||
|
t.ctime.v = timespecToTime(stat.Ctime, stat.CtimeNsec)
|
||||||
|
return t
|
||||||
|
}
|
40
vendor/github.com/djherbis/times/times_netbsd.go
generated
vendored
Normal file
40
vendor/github.com/djherbis/times/times_netbsd.go
generated
vendored
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// http://golang.org/src/os/stat_netbsd.go
|
||||||
|
|
||||||
|
package times
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"syscall"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// HasChangeTime and HasBirthTime are true if and only if
|
||||||
|
// the target OS supports them.
|
||||||
|
const (
|
||||||
|
HasChangeTime = true
|
||||||
|
HasBirthTime = true
|
||||||
|
)
|
||||||
|
|
||||||
|
type timespec struct {
|
||||||
|
atime
|
||||||
|
mtime
|
||||||
|
ctime
|
||||||
|
btime
|
||||||
|
}
|
||||||
|
|
||||||
|
func timespecToTime(ts syscall.Timespec) time.Time {
|
||||||
|
return time.Unix(int64(ts.Sec), int64(ts.Nsec))
|
||||||
|
}
|
||||||
|
|
||||||
|
func getTimespec(fi os.FileInfo) (t timespec) {
|
||||||
|
stat := fi.Sys().(*syscall.Stat_t)
|
||||||
|
t.atime.v = timespecToTime(stat.Atimespec)
|
||||||
|
t.mtime.v = timespecToTime(stat.Mtimespec)
|
||||||
|
t.ctime.v = timespecToTime(stat.Ctimespec)
|
||||||
|
t.btime.v = timespecToTime(stat.Birthtimespec)
|
||||||
|
return t
|
||||||
|
}
|
39
vendor/github.com/djherbis/times/times_openbsd.go
generated
vendored
Normal file
39
vendor/github.com/djherbis/times/times_openbsd.go
generated
vendored
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// http://golang.org/src/os/stat_openbsd.go
|
||||||
|
|
||||||
|
package times
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"syscall"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// HasChangeTime and HasBirthTime are true if and only if
|
||||||
|
// the target OS supports them.
|
||||||
|
const (
|
||||||
|
HasChangeTime = true
|
||||||
|
HasBirthTime = false
|
||||||
|
)
|
||||||
|
|
||||||
|
type timespec struct {
|
||||||
|
atime
|
||||||
|
mtime
|
||||||
|
ctime
|
||||||
|
nobtime
|
||||||
|
}
|
||||||
|
|
||||||
|
func timespecToTime(ts syscall.Timespec) time.Time {
|
||||||
|
return time.Unix(int64(ts.Sec), int64(ts.Nsec))
|
||||||
|
}
|
||||||
|
|
||||||
|
func getTimespec(fi os.FileInfo) (t timespec) {
|
||||||
|
stat := fi.Sys().(*syscall.Stat_t)
|
||||||
|
t.atime.v = timespecToTime(stat.Atim)
|
||||||
|
t.mtime.v = timespecToTime(stat.Mtim)
|
||||||
|
t.ctime.v = timespecToTime(stat.Ctim)
|
||||||
|
return t
|
||||||
|
}
|
34
vendor/github.com/djherbis/times/times_plan9.go
generated
vendored
Normal file
34
vendor/github.com/djherbis/times/times_plan9.go
generated
vendored
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// http://golang.org/src/os/stat_plan9.go
|
||||||
|
|
||||||
|
package times
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"syscall"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// HasChangeTime and HasBirthTime are true if and only if
|
||||||
|
// the target OS supports them.
|
||||||
|
const (
|
||||||
|
HasChangeTime = false
|
||||||
|
HasBirthTime = false
|
||||||
|
)
|
||||||
|
|
||||||
|
type timespec struct {
|
||||||
|
atime
|
||||||
|
mtime
|
||||||
|
noctime
|
||||||
|
nobtime
|
||||||
|
}
|
||||||
|
|
||||||
|
func getTimespec(fi os.FileInfo) (t timespec) {
|
||||||
|
stat := fi.Sys().(*syscall.Dir)
|
||||||
|
t.atime.v = time.Unix(int64(stat.Atime), 0)
|
||||||
|
t.mtime.v = time.Unix(int64(stat.Mtime), 0)
|
||||||
|
return t
|
||||||
|
}
|
39
vendor/github.com/djherbis/times/times_solaris.go
generated
vendored
Normal file
39
vendor/github.com/djherbis/times/times_solaris.go
generated
vendored
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// http://golang.org/src/os/stat_solaris.go
|
||||||
|
|
||||||
|
package times
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"syscall"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// HasChangeTime and HasBirthTime are true if and only if
|
||||||
|
// the target OS supports them.
|
||||||
|
const (
|
||||||
|
HasChangeTime = true
|
||||||
|
HasBirthTime = false
|
||||||
|
)
|
||||||
|
|
||||||
|
type timespec struct {
|
||||||
|
atime
|
||||||
|
mtime
|
||||||
|
ctime
|
||||||
|
nobtime
|
||||||
|
}
|
||||||
|
|
||||||
|
func timespecToTime(ts syscall.Timespec) time.Time {
|
||||||
|
return time.Unix(int64(ts.Sec), int64(ts.Nsec))
|
||||||
|
}
|
||||||
|
|
||||||
|
func getTimespec(fi os.FileInfo) (t timespec) {
|
||||||
|
stat := fi.Sys().(*syscall.Stat_t)
|
||||||
|
t.atime.v = timespecToTime(stat.Atim)
|
||||||
|
t.mtime.v = timespecToTime(stat.Mtim)
|
||||||
|
t.ctime.v = timespecToTime(stat.Ctim)
|
||||||
|
return t
|
||||||
|
}
|
65
vendor/github.com/djherbis/times/times_test.go
generated
vendored
Normal file
65
vendor/github.com/djherbis/times/times_test.go
generated
vendored
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
package times
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestStat(t *testing.T) {
|
||||||
|
fileTest(t, func(f *os.File) {
|
||||||
|
ts, err := Stat(f.Name())
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err.Error())
|
||||||
|
}
|
||||||
|
timespecTest(ts, newInterval(time.Now(), time.Second), t)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGet(t *testing.T) {
|
||||||
|
fileTest(t, func(f *os.File) {
|
||||||
|
fi, err := os.Stat(f.Name())
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err.Error())
|
||||||
|
}
|
||||||
|
timespecTest(Get(fi), newInterval(time.Now(), time.Second), t)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestStatErr(t *testing.T) {
|
||||||
|
_, err := Stat("badfile?")
|
||||||
|
if err == nil {
|
||||||
|
t.Error("expected an error")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCheat(t *testing.T) {
|
||||||
|
// not all times are available for all platforms
|
||||||
|
// this allows us to get 100% test coverage for platforms which do not have
|
||||||
|
// ChangeTime/BirthTime
|
||||||
|
var c ctime
|
||||||
|
if c.HasChangeTime() {
|
||||||
|
c.ChangeTime()
|
||||||
|
}
|
||||||
|
|
||||||
|
var b btime
|
||||||
|
if b.HasBirthTime() {
|
||||||
|
b.BirthTime()
|
||||||
|
}
|
||||||
|
|
||||||
|
var nc noctime
|
||||||
|
func() {
|
||||||
|
if !nc.HasChangeTime() {
|
||||||
|
defer func() { recover() }()
|
||||||
|
}
|
||||||
|
nc.ChangeTime()
|
||||||
|
}()
|
||||||
|
|
||||||
|
var nb nobtime
|
||||||
|
func() {
|
||||||
|
if !nb.HasBirthTime() {
|
||||||
|
defer func() { recover() }()
|
||||||
|
}
|
||||||
|
nb.BirthTime()
|
||||||
|
}()
|
||||||
|
}
|
36
vendor/github.com/djherbis/times/times_windows.go
generated
vendored
Normal file
36
vendor/github.com/djherbis/times/times_windows.go
generated
vendored
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// http://golang.org/src/os/stat_windows.go
|
||||||
|
|
||||||
|
package times
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"syscall"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// HasChangeTime and HasBirthTime are true if and only if
|
||||||
|
// the target OS supports them.
|
||||||
|
const (
|
||||||
|
HasChangeTime = false
|
||||||
|
HasBirthTime = true
|
||||||
|
)
|
||||||
|
|
||||||
|
type timespec struct {
|
||||||
|
atime
|
||||||
|
mtime
|
||||||
|
noctime
|
||||||
|
btime
|
||||||
|
}
|
||||||
|
|
||||||
|
func getTimespec(fi os.FileInfo) Timespec {
|
||||||
|
var t timespec
|
||||||
|
stat := fi.Sys().(*syscall.Win32FileAttributeData)
|
||||||
|
t.atime.v = time.Unix(0, stat.LastAccessTime.Nanoseconds())
|
||||||
|
t.mtime.v = time.Unix(0, stat.LastWriteTime.Nanoseconds())
|
||||||
|
t.btime.v = time.Unix(0, stat.CreationTime.Nanoseconds())
|
||||||
|
return t
|
||||||
|
}
|
10
vendor/github.com/djherbis/times/use_generic_stat.go
generated
vendored
Normal file
10
vendor/github.com/djherbis/times/use_generic_stat.go
generated
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
// +build !windows
|
||||||
|
|
||||||
|
package times
|
||||||
|
|
||||||
|
const hasPlatformSpecificStat = false
|
||||||
|
|
||||||
|
// do not use, only here to prevent "undefined" method error.
|
||||||
|
func platformSpecficStat(name string) (Timespec, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
50
vendor/github.com/djherbis/times/util_test.go
generated
vendored
Normal file
50
vendor/github.com/djherbis/times/util_test.go
generated
vendored
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
package times
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type timeRange struct {
|
||||||
|
start time.Time
|
||||||
|
end time.Time
|
||||||
|
}
|
||||||
|
|
||||||
|
func newInterval(t time.Time, dur time.Duration) timeRange {
|
||||||
|
return timeRange{start: t.Add(-dur), end: t.Add(dur)}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t timeRange) Contains(findTime time.Time) bool {
|
||||||
|
return !findTime.Before(t.start) && !findTime.After(t.end)
|
||||||
|
}
|
||||||
|
|
||||||
|
// creates a file and cleans it up after the test is run.
|
||||||
|
func fileTest(t testing.TB, testFunc func(f *os.File)) {
|
||||||
|
f, err := ioutil.TempFile("", "")
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
defer os.Remove(f.Name())
|
||||||
|
defer f.Close()
|
||||||
|
testFunc(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
func timespecTest(ts Timespec, r timeRange, t testing.TB) {
|
||||||
|
if !r.Contains(ts.AccessTime()) {
|
||||||
|
t.Errorf("expected %s to be in range: %s\n", ts.AccessTime(), r.start)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !r.Contains(ts.ModTime()) {
|
||||||
|
t.Errorf("expected %s to be in range: %s\n", ts.ModTime(), r.start)
|
||||||
|
}
|
||||||
|
|
||||||
|
if ts.HasChangeTime() && !r.Contains(ts.ChangeTime()) {
|
||||||
|
t.Errorf("expected %s to be in range: %s\n", ts.ChangeTime(), r.start)
|
||||||
|
}
|
||||||
|
|
||||||
|
if ts.HasBirthTime() && !r.Contains(ts.BirthTime()) {
|
||||||
|
t.Errorf("expected %s to be in range: %s\n", ts.BirthTime(), r.start)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user