Skip to content

Commit

Permalink
feat(gomod): Support go work vendor (#29216)
Browse files Browse the repository at this point in the history
  • Loading branch information
chancez authored Jun 11, 2024
1 parent f98e4dd commit 381fa55
Show file tree
Hide file tree
Showing 2 changed files with 140 additions and 5 deletions.
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 @@ -278,6 +278,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 @@ -11,6 +11,7 @@ import type { ExecOptions } from '../../../util/exec/types';
import { filterMap } from '../../../util/filter-map';
import {
ensureCacheDir,
findLocalSiblingOrParent,
isValidLocalPath,
readLocalFile,
writeLocalFile,
Expand Down Expand Up @@ -128,7 +129,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 @@ -283,10 +286,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');
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;
logger.debug('go mod tidy command included');
Expand All @@ -306,7 +327,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 @@ -323,6 +345,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

0 comments on commit 381fa55

Please sign in to comment.