Skip to content

Commit 9bea8e9

Browse files
Add tool path durign deployment, enable code faile comparison for tree style codeFiles
1 parent 77b54bf commit 9bea8e9

File tree

10 files changed

+73
-8
lines changed

10 files changed

+73
-8
lines changed

src/dotnet/APIView/APIViewWeb/Helpers/CodeFileHelpers.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,7 @@ private static void BuildTokensForDiffNodes(CodePanelData codePanelData, CodePan
529529

530530
if (diffTokenRowResult.HasDiff)
531531
{
532+
codePanelData.HasDiff = true;
532533
codePanelData.NodeMetaDataObj[nodeIdHashed].IsNodeWithDiff = true;
533534
var parentNodeIdHashed = codePanelData.NodeMetaDataObj[nodeIdHashed].ParentNodeIdHashed;
534535
while (parentNodeIdHashed != "root" && codePanelData.NodeMetaDataObj.ContainsKey(parentNodeIdHashed))

src/dotnet/APIView/APIViewWeb/LeanModels/ReviewRevisionPageModels.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ public class CodePanelData
124124
[JsonIgnore]
125125
public ConcurrentDictionary<string, CodePanelNodeMetaData> NodeMetaDataObj { get; set; } = new ConcurrentDictionary<string, CodePanelNodeMetaData>();
126126
public ConcurrentDictionary<string, CodePanelNodeMetaData> NodeMetaData => NodeMetaDataObj.Count > 0 ? NodeMetaDataObj : null;
127+
public bool HasDiff { get; set; } = false;
127128
}
128129

129130
public class NavigationTreeNodeData

src/dotnet/APIView/APIViewWeb/Managers/APIRevisionsManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -704,7 +704,7 @@ public async Task<bool> AreAPIRevisionsTheSame(APIRevisionListItemModel revision
704704
{
705705
//This will compare and check if new code file content is same as revision in parameter
706706
var lastRevisionFile = await _codeFileRepository.GetCodeFileAsync(revision, false);
707-
return _codeFileManager.AreAPICodeFilesTheSame(codeFileA: lastRevisionFile, codeFileB: renderedCodeFile);
707+
return await _codeFileManager.AreAPICodeFilesTheSame(codeFileA: lastRevisionFile, codeFileB: renderedCodeFile);
708708
}
709709

710710
/// <summary>

src/dotnet/APIView/APIViewWeb/Managers/CodeFileManager.cs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
using System.Linq;
55
using System.Threading.Tasks;
66
using ApiView;
7+
using APIViewWeb.Helpers;
8+
using APIViewWeb.LeanModels;
79
using APIViewWeb.Managers.Interfaces;
810
using APIViewWeb.Models;
911
using APIViewWeb.Repositories;
@@ -196,11 +198,25 @@ public async Task<APICodeFileModel> CreateReviewCodeFileModel(string apiRevision
196198
/// <param name="codeFileA"></param>
197199
/// <param name="codeFileB"></param>
198200
/// <returns></returns>
199-
public bool AreAPICodeFilesTheSame(RenderedCodeFile codeFileA, RenderedCodeFile codeFileB)
201+
public async Task<bool> AreAPICodeFilesTheSame(RenderedCodeFile codeFileA, RenderedCodeFile codeFileB)
200202
{
201-
var codeFileATextLines = codeFileA.RenderText(false, skipDiff: true);
202-
var codeFileBTextLines = codeFileB.RenderText(false, skipDiff: true);
203-
return codeFileATextLines.SequenceEqual(codeFileBTextLines);
203+
if (LanguageServiceHelpers.UsesTreeStyleParser(codeFileA.CodeFile.Language))
204+
{
205+
var diffTree =CodeFileHelpers.ComputeAPIForestDiff(codeFileA.CodeFile.APIForest, codeFileB.CodeFile.APIForest);
206+
var codePanelRawData = new CodePanelRawData()
207+
{
208+
APIForest = diffTree,
209+
Language = codeFileA.CodeFile.Language
210+
};
211+
var result = await CodeFileHelpers.GenerateCodePanelDataAsync(codePanelRawData);
212+
return result.HasDiff;
213+
}
214+
else
215+
{
216+
var codeFileATextLines = codeFileA.RenderText(false, skipDiff: true);
217+
var codeFileBTextLines = codeFileB.RenderText(false, skipDiff: true);
218+
return codeFileATextLines.SequenceEqual(codeFileBTextLines);
219+
}
204220
}
205221

206222
public bool AreCodeFilesTheSame(CodeFile codeFileA, CodeFile codeFileB)

src/dotnet/APIView/APIViewWeb/Managers/Interfaces/ICodeFileManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public Task<CodeFile> GetCodeFileAsync(string repoName, string buildId, string a
1212
public Task<APICodeFileModel> CreateCodeFileAsync(string apiRevisionId, string originalName, bool runAnalysis, Stream fileStream = null, string language = null);
1313
public Task<CodeFile> CreateCodeFileAsync(string originalName, bool runAnalysis, MemoryStream memoryStream, Stream fileStream = null, string language = null);
1414
public Task<APICodeFileModel> CreateReviewCodeFileModel(string apiRevisionId, MemoryStream memoryStream, CodeFile codeFile);
15-
public bool AreAPICodeFilesTheSame(RenderedCodeFile codeFileA, RenderedCodeFile codeFileB);
15+
public Task<bool> AreAPICodeFilesTheSame(RenderedCodeFile codeFileA, RenderedCodeFile codeFileB);
1616
public bool AreCodeFilesTheSame(CodeFile codeFileA, CodeFile codeFileB);
1717
}
1818
}

src/dotnet/APIView/ClientSPA/src/app/_components/reviews-list/reviews-list.component.html

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,6 @@ <h5 class="card-title">What to Upload</h5>
130130
</div>
131131
<div class="mt-2">
132132
<p-fileUpload
133-
formControlName="selectedFile"
134133
#reviewCreationFileUpload name="selectedFile"
135134
*ngIf="createReviewForm.get('selectedCRLanguage')!.value != undefined && createReviewForm.get('selectedCRLanguage')!.value!.label != 'TypeSpec'"
136135
chooseLabel="Select {{ acceptedFilesForReviewUpload }} File to Upload" [customUpload]="true"
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { TestBed } from '@angular/core/testing';
2+
3+
import { HttpErrorInterceptorService } from '../http-error-interceptor.service';
4+
5+
describe('HttpErrorInterceptorService', () => {
6+
let service: HttpErrorInterceptorService;
7+
8+
beforeEach(() => {
9+
TestBed.configureTestingModule({});
10+
service = TestBed.inject(HttpErrorInterceptorService);
11+
});
12+
13+
it('should be created', () => {
14+
expect(service).toBeTruthy();
15+
});
16+
});
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
2+
import { Injectable } from '@angular/core';
3+
import { catchError, Observable, throwError } from 'rxjs';
4+
5+
@Injectable()
6+
export class HttpErrorInterceptorService implements HttpInterceptor{
7+
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
8+
return next.handle(request)
9+
.pipe(
10+
catchError((error: HttpErrorResponse) => {
11+
let errorMessage = 'Unknown error occurred';
12+
if (error.error instanceof ErrorEvent) {
13+
// Client-side error
14+
errorMessage = `Client Side: ${error.error.message}`;
15+
} else {
16+
// Server-side error
17+
errorMessage = `Server Side: ${error.status}\nMessage: ${error.message}`;
18+
}
19+
// Here you can add more error handling logic, like logging errors or showing a notification to the user
20+
console.error(errorMessage);
21+
return throwError(() => new Error(errorMessage));
22+
})
23+
);
24+
}
25+
}

src/dotnet/APIView/ClientSPA/src/app/app.module.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { NgModule, APP_INITIALIZER, isDevMode } from '@angular/core';
22
import { BrowserModule } from '@angular/platform-browser';
33
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
4-
import { HttpClientModule } from '@angular/common/http';
4+
import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';
55
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
66

77
import { AppRoutingModule } from './app-routing.module';
@@ -27,6 +27,7 @@ import { Observable } from 'rxjs';
2727
import { ConfigService } from './_services/config/config.service';
2828
import { CookieService } from 'ngx-cookie-service';
2929
import { SharedAppModule } from './_modules/shared/shared-app.module';
30+
import { HttpErrorInterceptorService } from './_services/http-error-interceptor/http-error-interceptor.service';
3031

3132
export function initializeApp(configService: ConfigService) {
3233
return (): Observable<any> => {
@@ -72,6 +73,11 @@ export function initializeApp(configService: ConfigService) {
7273
deps: [ConfigService],
7374
multi: true
7475
},
76+
{
77+
provide: HTTP_INTERCEPTORS,
78+
useClass: HttpErrorInterceptorService,
79+
multi: true
80+
},
7581
CookieService
7682
],
7783
bootstrap: [AppComponent]

src/dotnet/APIView/apiview.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,7 @@ extends:
360360
call npm run-script build --prefix D:\home\site\wwwroot --force
361361
echo Installing .NET tool
362362
call dotnet tool install --global --add-source ${{ parameters.AzureSdkForNetDevOpsFeed }} --version ${{ parameters.CSharpAPIParserVersion }} CSharpAPIParser
363+
call setx PATH "%PATH%;%USERPROFILE%\.dotnet\tools"
363364
echo Installing Python tools
364365
call D:\home\site\wwwroot\Python\python -m pip uninstall api-stub-generator
365366
call D:\home\site\wwwroot\Python\python -m pip install pylint==2.13.9 pylint-guidelines-checker==0.0.6 api-stub-generator==0.3.2 --index-url "https://pkgs.dev.azure.com/azure-sdk/public/_packaging/azure-sdk-for-python/pypi/simple/"

0 commit comments

Comments
 (0)