Skip to content

Commit 34cf103

Browse files
authored
fix: deletionProposed branch throws error for main revisions (#4056)
1 parent 0079beb commit 34cf103

File tree

2 files changed

+105
-9
lines changed

2 files changed

+105
-9
lines changed

porch/pkg/git/git.go

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ func (r *gitRepository) DeletePackageRevision(ctx context.Context, old repositor
426426
refSpecs.AddRefToDelete(ref)
427427

428428
// If this revision was proposed for deletion, we need to delete the associated branch.
429-
if err := r.removeDeletionProposedBranchIfExists(ctx, oldGit.path, oldGit.revision, oldGit.commit); err != nil {
429+
if err := r.removeDeletionProposedBranchIfExists(ctx, oldGit.path, oldGit.revision); err != nil {
430430
return err
431431
}
432432

@@ -443,7 +443,7 @@ func (r *gitRepository) DeletePackageRevision(ctx context.Context, old repositor
443443

444444
// Remove the proposed for deletion branch. We end up here when users
445445
// try to delete the main branch version of a packagerevision.
446-
if err := r.removeDeletionProposedBranchIfExists(ctx, oldGit.path, oldGit.revision, oldGit.commit); err != nil {
446+
if err := r.removeDeletionProposedBranchIfExists(ctx, oldGit.path, oldGit.revision); err != nil {
447447
return err
448448
}
449449

@@ -461,18 +461,14 @@ func (r *gitRepository) DeletePackageRevision(ctx context.Context, old repositor
461461
return nil
462462
}
463463

464-
func (r *gitRepository) removeDeletionProposedBranchIfExists(ctx context.Context, path, revision string, commit plumbing.Hash) error {
464+
func (r *gitRepository) removeDeletionProposedBranchIfExists(ctx context.Context, path, revision string) error {
465465
refSpecsForDeletionProposed := newPushRefSpecBuilder()
466466
deletionProposedBranch := createDeletionProposedName(path, revision)
467-
refSpecsForDeletionProposed.AddRefToDelete(plumbing.NewHashReference(deletionProposedBranch.RefInLocal(), commit))
467+
refSpecsForDeletionProposed.AddRefToDelete(plumbing.NewHashReference(deletionProposedBranch.RefInLocal(), plumbing.ZeroHash))
468468
if err := r.pushAndCleanup(ctx, refSpecsForDeletionProposed); err != nil {
469-
if strings.HasPrefix(err.Error(),
470-
fmt.Sprintf("remote ref %s%s required to be", branchPrefixInRemoteRepo, deletionProposedBranch)) &&
471-
strings.HasSuffix(err.Error(), "but is absent") {
472-
469+
if errors.Is(err, git.NoErrAlreadyUpToDate) {
473470
// the deletionProposed branch might not have existed, so we ignore this error
474471
klog.Warningf("branch %s does not exist", deletionProposedBranch)
475-
476472
} else {
477473
klog.Errorf("unexpected error while removing deletionProposed branch: %v", err)
478474
return err

porch/test/e2e/e2e_test.go

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1115,6 +1115,106 @@ func (t *PorchSuite) TestDeleteAndRecreate(ctx context.Context) {
11151115
t.Logf("successfully recreated package revision %q", packageName)
11161116
}
11171117

1118+
func (t *PorchSuite) TestDeleteFromMain(ctx context.Context) {
1119+
const (
1120+
repository = "delete-main"
1121+
packageNameFirst = "test-delete-main-first"
1122+
packageNameSecond = "test-delete-main-second"
1123+
workspace = "workspace"
1124+
)
1125+
1126+
// Register the repository
1127+
t.registerMainGitRepositoryF(ctx, repository)
1128+
1129+
// Create the first draft package
1130+
createdFirst := t.createPackageDraftF(ctx, repository, packageNameFirst, workspace)
1131+
1132+
// Check the package exists
1133+
var pkgFirst porchapi.PackageRevision
1134+
t.mustExist(ctx, client.ObjectKey{Namespace: t.namespace, Name: createdFirst.Name}, &pkgFirst)
1135+
1136+
// Propose the package revision to be finalized
1137+
pkgFirst.Spec.Lifecycle = porchapi.PackageRevisionLifecycleProposed
1138+
t.UpdateF(ctx, &pkgFirst)
1139+
1140+
pkgFirst.Spec.Lifecycle = porchapi.PackageRevisionLifecyclePublished
1141+
t.UpdateApprovalF(ctx, &pkgFirst, metav1.UpdateOptions{})
1142+
1143+
t.mustExist(ctx, client.ObjectKey{Namespace: t.namespace, Name: createdFirst.Name}, &pkgFirst)
1144+
1145+
// Create the second draft package
1146+
createdSecond := t.createPackageDraftF(ctx, repository, packageNameSecond, workspace)
1147+
1148+
// Check the package exists
1149+
var pkgSecond porchapi.PackageRevision
1150+
t.mustExist(ctx, client.ObjectKey{Namespace: t.namespace, Name: createdSecond.Name}, &pkgSecond)
1151+
1152+
// Propose the package revision to be finalized
1153+
pkgSecond.Spec.Lifecycle = porchapi.PackageRevisionLifecycleProposed
1154+
t.UpdateF(ctx, &pkgSecond)
1155+
1156+
pkgSecond.Spec.Lifecycle = porchapi.PackageRevisionLifecyclePublished
1157+
t.UpdateApprovalF(ctx, &pkgSecond, metav1.UpdateOptions{})
1158+
1159+
t.mustExist(ctx, client.ObjectKey{Namespace: t.namespace, Name: createdSecond.Name}, &pkgSecond)
1160+
1161+
// We need to wait for the sync for the "main" revisions to get created
1162+
time.Sleep(75 * time.Second)
1163+
1164+
var list porchapi.PackageRevisionList
1165+
t.ListE(ctx, &list, client.InNamespace(t.namespace))
1166+
1167+
var firstPkgRevFromMain porchapi.PackageRevision
1168+
var secondPkgRevFromMain porchapi.PackageRevision
1169+
1170+
for _, pkgrev := range list.Items {
1171+
if pkgrev.Spec.PackageName == packageNameFirst && pkgrev.Spec.Revision == "main" {
1172+
firstPkgRevFromMain = pkgrev
1173+
}
1174+
if pkgrev.Spec.PackageName == packageNameSecond && pkgrev.Spec.Revision == "main" {
1175+
secondPkgRevFromMain = pkgrev
1176+
}
1177+
}
1178+
1179+
// Propose deletion of both main packages
1180+
firstPkgRevFromMain.Spec.Lifecycle = porchapi.PackageRevisionLifecycleDeletionProposed
1181+
t.UpdateApprovalF(ctx, &firstPkgRevFromMain, metav1.UpdateOptions{})
1182+
secondPkgRevFromMain.Spec.Lifecycle = porchapi.PackageRevisionLifecycleDeletionProposed
1183+
t.UpdateApprovalF(ctx, &secondPkgRevFromMain, metav1.UpdateOptions{})
1184+
1185+
// Delete the first package revision from main
1186+
t.DeleteE(ctx, &porchapi.PackageRevision{
1187+
ObjectMeta: metav1.ObjectMeta{
1188+
Namespace: t.namespace,
1189+
Name: firstPkgRevFromMain.Name,
1190+
},
1191+
})
1192+
1193+
// We need to wait for the sync
1194+
time.Sleep(75 * time.Second)
1195+
1196+
// Delete the second package revision from main
1197+
t.DeleteE(ctx, &porchapi.PackageRevision{
1198+
ObjectMeta: metav1.ObjectMeta{
1199+
Namespace: t.namespace,
1200+
Name: secondPkgRevFromMain.Name,
1201+
},
1202+
})
1203+
1204+
// Propose and delete the original package revisions (cleanup)
1205+
t.ListE(ctx, &list, client.InNamespace(t.namespace))
1206+
for _, pkgrev := range list.Items {
1207+
pkgrev.Spec.Lifecycle = porchapi.PackageRevisionLifecycleDeletionProposed
1208+
t.UpdateApprovalF(ctx, &pkgrev, metav1.UpdateOptions{})
1209+
t.DeleteE(ctx, &porchapi.PackageRevision{
1210+
ObjectMeta: metav1.ObjectMeta{
1211+
Namespace: t.namespace,
1212+
Name: pkgrev.Name,
1213+
},
1214+
})
1215+
}
1216+
}
1217+
11181218
func (t *PorchSuite) TestCloneLeadingSlash(ctx context.Context) {
11191219
const (
11201220
repository = "clone-ls"

0 commit comments

Comments
 (0)