💾 Archived View for gemini.rmf-dev.com › repo › Vaati › Gemigit › files › 1e38baeb9d9b1502370a0065c3… captured on 2022-07-16 at 17:09:39. Gemini links have been rewritten to link to archived content

View Raw

More Information

-=-=-=-=-=-=-

0 package repo

1

2 import (

3 "errors"

4 "gemigit/db"

5 "io"

6 "os"

7

8 "github.com/go-git/go-git/v5"

9 "github.com/go-git/go-git/v5/plumbing"

10 "github.com/go-git/go-git/v5/plumbing/object"

11 )

12

13 var rootPath string

14

15 func Init(path string) error {

16 rootPath = path

17 return os.MkdirAll(path, 0700)

18 }

19

20 func InitRepo(name string, username string) error {

21 _, err := git.PlainInit(rootPath+"/"+username+"/"+name, true)

22 return err

23 }

24

25 func RemoveRepo(name string, username string) error {

26 return os.RemoveAll(rootPath + "/" + username + "/" + name)

27 }

28

29 func GetCommits(name string, username string) (object.CommitIter, error) {

30 repo, err := git.PlainOpen(rootPath + "/" + username + "/" + name)

31 if err != nil {

32 return nil, err

33 }

34 ref, err := repo.Head()

35 if err != nil {

36 return nil, nil // Empty repo

37 }

38 cIter, err := repo.Log(&git.LogOptions{From: ref.Hash()})

39 if err != nil {

40 return nil, err

41 }

42 return cIter, nil

43 }

44

45 func getTree(name string, username string) (*object.Tree, error) {

46 repo, err := git.PlainOpen(rootPath + "/" + username + "/" + name)

47 if err != nil {

48 return nil, err

49 }

50 ref, err := repo.Head()

51 if err != nil {

52 return nil, nil // Empty repo

53 }

54 last, err := repo.CommitObject(ref.Hash())

55 if err != nil {

56 return nil, err

57 }

58 tree, err := repo.TreeObject(last.TreeHash)

59 if err != nil {

60 return nil, err

61 }

62 return tree, nil

63 }

64

65 func GetFiles(name string, username string) (*object.FileIter, error) {

66 tree, err := getTree(name, username)

67 if err != nil {

68 return nil, err

69 }

70 if tree == nil {

71 return nil, nil

72 }

73 return tree.Files(), nil

74 }

75

76 func GetFile(name string, username string, file string) (*object.File, error) {

77 tree, err := getTree(name, username)

78 if err != nil {

79 return nil, err

80 }

81 if tree == nil {

82 return nil, nil

83 }

84 out, err := tree.File(file)

85 if err != nil {

86 return nil, err

87 }

88 return out, nil

89 }

90

91 func GetPublicFile(name string, username string, hash string) (string, error) {

92 public, err := db.IsRepoPublic(name, username)

93 if err != nil {

94 return "", err

95 }

96 if !public {

97 return "", errors.New("repository is private")

98 }

99 repo, err := git.PlainOpen(rootPath + "/" + username + "/" + name)

100 if err != nil {

101 return "", err

102 }

103 file, err := repo.BlobObject(plumbing.NewHash(hash))

104 if err != nil {

105 return "", err

106 }

107 reader, err := file.Reader()

108 if err != nil {

109 return "", err

110 }

111 buf, err := io.ReadAll(reader)

112 if err != nil {

113 return "", err

114 }

115 return string(buf), nil

116 }

117

118 func GetPrivateFile(name string, username string, hash string, sig string) (string, error) {

119 user, b := db.GetUser(sig)

120 if !b || username != user.Name {

121 return "", errors.New("invalid signature")

122 }

123 repo, err := git.PlainOpen(rootPath + "/" + username + "/" + name)

124 if err != nil {

125 return "", err

126 }

127 file, err := repo.BlobObject(plumbing.NewHash(hash))

128 if err != nil {

129 return "", err

130 }

131 reader, err := file.Reader()

132 if err != nil {

133 return "", err

134 }

135 buf, err := io.ReadAll(reader)

136 if err != nil {

137 return "", err

138 }

139 return string(buf), nil

140 }

141

142 func ChangeRepoDir(name string, username string, newname string) error {

143 return os.Rename(rootPath+"/"+username+"/"+name, rootPath+"/"+username+"/"+newname)

144 }

145