Skip to content
This repository has been archived by the owner on Oct 24, 2021. It is now read-only.

Commit

Permalink
Initial testing (#1)
Browse files Browse the repository at this point in the history
Initial implementation of plugin
  • Loading branch information
pjreiniger authored May 23, 2019
1 parent c3a0844 commit b639187
Show file tree
Hide file tree
Showing 41 changed files with 12,206 additions and 8 deletions.
14 changes: 13 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -269,4 +269,16 @@ gradle-app.setting
### Gradle Patch ###
**/build/

# End of https://www.gitignore.io/api/node,gradle,eclipse,intellij,visualstudiocode
# End of https://www.gitignore.io/api/node,gradle,eclipse,intellij,visualstudiocode



# My stuff
vscode/resources
*.vsix


// These files will be generated from the i18n folder
*nls.*.json


136 changes: 129 additions & 7 deletions azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,38 @@ jobs:
testResultsFiles: '**/TEST-*.xml'
tasks: 'build'

- script: |
npm install
workingDirectory: $(Build.SourcesDirectory)/standalone
displayName: 'npm install'
- script: |
npm run compile
workingDirectory: $(Build.SourcesDirectory)/standalone
displayName: 'npm compile'
- script: |
npm run lint
workingDirectory: $(Build.SourcesDirectory)/standalone
displayName: 'npm lint'
- script: |
npm run packageLinux
workingDirectory: $(Build.SourcesDirectory)/standalone
displayName: 'npm package'
- task: ArchiveFiles@2
inputs:
rootFolderOrFile: $(Build.SourcesDirectory)/standalone/build/snobotsim_utility-linux-x64
includeRootFolder: false
archiveType: 'tar'
archiveFile: '$(Build.ArtifactStagingDirectory)/snobotsim_utility-linux.tar.gz'
replaceExistingArchive: true

- task: PublishBuildArtifacts@1
inputs:
artifactName: 'Linux'

- job: Windows_Standalone
pool:
vmImage: 'vs2017-win2016'
Expand All @@ -42,11 +74,41 @@ jobs:
publishJUnitResults: false
testResultsFiles: '**/TEST-*.xml'
tasks: 'build'
options: '-PjenkinsBuild'

- job: Windows_VSIX
- script: |
npm install
workingDirectory: $(Build.SourcesDirectory)/standalone
displayName: 'npm install'
- script: |
npm run compile
workingDirectory: $(Build.SourcesDirectory)/standalone
displayName: 'npm compile'
- script: |
npm run lint
workingDirectory: $(Build.SourcesDirectory)/standalone
displayName: 'npm lint'
- script: |
npm run packageWindows
workingDirectory: $(Build.SourcesDirectory)/standalone
displayName: 'npm package'
- task: ArchiveFiles@2
inputs:
rootFolderOrFile: $(Build.SourcesDirectory)/standalone/build/snobotsim_utility-win32-ia32
includeRootFolder: false
archiveFile: '$(Build.ArtifactStagingDirectory)/snobotsim_utility-windows.zip'
replaceExistingArchive: true

- task: PublishBuildArtifacts@1
inputs:
artifactName: 'WindowsStandalone'

- job: Mac
pool:
vmImage: 'vs2017-win2016'
vmImage: 'xcode9-macos10.13'

steps:
- task: NodeTool@0
Expand All @@ -65,11 +127,42 @@ jobs:
publishJUnitResults: false
testResultsFiles: '**/TEST-*.xml'
tasks: 'build'
options: '-PjenkinsBuild'

- job: Mac
- script: |
npm install
workingDirectory: $(Build.SourcesDirectory)/standalone
displayName: 'npm install'
- script: |
npm run compile
workingDirectory: $(Build.SourcesDirectory)/standalone
displayName: 'npm compile'
- script: |
npm run lint
workingDirectory: $(Build.SourcesDirectory)/standalone
displayName: 'npm lint'
- script: |
npm run packageMac
workingDirectory: $(Build.SourcesDirectory)/standalone
displayName: 'npm package'
- task: ArchiveFiles@2
inputs:
rootFolderOrFile: $(Build.SourcesDirectory)/standalone/build/snobotsim_utility-darwin-x64
includeRootFolder: false
archiveType: 'tar'
archiveFile: '$(Build.ArtifactStagingDirectory)/snobotsim_utility-mac.tar.gz'
replaceExistingArchive: true

- task: PublishBuildArtifacts@1
inputs:
artifactName: 'Mac'

- job: VSIX
pool:
vmImage: 'xcode9-macos10.13'
vmImage: 'vs2017-win2016'

steps:
- task: NodeTool@0
Expand All @@ -88,4 +181,33 @@ jobs:
publishJUnitResults: false
testResultsFiles: '**/TEST-*.xml'
tasks: 'build'
options: '-PjenkinsBuild'

- script: |
npm install
workingDirectory: $(Build.SourcesDirectory)/vscode
displayName: 'npm install'
- script: |
npm run lint
workingDirectory: $(Build.SourcesDirectory)/vscode
displayName: 'npm lint'
- script: |
npm run webpack
workingDirectory: $(Build.SourcesDirectory)/vscode
displayName: 'npm webpack'
- script: |
npm run vscePackage
workingDirectory: $(Build.SourcesDirectory)/vscode
displayName: 'npm package'
- task: CopyFiles@2
inputs:
contents: '**\*.vsix'
targetFolder: $(Build.ArtifactStagingDirectory)

- task: PublishBuildArtifacts@1
inputs:
artifactName: 'VSIX'

109 changes: 109 additions & 0 deletions shared/add_config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@

import * as path from 'path';
import { copyFile, makedir, readFile, writeFile } from './file_utils';

function getGradleRioRegex() {
return /(id\s*?[\"|\']edu\.wpi\.first\.GradleRIO[\"|\'].*?version\s*?[\"|\'].+?[\"|\'])/g;
}

function getDefaultJavaDependenciesRegex() {
return /(\/\/ Defining my dependencies\. In this case, WPILib \(\+ friends\), and vendor libraries\.)/g;
}

function getCleanedJavaDependenciesRegex() {
return /(dependencies \{)/g;
}

async function updateBuildFile(projectFolder: string) {
const buildFile = path.join(projectFolder, 'build.gradle');
const snobotSimPluginText = '\n id "com.snobot.simulator.plugin.SnobotSimulatorPlugin" version "2019-3.0.0" apply false';
// tslint:disable-next-line
const snobotSimJavaApplyPlugin = '//////////////////////////////////\n// SnobotSim\n//////////////////////////////////\napply plugin: com.snobot.simulator.plugin.SnobotSimulatorPlugin\napply from: "snobotsim/snobot_sim.gradle"\n//////////////////////////////////\n\n';
const gradleBuildFile = await readFile(buildFile);
let newgFile = gradleBuildFile.replace(getGradleRioRegex(), `$1${snobotSimPluginText}`);

// tslint:disable-next-line
if (gradleBuildFile.search(getDefaultJavaDependenciesRegex()) !== -1) {
newgFile = newgFile.replace(getDefaultJavaDependenciesRegex(), `${snobotSimJavaApplyPlugin}$1`);
} else {
newgFile = newgFile.replace(getCleanedJavaDependenciesRegex(), `${snobotSimJavaApplyPlugin}$1`);
}

await writeFile(buildFile, newgFile);
}

// tslint:disable-next-line
export async function setupSnobotSimFiles(wpilibConfig: any, basepath: string, projectFolder: string, toFolder: string) {
const useVsCode = (document.getElementById('use_vscode') as HTMLInputElement).checked;
const useEclipse = (document.getElementById('use_eclipse') as HTMLInputElement).checked;
const useIntellij = (document.getElementById('use_intellij') as HTMLInputElement).checked;

const configDir = path.join(projectFolder, 'simulator_config');

await makedir(toFolder);
await makedir(configDir);

// tslint:disable-next-line
const wpilibLanguage = wpilibConfig.currentLanguage as string;

// Get the resource paths to copy
let resourceRoot = path.join(basepath, 'resources');
if (basepath.indexOf('default_app.asar') >= 0) {
resourceRoot = 'resources';
}

// Copy common things
const snobotSimPluginConfig = path.join(resourceRoot, 'shared', 'SnobotSim.json');
const snobotSimGuiConfig = path.join(resourceRoot, 'shared', 'simulator_config.yml');
await copyFile(snobotSimGuiConfig, path.join(configDir, 'simulator_config.yml'));
await copyFile(snobotSimPluginConfig, path.join(toFolder, 'SnobotSim.json'));

if (wpilibLanguage === 'cpp') {
const snobotSimGuiProperties = path.join(resourceRoot, 'cpp', 'simulator_config.properties');
const snobotSimBuildScript = path.join(resourceRoot, 'cpp', 'snobot_sim.gradle');

await copyFile(snobotSimGuiProperties, path.join(configDir, 'simulator_config.properties'));
await copyFile(snobotSimBuildScript, path.join(toFolder, 'snobot_sim.gradle'));
} else if (wpilibLanguage === 'java') {

const snobotSimGuiProperties = path.join(resourceRoot, 'java', 'simulator_config.properties');

const addCustomSimulator = (document.getElementById('enable_custom_sim') as HTMLInputElement).checked;
let snobotSimBuildScript = '';
if (addCustomSimulator) {
snobotSimBuildScript = path.join(resourceRoot, 'java', 'snobot_sim_with_custom.gradle');
const customSimulator = path.join(resourceRoot, 'java', 'custom_robot_simulator.java');
const customSimSrcDr = path.join(projectFolder, 'src', 'custom_simulator', 'java', 'frc', 'robot');
await makedir(customSimSrcDr);
await copyFile(customSimulator, path.join(customSimSrcDr, 'CustomRobotSimulator.java'));

let propertiesFileContents = await readFile(snobotSimGuiProperties);
propertiesFileContents += '\nsimulator_class=frc.robot.CustomRobotSimulator';
await writeFile(path.join(configDir, 'simulator_config.properties'), propertiesFileContents);

} else {
await copyFile(snobotSimGuiProperties, path.join(configDir, 'simulator_config.properties'));
snobotSimBuildScript = path.join(resourceRoot, 'java', 'snobot_sim.gradle');
}

let snobotSimGradleFile = await readFile(snobotSimBuildScript);

if (useEclipse) {
const eclispeConfig = await readFile(path.join(resourceRoot, 'ide_files', 'eclipse', 'snobot_sim_addon.txt'));
snobotSimGradleFile += eclispeConfig;

}

await writeFile(path.join(toFolder, 'snobot_sim.gradle'), snobotSimGradleFile);

if (useVsCode) {
alert('VS Code Not supported yet');
}
if (useIntellij) {
const intellijFiles = path.join(resourceRoot, 'ide_files', 'intellij');
await copyFile(intellijFiles, path.join(projectFolder, '.idea'));
}
}

await updateBuildFile(projectFolder);
}
59 changes: 59 additions & 0 deletions shared/file_utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@

import * as fs from 'fs';
import * as mkdirp from 'mkdirp';
import * as ncp from 'ncp';

export function copyFile(source: string, dest: string): Promise<void> {
return new Promise<void>((resolve, reject) => {
ncp.ncp(source, dest, {}, (err) => {
if (err) {
reject(err);
}
resolve();
});
});
}

export function writeFile(filename: string, contents: string): Promise<void> {
return new Promise<void>((resolve, reject) => {
fs.writeFile(filename, contents, 'utf8', (err) => {
if (err) {
reject(err);
} else {
resolve();
}
});
});
}

export function makedir(directory: string): Promise<void> {
return new Promise<void>((resolve, reject) => {
mkdirp(directory, (err) => {
if (err) {
reject(err);
} else {
resolve();
}
});
});
}

export function readFile(filename: string): Promise<string> {
return new Promise<string>((resolve, reject) => {
fs.readFile(filename, 'utf8', (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
}

export function exists(filename: string): Promise<boolean> {
return new Promise<boolean>((resolve) => {
fs.exists(filename, (e) => {
resolve(e);
});
});
}
32 changes: 32 additions & 0 deletions standalone/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<!DOCTYPE html>
<html>

<head>
<title>SnobotSim Installer</title>
<script>
const exports = require('./out/generate.js');
</script>
</head>

<body>

<br/> Select the folder the project lives in.
<input id="projectFolder" type="text" value="F:/git/FIRST/SnobotSim/temp/TestVsCodeExtension/TestVsCodeExtension" style="width: 100%; margin-top: 10px; margin-bottom: 10px" />

<br/> Set your fully-qualified robot class
<input id="robotName" type="text" value="frc.robot.Robot", style="width: 100%; margin-top: 10px; margin-bottom: 10px" />

<input id="enable_custom_sim" type="checkbox" name="enable_custom_sim">Create custom simulator stubs<br>

<fieldset>
<legend>Enabled IDE configurations:</legend>
<input id="use_vscode" type="checkbox" name="ide_configs" value="vs_code">VS Code<br>
<input id="use_eclipse" type="checkbox" name="ide_configs" value="eclipse" checked>Eclipse<br>
<input id="use_intellij" type="checkbox" name="ide_configs" value="intellij" checked>Intellij<br>
</fieldset>

<button id="generateProject" onclick="exports.generateProjectButtonClick()">Generate Project</button>

</body>

</html>
Loading

0 comments on commit b639187

Please sign in to comment.