From 83e3d1e31ef0851e3138ecf23a8b5272a7efe9c8 Mon Sep 17 00:00:00 2001 From: Vitalii Date: Sat, 14 Jul 2018 02:48:30 +0300 Subject: [PATCH] Creating parent collection method was added (#22) * method for creating parent collection was added to Client struct "func (c *Client) createParentCollection(itemPath string) error" was added to request.go file * using Client's method to create parent collection in following methods: Client.Write() Client.WriteStream() Client.copymove() deadlock is impossible in method Client.copymove() because of paragraph #6 section 9.8.5 (https://tools.ietf.org/html/rfc4918#section-9.8.5) and paragraph #6 section 9.9.4 (https://tools.ietf.org/html/rfc4918#section-9.9.4) of RFC 4918 (https://tools.ietf.org/html/rfc4918) * install dependencies script was added to Travis-CI file * testing was added to Travis-CI file * error wrapping was removed from Client.put() method * using an early return on error in case of 409 in Client.Write() method --- .travis.yml | 6 ++++++ client.go | 23 +++++++++++++++-------- requests.go | 13 ++++++++++++- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1ca29c5..76bfb65 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,3 +2,9 @@ language: go go: - "1.x" + +install: + - go get ./... + +script: + - go test -v --short ./... \ No newline at end of file diff --git a/client.go b/client.go index 59525e3..40990ba 100644 --- a/client.go +++ b/client.go @@ -346,13 +346,14 @@ func (c *Client) Write(path string, data []byte, _ os.FileMode) error { return nil case 409: - if i := strings.LastIndex(path, "/"); i > -1 { - if err := c.MkdirAll(path[0:i+1], 0755); err == nil { - s = c.put(path, bytes.NewReader(data)) - if s == 200 || s == 201 || s == 204 { - return nil - } - } + err := c.createParentCollection(path) + if err != nil { + return err + } + + s = c.put(path, bytes.NewReader(data)) + if s == 200 || s == 201 || s == 204 { + return nil } } @@ -361,8 +362,14 @@ func (c *Client) Write(path string, data []byte, _ os.FileMode) error { // WriteStream writes a stream func (c *Client) WriteStream(path string, stream io.Reader, _ os.FileMode) error { - // TODO check if parent collection exists + + err := c.createParentCollection(path) + if err != nil { + return err + } + s := c.put(path, stream) + switch s { case 200, 201, 204: return nil diff --git a/requests.go b/requests.go index 73db2c8..7a9981d 100644 --- a/requests.go +++ b/requests.go @@ -6,6 +6,7 @@ import ( "io" "net/http" "strings" + "path" ) func (c *Client) req(method, path string, body io.Reader, intercept func(*http.Request)) (req *http.Response, err error) { @@ -133,7 +134,12 @@ func (c *Client) copymove(method string, oldpath string, newpath string, overwri log(fmt.Sprintf(" TODO handle %s - %s multistatus result %s", method, oldpath, String(data))) case 409: - // TODO create dst path + err := c.createParentCollection(newpath) + if err != nil { + return err + } + + return c.copymove(method, oldpath, newpath, overwrite) } return newPathError(method, oldpath, s) @@ -148,3 +154,8 @@ func (c *Client) put(path string, stream io.Reader) int { return rs.StatusCode } + +func (c *Client) createParentCollection(itemPath string) (err error) { + parentPath := path.Dir(itemPath) + return c.MkdirAll(parentPath, 0755) +}