src/server/pfs/server/driver.go
func (d *driver) inspectCommit(pachClient *client.APIClient, commit *pfs.Commit, blockState pfs.CommitState) (*pfs.CommitInfo, error) {
	ctx := pachClient.Ctx()
	if commit == nil {
		return nil, fmt.Errorf("cannot inspect nil commit")
	}
	if err := d.checkIsAuthorized(pachClient, commit.Repo, auth.Scope_READER); err != nil {
		return nil, err
	}

	// Check if the commitID is a branch name
	var commitInfo *pfs.CommitInfo
	if _, err := col.NewSTM(ctx, d.etcdClient, func(stm col.STM) error {
		var err error
		commitInfo, err = d.resolveCommit(stm, commit)
		return err
	}); err != nil {
		return nil, err
	}

	commits := d.commits(commit.Repo.Name).ReadOnly(ctx)
	if blockState == pfs.CommitState_READY {
		// Wait for each provenant commit to be finished
		for _, p := range commitInfo.Provenance {
			d.inspectCommit(pachClient, p.Commit, pfs.CommitState_FINISHED)
		}
	}
	if blockState == pfs.CommitState_FINISHED {
		// Watch the CommitInfo until the commit has been finished
		if err := func() error {
			commitInfoWatcher, err := commits.WatchOne(commit.ID)
			if err != nil {
				return err
			}
			defer commitInfoWatcher.Close()
			for {
				var commitID string
				_commitInfo := new(pfs.CommitInfo)
				event := <-commitInfoWatcher.Watch()
				switch event.Type {
				case watch.EventError:
					return event.Err
				case watch.EventPut:
					if err := event.Unmarshal(&commitID, _commitInfo); err != nil {
						return fmt.Errorf("Unmarshal: %v", err)
					}
				case watch.EventDelete:
					return pfsserver.ErrCommitDeleted{commit}
				}
				if _commitInfo.Finished != nil {
					commitInfo = _commitInfo
					break
				}
			}
			return nil
		}(); err != nil {
			return nil, err
		}
	}
	return commitInfo, nil
}
func (d *driver) inspectCommit(pachClient *client.APIClient, commit *pfs.Commit, blockState pfs.CommitState) (*pfs.CommitInfo, error) {
	ctx := pachClient.Ctx()
	if commit == nil {
		return nil, fmt.Errorf("cannot inspect nil commit")
	}
	if err := d.checkIsAuthorized(pachClient, commit.Repo, auth.Scope_READER); err != nil {
		return nil, err
	}

	// Check if the commitID is a branch name
	var commitInfo *pfs.CommitInfo
	if _, err := col.NewSTM(ctx, d.etcdClient, func(stm col.STM) error {
		var err error
		commitInfo, err = d.resolveCommit(stm, commit)
		return err
	}); err != nil {
		return nil, err
	}

	commits := d.commits(commit.Repo.Name).ReadOnly(ctx)
	if blockState == pfs.CommitState_READY {
		// Wait for each provenant commit to be finished
		for _, p := range commitInfo.Provenance {
			d.inspectCommit(pachClient, p.Commit, pfs.CommitState_FINISHED)
		}
	}
	if blockState == pfs.CommitState_FINISHED {
		// Watch the CommitInfo until the commit has been finished
		if err := func() error {
			commitInfoWatcher, err := commits.WatchOne(commit.ID)
			if err != nil {
				return err
			}
			defer commitInfoWatcher.Close()
			for {
				var commitID string
				_commitInfo := new(pfs.CommitInfo)
				event := <-commitInfoWatcher.Watch()
				switch event.Type {
				case watch.EventError:
					return event.Err
				case watch.EventPut:
					if err := event.Unmarshal(&commitID, _commitInfo); err != nil {
						return fmt.Errorf("Unmarshal: %v", err)
					}
				case watch.EventDelete:
					return pfsserver.ErrCommitDeleted{commit}
				}
				if _commitInfo.Finished != nil {
					commitInfo = _commitInfo
					break
				}
			}
			return nil
		}(); err != nil {
			return nil, err
		}
	}
	return commitInfo, nil
}
func ( d * driver ) inspectCommit ( pachClient * client . APIClient , commit * pfs . Commit , blockState pfs . CommitState ) ( * pfs . CommitInfo , error ) { ctx := pachClient . Ctx ( ) if commit == nil { return nil , fmt . Errorf ( " " ) } if err := d . checkIsAuthorized ( pachClient , commit . Repo , auth . Scope_READER ) ; err != nil { return nil , err } // Check if the commitID is a branch name var commitInfo * pfs . CommitInfo if _ , err := col . NewSTM ( ctx , d . etcdClient , func ( stm col . STM ) error { var err error commitInfo , err = d . resolveCommit ( stm , commit ) return err } ) ; err != nil { return nil , err } commits := d . commits ( commit . Repo . Name ) . ReadOnly ( ctx ) if blockState == pfs . CommitState_READY { // Wait for each provenant commit to be finished for _ , p := range commitInfo . Provenance { d . inspectCommit ( pachClient , p . Commit , pfs . CommitState_FINISHED ) } } if blockState == pfs . CommitState_FINISHED { // Watch the CommitInfo until the commit has been finished if err := func ( ) error { commitInfoWatcher , err := commits . WatchOne ( commit . ID ) if err != nil { return err } defer commitInfoWatcher . Close ( ) for { var commitID string _commitInfo := new ( pfs . CommitInfo ) event := <- commitInfoWatcher . Watch ( ) switch event . Type { case watch . EventError : return event . Err case watch . EventPut : if err := event . Unmarshal ( & commitID , _commitInfo ) ; err != nil { return fmt . Errorf ( " " , err ) } case watch . EventDelete : return pfsserver . ErrCommitDeleted { commit } } if _commitInfo . Finished != nil { commitInfo = _commitInfo break } } return nil } ( ) ; err != nil { return nil , err } } return commitInfo , nil }
// inspectCommit takes a Commit and returns the corresponding CommitInfo.
//
// As a side effect, this function also replaces the ID in the given commit
// with a real commit ID.
inspectCommit takes a Commit and returns the corresponding CommitInfo . As a side effect this function also replaces the ID in the given commit with a real commit ID .