From 7e37a5c27bcc4146cc3ced699a9e0c6d2766d039 Mon Sep 17 00:00:00 2001 From: manjari Date: Fri, 2 Oct 2026 03:09:35 +0000 Subject: [PATCH] feat(runway): Add CommitMessageResolver interface for squash and merge commit metadata --- runway/extension/merger/BUILD.bazel | 5 +- runway/extension/merger/commit_message.go | 38 +++++++++++++ runway/extension/merger/mock/BUILD.bazel | 5 +- .../merger/mock/commit_message_mock.go | 57 +++++++++++++++++++ 4 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 runway/extension/merger/commit_message.go create mode 100644 runway/extension/merger/mock/commit_message_mock.go diff --git a/runway/extension/merger/BUILD.bazel b/runway/extension/merger/BUILD.bazel index e84294608..2485e033b 100644 --- a/runway/extension/merger/BUILD.bazel +++ b/runway/extension/merger/BUILD.bazel @@ -2,7 +2,10 @@ load("@rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", - srcs = ["merger.go"], + srcs = [ + "commit_message.go", + "merger.go", + ], importpath = "github.com/uber/submitqueue/runway/extension/merger", visibility = ["//visibility:public"], deps = ["//api/runway/messagequeue:go_default_library"], diff --git a/runway/extension/merger/commit_message.go b/runway/extension/merger/commit_message.go new file mode 100644 index 000000000..b60e99f4e --- /dev/null +++ b/runway/extension/merger/commit_message.go @@ -0,0 +1,38 @@ +// Copyright (c) 2026 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package merger + +//go:generate mockgen -source=commit_message.go -destination=mock/commit_message_mock.go -package=mock + +import "context" + +// CommitMessage is the message and authorship recorded on a squash or merge +// commit. +type CommitMessage struct { + // Message is the full commit message. + Message string + // AuthorName is the display name of the commit author. + AuthorName string + // AuthorEmail is the email address of the commit author. + AuthorEmail string +} + +// CommitMessageResolver resolves the commit message and authorship for the +// change named by a change URI. Implementations must be safe for concurrent +// use. +type CommitMessageResolver interface { + // Resolve returns the commit message for the change identified by uri. + Resolve(ctx context.Context, uri string) (CommitMessage, error) +} diff --git a/runway/extension/merger/mock/BUILD.bazel b/runway/extension/merger/mock/BUILD.bazel index 737462e9b..452f06221 100644 --- a/runway/extension/merger/mock/BUILD.bazel +++ b/runway/extension/merger/mock/BUILD.bazel @@ -2,7 +2,10 @@ load("@rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", - srcs = ["merger_mock.go"], + srcs = [ + "commit_message_mock.go", + "merger_mock.go", + ], importpath = "github.com/uber/submitqueue/runway/extension/merger/mock", visibility = ["//visibility:public"], deps = [ diff --git a/runway/extension/merger/mock/commit_message_mock.go b/runway/extension/merger/mock/commit_message_mock.go new file mode 100644 index 000000000..6d98de070 --- /dev/null +++ b/runway/extension/merger/mock/commit_message_mock.go @@ -0,0 +1,57 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: commit_message.go +// +// Generated by this command: +// +// mockgen -source=commit_message.go -destination=mock/commit_message_mock.go -package=mock +// + +// Package mock is a generated GoMock package. +package mock + +import ( + context "context" + reflect "reflect" + + merger "github.com/uber/submitqueue/runway/extension/merger" + gomock "go.uber.org/mock/gomock" +) + +// MockCommitMessageResolver is a mock of CommitMessageResolver interface. +type MockCommitMessageResolver struct { + ctrl *gomock.Controller + recorder *MockCommitMessageResolverMockRecorder + isgomock struct{} +} + +// MockCommitMessageResolverMockRecorder is the mock recorder for MockCommitMessageResolver. +type MockCommitMessageResolverMockRecorder struct { + mock *MockCommitMessageResolver +} + +// NewMockCommitMessageResolver creates a new mock instance. +func NewMockCommitMessageResolver(ctrl *gomock.Controller) *MockCommitMessageResolver { + mock := &MockCommitMessageResolver{ctrl: ctrl} + mock.recorder = &MockCommitMessageResolverMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockCommitMessageResolver) EXPECT() *MockCommitMessageResolverMockRecorder { + return m.recorder +} + +// Resolve mocks base method. +func (m *MockCommitMessageResolver) Resolve(ctx context.Context, uri string) (merger.CommitMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Resolve", ctx, uri) + ret0, _ := ret[0].(merger.CommitMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Resolve indicates an expected call of Resolve. +func (mr *MockCommitMessageResolverMockRecorder) Resolve(ctx, uri any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Resolve", reflect.TypeOf((*MockCommitMessageResolver)(nil).Resolve), ctx, uri) +}