2016-11-04 01:16:01 +03:00
// Copyright 2014 The Gogs Authors. All rights reserved.
2019-06-29 23:51:10 +03:00
// Copyright 2019 The Gitea Authors. All rights reserved.
2016-11-04 01:16:01 +03:00
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package git
2019-05-11 18:29:17 +03:00
import (
"bytes"
"io"
"strings"
)
2016-12-22 12:30:52 +03:00
// ObjectType git object type
2016-11-04 01:16:01 +03:00
type ObjectType string
const (
2016-12-22 12:30:52 +03:00
// ObjectCommit commit object type
ObjectCommit ObjectType = "commit"
// ObjectTree tree object type
ObjectTree ObjectType = "tree"
// ObjectBlob blob object type
ObjectBlob ObjectType = "blob"
// ObjectTag tag object type
ObjectTag ObjectType = "tag"
2019-06-29 23:51:10 +03:00
// ObjectBranch branch object type
ObjectBranch ObjectType = "branch"
2016-11-04 01:16:01 +03:00
)
2019-05-11 18:29:17 +03:00
2020-12-17 17:00:47 +03:00
// Bytes returns the byte array for the Object Type
func ( o ObjectType ) Bytes ( ) [ ] byte {
return [ ] byte ( o )
}
2019-05-11 18:29:17 +03:00
// HashObject takes a reader and returns SHA1 hash for that reader
func ( repo * Repository ) HashObject ( reader io . Reader ) ( SHA1 , error ) {
idStr , err := repo . hashObject ( reader )
if err != nil {
return SHA1 { } , err
}
return NewIDFromString ( idStr )
}
func ( repo * Repository ) hashObject ( reader io . Reader ) ( string , error ) {
2022-02-06 22:01:47 +03:00
cmd := NewCommand ( repo . Ctx , "hash-object" , "-w" , "--stdin" )
2019-05-11 18:29:17 +03:00
stdout := new ( bytes . Buffer )
stderr := new ( bytes . Buffer )
2022-04-01 05:55:30 +03:00
err := cmd . Run ( & RunOpts {
Dir : repo . Path ,
Stdin : reader ,
Stdout : stdout ,
Stderr : stderr ,
2022-02-11 15:47:22 +03:00
} )
2019-05-11 18:29:17 +03:00
if err != nil {
return "" , err
}
return strings . TrimSpace ( stdout . String ( ) ) , nil
}
2019-06-29 23:51:10 +03:00
// GetRefType gets the type of the ref based on the string
func ( repo * Repository ) GetRefType ( ref string ) ObjectType {
if repo . IsTagExist ( ref ) {
return ObjectTag
} else if repo . IsBranchExist ( ref ) {
return ObjectBranch
} else if repo . IsCommitExist ( ref ) {
return ObjectCommit
} else if _ , err := repo . GetBlob ( ref ) ; err == nil {
return ObjectBlob
}
return ObjectType ( "invalid" )
}