Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(gomod): Support go work vendor #29216

Merged
merged 11 commits into from
Jun 11, 2024
102 changes: 102 additions & 0 deletions lib/modules/manager/gomod/artifacts.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,108 @@ describe('modules/manager/gomod/artifacts', () => {
]);
});

it('supports vendor directory update with go.work', async () => {
const foo = join('vendor/github.com/foo/foo/go.mod');
const bar = join('vendor/github.com/bar/bar/go.mod');
const baz = join('vendor/github.com/baz/baz/go.mod');

fs.readLocalFile.mockResolvedValueOnce('Current go.sum');
fs.readLocalFile.mockResolvedValueOnce('modules.txt content'); // vendor modules filename
fs.findLocalSiblingOrParent.mockResolvedValueOnce('go.work');
const execSnapshots = mockExecAll();
git.getRepoStatus.mockResolvedValueOnce(
partial<StatusResult>({
modified: ['go.sum', 'go.work.sum', foo],
not_added: [bar],
deleted: [baz],
}),
);
fs.readLocalFile.mockResolvedValueOnce('New go.sum');
fs.readLocalFile.mockResolvedValueOnce('New go.work.sum');
fs.readLocalFile.mockResolvedValueOnce('Foo go.sum');
fs.readLocalFile.mockResolvedValueOnce('Bar go.sum');
fs.readLocalFile.mockResolvedValueOnce('New go.mod');
const res = await gomod.updateArtifacts({
packageFileName: 'go.mod',
updatedDeps: [],
newPackageFileContent: gomod1,
config: {
...config,
postUpdateOptions: ['gomodTidy'],
},
});
expect(res).toEqual([
{
file: {
contents: 'New go.sum',
path: 'go.sum',
type: 'addition',
},
},
{
file: {
contents: 'New go.work.sum',
path: 'go.work.sum',
type: 'addition',
},
},
{
file: {
contents: 'Foo go.sum',
path: 'vendor/github.com/foo/foo/go.mod',
type: 'addition',
},
},
{
file: {
contents: 'Bar go.sum',
path: 'vendor/github.com/bar/bar/go.mod',
type: 'addition',
},
},
{
file: {
path: 'vendor/github.com/baz/baz/go.mod',
type: 'deletion',
},
},
{
file: {
contents: 'New go.mod',
path: 'go.mod',
type: 'addition',
},
},
]);

expect(execSnapshots).toMatchObject([
{
cmd: 'go get -d -t ./...',
options: { cwd: '/tmp/github/some/repo' },
},
{
cmd: 'go mod tidy',
options: { cwd: '/tmp/github/some/repo' },
},
{
cmd: 'go work vendor',
options: { cwd: '/tmp/github/some/repo' },
},
{
cmd: 'go work sync',
options: { cwd: '/tmp/github/some/repo' },
},
{
cmd: 'go mod tidy',
options: { cwd: '/tmp/github/some/repo' },
},
{
cmd: 'go mod tidy',
options: { cwd: '/tmp/github/some/repo' },
},
]);
});

it('supports docker mode without credentials', async () => {
GlobalConfig.set({ ...adminConfig, binarySource: 'docker' });
fs.readLocalFile.mockResolvedValueOnce('Current go.sum');
Expand Down
43 changes: 38 additions & 5 deletions lib/modules/manager/gomod/artifacts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { exec } from '../../../util/exec';
import type { ExecOptions } from '../../../util/exec/types';
import {
ensureCacheDir,
findLocalSiblingOrParent,
isValidLocalPath,
readLocalFile,
writeLocalFile,
Expand Down Expand Up @@ -126,7 +127,9 @@ export async function updateArtifacts({
return null;
}

const vendorDir = upath.join(upath.dirname(goModFileName), 'vendor/');
const goModDir = upath.dirname(goModFileName);

const vendorDir = upath.join(goModDir, 'vendor/');
const vendorModulesFileName = upath.join(vendorDir, 'modules.txt');
const useVendor = (await readLocalFile(vendorModulesFileName)) !== null;

Expand Down Expand Up @@ -281,10 +284,28 @@ export async function updateArtifacts({
execCommands.push(`${cmd} ${args}`);
}

const goWorkSumFileName = upath.join(goModDir, 'go.work.sum');
if (useVendor) {
args = 'mod vendor';
logger.debug('go mod tidy command included');
execCommands.push(`${cmd} ${args}`);
// If we find a go.work, then use go workspace vendoring.
const goWorkFile = await findLocalSiblingOrParent(
goModFileName,
'go.work',
);

if (goWorkFile) {
args = 'work vendor';
logger.debug('using go work vendor');
rarkins marked this conversation as resolved.
Show resolved Hide resolved
execCommands.push(`${cmd} ${args}`);

args = 'work sync';
logger.debug('using go work sync');
execCommands.push(`${cmd} ${args}`);
} else {
args = 'mod vendor';
logger.debug('using go mod vendor');
execCommands.push(`${cmd} ${args}`);
}

if (isGoModTidyRequired) {
args = 'mod tidy' + tidyOpts;
chancez marked this conversation as resolved.
Show resolved Hide resolved
logger.debug('go mod tidy command included');
Expand All @@ -304,7 +325,8 @@ export async function updateArtifacts({
const status = await getRepoStatus();
if (
!status.modified.includes(sumFileName) &&
!status.modified.includes(goModFileName)
!status.modified.includes(goModFileName) &&
!status.modified.includes(goWorkSumFileName)
) {
return null;
}
Expand All @@ -321,6 +343,17 @@ export async function updateArtifacts({
});
}

if (status.modified.includes(goWorkSumFileName)) {
logger.debug('Returning updated go.work.sum');
res.push({
file: {
type: 'addition',
path: goWorkSumFileName,
contents: await readLocalFile(goWorkSumFileName),
},
});
}

// Include all the .go file import changes
if (isImportPathUpdateRequired) {
logger.debug('Returning updated go source files for import path changes');
Expand Down