in src/commands/draft/draftCommands.ts [91:171]
export async function draftWorkflow(_context: IActionContext, target: unknown): Promise<void> {
const cloudExplorer = await k8s.extension.cloudExplorer.v1;
const params = getDraftWorkflowParams(cloudExplorer, target);
const commonDependencies = await getCommonDraftDependencies(params?.workspaceFolder);
if (commonDependencies === null) {
return;
}
const { workspaceFolder, extension, draftBinaryPath } = commonDependencies;
const sessionProvider = await getReadySessionProvider();
if (failed(sessionProvider)) {
window.showErrorMessage(sessionProvider.error);
return;
}
// The git API is used to infer the remote repositories associated with the selected workspace.
// This allows it to provide only the relevant GitHub repositories for the user to pick from.
const gitApi = getGitApi();
if (failed(gitApi)) {
window.showErrorMessage(gitApi.error);
return;
}
const kubectl = await k8s.extension.kubectl.v1;
if (!kubectl.available) {
window.showErrorMessage(`Kubectl is unavailable.`);
return;
}
const workspaceRepository = await gitApi.result.openRepository(workspaceFolder.uri);
if (!workspaceRepository) {
window.showErrorMessage("The workspace is not a git repository.");
return;
}
const session = await getGitHubAuthenticationSession();
if (failed(session)) {
window.showErrorMessage(session.error);
return;
}
// The Octokit instance is used to interact with the GitHub API. This allows the user to
// select the relevant repository and branch to associate with the workflow file.
const octokit = new Octokit({
auth: `token ${session.result.accessToken}`,
});
const reposFromRemotes = await Promise.all(workspaceRepository.state.remotes.map((r) => getRepo(octokit, r)));
const accessibleRepos = reposFromRemotes.filter((f) => f !== null) as GitHubRepo[];
const workflowsUri = Uri.joinPath(workspaceFolder.uri, ".github", "workflows");
let existingWorkflowFiles: ExistingFile[] = [];
try {
const files = await workspace.fs.readDirectory(workflowsUri);
existingWorkflowFiles = files
.filter((f) => f[1] === FileType.File)
.map((f) => {
const [name] = f;
return {
name: basename(name, extname(name)),
path: join(".github", "workflows", name),
};
});
} catch {
// If the directory doesn't exist, that's fine - it just means there will be no existing workflow files.
}
const panel = new DraftWorkflowPanel(extension.extensionUri);
const dataProvider = new DraftWorkflowDataProvider(
sessionProvider.result,
workspaceFolder,
draftBinaryPath,
kubectl,
session.result,
accessibleRepos,
existingWorkflowFiles,
params?.initialSelection || {},
);
panel.show(dataProvider);
}