commit
a47a78edae
18
go.mod
18
go.mod
|
|
@ -13,16 +13,12 @@ require (
|
||||||
cloud.google.com/go v0.38.0
|
cloud.google.com/go v0.38.0
|
||||||
github.com/Azure/azure-pipeline-go v0.2.2 // indirect
|
github.com/Azure/azure-pipeline-go v0.2.2 // indirect
|
||||||
github.com/Azure/azure-storage-blob-go v0.8.0
|
github.com/Azure/azure-storage-blob-go v0.8.0
|
||||||
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 // indirect
|
|
||||||
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 // indirect
|
|
||||||
github.com/aws/aws-sdk-go v1.27.1
|
github.com/aws/aws-sdk-go v1.27.1
|
||||||
github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c
|
github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c
|
||||||
github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916 // indirect
|
github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916 // indirect
|
||||||
github.com/docker/swarmkit v1.12.1-0.20180726190244-7567d47988d8 // indirect
|
github.com/docker/swarmkit v1.12.1-0.20180726190244-7567d47988d8 // indirect
|
||||||
github.com/emirpasic/gods v1.9.0 // indirect
|
|
||||||
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 // indirect
|
|
||||||
github.com/genuinetools/amicontained v0.4.3
|
github.com/genuinetools/amicontained v0.4.3
|
||||||
github.com/gliderlabs/ssh v0.2.2 // indirect
|
github.com/go-git/go-git/v5 v5.1.0
|
||||||
github.com/golang/mock v1.3.1
|
github.com/golang/mock v1.3.1
|
||||||
github.com/google/go-cmp v0.3.0
|
github.com/google/go-cmp v0.3.0
|
||||||
github.com/google/go-containerregistry v0.0.0-20200313165449-955bf358a3d8
|
github.com/google/go-containerregistry v0.0.0-20200313165449-955bf358a3d8
|
||||||
|
|
@ -30,9 +26,7 @@ require (
|
||||||
github.com/google/go-querystring v1.0.0 // indirect
|
github.com/google/go-querystring v1.0.0 // indirect
|
||||||
github.com/hashicorp/go-memdb v0.0.0-20180223233045-1289e7fffe71 // indirect
|
github.com/hashicorp/go-memdb v0.0.0-20180223233045-1289e7fffe71 // indirect
|
||||||
github.com/hashicorp/go-uuid v1.0.1 // indirect
|
github.com/hashicorp/go-uuid v1.0.1 // indirect
|
||||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
|
|
||||||
github.com/karrick/godirwalk v1.7.7
|
github.com/karrick/godirwalk v1.7.7
|
||||||
github.com/kevinburke/ssh_config v0.0.0-20180830205328-81db2a75821e // indirect
|
|
||||||
github.com/mattn/go-ieproxy v0.0.0-20190805055040-f9202b1cfdeb // indirect
|
github.com/mattn/go-ieproxy v0.0.0-20190805055040-f9202b1cfdeb // indirect
|
||||||
github.com/mattn/go-shellwords v1.0.3 // indirect
|
github.com/mattn/go-shellwords v1.0.3 // indirect
|
||||||
github.com/minio/highwayhash v1.0.0
|
github.com/minio/highwayhash v1.0.0
|
||||||
|
|
@ -41,22 +35,14 @@ require (
|
||||||
github.com/opencontainers/selinux v1.0.0-rc1 // indirect
|
github.com/opencontainers/selinux v1.0.0-rc1 // indirect
|
||||||
github.com/opentracing/opentracing-go v1.0.2 // indirect
|
github.com/opentracing/opentracing-go v1.0.2 // indirect
|
||||||
github.com/otiai10/copy v1.0.2
|
github.com/otiai10/copy v1.0.2
|
||||||
github.com/pelletier/go-buffruneio v0.2.0 // indirect
|
|
||||||
github.com/pkg/errors v0.9.1
|
github.com/pkg/errors v0.9.1
|
||||||
github.com/sergi/go-diff v1.0.0 // indirect
|
|
||||||
github.com/sirupsen/logrus v1.4.2
|
github.com/sirupsen/logrus v1.4.2
|
||||||
github.com/spf13/afero v1.2.2
|
github.com/spf13/afero v1.2.2
|
||||||
github.com/spf13/cobra v0.0.5
|
github.com/spf13/cobra v0.0.5
|
||||||
github.com/spf13/pflag v1.0.5
|
github.com/spf13/pflag v1.0.5
|
||||||
github.com/src-d/gcfg v1.3.0 // indirect
|
|
||||||
github.com/tonistiigi/fsutil v0.0.0-20191018213012-0f039a052ca1 // indirect
|
github.com/tonistiigi/fsutil v0.0.0-20191018213012-0f039a052ca1 // indirect
|
||||||
github.com/vbatts/tar-split v0.10.2 // indirect
|
github.com/vbatts/tar-split v0.10.2 // indirect
|
||||||
github.com/xanzy/ssh-agent v0.2.0 // indirect
|
golang.org/x/net v0.0.0-20200301022130-244492dfa37a
|
||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b
|
|
||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45
|
||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e
|
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e
|
||||||
gopkg.in/src-d/go-billy.v4 v4.2.0 // indirect
|
|
||||||
gopkg.in/src-d/go-git-fixtures.v3 v3.5.0 // indirect
|
|
||||||
gopkg.in/src-d/go-git.v4 v4.6.0
|
|
||||||
gopkg.in/warnings.v0 v0.1.2 // indirect
|
|
||||||
)
|
)
|
||||||
|
|
|
||||||
57
go.sum
57
go.sum
|
|
@ -56,6 +56,8 @@ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo
|
||||||
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
|
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
|
||||||
github.com/apache/thrift v0.0.0-20161221203622-b2a4d4ae21c7/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
|
github.com/apache/thrift v0.0.0-20161221203622-b2a4d4ae21c7/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
|
||||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
||||||
|
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
|
||||||
|
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
|
||||||
github.com/aws/aws-sdk-go v1.16.26/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
github.com/aws/aws-sdk-go v1.16.26/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
||||||
github.com/aws/aws-sdk-go v1.27.1 h1:MXnqY6SlWySaZAqNnXThOvjRFdiiOuKtC6i7baFdNdU=
|
github.com/aws/aws-sdk-go v1.27.1 h1:MXnqY6SlWySaZAqNnXThOvjRFdiiOuKtC6i7baFdNdU=
|
||||||
github.com/aws/aws-sdk-go v1.27.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
github.com/aws/aws-sdk-go v1.27.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
||||||
|
|
@ -98,6 +100,7 @@ github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfc
|
||||||
github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
||||||
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
|
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
|
||||||
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
|
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
|
||||||
|
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||||
github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
|
|
@ -139,8 +142,8 @@ github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25Kn
|
||||||
github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
|
github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
|
||||||
github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
|
github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
|
||||||
github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
|
github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
|
||||||
github.com/emirpasic/gods v1.9.0 h1:rUF4PuzEjMChMiNsVjdI+SyLu7rEqpQ5reNFnhC7oFo=
|
github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg=
|
||||||
github.com/emirpasic/gods v1.9.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
|
github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
|
||||||
github.com/evanphx/json-patch v4.2.0+incompatible h1:fUDGZCv/7iAN7u0puUVhvKCcsR6vRfwrJatElLBEf0I=
|
github.com/evanphx/json-patch v4.2.0+incompatible h1:fUDGZCv/7iAN7u0puUVhvKCcsR6vRfwrJatElLBEf0I=
|
||||||
github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
|
github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
|
||||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||||
|
|
@ -155,6 +158,14 @@ github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
|
||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||||
github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0=
|
github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0=
|
||||||
github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
|
github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
|
||||||
|
github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4=
|
||||||
|
github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E=
|
||||||
|
github.com/go-git/go-billy/v5 v5.0.0 h1:7NQHvd9FVid8VL4qVUMm8XifBK+2xCoZ2lSk0agRrHM=
|
||||||
|
github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
|
||||||
|
github.com/go-git/go-git-fixtures/v4 v4.0.1 h1:q+IFMfLx200Q3scvt2hN79JsEzy4AmBTp/pqnefH+Bc=
|
||||||
|
github.com/go-git/go-git-fixtures/v4 v4.0.1/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw=
|
||||||
|
github.com/go-git/go-git/v5 v5.1.0 h1:HxJn9g/E7eYvKW3Fm7Jt4ee8LXfPOm/H1cdDu8vEssk=
|
||||||
|
github.com/go-git/go-git/v5 v5.1.0/go.mod h1:ZKfuPUoY1ZqIG4QG9BDBh3G4gLM5zvPuSJAozQrZuyM=
|
||||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||||
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
|
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
|
||||||
|
|
@ -254,12 +265,15 @@ github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
|
||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||||
github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
||||||
github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
||||||
|
github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg=
|
||||||
|
github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
||||||
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
|
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
|
||||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||||
github.com/ishidawataru/sctp v0.0.0-20180213033435-07191f837fed/go.mod h1:DM4VvS+hD/kDi1U1QsX2fnZowwBhqD0Dk3bRPKF/Oc8=
|
github.com/ishidawataru/sctp v0.0.0-20180213033435-07191f837fed/go.mod h1:DM4VvS+hD/kDi1U1QsX2fnZowwBhqD0Dk3bRPKF/Oc8=
|
||||||
github.com/jaguilar/vt100 v0.0.0-20150826170717-2703a27b14ea/go.mod h1:QMdK4dGB3YhEW2BmA1wgGpPYI3HZy/5gD705PXKUVSg=
|
github.com/jaguilar/vt100 v0.0.0-20150826170717-2703a27b14ea/go.mod h1:QMdK4dGB3YhEW2BmA1wgGpPYI3HZy/5gD705PXKUVSg=
|
||||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
|
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
|
||||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
|
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
|
||||||
|
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||||
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM=
|
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM=
|
||||||
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
||||||
github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8=
|
github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8=
|
||||||
|
|
@ -273,8 +287,8 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1
|
||||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||||
github.com/karrick/godirwalk v1.7.7 h1:lLkPCA+C0u1pI4fLFseaupvh5/THlPJIqSPmnGGViKs=
|
github.com/karrick/godirwalk v1.7.7 h1:lLkPCA+C0u1pI4fLFseaupvh5/THlPJIqSPmnGGViKs=
|
||||||
github.com/karrick/godirwalk v1.7.7/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46shStcFDJ34=
|
github.com/karrick/godirwalk v1.7.7/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46shStcFDJ34=
|
||||||
github.com/kevinburke/ssh_config v0.0.0-20180830205328-81db2a75821e h1:RgQk53JHp/Cjunrr1WlsXSZpqXn+uREuHvUVcK82CV8=
|
github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY=
|
||||||
github.com/kevinburke/ssh_config v0.0.0-20180830205328-81db2a75821e/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
|
github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
|
||||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
||||||
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
|
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
|
|
@ -289,6 +303,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
|
github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
|
||||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
|
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||||
|
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||||
github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
|
|
@ -330,6 +346,8 @@ github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8m
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
||||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||||
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
|
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
|
||||||
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
|
||||||
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||||
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
|
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
|
||||||
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c h1:Hww8mOyEKTeON4bZn7FrlLismspbPc1teNRUVH7wLQ8=
|
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c h1:Hww8mOyEKTeON4bZn7FrlLismspbPc1teNRUVH7wLQ8=
|
||||||
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
|
|
@ -366,8 +384,6 @@ github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95 h1:+OLn68pqasWca0z5ry
|
||||||
github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=
|
github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=
|
||||||
github.com/otiai10/mint v1.3.0 h1:Ady6MKVezQwHBkGzLFbrsywyp09Ah7rkmfjV3Bcr5uc=
|
github.com/otiai10/mint v1.3.0 h1:Ady6MKVezQwHBkGzLFbrsywyp09Ah7rkmfjV3Bcr5uc=
|
||||||
github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=
|
github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=
|
||||||
github.com/pelletier/go-buffruneio v0.2.0 h1:U4t4R6YkofJ5xHm3dJzuRpPZ0mr5MMCoAWooScCR7aA=
|
|
||||||
github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo=
|
|
||||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||||
github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI=
|
github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI=
|
||||||
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
|
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
|
||||||
|
|
@ -399,8 +415,8 @@ github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvf
|
||||||
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
|
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
|
||||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||||
github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U=
|
github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U=
|
||||||
github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
|
github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
|
||||||
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
|
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
|
||||||
github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc=
|
github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc=
|
||||||
github.com/sirupsen/logrus v1.0.3/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
|
github.com/sirupsen/logrus v1.0.3/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
|
||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||||
|
|
@ -422,8 +438,6 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn
|
||||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||||
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
|
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
|
||||||
github.com/src-d/gcfg v1.3.0 h1:2BEDr8r0I0b8h/fOqwtxCEiq2HJu8n2JGZJQFGXWLjg=
|
|
||||||
github.com/src-d/gcfg v1.3.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI=
|
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
|
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
|
||||||
|
|
@ -450,8 +464,8 @@ github.com/vdemeester/k8s-pkg-credentialprovider v1.17.4/go.mod h1:inCTmtUdr5KJb
|
||||||
github.com/vishvananda/netlink v1.0.0/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk=
|
github.com/vishvananda/netlink v1.0.0/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk=
|
||||||
github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI=
|
github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI=
|
||||||
github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU=
|
github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU=
|
||||||
github.com/xanzy/ssh-agent v0.2.0 h1:Adglfbi5p9Z0BmK2oKU9nTG+zKfniSfnaMYB+ULd+Ro=
|
github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70=
|
||||||
github.com/xanzy/ssh-agent v0.2.0/go.mod h1:0NyE30eGUDliuLEHJgYte/zncp2zdTStcOnWhgSqHD8=
|
github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4=
|
||||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
||||||
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
|
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
|
||||||
go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk=
|
go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk=
|
||||||
|
|
@ -465,6 +479,7 @@ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
|
golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 h1:1wopBVtVdWnn03fZelqdXTqk7U7zPQCb+T4rbU9ZEoU=
|
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 h1:1wopBVtVdWnn03fZelqdXTqk7U7zPQCb+T4rbU9ZEoU=
|
||||||
|
|
@ -473,6 +488,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
|
||||||
golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 h1:/Tl7pH94bvbAAHBdZJT947M/+gp0+CqQXDtMRC0fseo=
|
golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 h1:/Tl7pH94bvbAAHBdZJT947M/+gp0+CqQXDtMRC0fseo=
|
||||||
golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073 h1:xMPOj6Pz6UipU1wXLkrtqpHbR0AVFnyPEQq/wRWz9lM=
|
||||||
|
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||||
|
|
@ -505,8 +522,8 @@ golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLL
|
||||||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI=
|
golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI=
|
||||||
golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8=
|
golang.org/x/net v0.0.0-20200301022130-244492dfa37a h1:GuSPYbZzB5/dcLNCwLQLsg3obCJtX9IJhpXkvY7kzk0=
|
||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
|
|
@ -533,6 +550,7 @@ golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5h
|
||||||
golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc=
|
golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc=
|
||||||
|
|
@ -544,6 +562,8 @@ golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||||
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191010194322-b09406accb47 h1:/XfQ9z7ib8eEJX2hdgFTZJ/ntt0swNk5oYBziWeTCvY=
|
golang.org/x/sys v0.0.0-20191010194322-b09406accb47 h1:/XfQ9z7ib8eEJX2hdgFTZJ/ntt0swNk5oYBziWeTCvY=
|
||||||
golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 h1:uYVVQ9WP/Ds2ROhcaGPeIdVq0RIXVLwsHlnvJ+cT1So=
|
||||||
|
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
|
@ -606,6 +626,9 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
|
gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
|
||||||
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
|
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
|
||||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||||
|
|
@ -616,12 +639,6 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
|
||||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
|
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
|
||||||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
||||||
gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
|
gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
|
||||||
gopkg.in/src-d/go-billy.v4 v4.2.0 h1:VGbrP1EsYxtvVPEiHui+4//imr4E5MGEFLx66bQtusg=
|
|
||||||
gopkg.in/src-d/go-billy.v4 v4.2.0/go.mod h1:ZHSF0JP+7oD97194otDUCD7Ofbk63+xFcfWP5bT6h+Q=
|
|
||||||
gopkg.in/src-d/go-git-fixtures.v3 v3.5.0 h1:ivZFOIltbce2Mo8IjzUHAFoq/IylO9WHhNOAJK+LsJg=
|
|
||||||
gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g=
|
|
||||||
gopkg.in/src-d/go-git.v4 v4.6.0 h1:3XrA9Qxiwfj7Iusd7dVYUqxMjJYPsLuBdUeQbwnL/NQ=
|
|
||||||
gopkg.in/src-d/go-git.v4 v4.6.0/go.mod h1:CzbUWqMn4pvmvndg3gnh5iZFmSsbhyhUWdI0IQ60AQo=
|
|
||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||||
gopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
|
gopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
|
||||||
|
|
|
||||||
|
|
@ -21,10 +21,10 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/GoogleContainerTools/kaniko/pkg/constants"
|
"github.com/GoogleContainerTools/kaniko/pkg/constants"
|
||||||
git "gopkg.in/src-d/go-git.v4"
|
"github.com/go-git/go-git/v5"
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing"
|
"github.com/go-git/go-git/v5/plumbing"
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing/transport"
|
"github.com/go-git/go-git/v5/plumbing/transport"
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing/transport/http"
|
"github.com/go-git/go-git/v5/plumbing/transport/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
|
||||||
|
|
@ -21,8 +21,8 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/GoogleContainerTools/kaniko/testutil"
|
"github.com/GoogleContainerTools/kaniko/testutil"
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing/transport"
|
"github.com/go-git/go-git/v5/plumbing/transport"
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing/transport/http"
|
"github.com/go-git/go-git/v5/plumbing/transport/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGetGitPullMethod(t *testing.T) {
|
func TestGetGitPullMethod(t *testing.T) {
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ type EnumerableWithIndex interface {
|
||||||
|
|
||||||
// Map invokes the given function once for each element and returns a
|
// Map invokes the given function once for each element and returns a
|
||||||
// container containing the values returned by the given function.
|
// container containing the values returned by the given function.
|
||||||
// TODO need help on how to enforce this in containers (don't want to type assert when chaining)
|
// TODO would appreciate help on how to enforce this in containers (don't want to type assert when chaining)
|
||||||
// Map(func(index int, value interface{}) interface{}) Container
|
// Map(func(index int, value interface{}) interface{}) Container
|
||||||
|
|
||||||
// Select returns a new container containing all elements for which the given function returns a true value.
|
// Select returns a new container containing all elements for which the given function returns a true value.
|
||||||
|
|
|
||||||
|
|
@ -11,9 +11,10 @@ package arraylist
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/emirpasic/gods/lists"
|
"github.com/emirpasic/gods/lists"
|
||||||
"github.com/emirpasic/gods/utils"
|
"github.com/emirpasic/gods/utils"
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func assertListImplementation() {
|
func assertListImplementation() {
|
||||||
|
|
@ -31,9 +32,13 @@ const (
|
||||||
shrinkFactor = float32(0.25) // shrink when size is 25% of capacity (0 means never shrink)
|
shrinkFactor = float32(0.25) // shrink when size is 25% of capacity (0 means never shrink)
|
||||||
)
|
)
|
||||||
|
|
||||||
// New instantiates a new empty list
|
// New instantiates a new list and adds the passed values, if any, to the list
|
||||||
func New() *List {
|
func New(values ...interface{}) *List {
|
||||||
return &List{}
|
list := &List{}
|
||||||
|
if len(values) > 0 {
|
||||||
|
list.Add(values...)
|
||||||
|
}
|
||||||
|
return list
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add appends a value at the end of the list
|
// Add appends a value at the end of the list
|
||||||
|
|
@ -56,7 +61,7 @@ func (list *List) Get(index int) (interface{}, bool) {
|
||||||
return list.elements[index], true
|
return list.elements[index], true
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove removes one or more elements from the list with the supplied indices.
|
// Remove removes the element at the given index from the list.
|
||||||
func (list *List) Remove(index int) {
|
func (list *List) Remove(index int) {
|
||||||
|
|
||||||
if !list.withinRange(index) {
|
if !list.withinRange(index) {
|
||||||
|
|
@ -98,6 +103,19 @@ func (list *List) Values() []interface{} {
|
||||||
return newElements
|
return newElements
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//IndexOf returns index of provided element
|
||||||
|
func (list *List) IndexOf(value interface{}) int {
|
||||||
|
if list.size == 0 {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
for index, element := range list.elements {
|
||||||
|
if element == value {
|
||||||
|
return index
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
// Empty returns true if list does not contain any elements.
|
// Empty returns true if list does not contain any elements.
|
||||||
func (list *List) Empty() bool {
|
func (list *List) Empty() bool {
|
||||||
return list.size == 0
|
return list.size == 0
|
||||||
|
|
@ -145,14 +163,24 @@ func (list *List) Insert(index int, values ...interface{}) {
|
||||||
l := len(values)
|
l := len(values)
|
||||||
list.growBy(l)
|
list.growBy(l)
|
||||||
list.size += l
|
list.size += l
|
||||||
// Shift old to right
|
copy(list.elements[index+l:], list.elements[index:list.size-l])
|
||||||
for i := list.size - 1; i >= index+l; i-- {
|
copy(list.elements[index:], values)
|
||||||
list.elements[i] = list.elements[i-l]
|
}
|
||||||
}
|
|
||||||
// Insert new
|
// Set the value at specified index
|
||||||
for i, value := range values {
|
// Does not do anything if position is negative or bigger than list's size
|
||||||
list.elements[index+i] = value
|
// Note: position equal to list's size is valid, i.e. append.
|
||||||
|
func (list *List) Set(index int, value interface{}) {
|
||||||
|
|
||||||
|
if !list.withinRange(index) {
|
||||||
|
// Append
|
||||||
|
if index == list.size {
|
||||||
|
list.Add(value)
|
||||||
|
}
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
list.elements[index] = value
|
||||||
}
|
}
|
||||||
|
|
||||||
// String returns a string representation of container
|
// String returns a string representation of container
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@ type List interface {
|
||||||
Sort(comparator utils.Comparator)
|
Sort(comparator utils.Comparator)
|
||||||
Swap(index1, index2 int)
|
Swap(index1, index2 int)
|
||||||
Insert(index int, values ...interface{})
|
Insert(index int, values ...interface{})
|
||||||
|
Set(index int, value interface{})
|
||||||
|
|
||||||
containers.Container
|
containers.Container
|
||||||
// Empty() bool
|
// Empty() bool
|
||||||
|
|
|
||||||
|
|
@ -11,12 +11,12 @@ func assertSerializationImplementation() {
|
||||||
var _ containers.JSONDeserializer = (*Heap)(nil)
|
var _ containers.JSONDeserializer = (*Heap)(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToJSON outputs the JSON representation of list's elements.
|
// ToJSON outputs the JSON representation of the heap.
|
||||||
func (heap *Heap) ToJSON() ([]byte, error) {
|
func (heap *Heap) ToJSON() ([]byte, error) {
|
||||||
return heap.list.ToJSON()
|
return heap.list.ToJSON()
|
||||||
}
|
}
|
||||||
|
|
||||||
// FromJSON populates list's elements from the input JSON representation.
|
// FromJSON populates the heap from the input JSON representation.
|
||||||
func (heap *Heap) FromJSON(data []byte) error {
|
func (heap *Heap) FromJSON(data []byte) error {
|
||||||
return heap.list.FromJSON(data)
|
return heap.list.FromJSON(data)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -142,4 +142,4 @@
|
||||||
// - make error context accessible programmatically?
|
// - make error context accessible programmatically?
|
||||||
// - limit input size?
|
// - limit input size?
|
||||||
//
|
//
|
||||||
package gcfg // import "github.com/src-d/gcfg"
|
package gcfg // import "github.com/go-git/gcfg"
|
||||||
0
vendor/github.com/src-d/gcfg/errors.go → vendor/github.com/go-git/gcfg/errors.go
generated
vendored
0
vendor/github.com/src-d/gcfg/errors.go → vendor/github.com/go-git/gcfg/errors.go
generated
vendored
|
|
@ -7,12 +7,12 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/src-d/gcfg/scanner"
|
"github.com/go-git/gcfg/scanner"
|
||||||
"github.com/src-d/gcfg/token"
|
"github.com/go-git/gcfg/token"
|
||||||
"gopkg.in/warnings.v0"
|
"gopkg.in/warnings.v0"
|
||||||
)
|
)
|
||||||
|
|
||||||
var unescape = map[rune]rune{'\\': '\\', '"': '"', 'n': '\n', 't': '\t'}
|
var unescape = map[rune]rune{'\\': '\\', '"': '"', 'n': '\n', 't': '\t', 'b': '\b'}
|
||||||
|
|
||||||
// no error: invalid literals should be caught by scanner
|
// no error: invalid literals should be caught by scanner
|
||||||
func unquote(s string) string {
|
func unquote(s string) string {
|
||||||
|
|
@ -48,7 +48,7 @@ func unquote(s string) string {
|
||||||
return string(u)
|
return string(u)
|
||||||
}
|
}
|
||||||
|
|
||||||
func read(c *warnings.Collector, callback func(string,string,string,string,bool)error,
|
func read(c *warnings.Collector, callback func(string, string, string, string, bool) error,
|
||||||
fset *token.FileSet, file *token.File, src []byte) error {
|
fset *token.FileSet, file *token.File, src []byte) error {
|
||||||
//
|
//
|
||||||
var s scanner.Scanner
|
var s scanner.Scanner
|
||||||
|
|
@ -223,7 +223,7 @@ func readInto(config interface{}, fset *token.FileSet, file *token.File,
|
||||||
// (as opposed to set to empty string).
|
// (as opposed to set to empty string).
|
||||||
//
|
//
|
||||||
// If callback returns an error, ReadWithCallback terminates with an error too.
|
// If callback returns an error, ReadWithCallback terminates with an error too.
|
||||||
func ReadWithCallback(reader io.Reader, callback func(string,string,string,string,bool)error) error {
|
func ReadWithCallback(reader io.Reader, callback func(string, string, string, string, bool) error) error {
|
||||||
src, err := ioutil.ReadAll(reader)
|
src, err := ioutil.ReadAll(reader)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -11,7 +11,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/src-d/gcfg/token"
|
"github.com/go-git/gcfg/token"
|
||||||
)
|
)
|
||||||
|
|
||||||
// In an ErrorList, an error is represented by an *Error.
|
// In an ErrorList, an error is represented by an *Error.
|
||||||
|
|
@ -19,7 +19,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/src-d/gcfg/token"
|
"github.com/go-git/gcfg/token"
|
||||||
)
|
)
|
||||||
|
|
||||||
// An ErrorHandler may be provided to Scanner.Init. If a syntax error is
|
// An ErrorHandler may be provided to Scanner.Init. If a syntax error is
|
||||||
|
|
@ -170,7 +170,7 @@ func (s *Scanner) scanEscape(val bool) {
|
||||||
switch ch {
|
switch ch {
|
||||||
case '\\', '"':
|
case '\\', '"':
|
||||||
// ok
|
// ok
|
||||||
case 'n', 't':
|
case 'n', 't', 'b':
|
||||||
if val {
|
if val {
|
||||||
break // ok
|
break // ok
|
||||||
}
|
}
|
||||||
|
|
@ -232,10 +232,10 @@ loop:
|
||||||
s.next()
|
s.next()
|
||||||
}
|
}
|
||||||
if s.ch != '\n' {
|
if s.ch != '\n' {
|
||||||
s.error(offs, "unquoted '\\' must be followed by new line")
|
s.scanEscape(true)
|
||||||
break loop
|
} else {
|
||||||
|
s.next()
|
||||||
}
|
}
|
||||||
s.next()
|
|
||||||
case ch == '"':
|
case ch == '"':
|
||||||
inQuote = !inQuote
|
inQuote = !inQuote
|
||||||
case ch == '\r':
|
case ch == '\r':
|
||||||
|
|
@ -10,7 +10,7 @@ import (
|
||||||
"unicode"
|
"unicode"
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
|
|
||||||
"github.com/src-d/gcfg/types"
|
"github.com/go-git/gcfg/types"
|
||||||
"gopkg.in/warnings.v0"
|
"gopkg.in/warnings.v0"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
/coverage.txt
|
||||||
|
/vendor
|
||||||
|
Gopkg.lock
|
||||||
|
Gopkg.toml
|
||||||
|
|
@ -1,20 +1,21 @@
|
||||||
# go-billy [](https://godoc.org/gopkg.in/src-d/go-billy.v4) [](https://travis-ci.org/src-d/go-billy) [](https://ci.appveyor.com/project/mcuadros/go-billy) [](https://codecov.io/gh/src-d/go-billy)
|
# go-billy [](https://pkg.go.dev/github.com/go-git/go-billy) [](https://github.com/go-git/go-billy/actions?query=workflow%3ATest)
|
||||||
|
|
||||||
The missing interface filesystem abstraction for Go.
|
The missing interface filesystem abstraction for Go.
|
||||||
Billy implements an interface based on the `os` standard library, allowing to develop applications without dependency on the underlying storage. Make virtually free implement an mocks and testing over filesystem operations.
|
Billy implements an interface based on the `os` standard library, allowing to develop applications without dependency on the underlying storage. Makes it virtually free to implement mocks and testing over filesystem operations.
|
||||||
|
|
||||||
Billy was born as part of [src-d/go-git](https://github.com/src-d/go-git) project.
|
Billy was born as part of [go-git/go-git](https://github.com/go-git/go-git) project.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
```go
|
```go
|
||||||
go get -u gopkg.in/src-d/go-billy.v4/...
|
import "github.com/go-git/go-billy/v5" // with go modules enabled (GO111MODULE=on or outside GOPATH)
|
||||||
|
import "github.com/go-git/go-billy" // with go modules disabled
|
||||||
```
|
```
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
Billy exposes filesystems using the
|
Billy exposes filesystems using the
|
||||||
[`Filesystem` interface](https://godoc.org/github.com/src-d/go-billy#Filesystem).
|
[`Filesystem` interface](https://pkg.go.dev/github.com/go-git/go-billy/v5?tab=doc#Filesystem).
|
||||||
Each filesystem implementation gives you a `New` method, whose arguments depend on
|
Each filesystem implementation gives you a `New` method, whose arguments depend on
|
||||||
the implementation itself, that returns a new `Filesystem`.
|
the implementation itself, that returns a new `Filesystem`.
|
||||||
|
|
||||||
0
vendor/gopkg.in/src-d/go-billy.v4/fs.go → vendor/github.com/go-git/go-billy/v5/fs.go
generated
vendored
0
vendor/gopkg.in/src-d/go-billy.v4/fs.go → vendor/github.com/go-git/go-billy/v5/fs.go
generated
vendored
|
|
@ -0,0 +1,10 @@
|
||||||
|
module github.com/go-git/go-billy/v5
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/kr/text v0.2.0 // indirect
|
||||||
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
|
||||||
|
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527
|
||||||
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f
|
||||||
|
)
|
||||||
|
|
||||||
|
go 1.13
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||||
|
github.com/go-git/go-billy v1.0.0 h1:bXR6Zu3opPSg0R4dDxqaLglY4rxw7ja7wS16qSpOKL4=
|
||||||
|
github.com/go-git/go-billy v3.1.0+incompatible h1:dwrJ8G2Jt1srYgIJs+lRjA36qBY68O2Lg5idKG8ef5M=
|
||||||
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
|
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
|
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||||
|
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||||
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
|
||||||
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||||
|
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 h1:uYVVQ9WP/Ds2ROhcaGPeIdVq0RIXVLwsHlnvJ+cT1So=
|
||||||
|
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
|
@ -5,8 +5,8 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"gopkg.in/src-d/go-billy.v4"
|
"github.com/go-git/go-billy/v5"
|
||||||
"gopkg.in/src-d/go-billy.v4/helper/polyfill"
|
"github.com/go-git/go-billy/v5/helper/polyfill"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ChrootHelper is a helper to implement billy.Chroot.
|
// ChrootHelper is a helper to implement billy.Chroot.
|
||||||
|
|
@ -4,7 +4,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"gopkg.in/src-d/go-billy.v4"
|
"github.com/go-git/go-billy/v5"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Polyfill is a helper that implements all missing method from billy.Filesystem.
|
// Polyfill is a helper that implements all missing method from billy.Filesystem.
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
// Package osfs provides a billy filesystem for the OS.
|
// Package osfs provides a billy filesystem for the OS.
|
||||||
package osfs // import "gopkg.in/src-d/go-billy.v4/osfs"
|
package osfs // import "github.com/go-git/go-billy/v5/osfs"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
|
@ -7,8 +7,8 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"gopkg.in/src-d/go-billy.v4"
|
"github.com/go-git/go-billy/v5"
|
||||||
"gopkg.in/src-d/go-billy.v4/helper/chroot"
|
"github.com/go-git/go-billy/v5/helper/chroot"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
@ -72,7 +72,7 @@ func (fs *OS) Rename(from, to string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return os.Rename(from, to)
|
return rename(from, to)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fs *OS) MkdirAll(path string, perm os.FileMode) error {
|
func (fs *OS) MkdirAll(path string, perm os.FileMode) error {
|
||||||
|
|
@ -0,0 +1,83 @@
|
||||||
|
package osfs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (f *file) Lock() error {
|
||||||
|
// Plan 9 uses a mode bit instead of explicit lock/unlock syscalls.
|
||||||
|
//
|
||||||
|
// Per http://man.cat-v.org/plan_9/5/stat: “Exclusive use files may be open
|
||||||
|
// for I/O by only one fid at a time across all clients of the server. If a
|
||||||
|
// second open is attempted, it draws an error.”
|
||||||
|
//
|
||||||
|
// There is no obvious way to implement this function using the exclusive use bit.
|
||||||
|
// See https://golang.org/src/cmd/go/internal/lockedfile/lockedfile_plan9.go
|
||||||
|
// for how file locking is done by the go tool on Plan 9.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *file) Unlock() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func rename(from, to string) error {
|
||||||
|
// If from and to are in different directories, copy the file
|
||||||
|
// since Plan 9 does not support cross-directory rename.
|
||||||
|
if filepath.Dir(from) != filepath.Dir(to) {
|
||||||
|
fi, err := os.Stat(from)
|
||||||
|
if err != nil {
|
||||||
|
return &os.LinkError{"rename", from, to, err}
|
||||||
|
}
|
||||||
|
if fi.Mode().IsDir() {
|
||||||
|
return &os.LinkError{"rename", from, to, syscall.EISDIR}
|
||||||
|
}
|
||||||
|
fromFile, err := os.Open(from)
|
||||||
|
if err != nil {
|
||||||
|
return &os.LinkError{"rename", from, to, err}
|
||||||
|
}
|
||||||
|
toFile, err := os.OpenFile(to, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, fi.Mode())
|
||||||
|
if err != nil {
|
||||||
|
return &os.LinkError{"rename", from, to, err}
|
||||||
|
}
|
||||||
|
_, err = io.Copy(toFile, fromFile)
|
||||||
|
if err != nil {
|
||||||
|
return &os.LinkError{"rename", from, to, err}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy mtime and mode from original file.
|
||||||
|
// We need only one syscall if we avoid os.Chmod and os.Chtimes.
|
||||||
|
dir := fi.Sys().(*syscall.Dir)
|
||||||
|
var d syscall.Dir
|
||||||
|
d.Null()
|
||||||
|
d.Mtime = dir.Mtime
|
||||||
|
d.Mode = dir.Mode
|
||||||
|
if err = dirwstat(to, &d); err != nil {
|
||||||
|
return &os.LinkError{"rename", from, to, err}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove original file.
|
||||||
|
err = os.Remove(from)
|
||||||
|
if err != nil {
|
||||||
|
return &os.LinkError{"rename", from, to, err}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return os.Rename(from, to)
|
||||||
|
}
|
||||||
|
|
||||||
|
func dirwstat(name string, d *syscall.Dir) error {
|
||||||
|
var buf [syscall.STATFIXLEN]byte
|
||||||
|
|
||||||
|
n, err := d.Marshal(buf[:])
|
||||||
|
if err != nil {
|
||||||
|
return &os.PathError{"dirwstat", name, err}
|
||||||
|
}
|
||||||
|
if err = syscall.Wstat(name, buf[:n]); err != nil {
|
||||||
|
return &os.PathError{"dirwstat", name, err}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
// +build !plan9,!windows
|
||||||
|
|
||||||
|
package osfs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"golang.org/x/sys/unix"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (f *file) Lock() error {
|
||||||
|
f.m.Lock()
|
||||||
|
defer f.m.Unlock()
|
||||||
|
|
||||||
|
return unix.Flock(int(f.File.Fd()), unix.LOCK_EX)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *file) Unlock() error {
|
||||||
|
f.m.Lock()
|
||||||
|
defer f.m.Unlock()
|
||||||
|
|
||||||
|
return unix.Flock(int(f.File.Fd()), unix.LOCK_UN)
|
||||||
|
}
|
||||||
|
|
||||||
|
func rename(from, to string) error {
|
||||||
|
return os.Rename(from, to)
|
||||||
|
}
|
||||||
|
|
@ -55,3 +55,7 @@ func (f *file) Unlock() error {
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func rename(from, to string) error {
|
||||||
|
return os.Rename(from, to)
|
||||||
|
}
|
||||||
|
|
@ -5,7 +5,7 @@ import (
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"gopkg.in/src-d/go-billy.v4"
|
"github.com/go-git/go-billy/v5"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Glob returns the names of all files matching pattern or nil
|
// Glob returns the names of all files matching pattern or nil
|
||||||
|
|
@ -8,7 +8,7 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gopkg.in/src-d/go-billy.v4"
|
"github.com/go-git/go-billy/v5"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RemoveAll removes path and any children it contains. It removes everything it
|
// RemoveAll removes path and any children it contains. It removes everything it
|
||||||
|
|
@ -168,6 +168,45 @@ func TempFile(fs billy.Basic, dir, prefix string) (f billy.File, err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TempDir creates a new temporary directory in the directory dir
|
||||||
|
// with a name beginning with prefix and returns the path of the
|
||||||
|
// new directory. If dir is the empty string, TempDir uses the
|
||||||
|
// default directory for temporary files (see os.TempDir).
|
||||||
|
// Multiple programs calling TempDir simultaneously
|
||||||
|
// will not choose the same directory. It is the caller's responsibility
|
||||||
|
// to remove the directory when no longer needed.
|
||||||
|
func TempDir(fs billy.Dir, dir, prefix string) (name string, err error) {
|
||||||
|
// This implementation is based on stdlib ioutil.TempDir
|
||||||
|
|
||||||
|
if dir == "" {
|
||||||
|
dir = os.TempDir()
|
||||||
|
}
|
||||||
|
|
||||||
|
nconflict := 0
|
||||||
|
for i := 0; i < 10000; i++ {
|
||||||
|
try := filepath.Join(dir, prefix+nextSuffix())
|
||||||
|
err = fs.MkdirAll(try, 0700)
|
||||||
|
if os.IsExist(err) {
|
||||||
|
if nconflict++; nconflict > 10 {
|
||||||
|
randmu.Lock()
|
||||||
|
rand = reseed()
|
||||||
|
randmu.Unlock()
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
if _, err := os.Stat(dir); os.IsNotExist(err) {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err == nil {
|
||||||
|
name = try
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
type underlying interface {
|
type underlying interface {
|
||||||
Underlying() billy.Basic
|
Underlying() billy.Basic
|
||||||
}
|
}
|
||||||
|
|
@ -12,7 +12,7 @@ is supported by go-git.
|
||||||
| init | ✔ | Plain init and `--bare` are supported. Flags `--template`, `--separate-git-dir` and `--shared` are not. |
|
| init | ✔ | Plain init and `--bare` are supported. Flags `--template`, `--separate-git-dir` and `--shared` are not. |
|
||||||
| clone | ✔ | Plain clone and equivalents to `--progress`, `--single-branch`, `--depth`, `--origin`, `--recurse-submodules` are supported. Others are not. |
|
| clone | ✔ | Plain clone and equivalents to `--progress`, `--single-branch`, `--depth`, `--origin`, `--recurse-submodules` are supported. Others are not. |
|
||||||
| **basic snapshotting** |
|
| **basic snapshotting** |
|
||||||
| add | ✔ | Plain add is supported. Any other flag aren't supported |
|
| add | ✔ | Plain add is supported. Any other flags aren't supported |
|
||||||
| status | ✔ |
|
| status | ✔ |
|
||||||
| commit | ✔ |
|
| commit | ✔ |
|
||||||
| reset | ✔ |
|
| reset | ✔ |
|
||||||
|
|
@ -86,7 +86,7 @@ is supported by go-git.
|
||||||
| for-each-ref | ✔ |
|
| for-each-ref | ✔ |
|
||||||
| hash-object | ✔ |
|
| hash-object | ✔ |
|
||||||
| ls-files | ✔ |
|
| ls-files | ✔ |
|
||||||
| merge-base | |
|
| merge-base | ✔ | Calculates the merge-base only between two commits, and supports `--independent` and `--is-ancestor` modifiers; Does not support `--fork-point` nor `--octopus` modifiers. |
|
||||||
| read-tree | |
|
| read-tree | |
|
||||||
| rev-list | ✔ |
|
| rev-list | ✔ |
|
||||||
| rev-parse | |
|
| rev-parse | |
|
||||||
|
|
@ -101,7 +101,7 @@ is supported by go-git.
|
||||||
| http(s):// (smart) | ✔ |
|
| http(s):// (smart) | ✔ |
|
||||||
| git:// | ✔ |
|
| git:// | ✔ |
|
||||||
| ssh:// | ✔ |
|
| ssh:// | ✔ |
|
||||||
| file:// | ✔ |
|
| file:// | partial | Warning: this is not pure Golang. This shells out to the `git` binary. |
|
||||||
| custom | ✔ |
|
| custom | ✔ |
|
||||||
| **other features** |
|
| **other features** |
|
||||||
| gitignore | ✔ |
|
| gitignore | ✔ |
|
||||||
|
|
@ -5,24 +5,12 @@ contributions via GitHub pull requests. This document outlines some of the
|
||||||
conventions on development workflow, commit message formatting, contact points,
|
conventions on development workflow, commit message formatting, contact points,
|
||||||
and other resources to make it easier to get your contribution accepted.
|
and other resources to make it easier to get your contribution accepted.
|
||||||
|
|
||||||
## Certificate of Origin
|
|
||||||
|
|
||||||
By contributing to this project you agree to the [Developer Certificate of
|
|
||||||
Origin (DCO)](DCO). This document was created by the Linux Kernel community and is a
|
|
||||||
simple statement that you, as a contributor, have the legal right to make the
|
|
||||||
contribution.
|
|
||||||
|
|
||||||
In order to show your agreement with the DCO you should include at the end of commit message,
|
|
||||||
the following line: `Signed-off-by: John Doe <john.doe@example.com>`, using your real name.
|
|
||||||
|
|
||||||
This can be done easily using the [`-s`](https://github.com/git/git/blob/b2c150d3aa82f6583b9aadfecc5f8fa1c74aca09/Documentation/git-commit.txt#L154-L161) flag on the `git commit`.
|
|
||||||
|
|
||||||
## Support Channels
|
## Support Channels
|
||||||
|
|
||||||
The official support channels, for both users and contributors, are:
|
The official support channels, for both users and contributors, are:
|
||||||
|
|
||||||
- GitHub [issues](https://github.com/src-d/go-git/issues)*
|
- [StackOverflow go-git tag](https://stackoverflow.com/questions/tagged/go-git) for user questions.
|
||||||
- Slack: #go-git room in the [source{d} Slack](https://join.slack.com/t/sourced-community/shared_invite/enQtMjc4Njk5MzEyNzM2LTFjNzY4NjEwZGEwMzRiNTM4MzRlMzQ4MmIzZjkwZmZlM2NjODUxZmJjNDI1OTcxNDAyMmZlNmFjODZlNTg0YWM)
|
- GitHub [Issues](https://github.com/src-d/go-git/issues)* for bug reports and feature requests.
|
||||||
|
|
||||||
*Before opening a new issue or submitting a new pull request, it's helpful to
|
*Before opening a new issue or submitting a new pull request, it's helpful to
|
||||||
search the project - it's likely that another user has already reported the
|
search the project - it's likely that another user has already reported the
|
||||||
|
|
@ -41,7 +29,7 @@ In order for a PR to be accepted it needs to pass a list of requirements:
|
||||||
- They should in general include tests, and those shall pass.
|
- They should in general include tests, and those shall pass.
|
||||||
- If the PR is a bug fix, it has to include a suite of unit tests for the new functionality.
|
- If the PR is a bug fix, it has to include a suite of unit tests for the new functionality.
|
||||||
- If the PR is a new feature, it has to come with a suite of unit tests, that tests the new functionality.
|
- If the PR is a new feature, it has to come with a suite of unit tests, that tests the new functionality.
|
||||||
- In any case, all the PRs have to pass the personal evaluation of at least one of the [maintainers](MAINTAINERS) of go-git.
|
- In any case, all the PRs have to pass the personal evaluation of at least one of the maintainers of go-git.
|
||||||
|
|
||||||
### Format of the commit message
|
### Format of the commit message
|
||||||
|
|
||||||
2
vendor/gopkg.in/src-d/go-git.v4/LICENSE → vendor/github.com/go-git/go-git/v5/LICENSE
generated
vendored
2
vendor/gopkg.in/src-d/go-git.v4/LICENSE → vendor/github.com/go-git/go-git/v5/LICENSE
generated
vendored
|
|
@ -186,7 +186,7 @@
|
||||||
same "printed page" as the copyright notice for easier
|
same "printed page" as the copyright notice for easier
|
||||||
identification within third-party archives.
|
identification within third-party archives.
|
||||||
|
|
||||||
Copyright 2017 Sourced Technologies, S.L.
|
Copyright 2018 Sourced Technologies, S.L.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
# General
|
||||||
|
WORKDIR = $(PWD)
|
||||||
|
|
||||||
|
# Go parameters
|
||||||
|
GOCMD = go
|
||||||
|
GOTEST = $(GOCMD) test
|
||||||
|
|
||||||
|
# Git config
|
||||||
|
GIT_VERSION ?=
|
||||||
|
GIT_DIST_PATH ?= $(PWD)/.git-dist
|
||||||
|
GIT_REPOSITORY = http://github.com/git/git.git
|
||||||
|
|
||||||
|
# Coverage
|
||||||
|
COVERAGE_REPORT = coverage.out
|
||||||
|
COVERAGE_MODE = count
|
||||||
|
|
||||||
|
build-git:
|
||||||
|
@if [ -f $(GIT_DIST_PATH)/git ]; then \
|
||||||
|
echo "nothing to do, using cache $(GIT_DIST_PATH)"; \
|
||||||
|
else \
|
||||||
|
git clone $(GIT_REPOSITORY) -b $(GIT_VERSION) --depth 1 --single-branch $(GIT_DIST_PATH); \
|
||||||
|
cd $(GIT_DIST_PATH); \
|
||||||
|
make configure; \
|
||||||
|
./configure; \
|
||||||
|
make all; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
test:
|
||||||
|
@echo "running against `git version`"; \
|
||||||
|
$(GOTEST) ./...
|
||||||
|
|
||||||
|
test-coverage:
|
||||||
|
@echo "running against `git version`"; \
|
||||||
|
echo "" > $(COVERAGE_REPORT); \
|
||||||
|
$(GOTEST) -coverprofile=$(COVERAGE_REPORT) -coverpkg=./... -covermode=$(COVERAGE_MODE) ./...
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf $(GIT_DIST_PATH)
|
||||||
38
vendor/gopkg.in/src-d/go-git.v4/README.md → vendor/github.com/go-git/go-git/v5/README.md
generated
vendored
38
vendor/gopkg.in/src-d/go-git.v4/README.md → vendor/github.com/go-git/go-git/v5/README.md
generated
vendored
|
|
@ -1,18 +1,26 @@
|
||||||

|

|
||||||
[](https://godoc.org/github.com/src-d/go-git) [](https://travis-ci.org/src-d/go-git) [](https://ci.appveyor.com/project/mcuadros/go-git) [](https://codecov.io/github/src-d/go-git) [](https://goreportcard.com/report/github.com/src-d/go-git)
|
[](https://pkg.go.dev/github.com/go-git/go-git/v5) [](https://github.com/go-git/go-git/actions) [](https://goreportcard.com/report/github.com/go-git/go-git)
|
||||||
|
|
||||||
*go-git* is a highly extensible git implementation library written in **pure Go**.
|
*go-git* is a highly extensible git implementation library written in **pure Go**.
|
||||||
|
|
||||||
It can be used to manipulate git repositories at low level *(plumbing)* or high level *(porcelain)*, through an idiomatic Go API. It also supports several type of storage, such as in-memory filesystems, or custom implementations thanks to the [`Storer`](https://godoc.org/gopkg.in/src-d/go-git.v4/plumbing/storer) interface.
|
It can be used to manipulate git repositories at low level *(plumbing)* or high level *(porcelain)*, through an idiomatic Go API. It also supports several types of storage, such as in-memory filesystems, or custom implementations, thanks to the [`Storer`](https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/storer) interface.
|
||||||
|
|
||||||
|
It's being actively developed since 2015 and is being used extensively by [Keybase](https://keybase.io/blog/encrypted-git-for-everyone), [Gitea](https://gitea.io/en-us/) or [Pulumi](https://github.com/search?q=org%3Apulumi+go-git&type=Code), and by many other libraries and tools.
|
||||||
|
|
||||||
|
Project Status
|
||||||
|
--------------
|
||||||
|
|
||||||
|
After the legal issues with the [`src-d`](https://github.com/src-d) organization, the lack of update for four months and the requirement to make a hard fork, the project is **now back to normality**.
|
||||||
|
|
||||||
|
The project is currently actively maintained by individual contributors, including several of the original authors, but also backed by a new company, [gitsight](https://github.com/gitsight), where `go-git` is a critical component used at scale.
|
||||||
|
|
||||||
It's being actively develop since 2015 and is being use extensively by [source{d}](https://sourced.tech/) and [Keybase](https://keybase.io/blog/encrypted-git-for-everyone), and by many other libraries and tools.
|
|
||||||
|
|
||||||
Comparison with git
|
Comparison with git
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
*go-git* aims to be fully compatible with [git](https://github.com/git/git), all the *porcelain* operations are implemented to work exactly as *git* does.
|
*go-git* aims to be fully compatible with [git](https://github.com/git/git), all the *porcelain* operations are implemented to work exactly as *git* does.
|
||||||
|
|
||||||
*git* is a humongous project with years of development by thousands of contributors, making it challenging for *go-git* implement all the features. You can find a comparison of *go-git* vs *git* in the [compatibility documentation](COMPATIBILITY.md).
|
*git* is a humongous project with years of development by thousands of contributors, making it challenging for *go-git* to implement all the features. You can find a comparison of *go-git* vs *git* in the [compatibility documentation](COMPATIBILITY.md).
|
||||||
|
|
||||||
|
|
||||||
Installation
|
Installation
|
||||||
|
|
@ -20,16 +28,16 @@ Installation
|
||||||
|
|
||||||
The recommended way to install *go-git* is:
|
The recommended way to install *go-git* is:
|
||||||
|
|
||||||
```
|
```go
|
||||||
go get -u gopkg.in/src-d/go-git.v4/...
|
import "github.com/go-git/go-git/v5" // with go modules enabled (GO111MODULE=on or outside GOPATH)
|
||||||
|
import "github.com/go-git/go-git" // with go modules disabled
|
||||||
```
|
```
|
||||||
|
|
||||||
> We use [gopkg.in](http://labix.org/gopkg.in) for having a versioned API, this means that when `go get` clones the package, is the latest tag matching `v4.*` cloned and not the master branch.
|
|
||||||
|
|
||||||
Examples
|
Examples
|
||||||
--------
|
--------
|
||||||
|
|
||||||
> Please note that the functions `CheckIfError` and `Info` used in the examples are from the [examples package](https://github.com/src-d/go-git/blob/master/_examples/common.go#L17) just to be used in the examples.
|
> Please note that the `CheckIfError` and `Info` functions used in the examples are from the [examples package](https://github.com/go-git/go-git/blob/master/_examples/common.go#L19) just to be used in the examples.
|
||||||
|
|
||||||
|
|
||||||
### Basic example
|
### Basic example
|
||||||
|
|
@ -38,10 +46,10 @@ A basic example that mimics the standard `git clone` command
|
||||||
|
|
||||||
```go
|
```go
|
||||||
// Clone the given repository to the given directory
|
// Clone the given repository to the given directory
|
||||||
Info("git clone https://github.com/src-d/go-git")
|
Info("git clone https://github.com/go-git/go-git")
|
||||||
|
|
||||||
_, err := git.PlainClone("/tmp/foo", false, &git.CloneOptions{
|
_, err := git.PlainClone("/tmp/foo", false, &git.CloneOptions{
|
||||||
URL: "https://github.com/src-d/go-git",
|
URL: "https://github.com/go-git/go-git",
|
||||||
Progress: os.Stdout,
|
Progress: os.Stdout,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -63,15 +71,15 @@ Cloning a repository into memory and printing the history of HEAD, just like `gi
|
||||||
```go
|
```go
|
||||||
// Clones the given repository in memory, creating the remote, the local
|
// Clones the given repository in memory, creating the remote, the local
|
||||||
// branches and fetching the objects, exactly as:
|
// branches and fetching the objects, exactly as:
|
||||||
Info("git clone https://github.com/src-d/go-siva")
|
Info("git clone https://github.com/go-git/go-billy")
|
||||||
|
|
||||||
r, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{
|
r, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{
|
||||||
URL: "https://github.com/src-d/go-siva",
|
URL: "https://github.com/go-git/go-billy",
|
||||||
})
|
})
|
||||||
|
|
||||||
CheckIfError(err)
|
CheckIfError(err)
|
||||||
|
|
||||||
// Gets the HEAD history from HEAD, just like does:
|
// Gets the HEAD history from HEAD, just like this command:
|
||||||
Info("git log")
|
Info("git log")
|
||||||
|
|
||||||
// ... retrieves the branch pointed by HEAD
|
// ... retrieves the branch pointed by HEAD
|
||||||
|
|
@ -110,12 +118,12 @@ Date: Fri Nov 11 13:23:22 2016 +0100
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
You can find this [example](_examples/log/main.go) and many others at the [examples](_examples) folder
|
You can find this [example](_examples/log/main.go) and many others in the [examples](_examples) folder.
|
||||||
|
|
||||||
Contribute
|
Contribute
|
||||||
----------
|
----------
|
||||||
|
|
||||||
[Contributions](https://github.com/src-d/go-git/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) are more than welcome, if you are interested please take a look to
|
[Contributions](https://github.com/go-git/go-git/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) are more than welcome, if you are interested please take a look to
|
||||||
our [Contributing Guidelines](CONTRIBUTING.md).
|
our [Contributing Guidelines](CONTRIBUTING.md).
|
||||||
|
|
||||||
License
|
License
|
||||||
33
vendor/gopkg.in/src-d/go-git.v4/blame.go → vendor/github.com/go-git/go-git/v5/blame.go
generated
vendored
33
vendor/gopkg.in/src-d/go-git.v4/blame.go → vendor/github.com/go-git/go-git/v5/blame.go
generated
vendored
|
|
@ -9,9 +9,9 @@ import (
|
||||||
"time"
|
"time"
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
|
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing"
|
"github.com/go-git/go-git/v5/plumbing"
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing/object"
|
"github.com/go-git/go-git/v5/plumbing/object"
|
||||||
"gopkg.in/src-d/go-git.v4/utils/diff"
|
"github.com/go-git/go-git/v5/utils/diff"
|
||||||
)
|
)
|
||||||
|
|
||||||
// BlameResult represents the result of a Blame operation.
|
// BlameResult represents the result of a Blame operation.
|
||||||
|
|
@ -123,14 +123,25 @@ func newLine(author, text string, date time.Time, hash plumbing.Hash) *Line {
|
||||||
}
|
}
|
||||||
|
|
||||||
func newLines(contents []string, commits []*object.Commit) ([]*Line, error) {
|
func newLines(contents []string, commits []*object.Commit) ([]*Line, error) {
|
||||||
if len(contents) != len(commits) {
|
lcontents := len(contents)
|
||||||
return nil, errors.New("contents and commits have different length")
|
lcommits := len(commits)
|
||||||
|
|
||||||
|
if lcontents != lcommits {
|
||||||
|
if lcontents == lcommits-1 && contents[lcontents-1] != "\n" {
|
||||||
|
contents = append(contents, "\n")
|
||||||
|
} else {
|
||||||
|
return nil, errors.New("contents and commits have different length")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
result := make([]*Line, 0, len(contents))
|
|
||||||
|
result := make([]*Line, 0, lcontents)
|
||||||
for i := range contents {
|
for i := range contents {
|
||||||
l := newLine(commits[i].Author.Email, contents[i], commits[i].Author.When, commits[i].Hash)
|
result = append(result, newLine(
|
||||||
result = append(result, l)
|
commits[i].Author.Email, contents[i],
|
||||||
|
commits[i].Author.When, commits[i].Hash,
|
||||||
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -182,7 +193,7 @@ func (b *blame) fillGraphAndData() error {
|
||||||
// this first commit.
|
// this first commit.
|
||||||
if i == 0 {
|
if i == 0 {
|
||||||
for j := 0; j < nLines; j++ {
|
for j := 0; j < nLines; j++ {
|
||||||
b.graph[i][j] = (*object.Commit)(b.revs[i])
|
b.graph[i][j] = b.revs[i]
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// if this is not the first commit, then assign to the old
|
// if this is not the first commit, then assign to the old
|
||||||
|
|
@ -200,7 +211,7 @@ func (b *blame) sliceGraph(i int) []*object.Commit {
|
||||||
fVs := b.graph[i]
|
fVs := b.graph[i]
|
||||||
result := make([]*object.Commit, 0, len(fVs))
|
result := make([]*object.Commit, 0, len(fVs))
|
||||||
for _, v := range fVs {
|
for _, v := range fVs {
|
||||||
c := object.Commit(*v)
|
c := *v
|
||||||
result = append(result, &c)
|
result = append(result, &c)
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
|
|
@ -223,7 +234,7 @@ func (b *blame) assignOrigin(c, p int) {
|
||||||
b.graph[c][dl] = b.graph[p][sl]
|
b.graph[c][dl] = b.graph[p][sl]
|
||||||
case hunks[h].Type == 1:
|
case hunks[h].Type == 1:
|
||||||
dl++
|
dl++
|
||||||
b.graph[c][dl] = (*object.Commit)(b.revs[c])
|
b.graph[c][dl] = b.revs[c]
|
||||||
case hunks[h].Type == -1:
|
case hunks[h].Type == -1:
|
||||||
sl++
|
sl++
|
||||||
default:
|
default:
|
||||||
|
|
@ -3,13 +3,14 @@ package config
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing"
|
"github.com/go-git/go-git/v5/plumbing"
|
||||||
format "gopkg.in/src-d/go-git.v4/plumbing/format/config"
|
format "github.com/go-git/go-git/v5/plumbing/format/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
errBranchEmptyName = errors.New("branch config: empty name")
|
errBranchEmptyName = errors.New("branch config: empty name")
|
||||||
errBranchInvalidMerge = errors.New("branch config: invalid merge")
|
errBranchInvalidMerge = errors.New("branch config: invalid merge")
|
||||||
|
errBranchInvalidRebase = errors.New("branch config: rebase must be one of 'true' or 'interactive'")
|
||||||
)
|
)
|
||||||
|
|
||||||
// Branch contains information on the
|
// Branch contains information on the
|
||||||
|
|
@ -21,6 +22,10 @@ type Branch struct {
|
||||||
Remote string
|
Remote string
|
||||||
// Merge is the local refspec for the branch
|
// Merge is the local refspec for the branch
|
||||||
Merge plumbing.ReferenceName
|
Merge plumbing.ReferenceName
|
||||||
|
// Rebase instead of merge when pulling. Valid values are
|
||||||
|
// "true" and "interactive". "false" is undocumented and
|
||||||
|
// typically represented by the non-existence of this field
|
||||||
|
Rebase string
|
||||||
|
|
||||||
raw *format.Subsection
|
raw *format.Subsection
|
||||||
}
|
}
|
||||||
|
|
@ -35,6 +40,13 @@ func (b *Branch) Validate() error {
|
||||||
return errBranchInvalidMerge
|
return errBranchInvalidMerge
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if b.Rebase != "" &&
|
||||||
|
b.Rebase != "true" &&
|
||||||
|
b.Rebase != "interactive" &&
|
||||||
|
b.Rebase != "false" {
|
||||||
|
return errBranchInvalidRebase
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -57,6 +69,12 @@ func (b *Branch) marshal() *format.Subsection {
|
||||||
b.raw.SetOption(mergeKey, string(b.Merge))
|
b.raw.SetOption(mergeKey, string(b.Merge))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if b.Rebase == "" {
|
||||||
|
b.raw.RemoveOption(rebaseKey)
|
||||||
|
} else {
|
||||||
|
b.raw.SetOption(rebaseKey, b.Rebase)
|
||||||
|
}
|
||||||
|
|
||||||
return b.raw
|
return b.raw
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -66,6 +84,7 @@ func (b *Branch) unmarshal(s *format.Subsection) error {
|
||||||
b.Name = b.raw.Name
|
b.Name = b.raw.Name
|
||||||
b.Remote = b.raw.Options.Get(remoteSection)
|
b.Remote = b.raw.Options.Get(remoteSection)
|
||||||
b.Merge = plumbing.ReferenceName(b.raw.Options.Get(mergeKey))
|
b.Merge = plumbing.ReferenceName(b.raw.Options.Get(mergeKey))
|
||||||
|
b.Rebase = b.raw.Options.Get(rebaseKey)
|
||||||
|
|
||||||
return b.Validate()
|
return b.Validate()
|
||||||
}
|
}
|
||||||
|
|
@ -5,10 +5,16 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
"sort"
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
format "gopkg.in/src-d/go-git.v4/plumbing/format/config"
|
"github.com/go-git/go-git/v5/internal/url"
|
||||||
|
format "github.com/go-git/go-git/v5/plumbing/format/config"
|
||||||
|
"github.com/mitchellh/go-homedir"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
@ -31,8 +37,18 @@ var (
|
||||||
ErrRemoteConfigEmptyName = errors.New("remote config: empty name")
|
ErrRemoteConfigEmptyName = errors.New("remote config: empty name")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Scope defines the scope of a config file, such as local, global or system.
|
||||||
|
type Scope int
|
||||||
|
|
||||||
|
// Available ConfigScope's
|
||||||
|
const (
|
||||||
|
LocalScope Scope = iota
|
||||||
|
GlobalScope
|
||||||
|
SystemScope
|
||||||
|
)
|
||||||
|
|
||||||
// Config contains the repository configuration
|
// Config contains the repository configuration
|
||||||
// ftp://www.kernel.org/pub/software/scm/git/docs/git-config.html#FILES
|
// https://www.kernel.org/pub/software/scm/git/docs/git-config.html#FILES
|
||||||
type Config struct {
|
type Config struct {
|
||||||
Core struct {
|
Core struct {
|
||||||
// IsBare if true this repository is assumed to be bare and has no
|
// IsBare if true this repository is assumed to be bare and has no
|
||||||
|
|
@ -40,6 +56,30 @@ type Config struct {
|
||||||
IsBare bool
|
IsBare bool
|
||||||
// Worktree is the path to the root of the working tree.
|
// Worktree is the path to the root of the working tree.
|
||||||
Worktree string
|
Worktree string
|
||||||
|
// CommentChar is the character indicating the start of a
|
||||||
|
// comment for commands like commit and tag
|
||||||
|
CommentChar string
|
||||||
|
}
|
||||||
|
|
||||||
|
User struct {
|
||||||
|
// Name is the personal name of the author and the commiter of a commit.
|
||||||
|
Name string
|
||||||
|
// Email is the email of the author and the commiter of a commit.
|
||||||
|
Email string
|
||||||
|
}
|
||||||
|
|
||||||
|
Author struct {
|
||||||
|
// Name is the personal name of the author of a commit.
|
||||||
|
Name string
|
||||||
|
// Email is the email of the author of a commit.
|
||||||
|
Email string
|
||||||
|
}
|
||||||
|
|
||||||
|
Committer struct {
|
||||||
|
// Name is the personal name of the commiter of a commit.
|
||||||
|
Name string
|
||||||
|
// Email is the email of the the commiter of a commit.
|
||||||
|
Email string
|
||||||
}
|
}
|
||||||
|
|
||||||
Pack struct {
|
Pack struct {
|
||||||
|
|
@ -78,6 +118,77 @@ func NewConfig() *Config {
|
||||||
return config
|
return config
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ReadConfig reads a config file from a io.Reader.
|
||||||
|
func ReadConfig(r io.Reader) (*Config, error) {
|
||||||
|
b, err := ioutil.ReadAll(r)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := NewConfig()
|
||||||
|
if err = cfg.Unmarshal(b); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return cfg, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadConfig loads a config file from a given scope. The returned Config,
|
||||||
|
// contains exclusively information fom the given scope. If couldn't find a
|
||||||
|
// config file to the given scope, a empty one is returned.
|
||||||
|
func LoadConfig(scope Scope) (*Config, error) {
|
||||||
|
if scope == LocalScope {
|
||||||
|
return nil, fmt.Errorf("LocalScope should be read from the a ConfigStorer.")
|
||||||
|
}
|
||||||
|
|
||||||
|
files, err := Paths(scope)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, file := range files {
|
||||||
|
f, err := os.Open(file)
|
||||||
|
if err != nil {
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer f.Close()
|
||||||
|
return ReadConfig(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
return NewConfig(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Paths returns the config file location for a given scope.
|
||||||
|
func Paths(scope Scope) ([]string, error) {
|
||||||
|
var files []string
|
||||||
|
switch scope {
|
||||||
|
case GlobalScope:
|
||||||
|
xdg := os.Getenv("XDG_CONFIG_HOME")
|
||||||
|
if xdg != "" {
|
||||||
|
files = append(files, filepath.Join(xdg, "git/config"))
|
||||||
|
}
|
||||||
|
|
||||||
|
home, err := homedir.Dir()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
files = append(files,
|
||||||
|
filepath.Join(home, ".gitconfig"),
|
||||||
|
filepath.Join(home, ".config/git/config"),
|
||||||
|
)
|
||||||
|
case SystemScope:
|
||||||
|
files = append(files, "/etc/gitconfig")
|
||||||
|
}
|
||||||
|
|
||||||
|
return files, nil
|
||||||
|
}
|
||||||
|
|
||||||
// Validate validates the fields and sets the default values.
|
// Validate validates the fields and sets the default values.
|
||||||
func (c *Config) Validate() error {
|
func (c *Config) Validate() error {
|
||||||
for name, r := range c.Remotes {
|
for name, r := range c.Remotes {
|
||||||
|
|
@ -109,12 +220,19 @@ const (
|
||||||
branchSection = "branch"
|
branchSection = "branch"
|
||||||
coreSection = "core"
|
coreSection = "core"
|
||||||
packSection = "pack"
|
packSection = "pack"
|
||||||
|
userSection = "user"
|
||||||
|
authorSection = "author"
|
||||||
|
committerSection = "committer"
|
||||||
fetchKey = "fetch"
|
fetchKey = "fetch"
|
||||||
urlKey = "url"
|
urlKey = "url"
|
||||||
bareKey = "bare"
|
bareKey = "bare"
|
||||||
worktreeKey = "worktree"
|
worktreeKey = "worktree"
|
||||||
|
commentCharKey = "commentChar"
|
||||||
windowKey = "window"
|
windowKey = "window"
|
||||||
mergeKey = "merge"
|
mergeKey = "merge"
|
||||||
|
rebaseKey = "rebase"
|
||||||
|
nameKey = "name"
|
||||||
|
emailKey = "email"
|
||||||
|
|
||||||
// DefaultPackWindow holds the number of previous objects used to
|
// DefaultPackWindow holds the number of previous objects used to
|
||||||
// generate deltas. The value 10 is the same used by git command.
|
// generate deltas. The value 10 is the same used by git command.
|
||||||
|
|
@ -132,6 +250,7 @@ func (c *Config) Unmarshal(b []byte) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
c.unmarshalCore()
|
c.unmarshalCore()
|
||||||
|
c.unmarshalUser()
|
||||||
if err := c.unmarshalPack(); err != nil {
|
if err := c.unmarshalPack(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -151,6 +270,21 @@ func (c *Config) unmarshalCore() {
|
||||||
}
|
}
|
||||||
|
|
||||||
c.Core.Worktree = s.Options.Get(worktreeKey)
|
c.Core.Worktree = s.Options.Get(worktreeKey)
|
||||||
|
c.Core.CommentChar = s.Options.Get(commentCharKey)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Config) unmarshalUser() {
|
||||||
|
s := c.Raw.Section(userSection)
|
||||||
|
c.User.Name = s.Options.Get(nameKey)
|
||||||
|
c.User.Email = s.Options.Get(emailKey)
|
||||||
|
|
||||||
|
s = c.Raw.Section(authorSection)
|
||||||
|
c.Author.Name = s.Options.Get(nameKey)
|
||||||
|
c.Author.Email = s.Options.Get(emailKey)
|
||||||
|
|
||||||
|
s = c.Raw.Section(committerSection)
|
||||||
|
c.Committer.Name = s.Options.Get(nameKey)
|
||||||
|
c.Committer.Email = s.Options.Get(emailKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Config) unmarshalPack() error {
|
func (c *Config) unmarshalPack() error {
|
||||||
|
|
@ -213,6 +347,7 @@ func (c *Config) unmarshalBranches() error {
|
||||||
// Marshal returns Config encoded as a git-config file.
|
// Marshal returns Config encoded as a git-config file.
|
||||||
func (c *Config) Marshal() ([]byte, error) {
|
func (c *Config) Marshal() ([]byte, error) {
|
||||||
c.marshalCore()
|
c.marshalCore()
|
||||||
|
c.marshalUser()
|
||||||
c.marshalPack()
|
c.marshalPack()
|
||||||
c.marshalRemotes()
|
c.marshalRemotes()
|
||||||
c.marshalSubmodules()
|
c.marshalSubmodules()
|
||||||
|
|
@ -235,6 +370,35 @@ func (c *Config) marshalCore() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Config) marshalUser() {
|
||||||
|
s := c.Raw.Section(userSection)
|
||||||
|
if c.User.Name != "" {
|
||||||
|
s.SetOption(nameKey, c.User.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.User.Email != "" {
|
||||||
|
s.SetOption(emailKey, c.User.Email)
|
||||||
|
}
|
||||||
|
|
||||||
|
s = c.Raw.Section(authorSection)
|
||||||
|
if c.Author.Name != "" {
|
||||||
|
s.SetOption(nameKey, c.Author.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.Author.Email != "" {
|
||||||
|
s.SetOption(emailKey, c.Author.Email)
|
||||||
|
}
|
||||||
|
|
||||||
|
s = c.Raw.Section(committerSection)
|
||||||
|
if c.Committer.Name != "" {
|
||||||
|
s.SetOption(nameKey, c.Committer.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.Committer.Email != "" {
|
||||||
|
s.SetOption(emailKey, c.Committer.Email)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Config) marshalPack() {
|
func (c *Config) marshalPack() {
|
||||||
s := c.Raw.Section(packSection)
|
s := c.Raw.Section(packSection)
|
||||||
if c.Pack.Window != DefaultPackWindow {
|
if c.Pack.Window != DefaultPackWindow {
|
||||||
|
|
@ -394,3 +558,7 @@ func (c *RemoteConfig) marshal() *format.Subsection {
|
||||||
|
|
||||||
return c.raw
|
return c.raw
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *RemoteConfig) IsFirstURLLocal() bool {
|
||||||
|
return url.IsLocalEndpoint(c.URLs[0])
|
||||||
|
}
|
||||||
|
|
@ -5,7 +5,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
|
||||||
format "gopkg.in/src-d/go-git.v4/plumbing/format/config"
|
format "github.com/go-git/go-git/v5/plumbing/format/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
@ -4,7 +4,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing"
|
"github.com/go-git/go-git/v5/plumbing"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
@ -15,17 +15,17 @@ const (
|
||||||
|
|
||||||
var (
|
var (
|
||||||
ErrRefSpecMalformedSeparator = errors.New("malformed refspec, separators are wrong")
|
ErrRefSpecMalformedSeparator = errors.New("malformed refspec, separators are wrong")
|
||||||
ErrRefSpecMalformedWildcard = errors.New("malformed refspec, missmatched number of wildcards")
|
ErrRefSpecMalformedWildcard = errors.New("malformed refspec, mismatched number of wildcards")
|
||||||
)
|
)
|
||||||
|
|
||||||
// RefSpec is a mapping from local branches to remote references
|
// RefSpec is a mapping from local branches to remote references.
|
||||||
// The format of the refspec is an optional +, followed by <src>:<dst>, where
|
// The format of the refspec is an optional +, followed by <src>:<dst>, where
|
||||||
// <src> is the pattern for references on the remote side and <dst> is where
|
// <src> is the pattern for references on the remote side and <dst> is where
|
||||||
// those references will be written locally. The + tells Git to update the
|
// those references will be written locally. The + tells Git to update the
|
||||||
// reference even if it isn’t a fast-forward.
|
// reference even if it isn’t a fast-forward.
|
||||||
// eg.: "+refs/heads/*:refs/remotes/origin/*"
|
// eg.: "+refs/heads/*:refs/remotes/origin/*"
|
||||||
//
|
//
|
||||||
// https://git-scm.com/book/es/v2/Git-Internals-The-Refspec
|
// https://git-scm.com/book/en/v2/Git-Internals-The-Refspec
|
||||||
type RefSpec string
|
type RefSpec string
|
||||||
|
|
||||||
// Validate validates the RefSpec
|
// Validate validates the RefSpec
|
||||||
|
|
@ -59,6 +59,11 @@ func (s RefSpec) IsDelete() bool {
|
||||||
return s[0] == refSpecSeparator[0]
|
return s[0] == refSpecSeparator[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsExactSHA1 returns true if the source is a SHA1 hash.
|
||||||
|
func (s RefSpec) IsExactSHA1() bool {
|
||||||
|
return plumbing.IsHash(s.Src())
|
||||||
|
}
|
||||||
|
|
||||||
// Src return the src side.
|
// Src return the src side.
|
||||||
func (s RefSpec) Src() string {
|
func (s RefSpec) Src() string {
|
||||||
spec := string(s)
|
spec := string(s)
|
||||||
|
|
@ -69,8 +74,8 @@ func (s RefSpec) Src() string {
|
||||||
} else {
|
} else {
|
||||||
start = 0
|
start = 0
|
||||||
}
|
}
|
||||||
end := strings.Index(spec, refSpecSeparator)
|
|
||||||
|
|
||||||
|
end := strings.Index(spec, refSpecSeparator)
|
||||||
return spec[start:end]
|
return spec[start:end]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -99,11 +104,11 @@ func (s RefSpec) matchGlob(n plumbing.ReferenceName) bool {
|
||||||
|
|
||||||
var prefix, suffix string
|
var prefix, suffix string
|
||||||
prefix = src[0:wildcard]
|
prefix = src[0:wildcard]
|
||||||
if len(src) < wildcard {
|
if len(src) > wildcard+1 {
|
||||||
suffix = src[wildcard+1 : len(suffix)]
|
suffix = src[wildcard+1:]
|
||||||
}
|
}
|
||||||
|
|
||||||
return len(name) > len(prefix)+len(suffix) &&
|
return len(name) >= len(prefix)+len(suffix) &&
|
||||||
strings.HasPrefix(name, prefix) &&
|
strings.HasPrefix(name, prefix) &&
|
||||||
strings.HasSuffix(name, suffix)
|
strings.HasSuffix(name, suffix)
|
||||||
}
|
}
|
||||||
|
|
@ -127,6 +132,13 @@ func (s RefSpec) Dst(n plumbing.ReferenceName) plumbing.ReferenceName {
|
||||||
return plumbing.ReferenceName(dst[0:wd] + match + dst[wd+1:])
|
return plumbing.ReferenceName(dst[0:wd] + match + dst[wd+1:])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s RefSpec) Reverse() RefSpec {
|
||||||
|
spec := string(s)
|
||||||
|
separator := strings.Index(spec, refSpecSeparator)
|
||||||
|
|
||||||
|
return RefSpec(spec[separator+1:] + refSpecSeparator + spec[:separator])
|
||||||
|
}
|
||||||
|
|
||||||
func (s RefSpec) String() string {
|
func (s RefSpec) String() string {
|
||||||
return string(s)
|
return string(s)
|
||||||
}
|
}
|
||||||
2
vendor/gopkg.in/src-d/go-git.v4/doc.go → vendor/github.com/go-git/go-git/v5/doc.go
generated
vendored
2
vendor/gopkg.in/src-d/go-git.v4/doc.go → vendor/github.com/go-git/go-git/v5/doc.go
generated
vendored
|
|
@ -7,4 +7,4 @@
|
||||||
// It is highly extensible, we have been following the open/close principle in
|
// It is highly extensible, we have been following the open/close principle in
|
||||||
// its design to facilitate extensions, mainly focusing the efforts on the
|
// its design to facilitate extensions, mainly focusing the efforts on the
|
||||||
// persistence of the objects.
|
// persistence of the objects.
|
||||||
package git // import "gopkg.in/src-d/go-git.v4"
|
package git
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
module github.com/go-git/go-git/v5
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 // indirect
|
||||||
|
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5
|
||||||
|
github.com/emirpasic/gods v1.12.0
|
||||||
|
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 // indirect
|
||||||
|
github.com/gliderlabs/ssh v0.2.2
|
||||||
|
github.com/go-git/gcfg v1.5.0
|
||||||
|
github.com/go-git/go-billy/v5 v5.0.0
|
||||||
|
github.com/go-git/go-git-fixtures/v4 v4.0.1
|
||||||
|
github.com/google/go-cmp v0.3.0
|
||||||
|
github.com/imdario/mergo v0.3.9
|
||||||
|
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99
|
||||||
|
github.com/jessevdk/go-flags v1.4.0
|
||||||
|
github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd
|
||||||
|
github.com/mitchellh/go-homedir v1.1.0
|
||||||
|
github.com/pkg/errors v0.8.1 // indirect
|
||||||
|
github.com/sergi/go-diff v1.1.0
|
||||||
|
github.com/xanzy/ssh-agent v0.2.1
|
||||||
|
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073
|
||||||
|
golang.org/x/net v0.0.0-20200301022130-244492dfa37a
|
||||||
|
golang.org/x/text v0.3.2
|
||||||
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f
|
||||||
|
gopkg.in/warnings.v0 v0.1.2 // indirect
|
||||||
|
)
|
||||||
|
|
||||||
|
go 1.13
|
||||||
|
|
@ -0,0 +1,80 @@
|
||||||
|
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs=
|
||||||
|
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
|
||||||
|
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA=
|
||||||
|
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
|
||||||
|
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
|
||||||
|
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
|
||||||
|
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg=
|
||||||
|
github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
|
||||||
|
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ=
|
||||||
|
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
|
||||||
|
github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0=
|
||||||
|
github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
|
||||||
|
github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4=
|
||||||
|
github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E=
|
||||||
|
github.com/go-git/go-billy/v5 v5.0.0 h1:7NQHvd9FVid8VL4qVUMm8XifBK+2xCoZ2lSk0agRrHM=
|
||||||
|
github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
|
||||||
|
github.com/go-git/go-git-fixtures/v4 v4.0.1 h1:q+IFMfLx200Q3scvt2hN79JsEzy4AmBTp/pqnefH+Bc=
|
||||||
|
github.com/go-git/go-git-fixtures/v4 v4.0.1/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw=
|
||||||
|
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
|
||||||
|
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
|
github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg=
|
||||||
|
github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
||||||
|
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
|
||||||
|
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
|
||||||
|
github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA=
|
||||||
|
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||||
|
github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY=
|
||||||
|
github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
|
||||||
|
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
||||||
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
|
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
|
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||||
|
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||||
|
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
|
||||||
|
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
|
||||||
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||||
|
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||||
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
|
||||||
|
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
||||||
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
|
github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70=
|
||||||
|
github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4=
|
||||||
|
golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073 h1:xMPOj6Pz6UipU1wXLkrtqpHbR0AVFnyPEQq/wRWz9lM=
|
||||||
|
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20200301022130-244492dfa37a h1:GuSPYbZzB5/dcLNCwLQLsg3obCJtX9IJhpXkvY7kzk0=
|
||||||
|
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 h1:uYVVQ9WP/Ds2ROhcaGPeIdVq0RIXVLwsHlnvJ+cT1So=
|
||||||
|
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
||||||
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||||
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
|
||||||
|
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
|
||||||
|
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
// Package revision extracts git revision from string
|
// Package revision extracts git revision from string
|
||||||
// More informations about revision : https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html
|
// More information about revision : https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html
|
||||||
package revision
|
package revision
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
@ -10,7 +10,7 @@ import (
|
||||||
// validates it belongs to a rune category
|
// validates it belongs to a rune category
|
||||||
type runeCategoryValidator func(r rune) bool
|
type runeCategoryValidator func(r rune) bool
|
||||||
|
|
||||||
// tokenizeExpression aggegates a series of runes matching check predicate into a single
|
// tokenizeExpression aggregates a series of runes matching check predicate into a single
|
||||||
// string and provides given tokenType as token type
|
// string and provides given tokenType as token type
|
||||||
func tokenizeExpression(ch rune, tokenType token, check runeCategoryValidator, r *bufio.Reader) (token, string, error) {
|
func tokenizeExpression(ch rune, tokenType token, check runeCategoryValidator, r *bufio.Reader) (token, string, error) {
|
||||||
var data []rune
|
var data []rune
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
package url
|
||||||
|
|
||||||
|
import (
|
||||||
|
"regexp"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
isSchemeRegExp = regexp.MustCompile(`^[^:]+://`)
|
||||||
|
scpLikeUrlRegExp = regexp.MustCompile(`^(?:(?P<user>[^@]+)@)?(?P<host>[^:\s]+):(?:(?P<port>[0-9]{1,5})(?:\/|:))?(?P<path>[^\\].*\/[^\\].*)$`)
|
||||||
|
)
|
||||||
|
|
||||||
|
// MatchesScheme returns true if the given string matches a URL-like
|
||||||
|
// format scheme.
|
||||||
|
func MatchesScheme(url string) bool {
|
||||||
|
return isSchemeRegExp.MatchString(url)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MatchesScpLike returns true if the given string matches an SCP-like
|
||||||
|
// format scheme.
|
||||||
|
func MatchesScpLike(url string) bool {
|
||||||
|
return scpLikeUrlRegExp.MatchString(url)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FindScpLikeComponents returns the user, host, port and path of the
|
||||||
|
// given SCP-like URL.
|
||||||
|
func FindScpLikeComponents(url string) (user, host, port, path string) {
|
||||||
|
m := scpLikeUrlRegExp.FindStringSubmatch(url)
|
||||||
|
return m[1], m[2], m[3], m[4]
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsLocalEndpoint returns true if the given URL string specifies a
|
||||||
|
// local file endpoint. For example, on a Linux machine,
|
||||||
|
// `/home/user/src/go-git` would match as a local endpoint, but
|
||||||
|
// `https://github.com/src-d/go-git` would not.
|
||||||
|
func IsLocalEndpoint(url string) bool {
|
||||||
|
return !MatchesScheme(url) && !MatchesScpLike(url)
|
||||||
|
}
|
||||||
|
|
@ -3,10 +3,10 @@ package git
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing"
|
"github.com/go-git/go-git/v5/plumbing"
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing/filemode"
|
"github.com/go-git/go-git/v5/plumbing/filemode"
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing/object"
|
"github.com/go-git/go-git/v5/plumbing/object"
|
||||||
"gopkg.in/src-d/go-git.v4/storage"
|
"github.com/go-git/go-git/v5/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
type objectWalker struct {
|
type objectWalker struct {
|
||||||
|
|
@ -21,7 +21,7 @@ func newObjectWalker(s storage.Storer) *objectWalker {
|
||||||
return &objectWalker{s, map[plumbing.Hash]struct{}{}}
|
return &objectWalker{s, map[plumbing.Hash]struct{}{}}
|
||||||
}
|
}
|
||||||
|
|
||||||
// walkAllRefs walks all (hash) refererences from the repo.
|
// walkAllRefs walks all (hash) references from the repo.
|
||||||
func (p *objectWalker) walkAllRefs() error {
|
func (p *objectWalker) walkAllRefs() error {
|
||||||
// Walk over all the references in the repo.
|
// Walk over all the references in the repo.
|
||||||
it, err := p.Storer.IterReferences()
|
it, err := p.Storer.IterReferences()
|
||||||
|
|
@ -94,6 +94,8 @@ func (p *objectWalker) walkObjectTree(hash plumbing.Hash) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
case *object.Tag:
|
||||||
|
return p.walkObjectTree(obj.Target)
|
||||||
default:
|
default:
|
||||||
// Error out on unhandled object types.
|
// Error out on unhandled object types.
|
||||||
return fmt.Errorf("Unknown object %X %s %T\n", obj.ID(), obj.Type(), obj)
|
return fmt.Errorf("Unknown object %X %s %T\n", obj.ID(), obj.Type(), obj)
|
||||||
140
vendor/gopkg.in/src-d/go-git.v4/options.go → vendor/github.com/go-git/go-git/v5/options.go
generated
vendored
140
vendor/gopkg.in/src-d/go-git.v4/options.go → vendor/github.com/go-git/go-git/v5/options.go
generated
vendored
|
|
@ -3,13 +3,15 @@ package git
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/go-git/go-git/v5/config"
|
||||||
|
"github.com/go-git/go-git/v5/plumbing"
|
||||||
|
"github.com/go-git/go-git/v5/plumbing/object"
|
||||||
|
"github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband"
|
||||||
|
"github.com/go-git/go-git/v5/plumbing/transport"
|
||||||
"golang.org/x/crypto/openpgp"
|
"golang.org/x/crypto/openpgp"
|
||||||
"gopkg.in/src-d/go-git.v4/config"
|
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing"
|
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing/object"
|
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing/protocol/packp/sideband"
|
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing/transport"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// SubmoduleRescursivity defines how depth will affect any submodule recursive
|
// SubmoduleRescursivity defines how depth will affect any submodule recursive
|
||||||
|
|
@ -185,6 +187,12 @@ type PushOptions struct {
|
||||||
// Progress is where the human readable information sent by the server is
|
// Progress is where the human readable information sent by the server is
|
||||||
// stored, if nil nothing is stored.
|
// stored, if nil nothing is stored.
|
||||||
Progress sideband.Progress
|
Progress sideband.Progress
|
||||||
|
// Prune specify that remote refs that match given RefSpecs and that do
|
||||||
|
// not exist locally will be removed.
|
||||||
|
Prune bool
|
||||||
|
// Force allows the push to update a remote branch even when the local
|
||||||
|
// branch does not descend from it.
|
||||||
|
Force bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate validates the fields and sets the default values.
|
// Validate validates the fields and sets the default values.
|
||||||
|
|
@ -228,10 +236,11 @@ var (
|
||||||
ErrCreateRequiresBranch = errors.New("Branch is mandatory when Create is used")
|
ErrCreateRequiresBranch = errors.New("Branch is mandatory when Create is used")
|
||||||
)
|
)
|
||||||
|
|
||||||
// CheckoutOptions describes how a checkout 31operation should be performed.
|
// CheckoutOptions describes how a checkout operation should be performed.
|
||||||
type CheckoutOptions struct {
|
type CheckoutOptions struct {
|
||||||
// Hash to be checked out, if used HEAD will in detached mode. Branch and
|
// Hash is the hash of the commit to be checked out. If used, HEAD will be
|
||||||
// Hash are mutually exclusive, if Create is not used.
|
// in detached mode. If Create is not used, Branch and Hash are mutually
|
||||||
|
// exclusive.
|
||||||
Hash plumbing.Hash
|
Hash plumbing.Hash
|
||||||
// Branch to be checked out, if Branch and Hash are empty is set to `master`.
|
// Branch to be checked out, if Branch and Hash are empty is set to `master`.
|
||||||
Branch plumbing.ReferenceName
|
Branch plumbing.ReferenceName
|
||||||
|
|
@ -240,6 +249,11 @@ type CheckoutOptions struct {
|
||||||
// Force, if true when switching branches, proceed even if the index or the
|
// Force, if true when switching branches, proceed even if the index or the
|
||||||
// working tree differs from HEAD. This is used to throw away local changes
|
// working tree differs from HEAD. This is used to throw away local changes
|
||||||
Force bool
|
Force bool
|
||||||
|
// Keep, if true when switching branches, local changes (the index or the
|
||||||
|
// working tree changes) will be kept so that they can be committed to the
|
||||||
|
// target branch. Force and Keep are mutually exclusive, should not be both
|
||||||
|
// set to true.
|
||||||
|
Keep bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate validates the fields and sets the default values.
|
// Validate validates the fields and sets the default values.
|
||||||
|
|
@ -286,7 +300,7 @@ const (
|
||||||
|
|
||||||
// ResetOptions describes how a reset operation should be performed.
|
// ResetOptions describes how a reset operation should be performed.
|
||||||
type ResetOptions struct {
|
type ResetOptions struct {
|
||||||
// Commit, if commit is pressent set the current branch head (HEAD) to it.
|
// Commit, if commit is present set the current branch head (HEAD) to it.
|
||||||
Commit plumbing.Hash
|
Commit plumbing.Hash
|
||||||
// Mode, form resets the current branch head to Commit and possibly updates
|
// Mode, form resets the current branch head to Commit and possibly updates
|
||||||
// the index (resetting it to the tree of Commit) and the working tree
|
// the index (resetting it to the tree of Commit) and the working tree
|
||||||
|
|
@ -329,6 +343,30 @@ type LogOptions struct {
|
||||||
// set Order=LogOrderCommitterTime for ordering by committer time (more compatible with `git log`)
|
// set Order=LogOrderCommitterTime for ordering by committer time (more compatible with `git log`)
|
||||||
// set Order=LogOrderBSF for Breadth-first search
|
// set Order=LogOrderBSF for Breadth-first search
|
||||||
Order LogOrder
|
Order LogOrder
|
||||||
|
|
||||||
|
// Show only those commits in which the specified file was inserted/updated.
|
||||||
|
// It is equivalent to running `git log -- <file-name>`.
|
||||||
|
// this field is kept for compatility, it can be replaced with PathFilter
|
||||||
|
FileName *string
|
||||||
|
|
||||||
|
// Filter commits based on the path of files that are updated
|
||||||
|
// takes file path as argument and should return true if the file is desired
|
||||||
|
// It can be used to implement `git log -- <path>`
|
||||||
|
// either <path> is a file path, or directory path, or a regexp of file/directory path
|
||||||
|
PathFilter func(string) bool
|
||||||
|
|
||||||
|
// Pretend as if all the refs in refs/, along with HEAD, are listed on the command line as <commit>.
|
||||||
|
// It is equivalent to running `git log --all`.
|
||||||
|
// If set on true, the From option will be ignored.
|
||||||
|
All bool
|
||||||
|
|
||||||
|
// Show commits more recent than a specific date.
|
||||||
|
// It is equivalent to running `git log --since <date>` or `git log --after <date>`.
|
||||||
|
Since *time.Time
|
||||||
|
|
||||||
|
// Show commits older than a specific date.
|
||||||
|
// It is equivalent to running `git log --until <date>` or `git log --before <date>`.
|
||||||
|
Until *time.Time
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
@ -340,7 +378,8 @@ type CommitOptions struct {
|
||||||
// All automatically stage files that have been modified and deleted, but
|
// All automatically stage files that have been modified and deleted, but
|
||||||
// new files you have not told Git about are not affected.
|
// new files you have not told Git about are not affected.
|
||||||
All bool
|
All bool
|
||||||
// Author is the author's signature of the commit.
|
// Author is the author's signature of the commit. If Author is empty the
|
||||||
|
// Name and Email is read from the config, and time.Now it's used as When.
|
||||||
Author *object.Signature
|
Author *object.Signature
|
||||||
// Committer is the committer's signature of the commit. If Committer is
|
// Committer is the committer's signature of the commit. If Committer is
|
||||||
// nil the Author signature is used.
|
// nil the Author signature is used.
|
||||||
|
|
@ -348,15 +387,18 @@ type CommitOptions struct {
|
||||||
// Parents are the parents commits for the new commit, by default when
|
// Parents are the parents commits for the new commit, by default when
|
||||||
// len(Parents) is zero, the hash of HEAD reference is used.
|
// len(Parents) is zero, the hash of HEAD reference is used.
|
||||||
Parents []plumbing.Hash
|
Parents []plumbing.Hash
|
||||||
// A key to sign the commit with. A nil value here means the commit will not
|
// SignKey denotes a key to sign the commit with. A nil value here means the
|
||||||
// be signed. The private key must be present and already decrypted.
|
// commit will not be signed. The private key must be present and already
|
||||||
|
// decrypted.
|
||||||
SignKey *openpgp.Entity
|
SignKey *openpgp.Entity
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate validates the fields and sets the default values.
|
// Validate validates the fields and sets the default values.
|
||||||
func (o *CommitOptions) Validate(r *Repository) error {
|
func (o *CommitOptions) Validate(r *Repository) error {
|
||||||
if o.Author == nil {
|
if o.Author == nil {
|
||||||
return ErrMissingAuthor
|
if err := o.loadConfigAuthorAndCommitter(r); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if o.Committer == nil {
|
if o.Committer == nil {
|
||||||
|
|
@ -377,6 +419,78 @@ func (o *CommitOptions) Validate(r *Repository) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (o *CommitOptions) loadConfigAuthorAndCommitter(r *Repository) error {
|
||||||
|
cfg, err := r.ConfigScoped(config.SystemScope)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if o.Author == nil && cfg.Author.Email != "" && cfg.Author.Name != "" {
|
||||||
|
o.Author = &object.Signature{
|
||||||
|
Name: cfg.Author.Name,
|
||||||
|
Email: cfg.Author.Email,
|
||||||
|
When: time.Now(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if o.Committer == nil && cfg.Committer.Email != "" && cfg.Committer.Name != "" {
|
||||||
|
o.Committer = &object.Signature{
|
||||||
|
Name: cfg.Committer.Name,
|
||||||
|
Email: cfg.Committer.Email,
|
||||||
|
When: time.Now(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if o.Author == nil && cfg.User.Email != "" && cfg.User.Name != "" {
|
||||||
|
o.Author = &object.Signature{
|
||||||
|
Name: cfg.User.Name,
|
||||||
|
Email: cfg.User.Email,
|
||||||
|
When: time.Now(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if o.Author == nil {
|
||||||
|
return ErrMissingAuthor
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrMissingName = errors.New("name field is required")
|
||||||
|
ErrMissingTagger = errors.New("tagger field is required")
|
||||||
|
ErrMissingMessage = errors.New("message field is required")
|
||||||
|
)
|
||||||
|
|
||||||
|
// CreateTagOptions describes how a tag object should be created.
|
||||||
|
type CreateTagOptions struct {
|
||||||
|
// Tagger defines the signature of the tag creator.
|
||||||
|
Tagger *object.Signature
|
||||||
|
// Message defines the annotation of the tag. It is canonicalized during
|
||||||
|
// validation into the format expected by git - no leading whitespace and
|
||||||
|
// ending in a newline.
|
||||||
|
Message string
|
||||||
|
// SignKey denotes a key to sign the tag with. A nil value here means the tag
|
||||||
|
// will not be signed. The private key must be present and already decrypted.
|
||||||
|
SignKey *openpgp.Entity
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate validates the fields and sets the default values.
|
||||||
|
func (o *CreateTagOptions) Validate(r *Repository, hash plumbing.Hash) error {
|
||||||
|
if o.Tagger == nil {
|
||||||
|
return ErrMissingTagger
|
||||||
|
}
|
||||||
|
|
||||||
|
if o.Message == "" {
|
||||||
|
return ErrMissingMessage
|
||||||
|
}
|
||||||
|
|
||||||
|
// Canonicalize the message into the expected message format.
|
||||||
|
o.Message = strings.TrimSpace(o.Message) + "\n"
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// ListOptions describes how a remote list should be performed.
|
// ListOptions describes how a remote list should be performed.
|
||||||
type ListOptions struct {
|
type ListOptions struct {
|
||||||
// Auth credentials, if required, to use with the remote repository.
|
// Auth credentials, if required, to use with the remote repository.
|
||||||
|
|
@ -45,19 +45,23 @@ func (c *BufferLRU) Put(key int64, slice []byte) {
|
||||||
c.ll = list.New()
|
c.ll = list.New()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bufSize := FileSize(len(slice))
|
||||||
if ee, ok := c.cache[key]; ok {
|
if ee, ok := c.cache[key]; ok {
|
||||||
|
oldBuf := ee.Value.(buffer)
|
||||||
|
// in this case bufSize is a delta: new size - old size
|
||||||
|
bufSize -= FileSize(len(oldBuf.Slice))
|
||||||
c.ll.MoveToFront(ee)
|
c.ll.MoveToFront(ee)
|
||||||
ee.Value = buffer{key, slice}
|
ee.Value = buffer{key, slice}
|
||||||
return
|
} else {
|
||||||
|
if bufSize > c.MaxSize {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ee := c.ll.PushFront(buffer{key, slice})
|
||||||
|
c.cache[key] = ee
|
||||||
}
|
}
|
||||||
|
|
||||||
objSize := FileSize(len(slice))
|
c.actualSize += bufSize
|
||||||
|
for c.actualSize > c.MaxSize {
|
||||||
if objSize > c.MaxSize {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
for c.actualSize+objSize > c.MaxSize {
|
|
||||||
last := c.ll.Back()
|
last := c.ll.Back()
|
||||||
lastObj := last.Value.(buffer)
|
lastObj := last.Value.(buffer)
|
||||||
lastSize := FileSize(len(lastObj.Slice))
|
lastSize := FileSize(len(lastObj.Slice))
|
||||||
|
|
@ -66,10 +70,6 @@ func (c *BufferLRU) Put(key int64, slice []byte) {
|
||||||
delete(c.cache, lastObj.Key)
|
delete(c.cache, lastObj.Key)
|
||||||
c.actualSize -= lastSize
|
c.actualSize -= lastSize
|
||||||
}
|
}
|
||||||
|
|
||||||
ee := c.ll.PushFront(buffer{key, slice})
|
|
||||||
c.cache[key] = ee
|
|
||||||
c.actualSize += objSize
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get returns a buffer by its key. It marks the buffer as used. If the buffer
|
// Get returns a buffer by its key. It marks the buffer as used. If the buffer
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package cache
|
package cache
|
||||||
|
|
||||||
import "gopkg.in/src-d/go-git.v4/plumbing"
|
import "github.com/go-git/go-git/v5/plumbing"
|
||||||
|
|
||||||
const (
|
const (
|
||||||
Byte FileSize = 1 << (iota * 10)
|
Byte FileSize = 1 << (iota * 10)
|
||||||
|
|
@ -4,7 +4,7 @@ import (
|
||||||
"container/list"
|
"container/list"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing"
|
"github.com/go-git/go-git/v5/plumbing"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ObjectLRU implements an object cache with an LRU eviction policy and a
|
// ObjectLRU implements an object cache with an LRU eviction policy and a
|
||||||
|
|
@ -42,21 +42,30 @@ func (c *ObjectLRU) Put(obj plumbing.EncodedObject) {
|
||||||
c.ll = list.New()
|
c.ll = list.New()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
objSize := FileSize(obj.Size())
|
||||||
key := obj.Hash()
|
key := obj.Hash()
|
||||||
if ee, ok := c.cache[key]; ok {
|
if ee, ok := c.cache[key]; ok {
|
||||||
|
oldObj := ee.Value.(plumbing.EncodedObject)
|
||||||
|
// in this case objSize is a delta: new size - old size
|
||||||
|
objSize -= FileSize(oldObj.Size())
|
||||||
c.ll.MoveToFront(ee)
|
c.ll.MoveToFront(ee)
|
||||||
ee.Value = obj
|
ee.Value = obj
|
||||||
return
|
} else {
|
||||||
|
if objSize > c.MaxSize {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ee := c.ll.PushFront(obj)
|
||||||
|
c.cache[key] = ee
|
||||||
}
|
}
|
||||||
|
|
||||||
objSize := FileSize(obj.Size())
|
c.actualSize += objSize
|
||||||
|
for c.actualSize > c.MaxSize {
|
||||||
if objSize > c.MaxSize {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
for c.actualSize+objSize > c.MaxSize {
|
|
||||||
last := c.ll.Back()
|
last := c.ll.Back()
|
||||||
|
if last == nil {
|
||||||
|
c.actualSize = 0
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
lastObj := last.Value.(plumbing.EncodedObject)
|
lastObj := last.Value.(plumbing.EncodedObject)
|
||||||
lastSize := FileSize(lastObj.Size())
|
lastSize := FileSize(lastObj.Size())
|
||||||
|
|
||||||
|
|
@ -64,10 +73,6 @@ func (c *ObjectLRU) Put(obj plumbing.EncodedObject) {
|
||||||
delete(c.cache, lastObj.Hash())
|
delete(c.cache, lastObj.Hash())
|
||||||
c.actualSize -= lastSize
|
c.actualSize -= lastSize
|
||||||
}
|
}
|
||||||
|
|
||||||
ee := c.ll.PushFront(obj)
|
|
||||||
c.cache[key] = ee
|
|
||||||
c.actualSize += objSize
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get returns an object by its hash. It marks the object as used. If the object
|
// Get returns an object by its hash. It marks the object as used. If the object
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
package color
|
||||||
|
|
||||||
|
// TODO read colors from a github.com/go-git/go-git/plumbing/format/config.Config struct
|
||||||
|
// TODO implement color parsing, see https://github.com/git/git/blob/v2.26.2/color.c
|
||||||
|
|
||||||
|
// Colors. See https://github.com/git/git/blob/v2.26.2/color.h#L24-L53.
|
||||||
|
const (
|
||||||
|
Normal = ""
|
||||||
|
Reset = "\033[m"
|
||||||
|
Bold = "\033[1m"
|
||||||
|
Red = "\033[31m"
|
||||||
|
Green = "\033[32m"
|
||||||
|
Yellow = "\033[33m"
|
||||||
|
Blue = "\033[34m"
|
||||||
|
Magenta = "\033[35m"
|
||||||
|
Cyan = "\033[36m"
|
||||||
|
BoldRed = "\033[1;31m"
|
||||||
|
BoldGreen = "\033[1;32m"
|
||||||
|
BoldYellow = "\033[1;33m"
|
||||||
|
BoldBlue = "\033[1;34m"
|
||||||
|
BoldMagenta = "\033[1;35m"
|
||||||
|
BoldCyan = "\033[1;36m"
|
||||||
|
FaintRed = "\033[2;31m"
|
||||||
|
FaintGreen = "\033[2;32m"
|
||||||
|
FaintYellow = "\033[2;33m"
|
||||||
|
FaintBlue = "\033[2;34m"
|
||||||
|
FaintMagenta = "\033[2;35m"
|
||||||
|
FaintCyan = "\033[2;36m"
|
||||||
|
BgRed = "\033[41m"
|
||||||
|
BgGreen = "\033[42m"
|
||||||
|
BgYellow = "\033[43m"
|
||||||
|
BgBlue = "\033[44m"
|
||||||
|
BgMagenta = "\033[45m"
|
||||||
|
BgCyan = "\033[46m"
|
||||||
|
Faint = "\033[2m"
|
||||||
|
FaintItalic = "\033[2;3m"
|
||||||
|
Reverse = "\033[7m"
|
||||||
|
)
|
||||||
|
|
@ -32,10 +32,10 @@ const (
|
||||||
Regular FileMode = 0100644
|
Regular FileMode = 0100644
|
||||||
// Deprecated represent non-executable files with the group writable
|
// Deprecated represent non-executable files with the group writable
|
||||||
// bit set. This mode was supported by the first versions of git,
|
// bit set. This mode was supported by the first versions of git,
|
||||||
// but it has been deprecatred nowadays. This library uses them
|
// but it has been deprecated nowadays. This library uses them
|
||||||
// internally, so you can read old packfiles, but will treat them as
|
// internally, so you can read old packfiles, but will treat them as
|
||||||
// Regulars when interfacing with the outside world. This is the
|
// Regulars when interfacing with the outside world. This is the
|
||||||
// standard git behaviuor.
|
// standard git behaviour.
|
||||||
Deprecated FileMode = 0100664
|
Deprecated FileMode = 0100664
|
||||||
// Executable represents executable files.
|
// Executable represents executable files.
|
||||||
Executable FileMode = 0100755
|
Executable FileMode = 0100755
|
||||||
|
|
@ -152,7 +152,7 @@ func (m FileMode) IsRegular() bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsFile returns if the FileMode represents that of a file, this is,
|
// IsFile returns if the FileMode represents that of a file, this is,
|
||||||
// Regular, Deprecated, Excutable or Link.
|
// Regular, Deprecated, Executable or Link.
|
||||||
func (m FileMode) IsFile() bool {
|
func (m FileMode) IsFile() bool {
|
||||||
return m == Regular ||
|
return m == Regular ||
|
||||||
m == Deprecated ||
|
m == Deprecated ||
|
||||||
|
|
@ -3,7 +3,7 @@ package config
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"github.com/src-d/gcfg"
|
"github.com/go-git/gcfg"
|
||||||
)
|
)
|
||||||
|
|
||||||
// A Decoder reads and decodes config files from an input stream.
|
// A Decoder reads and decodes config files from an input stream.
|
||||||
97
vendor/github.com/go-git/go-git/v5/plumbing/format/diff/colorconfig.go
generated
vendored
Normal file
97
vendor/github.com/go-git/go-git/v5/plumbing/format/diff/colorconfig.go
generated
vendored
Normal file
|
|
@ -0,0 +1,97 @@
|
||||||
|
package diff
|
||||||
|
|
||||||
|
import "github.com/go-git/go-git/v5/plumbing/color"
|
||||||
|
|
||||||
|
// A ColorKey is a key into a ColorConfig map and also equal to the key in the
|
||||||
|
// diff.color subsection of the config. See
|
||||||
|
// https://github.com/git/git/blob/v2.26.2/diff.c#L83-L106.
|
||||||
|
type ColorKey string
|
||||||
|
|
||||||
|
// ColorKeys.
|
||||||
|
const (
|
||||||
|
Context ColorKey = "context"
|
||||||
|
Meta ColorKey = "meta"
|
||||||
|
Frag ColorKey = "frag"
|
||||||
|
Old ColorKey = "old"
|
||||||
|
New ColorKey = "new"
|
||||||
|
Commit ColorKey = "commit"
|
||||||
|
Whitespace ColorKey = "whitespace"
|
||||||
|
Func ColorKey = "func"
|
||||||
|
OldMoved ColorKey = "oldMoved"
|
||||||
|
OldMovedAlternative ColorKey = "oldMovedAlternative"
|
||||||
|
OldMovedDimmed ColorKey = "oldMovedDimmed"
|
||||||
|
OldMovedAlternativeDimmed ColorKey = "oldMovedAlternativeDimmed"
|
||||||
|
NewMoved ColorKey = "newMoved"
|
||||||
|
NewMovedAlternative ColorKey = "newMovedAlternative"
|
||||||
|
NewMovedDimmed ColorKey = "newMovedDimmed"
|
||||||
|
NewMovedAlternativeDimmed ColorKey = "newMovedAlternativeDimmed"
|
||||||
|
ContextDimmed ColorKey = "contextDimmed"
|
||||||
|
OldDimmed ColorKey = "oldDimmed"
|
||||||
|
NewDimmed ColorKey = "newDimmed"
|
||||||
|
ContextBold ColorKey = "contextBold"
|
||||||
|
OldBold ColorKey = "oldBold"
|
||||||
|
NewBold ColorKey = "newBold"
|
||||||
|
)
|
||||||
|
|
||||||
|
// A ColorConfig is a color configuration. A nil or empty ColorConfig
|
||||||
|
// corresponds to no color.
|
||||||
|
type ColorConfig map[ColorKey]string
|
||||||
|
|
||||||
|
// A ColorConfigOption sets an option on a ColorConfig.
|
||||||
|
type ColorConfigOption func(ColorConfig)
|
||||||
|
|
||||||
|
// WithColor sets the color for key.
|
||||||
|
func WithColor(key ColorKey, color string) ColorConfigOption {
|
||||||
|
return func(cc ColorConfig) {
|
||||||
|
cc[key] = color
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// defaultColorConfig is the default color configuration. See
|
||||||
|
// https://github.com/git/git/blob/v2.26.2/diff.c#L57-L81.
|
||||||
|
var defaultColorConfig = ColorConfig{
|
||||||
|
Context: color.Normal,
|
||||||
|
Meta: color.Bold,
|
||||||
|
Frag: color.Cyan,
|
||||||
|
Old: color.Red,
|
||||||
|
New: color.Green,
|
||||||
|
Commit: color.Yellow,
|
||||||
|
Whitespace: color.BgRed,
|
||||||
|
Func: color.Normal,
|
||||||
|
OldMoved: color.BoldMagenta,
|
||||||
|
OldMovedAlternative: color.BoldBlue,
|
||||||
|
OldMovedDimmed: color.Faint,
|
||||||
|
OldMovedAlternativeDimmed: color.FaintItalic,
|
||||||
|
NewMoved: color.BoldCyan,
|
||||||
|
NewMovedAlternative: color.BoldYellow,
|
||||||
|
NewMovedDimmed: color.Faint,
|
||||||
|
NewMovedAlternativeDimmed: color.FaintItalic,
|
||||||
|
ContextDimmed: color.Faint,
|
||||||
|
OldDimmed: color.FaintRed,
|
||||||
|
NewDimmed: color.FaintGreen,
|
||||||
|
ContextBold: color.Bold,
|
||||||
|
OldBold: color.BoldRed,
|
||||||
|
NewBold: color.BoldGreen,
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewColorConfig returns a new ColorConfig.
|
||||||
|
func NewColorConfig(options ...ColorConfigOption) ColorConfig {
|
||||||
|
cc := make(ColorConfig)
|
||||||
|
for key, value := range defaultColorConfig {
|
||||||
|
cc[key] = value
|
||||||
|
}
|
||||||
|
for _, option := range options {
|
||||||
|
option(cc)
|
||||||
|
}
|
||||||
|
return cc
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset returns the ANSI escape sequence to reset the color with key set from
|
||||||
|
// cc. If no color was set then no reset is needed so it returns the empty
|
||||||
|
// string.
|
||||||
|
func (cc ColorConfig) Reset(key ColorKey) string {
|
||||||
|
if cc[key] == "" {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return color.Reset
|
||||||
|
}
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
package diff
|
package diff
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing"
|
"github.com/go-git/go-git/v5/plumbing"
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing/filemode"
|
"github.com/go-git/go-git/v5/plumbing/filemode"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Operation defines the operation of a diff item.
|
// Operation defines the operation of a diff item.
|
||||||
376
vendor/github.com/go-git/go-git/v5/plumbing/format/diff/unified_encoder.go
generated
vendored
Normal file
376
vendor/github.com/go-git/go-git/v5/plumbing/format/diff/unified_encoder.go
generated
vendored
Normal file
|
|
@ -0,0 +1,376 @@
|
||||||
|
package diff
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"regexp"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/go-git/go-git/v5/plumbing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DefaultContextLines is the default number of context lines.
|
||||||
|
const DefaultContextLines = 3
|
||||||
|
|
||||||
|
var (
|
||||||
|
splitLinesRegexp = regexp.MustCompile(`[^\n]*(\n|$)`)
|
||||||
|
|
||||||
|
operationChar = map[Operation]byte{
|
||||||
|
Add: '+',
|
||||||
|
Delete: '-',
|
||||||
|
Equal: ' ',
|
||||||
|
}
|
||||||
|
|
||||||
|
operationColorKey = map[Operation]ColorKey{
|
||||||
|
Add: New,
|
||||||
|
Delete: Old,
|
||||||
|
Equal: Context,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// UnifiedEncoder encodes an unified diff into the provided Writer. It does not
|
||||||
|
// support similarity index for renames or sorting hash representations.
|
||||||
|
type UnifiedEncoder struct {
|
||||||
|
io.Writer
|
||||||
|
|
||||||
|
// contextLines is the count of unchanged lines that will appear surrounding
|
||||||
|
// a change.
|
||||||
|
contextLines int
|
||||||
|
|
||||||
|
// colorConfig is the color configuration. The default is no color.
|
||||||
|
color ColorConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewUnifiedEncoder returns a new UnifiedEncoder that writes to w.
|
||||||
|
func NewUnifiedEncoder(w io.Writer, contextLines int) *UnifiedEncoder {
|
||||||
|
return &UnifiedEncoder{
|
||||||
|
Writer: w,
|
||||||
|
contextLines: contextLines,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetColor sets e's color configuration and returns e.
|
||||||
|
func (e *UnifiedEncoder) SetColor(colorConfig ColorConfig) *UnifiedEncoder {
|
||||||
|
e.color = colorConfig
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
|
||||||
|
// Encode encodes patch.
|
||||||
|
func (e *UnifiedEncoder) Encode(patch Patch) error {
|
||||||
|
sb := &strings.Builder{}
|
||||||
|
|
||||||
|
if message := patch.Message(); message != "" {
|
||||||
|
sb.WriteString(message)
|
||||||
|
if !strings.HasSuffix(message, "\n") {
|
||||||
|
sb.WriteByte('\n')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, filePatch := range patch.FilePatches() {
|
||||||
|
e.writeFilePatchHeader(sb, filePatch)
|
||||||
|
g := newHunksGenerator(filePatch.Chunks(), e.contextLines)
|
||||||
|
for _, hunk := range g.Generate() {
|
||||||
|
hunk.writeTo(sb, e.color)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := e.Write([]byte(sb.String()))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *UnifiedEncoder) writeFilePatchHeader(sb *strings.Builder, filePatch FilePatch) {
|
||||||
|
from, to := filePatch.Files()
|
||||||
|
if from == nil && to == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
isBinary := filePatch.IsBinary()
|
||||||
|
|
||||||
|
var lines []string
|
||||||
|
switch {
|
||||||
|
case from != nil && to != nil:
|
||||||
|
hashEquals := from.Hash() == to.Hash()
|
||||||
|
lines = append(lines,
|
||||||
|
fmt.Sprintf("diff --git a/%s b/%s", from.Path(), to.Path()),
|
||||||
|
)
|
||||||
|
if from.Mode() != to.Mode() {
|
||||||
|
lines = append(lines,
|
||||||
|
fmt.Sprintf("old mode %o", from.Mode()),
|
||||||
|
fmt.Sprintf("new mode %o", to.Mode()),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
if from.Path() != to.Path() {
|
||||||
|
lines = append(lines,
|
||||||
|
fmt.Sprintf("rename from %s", from.Path()),
|
||||||
|
fmt.Sprintf("rename to %s", to.Path()),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
if from.Mode() != to.Mode() && !hashEquals {
|
||||||
|
lines = append(lines,
|
||||||
|
fmt.Sprintf("index %s..%s", from.Hash(), to.Hash()),
|
||||||
|
)
|
||||||
|
} else if !hashEquals {
|
||||||
|
lines = append(lines,
|
||||||
|
fmt.Sprintf("index %s..%s %o", from.Hash(), to.Hash(), from.Mode()),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
if !hashEquals {
|
||||||
|
lines = e.appendPathLines(lines, "a/"+from.Path(), "b/"+to.Path(), isBinary)
|
||||||
|
}
|
||||||
|
case from == nil:
|
||||||
|
lines = append(lines,
|
||||||
|
fmt.Sprintf("diff --git a/%s b/%s", to.Path(), to.Path()),
|
||||||
|
fmt.Sprintf("new file mode %o", to.Mode()),
|
||||||
|
fmt.Sprintf("index %s..%s", plumbing.ZeroHash, to.Hash()),
|
||||||
|
)
|
||||||
|
lines = e.appendPathLines(lines, "/dev/null", "b/"+to.Path(), isBinary)
|
||||||
|
case to == nil:
|
||||||
|
lines = append(lines,
|
||||||
|
fmt.Sprintf("diff --git a/%s b/%s", from.Path(), from.Path()),
|
||||||
|
fmt.Sprintf("deleted file mode %o", from.Mode()),
|
||||||
|
fmt.Sprintf("index %s..%s", from.Hash(), plumbing.ZeroHash),
|
||||||
|
)
|
||||||
|
lines = e.appendPathLines(lines, "a/"+from.Path(), "/dev/null", isBinary)
|
||||||
|
}
|
||||||
|
|
||||||
|
sb.WriteString(e.color[Meta])
|
||||||
|
sb.WriteString(lines[0])
|
||||||
|
for _, line := range lines[1:] {
|
||||||
|
sb.WriteByte('\n')
|
||||||
|
sb.WriteString(line)
|
||||||
|
}
|
||||||
|
sb.WriteString(e.color.Reset(Meta))
|
||||||
|
sb.WriteByte('\n')
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *UnifiedEncoder) appendPathLines(lines []string, fromPath, toPath string, isBinary bool) []string {
|
||||||
|
if isBinary {
|
||||||
|
return append(lines,
|
||||||
|
fmt.Sprintf("Binary files %s and %s differ", fromPath, toPath),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return append(lines,
|
||||||
|
fmt.Sprintf("--- %s", fromPath),
|
||||||
|
fmt.Sprintf("+++ %s", toPath),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
type hunksGenerator struct {
|
||||||
|
fromLine, toLine int
|
||||||
|
ctxLines int
|
||||||
|
chunks []Chunk
|
||||||
|
current *hunk
|
||||||
|
hunks []*hunk
|
||||||
|
beforeContext, afterContext []string
|
||||||
|
}
|
||||||
|
|
||||||
|
func newHunksGenerator(chunks []Chunk, ctxLines int) *hunksGenerator {
|
||||||
|
return &hunksGenerator{
|
||||||
|
chunks: chunks,
|
||||||
|
ctxLines: ctxLines,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *hunksGenerator) Generate() []*hunk {
|
||||||
|
for i, chunk := range g.chunks {
|
||||||
|
lines := splitLines(chunk.Content())
|
||||||
|
nLines := len(lines)
|
||||||
|
|
||||||
|
switch chunk.Type() {
|
||||||
|
case Equal:
|
||||||
|
g.fromLine += nLines
|
||||||
|
g.toLine += nLines
|
||||||
|
g.processEqualsLines(lines, i)
|
||||||
|
case Delete:
|
||||||
|
if nLines != 0 {
|
||||||
|
g.fromLine++
|
||||||
|
}
|
||||||
|
|
||||||
|
g.processHunk(i, chunk.Type())
|
||||||
|
g.fromLine += nLines - 1
|
||||||
|
g.current.AddOp(chunk.Type(), lines...)
|
||||||
|
case Add:
|
||||||
|
if nLines != 0 {
|
||||||
|
g.toLine++
|
||||||
|
}
|
||||||
|
g.processHunk(i, chunk.Type())
|
||||||
|
g.toLine += nLines - 1
|
||||||
|
g.current.AddOp(chunk.Type(), lines...)
|
||||||
|
}
|
||||||
|
|
||||||
|
if i == len(g.chunks)-1 && g.current != nil {
|
||||||
|
g.hunks = append(g.hunks, g.current)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return g.hunks
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *hunksGenerator) processHunk(i int, op Operation) {
|
||||||
|
if g.current != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var ctxPrefix string
|
||||||
|
linesBefore := len(g.beforeContext)
|
||||||
|
if linesBefore > g.ctxLines {
|
||||||
|
ctxPrefix = g.beforeContext[linesBefore-g.ctxLines-1]
|
||||||
|
g.beforeContext = g.beforeContext[linesBefore-g.ctxLines:]
|
||||||
|
linesBefore = g.ctxLines
|
||||||
|
}
|
||||||
|
|
||||||
|
g.current = &hunk{ctxPrefix: strings.TrimSuffix(ctxPrefix, "\n")}
|
||||||
|
g.current.AddOp(Equal, g.beforeContext...)
|
||||||
|
|
||||||
|
switch op {
|
||||||
|
case Delete:
|
||||||
|
g.current.fromLine, g.current.toLine =
|
||||||
|
g.addLineNumbers(g.fromLine, g.toLine, linesBefore, i, Add)
|
||||||
|
case Add:
|
||||||
|
g.current.toLine, g.current.fromLine =
|
||||||
|
g.addLineNumbers(g.toLine, g.fromLine, linesBefore, i, Delete)
|
||||||
|
}
|
||||||
|
|
||||||
|
g.beforeContext = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// addLineNumbers obtains the line numbers in a new chunk.
|
||||||
|
func (g *hunksGenerator) addLineNumbers(la, lb int, linesBefore int, i int, op Operation) (cla, clb int) {
|
||||||
|
cla = la - linesBefore
|
||||||
|
// we need to search for a reference for the next diff
|
||||||
|
switch {
|
||||||
|
case linesBefore != 0 && g.ctxLines != 0:
|
||||||
|
if lb > g.ctxLines {
|
||||||
|
clb = lb - g.ctxLines + 1
|
||||||
|
} else {
|
||||||
|
clb = 1
|
||||||
|
}
|
||||||
|
case g.ctxLines == 0:
|
||||||
|
clb = lb
|
||||||
|
case i != len(g.chunks)-1:
|
||||||
|
next := g.chunks[i+1]
|
||||||
|
if next.Type() == op || next.Type() == Equal {
|
||||||
|
// this diff will be into this chunk
|
||||||
|
clb = lb + 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *hunksGenerator) processEqualsLines(ls []string, i int) {
|
||||||
|
if g.current == nil {
|
||||||
|
g.beforeContext = append(g.beforeContext, ls...)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
g.afterContext = append(g.afterContext, ls...)
|
||||||
|
if len(g.afterContext) <= g.ctxLines*2 && i != len(g.chunks)-1 {
|
||||||
|
g.current.AddOp(Equal, g.afterContext...)
|
||||||
|
g.afterContext = nil
|
||||||
|
} else {
|
||||||
|
ctxLines := g.ctxLines
|
||||||
|
if ctxLines > len(g.afterContext) {
|
||||||
|
ctxLines = len(g.afterContext)
|
||||||
|
}
|
||||||
|
g.current.AddOp(Equal, g.afterContext[:ctxLines]...)
|
||||||
|
g.hunks = append(g.hunks, g.current)
|
||||||
|
|
||||||
|
g.current = nil
|
||||||
|
g.beforeContext = g.afterContext[ctxLines:]
|
||||||
|
g.afterContext = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func splitLines(s string) []string {
|
||||||
|
out := splitLinesRegexp.FindAllString(s, -1)
|
||||||
|
if out[len(out)-1] == "" {
|
||||||
|
out = out[:len(out)-1]
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
type hunk struct {
|
||||||
|
fromLine int
|
||||||
|
toLine int
|
||||||
|
|
||||||
|
fromCount int
|
||||||
|
toCount int
|
||||||
|
|
||||||
|
ctxPrefix string
|
||||||
|
ops []*op
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *hunk) writeTo(sb *strings.Builder, color ColorConfig) {
|
||||||
|
sb.WriteString(color[Frag])
|
||||||
|
sb.WriteString("@@ -")
|
||||||
|
|
||||||
|
if h.fromCount == 1 {
|
||||||
|
sb.WriteString(strconv.Itoa(h.fromLine))
|
||||||
|
} else {
|
||||||
|
sb.WriteString(strconv.Itoa(h.fromLine))
|
||||||
|
sb.WriteByte(',')
|
||||||
|
sb.WriteString(strconv.Itoa(h.fromCount))
|
||||||
|
}
|
||||||
|
|
||||||
|
sb.WriteString(" +")
|
||||||
|
|
||||||
|
if h.toCount == 1 {
|
||||||
|
sb.WriteString(strconv.Itoa(h.toLine))
|
||||||
|
} else {
|
||||||
|
sb.WriteString(strconv.Itoa(h.toLine))
|
||||||
|
sb.WriteByte(',')
|
||||||
|
sb.WriteString(strconv.Itoa(h.toCount))
|
||||||
|
}
|
||||||
|
|
||||||
|
sb.WriteString(" @@")
|
||||||
|
sb.WriteString(color.Reset(Frag))
|
||||||
|
|
||||||
|
if h.ctxPrefix != "" {
|
||||||
|
sb.WriteByte(' ')
|
||||||
|
sb.WriteString(color[Func])
|
||||||
|
sb.WriteString(h.ctxPrefix)
|
||||||
|
sb.WriteString(color.Reset(Func))
|
||||||
|
}
|
||||||
|
|
||||||
|
sb.WriteByte('\n')
|
||||||
|
|
||||||
|
for _, op := range h.ops {
|
||||||
|
op.writeTo(sb, color)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *hunk) AddOp(t Operation, ss ...string) {
|
||||||
|
n := len(ss)
|
||||||
|
switch t {
|
||||||
|
case Add:
|
||||||
|
h.toCount += n
|
||||||
|
case Delete:
|
||||||
|
h.fromCount += n
|
||||||
|
case Equal:
|
||||||
|
h.toCount += n
|
||||||
|
h.fromCount += n
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, s := range ss {
|
||||||
|
h.ops = append(h.ops, &op{s, t})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type op struct {
|
||||||
|
text string
|
||||||
|
t Operation
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *op) writeTo(sb *strings.Builder, color ColorConfig) {
|
||||||
|
colorKey := operationColorKey[o.t]
|
||||||
|
sb.WriteString(color[colorKey])
|
||||||
|
sb.WriteByte(operationChar[o.t])
|
||||||
|
if strings.HasSuffix(o.text, "\n") {
|
||||||
|
sb.WriteString(strings.TrimSuffix(o.text, "\n"))
|
||||||
|
} else {
|
||||||
|
sb.WriteString(o.text + "\n\\ No newline at end of file")
|
||||||
|
}
|
||||||
|
sb.WriteString(color.Reset(colorKey))
|
||||||
|
sb.WriteByte('\n')
|
||||||
|
}
|
||||||
|
|
@ -7,9 +7,9 @@ import (
|
||||||
"os/user"
|
"os/user"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"gopkg.in/src-d/go-billy.v4"
|
"github.com/go-git/go-billy/v5"
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing/format/config"
|
"github.com/go-git/go-git/v5/plumbing/format/config"
|
||||||
gioutil "gopkg.in/src-d/go-git.v4/utils/ioutil"
|
gioutil "github.com/go-git/go-git/v5/utils/ioutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
@ -133,6 +133,9 @@ func (p *pattern) globMatch(path []string, isDir bool) bool {
|
||||||
} else if match {
|
} else if match {
|
||||||
matched = true
|
matched = true
|
||||||
break
|
break
|
||||||
|
} else if len(path) == 0 {
|
||||||
|
// if nothing left then fail
|
||||||
|
matched = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -6,13 +6,13 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"gopkg.in/src-d/go-git.v4/utils/binary"
|
"github.com/go-git/go-git/v5/utils/binary"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// ErrUnsupportedVersion is returned by Decode when the idx file version
|
// ErrUnsupportedVersion is returned by Decode when the idx file version
|
||||||
// is not supported.
|
// is not supported.
|
||||||
ErrUnsupportedVersion = errors.New("Unsuported version")
|
ErrUnsupportedVersion = errors.New("Unsupported version")
|
||||||
// ErrMalformedIdxFile is returned by Decode when the idx file is corrupted.
|
// ErrMalformedIdxFile is returned by Decode when the idx file is corrupted.
|
||||||
ErrMalformedIdxFile = errors.New("Malformed IDX file")
|
ErrMalformedIdxFile = errors.New("Malformed IDX file")
|
||||||
)
|
)
|
||||||
|
|
@ -110,10 +110,6 @@ func readObjectNames(idx *MemoryIndex, r io.Reader) error {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if buckets < 0 {
|
|
||||||
return ErrMalformedIdxFile
|
|
||||||
}
|
|
||||||
|
|
||||||
idx.FanoutMapping[k] = len(idx.Names)
|
idx.FanoutMapping[k] = len(idx.Names)
|
||||||
|
|
||||||
nameLen := int(buckets * objectIDLength)
|
nameLen := int(buckets * objectIDLength)
|
||||||
|
|
@ -5,7 +5,7 @@ import (
|
||||||
"hash"
|
"hash"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"gopkg.in/src-d/go-git.v4/utils/binary"
|
"github.com/go-git/go-git/v5/utils/binary"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Encoder writes MemoryIndex structs to an output stream.
|
// Encoder writes MemoryIndex structs to an output stream.
|
||||||
|
|
@ -3,9 +3,11 @@ package idxfile
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"io"
|
"io"
|
||||||
|
"sort"
|
||||||
|
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing"
|
encbin "encoding/binary"
|
||||||
"gopkg.in/src-d/go-git.v4/utils/binary"
|
|
||||||
|
"github.com/go-git/go-git/v5/plumbing"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
@ -34,6 +36,9 @@ type Index interface {
|
||||||
Count() (int64, error)
|
Count() (int64, error)
|
||||||
// Entries returns an iterator to retrieve all index entries.
|
// Entries returns an iterator to retrieve all index entries.
|
||||||
Entries() (EntryIter, error)
|
Entries() (EntryIter, error)
|
||||||
|
// EntriesByOffset returns an iterator to retrieve all index entries ordered
|
||||||
|
// by offset.
|
||||||
|
EntriesByOffset() (EntryIter, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MemoryIndex is the in memory representation of an idx file.
|
// MemoryIndex is the in memory representation of an idx file.
|
||||||
|
|
@ -51,7 +56,8 @@ type MemoryIndex struct {
|
||||||
PackfileChecksum [20]byte
|
PackfileChecksum [20]byte
|
||||||
IdxChecksum [20]byte
|
IdxChecksum [20]byte
|
||||||
|
|
||||||
offsetHash map[int64]plumbing.Hash
|
offsetHash map[int64]plumbing.Hash
|
||||||
|
offsetHashIsFull bool
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ Index = (*MemoryIndex)(nil)
|
var _ Index = (*MemoryIndex)(nil)
|
||||||
|
|
@ -117,31 +123,32 @@ func (idx *MemoryIndex) FindOffset(h plumbing.Hash) (int64, error) {
|
||||||
return 0, plumbing.ErrObjectNotFound
|
return 0, plumbing.ErrObjectNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
return idx.getOffset(k, i)
|
offset := idx.getOffset(k, i)
|
||||||
|
|
||||||
|
if !idx.offsetHashIsFull {
|
||||||
|
// Save the offset for reverse lookup
|
||||||
|
if idx.offsetHash == nil {
|
||||||
|
idx.offsetHash = make(map[int64]plumbing.Hash)
|
||||||
|
}
|
||||||
|
idx.offsetHash[int64(offset)] = h
|
||||||
|
}
|
||||||
|
|
||||||
|
return int64(offset), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
const isO64Mask = uint64(1) << 31
|
const isO64Mask = uint64(1) << 31
|
||||||
|
|
||||||
func (idx *MemoryIndex) getOffset(firstLevel, secondLevel int) (int64, error) {
|
func (idx *MemoryIndex) getOffset(firstLevel, secondLevel int) uint64 {
|
||||||
offset := secondLevel << 2
|
offset := secondLevel << 2
|
||||||
buf := bytes.NewBuffer(idx.Offset32[firstLevel][offset : offset+4])
|
ofs := encbin.BigEndian.Uint32(idx.Offset32[firstLevel][offset : offset+4])
|
||||||
ofs, err := binary.ReadUint32(buf)
|
|
||||||
if err != nil {
|
|
||||||
return -1, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if (uint64(ofs) & isO64Mask) != 0 {
|
if (uint64(ofs) & isO64Mask) != 0 {
|
||||||
offset := 8 * (uint64(ofs) & ^isO64Mask)
|
offset := 8 * (uint64(ofs) & ^isO64Mask)
|
||||||
buf := bytes.NewBuffer(idx.Offset64[offset : offset+8])
|
n := encbin.BigEndian.Uint64(idx.Offset64[offset : offset+8])
|
||||||
n, err := binary.ReadUint64(buf)
|
return n
|
||||||
if err != nil {
|
|
||||||
return -1, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return int64(n), nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return int64(ofs), nil
|
return uint64(ofs)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FindCRC32 implements the Index interface.
|
// FindCRC32 implements the Index interface.
|
||||||
|
|
@ -152,25 +159,34 @@ func (idx *MemoryIndex) FindCRC32(h plumbing.Hash) (uint32, error) {
|
||||||
return 0, plumbing.ErrObjectNotFound
|
return 0, plumbing.ErrObjectNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
return idx.getCRC32(k, i)
|
return idx.getCRC32(k, i), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (idx *MemoryIndex) getCRC32(firstLevel, secondLevel int) (uint32, error) {
|
func (idx *MemoryIndex) getCRC32(firstLevel, secondLevel int) uint32 {
|
||||||
offset := secondLevel << 2
|
offset := secondLevel << 2
|
||||||
buf := bytes.NewBuffer(idx.CRC32[firstLevel][offset : offset+4])
|
return encbin.BigEndian.Uint32(idx.CRC32[firstLevel][offset : offset+4])
|
||||||
return binary.ReadUint32(buf)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// FindHash implements the Index interface.
|
// FindHash implements the Index interface.
|
||||||
func (idx *MemoryIndex) FindHash(o int64) (plumbing.Hash, error) {
|
func (idx *MemoryIndex) FindHash(o int64) (plumbing.Hash, error) {
|
||||||
// Lazily generate the reverse offset/hash map if required.
|
var hash plumbing.Hash
|
||||||
if idx.offsetHash == nil {
|
var ok bool
|
||||||
if err := idx.genOffsetHash(); err != nil {
|
|
||||||
return plumbing.ZeroHash, err
|
if idx.offsetHash != nil {
|
||||||
|
if hash, ok = idx.offsetHash[o]; ok {
|
||||||
|
return hash, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hash, ok := idx.offsetHash[o]
|
// Lazily generate the reverse offset/hash map if required.
|
||||||
|
if !idx.offsetHashIsFull || idx.offsetHash == nil {
|
||||||
|
if err := idx.genOffsetHash(); err != nil {
|
||||||
|
return plumbing.ZeroHash, err
|
||||||
|
}
|
||||||
|
|
||||||
|
hash, ok = idx.offsetHash[o]
|
||||||
|
}
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return plumbing.ZeroHash, plumbing.ErrObjectNotFound
|
return plumbing.ZeroHash, plumbing.ErrObjectNotFound
|
||||||
}
|
}
|
||||||
|
|
@ -186,23 +202,21 @@ func (idx *MemoryIndex) genOffsetHash() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
idx.offsetHash = make(map[int64]plumbing.Hash, count)
|
idx.offsetHash = make(map[int64]plumbing.Hash, count)
|
||||||
|
idx.offsetHashIsFull = true
|
||||||
|
|
||||||
iter, err := idx.Entries()
|
var hash plumbing.Hash
|
||||||
if err != nil {
|
i := uint32(0)
|
||||||
return err
|
for firstLevel, fanoutValue := range idx.Fanout {
|
||||||
}
|
mappedFirstLevel := idx.FanoutMapping[firstLevel]
|
||||||
|
for secondLevel := uint32(0); i < fanoutValue; i++ {
|
||||||
for {
|
copy(hash[:], idx.Names[mappedFirstLevel][secondLevel*objectIDLength:])
|
||||||
entry, err := iter.Next()
|
offset := int64(idx.getOffset(mappedFirstLevel, int(secondLevel)))
|
||||||
if err != nil {
|
idx.offsetHash[offset] = hash
|
||||||
if err == io.EOF {
|
secondLevel++
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
idx.offsetHash[int64(entry.Offset)] = entry.Hash
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Count implements the Index interface.
|
// Count implements the Index interface.
|
||||||
|
|
@ -215,6 +229,36 @@ func (idx *MemoryIndex) Entries() (EntryIter, error) {
|
||||||
return &idxfileEntryIter{idx, 0, 0, 0}, nil
|
return &idxfileEntryIter{idx, 0, 0, 0}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EntriesByOffset implements the Index interface.
|
||||||
|
func (idx *MemoryIndex) EntriesByOffset() (EntryIter, error) {
|
||||||
|
count, err := idx.Count()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
iter := &idxfileEntryOffsetIter{
|
||||||
|
entries: make(entriesByOffset, count),
|
||||||
|
}
|
||||||
|
|
||||||
|
entries, err := idx.Entries()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for pos := 0; int64(pos) < count; pos++ {
|
||||||
|
entry, err := entries.Next()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
iter.entries[pos] = entry
|
||||||
|
}
|
||||||
|
|
||||||
|
sort.Sort(iter.entries)
|
||||||
|
|
||||||
|
return iter, nil
|
||||||
|
}
|
||||||
|
|
||||||
// EntryIter is an iterator that will return the entries in a packfile index.
|
// EntryIter is an iterator that will return the entries in a packfile index.
|
||||||
type EntryIter interface {
|
type EntryIter interface {
|
||||||
// Next returns the next entry in the packfile index.
|
// Next returns the next entry in the packfile index.
|
||||||
|
|
@ -241,22 +285,11 @@ func (i *idxfileEntryIter) Next() (*Entry, error) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mappedFirstLevel := i.idx.FanoutMapping[i.firstLevel]
|
||||||
entry := new(Entry)
|
entry := new(Entry)
|
||||||
ofs := i.secondLevel * objectIDLength
|
copy(entry.Hash[:], i.idx.Names[mappedFirstLevel][i.secondLevel*objectIDLength:])
|
||||||
copy(entry.Hash[:], i.idx.Names[i.idx.FanoutMapping[i.firstLevel]][ofs:])
|
entry.Offset = i.idx.getOffset(mappedFirstLevel, i.secondLevel)
|
||||||
|
entry.CRC32 = i.idx.getCRC32(mappedFirstLevel, i.secondLevel)
|
||||||
pos := i.idx.FanoutMapping[entry.Hash[0]]
|
|
||||||
|
|
||||||
offset, err := i.idx.getOffset(pos, i.secondLevel)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
entry.Offset = uint64(offset)
|
|
||||||
|
|
||||||
entry.CRC32, err = i.idx.getCRC32(pos, i.secondLevel)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
i.secondLevel++
|
i.secondLevel++
|
||||||
i.total++
|
i.total++
|
||||||
|
|
@ -276,3 +309,38 @@ type Entry struct {
|
||||||
CRC32 uint32
|
CRC32 uint32
|
||||||
Offset uint64
|
Offset uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type idxfileEntryOffsetIter struct {
|
||||||
|
entries entriesByOffset
|
||||||
|
pos int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *idxfileEntryOffsetIter) Next() (*Entry, error) {
|
||||||
|
if i.pos >= len(i.entries) {
|
||||||
|
return nil, io.EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
entry := i.entries[i.pos]
|
||||||
|
i.pos++
|
||||||
|
|
||||||
|
return entry, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *idxfileEntryOffsetIter) Close() error {
|
||||||
|
i.pos = len(i.entries) + 1
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type entriesByOffset []*Entry
|
||||||
|
|
||||||
|
func (o entriesByOffset) Len() int {
|
||||||
|
return len(o)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o entriesByOffset) Less(i int, j int) bool {
|
||||||
|
return o[i].Offset < o[j].Offset
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o entriesByOffset) Swap(i int, j int) {
|
||||||
|
o[i], o[j] = o[j], o[i]
|
||||||
|
}
|
||||||
|
|
@ -7,8 +7,8 @@ import (
|
||||||
"sort"
|
"sort"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing"
|
"github.com/go-git/go-git/v5/plumbing"
|
||||||
"gopkg.in/src-d/go-git.v4/utils/binary"
|
"github.com/go-git/go-git/v5/utils/binary"
|
||||||
)
|
)
|
||||||
|
|
||||||
// objects implements sort.Interface and uses hash as sorting key.
|
// objects implements sort.Interface and uses hash as sorting key.
|
||||||
|
|
@ -147,7 +147,7 @@ func (w *Writer) createIndex() (*MemoryIndex, error) {
|
||||||
idx.Offset32[bucket] = append(idx.Offset32[bucket], buf.Bytes()...)
|
idx.Offset32[bucket] = append(idx.Offset32[bucket], buf.Bytes()...)
|
||||||
|
|
||||||
buf.Truncate(0)
|
buf.Truncate(0)
|
||||||
binary.WriteUint32(buf, uint32(o.CRC32))
|
binary.WriteUint32(buf, o.CRC32)
|
||||||
idx.CRC32[bucket] = append(idx.CRC32[bucket], buf.Bytes()...)
|
idx.CRC32[bucket] = append(idx.CRC32[bucket], buf.Bytes()...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
package index
|
package index
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
"crypto/sha1"
|
"crypto/sha1"
|
||||||
"errors"
|
"errors"
|
||||||
|
|
@ -10,8 +11,8 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing"
|
"github.com/go-git/go-git/v5/plumbing"
|
||||||
"gopkg.in/src-d/go-git.v4/utils/binary"
|
"github.com/go-git/go-git/v5/utils/binary"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
@ -21,7 +22,7 @@ var (
|
||||||
// ErrMalformedSignature is returned by Decode when the index header file is
|
// ErrMalformedSignature is returned by Decode when the index header file is
|
||||||
// malformed
|
// malformed
|
||||||
ErrMalformedSignature = errors.New("malformed index signature file")
|
ErrMalformedSignature = errors.New("malformed index signature file")
|
||||||
// ErrInvalidChecksum is returned by Decode if the SHA1 hash missmatch with
|
// ErrInvalidChecksum is returned by Decode if the SHA1 hash mismatch with
|
||||||
// the read content
|
// the read content
|
||||||
ErrInvalidChecksum = errors.New("invalid checksum")
|
ErrInvalidChecksum = errors.New("invalid checksum")
|
||||||
|
|
||||||
|
|
@ -42,14 +43,17 @@ type Decoder struct {
|
||||||
r io.Reader
|
r io.Reader
|
||||||
hash hash.Hash
|
hash hash.Hash
|
||||||
lastEntry *Entry
|
lastEntry *Entry
|
||||||
|
|
||||||
|
extReader *bufio.Reader
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDecoder returns a new decoder that reads from r.
|
// NewDecoder returns a new decoder that reads from r.
|
||||||
func NewDecoder(r io.Reader) *Decoder {
|
func NewDecoder(r io.Reader) *Decoder {
|
||||||
h := sha1.New()
|
h := sha1.New()
|
||||||
return &Decoder{
|
return &Decoder{
|
||||||
r: io.TeeReader(r, h),
|
r: io.TeeReader(r, h),
|
||||||
hash: h,
|
hash: h,
|
||||||
|
extReader: bufio.NewReader(nil),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -184,11 +188,9 @@ func (d *Decoder) doReadEntryNameV4() (string, error) {
|
||||||
|
|
||||||
func (d *Decoder) doReadEntryName(len uint16) (string, error) {
|
func (d *Decoder) doReadEntryName(len uint16) (string, error) {
|
||||||
name := make([]byte, len)
|
name := make([]byte, len)
|
||||||
if err := binary.Read(d.r, &name); err != nil {
|
_, err := io.ReadFull(d.r, name[:])
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
return string(name), nil
|
return string(name), err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Index entries are padded out to the next 8 byte alignment
|
// Index entries are padded out to the next 8 byte alignment
|
||||||
|
|
@ -261,6 +263,17 @@ func (d *Decoder) readExtension(idx *Index, header []byte) error {
|
||||||
if err := d.Decode(idx.ResolveUndo); err != nil {
|
if err := d.Decode(idx.ResolveUndo); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
case bytes.Equal(header, endOfIndexEntryExtSignature):
|
||||||
|
r, err := d.getExtensionReader()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
idx.EndOfIndexEntry = &EndOfIndexEntry{}
|
||||||
|
d := &endOfIndexEntryDecoder{r}
|
||||||
|
if err := d.Decode(idx.EndOfIndexEntry); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return errUnknownExtension
|
return errUnknownExtension
|
||||||
}
|
}
|
||||||
|
|
@ -268,20 +281,21 @@ func (d *Decoder) readExtension(idx *Index, header []byte) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Decoder) getExtensionReader() (io.Reader, error) {
|
func (d *Decoder) getExtensionReader() (*bufio.Reader, error) {
|
||||||
len, err := binary.ReadUint32(d.r)
|
len, err := binary.ReadUint32(d.r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return &io.LimitedReader{R: d.r, N: int64(len)}, nil
|
d.extReader.Reset(&io.LimitedReader{R: d.r, N: int64(len)})
|
||||||
|
return d.extReader, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Decoder) readChecksum(expected []byte, alreadyRead [4]byte) error {
|
func (d *Decoder) readChecksum(expected []byte, alreadyRead [4]byte) error {
|
||||||
var h plumbing.Hash
|
var h plumbing.Hash
|
||||||
copy(h[:4], alreadyRead[:])
|
copy(h[:4], alreadyRead[:])
|
||||||
|
|
||||||
if err := binary.Read(d.r, h[4:]); err != nil {
|
if _, err := io.ReadFull(d.r, h[4:]); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -315,7 +329,7 @@ func validateHeader(r io.Reader) (version uint32, err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
type treeExtensionDecoder struct {
|
type treeExtensionDecoder struct {
|
||||||
r io.Reader
|
r *bufio.Reader
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *treeExtensionDecoder) Decode(t *Tree) error {
|
func (d *treeExtensionDecoder) Decode(t *Tree) error {
|
||||||
|
|
@ -375,16 +389,13 @@ func (d *treeExtensionDecoder) readEntry() (*TreeEntry, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
e.Trees = i
|
e.Trees = i
|
||||||
|
_, err = io.ReadFull(d.r, e.Hash[:])
|
||||||
if err := binary.Read(d.r, &e.Hash); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return e, nil
|
return e, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type resolveUndoDecoder struct {
|
type resolveUndoDecoder struct {
|
||||||
r io.Reader
|
r *bufio.Reader
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *resolveUndoDecoder) Decode(ru *ResolveUndo) error {
|
func (d *resolveUndoDecoder) Decode(ru *ResolveUndo) error {
|
||||||
|
|
@ -422,7 +433,7 @@ func (d *resolveUndoDecoder) readEntry() (*ResolveUndoEntry, error) {
|
||||||
|
|
||||||
for s := range e.Stages {
|
for s := range e.Stages {
|
||||||
var hash plumbing.Hash
|
var hash plumbing.Hash
|
||||||
if err := binary.Read(d.r, hash[:]); err != nil {
|
if _, err := io.ReadFull(d.r, hash[:]); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -449,3 +460,18 @@ func (d *resolveUndoDecoder) readStage(e *ResolveUndoEntry, s Stage) error {
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type endOfIndexEntryDecoder struct {
|
||||||
|
r *bufio.Reader
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *endOfIndexEntryDecoder) Decode(e *EndOfIndexEntry) error {
|
||||||
|
var err error
|
||||||
|
e.Offset, err = binary.ReadUint32(d.r)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = io.ReadFull(d.r, e.Hash[:])
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
@ -297,5 +297,64 @@
|
||||||
// in the previous ewah bitmap.
|
// in the previous ewah bitmap.
|
||||||
//
|
//
|
||||||
// - One NUL.
|
// - One NUL.
|
||||||
// Source https://www.kernel.org/pub/software/scm/git/docs/technical/index-format.txt
|
//
|
||||||
|
// == File System Monitor cache
|
||||||
|
//
|
||||||
|
// The file system monitor cache tracks files for which the core.fsmonitor
|
||||||
|
// hook has told us about changes. The signature for this extension is
|
||||||
|
// { 'F', 'S', 'M', 'N' }.
|
||||||
|
//
|
||||||
|
// The extension starts with
|
||||||
|
//
|
||||||
|
// - 32-bit version number: the current supported version is 1.
|
||||||
|
//
|
||||||
|
// - 64-bit time: the extension data reflects all changes through the given
|
||||||
|
// time which is stored as the nanoseconds elapsed since midnight,
|
||||||
|
// January 1, 1970.
|
||||||
|
//
|
||||||
|
// - 32-bit bitmap size: the size of the CE_FSMONITOR_VALID bitmap.
|
||||||
|
//
|
||||||
|
// - An ewah bitmap, the n-th bit indicates whether the n-th index entry
|
||||||
|
// is not CE_FSMONITOR_VALID.
|
||||||
|
//
|
||||||
|
// == End of Index Entry
|
||||||
|
//
|
||||||
|
// The End of Index Entry (EOIE) is used to locate the end of the variable
|
||||||
|
// length index entries and the beginning of the extensions. Code can take
|
||||||
|
// advantage of this to quickly locate the index extensions without having
|
||||||
|
// to parse through all of the index entries.
|
||||||
|
//
|
||||||
|
// Because it must be able to be loaded before the variable length cache
|
||||||
|
// entries and other index extensions, this extension must be written last.
|
||||||
|
// The signature for this extension is { 'E', 'O', 'I', 'E' }.
|
||||||
|
//
|
||||||
|
// The extension consists of:
|
||||||
|
//
|
||||||
|
// - 32-bit offset to the end of the index entries
|
||||||
|
//
|
||||||
|
// - 160-bit SHA-1 over the extension types and their sizes (but not
|
||||||
|
// their contents). E.g. if we have "TREE" extension that is N-bytes
|
||||||
|
// long, "REUC" extension that is M-bytes long, followed by "EOIE",
|
||||||
|
// then the hash would be:
|
||||||
|
//
|
||||||
|
// SHA-1("TREE" + <binary representation of N> +
|
||||||
|
// "REUC" + <binary representation of M>)
|
||||||
|
//
|
||||||
|
// == Index Entry Offset Table
|
||||||
|
//
|
||||||
|
// The Index Entry Offset Table (IEOT) is used to help address the CPU
|
||||||
|
// cost of loading the index by enabling multi-threading the process of
|
||||||
|
// converting cache entries from the on-disk format to the in-memory format.
|
||||||
|
// The signature for this extension is { 'I', 'E', 'O', 'T' }.
|
||||||
|
//
|
||||||
|
// The extension consists of:
|
||||||
|
//
|
||||||
|
// - 32-bit version (currently 1)
|
||||||
|
//
|
||||||
|
// - A number of index offset entries each consisting of:
|
||||||
|
//
|
||||||
|
// - 32-bit offset from the beginning of the file to the first cache entry
|
||||||
|
// in this block of entries.
|
||||||
|
//
|
||||||
|
// - 32-bit count of cache entries in this blockpackage index
|
||||||
package index
|
package index
|
||||||
|
|
@ -9,7 +9,7 @@ import (
|
||||||
"sort"
|
"sort"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gopkg.in/src-d/go-git.v4/utils/binary"
|
"github.com/go-git/go-git/v5/utils/binary"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
@ -7,8 +7,8 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing"
|
"github.com/go-git/go-git/v5/plumbing"
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing/filemode"
|
"github.com/go-git/go-git/v5/plumbing/filemode"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
@ -18,9 +18,10 @@ var (
|
||||||
// ErrEntryNotFound is returned by Index.Entry, if an entry is not found.
|
// ErrEntryNotFound is returned by Index.Entry, if an entry is not found.
|
||||||
ErrEntryNotFound = errors.New("entry not found")
|
ErrEntryNotFound = errors.New("entry not found")
|
||||||
|
|
||||||
indexSignature = []byte{'D', 'I', 'R', 'C'}
|
indexSignature = []byte{'D', 'I', 'R', 'C'}
|
||||||
treeExtSignature = []byte{'T', 'R', 'E', 'E'}
|
treeExtSignature = []byte{'T', 'R', 'E', 'E'}
|
||||||
resolveUndoExtSignature = []byte{'R', 'E', 'U', 'C'}
|
resolveUndoExtSignature = []byte{'R', 'E', 'U', 'C'}
|
||||||
|
endOfIndexEntryExtSignature = []byte{'E', 'O', 'I', 'E'}
|
||||||
)
|
)
|
||||||
|
|
||||||
// Stage during merge
|
// Stage during merge
|
||||||
|
|
@ -50,6 +51,8 @@ type Index struct {
|
||||||
Cache *Tree
|
Cache *Tree
|
||||||
// ResolveUndo represents the 'Resolve undo' extension
|
// ResolveUndo represents the 'Resolve undo' extension
|
||||||
ResolveUndo *ResolveUndo
|
ResolveUndo *ResolveUndo
|
||||||
|
// EndOfIndexEntry represents the 'End of Index Entry' extension
|
||||||
|
EndOfIndexEntry *EndOfIndexEntry
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add creates a new Entry and returns it. The caller should first check that
|
// Add creates a new Entry and returns it. The caller should first check that
|
||||||
|
|
@ -193,3 +196,18 @@ type ResolveUndoEntry struct {
|
||||||
Path string
|
Path string
|
||||||
Stages map[Stage]plumbing.Hash
|
Stages map[Stage]plumbing.Hash
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EndOfIndexEntry is the End of Index Entry (EOIE) is used to locate the end of
|
||||||
|
// the variable length index entries and the beginning of the extensions. Code
|
||||||
|
// can take advantage of this to quickly locate the index extensions without
|
||||||
|
// having to parse through all of the index entries.
|
||||||
|
//
|
||||||
|
// Because it must be able to be loaded before the variable length cache
|
||||||
|
// entries and other index extensions, this extension must be written last.
|
||||||
|
type EndOfIndexEntry struct {
|
||||||
|
// Offset to the end of the index entries
|
||||||
|
Offset uint32
|
||||||
|
// Hash is a SHA-1 over the extension types and their sizes (but not
|
||||||
|
// their contents).
|
||||||
|
Hash plumbing.Hash
|
||||||
|
}
|
||||||
|
|
@ -6,8 +6,8 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing"
|
"github.com/go-git/go-git/v5/plumbing"
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing/format/packfile"
|
"github.com/go-git/go-git/v5/plumbing/format/packfile"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
@ -6,7 +6,7 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing"
|
"github.com/go-git/go-git/v5/plumbing"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
@ -2,11 +2,12 @@ package packfile
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"compress/zlib"
|
||||||
"io"
|
"io"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing/storer"
|
"github.com/go-git/go-git/v5/plumbing/storer"
|
||||||
"gopkg.in/src-d/go-git.v4/utils/ioutil"
|
"github.com/go-git/go-git/v5/utils/ioutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
var signature = []byte{'P', 'A', 'C', 'K'}
|
var signature = []byte{'P', 'A', 'C', 'K'}
|
||||||
|
|
@ -51,7 +52,13 @@ func WritePackfileToObjectStorage(
|
||||||
}
|
}
|
||||||
|
|
||||||
defer ioutil.CheckClose(w, &err)
|
defer ioutil.CheckClose(w, &err)
|
||||||
_, err = io.Copy(w, packfile)
|
|
||||||
|
var n int64
|
||||||
|
n, err = io.Copy(w, packfile)
|
||||||
|
if err == nil && n == 0 {
|
||||||
|
return ErrEmptyPackfile
|
||||||
|
}
|
||||||
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -60,3 +67,12 @@ var bufPool = sync.Pool{
|
||||||
return bytes.NewBuffer(nil)
|
return bytes.NewBuffer(nil)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var zlibInitBytes = []byte{0x78, 0x9c, 0x01, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01}
|
||||||
|
|
||||||
|
var zlibReaderPool = sync.Pool{
|
||||||
|
New: func() interface{} {
|
||||||
|
r, _ := zlib.NewReader(bytes.NewReader(zlibInitBytes))
|
||||||
|
return r
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
@ -4,8 +4,8 @@ import (
|
||||||
"sort"
|
"sort"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing"
|
"github.com/go-git/go-git/v5/plumbing"
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing/storer"
|
"github.com/go-git/go-git/v5/plumbing/storer"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
@ -3,7 +3,8 @@ package packfile
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing"
|
"github.com/go-git/go-git/v5/plumbing"
|
||||||
|
"github.com/go-git/go-git/v5/utils/ioutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
// See https://github.com/jelmer/dulwich/blob/master/dulwich/pack.py and
|
// See https://github.com/jelmer/dulwich/blob/master/dulwich/pack.py and
|
||||||
|
|
@ -27,21 +28,24 @@ func GetDelta(base, target plumbing.EncodedObject) (plumbing.EncodedObject, erro
|
||||||
return getDelta(new(deltaIndex), base, target)
|
return getDelta(new(deltaIndex), base, target)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getDelta(index *deltaIndex, base, target plumbing.EncodedObject) (plumbing.EncodedObject, error) {
|
func getDelta(index *deltaIndex, base, target plumbing.EncodedObject) (o plumbing.EncodedObject, err error) {
|
||||||
br, err := base.Reader()
|
br, err := base.Reader()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
defer br.Close()
|
|
||||||
|
defer ioutil.CheckClose(br, &err)
|
||||||
|
|
||||||
tr, err := target.Reader()
|
tr, err := target.Reader()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
defer tr.Close()
|
|
||||||
|
defer ioutil.CheckClose(tr, &err)
|
||||||
|
|
||||||
bb := bufPool.Get().(*bytes.Buffer)
|
bb := bufPool.Get().(*bytes.Buffer)
|
||||||
bb.Reset()
|
|
||||||
defer bufPool.Put(bb)
|
defer bufPool.Put(bb)
|
||||||
|
bb.Reset()
|
||||||
|
|
||||||
_, err = bb.ReadFrom(br)
|
_, err = bb.ReadFrom(br)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -49,8 +53,8 @@ func getDelta(index *deltaIndex, base, target plumbing.EncodedObject) (plumbing.
|
||||||
}
|
}
|
||||||
|
|
||||||
tb := bufPool.Get().(*bytes.Buffer)
|
tb := bufPool.Get().(*bytes.Buffer)
|
||||||
tb.Reset()
|
|
||||||
defer bufPool.Put(tb)
|
defer bufPool.Put(tb)
|
||||||
|
tb.Reset()
|
||||||
|
|
||||||
_, err = tb.ReadFrom(tr)
|
_, err = tb.ReadFrom(tr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -77,6 +81,7 @@ func DiffDelta(src, tgt []byte) []byte {
|
||||||
|
|
||||||
func diffDelta(index *deltaIndex, src []byte, tgt []byte) []byte {
|
func diffDelta(index *deltaIndex, src []byte, tgt []byte) []byte {
|
||||||
buf := bufPool.Get().(*bytes.Buffer)
|
buf := bufPool.Get().(*bytes.Buffer)
|
||||||
|
defer bufPool.Put(buf)
|
||||||
buf.Reset()
|
buf.Reset()
|
||||||
buf.Write(deltaEncodeSize(len(src)))
|
buf.Write(deltaEncodeSize(len(src)))
|
||||||
buf.Write(deltaEncodeSize(len(tgt)))
|
buf.Write(deltaEncodeSize(len(tgt)))
|
||||||
|
|
@ -86,6 +91,7 @@ func diffDelta(index *deltaIndex, src []byte, tgt []byte) []byte {
|
||||||
}
|
}
|
||||||
|
|
||||||
ibuf := bufPool.Get().(*bytes.Buffer)
|
ibuf := bufPool.Get().(*bytes.Buffer)
|
||||||
|
defer bufPool.Put(ibuf)
|
||||||
ibuf.Reset()
|
ibuf.Reset()
|
||||||
for i := 0; i < len(tgt); i++ {
|
for i := 0; i < len(tgt); i++ {
|
||||||
offset, l := index.findMatch(src, tgt, i)
|
offset, l := index.findMatch(src, tgt, i)
|
||||||
|
|
@ -127,12 +133,9 @@ func diffDelta(index *deltaIndex, src []byte, tgt []byte) []byte {
|
||||||
}
|
}
|
||||||
|
|
||||||
encodeInsertOperation(ibuf, buf)
|
encodeInsertOperation(ibuf, buf)
|
||||||
bytes := buf.Bytes()
|
|
||||||
|
|
||||||
bufPool.Put(buf)
|
// buf.Bytes() is only valid until the next modifying operation on the buffer. Copy it.
|
||||||
bufPool.Put(ibuf)
|
return append([]byte{}, buf.Bytes()...)
|
||||||
|
|
||||||
return bytes
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func encodeInsertOperation(ibuf, buf *bytes.Buffer) {
|
func encodeInsertOperation(ibuf, buf *bytes.Buffer) {
|
||||||
|
|
@ -6,9 +6,10 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing"
|
"github.com/go-git/go-git/v5/plumbing"
|
||||||
"gopkg.in/src-d/go-git.v4/plumbing/storer"
|
"github.com/go-git/go-git/v5/plumbing/storer"
|
||||||
"gopkg.in/src-d/go-git.v4/utils/binary"
|
"github.com/go-git/go-git/v5/utils/binary"
|
||||||
|
"github.com/go-git/go-git/v5/utils/ioutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Encoder gets the data from the storage and write it into the writer in PACK
|
// Encoder gets the data from the storage and write it into the writer in PACK
|
||||||
|
|
@ -80,7 +81,7 @@ func (e *Encoder) head(numEntries int) error {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Encoder) entry(o *ObjectToPack) error {
|
func (e *Encoder) entry(o *ObjectToPack) (err error) {
|
||||||
if o.WantWrite() {
|
if o.WantWrite() {
|
||||||
// A cycle exists in this delta chain. This should only occur if a
|
// A cycle exists in this delta chain. This should only occur if a
|
||||||
// selected object representation disappeared during writing
|
// selected object representation disappeared during writing
|
||||||
|
|
@ -119,17 +120,22 @@ func (e *Encoder) entry(o *ObjectToPack) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
e.zw.Reset(e.w)
|
e.zw.Reset(e.w)
|
||||||
|
|
||||||
|
defer ioutil.CheckClose(e.zw, &err)
|
||||||
|
|
||||||
or, err := o.Object.Reader()
|
or, err := o.Object.Reader()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
defer ioutil.CheckClose(or, &err)
|
||||||
|
|
||||||
_, err = io.Copy(e.zw, or)
|
_, err = io.Copy(e.zw, or)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return e.zw.Close()
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Encoder) writeBaseIfDelta(o *ObjectToPack) error {
|
func (e *Encoder) writeBaseIfDelta(o *ObjectToPack) error {
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue