func walkFilesystem(depth int, filename string, relative_path string) (*asset.ID, error) { path, err := filepath.Abs(filename) if err != nil { return nil, err } item := &FsItem{} err = item.Stat(path) if err != nil { return nil, err } if item.IsFile() { id, err := item.Identify() if err != nil { return nil, err } item.Id = id } else if item.Link { newFilepath, err := filepath.EvalSymlinks(filename) if err != nil { return nil, err } item.LinkPath = &newFilepath if links_flag { // Then follow the link id, err := walkFilesystem(depth, newFilepath, relative_path) if err != nil { return item.Id, err } item.Id = id } } else if item.Folder { files, err := ioutil.ReadDir(path) if err != nil { return item.Id, err } var childIDs asset.IDSlice for _, file := range files { path := filename + string(filepath.Separator) + file.Name() id, err := walkFilesystem(depth-1, path, relative_path) if err != nil { return item.Id, err } childIDs.Push(id) } id, err := childIDs.ID() if err != nil { return item.Id, err } item.Id = id } if depth >= 0 || recursive_flag { output(item) } return item.Id, nil }
func TestIDSliceString(t *testing.T) { is := is.New(t) var ids asset.IDSlice id1, err := asset.Identify(strings.NewReader("foo")) is.NoErr(err) id2, err := asset.Identify(strings.NewReader("bar")) is.NoErr(err) ids.Push(id1) ids.Push(id2) is.Equal(ids.String(), id1.String()+id2.String()) }
func TestIDofIDSlice(t *testing.T) { is := is.New(t) var b, s []byte for i := 0; i < 64; i++ { b = append(b, 0xFF) s = append(s, 0x00) } bigBig := big.NewInt(0) bigSmall := big.NewInt(0) bigBig = bigBig.SetBytes(b) bigSmall = bigSmall.SetBytes(s) bigID := asset.ID(*bigBig) smallID := asset.ID(*bigSmall) encoder := asset.NewIDEncoder() is.OK(encoder) _, err := io.Copy(encoder, strings.NewReader(`c41111111111111111111111111111111111111111111111111111111111111111111111111111111111111111c467RPWkcUr5dga8jgywjSup7CMoA9FNqkNjEFgAkEpF9vNktFnx77e2Js11EDL3BNu9MaKFUbacZRt1HYym4b8RNp`)) is.NoErr(err) id := encoder.ID() var idSlice asset.IDSlice idSlice.Push(&bigID) idSlice.Push(&smallID) sliceID, err := idSlice.ID() is.NoErr(err) is.Equal(sliceID.String(), id.String()) }
func TestIDSliceSearchIDs(t *testing.T) { is := is.New(t) var ids asset.IDSlice id1, err := asset.Identify(strings.NewReader("foo")) is.NoErr(err) id2, err := asset.Identify(strings.NewReader("bar")) is.NoErr(err) id3, err := asset.Identify(strings.NewReader("baz")) is.NoErr(err) ids.Push(id1) ids.Push(id2) ids.Push(id3) ids.Sort() is.True(id2.Less(id1)) is.True(id3.Less(id2)) is.Equal(asset.SearchIDs(ids, id1), 2) is.Equal(asset.SearchIDs(ids, id2), 1) is.Equal(asset.SearchIDs(ids, id3), 0) }
func TestIDSliceSort(t *testing.T) { is := is.New(t) var b, s []byte for i := 0; i < 64; i++ { b = append(b, 0xFF) s = append(s, 0x00) } bigBig := big.NewInt(0) bigSmall := big.NewInt(0) bigBig = bigBig.SetBytes(b) bigSmall = bigSmall.SetBytes(s) bigID := asset.ID(*bigBig) smallID := asset.ID(*bigSmall) var idSlice asset.IDSlice idSlice.Push(&bigID) idSlice.Push(&smallID) is.Equal(idSlice[0].String(), `c467RPWkcUr5dga8jgywjSup7CMoA9FNqkNjEFgAkEpF9vNktFnx77e2Js11EDL3BNu9MaKFUbacZRt1HYym4b8RNp`) is.Equal(idSlice[1].String(), `c41111111111111111111111111111111111111111111111111111111111111111111111111111111111111111`) idSlice.Sort() is.Equal(idSlice[0].String(), `c41111111111111111111111111111111111111111111111111111111111111111111111111111111111111111`) is.Equal(idSlice[1].String(), `c467RPWkcUr5dga8jgywjSup7CMoA9FNqkNjEFgAkEpF9vNktFnx77e2Js11EDL3BNu9MaKFUbacZRt1HYym4b8RNp`) }