func (d *directory) readCommits(ctx context.Context) ([]fuse.Dirent, error) { commitInfos, err := pfsutil.ListCommits(d.fs.apiClient, d.fs.repositoryName) if err != nil { return nil, err } result := make([]fuse.Dirent, 0, len(commitInfos.CommitInfo)) for _, commitInfo := range commitInfos.CommitInfo { result = append(result, fuse.Dirent{Name: commitInfo.Commit.Id, Type: fuse.DT_Dir}) } return result, nil }
func do(appEnvObj interface{}) error { appEnv := appEnvObj.(*appEnv) clientConn, err := grpc.Dial(appEnv.Address) if err != nil { return err } apiClient := pfs.NewApiClient(clientConn) var shard int var modulus int initCmd := cobramainutil.Command{ Use: "init repository-name", Long: "Initalize a repository.", NumArgs: 1, Run: func(cmd *cobra.Command, args []string) error { return pfsutil.InitRepository(apiClient, args[0], false) }, }.ToCobraCommand() mkdirCmd := cobramainutil.Command{ Use: "mkdir repository-name commit-id path/to/dir", Long: "Make a directory. Sub directories must already exist.", NumArgs: 3, Run: func(cmd *cobra.Command, args []string) error { return pfsutil.MakeDirectory(apiClient, args[0], args[1], args[2]) }, }.ToCobraCommand() putCmd := cobramainutil.Command{ Use: "put repository-name branch-id path/to/file", Long: "Put a file from stdin. Directories must exist. branch-id must be a writeable commit.", NumArgs: 3, Run: func(cmd *cobra.Command, args []string) error { _, err := pfsutil.PutFile(apiClient, args[0], args[1], args[2], 0, os.Stdin) return err }, }.ToCobraCommand() getCmd := cobramainutil.Command{ Use: "get repository-name commit-id path/to/file", Long: "Get a file from stdout. commit-id must be a readable commit.", NumArgs: 3, Run: func(cmd *cobra.Command, args []string) error { return pfsutil.GetFile(apiClient, args[0], args[1], args[2], 0, pfsutil.GetAll, os.Stdout) }, }.ToCobraCommand() lsCmd := cobramainutil.Command{ Use: "ls repository-name branch-id path/to/dir", Long: "List a directory. Directory must exist.", NumArgs: 3, Run: func(cmd *cobra.Command, args []string) error { listFilesResponse, err := pfsutil.ListFiles(apiClient, args[0], args[1], args[2], uint64(shard), uint64(modulus)) if err != nil { return err } for _, fileInfo := range listFilesResponse.FileInfo { fmt.Printf("%+v\n", fileInfo) } return nil }, }.ToCobraCommand() lsCmd.Flags().IntVarP(&shard, "shard", "s", 0, "shard to read from") lsCmd.Flags().IntVarP(&modulus, "modulus", "m", 1, "modulus of the shards") branchCmd := cobramainutil.Command{ Use: "branch repository-name commit-id", Long: "Branch a commit. commit-id must be a readable commit.", NumArgs: 2, Run: func(cmd *cobra.Command, args []string) error { branchResponse, err := pfsutil.Branch(apiClient, args[0], args[1]) if err != nil { return err } fmt.Println(branchResponse.Commit.Id) return nil }, }.ToCobraCommand() commitCmd := cobramainutil.Command{ Use: "commit repository-name branch-id", Long: "Commit a branch. branch-id must be a writeable commit.", NumArgs: 2, Run: func(cmd *cobra.Command, args []string) error { return pfsutil.Commit(apiClient, args[0], args[1]) }, }.ToCobraCommand() commitInfoCmd := cobramainutil.Command{ Use: "commit-info repository-name commit-id", Long: "Get info for a commit.", NumArgs: 2, Run: func(cmd *cobra.Command, args []string) error { commitInfoResponse, err := pfsutil.GetCommitInfo(apiClient, args[0], args[1]) if err != nil { return err } fmt.Printf("%+v\n", commitInfoResponse.CommitInfo) return nil }, }.ToCobraCommand() listCommitsCmd := cobramainutil.Command{ Use: "list-commits repository-name", Long: "List commits on the repository.", NumArgs: 1, Run: func(cmd *cobra.Command, args []string) error { listCommitsResponse, err := pfsutil.ListCommits(apiClient, args[0]) if err != nil { return err } for _, commitInfo := range listCommitsResponse.CommitInfo { fmt.Printf("%+v\n", commitInfo) } return nil }, }.ToCobraCommand() mountCmd := cobramainutil.Command{ Use: "mount repository-name", Long: "Mount a repository as a local file system.", NumArgs: 1, Run: func(cmd *cobra.Command, args []string) error { return fuse.NewMounter().Mount(apiClient, args[0], args[0], uint64(shard), uint64(modulus)) }, }.ToCobraCommand() mountCmd.Flags().IntVarP(&shard, "shard", "s", 0, "shard to read from") mountCmd.Flags().IntVarP(&modulus, "modulus", "m", 1, "modulus of the shards") rootCmd := &cobra.Command{ Use: "pfs", Long: `Access the PFS API. Note that this CLI is experimental and does not even check for common errors. The environment variable PFS_ADDRESS controls what server the CLI connects to, the default is 0.0.0.0:650.`, } rootCmd.AddCommand(cobramainutil.NewVersionCommand(clientConn, pachyderm.Version)) rootCmd.AddCommand(initCmd) rootCmd.AddCommand(mkdirCmd) rootCmd.AddCommand(putCmd) rootCmd.AddCommand(getCmd) rootCmd.AddCommand(lsCmd) rootCmd.AddCommand(branchCmd) rootCmd.AddCommand(commitCmd) rootCmd.AddCommand(commitInfoCmd) rootCmd.AddCommand(listCommitsCmd) rootCmd.AddCommand(mountCmd) return rootCmd.Execute() }
func testSimple(t *testing.T, apiClient pfs.ApiClient, internalAPIClient pfs.InternalApiClient, cluster Cluster) { repositoryName := TestRepositoryName() err := pfsutil.InitRepository(apiClient, repositoryName) require.NoError(t, err) commitInfo, err := pfsutil.GetCommitInfo(apiClient, repositoryName, "scratch") require.NoError(t, err) require.NotNil(t, commitInfo) require.Equal(t, "scratch", commitInfo.Commit.Id) require.Equal(t, pfs.CommitType_COMMIT_TYPE_READ, commitInfo.CommitType) require.Nil(t, commitInfo.ParentCommit) scratchCommitInfo := commitInfo commitInfos, err := pfsutil.ListCommits(apiClient, repositoryName) require.NoError(t, err) require.Equal(t, 1, len(commitInfos.CommitInfo)) require.Equal(t, scratchCommitInfo, commitInfos.CommitInfo[0]) commit, err := pfsutil.Branch(apiClient, repositoryName, "scratch") require.NoError(t, err) require.NotNil(t, commit) newCommitID := commit.Id commitInfo, err = pfsutil.GetCommitInfo(apiClient, repositoryName, newCommitID) require.NoError(t, err) require.NotNil(t, commitInfo) require.Equal(t, newCommitID, commitInfo.Commit.Id) require.Equal(t, pfs.CommitType_COMMIT_TYPE_WRITE, commitInfo.CommitType) require.Equal(t, "scratch", commitInfo.ParentCommit.Id) newCommitInfo := commitInfo commitInfos, err = pfsutil.ListCommits(apiClient, repositoryName) require.NoError(t, err) require.Equal(t, 2, len(commitInfos.CommitInfo)) require.Equal(t, newCommitInfo, commitInfos.CommitInfo[0]) require.Equal(t, scratchCommitInfo, commitInfos.CommitInfo[1]) err = pfsutil.MakeDirectory(apiClient, repositoryName, newCommitID, "a/b") require.NoError(t, err) err = pfsutil.MakeDirectory(apiClient, repositoryName, newCommitID, "a/c") require.NoError(t, err) doWrites(t, apiClient, repositoryName, newCommitID) err = pfsutil.Write(apiClient, repositoryName, newCommitID) require.NoError(t, err) commitInfo, err = pfsutil.GetCommitInfo(apiClient, repositoryName, newCommitID) require.NoError(t, err) require.NotNil(t, commitInfo) require.Equal(t, newCommitID, commitInfo.Commit.Id) require.Equal(t, pfs.CommitType_COMMIT_TYPE_READ, commitInfo.CommitType) require.Equal(t, "scratch", commitInfo.ParentCommit.Id) checkWrites(t, apiClient, repositoryName, newCommitID) fileInfos, err := pfsutil.ListFiles(apiClient, repositoryName, newCommitID, "a/b", 0, 1) require.NoError(t, err) require.Equal(t, testSize, len(fileInfos.FileInfo)) fileInfos, err = pfsutil.ListFiles(apiClient, repositoryName, newCommitID, "a/c", 0, 1) require.NoError(t, err) require.Equal(t, testSize, len(fileInfos.FileInfo)) var fileInfos2 [7][]*pfs.FileInfo var wg sync.WaitGroup for i := 0; i < 7; i++ { i := i wg.Add(1) go func() { defer wg.Done() fileInfos3, iErr := pfsutil.ListFiles(apiClient, repositoryName, newCommitID, "a/b", uint64(i), 7) require.NoError(t, iErr) fileInfos2[i] = fileInfos3.FileInfo }() } wg.Wait() count := 0 for i := 0; i < 7; i++ { count += len(fileInfos2[i]) } require.Equal(t, testSize, count) }