Merge pull request #377 from docker/ensuring-set-meta-creates-parents

Ensure that SetMeta creates parent directory first
This commit is contained in:
Ying Li 2015-12-17 22:15:17 -08:00
commit cde61e4fad
2 changed files with 24 additions and 1 deletions

View File

@ -68,7 +68,15 @@ func (f *FilesystemStore) SetMultiMeta(metas map[string][]byte) error {
func (f *FilesystemStore) SetMeta(name string, meta []byte) error {
fileName := fmt.Sprintf("%s.%s", name, f.metaExtension)
path := filepath.Join(f.metaDir, fileName)
if err := ioutil.WriteFile(path, meta, 0600); err != nil {
// Ensures the parent directories of the file we are about to write exist
err := os.MkdirAll(filepath.Dir(path), 0700)
if err != nil {
return err
}
// Write the file to disk
if err = ioutil.WriteFile(path, meta, 0600); err != nil {
return err
}
return nil

View File

@ -42,6 +42,21 @@ func TestSetMeta(t *testing.T) {
assert.Equal(t, testContent, content, "Content written to file was corrupted.")
}
func TestSetMetaWithNoParentDirectory(t *testing.T) {
s, err := NewFilesystemStore(testDir, "metadata", "json", "targets")
assert.Nil(t, err, "Initializing FilesystemStore returned unexpected error: %v", err)
defer os.RemoveAll(testDir)
testContent := []byte("test data")
err = s.SetMeta("noexist/"+"testMeta", testContent)
assert.Nil(t, err, "SetMeta returned unexpected error: %v", err)
content, err := ioutil.ReadFile(path.Join(testDir, "metadata", "noexist/testMeta.json"))
assert.Nil(t, err, "Error reading file: %v", err)
assert.Equal(t, testContent, content, "Content written to file was corrupted.")
}
func TestGetMeta(t *testing.T) {
s, err := NewFilesystemStore(testDir, "metadata", "json", "targets")
assert.Nil(t, err, "Initializing FilesystemStore returned unexpected error: %v", err)