package git import ( "fmt" "strings" ) // Cf. https://git.kernel.org/pub/scm/git/git.git/tree/Documentation/gitformat-pack.txt?id=bcb6cae2966cc407ca1afc77413b3ef11103c175#n72 type ObjectType int const ( // OBJ_BAD represents an invalid object type OBJ_BAD = ObjectType(iota) // OBJ_COMMIT, OBJ_TREE, OBJ_BLOB, OBJ_TAG are // Cf. https://git.kernel.org/pub/scm/git/git.git/tree/Documentation/gitformat-pack.txt?id=bcb6cae2966cc407ca1afc77413b3ef11103c175#n97 [accessed 2023-09-30] OBJ_COMMIT OBJ_TREE OBJ_BLOB OBJ_TAG // object type 5 is unused _ // OBJ_OFS_DELTA, OBJ_REF_DELTA are [TODO:write] OBJ_OFS_DELTA OBJ_REF_DELTA ) func (objtyp ObjectType) String() string { switch objtyp { default: // TODO consider //panic("unreachable") return fmt.Sprintf("OBJ_BAD(%d)", int(objtyp)) case OBJ_COMMIT: return "OBJ_COMMIT" case OBJ_TREE: return "OBJ_TREE" case OBJ_BLOB: return "OBJ_BLOB" case OBJ_TAG: return "OBJ_TAG" case OBJ_OFS_DELTA: return "OBJ_OFS_DELTA" case OBJ_REF_DELTA: return "OBJ_REF_DELTA" } } // Deprecated: TODO ugly name func (objtyp ObjectType) LowercaseName(padded bool) string { p := func(n int) string { if !padded { n = 0 } return strings.Repeat(" ", n) } switch objtyp { case OBJ_COMMIT: return "commit" case OBJ_TREE: return "tree" + p(2) case OBJ_BLOB: return "blob" + p(2) default: panic(fmt.Sprintf("%s.LowercaseName", objtyp)) } } func ObjectID(alg ChecksumAlgorithm, objtyp ObjectType, data []byte) Checksum { switch objtyp { case OBJ_COMMIT, OBJ_TREE, OBJ_BLOB: return alg.Slurp([]byte(fmt.Sprintf("%s %d\x00", objtyp.LowercaseName(false), len(data))), data) default: panic(fmt.Errorf("ObjectID: unexpected objtyp=%s", objtyp)) } }