GitRoot
Craft your forge, Build your project, Grow your community freely
1// SPDX-FileCopyrightText: 2025 Romain Maneschi <romain@gitroot.dev>
2//
3// SPDX-License-Identifier: EUPL-1.2
4
5package repository
6
7import (
8 "errors"
9 "fmt"
10
11 "github.com/go-git/go-git/v6/plumbing"
12 "github.com/samber/oops"
13 "gitroot.dev/server/user"
14)
15
16func (repo *GitRootRepository) CanWrite(userSsh string, branch string) (bool, *user.GitRootUser, error) {
17 users, err := repo.ContentAtRef(repo.manager.conf.PathFileUsers(), plumbing.NewBranchReferenceName(branch))
18 if errors.Is(err, plumbing.ErrReferenceNotFound) {
19 users, err = repo.contentUsersConf()
20 }
21 if err != nil {
22 return false, nil, repo.errorHandler.Wrapf(err, "Reference")
23 }
24 currentUser, err := user.FindUser(users, branch, userSsh)
25 if err != nil {
26 return false, nil, repo.errorHandler.With("ssh", userSsh).Wrapf(err, "FindUser")
27 }
28 return currentUser.CanWrite(branch), currentUser, nil
29}
30
31func (repo *GitRootRepositoryWrite) AddUserInfo(u *user.GitRootUser, branch string) (plumbing.Hash, error) {
32 fileUsersContent, err := repo.repo.contentUsersConf()
33 if err != nil {
34 return plumbing.ZeroHash, oops.Wrapf(err, "can't readAll file users")
35 }
36 newFileUsersContent, err := user.AppendBranch(fileUsersContent, branch, user.SimpleUser{Pseudo: u.Pseudo, Email: u.Email, Ssh: u.PubKey})
37 if err != nil {
38 return plumbing.ZeroHash, oops.Wrapf(err, "can't AppendUser")
39 }
40
41 if err := repo.Write(repo.repo.manager.conf.PathFileUsers(), newFileUsersContent); err != nil {
42 return plumbing.ZeroHash, oops.Wrapf(err, "Write")
43 }
44
45 hash, err := repo.CommitAll(fmt.Sprintf("Add user for branch %s", branch), repo.repo.manager.userManager.RootCommiter())
46 if err != nil {
47 return plumbing.ZeroHash, oops.Wrapf(err, "CommitAll")
48 }
49 return hash, nil
50}
51
52func (repo *GitRootRepositoryWrite) DeleteBranchInFilesAndCommit(branch string) (plumbing.Hash, error) {
53 fileUsersContent, err := repo.repo.contentUsersConf()
54 if err != nil {
55 return plumbing.ZeroHash, oops.Wrapf(err, "can't readAll file users")
56 }
57 newFileUsersContent, err := user.DeleteGroupAndBranch(fileUsersContent, branch)
58 if err != nil {
59 return plumbing.ZeroHash, oops.Wrapf(err, "can't DeleteGroupAndBranch")
60 }
61
62 if err := repo.Write(repo.repo.manager.conf.PathFileUsers(), newFileUsersContent); err != nil {
63 return plumbing.ZeroHash, oops.Wrapf(err, "Write")
64 }
65
66 if h, err := repo.CommitAll(fmt.Sprintf("Delete branch %s", branch), repo.repo.manager.userManager.RootCommiter()); err != nil {
67 return plumbing.ZeroHash, oops.Wrapf(err, "CommitAll")
68 } else {
69 return h, nil
70 }
71}
72
73func (repo *GitRootRepository) AppendUserToGroup(groupName string, users ...user.SimpleUser) ([]byte, error) {
74 fileUsersContent, err := repo.contentUsersConf()
75 if err != nil {
76 return nil, oops.Wrapf(err, "can't read users file")
77 }
78 return user.AppendUserToGroup(fileUsersContent, groupName, users...)
79}
80
81func (repo *GitRootRepository) contentUsersConf() ([]byte, error) {
82 return repo.Content(repo.manager.conf.PathFileUsers())
83}