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}