loading up the forgejo repo on tangled to test page performance
1// Copyright 2014 The Gogs Authors. All rights reserved.
2// Copyright 2019 The Gitea Authors. All rights reserved.
3// SPDX-License-Identifier: MIT
4
5package git
6
7import (
8 "bytes"
9 "io"
10 "strings"
11)
12
13// ObjectType git object type
14type ObjectType string
15
16const (
17 // ObjectCommit commit object type
18 ObjectCommit ObjectType = "commit"
19 // ObjectTree tree object type
20 ObjectTree ObjectType = "tree"
21 // ObjectBlob blob object type
22 ObjectBlob ObjectType = "blob"
23 // ObjectTag tag object type
24 ObjectTag ObjectType = "tag"
25 // ObjectBranch branch object type
26 ObjectBranch ObjectType = "branch"
27)
28
29// Bytes returns the byte array for the Object Type
30func (o ObjectType) Bytes() []byte {
31 return []byte(o)
32}
33
34type EmptyReader struct{}
35
36func (EmptyReader) Read(p []byte) (int, error) {
37 return 0, io.EOF
38}
39
40func (repo *Repository) GetObjectFormat() (ObjectFormat, error) {
41 if repo != nil && repo.objectFormat != nil {
42 return repo.objectFormat, nil
43 }
44
45 str, err := repo.hashObject(EmptyReader{}, false)
46 if err != nil {
47 return nil, err
48 }
49 hash, err := NewIDFromString(str)
50 if err != nil {
51 return nil, err
52 }
53
54 repo.objectFormat = hash.Type()
55
56 return repo.objectFormat, nil
57}
58
59// HashObject takes a reader and returns hash for that reader
60func (repo *Repository) HashObject(reader io.Reader) (ObjectID, error) {
61 idStr, err := repo.hashObject(reader, true)
62 if err != nil {
63 return nil, err
64 }
65 return NewIDFromString(idStr)
66}
67
68func (repo *Repository) hashObject(reader io.Reader, save bool) (string, error) {
69 var cmd *Command
70 if save {
71 cmd = NewCommand(repo.Ctx, "hash-object", "-w", "--stdin")
72 } else {
73 cmd = NewCommand(repo.Ctx, "hash-object", "--stdin")
74 }
75 stdout := new(bytes.Buffer)
76 stderr := new(bytes.Buffer)
77 err := cmd.Run(&RunOpts{
78 Dir: repo.Path,
79 Stdin: reader,
80 Stdout: stdout,
81 Stderr: stderr,
82 })
83 if err != nil {
84 return "", err
85 }
86 return strings.TrimSpace(stdout.String()), nil
87}
88
89// GetRefType gets the type of the ref based on the string
90func (repo *Repository) GetRefType(ref string) ObjectType {
91 if repo.IsTagExist(ref) {
92 return ObjectTag
93 } else if repo.IsBranchExist(ref) {
94 return ObjectBranch
95 } else if repo.IsCommitExist(ref) {
96 return ObjectCommit
97 } else if _, err := repo.GetBlob(ref); err == nil {
98 return ObjectBlob
99 }
100 return ObjectType("invalid")
101}