package dehub import ( "encoding/base64" "errors" "fmt" "strings" "dehub.dev/src/dehub.git/yamlutil" ) // CommitCredential describes the structure of a credential commit message. type CommitCredential struct { CredentialedHash yamlutil.Blob `yaml:"credentialed_hash"` // CommitHashes represents the commits which this credential is accrediting. // It is only present for informational purposes, as commits don't not have // any bearing on the CredentialedHash itself. CommitHashes []string `yaml:"commits,omitempty"` } var _ CommitInterface = CommitCredential{} // NewCommitCredential constructs and returns a Commit populated with a // CommitCredential encompassing the given hash. The Credentials of the returned // Commit will _not_ be filled in. func (r *Repo) NewCommitCredential(hash []byte) (Commit, error) { return Commit{ Credential: &CommitCredential{ CredentialedHash: hash, }, }, nil } // NewCommitCredentialFromChanges constructs and returns a Commit populated with // a CommitCredential for all changes in the given range of GitCommits. The // message of the last change commit in the range is used when generating the // hash. func (r *Repo) NewCommitCredentialFromChanges(commits []GitCommit) (Commit, error) { info, err := r.changeRangeInfo(commits) if err != nil { return Commit{}, err } commitCred, err := r.NewCommitCredential(info.changeHash) if err != nil { return Commit{}, err } for _, commit := range info.changeCommits { commitCred.Credential.CommitHashes = append( commitCred.Credential.CommitHashes, commit.GitCommit.Hash.String(), ) } return commitCred, nil } // MessageHead implements the method for the CommitInterface interface. func (cc CommitCredential) MessageHead(common CommitCommon) (string, error) { hash64 := base64.StdEncoding.EncodeToString(cc.CredentialedHash) if len(hash64) > 6 { hash64 = hash64[:6] + "..." } credIDs := strings.Join(common.credIDs(), ", ") return fmt.Sprintf("Credential of hash %s by %s", hash64, credIDs), nil } // ExpectedHash implements the method for the CommitInterface. func (cc CommitCredential) ExpectedHash(changes []ChangedFile) ([]byte, error) { if len(changes) > 0 { return nil, errors.New("CommitCredential cannot have any changed files") } return cc.CredentialedHash, nil } // StoredHash implements the method for the CommitInterface. func (cc CommitCredential) StoredHash() []byte { return cc.CredentialedHash }