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 "github.com/go-git/go-git/v5/plumbing"
9 "github.com/go-git/go-git/v5/plumbing/object"
10 "github.com/samber/oops"
11)
12
13func (repo *GitRootRepositoryWrite) IsForcePush(branch plumbing.ReferenceName, old plumbing.Hash) (bool, error) {
14 unlock := repo.repo.manager.repoLocks.Read(repo.repo.name)
15 defer unlock()
16
17 commitOld, err := repo.GetLastCommit(old)
18 if err != nil {
19 return false, oops.Wrapf(err, "commitOld")
20 }
21 ref, err := repo.storer.Reference(branch)
22 if err != nil {
23 return false, oops.Wrapf(err, "Reference")
24 }
25 commitBranch, err := object.GetCommit(repo.storer, ref.Hash())
26 if err != nil {
27 return false, oops.Wrapf(err, "commitBranch")
28 }
29 ok, err := commitOld.Commit.IsAncestor(commitBranch)
30 if err != nil {
31 return false, oops.Wrapf(err, "IsAncestor")
32 }
33 return !ok, err
34}