package statefile import ( "bytes" "github.com/hashicorp/terraform/internal/states" ) // StatesMarshalEqual returns true if and only if the two given states have // an identical (byte-for-byte) statefile representation. // // This function compares only the portions of the state that are persisted // in state files, so for example it will not return false if the only // differences between the two states are local values or descendent module // outputs. func StatesMarshalEqual(a, b *states.State) bool { var aBuf bytes.Buffer var bBuf bytes.Buffer // nil states are not valid states, and so they can never martial equal. if a == nil || b == nil { return false } // We write here some temporary files that have no header information // populated, thus ensuring that we're only comparing the state itself // and not any metadata. err := Write(&File{State: a}, &aBuf) if err != nil { // Should never happen, because we're writing to an in-memory buffer panic(err) } err = Write(&File{State: b}, &bBuf) if err != nil { // Should never happen, because we're writing to an in-memory buffer panic(err) } return bytes.Equal(aBuf.Bytes(), bBuf.Bytes()) }