1 import { Component, AfterViewChecked, ElementRef, ViewChild, OnInit, Input } from '@angular/core';
2 import { Observable } from 'rxjs';
3 import { FormControl, FormGroup, Validators, FormBuilder } from '@angular/forms';
4 import { CookieService } from 'ngx-cookie';
6 import 'rxjs/add/operator/scan';
7 import 'rxjs/add/operator/startWith';
9 import { XDSServerService, ICmdOutput } from "../../services/xdsserver.service";
10 import { ConfigService, IConfig, IProject } from "../../services/config.service";
11 import { AlertService, IAlert } from "../../services/alert.service";
12 import { SdkService } from "../../services/sdk.service";
15 selector: 'panel-build',
17 templateUrl: './build.component.html',
18 styleUrls: ['./build.component.css']
21 export class BuildComponent implements OnInit, AfterViewChecked {
22 @ViewChild('scrollOutput') private scrollContainer: ElementRef;
24 @Input() curProject: IProject;
27 subpathCtrl = new FormControl("", Validators.required);
28 debugEnable: boolean = false;
30 public cmdOutput: string;
31 public cmdInfo: string;
33 private startTime: Map<string, number> = new Map<string, number>();
35 constructor(private configSvr: ConfigService,
36 private xdsSvr: XDSServerService,
37 private fb: FormBuilder,
38 private alertSvr: AlertService,
39 private sdkSvr: SdkService,
40 private cookie: CookieService,
43 this.cmdInfo = ""; // TODO: to be remove (only for debug)
44 this.buildForm = fb.group({
45 subpath: this.subpathCtrl,
46 cmdClean: ["", Validators.nullValidator],
47 cmdPrebuild: ["", Validators.nullValidator],
48 cmdBuild: ["", Validators.nullValidator],
49 cmdPopulate: ["", Validators.nullValidator],
50 cmdArgs: ["", Validators.nullValidator],
51 envVars: ["", Validators.nullValidator],
56 // Set default settings
57 // TODO save & restore values from cookies
58 this.buildForm.patchValue({
60 cmdClean: "rm -rf build",
61 cmdPrebuild: "mkdir -p build && cd build && cmake ..",
62 cmdBuild: "cd build && make",
63 cmdPopulate: "cd build && make remote-target-populate",
68 // Command output data tunneling
69 this.xdsSvr.CmdOutput$.subscribe(data => {
70 this.cmdOutput += data.stdout + "\n";
74 this.xdsSvr.CmdExit$.subscribe(exit => {
75 if (this.startTime.has(exit.cmdID)) {
76 this.cmdInfo = 'Last command duration: ' + this._computeTime(this.startTime.get(exit.cmdID));
77 this.startTime.delete(exit.cmdID);
80 if (exit && exit.code !== 0) {
81 this.cmdOutput += "--- Command exited with code " + exit.code + " ---\n\n";
85 this._scrollToBottom();
88 this.debugEnable = (this.cookie.get("debug_build") === "1");
91 ngAfterViewChecked() {
92 this._scrollToBottom();
101 this.buildForm.value.cmdClean,
102 this.buildForm.value.subpath,
104 this.buildForm.value.envVars);
109 this.buildForm.value.cmdPrebuild,
110 this.buildForm.value.subpath,
112 this.buildForm.value.envVars);
117 this.buildForm.value.cmdBuild,
118 this.buildForm.value.subpath,
120 this.buildForm.value.envVars
126 this.buildForm.value.cmdPopulate,
127 this.buildForm.value.subpath,
129 this.buildForm.value.envVars
135 this.buildForm.value.cmdArgs,
136 this.buildForm.value.subpath,
138 this.buildForm.value.envVars
142 private _exec(cmd: string, dir: string, args: string[], env: string) {
143 if (!this.curProject) {
144 this.alertSvr.warning('No active project', true);
147 let prjID = this.curProject.id;
149 this.cmdOutput += this._outputHeader();
151 let sdkid = this.sdkSvr.getCurrentId();
153 // Detect key=value in env string to build array of string
155 env.split(';').forEach(v => envArr.push(v.trim()));
157 let t0 = performance.now();
158 this.cmdInfo = 'Start build of ' + prjID + ' at ' + t0;
160 this.xdsSvr.exec(prjID, dir, cmd, sdkid, args, envArr)
162 this.startTime.set(String(res.cmdID), t0);
165 this.cmdInfo = 'Last command duration: ' + this._computeTime(t0);
166 this.alertSvr.error('ERROR: ' + err);
171 if (!this.curProject) {
172 this.alertSvr.warning('No active project', true);
175 let prjID = this.curProject.id;
177 this.cmdOutput += this._outputHeader();
179 let sdkid = this.sdkSvr.getCurrentId();
181 let argsArr = args ? args.split(' ') : this.buildForm.value.cmdArgs.split(' ');
183 // Detect key=value in env string to build array of string
185 this.buildForm.value.envVars.split(';').forEach(v => envArr.push(v.trim()));
187 let t0 = performance.now();
188 this.cmdInfo = 'Start build of ' + prjID + ' at ' + t0;
190 this.xdsSvr.make(prjID, this.buildForm.value.subpath, sdkid, argsArr, envArr)
192 this.startTime.set(String(res.cmdID), t0);
195 this.cmdInfo = 'Last command duration: ' + this._computeTime(t0);
196 this.alertSvr.error('ERROR: ' + err);
200 private _scrollToBottom(): void {
202 this.scrollContainer.nativeElement.scrollTop = this.scrollContainer.nativeElement.scrollHeight;
206 private _computeTime(t0: number, t1?: number): string {
207 let enlap = Math.round((t1 || performance.now()) - t0);
208 if (enlap < 1000.0) {
209 return enlap.toFixed(2) + ' ms';
211 return (enlap / 1000.0).toFixed(3) + ' seconds';
215 private _outputHeader(): string {
216 return "--- " + new Date().toString() + " ---\n";
219 private _outputFooter(): string {