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/v5/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) error {
32	currentBranch, err := repo.repo.CurrentBranch()
33	if err != nil {
34		return oops.Wrapf(err, "can't get currentBranch")
35	}
36	if err := repo.Checkout(plumbing.NewBranchReferenceName(branch)); err != nil {
37		return oops.With("branch", branch).Wrapf(err, "can't checkout")
38	}
39	fileUsersContent, err := repo.repo.contentUsersConf()
40	if err != nil {
41		return oops.Wrapf(err, "can't readAll file users")
42	}
43	newFileUsersContent, err := user.AppendBranch(fileUsersContent, branch, user.SimpleUser{Pseudo: u.Pseudo, Email: u.Email, Ssh: u.PubKey})
44	if err != nil {
45		return oops.Wrapf(err, "can't AppendUser")
46	}
47
48	if err := repo.Write(repo.repo.manager.conf.PathFileUsers(), newFileUsersContent); err != nil {
49		return oops.Wrapf(err, "Write")
50	}
51
52	if _, err := repo.CommitAll(fmt.Sprintf("Add user for branch %s", branch), repo.repo.manager.userManager.RootCommiter()); err != nil {
53		return oops.Wrapf(err, "CommitAll")
54	}
55	return repo.Checkout(currentBranch)
56}
57
58func (repo *GitRootRepository) AppendUserToGroup(groupName string, users ...user.SimpleUser) ([]byte, error) {
59	fileUsersContent, err := repo.contentUsersConf()
60	if err != nil {
61		return nil, oops.Wrapf(err, "can't read users file")
62	}
63	return user.AppendUserToGroup(fileUsersContent, groupName, users...)
64}
65
66func (repo *GitRootRepository) contentUsersConf() ([]byte, error) {
67	return repo.Content(repo.manager.conf.PathFileUsers())
68}