Skip to content

Commit

Permalink
update file resumption methods and remove cacher and scheduler module (
Browse files Browse the repository at this point in the history
…#198)

* add cacher and scheduler module

* update shared pattern

* debug module

* update node_selector module

* update cache module

* update file breakpoint resume upload function

* remove cacher and scheduler

* update go mod
  • Loading branch information
jiuquxzy committed Apr 15, 2024
1 parent dd4c10e commit f4f7f8f
Show file tree
Hide file tree
Showing 5 changed files with 314 additions and 19 deletions.
164 changes: 164 additions & 0 deletions chain/file.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
package chain

import (
"bufio"
"bytes"
"fmt"
"io"
Expand All @@ -17,6 +18,7 @@ import (
"path/filepath"
"strings"

"github.com/CESSProject/cess-go-sdk/core/pattern"
"github.com/CESSProject/cess-go-sdk/utils"
keyring "github.com/CESSProject/go-keyring"
"github.com/btcsuite/btcutil/base58"
Expand Down Expand Up @@ -248,3 +250,165 @@ func (c *chainClient) RetrieveObject(url, fid string) (io.ReadCloser, error) {

return resp.Body, nil
}

func (c *chainClient) SplitFile(fpath, chunksDir string, chunkSize int64, filling bool) (int64, int, error) {
fstat, err := os.Stat(fpath)
if err != nil {
return 0, 0, err
}
if fstat.IsDir() {
return 0, 0, errors.New("not a file")
}
if fstat.Size() == 0 {
return 0, 0, errors.New("empty file")
}
if fstat.Size() < chunkSize {
chunkSize = fstat.Size()
}
count := fstat.Size() / chunkSize
if fstat.Size()%chunkSize != 0 {
count++
}
buf := make([]byte, chunkSize)
f, err := os.Open(fpath)
if err != nil {
return 0, 0, err
}
defer f.Close()
reader := bufio.NewReader(f)
size := fstat.Size()
for i := int64(0); i < count; i++ {
n, err := reader.Read(buf)
if err != nil {
return 0, 0, err
}
if n <= 0 {
return 0, 0, errors.New("read a empty block")
}
if n < int(chunkSize) && filling {
if i+1 != count {
return 0, 0, errors.New("read file err")
}
copy(buf[n:], make([]byte, chunkSize-int64(n)))
size += chunkSize - int64(n)
n = int(chunkSize)
}
err = utils.WriteBufToFile(buf[:n], filepath.Join(chunksDir, fmt.Sprintf("chunk-%d", i)))
if err != nil {
return 0, 0, err
}
}
return size, int(count), nil
}

func (c *chainClient) SplitFileWithstandardSize(fpath, chunksDir string) (int64, int, error) {
return c.SplitFile(fpath, chunksDir, pattern.SegmentSize, true)
}

func (c *chainClient) UploadFileChunks(url, chunksDir, bucket, fname string, chunksNum int, totalSize int64) (string, error) {
entries, err := os.ReadDir(chunksDir)
if err != nil {
return "", errors.Wrap(err, "upload file chunk error")
}
if len(entries) == 0 {
return "", errors.Wrap(errors.New("empty dir"), "upload file chunk error")
}
if len(entries) > chunksNum {
return "", errors.Wrap(errors.New("bad chunks number"), "upload file chunk error")
}
var res string
for i := chunksNum - len(entries); i < chunksNum; i++ {
res, err = c.UploadFileChunk(url, chunksDir, bucket, fname, chunksNum, i, totalSize)
if err != nil {
return res, errors.Wrap(err, "upload file chunks error")
}
os.Remove(filepath.Join(chunksDir, fmt.Sprintf("chunk-%d", i)))
}
return res, nil
}

func (c *chainClient) UploadFileChunk(url, chunksDir, bucket, fname string, chunksNum, chunksId int, totalSize int64) (string, error) {

file := filepath.Join(chunksDir, fmt.Sprintf("chunk-%d", chunksId))
fstat, err := os.Stat(file)
if err != nil {
return "", errors.Wrap(err, "upload file chunk error")
}

if fstat.IsDir() {
return "", errors.Wrap(errors.New("not a file"), "upload file chunk error")
}

if fstat.Size() == 0 {
return "", errors.New("empty file")
}

if !utils.CheckBucketName(bucket) {
return "", errors.New("invalid bucket name")
}

kr, _ := keyring.FromURI(c.GetURI(), keyring.NetSubstrate{})

// sign message
message := utils.GetRandomcode(16)
sig, _ := kr.Sign(kr.SigningContext([]byte(message)))

body := new(bytes.Buffer)
writer := multipart.NewWriter(body)
//
formFile, err := writer.CreateFormFile("file", fstat.Name())
if err != nil {
return "", err
}

f, err := os.Open(file)
if err != nil {
return "", err
}
defer f.Close()

_, err = io.Copy(formFile, f)
if err != nil {
return "", err
}
err = writer.Close()
if err != nil {
return "", err
}

req, err := http.NewRequest(http.MethodPut, url, body)
if err != nil {
return "", err
}

req.Header.Set("BucketName", bucket)
req.Header.Set("Account", c.GetSignatureAcc())
req.Header.Set("Message", message)
req.Header.Set("Signature", base58.Encode(sig[:]))
req.Header.Set("Content-Type", writer.FormDataContentType())
req.Header.Set("FileName", fname)
req.Header.Set("BlockNumber", fmt.Sprint(chunksNum))
req.Header.Set("BlockIndex", fmt.Sprint(chunksId))
req.Header.Set("TotalSize", fmt.Sprint(totalSize))

client := &http.Client{}
client.Transport = globalTransport
resp, err := client.Do(req)
if err != nil {
return "", err
}
defer resp.Body.Close()

respbody, err := io.ReadAll(resp.Body)
if err != nil {
return "", err
}

if resp.StatusCode != http.StatusOK {
if len(respbody) > 0 {
return "", errors.New(string(respbody))
}
return "", errors.New(fmt.Sprintf("upload failed, code: %d", resp.StatusCode))
}
return strings.TrimPrefix(strings.TrimSuffix(string(respbody), "\""), "\""), nil
}
53 changes: 53 additions & 0 deletions core/sdk/sdk.go
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,59 @@ type SDK interface {
// - error: error message.
RetrieveObject(url, fid string) (io.ReadCloser, error)

// Split File into Chunks.
//
// Receive parameter:
// - fpath: the path of the file to be split.
// - chunksDir: directory path to store file chunks, please do not mix it elsewhere.
// - chunkSize: the size of each chunk, it does not exceed the file size
// Return parameter:
// - int64: chunks total size (byte).
// - int: number of file chunks.
// - error: error message.
SplitFile(fpath, chunksDir string, chunkSize int64, filling bool) (int64, int, error)

// Split File into Chunks with standard size.
// It split file into chunks of the default size and fills the last chunk that does not meet the size.
//
// Receive parameter:
// - fpath: the path of the file to be split.
// - chunksDir: directory path to store file chunks, please do not mix it elsewhere.
// Return parameter:
// - int64: chunks total size (byte).
// - int: number of file chunks.
// - error: error message.
SplitFileWithstandardSize(fpath, chunksDir string) (int64, int, error)

// Upload chunk of file to the gateway
//
// Receive parameter:
// - url: the address of the gateway.
// - chunksDir: directory path to store file chunks, please do not mix it elsewhere.
// - bucket: the bucket name to store user data.
// - fname: the name of the file.
// - chunksNum: total number of file chunks.
// - chunksId: index of the current chunk to be uploaded ([0,chunksNum)).
// - totalSize: chunks total size (byte), can be obtained from the first return value of SplitFile
// Return parameter:
// - Reader: number of file chunks.
// - error: error message.
UploadFileChunk(url, chunksDir, bucket, fname string, chunksNum, chunksId int, totalSize int64) (string, error)

// Upload file chunks in the directory to the gateway as much as possible, chunks will be removed after being uploaded, if the chunks are not transferred successfuly, jus
//
// Receive parameter:
// - url: the address of the gateway.
// - chunksDir: directory path to store file chunks, please do not mix it elsewhere.
// - bucket: the bucket name to store user data.
// - fname: the name of the file.
// - chunksNum: total number of file chunks.
// - totalSize: chunks total size (byte), can be obtained from the first return value of SplitFile
// Return parameter:
// - Reader: number of file chunks.
// - error: error message.
UploadFileChunks(url, chunksDir, bucket, fname string, chunksNum int, totalSize int64) (string, error)

// retrieve event

//
Expand Down
17 changes: 11 additions & 6 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -9,39 +9,44 @@ require (
github.com/centrifuge/go-substrate-rpc-client/v4 v4.2.1
github.com/decred/base58 v1.0.4
github.com/ethereum/go-ethereum v1.10.20
github.com/go-ping/ping v1.1.0
github.com/google/uuid v1.5.0
github.com/joho/godotenv v1.5.1
github.com/klauspost/reedsolomon v1.12.0
github.com/mr-tron/base58 v1.2.0
github.com/pixelbender/go-traceroute v0.0.0-20190414152342-e631ab553a80
github.com/pkg/errors v0.9.1
github.com/samber/lo v1.39.0
github.com/shirou/gopsutil v3.21.11+incompatible
github.com/stretchr/testify v1.8.4
github.com/vedhavyas/go-subkey v1.0.4
golang.org/x/crypto v0.17.0
golang.org/x/exp v0.0.0-20231226003508-02704c960a9b
golang.org/x/crypto v0.19.0
golang.org/x/exp v0.0.0-20240213143201-ec583247a57a
)

require (
github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect
github.com/cosmos/go-bip39 v1.0.0 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/deckarep/golang-set v1.8.0 // indirect
github.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect
github.com/decred/dcrd/crypto/blake256 v1.0.1 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/go-stack/stack v1.8.1 // indirect
github.com/gorilla/websocket v1.5.0 // indirect
github.com/gorilla/websocket v1.5.1 // indirect
github.com/gtank/merlin v0.1.1 // indirect
github.com/gtank/ristretto255 v0.1.2 // indirect
github.com/klauspost/cpuid/v2 v2.1.1 // indirect
github.com/klauspost/cpuid/v2 v2.2.7 // indirect
github.com/mimoo/StrobeGo v0.0.0-20220103164710-9a04d6ca976b // indirect
github.com/pierrec/xxHash v0.1.5 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rs/cors v1.8.2 // indirect
github.com/stretchr/objx v0.5.0 // indirect
github.com/vedhavyas/go-subkey/v2 v2.0.0 // indirect
github.com/yusufpapurcu/wmi v1.2.3 // indirect
golang.org/x/sys v0.15.0 // indirect
golang.org/x/net v0.21.0 // indirect
golang.org/x/sync v0.6.0 // indirect
golang.org/x/sys v0.17.0 // indirect
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
45 changes: 32 additions & 13 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -30,22 +30,27 @@ github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsP
github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo=
github.com/decred/base58 v1.0.4 h1:QJC6B0E0rXOPA8U/kw2rP+qiRJsUaE2Er+pYb3siUeA=
github.com/decred/base58 v1.0.4/go.mod h1:jJswKPEdvpFpvf7dsDvFZyLT22xZ9lWqEByX38oGd9E=
github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0=
github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc=
github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y=
github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs=
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0=
github.com/ethereum/go-ethereum v1.10.20 h1:75IW830ClSS40yrQC1ZCMZCt5I+zU16oqId2SiQwdQ4=
github.com/ethereum/go-ethereum v1.10.20/go.mod h1:LWUN82TCHGpxB3En5HVmLLzPD7YSrEUFmFfN1nKkVN0=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-ping/ping v1.1.0 h1:3MCGhVX4fyEUuhsfwPrsEdQw6xspHkv5zHsiSoDFZYw=
github.com/go-ping/ping v1.1.0/go.mod h1:xIFjORFzTxqIV/tDVGO4eDy/bLuSyawEeojSm3GfRGk=
github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw=
github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa h1:Q75Upo5UN4JbPFURXZ8nLKYUvF85dyFRop/vQ0Rv+64=
github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=
github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=
github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s=
github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is=
github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s=
Expand All @@ -57,8 +62,8 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ=
github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
github.com/klauspost/cpuid/v2 v2.1.1 h1:t0wUqjowdm8ezddV5k0tLWVklVuvLJpoHeb4WBdydm0=
github.com/klauspost/cpuid/v2 v2.1.1/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=
github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/klauspost/reedsolomon v1.12.0 h1:I5FEp3xSwVCcEh3F5A7dofEfhXdF/bWhQWPH+XwBFno=
github.com/klauspost/reedsolomon v1.12.0/go.mod h1:EPLZJeh4l27pUGC3aXOjheaoh1I9yut7xTURiW3LQ9Y=
github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM=
Expand All @@ -71,6 +76,8 @@ github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/pierrec/xxHash v0.1.5 h1:n/jBpwTHiER4xYvK3/CdPVnLDPchj8eTJFFLUb4QHBo=
github.com/pierrec/xxHash v0.1.5/go.mod h1:w2waW5Zoa/Wc4Yqe0wgrIYAGKqRMf7czn2HNKXmuL+I=
github.com/pixelbender/go-traceroute v0.0.0-20190414152342-e631ab553a80 h1:I4NMHzc2iGHcxwpt/N3aktqyrDGNx0LrJEYU7g60J0I=
github.com/pixelbender/go-traceroute v0.0.0-20190414152342-e631ab553a80/go.mod h1:wtXyvVnMsTkas6cTVJwoTu0voqSm+pYg2YAU/mUfQJQ=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
Expand Down Expand Up @@ -104,21 +111,33 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
golang.org/x/exp v0.0.0-20231226003508-02704c960a9b h1:kLiC65FbiHWFAOu+lxwNPujcsl8VYyTYYEZnsOO1WK4=
golang.org/x/exp v0.0.0-20231226003508-02704c960a9b/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=
golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/exp v0.0.0-20240213143201-ec583247a57a h1:HinSgX1tJRX3KsL//Gxynpw5CTOAIPhgL4W8PNiIpVE=
golang.org/x/exp v0.0.0-20240213143201-ec583247a57a/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
Expand Down
Loading

0 comments on commit f4f7f8f

Please sign in to comment.