// SPDX-FileCopyrightText: 2025 Romain Maneschi // // SPDX-License-Identifier: EUPL-1.2 package repository import ( "errors" "fmt" "github.com/go-git/go-git/v6/plumbing" "github.com/samber/oops" "gitroot.dev/server/user" ) func (repo *GitRootRepository) CanWrite(userSsh string, branch string) (bool, *user.GitRootUser, error) { users, err := repo.ContentAtRef(repo.manager.conf.PathFileUsers(), plumbing.NewBranchReferenceName(branch)) if errors.Is(err, plumbing.ErrReferenceNotFound) { users, err = repo.contentUsersConf() } if err != nil { return false, nil, repo.errorHandler.Wrapf(err, "Reference") } currentUser, err := user.FindUser(users, branch, userSsh) if err != nil { return false, nil, repo.errorHandler.With("ssh", userSsh).Wrapf(err, "FindUser") } return currentUser.CanWrite(branch), currentUser, nil } func (repo *GitRootRepositoryWrite) AddUserInfo(u *user.GitRootUser, branch string) (plumbing.Hash, error) { fileUsersContent, err := repo.repo.contentUsersConf() if err != nil { return plumbing.ZeroHash, oops.Wrapf(err, "can't readAll file users") } newFileUsersContent, err := user.AppendBranch(fileUsersContent, branch, user.SimpleUser{Pseudo: u.Pseudo, Email: u.Email, Ssh: u.PubKey}) if err != nil { return plumbing.ZeroHash, oops.Wrapf(err, "can't AppendUser") } if err := repo.Write(repo.repo.manager.conf.PathFileUsers(), newFileUsersContent); err != nil { return plumbing.ZeroHash, oops.Wrapf(err, "Write") } hash, err := repo.CommitAll(fmt.Sprintf("Add user for branch %s", branch), repo.repo.manager.userManager.RootCommiter()) if err != nil { return plumbing.ZeroHash, oops.Wrapf(err, "CommitAll") } return hash, nil } func (repo *GitRootRepositoryWrite) DeleteBranchInFilesAndCommit(branch string) (plumbing.Hash, error) { fileUsersContent, err := repo.repo.contentUsersConf() if err != nil { return plumbing.ZeroHash, oops.Wrapf(err, "can't readAll file users") } newFileUsersContent, err := user.DeleteGroupAndBranch(fileUsersContent, branch) if err != nil { return plumbing.ZeroHash, oops.Wrapf(err, "can't DeleteGroupAndBranch") } if err := repo.Write(repo.repo.manager.conf.PathFileUsers(), newFileUsersContent); err != nil { return plumbing.ZeroHash, oops.Wrapf(err, "Write") } if h, err := repo.CommitAll(fmt.Sprintf("Delete branch %s", branch), repo.repo.manager.userManager.RootCommiter()); err != nil { return plumbing.ZeroHash, oops.Wrapf(err, "CommitAll") } else { return h, nil } } func (repo *GitRootRepository) AppendUserToGroup(groupName string, users ...user.SimpleUser) ([]byte, error) { fileUsersContent, err := repo.contentUsersConf() if err != nil { return nil, oops.Wrapf(err, "can't read users file") } return user.AppendUserToGroup(fileUsersContent, groupName, users...) } func (repo *GitRootRepository) contentUsersConf() ([]byte, error) { return repo.Content(repo.manager.conf.PathFileUsers()) }