mirror of https://github.com/containers/podman.git
Merge pull request #5258 from containers/dependabot/go_modules/github.com/containers/storage-1.16.0
build(deps): bump github.com/containers/storage from 1.15.8 to 1.16.0
This commit is contained in:
commit
f2bcc9cc7d
2
go.mod
2
go.mod
|
@ -14,7 +14,7 @@ require (
|
||||||
github.com/containers/conmon v2.0.10+incompatible
|
github.com/containers/conmon v2.0.10+incompatible
|
||||||
github.com/containers/image/v5 v5.2.1
|
github.com/containers/image/v5 v5.2.1
|
||||||
github.com/containers/psgo v1.4.0
|
github.com/containers/psgo v1.4.0
|
||||||
github.com/containers/storage v1.15.8
|
github.com/containers/storage v1.16.0
|
||||||
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f
|
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f
|
||||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect
|
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect
|
||||||
github.com/cri-o/ocicni v0.1.1-0.20190920040751-deac903fd99b
|
github.com/cri-o/ocicni v0.1.1-0.20190920040751-deac903fd99b
|
||||||
|
|
6
go.sum
6
go.sum
|
@ -87,6 +87,8 @@ github.com/containers/storage v1.15.3/go.mod h1:v0lq/3f+cXH3Y/HiDaFYRR0zilwDve7I
|
||||||
github.com/containers/storage v1.15.5/go.mod h1:v0lq/3f+cXH3Y/HiDaFYRR0zilwDve7I4W7U5xQxvF8=
|
github.com/containers/storage v1.15.5/go.mod h1:v0lq/3f+cXH3Y/HiDaFYRR0zilwDve7I4W7U5xQxvF8=
|
||||||
github.com/containers/storage v1.15.8 h1:ef7OfUMTpyq0PIVAhV7qfufEI92gAldk25nItrip+6Q=
|
github.com/containers/storage v1.15.8 h1:ef7OfUMTpyq0PIVAhV7qfufEI92gAldk25nItrip+6Q=
|
||||||
github.com/containers/storage v1.15.8/go.mod h1:zhvjIIl/fR6wt/lgqQAC+xanHQ+8gUQ0GBVeXYN81qI=
|
github.com/containers/storage v1.15.8/go.mod h1:zhvjIIl/fR6wt/lgqQAC+xanHQ+8gUQ0GBVeXYN81qI=
|
||||||
|
github.com/containers/storage v1.16.0 h1:sD+s7BmiNBh61CuHN3j8PXGCwMtV9zPVJETAlshIf3w=
|
||||||
|
github.com/containers/storage v1.16.0/go.mod h1:nqN09JSi1/RSI1UAUwDYXPRiGSlq5FPbNkN/xb0TfG0=
|
||||||
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||||
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
|
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
|
||||||
github.com/coreos/go-iptables v0.4.5 h1:DpHb9vJrZQEFMcVLFKAAGMUVX0XoRC0ptCthinRYm38=
|
github.com/coreos/go-iptables v0.4.5 h1:DpHb9vJrZQEFMcVLFKAAGMUVX0XoRC0ptCthinRYm38=
|
||||||
|
@ -260,6 +262,8 @@ github.com/klauspost/compress v1.8.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0
|
||||||
github.com/klauspost/compress v1.9.4/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
github.com/klauspost/compress v1.9.4/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
||||||
github.com/klauspost/compress v1.9.8 h1:VMAMUUOh+gaxKTMk+zqbjsSjsIcUcL/LF4o63i82QyA=
|
github.com/klauspost/compress v1.9.8 h1:VMAMUUOh+gaxKTMk+zqbjsSjsIcUcL/LF4o63i82QyA=
|
||||||
github.com/klauspost/compress v1.9.8/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
github.com/klauspost/compress v1.9.8/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
||||||
|
github.com/klauspost/compress v1.10.0 h1:92XGj1AcYzA6UrVdd4qIIBrT8OroryvRvdmg/IfmC7Y=
|
||||||
|
github.com/klauspost/compress v1.10.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
||||||
github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
||||||
github.com/klauspost/pgzip v1.2.1 h1:oIPZROsWuPHpOdMVWLuJZXwgjhrW8r1yEX8UqMyeNHM=
|
github.com/klauspost/pgzip v1.2.1 h1:oIPZROsWuPHpOdMVWLuJZXwgjhrW8r1yEX8UqMyeNHM=
|
||||||
github.com/klauspost/pgzip v1.2.1/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
|
github.com/klauspost/pgzip v1.2.1/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
|
||||||
|
@ -283,6 +287,8 @@ github.com/mattn/go-shellwords v1.0.5/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vq
|
||||||
github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
|
github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
|
||||||
github.com/mattn/go-shellwords v1.0.9 h1:eaB5JspOwiKKcHdqcjbfe5lA9cNn/4NRRtddXJCimqk=
|
github.com/mattn/go-shellwords v1.0.9 h1:eaB5JspOwiKKcHdqcjbfe5lA9cNn/4NRRtddXJCimqk=
|
||||||
github.com/mattn/go-shellwords v1.0.9/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
|
github.com/mattn/go-shellwords v1.0.9/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
|
||||||
|
github.com/mattn/go-shellwords v1.0.10 h1:Y7Xqm8piKOO3v10Thp7Z36h4FYFjt5xB//6XvOrs2Gw=
|
||||||
|
github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||||
github.com/mistifyio/go-zfs v2.1.1+incompatible h1:gAMO1HM9xBRONLHHYnu5iFsOJUiJdNZo6oqSENd4eW8=
|
github.com/mistifyio/go-zfs v2.1.1+incompatible h1:gAMO1HM9xBRONLHHYnu5iFsOJUiJdNZo6oqSENd4eW8=
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
## The Containers Storage Project Community Code of Conduct
|
||||||
|
|
||||||
|
The Containers Storage project follows the [Containers Community Code of Conduct](https://github.com/containers/common/blob/master/CODE-OF-CONDUCT.md).
|
|
@ -54,19 +54,19 @@ sources := $(wildcard *.go cmd/containers-storage/*.go drivers/*.go drivers/*/*.
|
||||||
containers-storage: $(sources) ## build using gc on the host
|
containers-storage: $(sources) ## build using gc on the host
|
||||||
$(GO_BUILD) -compiler gc $(BUILDFLAGS) ./cmd/containers-storage
|
$(GO_BUILD) -compiler gc $(BUILDFLAGS) ./cmd/containers-storage
|
||||||
|
|
||||||
layers_ffjson.go: layers.go
|
layers_ffjson.go: $(FFJSON) layers.go
|
||||||
$(RM) $@
|
$(RM) $@
|
||||||
$(FFJSON) layers.go
|
$(FFJSON) layers.go
|
||||||
|
|
||||||
images_ffjson.go: images.go
|
images_ffjson.go: $(FFJSON) images.go
|
||||||
$(RM) $@
|
$(RM) $@
|
||||||
$(FFJSON) images.go
|
$(FFJSON) images.go
|
||||||
|
|
||||||
containers_ffjson.go: containers.go
|
containers_ffjson.go: $(FFJSON) containers.go
|
||||||
$(RM) $@
|
$(RM) $@
|
||||||
$(FFJSON) containers.go
|
$(FFJSON) containers.go
|
||||||
|
|
||||||
pkg/archive/archive_ffjson.go: pkg/archive/archive.go
|
pkg/archive/archive_ffjson.go: $(FFJSON) pkg/archive/archive.go
|
||||||
$(RM) $@
|
$(RM) $@
|
||||||
$(FFJSON) pkg/archive/archive.go
|
$(FFJSON) pkg/archive/archive.go
|
||||||
|
|
||||||
|
@ -118,6 +118,9 @@ validate: ## validate DCO, gofmt, ./pkg/ isolation, golint,\ngo vet and vendor u
|
||||||
install.tools:
|
install.tools:
|
||||||
make -C tests/tools
|
make -C tests/tools
|
||||||
|
|
||||||
|
$(FFJSON):
|
||||||
|
make -C tests/tools build/ffjson
|
||||||
|
|
||||||
install.docs: docs
|
install.docs: docs
|
||||||
make -C docs install
|
make -C docs install
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
1.15.8
|
1.16.0
|
||||||
|
|
|
@ -7,10 +7,10 @@ require (
|
||||||
github.com/Microsoft/hcsshim v0.8.7
|
github.com/Microsoft/hcsshim v0.8.7
|
||||||
github.com/docker/docker v0.0.0-20171019062838-86f080cff091 // indirect
|
github.com/docker/docker v0.0.0-20171019062838-86f080cff091 // indirect
|
||||||
github.com/docker/go-units v0.4.0
|
github.com/docker/go-units v0.4.0
|
||||||
github.com/klauspost/compress v1.9.8
|
github.com/klauspost/compress v1.10.0
|
||||||
github.com/klauspost/cpuid v1.2.1 // indirect
|
github.com/klauspost/cpuid v1.2.1 // indirect
|
||||||
github.com/klauspost/pgzip v1.2.1
|
github.com/klauspost/pgzip v1.2.1
|
||||||
github.com/mattn/go-shellwords v1.0.9
|
github.com/mattn/go-shellwords v1.0.10
|
||||||
github.com/mistifyio/go-zfs v2.1.1+incompatible
|
github.com/mistifyio/go-zfs v2.1.1+incompatible
|
||||||
github.com/opencontainers/go-digest v1.0.0-rc1
|
github.com/opencontainers/go-digest v1.0.0-rc1
|
||||||
github.com/opencontainers/runc v1.0.0-rc9
|
github.com/opencontainers/runc v1.0.0-rc9
|
||||||
|
|
|
@ -79,6 +79,8 @@ github.com/klauspost/compress v1.9.7 h1:hYW1gP94JUmAhBtJ+LNz5My+gBobDxPR1iVuKug2
|
||||||
github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
||||||
github.com/klauspost/compress v1.9.8 h1:VMAMUUOh+gaxKTMk+zqbjsSjsIcUcL/LF4o63i82QyA=
|
github.com/klauspost/compress v1.9.8 h1:VMAMUUOh+gaxKTMk+zqbjsSjsIcUcL/LF4o63i82QyA=
|
||||||
github.com/klauspost/compress v1.9.8/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
github.com/klauspost/compress v1.9.8/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
||||||
|
github.com/klauspost/compress v1.10.0 h1:92XGj1AcYzA6UrVdd4qIIBrT8OroryvRvdmg/IfmC7Y=
|
||||||
|
github.com/klauspost/compress v1.10.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
||||||
github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w=
|
github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w=
|
||||||
github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
||||||
github.com/klauspost/pgzip v1.2.1 h1:oIPZROsWuPHpOdMVWLuJZXwgjhrW8r1yEX8UqMyeNHM=
|
github.com/klauspost/pgzip v1.2.1 h1:oIPZROsWuPHpOdMVWLuJZXwgjhrW8r1yEX8UqMyeNHM=
|
||||||
|
@ -93,6 +95,8 @@ github.com/mattn/go-shellwords v1.0.7 h1:KqhVjVZomx2puPACkj9vrGFqnp42Htvo9SEAWeP
|
||||||
github.com/mattn/go-shellwords v1.0.7/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
|
github.com/mattn/go-shellwords v1.0.7/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
|
||||||
github.com/mattn/go-shellwords v1.0.9 h1:eaB5JspOwiKKcHdqcjbfe5lA9cNn/4NRRtddXJCimqk=
|
github.com/mattn/go-shellwords v1.0.9 h1:eaB5JspOwiKKcHdqcjbfe5lA9cNn/4NRRtddXJCimqk=
|
||||||
github.com/mattn/go-shellwords v1.0.9/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
|
github.com/mattn/go-shellwords v1.0.9/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
|
||||||
|
github.com/mattn/go-shellwords v1.0.10 h1:Y7Xqm8piKOO3v10Thp7Z36h4FYFjt5xB//6XvOrs2Gw=
|
||||||
|
github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
|
||||||
github.com/mistifyio/go-zfs v2.1.1+incompatible h1:gAMO1HM9xBRONLHHYnu5iFsOJUiJdNZo6oqSENd4eW8=
|
github.com/mistifyio/go-zfs v2.1.1+incompatible h1:gAMO1HM9xBRONLHHYnu5iFsOJUiJdNZo6oqSENd4eW8=
|
||||||
github.com/mistifyio/go-zfs v2.1.1+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4=
|
github.com/mistifyio/go-zfs v2.1.1+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4=
|
||||||
github.com/mrunalp/fileutils v0.0.0-20171103030105-7d4729fb3618 h1:7InQ7/zrOh6SlFjaXFubv0xX0HsuC9qJsdqm7bNQpYM=
|
github.com/mrunalp/fileutils v0.0.0-20171103030105-7d4729fb3618 h1:7InQ7/zrOh6SlFjaXFubv0xX0HsuC9qJsdqm7bNQpYM=
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// Code generated by ffjson <https://github.com/pquerna/ffjson>. DO NOT EDIT.
|
// Code generated by ffjson <https://github.com/pquerna/ffjson>. DO NOT EDIT.
|
||||||
// source: ./images.go
|
// source: images.go
|
||||||
|
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,23 +1,96 @@
|
||||||
// +build linux
|
|
||||||
|
|
||||||
package homedir
|
package homedir
|
||||||
|
|
||||||
import (
|
// Copyright 2013-2018 Docker, Inc.
|
||||||
"os"
|
// NOTE: this package has originally been copied from github.com/docker/docker.
|
||||||
|
|
||||||
"github.com/containers/storage/pkg/idtools"
|
import (
|
||||||
|
"errors"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetStatic returns the home directory for the current user without calling
|
// GetRuntimeDir returns XDG_RUNTIME_DIR.
|
||||||
// os/user.Current(). This is useful for static-linked binary on glibc-based
|
// XDG_RUNTIME_DIR is typically configured via pam_systemd.
|
||||||
// system, because a call to os/user.Current() in a static binary leads to
|
// GetRuntimeDir returns non-nil error if XDG_RUNTIME_DIR is not set.
|
||||||
// segfault due to a glibc issue that won't be fixed in a short term.
|
//
|
||||||
// (#29344, golang/go#13470, https://sourceware.org/bugzilla/show_bug.cgi?id=19341)
|
// See also https://standards.freedesktop.org/basedir-spec/latest/ar01s03.html
|
||||||
func GetStatic() (string, error) {
|
func GetRuntimeDir() (string, error) {
|
||||||
uid := os.Getuid()
|
if xdgRuntimeDir := os.Getenv("XDG_RUNTIME_DIR"); xdgRuntimeDir != "" {
|
||||||
usr, err := idtools.LookupUID(uid)
|
return xdgRuntimeDir, nil
|
||||||
|
}
|
||||||
|
return "", errors.New("could not get XDG_RUNTIME_DIR")
|
||||||
|
}
|
||||||
|
|
||||||
|
// StickRuntimeDirContents sets the sticky bit on files that are under
|
||||||
|
// XDG_RUNTIME_DIR, so that the files won't be periodically removed by the system.
|
||||||
|
//
|
||||||
|
// StickyRuntimeDir returns slice of sticked files.
|
||||||
|
// StickyRuntimeDir returns nil error if XDG_RUNTIME_DIR is not set.
|
||||||
|
//
|
||||||
|
// See also https://standards.freedesktop.org/basedir-spec/latest/ar01s03.html
|
||||||
|
func StickRuntimeDirContents(files []string) ([]string, error) {
|
||||||
|
runtimeDir, err := GetRuntimeDir()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
// ignore error if runtimeDir is empty
|
||||||
|
return nil, nil
|
||||||
}
|
}
|
||||||
return usr.Home, nil
|
runtimeDir, err = filepath.Abs(runtimeDir)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var sticked []string
|
||||||
|
for _, f := range files {
|
||||||
|
f, err = filepath.Abs(f)
|
||||||
|
if err != nil {
|
||||||
|
return sticked, err
|
||||||
|
}
|
||||||
|
if strings.HasPrefix(f, runtimeDir+"/") {
|
||||||
|
if err = stick(f); err != nil {
|
||||||
|
return sticked, err
|
||||||
|
}
|
||||||
|
sticked = append(sticked, f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sticked, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func stick(f string) error {
|
||||||
|
st, err := os.Stat(f)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
m := st.Mode()
|
||||||
|
m |= os.ModeSticky
|
||||||
|
return os.Chmod(f, m)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetDataHome returns XDG_DATA_HOME.
|
||||||
|
// GetDataHome returns $HOME/.local/share and nil error if XDG_DATA_HOME is not set.
|
||||||
|
//
|
||||||
|
// See also https://standards.freedesktop.org/basedir-spec/latest/ar01s03.html
|
||||||
|
func GetDataHome() (string, error) {
|
||||||
|
if xdgDataHome := os.Getenv("XDG_DATA_HOME"); xdgDataHome != "" {
|
||||||
|
return xdgDataHome, nil
|
||||||
|
}
|
||||||
|
home := os.Getenv("HOME")
|
||||||
|
if home == "" {
|
||||||
|
return "", errors.New("could not get either XDG_DATA_HOME or HOME")
|
||||||
|
}
|
||||||
|
return filepath.Join(home, ".local", "share"), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetConfigHome returns XDG_CONFIG_HOME.
|
||||||
|
// GetConfigHome returns $HOME/.config and nil error if XDG_CONFIG_HOME is not set.
|
||||||
|
//
|
||||||
|
// See also https://standards.freedesktop.org/basedir-spec/latest/ar01s03.html
|
||||||
|
func GetConfigHome() (string, error) {
|
||||||
|
if xdgConfigHome := os.Getenv("XDG_CONFIG_HOME"); xdgConfigHome != "" {
|
||||||
|
return xdgConfigHome, nil
|
||||||
|
}
|
||||||
|
home := os.Getenv("HOME")
|
||||||
|
if home == "" {
|
||||||
|
return "", errors.New("could not get either XDG_CONFIG_HOME or HOME")
|
||||||
|
}
|
||||||
|
return filepath.Join(home, ".config"), nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,12 +2,29 @@
|
||||||
|
|
||||||
package homedir
|
package homedir
|
||||||
|
|
||||||
|
// Copyright 2013-2018 Docker, Inc.
|
||||||
|
// NOTE: this package has originally been copied from github.com/docker/docker.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetStatic is not needed for non-linux systems.
|
// GetRuntimeDir is unsupported on non-linux system.
|
||||||
// (Precisely, it is needed only for glibc-based linux systems.)
|
func GetRuntimeDir() (string, error) {
|
||||||
func GetStatic() (string, error) {
|
return "", errors.New("homedir.GetRuntimeDir() is not supported on this system")
|
||||||
return "", errors.New("homedir.GetStatic() is not supported on this system")
|
}
|
||||||
|
|
||||||
|
// StickRuntimeDirContents is unsupported on non-linux system.
|
||||||
|
func StickRuntimeDirContents(files []string) ([]string, error) {
|
||||||
|
return nil, errors.New("homedir.StickRuntimeDirContents() is not supported on this system")
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetDataHome is unsupported on non-linux system.
|
||||||
|
func GetDataHome() (string, error) {
|
||||||
|
return "", errors.New("homedir.GetDataHome() is not supported on this system")
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetConfigHome is unsupported on non-linux system.
|
||||||
|
func GetConfigHome() (string, error) {
|
||||||
|
return "", errors.New("homedir.GetConfigHome() is not supported on this system")
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,10 +2,12 @@
|
||||||
|
|
||||||
package homedir
|
package homedir
|
||||||
|
|
||||||
|
// Copyright 2013-2018 Docker, Inc.
|
||||||
|
// NOTE: this package has originally been copied from github.com/docker/docker.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
|
"os/user"
|
||||||
"github.com/opencontainers/runc/libcontainer/user"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Key returns the env var name for the user's home dir based on
|
// Key returns the env var name for the user's home dir based on
|
||||||
|
@ -17,11 +19,16 @@ func Key() string {
|
||||||
// Get returns the home directory of the current user with the help of
|
// Get returns the home directory of the current user with the help of
|
||||||
// environment variables depending on the target operating system.
|
// environment variables depending on the target operating system.
|
||||||
// Returned path should be used with "path/filepath" to form new paths.
|
// Returned path should be used with "path/filepath" to form new paths.
|
||||||
|
//
|
||||||
|
// If linking statically with cgo enabled against glibc, ensure the
|
||||||
|
// osusergo build tag is used.
|
||||||
|
//
|
||||||
|
// If needing to do nss lookups, do not disable cgo or set osusergo.
|
||||||
func Get() string {
|
func Get() string {
|
||||||
home := os.Getenv(Key())
|
home := os.Getenv(Key())
|
||||||
if home == "" {
|
if home == "" {
|
||||||
if u, err := user.CurrentUser(); err == nil {
|
if u, err := user.Current(); err == nil {
|
||||||
return u.Home
|
return u.HomeDir
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return home
|
return home
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
package homedir
|
package homedir
|
||||||
|
|
||||||
|
// Copyright 2013-2018 Docker, Inc.
|
||||||
|
// NOTE: this package has originally been copied from github.com/docker/docker.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
|
@ -5,9 +5,6 @@ package reexec
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"syscall"
|
|
||||||
|
|
||||||
"golang.org/x/sys/unix"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Self returns the path to the current process's binary.
|
// Self returns the path to the current process's binary.
|
||||||
|
@ -16,28 +13,20 @@ func Self() string {
|
||||||
return "/proc/self/exe"
|
return "/proc/self/exe"
|
||||||
}
|
}
|
||||||
|
|
||||||
// Command returns *exec.Cmd which has Path as current binary. Also it setting
|
// Command returns *exec.Cmd which has Path as current binary.
|
||||||
// SysProcAttr.Pdeathsig to SIGTERM.
|
|
||||||
// This will use the in-memory version (/proc/self/exe) of the current binary,
|
// This will use the in-memory version (/proc/self/exe) of the current binary,
|
||||||
// it is thus safe to delete or replace the on-disk binary (os.Args[0]).
|
// it is thus safe to delete or replace the on-disk binary (os.Args[0]).
|
||||||
func Command(args ...string) *exec.Cmd {
|
func Command(args ...string) *exec.Cmd {
|
||||||
cmd := exec.Command(Self())
|
cmd := exec.Command(Self())
|
||||||
cmd.Args = args
|
cmd.Args = args
|
||||||
cmd.SysProcAttr = &syscall.SysProcAttr{
|
|
||||||
Pdeathsig: unix.SIGTERM,
|
|
||||||
}
|
|
||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
|
|
||||||
// CommandContext returns *exec.Cmd which has Path as current binary, and also
|
// CommandContext returns *exec.Cmd which has Path as current binary.
|
||||||
// sets SysProcAttr.Pdeathsig to SIGTERM.
|
|
||||||
// This will use the in-memory version (/proc/self/exe) of the current binary,
|
// This will use the in-memory version (/proc/self/exe) of the current binary,
|
||||||
// it is thus safe to delete or replace the on-disk binary (os.Args[0]).
|
// it is thus safe to delete or replace the on-disk binary (os.Args[0]).
|
||||||
func CommandContext(ctx context.Context, args ...string) *exec.Cmd {
|
func CommandContext(ctx context.Context, args ...string) *exec.Cmd {
|
||||||
cmd := exec.CommandContext(ctx, Self())
|
cmd := exec.CommandContext(ctx, Self())
|
||||||
cmd.Args = args
|
cmd.Args = args
|
||||||
cmd.SysProcAttr = &syscall.SysProcAttr{
|
|
||||||
Pdeathsig: unix.SIGTERM,
|
|
||||||
}
|
|
||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ import (
|
||||||
"github.com/containers/storage/pkg/archive"
|
"github.com/containers/storage/pkg/archive"
|
||||||
cfg "github.com/containers/storage/pkg/config"
|
cfg "github.com/containers/storage/pkg/config"
|
||||||
"github.com/containers/storage/pkg/directory"
|
"github.com/containers/storage/pkg/directory"
|
||||||
|
"github.com/containers/storage/pkg/homedir"
|
||||||
"github.com/containers/storage/pkg/idtools"
|
"github.com/containers/storage/pkg/idtools"
|
||||||
"github.com/containers/storage/pkg/ioutils"
|
"github.com/containers/storage/pkg/ioutils"
|
||||||
"github.com/containers/storage/pkg/parsers"
|
"github.com/containers/storage/pkg/parsers"
|
||||||
|
@ -3275,9 +3276,9 @@ const defaultConfigFile = "/etc/containers/storage.conf"
|
||||||
// DefaultConfigFile returns the path to the storage config file used
|
// DefaultConfigFile returns the path to the storage config file used
|
||||||
func DefaultConfigFile(rootless bool) (string, error) {
|
func DefaultConfigFile(rootless bool) (string, error) {
|
||||||
if rootless {
|
if rootless {
|
||||||
home, err := homeDir()
|
home := homedir.Get()
|
||||||
if err != nil {
|
if home == "" {
|
||||||
return "", errors.Wrapf(err, "cannot determine users homedir")
|
return "", errors.New("cannot determine user's homedir")
|
||||||
}
|
}
|
||||||
return filepath.Join(home, ".config/containers/storage.conf"), nil
|
return filepath.Join(home, ".config/containers/storage.conf"), nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,12 +4,12 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"os/user"
|
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/BurntSushi/toml"
|
"github.com/BurntSushi/toml"
|
||||||
|
"github.com/containers/storage/pkg/homedir"
|
||||||
"github.com/containers/storage/pkg/idtools"
|
"github.com/containers/storage/pkg/idtools"
|
||||||
"github.com/containers/storage/pkg/system"
|
"github.com/containers/storage/pkg/system"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
@ -82,9 +82,8 @@ func GetRootlessRuntimeDir(rootlessUID int) (string, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func getRootlessRuntimeDir(rootlessUID int) (string, error) {
|
func getRootlessRuntimeDir(rootlessUID int) (string, error) {
|
||||||
runtimeDir := os.Getenv("XDG_RUNTIME_DIR")
|
runtimeDir, err := homedir.GetRuntimeDir()
|
||||||
|
if err == nil {
|
||||||
if runtimeDir != "" {
|
|
||||||
return runtimeDir, nil
|
return runtimeDir, nil
|
||||||
}
|
}
|
||||||
tmpDir := fmt.Sprintf("/run/user/%d", rootlessUID)
|
tmpDir := fmt.Sprintf("/run/user/%d", rootlessUID)
|
||||||
|
@ -98,8 +97,8 @@ func getRootlessRuntimeDir(rootlessUID int) (string, error) {
|
||||||
} else {
|
} else {
|
||||||
return tmpDir, nil
|
return tmpDir, nil
|
||||||
}
|
}
|
||||||
home, err := homeDir()
|
home := homedir.Get()
|
||||||
if err != nil {
|
if home == "" {
|
||||||
return "", errors.Wrapf(err, "neither XDG_RUNTIME_DIR nor HOME was set non-empty")
|
return "", errors.Wrapf(err, "neither XDG_RUNTIME_DIR nor HOME was set non-empty")
|
||||||
}
|
}
|
||||||
resolvedHome, err := filepath.EvalSymlinks(home)
|
resolvedHome, err := filepath.EvalSymlinks(home)
|
||||||
|
@ -117,10 +116,13 @@ func getRootlessDirInfo(rootlessUID int) (string, string, error) {
|
||||||
return "", "", err
|
return "", "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
dataDir := os.Getenv("XDG_DATA_HOME")
|
dataDir, err := homedir.GetDataHome()
|
||||||
if dataDir == "" {
|
if err == nil {
|
||||||
home, err := homeDir()
|
return dataDir, rootlessRuntime, nil
|
||||||
if err != nil {
|
}
|
||||||
|
|
||||||
|
home := homedir.Get()
|
||||||
|
if home == "" {
|
||||||
return "", "", errors.Wrapf(err, "neither XDG_DATA_HOME nor HOME was set non-empty")
|
return "", "", errors.Wrapf(err, "neither XDG_DATA_HOME nor HOME was set non-empty")
|
||||||
}
|
}
|
||||||
// runc doesn't like symlinks in the rootfs path, and at least
|
// runc doesn't like symlinks in the rootfs path, and at least
|
||||||
|
@ -130,7 +132,7 @@ func getRootlessDirInfo(rootlessUID int) (string, string, error) {
|
||||||
return "", "", errors.Wrapf(err, "cannot resolve %s", home)
|
return "", "", errors.Wrapf(err, "cannot resolve %s", home)
|
||||||
}
|
}
|
||||||
dataDir = filepath.Join(resolvedHome, ".local", "share")
|
dataDir = filepath.Join(resolvedHome, ".local", "share")
|
||||||
}
|
|
||||||
return dataDir, rootlessRuntime, nil
|
return dataDir, rootlessRuntime, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -246,15 +248,3 @@ func DefaultStoreOptions(rootless bool, rootlessUID int) (StoreOptions, error) {
|
||||||
}
|
}
|
||||||
return storageOpts, nil
|
return storageOpts, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func homeDir() (string, error) {
|
|
||||||
home := os.Getenv("HOME")
|
|
||||||
if home == "" {
|
|
||||||
usr, err := user.Current()
|
|
||||||
if err != nil {
|
|
||||||
return "", errors.Wrapf(err, "neither XDG_RUNTIME_DIR nor HOME was set non-empty")
|
|
||||||
}
|
|
||||||
home = usr.HomeDir
|
|
||||||
}
|
|
||||||
return home, nil
|
|
||||||
}
|
|
||||||
|
|
|
@ -44,8 +44,8 @@ const (
|
||||||
|
|
||||||
bTableBits = 18 // Bits used in the big tables
|
bTableBits = 18 // Bits used in the big tables
|
||||||
bTableSize = 1 << bTableBits // Size of the table
|
bTableSize = 1 << bTableBits // Size of the table
|
||||||
allocHistory = maxMatchOffset * 10 // Size to preallocate for history.
|
allocHistory = maxStoreBlockSize * 20 // Size to preallocate for history.
|
||||||
bufferReset = (1 << 31) - allocHistory - maxStoreBlockSize // Reset the buffer offset when reaching this.
|
bufferReset = (1 << 31) - allocHistory - maxStoreBlockSize - 1 // Reset the buffer offset when reaching this.
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -210,16 +210,14 @@ func (e *fastGen) matchlenLong(s, t int32, src []byte) int32 {
|
||||||
|
|
||||||
// Reset the encoding table.
|
// Reset the encoding table.
|
||||||
func (e *fastGen) Reset() {
|
func (e *fastGen) Reset() {
|
||||||
if cap(e.hist) < int(maxMatchOffset*8) {
|
if cap(e.hist) < allocHistory {
|
||||||
l := maxMatchOffset * 8
|
e.hist = make([]byte, 0, allocHistory)
|
||||||
// Make it at least 1MB.
|
|
||||||
if l < 1<<20 {
|
|
||||||
l = 1 << 20
|
|
||||||
}
|
}
|
||||||
e.hist = make([]byte, 0, l)
|
// We offset current position so everything will be out of reach.
|
||||||
}
|
// If we are above the buffer reset it will be cleared anyway since len(hist) == 0.
|
||||||
// We offset current position so everything will be out of reach
|
if e.cur <= bufferReset {
|
||||||
e.cur += maxMatchOffset + int32(len(e.hist))
|
e.cur += maxMatchOffset + int32(len(e.hist))
|
||||||
|
}
|
||||||
e.hist = e.hist[:0]
|
e.hist = e.hist[:0]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -177,6 +177,11 @@ func (w *huffmanBitWriter) flush() {
|
||||||
w.nbits = 0
|
w.nbits = 0
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if w.lastHeader > 0 {
|
||||||
|
// We owe an EOB
|
||||||
|
w.writeCode(w.literalEncoding.codes[endBlockMarker])
|
||||||
|
w.lastHeader = 0
|
||||||
|
}
|
||||||
n := w.nbytes
|
n := w.nbytes
|
||||||
for w.nbits != 0 {
|
for w.nbits != 0 {
|
||||||
w.bytes[n] = byte(w.bits)
|
w.bytes[n] = byte(w.bits)
|
||||||
|
@ -594,8 +599,8 @@ func (w *huffmanBitWriter) writeBlockDynamic(tokens *tokens, eof bool, input []b
|
||||||
tokens.AddEOB()
|
tokens.AddEOB()
|
||||||
}
|
}
|
||||||
|
|
||||||
// We cannot reuse pure huffman table.
|
// We cannot reuse pure huffman table, and must mark as EOF.
|
||||||
if w.lastHuffMan && w.lastHeader > 0 {
|
if (w.lastHuffMan || eof) && w.lastHeader > 0 {
|
||||||
// We will not try to reuse.
|
// We will not try to reuse.
|
||||||
w.writeCode(w.literalEncoding.codes[endBlockMarker])
|
w.writeCode(w.literalEncoding.codes[endBlockMarker])
|
||||||
w.lastHeader = 0
|
w.lastHeader = 0
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package flate
|
package flate
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
// fastGen maintains the table for matches,
|
// fastGen maintains the table for matches,
|
||||||
// and the previous byte block for level 2.
|
// and the previous byte block for level 2.
|
||||||
// This is the generic implementation.
|
// This is the generic implementation.
|
||||||
|
@ -14,6 +16,9 @@ func (e *fastEncL1) Encode(dst *tokens, src []byte) {
|
||||||
inputMargin = 12 - 1
|
inputMargin = 12 - 1
|
||||||
minNonLiteralBlockSize = 1 + 1 + inputMargin
|
minNonLiteralBlockSize = 1 + 1 + inputMargin
|
||||||
)
|
)
|
||||||
|
if debugDecode && e.cur < 0 {
|
||||||
|
panic(fmt.Sprint("e.cur < 0: ", e.cur))
|
||||||
|
}
|
||||||
|
|
||||||
// Protect against e.cur wraparound.
|
// Protect against e.cur wraparound.
|
||||||
for e.cur >= bufferReset {
|
for e.cur >= bufferReset {
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package flate
|
package flate
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
// fastGen maintains the table for matches,
|
// fastGen maintains the table for matches,
|
||||||
// and the previous byte block for level 2.
|
// and the previous byte block for level 2.
|
||||||
// This is the generic implementation.
|
// This is the generic implementation.
|
||||||
|
@ -16,6 +18,10 @@ func (e *fastEncL2) Encode(dst *tokens, src []byte) {
|
||||||
minNonLiteralBlockSize = 1 + 1 + inputMargin
|
minNonLiteralBlockSize = 1 + 1 + inputMargin
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if debugDecode && e.cur < 0 {
|
||||||
|
panic(fmt.Sprint("e.cur < 0: ", e.cur))
|
||||||
|
}
|
||||||
|
|
||||||
// Protect against e.cur wraparound.
|
// Protect against e.cur wraparound.
|
||||||
for e.cur >= bufferReset {
|
for e.cur >= bufferReset {
|
||||||
if len(e.hist) == 0 {
|
if len(e.hist) == 0 {
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package flate
|
package flate
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
// fastEncL3
|
// fastEncL3
|
||||||
type fastEncL3 struct {
|
type fastEncL3 struct {
|
||||||
fastGen
|
fastGen
|
||||||
|
@ -13,6 +15,10 @@ func (e *fastEncL3) Encode(dst *tokens, src []byte) {
|
||||||
minNonLiteralBlockSize = 1 + 1 + inputMargin
|
minNonLiteralBlockSize = 1 + 1 + inputMargin
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if debugDecode && e.cur < 0 {
|
||||||
|
panic(fmt.Sprint("e.cur < 0: ", e.cur))
|
||||||
|
}
|
||||||
|
|
||||||
// Protect against e.cur wraparound.
|
// Protect against e.cur wraparound.
|
||||||
for e.cur >= bufferReset {
|
for e.cur >= bufferReset {
|
||||||
if len(e.hist) == 0 {
|
if len(e.hist) == 0 {
|
||||||
|
|
|
@ -13,7 +13,9 @@ func (e *fastEncL4) Encode(dst *tokens, src []byte) {
|
||||||
inputMargin = 12 - 1
|
inputMargin = 12 - 1
|
||||||
minNonLiteralBlockSize = 1 + 1 + inputMargin
|
minNonLiteralBlockSize = 1 + 1 + inputMargin
|
||||||
)
|
)
|
||||||
|
if debugDecode && e.cur < 0 {
|
||||||
|
panic(fmt.Sprint("e.cur < 0: ", e.cur))
|
||||||
|
}
|
||||||
// Protect against e.cur wraparound.
|
// Protect against e.cur wraparound.
|
||||||
for e.cur >= bufferReset {
|
for e.cur >= bufferReset {
|
||||||
if len(e.hist) == 0 {
|
if len(e.hist) == 0 {
|
||||||
|
|
|
@ -13,6 +13,9 @@ func (e *fastEncL5) Encode(dst *tokens, src []byte) {
|
||||||
inputMargin = 12 - 1
|
inputMargin = 12 - 1
|
||||||
minNonLiteralBlockSize = 1 + 1 + inputMargin
|
minNonLiteralBlockSize = 1 + 1 + inputMargin
|
||||||
)
|
)
|
||||||
|
if debugDecode && e.cur < 0 {
|
||||||
|
panic(fmt.Sprint("e.cur < 0: ", e.cur))
|
||||||
|
}
|
||||||
|
|
||||||
// Protect against e.cur wraparound.
|
// Protect against e.cur wraparound.
|
||||||
for e.cur >= bufferReset {
|
for e.cur >= bufferReset {
|
||||||
|
|
|
@ -13,6 +13,9 @@ func (e *fastEncL6) Encode(dst *tokens, src []byte) {
|
||||||
inputMargin = 12 - 1
|
inputMargin = 12 - 1
|
||||||
minNonLiteralBlockSize = 1 + 1 + inputMargin
|
minNonLiteralBlockSize = 1 + 1 + inputMargin
|
||||||
)
|
)
|
||||||
|
if debugDecode && e.cur < 0 {
|
||||||
|
panic(fmt.Sprint("e.cur < 0: ", e.cur))
|
||||||
|
}
|
||||||
|
|
||||||
// Protect against e.cur wraparound.
|
// Protect against e.cur wraparound.
|
||||||
for e.cur >= bufferReset {
|
for e.cur >= bufferReset {
|
||||||
|
|
|
@ -8,6 +8,8 @@ import (
|
||||||
|
|
||||||
const (
|
const (
|
||||||
maxStatelessBlock = math.MaxInt16
|
maxStatelessBlock = math.MaxInt16
|
||||||
|
// dictionary will be taken from maxStatelessBlock, so limit it.
|
||||||
|
maxStatelessDict = 8 << 10
|
||||||
|
|
||||||
slTableBits = 13
|
slTableBits = 13
|
||||||
slTableSize = 1 << slTableBits
|
slTableSize = 1 << slTableBits
|
||||||
|
@ -25,11 +27,11 @@ func (s *statelessWriter) Close() error {
|
||||||
}
|
}
|
||||||
s.closed = true
|
s.closed = true
|
||||||
// Emit EOF block
|
// Emit EOF block
|
||||||
return StatelessDeflate(s.dst, nil, true)
|
return StatelessDeflate(s.dst, nil, true, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *statelessWriter) Write(p []byte) (n int, err error) {
|
func (s *statelessWriter) Write(p []byte) (n int, err error) {
|
||||||
err = StatelessDeflate(s.dst, p, false)
|
err = StatelessDeflate(s.dst, p, false, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
@ -59,7 +61,10 @@ var bitWriterPool = sync.Pool{
|
||||||
|
|
||||||
// StatelessDeflate allows to compress directly to a Writer without retaining state.
|
// StatelessDeflate allows to compress directly to a Writer without retaining state.
|
||||||
// When returning everything will be flushed.
|
// When returning everything will be flushed.
|
||||||
func StatelessDeflate(out io.Writer, in []byte, eof bool) error {
|
// Up to 8KB of an optional dictionary can be given which is presumed to presumed to precede the block.
|
||||||
|
// Longer dictionaries will be truncated and will still produce valid output.
|
||||||
|
// Sending nil dictionary is perfectly fine.
|
||||||
|
func StatelessDeflate(out io.Writer, in []byte, eof bool, dict []byte) error {
|
||||||
var dst tokens
|
var dst tokens
|
||||||
bw := bitWriterPool.Get().(*huffmanBitWriter)
|
bw := bitWriterPool.Get().(*huffmanBitWriter)
|
||||||
bw.reset(out)
|
bw.reset(out)
|
||||||
|
@ -76,35 +81,53 @@ func StatelessDeflate(out io.Writer, in []byte, eof bool) error {
|
||||||
return bw.err
|
return bw.err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Truncate dict
|
||||||
|
if len(dict) > maxStatelessDict {
|
||||||
|
dict = dict[len(dict)-maxStatelessDict:]
|
||||||
|
}
|
||||||
|
|
||||||
for len(in) > 0 {
|
for len(in) > 0 {
|
||||||
todo := in
|
todo := in
|
||||||
if len(todo) > maxStatelessBlock {
|
if len(todo) > maxStatelessBlock-len(dict) {
|
||||||
todo = todo[:maxStatelessBlock]
|
todo = todo[:maxStatelessBlock-len(dict)]
|
||||||
}
|
}
|
||||||
in = in[len(todo):]
|
in = in[len(todo):]
|
||||||
|
uncompressed := todo
|
||||||
|
if len(dict) > 0 {
|
||||||
|
// combine dict and source
|
||||||
|
bufLen := len(todo) + len(dict)
|
||||||
|
combined := make([]byte, bufLen)
|
||||||
|
copy(combined, dict)
|
||||||
|
copy(combined[len(dict):], todo)
|
||||||
|
todo = combined
|
||||||
|
}
|
||||||
// Compress
|
// Compress
|
||||||
statelessEnc(&dst, todo)
|
statelessEnc(&dst, todo, int16(len(dict)))
|
||||||
isEof := eof && len(in) == 0
|
isEof := eof && len(in) == 0
|
||||||
|
|
||||||
if dst.n == 0 {
|
if dst.n == 0 {
|
||||||
bw.writeStoredHeader(len(todo), isEof)
|
bw.writeStoredHeader(len(uncompressed), isEof)
|
||||||
if bw.err != nil {
|
if bw.err != nil {
|
||||||
return bw.err
|
return bw.err
|
||||||
}
|
}
|
||||||
bw.writeBytes(todo)
|
bw.writeBytes(uncompressed)
|
||||||
} else if int(dst.n) > len(todo)-len(todo)>>4 {
|
} else if int(dst.n) > len(uncompressed)-len(uncompressed)>>4 {
|
||||||
// If we removed less than 1/16th, huffman compress the block.
|
// If we removed less than 1/16th, huffman compress the block.
|
||||||
bw.writeBlockHuff(isEof, todo, false)
|
bw.writeBlockHuff(isEof, uncompressed, len(in) == 0)
|
||||||
} else {
|
} else {
|
||||||
bw.writeBlockDynamic(&dst, isEof, todo, false)
|
bw.writeBlockDynamic(&dst, isEof, uncompressed, len(in) == 0)
|
||||||
}
|
|
||||||
if bw.err != nil {
|
|
||||||
return bw.err
|
|
||||||
}
|
}
|
||||||
|
if len(in) > 0 {
|
||||||
|
// Retain a dict if we have more
|
||||||
|
dict = todo[len(todo)-maxStatelessDict:]
|
||||||
dst.Reset()
|
dst.Reset()
|
||||||
}
|
}
|
||||||
|
if bw.err != nil {
|
||||||
|
return bw.err
|
||||||
|
}
|
||||||
|
}
|
||||||
if !eof {
|
if !eof {
|
||||||
// Align.
|
// Align, only a stored block can do that.
|
||||||
bw.writeStoredHeader(0, false)
|
bw.writeStoredHeader(0, false)
|
||||||
}
|
}
|
||||||
bw.flush()
|
bw.flush()
|
||||||
|
@ -130,7 +153,7 @@ func load6416(b []byte, i int16) uint64 {
|
||||||
uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56
|
uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56
|
||||||
}
|
}
|
||||||
|
|
||||||
func statelessEnc(dst *tokens, src []byte) {
|
func statelessEnc(dst *tokens, src []byte, startAt int16) {
|
||||||
const (
|
const (
|
||||||
inputMargin = 12 - 1
|
inputMargin = 12 - 1
|
||||||
minNonLiteralBlockSize = 1 + 1 + inputMargin
|
minNonLiteralBlockSize = 1 + 1 + inputMargin
|
||||||
|
@ -144,15 +167,23 @@ func statelessEnc(dst *tokens, src []byte) {
|
||||||
|
|
||||||
// This check isn't in the Snappy implementation, but there, the caller
|
// This check isn't in the Snappy implementation, but there, the caller
|
||||||
// instead of the callee handles this case.
|
// instead of the callee handles this case.
|
||||||
if len(src) < minNonLiteralBlockSize {
|
if len(src)-int(startAt) < minNonLiteralBlockSize {
|
||||||
// We do not fill the token table.
|
// We do not fill the token table.
|
||||||
// This will be picked up by caller.
|
// This will be picked up by caller.
|
||||||
dst.n = uint16(len(src))
|
dst.n = 0
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
// Index until startAt
|
||||||
|
if startAt > 0 {
|
||||||
|
cv := load3232(src, 0)
|
||||||
|
for i := int16(0); i < startAt; i++ {
|
||||||
|
table[hashSL(cv)] = tableEntry{offset: i}
|
||||||
|
cv = (cv >> 8) | (uint32(src[i+4]) << 24)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
s := int16(1)
|
s := startAt + 1
|
||||||
nextEmit := int16(0)
|
nextEmit := startAt
|
||||||
// sLimit is when to stop looking for offset/length copies. The inputMargin
|
// sLimit is when to stop looking for offset/length copies. The inputMargin
|
||||||
// lets us use a fast path for emitLiteral in the main loop, while we are
|
// lets us use a fast path for emitLiteral in the main loop, while we are
|
||||||
// looking for copies.
|
// looking for copies.
|
||||||
|
|
|
@ -1,29 +0,0 @@
|
||||||
// +build !go1.6
|
|
||||||
|
|
||||||
package shellwords
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
"os/exec"
|
|
||||||
"runtime"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
func shellRun(line, dir string) (string, error) {
|
|
||||||
var b []byte
|
|
||||||
var err error
|
|
||||||
var cmd *exec.Cmd
|
|
||||||
if runtime.GOOS == "windows" {
|
|
||||||
cmd = exec.Command(os.Getenv("COMSPEC"), "/c", line)
|
|
||||||
} else {
|
|
||||||
cmd = exec.Command(os.Getenv("SHELL"), "-c", line)
|
|
||||||
}
|
|
||||||
if dir != "" {
|
|
||||||
cmd.Dir = dir
|
|
||||||
}
|
|
||||||
b, err = cmd.Output()
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return strings.TrimSpace(string(b)), nil
|
|
||||||
}
|
|
|
@ -1,4 +1,4 @@
|
||||||
// +build !windows,go1.6
|
// +build !windows
|
||||||
|
|
||||||
package shellwords
|
package shellwords
|
||||||
|
|
||||||
|
@ -10,7 +10,10 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func shellRun(line, dir string) (string, error) {
|
func shellRun(line, dir string) (string, error) {
|
||||||
shell := os.Getenv("SHELL")
|
var shell string
|
||||||
|
if shell = os.Getenv("SHELL"); shell == "" {
|
||||||
|
shell = "/bin/sh"
|
||||||
|
}
|
||||||
cmd := exec.Command(shell, "-c", line)
|
cmd := exec.Command(shell, "-c", line)
|
||||||
if dir != "" {
|
if dir != "" {
|
||||||
cmd.Dir = dir
|
cmd.Dir = dir
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// +build windows,go1.6
|
// +build windows
|
||||||
|
|
||||||
package shellwords
|
package shellwords
|
||||||
|
|
||||||
|
@ -10,7 +10,10 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func shellRun(line, dir string) (string, error) {
|
func shellRun(line, dir string) (string, error) {
|
||||||
shell := os.Getenv("COMSPEC")
|
var shell string
|
||||||
|
if shell = os.Getenv("COMSPEC"); shell == "" {
|
||||||
|
shell = "cmd"
|
||||||
|
}
|
||||||
cmd := exec.Command(shell, "/c", line)
|
cmd := exec.Command(shell, "/c", line)
|
||||||
if dir != "" {
|
if dir != "" {
|
||||||
cmd.Dir = dir
|
cmd.Dir = dir
|
||||||
|
|
|
@ -141,7 +141,7 @@ github.com/containers/psgo/internal/dev
|
||||||
github.com/containers/psgo/internal/host
|
github.com/containers/psgo/internal/host
|
||||||
github.com/containers/psgo/internal/proc
|
github.com/containers/psgo/internal/proc
|
||||||
github.com/containers/psgo/internal/process
|
github.com/containers/psgo/internal/process
|
||||||
# github.com/containers/storage v1.15.8
|
# github.com/containers/storage v1.16.0
|
||||||
github.com/containers/storage
|
github.com/containers/storage
|
||||||
github.com/containers/storage/drivers
|
github.com/containers/storage/drivers
|
||||||
github.com/containers/storage/drivers/aufs
|
github.com/containers/storage/drivers/aufs
|
||||||
|
@ -313,7 +313,7 @@ github.com/inconshreveable/mousetrap
|
||||||
github.com/ishidawataru/sctp
|
github.com/ishidawataru/sctp
|
||||||
# github.com/json-iterator/go v1.1.9
|
# github.com/json-iterator/go v1.1.9
|
||||||
github.com/json-iterator/go
|
github.com/json-iterator/go
|
||||||
# github.com/klauspost/compress v1.9.8
|
# github.com/klauspost/compress v1.10.0
|
||||||
github.com/klauspost/compress/flate
|
github.com/klauspost/compress/flate
|
||||||
github.com/klauspost/compress/fse
|
github.com/klauspost/compress/fse
|
||||||
github.com/klauspost/compress/huff0
|
github.com/klauspost/compress/huff0
|
||||||
|
@ -324,7 +324,7 @@ github.com/klauspost/compress/zstd/internal/xxhash
|
||||||
github.com/klauspost/pgzip
|
github.com/klauspost/pgzip
|
||||||
# github.com/konsorten/go-windows-terminal-sequences v1.0.2
|
# github.com/konsorten/go-windows-terminal-sequences v1.0.2
|
||||||
github.com/konsorten/go-windows-terminal-sequences
|
github.com/konsorten/go-windows-terminal-sequences
|
||||||
# github.com/mattn/go-shellwords v1.0.9
|
# github.com/mattn/go-shellwords v1.0.10
|
||||||
github.com/mattn/go-shellwords
|
github.com/mattn/go-shellwords
|
||||||
# github.com/matttproud/golang_protobuf_extensions v1.0.1
|
# github.com/matttproud/golang_protobuf_extensions v1.0.1
|
||||||
github.com/matttproud/golang_protobuf_extensions/pbutil
|
github.com/matttproud/golang_protobuf_extensions/pbutil
|
||||||
|
|
Loading…
Reference in New Issue