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}