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.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2016-11-04 01:16:01 +03:00
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 )
}
2023-12-14 00:02:00 +03:00
type EmptyReader struct { }
func ( EmptyReader ) Read ( p [ ] byte ) ( int , error ) {
return 0 , io . EOF
}
func ( repo * Repository ) GetObjectFormat ( ) ( ObjectFormat , error ) {
if repo != nil && repo . objectFormat != nil {
return repo . objectFormat , nil
}
str , err := repo . hashObject ( EmptyReader { } , false )
if err != nil {
return nil , err
}
2023-12-19 10:20:47 +03:00
hash , err := NewIDFromString ( str )
2019-05-11 18:29:17 +03:00
if err != nil {
2023-12-14 00:02:00 +03:00
return nil , err
2019-05-11 18:29:17 +03:00
}
2023-12-14 00:02:00 +03:00
repo . objectFormat = hash . Type ( )
return repo . objectFormat , nil
2019-05-11 18:29:17 +03:00
}
2023-12-14 00:02:00 +03:00
// HashObject takes a reader and returns hash for that reader
func ( repo * Repository ) HashObject ( reader io . Reader ) ( ObjectID , error ) {
idStr , err := repo . hashObject ( reader , true )
if err != nil {
return nil , err
}
2023-12-19 10:20:47 +03:00
return NewIDFromString ( idStr )
2023-12-14 00:02:00 +03:00
}
func ( repo * Repository ) hashObject ( reader io . Reader , save bool ) ( string , error ) {
var cmd * Command
if save {
cmd = NewCommand ( repo . Ctx , "hash-object" , "-w" , "--stdin" )
} else {
cmd = NewCommand ( repo . Ctx , "hash-object" , "--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" )
}