| 138 | } |
| 139 | |
| 140 | func (c *Client) writeFile(realpath string, data []byte, noexists bool) error { |
| 141 | if noexists { |
| 142 | _, err := os.Stat(realpath) |
| 143 | if err == nil { |
| 144 | return errors.Errorf("file already exists") |
| 145 | } else if !os.IsNotExist(err) { |
| 146 | return errors.Trace(err) |
| 147 | } |
| 148 | } |
| 149 | if err := mkdirFor(realpath); err != nil { |
| 150 | return err |
| 151 | } |
| 152 | |
| 153 | f, err := c.newTempFile() |
| 154 | if err != nil { |
| 155 | return err |
| 156 | } |
| 157 | defer f.Close() |
| 158 | |
| 159 | var writeThenRename = func() error { |
| 160 | _, err := f.Write(data) |
| 161 | if err != nil { |
| 162 | return errors.Trace(err) |
| 163 | } |
| 164 | if err := f.Close(); err != nil { |
| 165 | return errors.Trace(err) |
| 166 | } |
| 167 | if err := os.Rename(f.Name(), realpath); err != nil { |
| 168 | return errors.Trace(err) |
| 169 | } |
| 170 | return nil |
| 171 | } |
| 172 | if err := writeThenRename(); err != nil { |
| 173 | os.Remove(f.Name()) |
| 174 | return err |
| 175 | } |
| 176 | return nil |
| 177 | } |
| 178 | |
| 179 | func (c *Client) Create(path string, data []byte) error { |
| 180 | c.Lock() |