From aba12108f8e612f2b6138ed0ba3efd06236a2a5e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 20 Feb 2024 00:02:45 +0000 Subject: [PATCH] Rebuild pages at 4fec014a05649f26d0c4bb599ac778179dad28ef --- CATcher-org_CATcher_master/authorship.json | 2 +- CATcher-org_CATcher_master/commits.json | 2 +- CATcher-org_WATcher_main/authorship.json | 2 +- CATcher-org_WATcher_main/commits.json | 2 +- archive.zip | Bin 208154 -> 234577 bytes reposense-logs/reposense.log.0 | 1686 ++++++++++---------- reposense_reposense_master/authorship.json | 2 +- reposense_reposense_master/commits.json | 2 +- summary.json | 2 +- 9 files changed, 850 insertions(+), 850 deletions(-) diff --git a/CATcher-org_CATcher_master/authorship.json b/CATcher-org_CATcher_master/authorship.json index 939a08e..c5f4bea 100644 --- a/CATcher-org_CATcher_master/authorship.json +++ b/CATcher-org_CATcher_master/authorship.json @@ -1 +1 @@ -[{"path":"src/app/app-routing.module.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { NgModule } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { RouterModule, Routes } from \u0027@angular/router\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { AuthModule } from \u0027./auth/auth.module\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { AuthGuard } from \u0027./core/guards/auth.guard\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { PhaseBugReportingModule } from \u0027./phase-bug-reporting/phase-bug-reporting.module\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { PhaseModerationModule } from \u0027./phase-moderation/phase-moderation.module\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { PhaseTeamResponseModule } from \u0027./phase-team-response/phase-team-response.module\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { PhaseTesterResponseModule } from \u0027./phase-tester-response/phase-tester-response.module\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"const routes: Routes \u003d ["},{"lineNumber":11,"author":{"gitId":"-"},"content":" { path: \u0027\u0027, loadChildren: () \u003d\u003e AuthModule },"},{"lineNumber":12,"author":{"gitId":"-"},"content":" { path: \u0027phaseBugReporting\u0027, loadChildren: () \u003d\u003e PhaseBugReportingModule, canLoad: [AuthGuard] },"},{"lineNumber":13,"author":{"gitId":"-"},"content":" { path: \u0027phaseTeamResponse\u0027, loadChildren: () \u003d\u003e PhaseTeamResponseModule, canLoad: [AuthGuard] },"},{"lineNumber":14,"author":{"gitId":"-"},"content":" { path: \u0027phaseTesterResponse\u0027, loadChildren: () \u003d\u003e PhaseTesterResponseModule, canLoad: [AuthGuard] },"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" { path: \u0027phaseModeration\u0027, loadChildren: () \u003d\u003e PhaseModerationModule, canLoad: [AuthGuard] },"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" { path: \u0027**\u0027, redirectTo: \u0027\u0027 }"},{"lineNumber":17,"author":{"gitId":"-"},"content":"];"},{"lineNumber":18,"author":{"gitId":"-"},"content":""},{"lineNumber":19,"author":{"gitId":"-"},"content":"@NgModule({"},{"lineNumber":20,"author":{"gitId":"-"},"content":" imports: [RouterModule.forRoot(routes)],"},{"lineNumber":21,"author":{"gitId":"-"},"content":" exports: [RouterModule]"},{"lineNumber":22,"author":{"gitId":"-"},"content":"})"},{"lineNumber":23,"author":{"gitId":"-"},"content":"export class AppRoutingModule {}"}],"authorContributionMap":{"NereusWB922":2,"-":21}},{"path":"src/app/core/directives/internal-link-disable.directive.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { Directive, HostListener } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { ErrorHandlingService } from \u0027../services/error-handling.service\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"class InvalidLinkError extends Error {"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" constructor() {"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" super(\u0027Invalid link!\u0027);"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" Object.setPrototypeOf(this, InvalidLinkError.prototype);"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":"@Directive({"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" selector: \u0027[disableInternalLink]\u0027"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":"})"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":"export class InternalLinkDisableDirective {"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" constructor(private errorHandlingService: ErrorHandlingService) {}"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" @HostListener(\u0027click\u0027, [\u0027$event\u0027])"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" public onClick(e: MouseEvent): void {"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" const srcElement \u003d e.target;"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" if (srcElement instanceof HTMLAnchorElement) {"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" const baseURI \u003d srcElement.baseURI;"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" const href \u003d srcElement.href;"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" if (href.startsWith(baseURI)) {"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" this.errorHandlingService.handleError(new InvalidLinkError());"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" e.preventDefault();"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" e.stopPropagation();"},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":32}},{"path":"src/app/core/services/github.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { HttpErrorResponse } from \u0027@angular/common/http\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Injectable } from \u0027@angular/core\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { ApolloQueryResult } from \u0027@apollo/client/core\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { Apollo, QueryRef } from \u0027apollo-angular\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { DocumentNode } from \u0027graphql\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { forkJoin, from, Observable, of, throwError } from \u0027rxjs\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { catchError, filter, map, mergeMap, throwIfEmpty } from \u0027rxjs/operators\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import {"},{"lineNumber":9,"author":{"gitId":"-"},"content":" FetchIssue,"},{"lineNumber":10,"author":{"gitId":"-"},"content":" FetchIssueQuery,"},{"lineNumber":11,"author":{"gitId":"-"},"content":" FetchIssues,"},{"lineNumber":12,"author":{"gitId":"-"},"content":" FetchIssuesByTeam,"},{"lineNumber":13,"author":{"gitId":"-"},"content":" FetchIssuesByTeamQuery,"},{"lineNumber":14,"author":{"gitId":"-"},"content":" FetchIssuesQuery,"},{"lineNumber":15,"author":{"gitId":"-"},"content":" FetchLabels,"},{"lineNumber":16,"author":{"gitId":"-"},"content":" FetchLabelsQuery"},{"lineNumber":17,"author":{"gitId":"-"},"content":"} from \u0027../../../../graphql/graphql-types\u0027;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import { AppConfig } from \u0027../../../environments/environment\u0027;"},{"lineNumber":19,"author":{"gitId":"nknguyenhc"},"content":"import { throwIfFalse } from \u0027../../shared/lib/custom-ops\u0027;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import { getNumberOfPages } from \u0027../../shared/lib/github-paginator-parser\u0027;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import { IssueComment } from \u0027../models/comment.model\u0027;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import { GithubUser } from \u0027../models/github-user.model\u0027;"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import { IssueLastModifiedManagerModel } from \u0027../models/github/cache-manager/issue-last-modified-manager.model\u0027;"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import { IssuesCacheManager } from \u0027../models/github/cache-manager/issues-cache-manager.model\u0027;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import { GithubComment } from \u0027../models/github/github-comment.model\u0027;"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import { GithubGraphqlIssue } from \u0027../models/github/github-graphql.issue\u0027;"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import RestGithubIssueFilter from \u0027../models/github/github-issue-filter.model\u0027;"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import { GithubIssue } from \u0027../models/github/github-issue.model\u0027;"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import { GithubLabel } from \u0027../models/github/github-label.model\u0027;"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import { GithubResponse } from \u0027../models/github/github-response.model\u0027;"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import { GithubRelease } from \u0027../models/github/github.release\u0027;"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import { SessionData } from \u0027../models/session.model\u0027;"},{"lineNumber":33,"author":{"gitId":"-"},"content":"import { ERRORCODE_NOT_FOUND, ErrorHandlingService } from \u0027./error-handling.service\u0027;"},{"lineNumber":34,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027./logging.service\u0027;"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":"const { Octokit } \u003d require(\u0027@octokit/rest\u0027);"},{"lineNumber":37,"author":{"gitId":"-"},"content":"const CATCHER_ORG \u003d \u0027CATcher-org\u0027;"},{"lineNumber":38,"author":{"gitId":"-"},"content":"const CATCHER_REPO \u003d \u0027CATcher\u0027;"},{"lineNumber":39,"author":{"gitId":"nknguyenhc"},"content":"const BRANCH \u003d \u0027main\u0027;"},{"lineNumber":40,"author":{"gitId":"-"},"content":"const UNABLE_TO_OPEN_IN_BROWSER \u003d \u0027Unable to open this issue in Browser\u0027;"},{"lineNumber":41,"author":{"gitId":"nknguyenhc"},"content":"const BRANCH_CREATION_FAILED \u003d `Unable to create ${BRANCH} branch.`;"},{"lineNumber":42,"author":{"gitId":"-"},"content":"function getSettingsUrl(org: string, repoName: string): string {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" return `https://raw.githubusercontent.com/${org}/${repoName}/master/settings.json`;"},{"lineNumber":44,"author":{"gitId":"-"},"content":"}"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":"let ORG_NAME \u003d \u0027\u0027;"},{"lineNumber":47,"author":{"gitId":"-"},"content":"let MOD_ORG \u003d \u0027\u0027;"},{"lineNumber":48,"author":{"gitId":"-"},"content":"let REPO \u003d \u0027\u0027;"},{"lineNumber":49,"author":{"gitId":"-"},"content":"let DATA_REPO \u003d \u0027\u0027;"},{"lineNumber":50,"author":{"gitId":"-"},"content":"const MAX_ITEMS_PER_PAGE \u003d 100;"},{"lineNumber":51,"author":{"gitId":"-"},"content":""},{"lineNumber":52,"author":{"gitId":"-"},"content":"let octokit \u003d new Octokit();"},{"lineNumber":53,"author":{"gitId":"-"},"content":""},{"lineNumber":54,"author":{"gitId":"-"},"content":"@Injectable({"},{"lineNumber":55,"author":{"gitId":"-"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":56,"author":{"gitId":"-"},"content":"})"},{"lineNumber":57,"author":{"gitId":"-"},"content":""},{"lineNumber":58,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * Responsible for communicating with GitHub to create, update, read and delete"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * features related to Github using GitHub API Requests."},{"lineNumber":61,"author":{"gitId":"-"},"content":" * For example, issues, issue labels and repositories."},{"lineNumber":62,"author":{"gitId":"-"},"content":" */"},{"lineNumber":63,"author":{"gitId":"-"},"content":"export class GithubService {"},{"lineNumber":64,"author":{"gitId":"-"},"content":" private static readonly IF_NONE_MATCH_EMPTY \u003d { \u0027If-None-Match\u0027: \u0027\u0027 };"},{"lineNumber":65,"author":{"gitId":"-"},"content":""},{"lineNumber":66,"author":{"gitId":"-"},"content":" private issuesCacheManager \u003d new IssuesCacheManager();"},{"lineNumber":67,"author":{"gitId":"-"},"content":" private issuesLastModifiedManager \u003d new IssueLastModifiedManagerModel();"},{"lineNumber":68,"author":{"gitId":"-"},"content":" private issueQueryRefs \u003d new Map\u003cNumber, QueryRef\u003cFetchIssueQuery\u003e\u003e();"},{"lineNumber":69,"author":{"gitId":"-"},"content":""},{"lineNumber":70,"author":{"gitId":"-"},"content":" constructor(private errorHandlingService: ErrorHandlingService, private apollo: Apollo, private logger: LoggingService) {}"},{"lineNumber":71,"author":{"gitId":"-"},"content":""},{"lineNumber":72,"author":{"gitId":"-"},"content":" storeOAuthAccessToken(accessToken: string) {"},{"lineNumber":73,"author":{"gitId":"-"},"content":" octokit \u003d new Octokit({"},{"lineNumber":74,"author":{"gitId":"-"},"content":" auth() {"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return `Token ${accessToken}`;"},{"lineNumber":76,"author":{"gitId":"-"},"content":" },"},{"lineNumber":77,"author":{"gitId":"-"},"content":" log: {"},{"lineNumber":78,"author":{"gitId":"-"},"content":" debug: (message, ...otherInfo) \u003d\u003e this.logger.debug(\u0027GithubService: \u0027 + message, ...otherInfo),"},{"lineNumber":79,"author":{"gitId":"-"},"content":" // Do not log info for HTTP response 304 due to repeated polling"},{"lineNumber":80,"author":{"gitId":"-"},"content":" info: (message, ...otherInfo) \u003d\u003e"},{"lineNumber":81,"author":{"gitId":"-"},"content":" /304 in \\d+ms$/.test(message) ? undefined : this.logger.info(\u0027GithubService: \u0027 + message, ...otherInfo),"},{"lineNumber":82,"author":{"gitId":"-"},"content":" warn: (message, ...otherInfo) \u003d\u003e this.logger.warn(\u0027GithubService: \u0027 + message, ...otherInfo),"},{"lineNumber":83,"author":{"gitId":"-"},"content":" error: (message, ...otherInfo) \u003d\u003e this.logger.error(\u0027GithubService: \u0027 + message, ...otherInfo)"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }"},{"lineNumber":85,"author":{"gitId":"-"},"content":" });"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }"},{"lineNumber":87,"author":{"gitId":"-"},"content":""},{"lineNumber":88,"author":{"gitId":"-"},"content":" storeOrganizationDetails(orgName: string, dataRepo: string) {"},{"lineNumber":89,"author":{"gitId":"-"},"content":" MOD_ORG \u003d orgName;"},{"lineNumber":90,"author":{"gitId":"-"},"content":" DATA_REPO \u003d dataRepo;"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }"},{"lineNumber":92,"author":{"gitId":"-"},"content":""},{"lineNumber":93,"author":{"gitId":"-"},"content":" storePhaseDetails(phaseRepoOwner: string, repoName: string) {"},{"lineNumber":94,"author":{"gitId":"-"},"content":" REPO \u003d repoName;"},{"lineNumber":95,"author":{"gitId":"-"},"content":" ORG_NAME \u003d phaseRepoOwner;"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }"},{"lineNumber":97,"author":{"gitId":"-"},"content":""},{"lineNumber":98,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":99,"author":{"gitId":"-"},"content":" * Fetches an array of filtered GitHubIssues using GraphQL query for a given team."},{"lineNumber":100,"author":{"gitId":"-"},"content":" *"},{"lineNumber":101,"author":{"gitId":"-"},"content":" * @param tutorial - The tutorial that the team belongs to."},{"lineNumber":102,"author":{"gitId":"-"},"content":" * @param team - The team\u0027s designated name."},{"lineNumber":103,"author":{"gitId":"-"},"content":" * @param issuesFilter - The issue filter."},{"lineNumber":104,"author":{"gitId":"-"},"content":" * @returns An observable array of filtered GithubIssues"},{"lineNumber":105,"author":{"gitId":"-"},"content":" */"},{"lineNumber":106,"author":{"gitId":"-"},"content":" fetchIssuesGraphqlByTeam(tutorial: string, team: string, issuesFilter: RestGithubIssueFilter): Observable\u003cArray\u003cGithubIssue\u003e\u003e {"},{"lineNumber":107,"author":{"gitId":"-"},"content":" const graphqlFilter \u003d issuesFilter.convertToGraphqlFilter();"},{"lineNumber":108,"author":{"gitId":"-"},"content":" return this.toFetchIssues(issuesFilter).pipe("},{"lineNumber":109,"author":{"gitId":"-"},"content":" filter((toFetch) \u003d\u003e toFetch),"},{"lineNumber":110,"author":{"gitId":"-"},"content":" mergeMap(() \u003d\u003e {"},{"lineNumber":111,"author":{"gitId":"-"},"content":" return this.fetchGraphqlList\u003cFetchIssuesByTeamQuery, GithubGraphqlIssue\u003e("},{"lineNumber":112,"author":{"gitId":"-"},"content":" FetchIssuesByTeam,"},{"lineNumber":113,"author":{"gitId":"-"},"content":" {"},{"lineNumber":114,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":115,"author":{"gitId":"-"},"content":" name: REPO,"},{"lineNumber":116,"author":{"gitId":"-"},"content":" filter: {"},{"lineNumber":117,"author":{"gitId":"-"},"content":" ...graphqlFilter,"},{"lineNumber":118,"author":{"gitId":"-"},"content":" labels: [...(graphqlFilter.labels ? graphqlFilter.labels : []), team]"},{"lineNumber":119,"author":{"gitId":"-"},"content":" },"},{"lineNumber":120,"author":{"gitId":"-"},"content":" tutorial"},{"lineNumber":121,"author":{"gitId":"-"},"content":" },"},{"lineNumber":122,"author":{"gitId":"-"},"content":" (result) \u003d\u003e result.data.repository.label.issues.edges,"},{"lineNumber":123,"author":{"gitId":"-"},"content":" GithubGraphqlIssue"},{"lineNumber":124,"author":{"gitId":"-"},"content":" );"},{"lineNumber":125,"author":{"gitId":"-"},"content":" })"},{"lineNumber":126,"author":{"gitId":"-"},"content":" );"},{"lineNumber":127,"author":{"gitId":"-"},"content":" }"},{"lineNumber":128,"author":{"gitId":"-"},"content":""},{"lineNumber":129,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":130,"author":{"gitId":"-"},"content":" * Fetches an array of filtered GitHubIssues using GraphQL query."},{"lineNumber":131,"author":{"gitId":"-"},"content":" * @param issuesFilter - The issue filter."},{"lineNumber":132,"author":{"gitId":"-"},"content":" * @returns An observable array of filtered GithubIssues"},{"lineNumber":133,"author":{"gitId":"-"},"content":" */"},{"lineNumber":134,"author":{"gitId":"-"},"content":" fetchIssuesGraphql(issuesFilter: RestGithubIssueFilter): Observable\u003cArray\u003cGithubIssue\u003e\u003e {"},{"lineNumber":135,"author":{"gitId":"-"},"content":" const graphqlFilter \u003d issuesFilter.convertToGraphqlFilter();"},{"lineNumber":136,"author":{"gitId":"-"},"content":" return this.toFetchIssues(issuesFilter).pipe("},{"lineNumber":137,"author":{"gitId":"-"},"content":" filter((toFetch) \u003d\u003e toFetch),"},{"lineNumber":138,"author":{"gitId":"-"},"content":" mergeMap(() \u003d\u003e {"},{"lineNumber":139,"author":{"gitId":"-"},"content":" return this.fetchGraphqlList\u003cFetchIssuesQuery, GithubGraphqlIssue\u003e("},{"lineNumber":140,"author":{"gitId":"-"},"content":" FetchIssues,"},{"lineNumber":141,"author":{"gitId":"-"},"content":" { owner: ORG_NAME, name: REPO, filter: graphqlFilter },"},{"lineNumber":142,"author":{"gitId":"-"},"content":" (result) \u003d\u003e result.data.repository.issues.edges,"},{"lineNumber":143,"author":{"gitId":"-"},"content":" GithubGraphqlIssue"},{"lineNumber":144,"author":{"gitId":"-"},"content":" );"},{"lineNumber":145,"author":{"gitId":"-"},"content":" })"},{"lineNumber":146,"author":{"gitId":"-"},"content":" );"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }"},{"lineNumber":148,"author":{"gitId":"-"},"content":""},{"lineNumber":149,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":150,"author":{"gitId":"-"},"content":" * Checks if there are pages of filtered issues that are not cached in the cache model,"},{"lineNumber":151,"author":{"gitId":"-"},"content":" * and updates the model to cache these new pages."},{"lineNumber":152,"author":{"gitId":"-"},"content":" * @param filter - The issue filter."},{"lineNumber":153,"author":{"gitId":"-"},"content":" * @returns Observable\u003cboolean\u003e that returns true if there are pages that do not exist in the cache model."},{"lineNumber":154,"author":{"gitId":"-"},"content":" */"},{"lineNumber":155,"author":{"gitId":"-"},"content":" private toFetchIssues(filter: RestGithubIssueFilter): Observable\u003cboolean\u003e {"},{"lineNumber":156,"author":{"gitId":"-"},"content":" let responseInFirstPage: GithubResponse\u003cGithubIssue[]\u003e;"},{"lineNumber":157,"author":{"gitId":"-"},"content":" return this.getIssuesAPICall(filter, 1).pipe("},{"lineNumber":158,"author":{"gitId":"-"},"content":" map((response: GithubResponse\u003cGithubIssue[]\u003e) \u003d\u003e {"},{"lineNumber":159,"author":{"gitId":"-"},"content":" responseInFirstPage \u003d response;"},{"lineNumber":160,"author":{"gitId":"-"},"content":" return getNumberOfPages(response);"},{"lineNumber":161,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":162,"author":{"gitId":"-"},"content":" mergeMap((numOfPages: number) \u003d\u003e {"},{"lineNumber":163,"author":{"gitId":"-"},"content":" const apiCalls: Observable\u003cGithubResponse\u003cGithubIssue[]\u003e\u003e[] \u003d [];"},{"lineNumber":164,"author":{"gitId":"-"},"content":" for (let i \u003d 2; i \u003c\u003d numOfPages; i++) {"},{"lineNumber":165,"author":{"gitId":"-"},"content":" apiCalls.push(this.getIssuesAPICall(filter, i));"},{"lineNumber":166,"author":{"gitId":"-"},"content":" }"},{"lineNumber":167,"author":{"gitId":"-"},"content":" return apiCalls.length \u003d\u003d\u003d 0 ? of([]) : forkJoin(apiCalls);"},{"lineNumber":168,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":169,"author":{"gitId":"-"},"content":" map((resultArray: GithubResponse\u003cGithubIssue[]\u003e[]) \u003d\u003e {"},{"lineNumber":170,"author":{"gitId":"-"},"content":" const responses \u003d [responseInFirstPage, ...resultArray];"},{"lineNumber":171,"author":{"gitId":"-"},"content":" const isCached \u003d responses.reduce((result, response) \u003d\u003e {"},{"lineNumber":172,"author":{"gitId":"-"},"content":" return result \u0026\u0026 response.isCached;"},{"lineNumber":173,"author":{"gitId":"-"},"content":" }, true);"},{"lineNumber":174,"author":{"gitId":"-"},"content":" responses.forEach((resp, index) \u003d\u003e this.issuesCacheManager.set(index + 1, resp));"},{"lineNumber":175,"author":{"gitId":"-"},"content":" return !isCached;"},{"lineNumber":176,"author":{"gitId":"-"},"content":" })"},{"lineNumber":177,"author":{"gitId":"-"},"content":" );"},{"lineNumber":178,"author":{"gitId":"-"},"content":" }"},{"lineNumber":179,"author":{"gitId":"-"},"content":""},{"lineNumber":180,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":181,"author":{"gitId":"-"},"content":" * Checks if the specified repository exists."},{"lineNumber":182,"author":{"gitId":"-"},"content":" * @param owner - Owner of Specified Repository."},{"lineNumber":183,"author":{"gitId":"-"},"content":" * @param repo - Name of Repository."},{"lineNumber":184,"author":{"gitId":"-"},"content":" */"},{"lineNumber":185,"author":{"gitId":"-"},"content":" isRepositoryPresent(owner: string, repo: string): Observable\u003cboolean\u003e {"},{"lineNumber":186,"author":{"gitId":"-"},"content":" return from(octokit.repos.get({ owner: owner, repo: repo, headers: GithubService.IF_NONE_MATCH_EMPTY })).pipe("},{"lineNumber":187,"author":{"gitId":"-"},"content":" map((rawData: { status: number }) \u003d\u003e {"},{"lineNumber":188,"author":{"gitId":"-"},"content":" return rawData.status !\u003d\u003d ERRORCODE_NOT_FOUND;"},{"lineNumber":189,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":190,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e {"},{"lineNumber":191,"author":{"gitId":"-"},"content":" return of(false);"},{"lineNumber":192,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":193,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(\u0027Failed to fetch repo data.\u0027))"},{"lineNumber":194,"author":{"gitId":"-"},"content":" );"},{"lineNumber":195,"author":{"gitId":"-"},"content":" }"},{"lineNumber":196,"author":{"gitId":"-"},"content":""},{"lineNumber":197,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":198,"author":{"gitId":"-"},"content":" * Creates a repository in for the authenticated user location."},{"lineNumber":199,"author":{"gitId":"-"},"content":" * @param name - Name of Repo to create."},{"lineNumber":200,"author":{"gitId":"-"},"content":" * @return Observable\u003cboolean\u003e - That returns true if the repository has been successfully"},{"lineNumber":201,"author":{"gitId":"-"},"content":" * created."},{"lineNumber":202,"author":{"gitId":"-"},"content":" */"},{"lineNumber":203,"author":{"gitId":"-"},"content":" createRepository(name: string): void {"},{"lineNumber":204,"author":{"gitId":"-"},"content":" octokit.repos.createForAuthenticatedUser({ name: name });"},{"lineNumber":205,"author":{"gitId":"-"},"content":" }"},{"lineNumber":206,"author":{"gitId":"-"},"content":""},{"lineNumber":207,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":208,"author":{"gitId":"nknguyenhc"},"content":" * Creates the `main` branch for the current repository."},{"lineNumber":209,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":210,"author":{"gitId":"nknguyenhc"},"content":" createBranch() {"},{"lineNumber":211,"author":{"gitId":"nknguyenhc"},"content":" return this.getDefaultBranch().pipe("},{"lineNumber":212,"author":{"gitId":"nknguyenhc"},"content":" mergeMap((res) \u003d\u003e this.getBranchHeadInfo(res)),"},{"lineNumber":213,"author":{"gitId":"nknguyenhc"},"content":" map((res) \u003d\u003e res.data.object.sha),"},{"lineNumber":214,"author":{"gitId":"nknguyenhc"},"content":" mergeMap((sha: string) \u003d\u003e this.createBranchFromCommit(sha)),"},{"lineNumber":215,"author":{"gitId":"nknguyenhc"},"content":" mergeMap(() \u003d\u003e this.isMainBranchPresent()),"},{"lineNumber":216,"author":{"gitId":"nknguyenhc"},"content":" throwIfFalse("},{"lineNumber":217,"author":{"gitId":"nknguyenhc"},"content":" (isBranchPresent: boolean) \u003d\u003e isBranchPresent,"},{"lineNumber":218,"author":{"gitId":"nknguyenhc"},"content":" () \u003d\u003e new Error(BRANCH_CREATION_FAILED)"},{"lineNumber":219,"author":{"gitId":"nknguyenhc"},"content":" )"},{"lineNumber":220,"author":{"gitId":"nknguyenhc"},"content":" );"},{"lineNumber":221,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":222,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":223,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":224,"author":{"gitId":"nknguyenhc"},"content":" * Creates the `main` branch for the current repository,"},{"lineNumber":225,"author":{"gitId":"nknguyenhc"},"content":" * from the commit with the given SHA."},{"lineNumber":226,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":227,"author":{"gitId":"nknguyenhc"},"content":" createBranchFromCommit(commitSha: string) {"},{"lineNumber":228,"author":{"gitId":"nknguyenhc"},"content":" return from("},{"lineNumber":229,"author":{"gitId":"nknguyenhc"},"content":" octokit.git.createRef({"},{"lineNumber":230,"author":{"gitId":"nknguyenhc"},"content":" owner: ORG_NAME,"},{"lineNumber":231,"author":{"gitId":"nknguyenhc"},"content":" repo: REPO,"},{"lineNumber":232,"author":{"gitId":"nknguyenhc"},"content":" ref: `refs/heads/${BRANCH}`,"},{"lineNumber":233,"author":{"gitId":"nknguyenhc"},"content":" sha: commitSha"},{"lineNumber":234,"author":{"gitId":"nknguyenhc"},"content":" })"},{"lineNumber":235,"author":{"gitId":"nknguyenhc"},"content":" );"},{"lineNumber":236,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":237,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":238,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":239,"author":{"gitId":"nknguyenhc"},"content":" * Get the default branch of the specified repository."},{"lineNumber":240,"author":{"gitId":"nknguyenhc"},"content":" * @param owner The owner of the repository."},{"lineNumber":241,"author":{"gitId":"nknguyenhc"},"content":" * @param repo The name of the repository."},{"lineNumber":242,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":243,"author":{"gitId":"nknguyenhc"},"content":" getDefaultBranch(): Observable\u003cstring\u003e {"},{"lineNumber":244,"author":{"gitId":"nknguyenhc"},"content":" return from("},{"lineNumber":245,"author":{"gitId":"nknguyenhc"},"content":" octokit.repos.get({"},{"lineNumber":246,"author":{"gitId":"nknguyenhc"},"content":" owner: ORG_NAME,"},{"lineNumber":247,"author":{"gitId":"nknguyenhc"},"content":" repo: REPO"},{"lineNumber":248,"author":{"gitId":"nknguyenhc"},"content":" })"},{"lineNumber":249,"author":{"gitId":"nknguyenhc"},"content":" ).pipe(map((res: any) \u003d\u003e res.data.default_branch));"},{"lineNumber":250,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":251,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":252,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":253,"author":{"gitId":"nknguyenhc"},"content":" * Get information of the head of the given branch name,"},{"lineNumber":254,"author":{"gitId":"nknguyenhc"},"content":" * in the current repository."},{"lineNumber":255,"author":{"gitId":"nknguyenhc"},"content":" * @param branch The name of the branch."},{"lineNumber":256,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":257,"author":{"gitId":"nknguyenhc"},"content":" getBranchHeadInfo(branch: string): Observable\u003cany\u003e {"},{"lineNumber":258,"author":{"gitId":"nknguyenhc"},"content":" return from("},{"lineNumber":259,"author":{"gitId":"nknguyenhc"},"content":" octokit.git.getRef({"},{"lineNumber":260,"author":{"gitId":"nknguyenhc"},"content":" owner: ORG_NAME,"},{"lineNumber":261,"author":{"gitId":"nknguyenhc"},"content":" repo: REPO,"},{"lineNumber":262,"author":{"gitId":"nknguyenhc"},"content":" ref: `heads/${branch}`"},{"lineNumber":263,"author":{"gitId":"nknguyenhc"},"content":" })"},{"lineNumber":264,"author":{"gitId":"nknguyenhc"},"content":" );"},{"lineNumber":265,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":266,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":267,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":268,"author":{"gitId":"nknguyenhc"},"content":" * Checks if the repo already has the branch `main`."},{"lineNumber":269,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":270,"author":{"gitId":"nknguyenhc"},"content":" isMainBranchPresent(): Observable\u003cboolean\u003e {"},{"lineNumber":271,"author":{"gitId":"nknguyenhc"},"content":" return from("},{"lineNumber":272,"author":{"gitId":"nknguyenhc"},"content":" octokit.git.getRef({"},{"lineNumber":273,"author":{"gitId":"nknguyenhc"},"content":" owner: ORG_NAME,"},{"lineNumber":274,"author":{"gitId":"nknguyenhc"},"content":" repo: REPO,"},{"lineNumber":275,"author":{"gitId":"nknguyenhc"},"content":" ref: `heads/${BRANCH}`"},{"lineNumber":276,"author":{"gitId":"nknguyenhc"},"content":" })"},{"lineNumber":277,"author":{"gitId":"nknguyenhc"},"content":" ).pipe("},{"lineNumber":278,"author":{"gitId":"nknguyenhc"},"content":" map((res: any) \u003d\u003e res.status !\u003d\u003d ERRORCODE_NOT_FOUND),"},{"lineNumber":279,"author":{"gitId":"nknguyenhc"},"content":" catchError(() \u003d\u003e {"},{"lineNumber":280,"author":{"gitId":"nknguyenhc"},"content":" return of(false);"},{"lineNumber":281,"author":{"gitId":"nknguyenhc"},"content":" })"},{"lineNumber":282,"author":{"gitId":"nknguyenhc"},"content":" );"},{"lineNumber":283,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":284,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":285,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":286,"author":{"gitId":"-"},"content":" * Fetches information about an issue using GraphQL."},{"lineNumber":287,"author":{"gitId":"-"},"content":" *"},{"lineNumber":288,"author":{"gitId":"-"},"content":" * If the issue is not modified, return a `304 - Not Modified` response."},{"lineNumber":289,"author":{"gitId":"-"},"content":" *"},{"lineNumber":290,"author":{"gitId":"-"},"content":" * @param id - The issue id."},{"lineNumber":291,"author":{"gitId":"-"},"content":" * @returns Observable\u003cGithubGraphqlIssue\u003e that represents the response object."},{"lineNumber":292,"author":{"gitId":"-"},"content":" */"},{"lineNumber":293,"author":{"gitId":"-"},"content":" fetchIssueGraphql(id: number): Observable\u003cGithubGraphqlIssue\u003e {"},{"lineNumber":294,"author":{"gitId":"-"},"content":" if (this.issueQueryRefs.get(id) \u003d\u003d\u003d undefined) {"},{"lineNumber":295,"author":{"gitId":"-"},"content":" const newQueryRef \u003d this.apollo.watchQuery\u003cFetchIssueQuery\u003e({"},{"lineNumber":296,"author":{"gitId":"-"},"content":" query: FetchIssue,"},{"lineNumber":297,"author":{"gitId":"-"},"content":" variables: {"},{"lineNumber":298,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":299,"author":{"gitId":"-"},"content":" name: REPO,"},{"lineNumber":300,"author":{"gitId":"-"},"content":" issueId: id"},{"lineNumber":301,"author":{"gitId":"-"},"content":" }"},{"lineNumber":302,"author":{"gitId":"-"},"content":" });"},{"lineNumber":303,"author":{"gitId":"-"},"content":" this.issueQueryRefs.set(id, newQueryRef);"},{"lineNumber":304,"author":{"gitId":"-"},"content":" }"},{"lineNumber":305,"author":{"gitId":"-"},"content":""},{"lineNumber":306,"author":{"gitId":"-"},"content":" const queryRef \u003d this.issueQueryRefs.get(id);"},{"lineNumber":307,"author":{"gitId":"-"},"content":" return this.toFetchIssue(id).pipe("},{"lineNumber":308,"author":{"gitId":"-"},"content":" filter((toFetch) \u003d\u003e toFetch),"},{"lineNumber":309,"author":{"gitId":"-"},"content":" mergeMap(() \u003d\u003e from(queryRef.refetch())),"},{"lineNumber":310,"author":{"gitId":"-"},"content":" map((value: ApolloQueryResult\u003cFetchIssueQuery\u003e) \u003d\u003e {"},{"lineNumber":311,"author":{"gitId":"-"},"content":" return new GithubGraphqlIssue(value.data.repository.issue);"},{"lineNumber":312,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":313,"author":{"gitId":"-"},"content":" throwIfEmpty(() \u003d\u003e new HttpErrorResponse({ status: 304 }))"},{"lineNumber":314,"author":{"gitId":"-"},"content":" );"},{"lineNumber":315,"author":{"gitId":"-"},"content":" }"},{"lineNumber":316,"author":{"gitId":"-"},"content":""},{"lineNumber":317,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":318,"author":{"gitId":"-"},"content":" * Checks if the issue has been modified since the last query, and"},{"lineNumber":319,"author":{"gitId":"-"},"content":" * updates the model to reflect the last modified time."},{"lineNumber":320,"author":{"gitId":"-"},"content":" *"},{"lineNumber":321,"author":{"gitId":"-"},"content":" * @param id - The issue id."},{"lineNumber":322,"author":{"gitId":"-"},"content":" * @returns Observable\u003cboolean\u003e that returns true if the issue has been modified."},{"lineNumber":323,"author":{"gitId":"-"},"content":" */"},{"lineNumber":324,"author":{"gitId":"-"},"content":" toFetchIssue(id: number): Observable\u003cboolean\u003e {"},{"lineNumber":325,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":326,"author":{"gitId":"-"},"content":" octokit.issues.get({"},{"lineNumber":327,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":328,"author":{"gitId":"-"},"content":" repo: REPO,"},{"lineNumber":329,"author":{"gitId":"-"},"content":" issue_number: id,"},{"lineNumber":330,"author":{"gitId":"-"},"content":" headers: { \u0027If-Modified-Since\u0027: this.issuesLastModifiedManager.get(id) }"},{"lineNumber":331,"author":{"gitId":"-"},"content":" })"},{"lineNumber":332,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":333,"author":{"gitId":"-"},"content":" map((response: GithubResponse\u003cGithubIssue\u003e) \u003d\u003e {"},{"lineNumber":334,"author":{"gitId":"-"},"content":" this.issuesLastModifiedManager.set(id, response.headers[\u0027last-modified\u0027]);"},{"lineNumber":335,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":336,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":337,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(\u0027Failed to fetch issue.\u0027))"},{"lineNumber":338,"author":{"gitId":"-"},"content":" );"},{"lineNumber":339,"author":{"gitId":"-"},"content":" }"},{"lineNumber":340,"author":{"gitId":"-"},"content":""},{"lineNumber":341,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":342,"author":{"gitId":"-"},"content":" * Fetches all labels in the current repository."},{"lineNumber":343,"author":{"gitId":"-"},"content":" */"},{"lineNumber":344,"author":{"gitId":"-"},"content":" fetchAllLabels(): Observable\u003cArray\u003cGithubLabel\u003e\u003e {"},{"lineNumber":345,"author":{"gitId":"-"},"content":" const githubLabels \u003d this.fetchGraphqlList\u003cFetchLabelsQuery, GithubLabel\u003e("},{"lineNumber":346,"author":{"gitId":"-"},"content":" FetchLabels,"},{"lineNumber":347,"author":{"gitId":"-"},"content":" { owner: ORG_NAME, name: REPO },"},{"lineNumber":348,"author":{"gitId":"-"},"content":" (result) \u003d\u003e result.data.repository.labels.edges,"},{"lineNumber":349,"author":{"gitId":"-"},"content":" GithubLabel"},{"lineNumber":350,"author":{"gitId":"-"},"content":" );"},{"lineNumber":351,"author":{"gitId":"-"},"content":""},{"lineNumber":352,"author":{"gitId":"-"},"content":" return githubLabels.pipe(catchError((err) \u003d\u003e throwError(\u0027Failed to fetch labels.\u0027)));"},{"lineNumber":353,"author":{"gitId":"-"},"content":" }"},{"lineNumber":354,"author":{"gitId":"-"},"content":""},{"lineNumber":355,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":356,"author":{"gitId":"-"},"content":" * Creates a label in the current repository."},{"lineNumber":357,"author":{"gitId":"-"},"content":" * @param formattedLabelName - name of new label."},{"lineNumber":358,"author":{"gitId":"-"},"content":" * @param labelColor - colour of new label."},{"lineNumber":359,"author":{"gitId":"-"},"content":" */"},{"lineNumber":360,"author":{"gitId":"-"},"content":" createLabel(formattedLabelName: string, labelColor: string): void {"},{"lineNumber":361,"author":{"gitId":"-"},"content":" octokit.issues.createLabel({ owner: ORG_NAME, repo: REPO, name: formattedLabelName, color: labelColor });"},{"lineNumber":362,"author":{"gitId":"-"},"content":" }"},{"lineNumber":363,"author":{"gitId":"-"},"content":""},{"lineNumber":364,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":365,"author":{"gitId":"-"},"content":" * Updates a label\u0027s information in the current repository."},{"lineNumber":366,"author":{"gitId":"-"},"content":" * @param labelName - name of existing label"},{"lineNumber":367,"author":{"gitId":"-"},"content":" * @param labelColor - new color to be assigned to existing label."},{"lineNumber":368,"author":{"gitId":"-"},"content":" */"},{"lineNumber":369,"author":{"gitId":"-"},"content":" updateLabel(labelName: string, labelColor: string): void {"},{"lineNumber":370,"author":{"gitId":"-"},"content":" octokit.issues.updateLabel({ owner: ORG_NAME, repo: REPO, name: labelName, current_name: labelName, color: labelColor });"},{"lineNumber":371,"author":{"gitId":"-"},"content":" }"},{"lineNumber":372,"author":{"gitId":"-"},"content":""},{"lineNumber":373,"author":{"gitId":"-"},"content":" closeIssue(id: number): Observable\u003cGithubIssue\u003e {"},{"lineNumber":374,"author":{"gitId":"-"},"content":" return from(octokit.issues.update({ owner: ORG_NAME, repo: REPO, issue_number: id, state: \u0027closed\u0027 })).pipe("},{"lineNumber":375,"author":{"gitId":"-"},"content":" map((response: GithubResponse\u003cGithubIssue\u003e) \u003d\u003e {"},{"lineNumber":376,"author":{"gitId":"-"},"content":" this.issuesLastModifiedManager.set(id, response.headers[\u0027last-modified\u0027]);"},{"lineNumber":377,"author":{"gitId":"-"},"content":" return new GithubIssue(response.data);"},{"lineNumber":378,"author":{"gitId":"-"},"content":" })"},{"lineNumber":379,"author":{"gitId":"-"},"content":" );"},{"lineNumber":380,"author":{"gitId":"-"},"content":" }"},{"lineNumber":381,"author":{"gitId":"-"},"content":""},{"lineNumber":382,"author":{"gitId":"-"},"content":" reopenIssue(id: number): Observable\u003cGithubIssue\u003e {"},{"lineNumber":383,"author":{"gitId":"-"},"content":" return from(octokit.issues.update({ owner: ORG_NAME, repo: REPO, issue_number: id, state: \u0027open\u0027 })).pipe("},{"lineNumber":384,"author":{"gitId":"-"},"content":" map((response: GithubResponse\u003cGithubIssue\u003e) \u003d\u003e {"},{"lineNumber":385,"author":{"gitId":"-"},"content":" this.issuesLastModifiedManager.set(id, response.headers[\u0027last-modified\u0027]);"},{"lineNumber":386,"author":{"gitId":"-"},"content":" return new GithubIssue(response.data);"},{"lineNumber":387,"author":{"gitId":"-"},"content":" })"},{"lineNumber":388,"author":{"gitId":"-"},"content":" );"},{"lineNumber":389,"author":{"gitId":"-"},"content":" }"},{"lineNumber":390,"author":{"gitId":"-"},"content":""},{"lineNumber":391,"author":{"gitId":"-"},"content":" createIssue(title: string, description: string, labels: string[]): Observable\u003cGithubIssue\u003e {"},{"lineNumber":392,"author":{"gitId":"-"},"content":" return from(octokit.issues.create({ owner: ORG_NAME, repo: REPO, title: title, body: description, labels: labels })).pipe("},{"lineNumber":393,"author":{"gitId":"-"},"content":" map((response: GithubResponse\u003cGithubIssue\u003e) \u003d\u003e {"},{"lineNumber":394,"author":{"gitId":"-"},"content":" return new GithubIssue(response.data);"},{"lineNumber":395,"author":{"gitId":"-"},"content":" })"},{"lineNumber":396,"author":{"gitId":"-"},"content":" );"},{"lineNumber":397,"author":{"gitId":"-"},"content":" }"},{"lineNumber":398,"author":{"gitId":"-"},"content":""},{"lineNumber":399,"author":{"gitId":"-"},"content":" createIssueComment(issueId: number, description: string): Observable\u003cGithubComment\u003e {"},{"lineNumber":400,"author":{"gitId":"-"},"content":" return from(octokit.issues.createComment({ owner: ORG_NAME, repo: REPO, issue_number: issueId, body: description })).pipe("},{"lineNumber":401,"author":{"gitId":"-"},"content":" map((response: GithubResponse\u003cGithubComment\u003e) \u003d\u003e {"},{"lineNumber":402,"author":{"gitId":"-"},"content":" return response.data;"},{"lineNumber":403,"author":{"gitId":"-"},"content":" })"},{"lineNumber":404,"author":{"gitId":"-"},"content":" );"},{"lineNumber":405,"author":{"gitId":"-"},"content":" }"},{"lineNumber":406,"author":{"gitId":"-"},"content":""},{"lineNumber":407,"author":{"gitId":"-"},"content":" updateIssue(id: number, title: string, description: string, labels: string[], assignees?: string[]): Observable\u003cGithubIssue\u003e {"},{"lineNumber":408,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":409,"author":{"gitId":"-"},"content":" octokit.issues.update({"},{"lineNumber":410,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":411,"author":{"gitId":"-"},"content":" repo: REPO,"},{"lineNumber":412,"author":{"gitId":"-"},"content":" issue_number: id,"},{"lineNumber":413,"author":{"gitId":"-"},"content":" title: title,"},{"lineNumber":414,"author":{"gitId":"-"},"content":" body: description,"},{"lineNumber":415,"author":{"gitId":"-"},"content":" labels: labels,"},{"lineNumber":416,"author":{"gitId":"-"},"content":" assignees: assignees"},{"lineNumber":417,"author":{"gitId":"-"},"content":" })"},{"lineNumber":418,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":419,"author":{"gitId":"-"},"content":" map((response: GithubResponse\u003cGithubIssue\u003e) \u003d\u003e {"},{"lineNumber":420,"author":{"gitId":"-"},"content":" this.issuesLastModifiedManager.set(id, response.headers[\u0027last-modified\u0027]);"},{"lineNumber":421,"author":{"gitId":"-"},"content":" return new GithubIssue(response.data);"},{"lineNumber":422,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":423,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e {"},{"lineNumber":424,"author":{"gitId":"-"},"content":" return throwError(err);"},{"lineNumber":425,"author":{"gitId":"-"},"content":" })"},{"lineNumber":426,"author":{"gitId":"-"},"content":" );"},{"lineNumber":427,"author":{"gitId":"-"},"content":" }"},{"lineNumber":428,"author":{"gitId":"-"},"content":""},{"lineNumber":429,"author":{"gitId":"-"},"content":" updateIssueComment(issueComment: IssueComment): Observable\u003cGithubComment\u003e {"},{"lineNumber":430,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":431,"author":{"gitId":"-"},"content":" octokit.issues.updateComment({ owner: ORG_NAME, repo: REPO, comment_id: issueComment.id, body: issueComment.description })"},{"lineNumber":432,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":433,"author":{"gitId":"-"},"content":" map((response: GithubResponse\u003cGithubComment\u003e) \u003d\u003e {"},{"lineNumber":434,"author":{"gitId":"-"},"content":" return response.data;"},{"lineNumber":435,"author":{"gitId":"-"},"content":" })"},{"lineNumber":436,"author":{"gitId":"-"},"content":" );"},{"lineNumber":437,"author":{"gitId":"-"},"content":" }"},{"lineNumber":438,"author":{"gitId":"-"},"content":""},{"lineNumber":439,"author":{"gitId":"-"},"content":" uploadFile(filename: string, base64String: string): Observable\u003cany\u003e {"},{"lineNumber":440,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":441,"author":{"gitId":"-"},"content":" octokit.repos.createOrUpdateFile({"},{"lineNumber":442,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":443,"author":{"gitId":"-"},"content":" repo: REPO,"},{"lineNumber":444,"author":{"gitId":"nknguyenhc"},"content":" branch: BRANCH,"},{"lineNumber":445,"author":{"gitId":"-"},"content":" path: `files/${filename}`,"},{"lineNumber":446,"author":{"gitId":"-"},"content":" message: \u0027upload file\u0027,"},{"lineNumber":447,"author":{"gitId":"-"},"content":" content: base64String"},{"lineNumber":448,"author":{"gitId":"-"},"content":" })"},{"lineNumber":449,"author":{"gitId":"-"},"content":" );"},{"lineNumber":450,"author":{"gitId":"-"},"content":" }"},{"lineNumber":451,"author":{"gitId":"-"},"content":""},{"lineNumber":452,"author":{"gitId":"-"},"content":" fetchEventsForRepo(): Observable\u003cany[]\u003e {"},{"lineNumber":453,"author":{"gitId":"-"},"content":" return from(octokit.issues.listEventsForRepo({ owner: ORG_NAME, repo: REPO, headers: GithubService.IF_NONE_MATCH_EMPTY })).pipe("},{"lineNumber":454,"author":{"gitId":"-"},"content":" map((response) \u003d\u003e {"},{"lineNumber":455,"author":{"gitId":"-"},"content":" return response[\u0027data\u0027];"},{"lineNumber":456,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":457,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(\u0027Failed to fetch events for repo.\u0027))"},{"lineNumber":458,"author":{"gitId":"-"},"content":" );"},{"lineNumber":459,"author":{"gitId":"-"},"content":" }"},{"lineNumber":460,"author":{"gitId":"-"},"content":""},{"lineNumber":461,"author":{"gitId":"-"},"content":" fetchDataFile(): Observable\u003c{}\u003e {"},{"lineNumber":462,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":463,"author":{"gitId":"-"},"content":" octokit.repos.getContents({ owner: MOD_ORG, repo: DATA_REPO, path: \u0027data.csv\u0027, headers: GithubService.IF_NONE_MATCH_EMPTY })"},{"lineNumber":464,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":465,"author":{"gitId":"-"},"content":" map((rawData) \u003d\u003e {"},{"lineNumber":466,"author":{"gitId":"-"},"content":" return { data: atob(rawData[\u0027data\u0027][\u0027content\u0027]) };"},{"lineNumber":467,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":468,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(\u0027Failed to fetch data file.\u0027))"},{"lineNumber":469,"author":{"gitId":"-"},"content":" );"},{"lineNumber":470,"author":{"gitId":"-"},"content":" }"},{"lineNumber":471,"author":{"gitId":"-"},"content":""},{"lineNumber":472,"author":{"gitId":"-"},"content":" fetchLatestRelease(): Observable\u003cGithubRelease\u003e {"},{"lineNumber":473,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":474,"author":{"gitId":"-"},"content":" octokit.repos.getLatestRelease({ owner: CATCHER_ORG, repo: CATCHER_REPO, headers: GithubService.IF_NONE_MATCH_EMPTY })"},{"lineNumber":475,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":476,"author":{"gitId":"-"},"content":" map((res) \u003d\u003e res[\u0027data\u0027]),"},{"lineNumber":477,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(\u0027Failed to fetch latest release.\u0027))"},{"lineNumber":478,"author":{"gitId":"-"},"content":" );"},{"lineNumber":479,"author":{"gitId":"-"},"content":" }"},{"lineNumber":480,"author":{"gitId":"-"},"content":""},{"lineNumber":481,"author":{"gitId":"-"},"content":" private fetchSettingsFromRawUrl(): Observable\u003cSessionData\u003e {"},{"lineNumber":482,"author":{"gitId":"-"},"content":" return from(fetch(getSettingsUrl(MOD_ORG, DATA_REPO))).pipe("},{"lineNumber":483,"author":{"gitId":"-"},"content":" mergeMap((res) \u003d\u003e res.json()),"},{"lineNumber":484,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(\u0027Failed to fetch settings file.\u0027))"},{"lineNumber":485,"author":{"gitId":"-"},"content":" );"},{"lineNumber":486,"author":{"gitId":"-"},"content":" }"},{"lineNumber":487,"author":{"gitId":"-"},"content":""},{"lineNumber":488,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":489,"author":{"gitId":"-"},"content":" * Fetches the data file that is regulates session information."},{"lineNumber":490,"author":{"gitId":"-"},"content":" * @return Observable\u003cSessionData\u003e representing session information."},{"lineNumber":491,"author":{"gitId":"-"},"content":" */"},{"lineNumber":492,"author":{"gitId":"-"},"content":" fetchSettingsFile(): Observable\u003cSessionData\u003e {"},{"lineNumber":493,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":494,"author":{"gitId":"-"},"content":" octokit.repos.getContents({ owner: MOD_ORG, repo: DATA_REPO, path: \u0027settings.json\u0027, headers: GithubService.IF_NONE_MATCH_EMPTY })"},{"lineNumber":495,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":496,"author":{"gitId":"-"},"content":" map((rawData) \u003d\u003e JSON.parse(atob(rawData[\u0027data\u0027][\u0027content\u0027]))),"},{"lineNumber":497,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e {"},{"lineNumber":498,"author":{"gitId":"-"},"content":" this.logger.error("},{"lineNumber":499,"author":{"gitId":"-"},"content":" \u0027GithubService: Failed to fetch settings file via REST API. Trying to fetch using raw.githubusercontent.com: \u0027,"},{"lineNumber":500,"author":{"gitId":"-"},"content":" err"},{"lineNumber":501,"author":{"gitId":"-"},"content":" );"},{"lineNumber":502,"author":{"gitId":"-"},"content":" return this.fetchSettingsFromRawUrl();"},{"lineNumber":503,"author":{"gitId":"-"},"content":" })"},{"lineNumber":504,"author":{"gitId":"-"},"content":" );"},{"lineNumber":505,"author":{"gitId":"-"},"content":" }"},{"lineNumber":506,"author":{"gitId":"-"},"content":""},{"lineNumber":507,"author":{"gitId":"-"},"content":" fetchAuthenticatedUser(): Observable\u003cGithubUser\u003e {"},{"lineNumber":508,"author":{"gitId":"-"},"content":" return from(octokit.users.getAuthenticated()).pipe("},{"lineNumber":509,"author":{"gitId":"-"},"content":" map((response) \u003d\u003e {"},{"lineNumber":510,"author":{"gitId":"-"},"content":" return response[\u0027data\u0027];"},{"lineNumber":511,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":512,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(\u0027Failed to fetch authenticated user.\u0027))"},{"lineNumber":513,"author":{"gitId":"-"},"content":" );"},{"lineNumber":514,"author":{"gitId":"-"},"content":" }"},{"lineNumber":515,"author":{"gitId":"-"},"content":""},{"lineNumber":516,"author":{"gitId":"-"},"content":" getRepoURL(): string {"},{"lineNumber":517,"author":{"gitId":"-"},"content":" return ORG_NAME.concat(\u0027/\u0027).concat(REPO);"},{"lineNumber":518,"author":{"gitId":"-"},"content":" }"},{"lineNumber":519,"author":{"gitId":"-"},"content":""},{"lineNumber":520,"author":{"gitId":"-"},"content":" viewIssueInBrowser(id: number, event: Event) {"},{"lineNumber":521,"author":{"gitId":"-"},"content":" if (id) {"},{"lineNumber":522,"author":{"gitId":"-"},"content":" window.open(\u0027https://github.com/\u0027.concat(this.getRepoURL()).concat(\u0027/issues/\u0027).concat(String(id)));"},{"lineNumber":523,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":524,"author":{"gitId":"-"},"content":" this.errorHandlingService.handleError(new Error(UNABLE_TO_OPEN_IN_BROWSER));"},{"lineNumber":525,"author":{"gitId":"-"},"content":" }"},{"lineNumber":526,"author":{"gitId":"-"},"content":" event.stopPropagation();"},{"lineNumber":527,"author":{"gitId":"-"},"content":" }"},{"lineNumber":528,"author":{"gitId":"-"},"content":""},{"lineNumber":529,"author":{"gitId":"-"},"content":" reset(): void {"},{"lineNumber":530,"author":{"gitId":"-"},"content":" this.logger.info(`GithubService: Resetting issues cache`);"},{"lineNumber":531,"author":{"gitId":"-"},"content":" this.issuesCacheManager.clear();"},{"lineNumber":532,"author":{"gitId":"-"},"content":" this.issuesLastModifiedManager.clear();"},{"lineNumber":533,"author":{"gitId":"-"},"content":" this.issueQueryRefs.clear();"},{"lineNumber":534,"author":{"gitId":"-"},"content":" }"},{"lineNumber":535,"author":{"gitId":"-"},"content":""},{"lineNumber":536,"author":{"gitId":"-"},"content":" getProfilesData(): Promise\u003cResponse\u003e {"},{"lineNumber":537,"author":{"gitId":"-"},"content":" return fetch(AppConfig.clientDataUrl);"},{"lineNumber":538,"author":{"gitId":"-"},"content":" }"},{"lineNumber":539,"author":{"gitId":"-"},"content":""},{"lineNumber":540,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":541,"author":{"gitId":"-"},"content":" * Performs an API call to fetch a page of filtered issues with a given pageNumber."},{"lineNumber":542,"author":{"gitId":"-"},"content":" *"},{"lineNumber":543,"author":{"gitId":"-"},"content":" * The request is sent with the ETag of the latest cached HTTP response."},{"lineNumber":544,"author":{"gitId":"-"},"content":" * If page requested has the same ETag, or the request results in an error,"},{"lineNumber":545,"author":{"gitId":"-"},"content":" * then the cached page is returned instead."},{"lineNumber":546,"author":{"gitId":"-"},"content":" *"},{"lineNumber":547,"author":{"gitId":"-"},"content":" * @param filter - The issue filter"},{"lineNumber":548,"author":{"gitId":"-"},"content":" * @param pageNumber - The page to be fetched"},{"lineNumber":549,"author":{"gitId":"-"},"content":" * @returns An observable representing the response containing a single page of filtered issues"},{"lineNumber":550,"author":{"gitId":"-"},"content":" */"},{"lineNumber":551,"author":{"gitId":"-"},"content":" private getIssuesAPICall(filter: RestGithubIssueFilter, pageNumber: number): Observable\u003cGithubResponse\u003cGithubIssue[]\u003e\u003e {"},{"lineNumber":552,"author":{"gitId":"-"},"content":" const apiCall: Promise\u003cGithubResponse\u003cGithubIssue[]\u003e\u003e \u003d octokit.issues.listForRepo({"},{"lineNumber":553,"author":{"gitId":"-"},"content":" ...filter,"},{"lineNumber":554,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":555,"author":{"gitId":"-"},"content":" repo: REPO,"},{"lineNumber":556,"author":{"gitId":"-"},"content":" sort: \u0027created\u0027,"},{"lineNumber":557,"author":{"gitId":"-"},"content":" direction: \u0027desc\u0027,"},{"lineNumber":558,"author":{"gitId":"-"},"content":" per_page: MAX_ITEMS_PER_PAGE,"},{"lineNumber":559,"author":{"gitId":"-"},"content":" page: pageNumber,"},{"lineNumber":560,"author":{"gitId":"-"},"content":" headers: { \u0027If-None-Match\u0027: this.issuesCacheManager.getEtagFor(pageNumber) }"},{"lineNumber":561,"author":{"gitId":"-"},"content":" });"},{"lineNumber":562,"author":{"gitId":"-"},"content":" const apiCall$ \u003d from(apiCall);"},{"lineNumber":563,"author":{"gitId":"-"},"content":" return apiCall$.pipe("},{"lineNumber":564,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e {"},{"lineNumber":565,"author":{"gitId":"-"},"content":" return of(this.issuesCacheManager.get(pageNumber));"},{"lineNumber":566,"author":{"gitId":"-"},"content":" })"},{"lineNumber":567,"author":{"gitId":"-"},"content":" );"},{"lineNumber":568,"author":{"gitId":"-"},"content":" }"},{"lineNumber":569,"author":{"gitId":"-"},"content":""},{"lineNumber":570,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":571,"author":{"gitId":"-"},"content":" * Fetches a list of items using a GraphQL query that queries for paginated data."},{"lineNumber":572,"author":{"gitId":"-"},"content":" *"},{"lineNumber":573,"author":{"gitId":"-"},"content":" * @param query - The GraphQL query that queries for paginated data."},{"lineNumber":574,"author":{"gitId":"-"},"content":" * @param variables - Additional variables for the GraphQL query."},{"lineNumber":575,"author":{"gitId":"-"},"content":" * @callback pluckEdges A function that returns a list of edges in a ApolloQueryResult."},{"lineNumber":576,"author":{"gitId":"-"},"content":" * @callback Model Constructor for the item model."},{"lineNumber":577,"author":{"gitId":"-"},"content":" * @returns A list of items from the query."},{"lineNumber":578,"author":{"gitId":"-"},"content":" */"},{"lineNumber":579,"author":{"gitId":"-"},"content":" private fetchGraphqlList\u003cT, M\u003e("},{"lineNumber":580,"author":{"gitId":"-"},"content":" query: DocumentNode,"},{"lineNumber":581,"author":{"gitId":"-"},"content":" variables: {},"},{"lineNumber":582,"author":{"gitId":"-"},"content":" pluckEdges: (results: ApolloQueryResult\u003cT\u003e) \u003d\u003e Array\u003cany\u003e,"},{"lineNumber":583,"author":{"gitId":"-"},"content":" Model: new (data) \u003d\u003e M"},{"lineNumber":584,"author":{"gitId":"-"},"content":" ): Observable\u003cArray\u003cM\u003e\u003e {"},{"lineNumber":585,"author":{"gitId":"-"},"content":" return from(this.withPagination\u003cT\u003e(pluckEdges)(query, variables)).pipe("},{"lineNumber":586,"author":{"gitId":"-"},"content":" map((results: Array\u003cApolloQueryResult\u003cT\u003e\u003e) \u003d\u003e {"},{"lineNumber":587,"author":{"gitId":"-"},"content":" const issues \u003d results.reduce((accumulated, current) \u003d\u003e accumulated.concat(pluckEdges(current)), []);"},{"lineNumber":588,"author":{"gitId":"-"},"content":" return issues.map((issue) \u003d\u003e new Model(issue.node));"},{"lineNumber":589,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":590,"author":{"gitId":"-"},"content":" throwIfEmpty(() \u003d\u003e {"},{"lineNumber":591,"author":{"gitId":"-"},"content":" return new HttpErrorResponse({ status: 304 });"},{"lineNumber":592,"author":{"gitId":"-"},"content":" })"},{"lineNumber":593,"author":{"gitId":"-"},"content":" );"},{"lineNumber":594,"author":{"gitId":"-"},"content":" }"},{"lineNumber":595,"author":{"gitId":"-"},"content":""},{"lineNumber":596,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":597,"author":{"gitId":"-"},"content":" * Returns an async function that will accept a GraphQL query that requests for paginated items."},{"lineNumber":598,"author":{"gitId":"-"},"content":" * Said function will recursively query for all subsequent pages until a page that has less than 100 items is found,"},{"lineNumber":599,"author":{"gitId":"-"},"content":" * then return all queried pages in an array."},{"lineNumber":600,"author":{"gitId":"-"},"content":" *"},{"lineNumber":601,"author":{"gitId":"-"},"content":" * @callback pluckEdges - A function that returns a list of edges in a ApolloQueryResult."},{"lineNumber":602,"author":{"gitId":"-"},"content":" * @returns an async function that accepts a GraphQL query for paginated data and any additional variables to that query"},{"lineNumber":603,"author":{"gitId":"-"},"content":" */"},{"lineNumber":604,"author":{"gitId":"-"},"content":" private withPagination\u003cT\u003e(pluckEdges: (results: ApolloQueryResult\u003cT\u003e) \u003d\u003e Array\u003cany\u003e) {"},{"lineNumber":605,"author":{"gitId":"-"},"content":" return async (query: DocumentNode, variables: { [key: string]: any } \u003d {}): Promise\u003cArray\u003cApolloQueryResult\u003cT\u003e\u003e\u003e \u003d\u003e {"},{"lineNumber":606,"author":{"gitId":"-"},"content":" const cursor \u003d variables.cursor || null;"},{"lineNumber":607,"author":{"gitId":"-"},"content":" const graphqlQuery \u003d this.apollo.watchQuery\u003cT\u003e({ query, variables: { ...variables, cursor } });"},{"lineNumber":608,"author":{"gitId":"-"},"content":" return graphqlQuery.refetch().then(async (results: ApolloQueryResult\u003cT\u003e) \u003d\u003e {"},{"lineNumber":609,"author":{"gitId":"-"},"content":" const intermediate \u003d Array.isArray(results) ? results : [results];"},{"lineNumber":610,"author":{"gitId":"-"},"content":" const edges \u003d pluckEdges(results);"},{"lineNumber":611,"author":{"gitId":"-"},"content":" const nextCursor \u003d edges.length \u003d\u003d\u003d 0 ? null : edges[edges.length - 1].cursor;"},{"lineNumber":612,"author":{"gitId":"-"},"content":""},{"lineNumber":613,"author":{"gitId":"-"},"content":" if (edges.length \u003c MAX_ITEMS_PER_PAGE || !nextCursor) {"},{"lineNumber":614,"author":{"gitId":"-"},"content":" return intermediate;"},{"lineNumber":615,"author":{"gitId":"-"},"content":" }"},{"lineNumber":616,"author":{"gitId":"-"},"content":" const nextResults \u003d await this.withPagination\u003cT\u003e(pluckEdges)(query, {"},{"lineNumber":617,"author":{"gitId":"-"},"content":" ...variables,"},{"lineNumber":618,"author":{"gitId":"-"},"content":" cursor: nextCursor"},{"lineNumber":619,"author":{"gitId":"-"},"content":" });"},{"lineNumber":620,"author":{"gitId":"-"},"content":" return intermediate.concat(nextResults);"},{"lineNumber":621,"author":{"gitId":"-"},"content":" });"},{"lineNumber":622,"author":{"gitId":"-"},"content":" };"},{"lineNumber":623,"author":{"gitId":"-"},"content":" }"},{"lineNumber":624,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":82,"-":542}},{"path":"src/app/core/services/upload.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Injectable } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"nknguyenhc"},"content":"import { of, throwError } from \u0027rxjs\u0027;"},{"lineNumber":3,"author":{"gitId":"nknguyenhc"},"content":"import { catchError, mergeMap } from \u0027rxjs/operators\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { uuid } from \u0027../../shared/lib/uuid\u0027;"},{"lineNumber":5,"author":{"gitId":"nknguyenhc"},"content":"import { ERRORCODE_NOT_FOUND } from \u0027./error-handling.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027./github.service\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":"const SUPPORTED_VIDEO_FILE_TYPES \u003d [\u0027mp4\u0027, \u0027mov\u0027];"},{"lineNumber":9,"author":{"gitId":"-"},"content":"export const SUPPORTED_FILE_TYPES \u003d ["},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u0027gif\u0027,"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u0027jpeg\u0027,"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u0027jpg\u0027,"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u0027png\u0027,"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u0027docx\u0027,"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u0027gz\u0027,"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u0027log\u0027,"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u0027pdf\u0027,"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u0027pptx\u0027,"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u0027txt\u0027,"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u0027xlsx\u0027,"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u0027zip\u0027,"},{"lineNumber":22,"author":{"gitId":"-"},"content":" ...SUPPORTED_VIDEO_FILE_TYPES"},{"lineNumber":23,"author":{"gitId":"-"},"content":"];"},{"lineNumber":24,"author":{"gitId":"-"},"content":"export const FILE_TYPE_SUPPORT_ERROR \u003d \"We don\u0027t support that file type.\" + \u0027 Try again with \u0027 + SUPPORTED_FILE_TYPES.join(\u0027, \u0027) + \u0027.\u0027;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Returns an error message string for when file exceeds the defined size limit"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * @param fileType Canonical name for file, not to be confused with file extension"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * @param size Number of MBs"},{"lineNumber":29,"author":{"gitId":"-"},"content":" */"},{"lineNumber":30,"author":{"gitId":"-"},"content":"export const getSizeExceedErrorMsg \u003d (fileType: string, size: number): string \u003d\u003e `Oops, ${fileType} is too big. Keep it under ${size}MiB.`;"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":"@Injectable({"},{"lineNumber":33,"author":{"gitId":"-"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":34,"author":{"gitId":"-"},"content":"})"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Responsible for upload of media files to the current phase\u0027s repository."},{"lineNumber":38,"author":{"gitId":"-"},"content":" */"},{"lineNumber":39,"author":{"gitId":"-"},"content":"export class UploadService {"},{"lineNumber":40,"author":{"gitId":"-"},"content":" constructor(private githubService: GithubService) {}"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":" uploadFile(base64File: string | ArrayBuffer, userFilename: string) {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" let base64String: string;"},{"lineNumber":44,"author":{"gitId":"-"},"content":" if (base64File instanceof ArrayBuffer) {"},{"lineNumber":45,"author":{"gitId":"-"},"content":" base64String \u003d String.fromCharCode.apply(null, new Uint16Array(base64File));"},{"lineNumber":46,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":47,"author":{"gitId":"-"},"content":" base64String \u003d base64File;"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }"},{"lineNumber":49,"author":{"gitId":"-"},"content":" const fileType \u003d this.getFileExtension(userFilename);"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"-"},"content":" if (SUPPORTED_FILE_TYPES.includes(fileType.toLowerCase())) {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" base64String \u003d base64String.split(\u0027,\u0027)[1];"},{"lineNumber":53,"author":{"gitId":"-"},"content":" const onlineFilename \u003d uuid();"},{"lineNumber":54,"author":{"gitId":"nknguyenhc"},"content":" const attemptUploadFile \u003d () \u003d\u003e this.githubService.uploadFile(`${onlineFilename}.${fileType}`, base64String);"},{"lineNumber":55,"author":{"gitId":"nknguyenhc"},"content":" return attemptUploadFile().pipe("},{"lineNumber":56,"author":{"gitId":"nknguyenhc"},"content":" catchError((err: any) \u003d\u003e {"},{"lineNumber":57,"author":{"gitId":"nknguyenhc"},"content":" if (!(err.status \u003d\u003d\u003d ERRORCODE_NOT_FOUND)) {"},{"lineNumber":58,"author":{"gitId":"nknguyenhc"},"content":" return throwError(err);"},{"lineNumber":59,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":60,"author":{"gitId":"nknguyenhc"},"content":" return of(false);"},{"lineNumber":61,"author":{"gitId":"nknguyenhc"},"content":" }),"},{"lineNumber":62,"author":{"gitId":"nknguyenhc"},"content":" mergeMap((isBranchPresent) \u003d\u003e {"},{"lineNumber":63,"author":{"gitId":"nknguyenhc"},"content":" if (isBranchPresent) {"},{"lineNumber":64,"author":{"gitId":"nknguyenhc"},"content":" return of(isBranchPresent);"},{"lineNumber":65,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":66,"author":{"gitId":"nknguyenhc"},"content":" return this.githubService.createBranch().pipe(mergeMap(attemptUploadFile));"},{"lineNumber":67,"author":{"gitId":"nknguyenhc"},"content":" })"},{"lineNumber":68,"author":{"gitId":"nknguyenhc"},"content":" );"},{"lineNumber":69,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return throwError(FILE_TYPE_SUPPORT_ERROR);"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }"},{"lineNumber":73,"author":{"gitId":"-"},"content":""},{"lineNumber":74,"author":{"gitId":"-"},"content":" getFileExtension(fileName: string): string {"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return fileName.split(\u0027.\u0027).pop();"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }"},{"lineNumber":77,"author":{"gitId":"-"},"content":""},{"lineNumber":78,"author":{"gitId":"-"},"content":" isVideoFile(fileName): boolean {"},{"lineNumber":79,"author":{"gitId":"-"},"content":" const fileType \u003d this.getFileExtension(fileName);"},{"lineNumber":80,"author":{"gitId":"-"},"content":" return SUPPORTED_VIDEO_FILE_TYPES.includes(fileType.toLowerCase());"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }"},{"lineNumber":82,"author":{"gitId":"-"},"content":""},{"lineNumber":83,"author":{"gitId":"-"},"content":" isSupportedFileType(fileName): boolean {"},{"lineNumber":84,"author":{"gitId":"-"},"content":" const fileType \u003d this.getFileExtension(fileName);"},{"lineNumber":85,"author":{"gitId":"-"},"content":" return SUPPORTED_FILE_TYPES.includes(fileType.toLowerCase());"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }"},{"lineNumber":87,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":18,"-":69}},{"path":"src/app/core/validators/noWhitespace.validator.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"MadLamprey"},"content":"import { AbstractControl, ValidationErrors, ValidatorFn } from \u0027@angular/forms\u0027;"},{"lineNumber":2,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":3,"author":{"gitId":"MadLamprey"},"content":"export function noWhitespace(): ValidatorFn {"},{"lineNumber":4,"author":{"gitId":"MadLamprey"},"content":" return (title: AbstractControl): ValidationErrors | null \u003d\u003e {"},{"lineNumber":5,"author":{"gitId":"MadLamprey"},"content":" if (title.value \u0026\u0026 title.value.trim() \u003d\u003d\u003d \u0027\u0027) {"},{"lineNumber":6,"author":{"gitId":"MadLamprey"},"content":" return { whitespace: true };"},{"lineNumber":7,"author":{"gitId":"MadLamprey"},"content":" }"},{"lineNumber":8,"author":{"gitId":"MadLamprey"},"content":" return null;"},{"lineNumber":9,"author":{"gitId":"MadLamprey"},"content":" };"},{"lineNumber":10,"author":{"gitId":"MadLamprey"},"content":"}"}],"authorContributionMap":{"MadLamprey":10}},{"path":"src/app/phase-bug-reporting/new-issue/new-issue.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003ch1 class\u003d\"mat-display-1 title\"\u003eNew Issue\u003c/h1\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003cform [formGroup]\u003d\"newIssueForm\" #myForm\u003d\"ngForm\" (ngSubmit)\u003d\"submitNewIssue(myForm)\"\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"form\"\u003e"},{"lineNumber":5,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"row\"\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"column left\"\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003cmat-form-field\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cinput id\u003d\"title\" formControlName\u003d\"title\" matInput placeholder\u003d\"Title\" required maxlength\u003d\"256\" /\u003e"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cmat-error *ngIf\u003d\"title.errors \u0026\u0026 title.errors[\u0027required\u0027] \u0026\u0026 (title.touched || title.dirty)\"\u003e Title required. \u003c/mat-error\u003e"},{"lineNumber":10,"author":{"gitId":"MadLamprey"},"content":" \u003cmat-error *ngIf\u003d\"title.errors \u0026\u0026 title.errors[\u0027whitespace\u0027]\"\u003e Title cannot contain only whitespaces. \u003c/mat-error\u003e"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cmat-error *ngIf\u003d\"title.errors \u0026\u0026 title.errors[\u0027maxlength\u0027]\"\u003e Title cannot exceed 256 characters. \u003c/mat-error\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cmat-hint *ngIf\u003d\"title.value?.length \u003e\u003d 206\"\u003e {{ 256 - title.value?.length }} characters remaining. \u003c/mat-hint\u003e"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":""},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cdiv style\u003d\"margin: 10px 0 10px 0\"\u003e"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003capp-comment-editor"},{"lineNumber":17,"author":{"gitId":"-"},"content":" [id]\u003d\"\u0027description\u0027\""},{"lineNumber":18,"author":{"gitId":"-"},"content":" [commentField]\u003d\"description\""},{"lineNumber":19,"author":{"gitId":"-"},"content":" [commentForm]\u003d\"this.newIssueForm\""},{"lineNumber":20,"author":{"gitId":"-"},"content":" [(isFormPending)]\u003d\"this.isFormPending\""},{"lineNumber":21,"author":{"gitId":"-"},"content":" [(submitButtonText)]\u003d\"this.submitButtonText\""},{"lineNumber":22,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003c/app-comment-editor\u003e"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":27,"author":{"gitId":"-"},"content":" style\u003d\"float: right\""},{"lineNumber":28,"author":{"gitId":"-"},"content":" class\u003d\"submit-new-bug-report\""},{"lineNumber":29,"author":{"gitId":"-"},"content":" type\u003d\"submit\""},{"lineNumber":30,"author":{"gitId":"-"},"content":" mat-stroked-button"},{"lineNumber":31,"author":{"gitId":"-"},"content":" color\u003d\"primary\""},{"lineNumber":32,"author":{"gitId":"-"},"content":" [disabled]\u003d\"!newIssueForm.valid || isFormPending\""},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":34,"author":{"gitId":"-"},"content":" {{ this.submitButtonText }}"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":36,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"column right\"\u003e"},{"lineNumber":39,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"severity-dropdown\"\u003e"},{"lineNumber":40,"author":{"gitId":"-"},"content":" \u003capp-label-dropdown initialValue\u003d\"\" attributeName\u003d\"severity\" [dropdownForm]\u003d\"newIssueForm\"\u003e\u003c/app-label-dropdown\u003e"},{"lineNumber":41,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":42,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"bug-dropdown\"\u003e"},{"lineNumber":43,"author":{"gitId":"-"},"content":" \u003capp-label-dropdown initialValue\u003d\"\" attributeName\u003d\"type\" [dropdownForm]\u003d\"newIssueForm\"\u003e\u003c/app-label-dropdown\u003e"},{"lineNumber":44,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":46,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":47,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":48,"author":{"gitId":"-"},"content":"\u003c/form\u003e"}],"authorContributionMap":{"MadLamprey":1,"-":47}},{"path":"src/app/phase-bug-reporting/new-issue/new-issue.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Component, OnInit } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { AbstractControl, FormBuilder, FormGroup, NgForm, Validators } from \u0027@angular/forms\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { Router } from \u0027@angular/router\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { finalize } from \u0027rxjs/operators\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../core/models/issue.model\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { ErrorHandlingService } from \u0027../../core/services/error-handling.service\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027../../core/services/issue.service\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { LabelService } from \u0027../../core/services/label.service\u0027;"},{"lineNumber":9,"author":{"gitId":"MadLamprey"},"content":"import { noWhitespace } from \u0027../../core/validators/noWhitespace.validator\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import { SUBMIT_BUTTON_TEXT } from \u0027../../shared/view-issue/view-issue.component\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":13,"author":{"gitId":"-"},"content":" selector: \u0027app-new-issue\u0027,"},{"lineNumber":14,"author":{"gitId":"-"},"content":" templateUrl: \u0027./new-issue.component.html\u0027,"},{"lineNumber":15,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./new-issue.component.css\u0027]"},{"lineNumber":16,"author":{"gitId":"-"},"content":"})"},{"lineNumber":17,"author":{"gitId":"-"},"content":"export class NewIssueComponent implements OnInit {"},{"lineNumber":18,"author":{"gitId":"-"},"content":" newIssueForm: FormGroup;"},{"lineNumber":19,"author":{"gitId":"-"},"content":" isFormPending \u003d false;"},{"lineNumber":20,"author":{"gitId":"-"},"content":" submitButtonText: string;"},{"lineNumber":21,"author":{"gitId":"-"},"content":""},{"lineNumber":22,"author":{"gitId":"-"},"content":" constructor("},{"lineNumber":23,"author":{"gitId":"-"},"content":" private issueService: IssueService,"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private formBuilder: FormBuilder,"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private errorHandlingService: ErrorHandlingService,"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public labelService: LabelService,"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private router: Router"},{"lineNumber":28,"author":{"gitId":"-"},"content":" ) {}"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":31,"author":{"gitId":"-"},"content":" this.newIssueForm \u003d this.formBuilder.group({"},{"lineNumber":32,"author":{"gitId":"MadLamprey"},"content":" title: [\u0027\u0027, [Validators.required, Validators.maxLength(256), noWhitespace()]],"},{"lineNumber":33,"author":{"gitId":"-"},"content":" description: [\u0027\u0027],"},{"lineNumber":34,"author":{"gitId":"-"},"content":" severity: [\u0027\u0027, Validators.required],"},{"lineNumber":35,"author":{"gitId":"-"},"content":" type: [\u0027\u0027, Validators.required]"},{"lineNumber":36,"author":{"gitId":"-"},"content":" });"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":" this.submitButtonText \u003d SUBMIT_BUTTON_TEXT.SUBMIT;"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" submitNewIssue(form: NgForm) {"},{"lineNumber":42,"author":{"gitId":"-"},"content":" if (this.newIssueForm.invalid) {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }"},{"lineNumber":45,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":" this.isFormPending \u003d true;"},{"lineNumber":47,"author":{"gitId":"-"},"content":" this.issueService"},{"lineNumber":48,"author":{"gitId":"-"},"content":" .createIssue(this.title.value, Issue.updateDescription(this.description.value), this.severity.value, this.type.value)"},{"lineNumber":49,"author":{"gitId":"-"},"content":" .pipe(finalize(() \u003d\u003e (this.isFormPending \u003d false)))"},{"lineNumber":50,"author":{"gitId":"-"},"content":" .subscribe("},{"lineNumber":51,"author":{"gitId":"-"},"content":" (newIssue) \u003d\u003e {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" this.issueService.updateLocalStore(newIssue);"},{"lineNumber":53,"author":{"gitId":"-"},"content":" this.router.navigateByUrl(`phaseBugReporting/issues/${newIssue.id}`);"},{"lineNumber":54,"author":{"gitId":"-"},"content":" form.resetForm();"},{"lineNumber":55,"author":{"gitId":"-"},"content":" },"},{"lineNumber":56,"author":{"gitId":"-"},"content":" (error) \u003d\u003e {"},{"lineNumber":57,"author":{"gitId":"-"},"content":" this.errorHandlingService.handleError(error);"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }"},{"lineNumber":59,"author":{"gitId":"-"},"content":" );"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }"},{"lineNumber":61,"author":{"gitId":"-"},"content":""},{"lineNumber":62,"author":{"gitId":"-"},"content":" canDeactivate() {"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return ("},{"lineNumber":64,"author":{"gitId":"-"},"content":" !this.isAttributeEditing(this.title) \u0026\u0026"},{"lineNumber":65,"author":{"gitId":"-"},"content":" !this.isAttributeEditing(this.description) \u0026\u0026"},{"lineNumber":66,"author":{"gitId":"-"},"content":" !this.isAttributeEditing(this.severity) \u0026\u0026"},{"lineNumber":67,"author":{"gitId":"-"},"content":" !this.isAttributeEditing(this.type)"},{"lineNumber":68,"author":{"gitId":"-"},"content":" );"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }"},{"lineNumber":70,"author":{"gitId":"-"},"content":""},{"lineNumber":71,"author":{"gitId":"-"},"content":" isAttributeEditing(attribute: AbstractControl) {"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return attribute.value !\u003d\u003d null \u0026\u0026 attribute.value !\u003d\u003d \u0027\u0027;"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }"},{"lineNumber":74,"author":{"gitId":"-"},"content":""},{"lineNumber":75,"author":{"gitId":"-"},"content":" get title() {"},{"lineNumber":76,"author":{"gitId":"-"},"content":" return this.newIssueForm.get(\u0027title\u0027);"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }"},{"lineNumber":78,"author":{"gitId":"-"},"content":""},{"lineNumber":79,"author":{"gitId":"-"},"content":" get description() {"},{"lineNumber":80,"author":{"gitId":"-"},"content":" return this.newIssueForm.get(\u0027description\u0027);"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }"},{"lineNumber":82,"author":{"gitId":"-"},"content":""},{"lineNumber":83,"author":{"gitId":"-"},"content":" get severity() {"},{"lineNumber":84,"author":{"gitId":"-"},"content":" return this.newIssueForm.get(\u0027severity\u0027);"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }"},{"lineNumber":86,"author":{"gitId":"-"},"content":""},{"lineNumber":87,"author":{"gitId":"-"},"content":" get type() {"},{"lineNumber":88,"author":{"gitId":"-"},"content":" return this.newIssueForm.get(\u0027type\u0027);"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }"},{"lineNumber":90,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"MadLamprey":3,"-":87}},{"path":"src/app/shared/comment-editor/comment-editor.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cform [formGroup]\u003d\"commentForm\" style\u003d\"min-height: 350px\"\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003cmat-tab-group class\u003d\"mat-elevation-z1\" animationDuration\u003d\"0ms\" (selectedTabChange)\u003d\"commentField.setValue(commentTextArea.value)\"\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \u003cmat-tab label\u003d\"Write\"\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":" \u003cdiv"},{"lineNumber":5,"author":{"gitId":"-"},"content":" #dropArea"},{"lineNumber":6,"author":{"gitId":"-"},"content":" class\u003d\"tab-content\""},{"lineNumber":7,"author":{"gitId":"-"},"content":" (dragleave)\u003d\"onDragExit($event)\""},{"lineNumber":8,"author":{"gitId":"-"},"content":" (dragenter)\u003d\"onDragEnter($event)\""},{"lineNumber":9,"author":{"gitId":"-"},"content":" (drop)\u003d\"onDrop($event)\""},{"lineNumber":10,"author":{"gitId":"-"},"content":" (dragover)\u003d\"enableFileDrop($event)\""},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003capp-markdown-toolbar [forTextAreaId]\u003d\"this.id\"\u003e\u003c/app-markdown-toolbar\u003e"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003cmat-form-field appearance\u003d\"outline\" style\u003d\"width: 100%\"\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cmat-label\u003e\u003c/mat-label\u003e"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003ctextarea"},{"lineNumber":16,"author":{"gitId":"-"},"content":" (paste)\u003d\"onPaste($event)\""},{"lineNumber":17,"author":{"gitId":"-"},"content":" (keydown)\u003d\"onKeyPress($event)\""},{"lineNumber":18,"author":{"gitId":"-"},"content":" (beforeinput)\u003d\"handleBeforeInputChange($event)\""},{"lineNumber":19,"author":{"gitId":"-"},"content":" (input)\u003d\"handleInputChange($event)\""},{"lineNumber":20,"author":{"gitId":"-"},"content":" #commentTextArea"},{"lineNumber":21,"author":{"gitId":"-"},"content":" (dragover)\u003d\"disableCaretMovement($event)\""},{"lineNumber":22,"author":{"gitId":"-"},"content":" id\u003d\"{{ this.id }}\""},{"lineNumber":23,"author":{"gitId":"-"},"content":" formControlName\u003d\"{{ this.id }}\""},{"lineNumber":24,"author":{"gitId":"-"},"content":" matInput"},{"lineNumber":25,"author":{"gitId":"-"},"content":" cdkTextareaAutosize"},{"lineNumber":26,"author":{"gitId":"-"},"content":" #autosize\u003d\"cdkTextareaAutosize\""},{"lineNumber":27,"author":{"gitId":"-"},"content":" cdkAutosizeMinRows\u003d\"10\""},{"lineNumber":28,"author":{"gitId":"-"},"content":" cdkAutosizeMaxRows\u003d\"20\""},{"lineNumber":29,"author":{"gitId":"-"},"content":" class\u003d\"text-input-area\""},{"lineNumber":30,"author":{"gitId":"-"},"content":" placeholder\u003d\"{{ this.placeholderText }}\""},{"lineNumber":31,"author":{"gitId":"-"},"content":" maxlength\u003d\"{{ this.maxLength }}\""},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003e\u003c/textarea\u003e"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u003cmat-error *ngIf\u003d\"commentField.errors \u0026\u0026 commentField.errors[\u0027required\u0027] \u0026\u0026 commentField.touched\"\u003e"},{"lineNumber":34,"author":{"gitId":"-"},"content":" Description required."},{"lineNumber":35,"author":{"gitId":"-"},"content":" \u003c/mat-error\u003e"},{"lineNumber":36,"author":{"gitId":"-"},"content":" \u003cmat-error *ngIf\u003d\"commentField.errors \u0026\u0026 commentField.errors[\u0027maxLength\u0027]\"\u003e"},{"lineNumber":37,"author":{"gitId":"-"},"content":" Description cannot exceed {{ maxLength }} characters."},{"lineNumber":38,"author":{"gitId":"-"},"content":" \u003c/mat-error\u003e"},{"lineNumber":39,"author":{"gitId":"-"},"content":" \u003cmat-hint *ngIf\u003d\"commentField.value?.length \u003e\u003d maxLength - 50\"\u003e"},{"lineNumber":40,"author":{"gitId":"-"},"content":" {{ maxLength - commentField.value?.length }} character(s) remaining."},{"lineNumber":41,"author":{"gitId":"-"},"content":" \u003c/mat-hint\u003e"},{"lineNumber":42,"author":{"gitId":"-"},"content":""},{"lineNumber":43,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"drag-and-drop\"\u003e"},{"lineNumber":44,"author":{"gitId":"-"},"content":" \u003cspan *ngIf\u003d\"!isInErrorState\"\u003e Attach files by dragging \u0026 dropping or select them by clicking here. \u003c/span\u003e"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \u003cspan *ngIf\u003d\"isInErrorState\" class\u003d\"error\"\u003e {{ uploadErrorMessage }} \u003c/span\u003e"},{"lineNumber":46,"author":{"gitId":"-"},"content":" \u003cinput"},{"lineNumber":47,"author":{"gitId":"-"},"content":" #fileInput"},{"lineNumber":48,"author":{"gitId":"-"},"content":" [disabled]\u003d\"this.commentField.disabled\""},{"lineNumber":49,"author":{"gitId":"-"},"content":" [accept]\u003d\"SUPPORTED_FILE_TYPES\""},{"lineNumber":50,"author":{"gitId":"-"},"content":" type\u003d\"file\""},{"lineNumber":51,"author":{"gitId":"-"},"content":" class\u003d\"file\""},{"lineNumber":52,"author":{"gitId":"-"},"content":" (change)\u003d\"onFileInputUpload($event, fileInput)\""},{"lineNumber":53,"author":{"gitId":"-"},"content":" /\u003e"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003c/mat-tab\u003e"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003cmat-tab label\u003d\"Preview\"\u003e"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"tab-content\" style\u003d\"min-height: 228px\"\u003e"},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":" \u003cmarkdown #markdownArea *ngIf\u003d\"commentField.value !\u003d\u003d \u0027\u0027\" [data]\u003d\"sanitize(commentField.value)\" disableInternalLink\u003e\u003c/markdown\u003e"},{"lineNumber":61,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"commentField.value \u003d\u003d\u003d \u0027\u0027\"\u003eNothing to preview.\u003c/div\u003e"},{"lineNumber":62,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003c/mat-tab\u003e"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u003c/mat-tab-group\u003e"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003c/form\u003e"}],"authorContributionMap":{"NereusWB922":1,"-":64}},{"path":"src/app/shared/issue/description/description.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003ch3 class\u003d\"mat-title\"\u003e{{ descriptionTitle }}\u003c/h3\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":"\u003cform [formGroup]\u003d\"issueDescriptionForm\" #myForm\u003d\"ngForm\" (ngSubmit)\u003d\"updateDescription(myForm)\"\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"timeline-comment\"\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"timeline-header\"\u003e"},{"lineNumber":5,"author":{"gitId":"-"},"content":" \u003cspan\u003e \u003cstrong\u003e Tester \u003c/strong\u003e posted on {{ issue.created_at }}. \u003c/span\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cbutton style\u003d\"float: right\" mat-button *ngIf\u003d\"permissions.isIssueDescriptionEditable() \u0026\u0026 !isEditing\" (click)\u003d\"changeToEditMode()\"\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":" Edit"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"!isEditing\" class\u003d\"comment\"\u003e"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" \u003cmarkdown [data]\u003d\"issue.description\" disableInternalLink\u003e\u003c/markdown\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"isEditing\"\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003capp-comment-editor"},{"lineNumber":15,"author":{"gitId":"-"},"content":" [id]\u003d\"\u0027description\u0027\""},{"lineNumber":16,"author":{"gitId":"-"},"content":" [commentField]\u003d\"this.issueDescriptionForm.get(\u0027description\u0027)\""},{"lineNumber":17,"author":{"gitId":"-"},"content":" [commentForm]\u003d\"this.issueDescriptionForm\""},{"lineNumber":18,"author":{"gitId":"-"},"content":" [(isFormPending)]\u003d\"this.isSavePending\""},{"lineNumber":19,"author":{"gitId":"-"},"content":" [(submitButtonText)]\u003d\"this.submitButtonText\""},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003c/app-comment-editor\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"editor-actions\"\u003e"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":24,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":25,"author":{"gitId":"-"},"content":" *ngIf\u003d\"conflict\""},{"lineNumber":26,"author":{"gitId":"-"},"content":" type\u003d\"button\""},{"lineNumber":27,"author":{"gitId":"-"},"content":" [disabled]\u003d\"isSavePending\""},{"lineNumber":28,"author":{"gitId":"-"},"content":" mat-raised-button"},{"lineNumber":29,"author":{"gitId":"-"},"content":" color\u003d\"primary\""},{"lineNumber":30,"author":{"gitId":"-"},"content":" (click)\u003d\"viewChanges()\""},{"lineNumber":31,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":32,"author":{"gitId":"-"},"content":" View Updated Description"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":35,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":36,"author":{"gitId":"-"},"content":" type\u003d\"button\""},{"lineNumber":37,"author":{"gitId":"-"},"content":" [disabled]\u003d\"isSavePending\""},{"lineNumber":38,"author":{"gitId":"-"},"content":" mat-stroked-button"},{"lineNumber":39,"author":{"gitId":"-"},"content":" color\u003d\"warn\""},{"lineNumber":40,"author":{"gitId":"-"},"content":" (click)\u003d\"openCancelDialogIfModified()\""},{"lineNumber":41,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":42,"author":{"gitId":"-"},"content":" Cancel"},{"lineNumber":43,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":44,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":45,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":46,"author":{"gitId":"-"},"content":" *ngIf\u003d\"conflict\""},{"lineNumber":47,"author":{"gitId":"-"},"content":" type\u003d\"submit\""},{"lineNumber":48,"author":{"gitId":"-"},"content":" [disabled]\u003d\"issueDescriptionForm.invalid || isSavePending\""},{"lineNumber":49,"author":{"gitId":"-"},"content":" mat-raised-button"},{"lineNumber":50,"author":{"gitId":"-"},"content":" color\u003d\"warn\""},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":52,"author":{"gitId":"-"},"content":" {{ submitButtonText }}"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":55,"author":{"gitId":"-"},"content":" class\u003d\"editor-action additional-editor-style\""},{"lineNumber":56,"author":{"gitId":"-"},"content":" *ngIf\u003d\"!conflict\""},{"lineNumber":57,"author":{"gitId":"-"},"content":" type\u003d\"submit\""},{"lineNumber":58,"author":{"gitId":"-"},"content":" [disabled]\u003d\"issueDescriptionForm.invalid || isSavePending\""},{"lineNumber":59,"author":{"gitId":"-"},"content":" mat-stroked-button"},{"lineNumber":60,"author":{"gitId":"-"},"content":" color\u003d\"primary\""},{"lineNumber":61,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":62,"author":{"gitId":"-"},"content":" \u003cmat-button-content\u003e"},{"lineNumber":63,"author":{"gitId":"-"},"content":" {{ submitButtonText }}"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u003cng-container #loadingSpinnerContainer\u003e\u003c/ng-container\u003e"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003c/mat-button-content\u003e"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":67,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":68,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":69,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":70,"author":{"gitId":"-"},"content":"\u003c/form\u003e"}],"authorContributionMap":{"NereusWB922":1,"-":69}},{"path":"src/app/shared/issue/duplicatedIssues/duplicated-issues.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cdiv\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003cspan class\u003d\"mat-title\"\u003e Duplicated Issues \u003c/span\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \u003cmat-chip-list\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":" \u003cmat-chip"},{"lineNumber":5,"author":{"gitId":"-"},"content":" *ngFor\u003d\"let duplicatedIssue of duplicatedIssues | async\""},{"lineNumber":6,"author":{"gitId":"-"},"content":" style\u003d\"cursor: pointer\""},{"lineNumber":7,"author":{"gitId":"-"},"content":" [matTooltip]\u003d\"duplicatedIssue.title\""},{"lineNumber":8,"author":{"gitId":"-"},"content":" matTooltipPosition\u003d\"above\""},{"lineNumber":9,"author":{"gitId":"-"},"content":" (removed)\u003d\"removeDuplicateStatus(duplicatedIssue)\""},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":11,"author":{"gitId":"nknguyenhc"},"content":" \u003ca class\u003d\"no-underline link-grey-dark\" [routerLink]\u003d\"[\u0027../\u0027 + duplicatedIssue.id]\"\u003e #{{ duplicatedIssue.id }} \u003c/a\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cmat-icon *ngIf\u003d\"permissions.isTeamResponseEditable() || permissions.isTutorResponseEditable()\" matChipRemove\u003ecancel\u003c/mat-icon\u003e"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/mat-chip\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003c/mat-chip-list\u003e"},{"lineNumber":15,"author":{"gitId":"-"},"content":"\u003c/div\u003e"}],"authorContributionMap":{"nknguyenhc":1,"-":14}},{"path":"src/app/shared/lib/marked.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { MarkedOptions, MarkedRenderer } from \u0027ngx-markdown\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"export function markedOptionsFactory(): MarkedOptions {"},{"lineNumber":4,"author":{"gitId":"-"},"content":" const renderer \u003d new MarkedRenderer();"},{"lineNumber":5,"author":{"gitId":"-"},"content":" const linkRenderer \u003d renderer.link;"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":" renderer.link \u003d (href, title, text) \u003d\u003e {"},{"lineNumber":8,"author":{"gitId":"-"},"content":" const html \u003d linkRenderer.call(renderer, href, title, text);"},{"lineNumber":9,"author":{"gitId":"-"},"content":" return html.replace(/^\u003ca /, \u0027\u003ca target\u003d\"_blank\" \u0027);"},{"lineNumber":10,"author":{"gitId":"-"},"content":" };"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":" renderer.checkbox \u003d (checked) \u003d\u003e {"},{"lineNumber":13,"author":{"gitId":"-"},"content":" return checked ? \u0027\u003ci class\u003d\"fa-solid fa-square-check\"\u003e\u003c/i\u003e \u0027 : \u0027\u003ci class\u003d\"fa-solid fa-square\"\u003e\u003c/i\u003e \u0027;"},{"lineNumber":14,"author":{"gitId":"-"},"content":" };"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":" return {"},{"lineNumber":17,"author":{"gitId":"-"},"content":" renderer,"},{"lineNumber":18,"author":{"gitId":"-"},"content":" gfm: true,"},{"lineNumber":19,"author":{"gitId":"nknguyenhc"},"content":" breaks: true,"},{"lineNumber":20,"author":{"gitId":"-"},"content":" pedantic: false,"},{"lineNumber":21,"author":{"gitId":"-"},"content":" smartLists: true,"},{"lineNumber":22,"author":{"gitId":"-"},"content":" smartypants: false"},{"lineNumber":23,"author":{"gitId":"-"},"content":" };"},{"lineNumber":24,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":1,"-":23}},{"path":"src/app/shared/shared.module.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { CommonModule } from \u0027@angular/common\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { HttpClientModule } from \u0027@angular/common/http\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { NgModule } from \u0027@angular/core\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { FormsModule, ReactiveFormsModule } from \u0027@angular/forms\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { RouterModule } from \u0027@angular/router\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { FormDisableControlDirective } from \u0027../core/directives/form-disable-control.directive\u0027;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"import { InternalLinkDisableDirective } from \u0027../core/directives/internal-link-disable.directive\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { ActionToasterModule } from \u0027./action-toasters/action-toasters.module\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { ErrorToasterModule } from \u0027./error-toasters/error-toaster.module\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import { MaterialModule } from \u0027./material.module\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"@NgModule({"},{"lineNumber":13,"author":{"gitId":"-"},"content":" imports: [CommonModule, FormsModule, ReactiveFormsModule, HttpClientModule, RouterModule, MaterialModule, ErrorToasterModule],"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" declarations: [FormDisableControlDirective, InternalLinkDisableDirective],"},{"lineNumber":15,"author":{"gitId":"-"},"content":" exports: ["},{"lineNumber":16,"author":{"gitId":"-"},"content":" FormDisableControlDirective,"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" InternalLinkDisableDirective,"},{"lineNumber":18,"author":{"gitId":"-"},"content":" CommonModule,"},{"lineNumber":19,"author":{"gitId":"-"},"content":" FormsModule,"},{"lineNumber":20,"author":{"gitId":"-"},"content":" ReactiveFormsModule,"},{"lineNumber":21,"author":{"gitId":"-"},"content":" HttpClientModule,"},{"lineNumber":22,"author":{"gitId":"-"},"content":" RouterModule,"},{"lineNumber":23,"author":{"gitId":"-"},"content":" MaterialModule,"},{"lineNumber":24,"author":{"gitId":"-"},"content":" ErrorToasterModule,"},{"lineNumber":25,"author":{"gitId":"-"},"content":" ActionToasterModule"},{"lineNumber":26,"author":{"gitId":"-"},"content":" ]"},{"lineNumber":27,"author":{"gitId":"-"},"content":"})"},{"lineNumber":28,"author":{"gitId":"-"},"content":"export class SharedModule {}"}],"authorContributionMap":{"NereusWB922":3,"-":25}},{"path":"src/app/shared/view-issue/issue-dispute/issue-dispute.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003ch3 class\u003d\"mat-title\"\u003eDisputes\u003c/h3\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":"\u003cform [formGroup]\u003d\"tutorResponseForm\" #tutorForm\u003d\"ngForm\" (ngSubmit)\u003d\"submitTutorResponseForm(tutorForm)\"\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"timeline-comment\"\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"timeline-header\"\u003e"},{"lineNumber":5,"author":{"gitId":"-"},"content":" \u003cspan\u003e Post your response here. \u003c/span\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cbutton mat-button style\u003d\"float: right\" *ngIf\u003d\"!isEditing\" (click)\u003d\"changeToEditMode()\"\u003eEdit\u003c/button\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cdiv\u003e"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"container\" *ngFor\u003d\"let dispute of issue.issueDisputes; index as i; trackBy: trackDisputeList\"\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cdiv style\u003d\"display: flex; align-items: center\"\u003e"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"question-mark\"\u003e?\u003c/div\u003e"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" \u003cmarkdown [data]\u003d\"this.getItemTitleText(dispute.title)\" disableInternalLink\u003e\u003c/markdown\u003e"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cbr /\u003e"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" \u003cmarkdown [data]\u003d\"dispute.description\" disableInternalLink\u003e\u003c/markdown\u003e"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003cbr /\u003e"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003cdiv\u003e"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003cmat-checkbox"},{"lineNumber":19,"author":{"gitId":"-"},"content":" style\u003d\"display: inline-block; width: 20%\""},{"lineNumber":20,"author":{"gitId":"-"},"content":" [id]\u003d\"getTodoFormId(i)\""},{"lineNumber":21,"author":{"gitId":"-"},"content":" [formControlName]\u003d\"getTodoFormId(i)\""},{"lineNumber":22,"author":{"gitId":"-"},"content":" [disableControl]\u003d\"!isEditing\""},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":24,"author":{"gitId":"-"},"content":" Done"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003c/mat-checkbox\u003e"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cbr /\u003e"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003cdiv\u003e"},{"lineNumber":29,"author":{"gitId":"-"},"content":" \u003cmarkdown data\u003d\"### Tutor\u0027s Response: \"\u003e\u003c/markdown\u003e"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" \u003cmarkdown [data]\u003d\"dispute.tutorResponse\" *ngIf\u003d\"!isEditing\" disableInternalLink\u003e\u003c/markdown\u003e"},{"lineNumber":31,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"isEditing\"\u003e"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u003capp-comment-editor"},{"lineNumber":34,"author":{"gitId":"-"},"content":" [commentField]\u003d\"tutorResponseForm.get(getTutorResponseFormId(i))\""},{"lineNumber":35,"author":{"gitId":"-"},"content":" [commentForm]\u003d\"tutorResponseForm\""},{"lineNumber":36,"author":{"gitId":"-"},"content":" [id]\u003d\"getTutorResponseFormId(i)\""},{"lineNumber":37,"author":{"gitId":"-"},"content":" [(isFormPending)]\u003d\"isFormPending\""},{"lineNumber":38,"author":{"gitId":"-"},"content":" [(submitButtonText)]\u003d\"submitButtonText\""},{"lineNumber":39,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":40,"author":{"gitId":"-"},"content":" \u003c/app-comment-editor\u003e"},{"lineNumber":41,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":42,"author":{"gitId":"-"},"content":" \u003cbr /\u003e"},{"lineNumber":43,"author":{"gitId":"-"},"content":" \u003cmarkdown data\u003d\"-------------------\"\u003e\u003c/markdown\u003e \u003cbr /\u003e"},{"lineNumber":44,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \u003cmat-divider\u003e\u003c/mat-divider\u003e"},{"lineNumber":46,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"editor-actions\" *ngIf\u003d\"isEditing\"\u003e"},{"lineNumber":47,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":48,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":49,"author":{"gitId":"-"},"content":" *ngIf\u003d\"conflict\""},{"lineNumber":50,"author":{"gitId":"-"},"content":" type\u003d\"button\""},{"lineNumber":51,"author":{"gitId":"-"},"content":" [disabled]\u003d\"isFormPending\""},{"lineNumber":52,"author":{"gitId":"-"},"content":" mat-raised-button"},{"lineNumber":53,"author":{"gitId":"-"},"content":" color\u003d\"primary\""},{"lineNumber":54,"author":{"gitId":"-"},"content":" (click)\u003d\"viewInGithub()\""},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":56,"author":{"gitId":"-"},"content":" View Updated Response On Github"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":59,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":60,"author":{"gitId":"-"},"content":" type\u003d\"submit\""},{"lineNumber":61,"author":{"gitId":"-"},"content":" *ngIf\u003d\"!conflict\""},{"lineNumber":62,"author":{"gitId":"-"},"content":" [disabled]\u003d\"tutorResponseForm.invalid || isFormPending\""},{"lineNumber":63,"author":{"gitId":"-"},"content":" mat-stroked-button"},{"lineNumber":64,"author":{"gitId":"-"},"content":" color\u003d\"primary\""},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":66,"author":{"gitId":"-"},"content":" {{ submitButtonText }}"},{"lineNumber":67,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":68,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":69,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":70,"author":{"gitId":"-"},"content":" type\u003d\"submit\""},{"lineNumber":71,"author":{"gitId":"-"},"content":" [disabled]\u003d\"tutorResponseForm.invalid || isFormPending\""},{"lineNumber":72,"author":{"gitId":"-"},"content":" mat-raised-button"},{"lineNumber":73,"author":{"gitId":"-"},"content":" color\u003d\"warn\""},{"lineNumber":74,"author":{"gitId":"-"},"content":" *ngIf\u003d\"conflict\""},{"lineNumber":75,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":76,"author":{"gitId":"-"},"content":" {{ submitButtonText }}"},{"lineNumber":77,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":78,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":79,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":80,"author":{"gitId":"-"},"content":" type\u003d\"button\""},{"lineNumber":81,"author":{"gitId":"-"},"content":" [disabled]\u003d\"isFormPending\""},{"lineNumber":82,"author":{"gitId":"-"},"content":" style\u003d\"margin-left: 10px\""},{"lineNumber":83,"author":{"gitId":"-"},"content":" *ngIf\u003d\"!this.isNewResponse()\""},{"lineNumber":84,"author":{"gitId":"-"},"content":" mat-stroked-button"},{"lineNumber":85,"author":{"gitId":"-"},"content":" color\u003d\"warn\""},{"lineNumber":86,"author":{"gitId":"-"},"content":" (click)\u003d\"cancelEditMode()\""},{"lineNumber":87,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":88,"author":{"gitId":"-"},"content":" Cancel"},{"lineNumber":89,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":90,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":91,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":92,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":93,"author":{"gitId":"-"},"content":"\u003c/form\u003e"}],"authorContributionMap":{"NereusWB922":3,"-":90}},{"path":"src/app/shared/view-issue/team-response/team-response.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003ch3 class\u003d\"mat-title\"\u003eTeam\u0027s Response\u003c/h3\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":"\u003cform [formGroup]\u003d\"responseForm\" #myForm\u003d\"ngForm\" (ngSubmit)\u003d\"updateResponse(myForm)\"\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"timeline-comment\"\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"timeline-header\"\u003e"},{"lineNumber":5,"author":{"gitId":"-"},"content":" \u003cspan\u003e \u003cstrong\u003e Team \u003c/strong\u003e responded. \u003c/span\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cbutton style\u003d\"float: right\" mat-button *ngIf\u003d\"canEditIssue() \u0026\u0026 !isEditing\" (click)\u003d\"changeToEditMode()\"\u003eEdit\u003c/button\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"!isEditing\" class\u003d\"comment\"\u003e"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" \u003cmarkdown [data]\u003d\"issue.teamResponse\" disableInternalLink\u003e\u003c/markdown\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"isEditing\"\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003capp-comment-editor"},{"lineNumber":13,"author":{"gitId":"-"},"content":" [id]\u003d\"\u0027description\u0027\""},{"lineNumber":14,"author":{"gitId":"-"},"content":" [commentField]\u003d\"this.responseForm.get(\u0027description\u0027)\""},{"lineNumber":15,"author":{"gitId":"-"},"content":" [commentForm]\u003d\"this.responseForm\""},{"lineNumber":16,"author":{"gitId":"-"},"content":" [(isFormPending)]\u003d\"this.isSavePending\""},{"lineNumber":17,"author":{"gitId":"-"},"content":" [(submitButtonText)]\u003d\"this.submitButtonText\""},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003c/app-comment-editor\u003e"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"editor-actions\"\u003e"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":22,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":23,"author":{"gitId":"-"},"content":" *ngIf\u003d\"conflict\""},{"lineNumber":24,"author":{"gitId":"-"},"content":" type\u003d\"button\""},{"lineNumber":25,"author":{"gitId":"-"},"content":" [disabled]\u003d\"isSavePending\""},{"lineNumber":26,"author":{"gitId":"-"},"content":" mat-raised-button"},{"lineNumber":27,"author":{"gitId":"-"},"content":" color\u003d\"primary\""},{"lineNumber":28,"author":{"gitId":"-"},"content":" (click)\u003d\"viewChanges()\""},{"lineNumber":29,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":30,"author":{"gitId":"-"},"content":" View Updated Response"},{"lineNumber":31,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":33,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":34,"author":{"gitId":"-"},"content":" *ngIf\u003d\"conflict\""},{"lineNumber":35,"author":{"gitId":"-"},"content":" type\u003d\"submit\""},{"lineNumber":36,"author":{"gitId":"-"},"content":" [disabled]\u003d\"responseForm.invalid || isSavePending\""},{"lineNumber":37,"author":{"gitId":"-"},"content":" mat-raised-button"},{"lineNumber":38,"author":{"gitId":"-"},"content":" color\u003d\"warn\""},{"lineNumber":39,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":40,"author":{"gitId":"-"},"content":" {{ submitButtonText }}"},{"lineNumber":41,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":42,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":43,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":44,"author":{"gitId":"-"},"content":" *ngIf\u003d\"!conflict\""},{"lineNumber":45,"author":{"gitId":"-"},"content":" type\u003d\"submit\""},{"lineNumber":46,"author":{"gitId":"-"},"content":" [disabled]\u003d\"responseForm.invalid || isSavePending\""},{"lineNumber":47,"author":{"gitId":"-"},"content":" mat-stroked-button"},{"lineNumber":48,"author":{"gitId":"-"},"content":" color\u003d\"primary\""},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":50,"author":{"gitId":"-"},"content":" {{ submitButtonText }}"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":52,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":53,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":54,"author":{"gitId":"-"},"content":" type\u003d\"button\""},{"lineNumber":55,"author":{"gitId":"-"},"content":" [disabled]\u003d\"isSavePending\""},{"lineNumber":56,"author":{"gitId":"-"},"content":" mat-stroked-button"},{"lineNumber":57,"author":{"gitId":"-"},"content":" color\u003d\"warn\""},{"lineNumber":58,"author":{"gitId":"-"},"content":" (click)\u003d\"openCancelDialogIfModified()\""},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":60,"author":{"gitId":"-"},"content":" Cancel"},{"lineNumber":61,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":62,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003c/form\u003e"}],"authorContributionMap":{"NereusWB922":1,"-":64}},{"path":"src/app/shared/view-issue/tester-response/conflict-dialog/conflict-dialog.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cdiv style\u003d\"display: flex; margin-bottom: 20px; align-items: center\"\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003ch1 mat-dialog-title style\u003d\"margin: 0\"\u003e{{ \u0027The content you are editing has changed\u0027 }}\u003c/h1\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \u003cmat-slide-toggle style\u003d\"display: inline-block; margin-left: 50px\" color\u003d\"primary\" [checked]\u003d\"showDiff\" (change)\u003d\"handleChangeShowDiff()\"\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":" Show Difference"},{"lineNumber":5,"author":{"gitId":"-"},"content":" \u003c/mat-slide-toggle\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cbutton mat-icon-button color\u003d\"default\" style\u003d\"margin: 0 0 0 auto\" (click)\u003d\"close()\"\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003eclose\u003c/mat-icon\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c/div\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003cdiv mat-dialog-content\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cmat-accordion [multi]\u003d\"true\"\u003e"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003cmat-expansion-panel class\u003d\"full-width\" *ngFor\u003d\"let conflict of conflicts; index as i\" [expanded]\u003d\"panelOpenStates[i]\"\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cmat-expansion-panel-header\u003e"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cmat-panel-title class\u003d\"response-title\"\u003e"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"question-mark\"\u003e?\u003c/div\u003e"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" \u003cmarkdown [data]\u003d\"data.updatedResponses[i].getTitleInMarkDown()\" disableInternalLink\u003e\u003c/markdown\u003e"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003c/mat-panel-title\u003e"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003cmat-panel-description\u003e"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003cmat-chip-list\u003e"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003cmat-chip *ngIf\u003d\"data.outdatedResponses[i].compareTo(data.updatedResponses[i]) \u003d\u003d\u003d 0\" style\u003d\"margin-top: 10px\"\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":" No Changes"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003c/mat-chip\u003e"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003c/mat-chip-list\u003e"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003c/mat-panel-description\u003e"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/mat-expansion-panel-header\u003e"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cbr /\u003e"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" \u003cmarkdown [data]\u003d\"data.updatedResponses[i].description\" disableInternalLink\u003e\u003c/markdown\u003e"},{"lineNumber":29,"author":{"gitId":"-"},"content":" \u003cbr /\u003e"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \u003cdiv"},{"lineNumber":31,"author":{"gitId":"-"},"content":" *ngIf\u003d\"data.updatedResponses[i].isDisagree() \u003d\u003d\u003d data.outdatedResponses[i].isDisagree() || !showDiff\""},{"lineNumber":32,"author":{"gitId":"-"},"content":" style\u003d\"margin-bottom: 10px\""},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \u003cmat-checkbox style\u003d\"display: inline-block; width: 20%\" [disabled]\u003d\"true\" [checked]\u003d\"data.updatedResponses[i].isDisagree()\"\u003e"},{"lineNumber":35,"author":{"gitId":"-"},"content":" I disagree"},{"lineNumber":36,"author":{"gitId":"-"},"content":" \u003c/mat-checkbox\u003e"},{"lineNumber":37,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":38,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"!data.outdatedResponses[i].isDisagree() \u0026\u0026 data.updatedResponses[i].isDisagree() \u0026\u0026 showDiff\" class\u003d\"checkbox-changes\"\u003e"},{"lineNumber":39,"author":{"gitId":"-"},"content":" \u003ci style\u003d\"color: green\" class\u003d\"material-icons-outlined\"\u003eadd_box\u003c/i\u003e"},{"lineNumber":40,"author":{"gitId":"-"},"content":" \u003cins style\u003d\"background: #d4fcbc; text-decoration: none\"\u003e I disagree \u003c/ins\u003e"},{"lineNumber":41,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":42,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"data.outdatedResponses[i].isDisagree() \u0026\u0026 !data.updatedResponses[i].isDisagree() \u0026\u0026 showDiff\" class\u003d\"checkbox-changes\"\u003e"},{"lineNumber":43,"author":{"gitId":"-"},"content":" \u003ci style\u003d\"color: red\" class\u003d\"material-icons-outlined\"\u003eindeterminate_check_box\u003c/i\u003e"},{"lineNumber":44,"author":{"gitId":"-"},"content":" \u003cdel style\u003d\"background: #fbb\"\u003eI disagree\u003c/del\u003e"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":" \u003cmat-tab-group style\u003d\"margin-bottom: 20px\" class\u003d\"mat-elevation-z1\" animationDuration\u003d\"0ms\"\u003e"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003cmat-tab label\u003d\"Markdown Text\"\u003e"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"tab-content\" *ngIf\u003d\"isReady\"\u003e"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"showDiff\" [innerHTML]\u003d\"diffHtmls[i]\"\u003e\u003c/div\u003e"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"!showDiff\" [innerHTML]\u003d\"updatedHtmls[i]\"\u003e\u003c/div\u003e"},{"lineNumber":52,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/mat-tab\u003e"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003cmat-tab label\u003d\"Preview Updated Content\"\u003e"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"tab-content\"\u003e"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003cmarkdown\u003e{{ conflict.updatedContent }}\u003c/markdown\u003e"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003c/mat-tab\u003e"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003c/mat-tab-group\u003e"},{"lineNumber":60,"author":{"gitId":"-"},"content":" \u003c/mat-expansion-panel\u003e"},{"lineNumber":61,"author":{"gitId":"-"},"content":" \u003c/mat-accordion\u003e"},{"lineNumber":62,"author":{"gitId":"-"},"content":"\u003c/div\u003e"}],"authorContributionMap":{"NereusWB922":2,"-":60}},{"path":"src/app/shared/view-issue/tester-response/tester-response.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003ch3 class\u003d\"mat-title\"\u003eTester\u0027s Response\u003c/h3\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":"\u003cform [formGroup]\u003d\"testerResponseForm\" (ngSubmit)\u003d\"submitTesterResponseForm()\"\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"timeline-comment\"\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"timeline-header\"\u003e"},{"lineNumber":5,"author":{"gitId":"-"},"content":" \u003cspan *ngIf\u003d\"this.isNewResponse()\"\u003e Please verify the following item(s). \u003c/span\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cspan *ngIf\u003d\"!this.isNewResponse()\"\u003e \u003cstrong\u003eTester\u003c/strong\u003e responded. \u003c/span\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003cbutton mat-button style\u003d\"float: right\" *ngIf\u003d\"!isEditing\" (click)\u003d\"changeToEditMode()\"\u003eEdit\u003c/button\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cdiv\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"container\" *ngFor\u003d\"let response of issue.testerResponses; index as i; trackBy: trackDisagreeList\"\u003e"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cdiv style\u003d\"display: flex; align-items: center\"\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"question-mark\"\u003e?\u003c/div\u003e"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" \u003cmarkdown [data]\u003d\"response.getTitleInMarkDown()\" disableInternalLink\u003e\u003c/markdown\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cbr /\u003e"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" \u003cmarkdown [data]\u003d\"response.description\" disableInternalLink\u003e\u003c/markdown\u003e"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003cbr /\u003e"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003cdiv\u003e"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003cmat-radio-group"},{"lineNumber":20,"author":{"gitId":"-"},"content":" style\u003d\"display: inline-block; width: 20%\""},{"lineNumber":21,"author":{"gitId":"-"},"content":" aria-label\u003d\"Select Agree or Disagree to Team\u0027s Response\""},{"lineNumber":22,"author":{"gitId":"-"},"content":" [disableControl]\u003d\"!isEditing\""},{"lineNumber":23,"author":{"gitId":"-"},"content":" [id]\u003d\"getDisagreeRadioFormId(i)\""},{"lineNumber":24,"author":{"gitId":"-"},"content":" [formControlName]\u003d\"getDisagreeRadioFormId(i)\""},{"lineNumber":25,"author":{"gitId":"-"},"content":" (change)\u003d\"handleChangeOfDisagreeRadioButton($event, i)\""},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cmat-radio-button [value]\u003d\"false\"\u003e I Agree \u003c/mat-radio-button\u003e"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003cmat-radio-button [value]\u003d\"true\"\u003e I Disagree \u003c/mat-radio-button\u003e"},{"lineNumber":29,"author":{"gitId":"-"},"content":" \u003c/mat-radio-group\u003e"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":31,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"testerResponseForm.get(getDisagreeRadioFormId(i)).value\"\u003e"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003cdiv\u003e"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u003cp style\u003d\"font-weight: 500\"\u003eReason for Disagreement:\u003c/p\u003e"},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" \u003cmarkdown [data]\u003d\"response.reasonForDisagreement\" *ngIf\u003d\"!isEditing\" disableInternalLink\u003e\u003c/markdown\u003e"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":36,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"isEditing\"\u003e"},{"lineNumber":37,"author":{"gitId":"-"},"content":" \u003capp-comment-editor"},{"lineNumber":38,"author":{"gitId":"-"},"content":" [commentField]\u003d\"testerResponseForm.get(getTesterResponseFormId(i))\""},{"lineNumber":39,"author":{"gitId":"-"},"content":" [id]\u003d\"getTesterResponseFormId(i)\""},{"lineNumber":40,"author":{"gitId":"-"},"content":" [commentForm]\u003d\"testerResponseForm\""},{"lineNumber":41,"author":{"gitId":"-"},"content":" [(isFormPending)]\u003d\"isFormPending\""},{"lineNumber":42,"author":{"gitId":"-"},"content":" [(submitButtonText)]\u003d\"submitButtonText\""},{"lineNumber":43,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":44,"author":{"gitId":"-"},"content":" \u003c/app-comment-editor\u003e"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":46,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":47,"author":{"gitId":"-"},"content":" \u003cbr /\u003e"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003cmarkdown data\u003d\"-------------------\"\u003e\u003c/markdown\u003e \u003cbr /\u003e"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003cmat-divider\u003e\u003c/mat-divider\u003e"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"editor-actions\" *ngIf\u003d\"isEditing\"\u003e"},{"lineNumber":52,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":53,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":54,"author":{"gitId":"-"},"content":" *ngIf\u003d\"conflict\""},{"lineNumber":55,"author":{"gitId":"-"},"content":" type\u003d\"button\""},{"lineNumber":56,"author":{"gitId":"-"},"content":" [disabled]\u003d\"isFormPending\""},{"lineNumber":57,"author":{"gitId":"-"},"content":" mat-raised-button"},{"lineNumber":58,"author":{"gitId":"-"},"content":" color\u003d\"primary\""},{"lineNumber":59,"author":{"gitId":"-"},"content":" (click)\u003d\"viewChanges()\""},{"lineNumber":60,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":61,"author":{"gitId":"-"},"content":" View Updated Response"},{"lineNumber":62,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003cbutton type\u003d\"submit\" [disabled]\u003d\"testerResponseForm.invalid || isFormPending\" mat-stroked-button color\u003d\"primary\" *ngIf\u003d\"!conflict\"\u003e"},{"lineNumber":64,"author":{"gitId":"-"},"content":" {{ submitButtonText }}"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":67,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":68,"author":{"gitId":"-"},"content":" type\u003d\"submit\""},{"lineNumber":69,"author":{"gitId":"-"},"content":" [disabled]\u003d\"testerResponseForm.invalid || isFormPending\""},{"lineNumber":70,"author":{"gitId":"-"},"content":" mat-raised-button"},{"lineNumber":71,"author":{"gitId":"-"},"content":" color\u003d\"warn\""},{"lineNumber":72,"author":{"gitId":"-"},"content":" *ngIf\u003d\"conflict\""},{"lineNumber":73,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":74,"author":{"gitId":"-"},"content":" {{ submitButtonText }}"},{"lineNumber":75,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":76,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":77,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":78,"author":{"gitId":"-"},"content":" type\u003d\"button\""},{"lineNumber":79,"author":{"gitId":"-"},"content":" [disabled]\u003d\"isFormPending\""},{"lineNumber":80,"author":{"gitId":"-"},"content":" *ngIf\u003d\"!this.isNewResponse()\""},{"lineNumber":81,"author":{"gitId":"-"},"content":" mat-stroked-button"},{"lineNumber":82,"author":{"gitId":"-"},"content":" color\u003d\"warn\""},{"lineNumber":83,"author":{"gitId":"-"},"content":" (click)\u003d\"openCancelDialogIfModified()\""},{"lineNumber":84,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":85,"author":{"gitId":"-"},"content":" Cancel"},{"lineNumber":86,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":87,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":88,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":89,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":90,"author":{"gitId":"-"},"content":"\u003c/form\u003e"}],"authorContributionMap":{"NereusWB922":3,"-":87}}] +[{"path":"src/app/app-routing.module.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { NgModule } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { RouterModule, Routes } from \u0027@angular/router\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { AuthModule } from \u0027./auth/auth.module\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { AuthGuard } from \u0027./core/guards/auth.guard\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { PhaseBugReportingModule } from \u0027./phase-bug-reporting/phase-bug-reporting.module\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { PhaseModerationModule } from \u0027./phase-moderation/phase-moderation.module\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { PhaseTeamResponseModule } from \u0027./phase-team-response/phase-team-response.module\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { PhaseTesterResponseModule } from \u0027./phase-tester-response/phase-tester-response.module\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"const routes: Routes \u003d ["},{"lineNumber":11,"author":{"gitId":"-"},"content":" { path: \u0027\u0027, loadChildren: () \u003d\u003e AuthModule },"},{"lineNumber":12,"author":{"gitId":"-"},"content":" { path: \u0027phaseBugReporting\u0027, loadChildren: () \u003d\u003e PhaseBugReportingModule, canLoad: [AuthGuard] },"},{"lineNumber":13,"author":{"gitId":"-"},"content":" { path: \u0027phaseTeamResponse\u0027, loadChildren: () \u003d\u003e PhaseTeamResponseModule, canLoad: [AuthGuard] },"},{"lineNumber":14,"author":{"gitId":"-"},"content":" { path: \u0027phaseTesterResponse\u0027, loadChildren: () \u003d\u003e PhaseTesterResponseModule, canLoad: [AuthGuard] },"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" { path: \u0027phaseModeration\u0027, loadChildren: () \u003d\u003e PhaseModerationModule, canLoad: [AuthGuard] },"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" { path: \u0027**\u0027, redirectTo: \u0027\u0027 }"},{"lineNumber":17,"author":{"gitId":"-"},"content":"];"},{"lineNumber":18,"author":{"gitId":"-"},"content":""},{"lineNumber":19,"author":{"gitId":"-"},"content":"@NgModule({"},{"lineNumber":20,"author":{"gitId":"-"},"content":" imports: [RouterModule.forRoot(routes)],"},{"lineNumber":21,"author":{"gitId":"-"},"content":" exports: [RouterModule]"},{"lineNumber":22,"author":{"gitId":"-"},"content":"})"},{"lineNumber":23,"author":{"gitId":"-"},"content":"export class AppRoutingModule {}"}],"authorContributionMap":{"NereusWB922":2,"-":21}},{"path":"src/app/core/directives/internal-link-disable.directive.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { Directive, HostListener } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { ErrorHandlingService } from \u0027../services/error-handling.service\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"class InvalidLinkError extends Error {"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" constructor() {"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" super(\u0027Invalid link!\u0027);"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" Object.setPrototypeOf(this, InvalidLinkError.prototype);"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":"@Directive({"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" selector: \u0027[disableInternalLink]\u0027"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":"})"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":"export class InternalLinkDisableDirective {"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" constructor(private errorHandlingService: ErrorHandlingService) {}"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" @HostListener(\u0027click\u0027, [\u0027$event\u0027])"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" public onClick(e: MouseEvent): void {"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" const srcElement \u003d e.target;"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":" if (srcElement instanceof HTMLAnchorElement) {"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" const baseURI \u003d srcElement.baseURI;"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" const href \u003d srcElement.href;"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" if (href.startsWith(baseURI)) {"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" this.errorHandlingService.handleError(new InvalidLinkError());"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":" e.preventDefault();"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" e.stopPropagation();"},{"lineNumber":29,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":32}},{"path":"src/app/core/models/table-settings.model.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"Arif-Khalid"},"content":"export class TableSettings {"},{"lineNumber":2,"author":{"gitId":"Arif-Khalid"},"content":" public sortActiveId \u003d \u0027\u0027; // The ID of the column the table is sorted by"},{"lineNumber":3,"author":{"gitId":"Arif-Khalid"},"content":" public sortDirection \u003d \u0027\u0027;"},{"lineNumber":4,"author":{"gitId":"Arif-Khalid"},"content":" public pageSize \u003d 20;"},{"lineNumber":5,"author":{"gitId":"Arif-Khalid"},"content":" public pageIndex \u003d 0;"},{"lineNumber":6,"author":{"gitId":"Arif-Khalid"},"content":"}"}],"authorContributionMap":{"Arif-Khalid":6}},{"path":"src/app/core/services/github.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { HttpErrorResponse } from \u0027@angular/common/http\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Injectable } from \u0027@angular/core\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { ApolloQueryResult } from \u0027@apollo/client/core\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { Apollo, QueryRef } from \u0027apollo-angular\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { DocumentNode } from \u0027graphql\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { forkJoin, from, Observable, of, throwError } from \u0027rxjs\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { catchError, filter, map, mergeMap, throwIfEmpty } from \u0027rxjs/operators\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import {"},{"lineNumber":9,"author":{"gitId":"-"},"content":" FetchIssue,"},{"lineNumber":10,"author":{"gitId":"-"},"content":" FetchIssueQuery,"},{"lineNumber":11,"author":{"gitId":"-"},"content":" FetchIssues,"},{"lineNumber":12,"author":{"gitId":"-"},"content":" FetchIssuesByTeam,"},{"lineNumber":13,"author":{"gitId":"-"},"content":" FetchIssuesByTeamQuery,"},{"lineNumber":14,"author":{"gitId":"-"},"content":" FetchIssuesQuery,"},{"lineNumber":15,"author":{"gitId":"-"},"content":" FetchLabels,"},{"lineNumber":16,"author":{"gitId":"-"},"content":" FetchLabelsQuery"},{"lineNumber":17,"author":{"gitId":"-"},"content":"} from \u0027../../../../graphql/graphql-types\u0027;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import { AppConfig } from \u0027../../../environments/environment\u0027;"},{"lineNumber":19,"author":{"gitId":"nknguyenhc"},"content":"import { throwIfFalse } from \u0027../../shared/lib/custom-ops\u0027;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import { getNumberOfPages } from \u0027../../shared/lib/github-paginator-parser\u0027;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import { IssueComment } from \u0027../models/comment.model\u0027;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import { GithubUser } from \u0027../models/github-user.model\u0027;"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import { IssueLastModifiedManagerModel } from \u0027../models/github/cache-manager/issue-last-modified-manager.model\u0027;"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import { IssuesCacheManager } from \u0027../models/github/cache-manager/issues-cache-manager.model\u0027;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import { GithubComment } from \u0027../models/github/github-comment.model\u0027;"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import { GithubGraphqlIssue } from \u0027../models/github/github-graphql.issue\u0027;"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import RestGithubIssueFilter from \u0027../models/github/github-issue-filter.model\u0027;"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import { GithubIssue } from \u0027../models/github/github-issue.model\u0027;"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import { GithubLabel } from \u0027../models/github/github-label.model\u0027;"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import { GithubResponse } from \u0027../models/github/github-response.model\u0027;"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import { GithubRelease } from \u0027../models/github/github.release\u0027;"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import { SessionData } from \u0027../models/session.model\u0027;"},{"lineNumber":33,"author":{"gitId":"-"},"content":"import { ERRORCODE_NOT_FOUND, ErrorHandlingService } from \u0027./error-handling.service\u0027;"},{"lineNumber":34,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027./logging.service\u0027;"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":"const { Octokit } \u003d require(\u0027@octokit/rest\u0027);"},{"lineNumber":37,"author":{"gitId":"-"},"content":"const CATCHER_ORG \u003d \u0027CATcher-org\u0027;"},{"lineNumber":38,"author":{"gitId":"-"},"content":"const CATCHER_REPO \u003d \u0027CATcher\u0027;"},{"lineNumber":39,"author":{"gitId":"nknguyenhc"},"content":"const BRANCH \u003d \u0027main\u0027;"},{"lineNumber":40,"author":{"gitId":"-"},"content":"const UNABLE_TO_OPEN_IN_BROWSER \u003d \u0027Unable to open this issue in Browser\u0027;"},{"lineNumber":41,"author":{"gitId":"nknguyenhc"},"content":"const BRANCH_CREATION_FAILED \u003d `Unable to create ${BRANCH} branch.`;"},{"lineNumber":42,"author":{"gitId":"-"},"content":"function getSettingsUrl(org: string, repoName: string): string {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" return `https://raw.githubusercontent.com/${org}/${repoName}/master/settings.json`;"},{"lineNumber":44,"author":{"gitId":"-"},"content":"}"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":"let ORG_NAME \u003d \u0027\u0027;"},{"lineNumber":47,"author":{"gitId":"-"},"content":"let MOD_ORG \u003d \u0027\u0027;"},{"lineNumber":48,"author":{"gitId":"-"},"content":"let REPO \u003d \u0027\u0027;"},{"lineNumber":49,"author":{"gitId":"-"},"content":"let DATA_REPO \u003d \u0027\u0027;"},{"lineNumber":50,"author":{"gitId":"-"},"content":"const MAX_ITEMS_PER_PAGE \u003d 100;"},{"lineNumber":51,"author":{"gitId":"-"},"content":""},{"lineNumber":52,"author":{"gitId":"-"},"content":"let octokit \u003d new Octokit();"},{"lineNumber":53,"author":{"gitId":"-"},"content":""},{"lineNumber":54,"author":{"gitId":"-"},"content":"@Injectable({"},{"lineNumber":55,"author":{"gitId":"-"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":56,"author":{"gitId":"-"},"content":"})"},{"lineNumber":57,"author":{"gitId":"-"},"content":""},{"lineNumber":58,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * Responsible for communicating with GitHub to create, update, read and delete"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * features related to Github using GitHub API Requests."},{"lineNumber":61,"author":{"gitId":"-"},"content":" * For example, issues, issue labels and repositories."},{"lineNumber":62,"author":{"gitId":"-"},"content":" */"},{"lineNumber":63,"author":{"gitId":"-"},"content":"export class GithubService {"},{"lineNumber":64,"author":{"gitId":"-"},"content":" private static readonly IF_NONE_MATCH_EMPTY \u003d { \u0027If-None-Match\u0027: \u0027\u0027 };"},{"lineNumber":65,"author":{"gitId":"-"},"content":""},{"lineNumber":66,"author":{"gitId":"-"},"content":" private issuesCacheManager \u003d new IssuesCacheManager();"},{"lineNumber":67,"author":{"gitId":"-"},"content":" private issuesLastModifiedManager \u003d new IssueLastModifiedManagerModel();"},{"lineNumber":68,"author":{"gitId":"-"},"content":" private issueQueryRefs \u003d new Map\u003cNumber, QueryRef\u003cFetchIssueQuery\u003e\u003e();"},{"lineNumber":69,"author":{"gitId":"-"},"content":""},{"lineNumber":70,"author":{"gitId":"-"},"content":" constructor(private errorHandlingService: ErrorHandlingService, private apollo: Apollo, private logger: LoggingService) {}"},{"lineNumber":71,"author":{"gitId":"-"},"content":""},{"lineNumber":72,"author":{"gitId":"-"},"content":" storeOAuthAccessToken(accessToken: string) {"},{"lineNumber":73,"author":{"gitId":"-"},"content":" octokit \u003d new Octokit({"},{"lineNumber":74,"author":{"gitId":"-"},"content":" auth() {"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return `Token ${accessToken}`;"},{"lineNumber":76,"author":{"gitId":"-"},"content":" },"},{"lineNumber":77,"author":{"gitId":"-"},"content":" log: {"},{"lineNumber":78,"author":{"gitId":"-"},"content":" debug: (message, ...otherInfo) \u003d\u003e this.logger.debug(\u0027GithubService: \u0027 + message, ...otherInfo),"},{"lineNumber":79,"author":{"gitId":"-"},"content":" // Do not log info for HTTP response 304 due to repeated polling"},{"lineNumber":80,"author":{"gitId":"-"},"content":" info: (message, ...otherInfo) \u003d\u003e"},{"lineNumber":81,"author":{"gitId":"-"},"content":" /304 in \\d+ms$/.test(message) ? undefined : this.logger.info(\u0027GithubService: \u0027 + message, ...otherInfo),"},{"lineNumber":82,"author":{"gitId":"-"},"content":" warn: (message, ...otherInfo) \u003d\u003e this.logger.warn(\u0027GithubService: \u0027 + message, ...otherInfo),"},{"lineNumber":83,"author":{"gitId":"-"},"content":" error: (message, ...otherInfo) \u003d\u003e this.logger.error(\u0027GithubService: \u0027 + message, ...otherInfo)"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }"},{"lineNumber":85,"author":{"gitId":"-"},"content":" });"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }"},{"lineNumber":87,"author":{"gitId":"-"},"content":""},{"lineNumber":88,"author":{"gitId":"-"},"content":" storeOrganizationDetails(orgName: string, dataRepo: string) {"},{"lineNumber":89,"author":{"gitId":"-"},"content":" MOD_ORG \u003d orgName;"},{"lineNumber":90,"author":{"gitId":"-"},"content":" DATA_REPO \u003d dataRepo;"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }"},{"lineNumber":92,"author":{"gitId":"-"},"content":""},{"lineNumber":93,"author":{"gitId":"-"},"content":" storePhaseDetails(phaseRepoOwner: string, repoName: string) {"},{"lineNumber":94,"author":{"gitId":"-"},"content":" REPO \u003d repoName;"},{"lineNumber":95,"author":{"gitId":"-"},"content":" ORG_NAME \u003d phaseRepoOwner;"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }"},{"lineNumber":97,"author":{"gitId":"-"},"content":""},{"lineNumber":98,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":99,"author":{"gitId":"-"},"content":" * Fetches an array of filtered GitHubIssues using GraphQL query for a given team."},{"lineNumber":100,"author":{"gitId":"-"},"content":" *"},{"lineNumber":101,"author":{"gitId":"-"},"content":" * @param tutorial - The tutorial that the team belongs to."},{"lineNumber":102,"author":{"gitId":"-"},"content":" * @param team - The team\u0027s designated name."},{"lineNumber":103,"author":{"gitId":"-"},"content":" * @param issuesFilter - The issue filter."},{"lineNumber":104,"author":{"gitId":"-"},"content":" * @returns An observable array of filtered GithubIssues"},{"lineNumber":105,"author":{"gitId":"-"},"content":" */"},{"lineNumber":106,"author":{"gitId":"-"},"content":" fetchIssuesGraphqlByTeam(tutorial: string, team: string, issuesFilter: RestGithubIssueFilter): Observable\u003cArray\u003cGithubIssue\u003e\u003e {"},{"lineNumber":107,"author":{"gitId":"-"},"content":" const graphqlFilter \u003d issuesFilter.convertToGraphqlFilter();"},{"lineNumber":108,"author":{"gitId":"-"},"content":" return this.toFetchIssues(issuesFilter).pipe("},{"lineNumber":109,"author":{"gitId":"-"},"content":" filter((toFetch) \u003d\u003e toFetch),"},{"lineNumber":110,"author":{"gitId":"-"},"content":" mergeMap(() \u003d\u003e {"},{"lineNumber":111,"author":{"gitId":"-"},"content":" return this.fetchGraphqlList\u003cFetchIssuesByTeamQuery, GithubGraphqlIssue\u003e("},{"lineNumber":112,"author":{"gitId":"-"},"content":" FetchIssuesByTeam,"},{"lineNumber":113,"author":{"gitId":"-"},"content":" {"},{"lineNumber":114,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":115,"author":{"gitId":"-"},"content":" name: REPO,"},{"lineNumber":116,"author":{"gitId":"-"},"content":" filter: {"},{"lineNumber":117,"author":{"gitId":"-"},"content":" ...graphqlFilter,"},{"lineNumber":118,"author":{"gitId":"-"},"content":" labels: [...(graphqlFilter.labels ? graphqlFilter.labels : []), team]"},{"lineNumber":119,"author":{"gitId":"-"},"content":" },"},{"lineNumber":120,"author":{"gitId":"-"},"content":" tutorial"},{"lineNumber":121,"author":{"gitId":"-"},"content":" },"},{"lineNumber":122,"author":{"gitId":"-"},"content":" (result) \u003d\u003e result.data.repository.label.issues.edges,"},{"lineNumber":123,"author":{"gitId":"-"},"content":" GithubGraphqlIssue"},{"lineNumber":124,"author":{"gitId":"-"},"content":" );"},{"lineNumber":125,"author":{"gitId":"-"},"content":" })"},{"lineNumber":126,"author":{"gitId":"-"},"content":" );"},{"lineNumber":127,"author":{"gitId":"-"},"content":" }"},{"lineNumber":128,"author":{"gitId":"-"},"content":""},{"lineNumber":129,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":130,"author":{"gitId":"-"},"content":" * Fetches an array of filtered GitHubIssues using GraphQL query."},{"lineNumber":131,"author":{"gitId":"-"},"content":" * @param issuesFilter - The issue filter."},{"lineNumber":132,"author":{"gitId":"-"},"content":" * @returns An observable array of filtered GithubIssues"},{"lineNumber":133,"author":{"gitId":"-"},"content":" */"},{"lineNumber":134,"author":{"gitId":"-"},"content":" fetchIssuesGraphql(issuesFilter: RestGithubIssueFilter): Observable\u003cArray\u003cGithubIssue\u003e\u003e {"},{"lineNumber":135,"author":{"gitId":"-"},"content":" const graphqlFilter \u003d issuesFilter.convertToGraphqlFilter();"},{"lineNumber":136,"author":{"gitId":"-"},"content":" return this.toFetchIssues(issuesFilter).pipe("},{"lineNumber":137,"author":{"gitId":"-"},"content":" filter((toFetch) \u003d\u003e toFetch),"},{"lineNumber":138,"author":{"gitId":"-"},"content":" mergeMap(() \u003d\u003e {"},{"lineNumber":139,"author":{"gitId":"-"},"content":" return this.fetchGraphqlList\u003cFetchIssuesQuery, GithubGraphqlIssue\u003e("},{"lineNumber":140,"author":{"gitId":"-"},"content":" FetchIssues,"},{"lineNumber":141,"author":{"gitId":"-"},"content":" { owner: ORG_NAME, name: REPO, filter: graphqlFilter },"},{"lineNumber":142,"author":{"gitId":"-"},"content":" (result) \u003d\u003e result.data.repository.issues.edges,"},{"lineNumber":143,"author":{"gitId":"-"},"content":" GithubGraphqlIssue"},{"lineNumber":144,"author":{"gitId":"-"},"content":" );"},{"lineNumber":145,"author":{"gitId":"-"},"content":" })"},{"lineNumber":146,"author":{"gitId":"-"},"content":" );"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }"},{"lineNumber":148,"author":{"gitId":"-"},"content":""},{"lineNumber":149,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":150,"author":{"gitId":"-"},"content":" * Checks if there are pages of filtered issues that are not cached in the cache model,"},{"lineNumber":151,"author":{"gitId":"-"},"content":" * and updates the model to cache these new pages."},{"lineNumber":152,"author":{"gitId":"-"},"content":" * @param filter - The issue filter."},{"lineNumber":153,"author":{"gitId":"-"},"content":" * @returns Observable\u003cboolean\u003e that returns true if there are pages that do not exist in the cache model."},{"lineNumber":154,"author":{"gitId":"-"},"content":" */"},{"lineNumber":155,"author":{"gitId":"-"},"content":" private toFetchIssues(filter: RestGithubIssueFilter): Observable\u003cboolean\u003e {"},{"lineNumber":156,"author":{"gitId":"-"},"content":" let responseInFirstPage: GithubResponse\u003cGithubIssue[]\u003e;"},{"lineNumber":157,"author":{"gitId":"-"},"content":" return this.getIssuesAPICall(filter, 1).pipe("},{"lineNumber":158,"author":{"gitId":"-"},"content":" map((response: GithubResponse\u003cGithubIssue[]\u003e) \u003d\u003e {"},{"lineNumber":159,"author":{"gitId":"-"},"content":" responseInFirstPage \u003d response;"},{"lineNumber":160,"author":{"gitId":"-"},"content":" return getNumberOfPages(response);"},{"lineNumber":161,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":162,"author":{"gitId":"-"},"content":" mergeMap((numOfPages: number) \u003d\u003e {"},{"lineNumber":163,"author":{"gitId":"-"},"content":" const apiCalls: Observable\u003cGithubResponse\u003cGithubIssue[]\u003e\u003e[] \u003d [];"},{"lineNumber":164,"author":{"gitId":"-"},"content":" for (let i \u003d 2; i \u003c\u003d numOfPages; i++) {"},{"lineNumber":165,"author":{"gitId":"-"},"content":" apiCalls.push(this.getIssuesAPICall(filter, i));"},{"lineNumber":166,"author":{"gitId":"-"},"content":" }"},{"lineNumber":167,"author":{"gitId":"-"},"content":" return apiCalls.length \u003d\u003d\u003d 0 ? of([]) : forkJoin(apiCalls);"},{"lineNumber":168,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":169,"author":{"gitId":"-"},"content":" map((resultArray: GithubResponse\u003cGithubIssue[]\u003e[]) \u003d\u003e {"},{"lineNumber":170,"author":{"gitId":"-"},"content":" const responses \u003d [responseInFirstPage, ...resultArray];"},{"lineNumber":171,"author":{"gitId":"-"},"content":" const isCached \u003d responses.reduce((result, response) \u003d\u003e {"},{"lineNumber":172,"author":{"gitId":"-"},"content":" return result \u0026\u0026 response.isCached;"},{"lineNumber":173,"author":{"gitId":"-"},"content":" }, true);"},{"lineNumber":174,"author":{"gitId":"-"},"content":" responses.forEach((resp, index) \u003d\u003e this.issuesCacheManager.set(index + 1, resp));"},{"lineNumber":175,"author":{"gitId":"-"},"content":" return !isCached;"},{"lineNumber":176,"author":{"gitId":"-"},"content":" })"},{"lineNumber":177,"author":{"gitId":"-"},"content":" );"},{"lineNumber":178,"author":{"gitId":"-"},"content":" }"},{"lineNumber":179,"author":{"gitId":"-"},"content":""},{"lineNumber":180,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":181,"author":{"gitId":"-"},"content":" * Checks if the specified repository exists."},{"lineNumber":182,"author":{"gitId":"-"},"content":" * @param owner - Owner of Specified Repository."},{"lineNumber":183,"author":{"gitId":"-"},"content":" * @param repo - Name of Repository."},{"lineNumber":184,"author":{"gitId":"-"},"content":" */"},{"lineNumber":185,"author":{"gitId":"-"},"content":" isRepositoryPresent(owner: string, repo: string): Observable\u003cboolean\u003e {"},{"lineNumber":186,"author":{"gitId":"-"},"content":" return from(octokit.repos.get({ owner: owner, repo: repo, headers: GithubService.IF_NONE_MATCH_EMPTY })).pipe("},{"lineNumber":187,"author":{"gitId":"-"},"content":" map((rawData: { status: number }) \u003d\u003e {"},{"lineNumber":188,"author":{"gitId":"-"},"content":" return rawData.status !\u003d\u003d ERRORCODE_NOT_FOUND;"},{"lineNumber":189,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":190,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e {"},{"lineNumber":191,"author":{"gitId":"-"},"content":" return of(false);"},{"lineNumber":192,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":193,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(\u0027Failed to fetch repo data.\u0027))"},{"lineNumber":194,"author":{"gitId":"-"},"content":" );"},{"lineNumber":195,"author":{"gitId":"-"},"content":" }"},{"lineNumber":196,"author":{"gitId":"-"},"content":""},{"lineNumber":197,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":198,"author":{"gitId":"-"},"content":" * Creates a repository in for the authenticated user location."},{"lineNumber":199,"author":{"gitId":"-"},"content":" * @param name - Name of Repo to create."},{"lineNumber":200,"author":{"gitId":"-"},"content":" * @return Observable\u003cboolean\u003e - That returns true if the repository has been successfully"},{"lineNumber":201,"author":{"gitId":"-"},"content":" * created."},{"lineNumber":202,"author":{"gitId":"-"},"content":" */"},{"lineNumber":203,"author":{"gitId":"-"},"content":" createRepository(name: string): void {"},{"lineNumber":204,"author":{"gitId":"-"},"content":" octokit.repos.createForAuthenticatedUser({ name: name });"},{"lineNumber":205,"author":{"gitId":"-"},"content":" }"},{"lineNumber":206,"author":{"gitId":"-"},"content":""},{"lineNumber":207,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":208,"author":{"gitId":"nknguyenhc"},"content":" * Creates the `main` branch for the current repository."},{"lineNumber":209,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":210,"author":{"gitId":"nknguyenhc"},"content":" createBranch() {"},{"lineNumber":211,"author":{"gitId":"nknguyenhc"},"content":" return this.getDefaultBranch().pipe("},{"lineNumber":212,"author":{"gitId":"nknguyenhc"},"content":" mergeMap((res) \u003d\u003e this.getBranchHeadInfo(res)),"},{"lineNumber":213,"author":{"gitId":"nknguyenhc"},"content":" map((res) \u003d\u003e res.data.object.sha),"},{"lineNumber":214,"author":{"gitId":"nknguyenhc"},"content":" mergeMap((sha: string) \u003d\u003e this.createBranchFromCommit(sha)),"},{"lineNumber":215,"author":{"gitId":"nknguyenhc"},"content":" mergeMap(() \u003d\u003e this.isMainBranchPresent()),"},{"lineNumber":216,"author":{"gitId":"nknguyenhc"},"content":" throwIfFalse("},{"lineNumber":217,"author":{"gitId":"nknguyenhc"},"content":" (isBranchPresent: boolean) \u003d\u003e isBranchPresent,"},{"lineNumber":218,"author":{"gitId":"nknguyenhc"},"content":" () \u003d\u003e new Error(BRANCH_CREATION_FAILED)"},{"lineNumber":219,"author":{"gitId":"nknguyenhc"},"content":" )"},{"lineNumber":220,"author":{"gitId":"nknguyenhc"},"content":" );"},{"lineNumber":221,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":222,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":223,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":224,"author":{"gitId":"nknguyenhc"},"content":" * Creates the `main` branch for the current repository,"},{"lineNumber":225,"author":{"gitId":"nknguyenhc"},"content":" * from the commit with the given SHA."},{"lineNumber":226,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":227,"author":{"gitId":"nknguyenhc"},"content":" createBranchFromCommit(commitSha: string) {"},{"lineNumber":228,"author":{"gitId":"nknguyenhc"},"content":" return from("},{"lineNumber":229,"author":{"gitId":"nknguyenhc"},"content":" octokit.git.createRef({"},{"lineNumber":230,"author":{"gitId":"nknguyenhc"},"content":" owner: ORG_NAME,"},{"lineNumber":231,"author":{"gitId":"nknguyenhc"},"content":" repo: REPO,"},{"lineNumber":232,"author":{"gitId":"nknguyenhc"},"content":" ref: `refs/heads/${BRANCH}`,"},{"lineNumber":233,"author":{"gitId":"nknguyenhc"},"content":" sha: commitSha"},{"lineNumber":234,"author":{"gitId":"nknguyenhc"},"content":" })"},{"lineNumber":235,"author":{"gitId":"nknguyenhc"},"content":" );"},{"lineNumber":236,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":237,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":238,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":239,"author":{"gitId":"nknguyenhc"},"content":" * Get the default branch of the specified repository."},{"lineNumber":240,"author":{"gitId":"nknguyenhc"},"content":" * @param owner The owner of the repository."},{"lineNumber":241,"author":{"gitId":"nknguyenhc"},"content":" * @param repo The name of the repository."},{"lineNumber":242,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":243,"author":{"gitId":"nknguyenhc"},"content":" getDefaultBranch(): Observable\u003cstring\u003e {"},{"lineNumber":244,"author":{"gitId":"nknguyenhc"},"content":" return from("},{"lineNumber":245,"author":{"gitId":"nknguyenhc"},"content":" octokit.repos.get({"},{"lineNumber":246,"author":{"gitId":"nknguyenhc"},"content":" owner: ORG_NAME,"},{"lineNumber":247,"author":{"gitId":"nknguyenhc"},"content":" repo: REPO"},{"lineNumber":248,"author":{"gitId":"nknguyenhc"},"content":" })"},{"lineNumber":249,"author":{"gitId":"nknguyenhc"},"content":" ).pipe(map((res: any) \u003d\u003e res.data.default_branch));"},{"lineNumber":250,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":251,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":252,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":253,"author":{"gitId":"nknguyenhc"},"content":" * Get information of the head of the given branch name,"},{"lineNumber":254,"author":{"gitId":"nknguyenhc"},"content":" * in the current repository."},{"lineNumber":255,"author":{"gitId":"nknguyenhc"},"content":" * @param branch The name of the branch."},{"lineNumber":256,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":257,"author":{"gitId":"nknguyenhc"},"content":" getBranchHeadInfo(branch: string): Observable\u003cany\u003e {"},{"lineNumber":258,"author":{"gitId":"nknguyenhc"},"content":" return from("},{"lineNumber":259,"author":{"gitId":"nknguyenhc"},"content":" octokit.git.getRef({"},{"lineNumber":260,"author":{"gitId":"nknguyenhc"},"content":" owner: ORG_NAME,"},{"lineNumber":261,"author":{"gitId":"nknguyenhc"},"content":" repo: REPO,"},{"lineNumber":262,"author":{"gitId":"nknguyenhc"},"content":" ref: `heads/${branch}`"},{"lineNumber":263,"author":{"gitId":"nknguyenhc"},"content":" })"},{"lineNumber":264,"author":{"gitId":"nknguyenhc"},"content":" );"},{"lineNumber":265,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":266,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":267,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":268,"author":{"gitId":"nknguyenhc"},"content":" * Checks if the repo already has the branch `main`."},{"lineNumber":269,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":270,"author":{"gitId":"nknguyenhc"},"content":" isMainBranchPresent(): Observable\u003cboolean\u003e {"},{"lineNumber":271,"author":{"gitId":"nknguyenhc"},"content":" return from("},{"lineNumber":272,"author":{"gitId":"nknguyenhc"},"content":" octokit.git.getRef({"},{"lineNumber":273,"author":{"gitId":"nknguyenhc"},"content":" owner: ORG_NAME,"},{"lineNumber":274,"author":{"gitId":"nknguyenhc"},"content":" repo: REPO,"},{"lineNumber":275,"author":{"gitId":"nknguyenhc"},"content":" ref: `heads/${BRANCH}`"},{"lineNumber":276,"author":{"gitId":"nknguyenhc"},"content":" })"},{"lineNumber":277,"author":{"gitId":"nknguyenhc"},"content":" ).pipe("},{"lineNumber":278,"author":{"gitId":"nknguyenhc"},"content":" map((res: any) \u003d\u003e res.status !\u003d\u003d ERRORCODE_NOT_FOUND),"},{"lineNumber":279,"author":{"gitId":"nknguyenhc"},"content":" catchError(() \u003d\u003e {"},{"lineNumber":280,"author":{"gitId":"nknguyenhc"},"content":" return of(false);"},{"lineNumber":281,"author":{"gitId":"nknguyenhc"},"content":" })"},{"lineNumber":282,"author":{"gitId":"nknguyenhc"},"content":" );"},{"lineNumber":283,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":284,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":285,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":286,"author":{"gitId":"-"},"content":" * Fetches information about an issue using GraphQL."},{"lineNumber":287,"author":{"gitId":"-"},"content":" *"},{"lineNumber":288,"author":{"gitId":"-"},"content":" * If the issue is not modified, return a `304 - Not Modified` response."},{"lineNumber":289,"author":{"gitId":"-"},"content":" *"},{"lineNumber":290,"author":{"gitId":"-"},"content":" * @param id - The issue id."},{"lineNumber":291,"author":{"gitId":"-"},"content":" * @returns Observable\u003cGithubGraphqlIssue\u003e that represents the response object."},{"lineNumber":292,"author":{"gitId":"-"},"content":" */"},{"lineNumber":293,"author":{"gitId":"-"},"content":" fetchIssueGraphql(id: number): Observable\u003cGithubGraphqlIssue\u003e {"},{"lineNumber":294,"author":{"gitId":"-"},"content":" if (this.issueQueryRefs.get(id) \u003d\u003d\u003d undefined) {"},{"lineNumber":295,"author":{"gitId":"-"},"content":" const newQueryRef \u003d this.apollo.watchQuery\u003cFetchIssueQuery\u003e({"},{"lineNumber":296,"author":{"gitId":"-"},"content":" query: FetchIssue,"},{"lineNumber":297,"author":{"gitId":"-"},"content":" variables: {"},{"lineNumber":298,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":299,"author":{"gitId":"-"},"content":" name: REPO,"},{"lineNumber":300,"author":{"gitId":"-"},"content":" issueId: id"},{"lineNumber":301,"author":{"gitId":"-"},"content":" }"},{"lineNumber":302,"author":{"gitId":"-"},"content":" });"},{"lineNumber":303,"author":{"gitId":"-"},"content":" this.issueQueryRefs.set(id, newQueryRef);"},{"lineNumber":304,"author":{"gitId":"-"},"content":" }"},{"lineNumber":305,"author":{"gitId":"-"},"content":""},{"lineNumber":306,"author":{"gitId":"-"},"content":" const queryRef \u003d this.issueQueryRefs.get(id);"},{"lineNumber":307,"author":{"gitId":"-"},"content":" return this.toFetchIssue(id).pipe("},{"lineNumber":308,"author":{"gitId":"-"},"content":" filter((toFetch) \u003d\u003e toFetch),"},{"lineNumber":309,"author":{"gitId":"-"},"content":" mergeMap(() \u003d\u003e from(queryRef.refetch())),"},{"lineNumber":310,"author":{"gitId":"-"},"content":" map((value: ApolloQueryResult\u003cFetchIssueQuery\u003e) \u003d\u003e {"},{"lineNumber":311,"author":{"gitId":"-"},"content":" return new GithubGraphqlIssue(value.data.repository.issue);"},{"lineNumber":312,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":313,"author":{"gitId":"-"},"content":" throwIfEmpty(() \u003d\u003e new HttpErrorResponse({ status: 304 }))"},{"lineNumber":314,"author":{"gitId":"-"},"content":" );"},{"lineNumber":315,"author":{"gitId":"-"},"content":" }"},{"lineNumber":316,"author":{"gitId":"-"},"content":""},{"lineNumber":317,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":318,"author":{"gitId":"-"},"content":" * Checks if the issue has been modified since the last query, and"},{"lineNumber":319,"author":{"gitId":"-"},"content":" * updates the model to reflect the last modified time."},{"lineNumber":320,"author":{"gitId":"-"},"content":" *"},{"lineNumber":321,"author":{"gitId":"-"},"content":" * @param id - The issue id."},{"lineNumber":322,"author":{"gitId":"-"},"content":" * @returns Observable\u003cboolean\u003e that returns true if the issue has been modified."},{"lineNumber":323,"author":{"gitId":"-"},"content":" */"},{"lineNumber":324,"author":{"gitId":"-"},"content":" toFetchIssue(id: number): Observable\u003cboolean\u003e {"},{"lineNumber":325,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":326,"author":{"gitId":"-"},"content":" octokit.issues.get({"},{"lineNumber":327,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":328,"author":{"gitId":"-"},"content":" repo: REPO,"},{"lineNumber":329,"author":{"gitId":"-"},"content":" issue_number: id,"},{"lineNumber":330,"author":{"gitId":"-"},"content":" headers: { \u0027If-Modified-Since\u0027: this.issuesLastModifiedManager.get(id) }"},{"lineNumber":331,"author":{"gitId":"-"},"content":" })"},{"lineNumber":332,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":333,"author":{"gitId":"-"},"content":" map((response: GithubResponse\u003cGithubIssue\u003e) \u003d\u003e {"},{"lineNumber":334,"author":{"gitId":"-"},"content":" this.issuesLastModifiedManager.set(id, response.headers[\u0027last-modified\u0027]);"},{"lineNumber":335,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":336,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":337,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(\u0027Failed to fetch issue.\u0027))"},{"lineNumber":338,"author":{"gitId":"-"},"content":" );"},{"lineNumber":339,"author":{"gitId":"-"},"content":" }"},{"lineNumber":340,"author":{"gitId":"-"},"content":""},{"lineNumber":341,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":342,"author":{"gitId":"-"},"content":" * Fetches all labels in the current repository."},{"lineNumber":343,"author":{"gitId":"-"},"content":" */"},{"lineNumber":344,"author":{"gitId":"-"},"content":" fetchAllLabels(): Observable\u003cArray\u003cGithubLabel\u003e\u003e {"},{"lineNumber":345,"author":{"gitId":"-"},"content":" const githubLabels \u003d this.fetchGraphqlList\u003cFetchLabelsQuery, GithubLabel\u003e("},{"lineNumber":346,"author":{"gitId":"-"},"content":" FetchLabels,"},{"lineNumber":347,"author":{"gitId":"-"},"content":" { owner: ORG_NAME, name: REPO },"},{"lineNumber":348,"author":{"gitId":"-"},"content":" (result) \u003d\u003e result.data.repository.labels.edges,"},{"lineNumber":349,"author":{"gitId":"-"},"content":" GithubLabel"},{"lineNumber":350,"author":{"gitId":"-"},"content":" );"},{"lineNumber":351,"author":{"gitId":"-"},"content":""},{"lineNumber":352,"author":{"gitId":"-"},"content":" return githubLabels.pipe(catchError((err) \u003d\u003e throwError(\u0027Failed to fetch labels.\u0027)));"},{"lineNumber":353,"author":{"gitId":"-"},"content":" }"},{"lineNumber":354,"author":{"gitId":"-"},"content":""},{"lineNumber":355,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":356,"author":{"gitId":"-"},"content":" * Creates a label in the current repository."},{"lineNumber":357,"author":{"gitId":"-"},"content":" * @param formattedLabelName - name of new label."},{"lineNumber":358,"author":{"gitId":"-"},"content":" * @param labelColor - colour of new label."},{"lineNumber":359,"author":{"gitId":"-"},"content":" */"},{"lineNumber":360,"author":{"gitId":"-"},"content":" createLabel(formattedLabelName: string, labelColor: string): void {"},{"lineNumber":361,"author":{"gitId":"-"},"content":" octokit.issues.createLabel({ owner: ORG_NAME, repo: REPO, name: formattedLabelName, color: labelColor });"},{"lineNumber":362,"author":{"gitId":"-"},"content":" }"},{"lineNumber":363,"author":{"gitId":"-"},"content":""},{"lineNumber":364,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":365,"author":{"gitId":"-"},"content":" * Updates a label\u0027s information in the current repository."},{"lineNumber":366,"author":{"gitId":"-"},"content":" * @param labelName - name of existing label"},{"lineNumber":367,"author":{"gitId":"-"},"content":" * @param labelColor - new color to be assigned to existing label."},{"lineNumber":368,"author":{"gitId":"-"},"content":" */"},{"lineNumber":369,"author":{"gitId":"-"},"content":" updateLabel(labelName: string, labelColor: string): void {"},{"lineNumber":370,"author":{"gitId":"-"},"content":" octokit.issues.updateLabel({ owner: ORG_NAME, repo: REPO, name: labelName, current_name: labelName, color: labelColor });"},{"lineNumber":371,"author":{"gitId":"-"},"content":" }"},{"lineNumber":372,"author":{"gitId":"-"},"content":""},{"lineNumber":373,"author":{"gitId":"-"},"content":" closeIssue(id: number): Observable\u003cGithubIssue\u003e {"},{"lineNumber":374,"author":{"gitId":"-"},"content":" return from(octokit.issues.update({ owner: ORG_NAME, repo: REPO, issue_number: id, state: \u0027closed\u0027 })).pipe("},{"lineNumber":375,"author":{"gitId":"-"},"content":" map((response: GithubResponse\u003cGithubIssue\u003e) \u003d\u003e {"},{"lineNumber":376,"author":{"gitId":"-"},"content":" this.issuesLastModifiedManager.set(id, response.headers[\u0027last-modified\u0027]);"},{"lineNumber":377,"author":{"gitId":"-"},"content":" return new GithubIssue(response.data);"},{"lineNumber":378,"author":{"gitId":"-"},"content":" })"},{"lineNumber":379,"author":{"gitId":"-"},"content":" );"},{"lineNumber":380,"author":{"gitId":"-"},"content":" }"},{"lineNumber":381,"author":{"gitId":"-"},"content":""},{"lineNumber":382,"author":{"gitId":"-"},"content":" reopenIssue(id: number): Observable\u003cGithubIssue\u003e {"},{"lineNumber":383,"author":{"gitId":"-"},"content":" return from(octokit.issues.update({ owner: ORG_NAME, repo: REPO, issue_number: id, state: \u0027open\u0027 })).pipe("},{"lineNumber":384,"author":{"gitId":"-"},"content":" map((response: GithubResponse\u003cGithubIssue\u003e) \u003d\u003e {"},{"lineNumber":385,"author":{"gitId":"-"},"content":" this.issuesLastModifiedManager.set(id, response.headers[\u0027last-modified\u0027]);"},{"lineNumber":386,"author":{"gitId":"-"},"content":" return new GithubIssue(response.data);"},{"lineNumber":387,"author":{"gitId":"-"},"content":" })"},{"lineNumber":388,"author":{"gitId":"-"},"content":" );"},{"lineNumber":389,"author":{"gitId":"-"},"content":" }"},{"lineNumber":390,"author":{"gitId":"-"},"content":""},{"lineNumber":391,"author":{"gitId":"-"},"content":" createIssue(title: string, description: string, labels: string[]): Observable\u003cGithubIssue\u003e {"},{"lineNumber":392,"author":{"gitId":"-"},"content":" return from(octokit.issues.create({ owner: ORG_NAME, repo: REPO, title: title, body: description, labels: labels })).pipe("},{"lineNumber":393,"author":{"gitId":"-"},"content":" map((response: GithubResponse\u003cGithubIssue\u003e) \u003d\u003e {"},{"lineNumber":394,"author":{"gitId":"-"},"content":" return new GithubIssue(response.data);"},{"lineNumber":395,"author":{"gitId":"-"},"content":" })"},{"lineNumber":396,"author":{"gitId":"-"},"content":" );"},{"lineNumber":397,"author":{"gitId":"-"},"content":" }"},{"lineNumber":398,"author":{"gitId":"-"},"content":""},{"lineNumber":399,"author":{"gitId":"-"},"content":" createIssueComment(issueId: number, description: string): Observable\u003cGithubComment\u003e {"},{"lineNumber":400,"author":{"gitId":"-"},"content":" return from(octokit.issues.createComment({ owner: ORG_NAME, repo: REPO, issue_number: issueId, body: description })).pipe("},{"lineNumber":401,"author":{"gitId":"-"},"content":" map((response: GithubResponse\u003cGithubComment\u003e) \u003d\u003e {"},{"lineNumber":402,"author":{"gitId":"-"},"content":" return response.data;"},{"lineNumber":403,"author":{"gitId":"-"},"content":" })"},{"lineNumber":404,"author":{"gitId":"-"},"content":" );"},{"lineNumber":405,"author":{"gitId":"-"},"content":" }"},{"lineNumber":406,"author":{"gitId":"-"},"content":""},{"lineNumber":407,"author":{"gitId":"-"},"content":" updateIssue(id: number, title: string, description: string, labels: string[], assignees?: string[]): Observable\u003cGithubIssue\u003e {"},{"lineNumber":408,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":409,"author":{"gitId":"-"},"content":" octokit.issues.update({"},{"lineNumber":410,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":411,"author":{"gitId":"-"},"content":" repo: REPO,"},{"lineNumber":412,"author":{"gitId":"-"},"content":" issue_number: id,"},{"lineNumber":413,"author":{"gitId":"-"},"content":" title: title,"},{"lineNumber":414,"author":{"gitId":"-"},"content":" body: description,"},{"lineNumber":415,"author":{"gitId":"-"},"content":" labels: labels,"},{"lineNumber":416,"author":{"gitId":"-"},"content":" assignees: assignees"},{"lineNumber":417,"author":{"gitId":"-"},"content":" })"},{"lineNumber":418,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":419,"author":{"gitId":"-"},"content":" map((response: GithubResponse\u003cGithubIssue\u003e) \u003d\u003e {"},{"lineNumber":420,"author":{"gitId":"-"},"content":" this.issuesLastModifiedManager.set(id, response.headers[\u0027last-modified\u0027]);"},{"lineNumber":421,"author":{"gitId":"-"},"content":" return new GithubIssue(response.data);"},{"lineNumber":422,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":423,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e {"},{"lineNumber":424,"author":{"gitId":"-"},"content":" return throwError(err);"},{"lineNumber":425,"author":{"gitId":"-"},"content":" })"},{"lineNumber":426,"author":{"gitId":"-"},"content":" );"},{"lineNumber":427,"author":{"gitId":"-"},"content":" }"},{"lineNumber":428,"author":{"gitId":"-"},"content":""},{"lineNumber":429,"author":{"gitId":"-"},"content":" updateIssueComment(issueComment: IssueComment): Observable\u003cGithubComment\u003e {"},{"lineNumber":430,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":431,"author":{"gitId":"-"},"content":" octokit.issues.updateComment({ owner: ORG_NAME, repo: REPO, comment_id: issueComment.id, body: issueComment.description })"},{"lineNumber":432,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":433,"author":{"gitId":"-"},"content":" map((response: GithubResponse\u003cGithubComment\u003e) \u003d\u003e {"},{"lineNumber":434,"author":{"gitId":"-"},"content":" return response.data;"},{"lineNumber":435,"author":{"gitId":"-"},"content":" })"},{"lineNumber":436,"author":{"gitId":"-"},"content":" );"},{"lineNumber":437,"author":{"gitId":"-"},"content":" }"},{"lineNumber":438,"author":{"gitId":"-"},"content":""},{"lineNumber":439,"author":{"gitId":"-"},"content":" uploadFile(filename: string, base64String: string): Observable\u003cany\u003e {"},{"lineNumber":440,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":441,"author":{"gitId":"-"},"content":" octokit.repos.createOrUpdateFile({"},{"lineNumber":442,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":443,"author":{"gitId":"-"},"content":" repo: REPO,"},{"lineNumber":444,"author":{"gitId":"nknguyenhc"},"content":" branch: BRANCH,"},{"lineNumber":445,"author":{"gitId":"-"},"content":" path: `files/${filename}`,"},{"lineNumber":446,"author":{"gitId":"-"},"content":" message: \u0027upload file\u0027,"},{"lineNumber":447,"author":{"gitId":"-"},"content":" content: base64String"},{"lineNumber":448,"author":{"gitId":"-"},"content":" })"},{"lineNumber":449,"author":{"gitId":"-"},"content":" );"},{"lineNumber":450,"author":{"gitId":"-"},"content":" }"},{"lineNumber":451,"author":{"gitId":"-"},"content":""},{"lineNumber":452,"author":{"gitId":"-"},"content":" fetchEventsForRepo(): Observable\u003cany[]\u003e {"},{"lineNumber":453,"author":{"gitId":"-"},"content":" return from(octokit.issues.listEventsForRepo({ owner: ORG_NAME, repo: REPO, headers: GithubService.IF_NONE_MATCH_EMPTY })).pipe("},{"lineNumber":454,"author":{"gitId":"-"},"content":" map((response) \u003d\u003e {"},{"lineNumber":455,"author":{"gitId":"-"},"content":" return response[\u0027data\u0027];"},{"lineNumber":456,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":457,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(\u0027Failed to fetch events for repo.\u0027))"},{"lineNumber":458,"author":{"gitId":"-"},"content":" );"},{"lineNumber":459,"author":{"gitId":"-"},"content":" }"},{"lineNumber":460,"author":{"gitId":"-"},"content":""},{"lineNumber":461,"author":{"gitId":"-"},"content":" fetchDataFile(): Observable\u003c{}\u003e {"},{"lineNumber":462,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":463,"author":{"gitId":"-"},"content":" octokit.repos.getContents({ owner: MOD_ORG, repo: DATA_REPO, path: \u0027data.csv\u0027, headers: GithubService.IF_NONE_MATCH_EMPTY })"},{"lineNumber":464,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":465,"author":{"gitId":"-"},"content":" map((rawData) \u003d\u003e {"},{"lineNumber":466,"author":{"gitId":"-"},"content":" return { data: atob(rawData[\u0027data\u0027][\u0027content\u0027]) };"},{"lineNumber":467,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":468,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(\u0027Failed to fetch data file.\u0027))"},{"lineNumber":469,"author":{"gitId":"-"},"content":" );"},{"lineNumber":470,"author":{"gitId":"-"},"content":" }"},{"lineNumber":471,"author":{"gitId":"-"},"content":""},{"lineNumber":472,"author":{"gitId":"-"},"content":" fetchLatestRelease(): Observable\u003cGithubRelease\u003e {"},{"lineNumber":473,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":474,"author":{"gitId":"-"},"content":" octokit.repos.getLatestRelease({ owner: CATCHER_ORG, repo: CATCHER_REPO, headers: GithubService.IF_NONE_MATCH_EMPTY })"},{"lineNumber":475,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":476,"author":{"gitId":"-"},"content":" map((res) \u003d\u003e res[\u0027data\u0027]),"},{"lineNumber":477,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(\u0027Failed to fetch latest release.\u0027))"},{"lineNumber":478,"author":{"gitId":"-"},"content":" );"},{"lineNumber":479,"author":{"gitId":"-"},"content":" }"},{"lineNumber":480,"author":{"gitId":"-"},"content":""},{"lineNumber":481,"author":{"gitId":"-"},"content":" private fetchSettingsFromRawUrl(): Observable\u003cSessionData\u003e {"},{"lineNumber":482,"author":{"gitId":"-"},"content":" return from(fetch(getSettingsUrl(MOD_ORG, DATA_REPO))).pipe("},{"lineNumber":483,"author":{"gitId":"-"},"content":" mergeMap((res) \u003d\u003e res.json()),"},{"lineNumber":484,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(\u0027Failed to fetch settings file.\u0027))"},{"lineNumber":485,"author":{"gitId":"-"},"content":" );"},{"lineNumber":486,"author":{"gitId":"-"},"content":" }"},{"lineNumber":487,"author":{"gitId":"-"},"content":""},{"lineNumber":488,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":489,"author":{"gitId":"-"},"content":" * Fetches the data file that is regulates session information."},{"lineNumber":490,"author":{"gitId":"-"},"content":" * @return Observable\u003cSessionData\u003e representing session information."},{"lineNumber":491,"author":{"gitId":"-"},"content":" */"},{"lineNumber":492,"author":{"gitId":"-"},"content":" fetchSettingsFile(): Observable\u003cSessionData\u003e {"},{"lineNumber":493,"author":{"gitId":"-"},"content":" return from("},{"lineNumber":494,"author":{"gitId":"-"},"content":" octokit.repos.getContents({ owner: MOD_ORG, repo: DATA_REPO, path: \u0027settings.json\u0027, headers: GithubService.IF_NONE_MATCH_EMPTY })"},{"lineNumber":495,"author":{"gitId":"-"},"content":" ).pipe("},{"lineNumber":496,"author":{"gitId":"-"},"content":" map((rawData) \u003d\u003e JSON.parse(atob(rawData[\u0027data\u0027][\u0027content\u0027]))),"},{"lineNumber":497,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e {"},{"lineNumber":498,"author":{"gitId":"-"},"content":" this.logger.error("},{"lineNumber":499,"author":{"gitId":"-"},"content":" \u0027GithubService: Failed to fetch settings file via REST API. Trying to fetch using raw.githubusercontent.com: \u0027,"},{"lineNumber":500,"author":{"gitId":"-"},"content":" err"},{"lineNumber":501,"author":{"gitId":"-"},"content":" );"},{"lineNumber":502,"author":{"gitId":"-"},"content":" return this.fetchSettingsFromRawUrl();"},{"lineNumber":503,"author":{"gitId":"-"},"content":" })"},{"lineNumber":504,"author":{"gitId":"-"},"content":" );"},{"lineNumber":505,"author":{"gitId":"-"},"content":" }"},{"lineNumber":506,"author":{"gitId":"-"},"content":""},{"lineNumber":507,"author":{"gitId":"-"},"content":" fetchAuthenticatedUser(): Observable\u003cGithubUser\u003e {"},{"lineNumber":508,"author":{"gitId":"-"},"content":" return from(octokit.users.getAuthenticated()).pipe("},{"lineNumber":509,"author":{"gitId":"-"},"content":" map((response) \u003d\u003e {"},{"lineNumber":510,"author":{"gitId":"-"},"content":" return response[\u0027data\u0027];"},{"lineNumber":511,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":512,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e throwError(\u0027Failed to fetch authenticated user.\u0027))"},{"lineNumber":513,"author":{"gitId":"-"},"content":" );"},{"lineNumber":514,"author":{"gitId":"-"},"content":" }"},{"lineNumber":515,"author":{"gitId":"-"},"content":""},{"lineNumber":516,"author":{"gitId":"-"},"content":" getRepoURL(): string {"},{"lineNumber":517,"author":{"gitId":"-"},"content":" return ORG_NAME.concat(\u0027/\u0027).concat(REPO);"},{"lineNumber":518,"author":{"gitId":"-"},"content":" }"},{"lineNumber":519,"author":{"gitId":"-"},"content":""},{"lineNumber":520,"author":{"gitId":"-"},"content":" viewIssueInBrowser(id: number, event: Event) {"},{"lineNumber":521,"author":{"gitId":"-"},"content":" if (id) {"},{"lineNumber":522,"author":{"gitId":"-"},"content":" window.open(\u0027https://github.com/\u0027.concat(this.getRepoURL()).concat(\u0027/issues/\u0027).concat(String(id)));"},{"lineNumber":523,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":524,"author":{"gitId":"-"},"content":" this.errorHandlingService.handleError(new Error(UNABLE_TO_OPEN_IN_BROWSER));"},{"lineNumber":525,"author":{"gitId":"-"},"content":" }"},{"lineNumber":526,"author":{"gitId":"-"},"content":" event.stopPropagation();"},{"lineNumber":527,"author":{"gitId":"-"},"content":" }"},{"lineNumber":528,"author":{"gitId":"-"},"content":""},{"lineNumber":529,"author":{"gitId":"-"},"content":" reset(): void {"},{"lineNumber":530,"author":{"gitId":"-"},"content":" this.logger.info(`GithubService: Resetting issues cache`);"},{"lineNumber":531,"author":{"gitId":"-"},"content":" this.issuesCacheManager.clear();"},{"lineNumber":532,"author":{"gitId":"-"},"content":" this.issuesLastModifiedManager.clear();"},{"lineNumber":533,"author":{"gitId":"-"},"content":" this.issueQueryRefs.clear();"},{"lineNumber":534,"author":{"gitId":"-"},"content":" }"},{"lineNumber":535,"author":{"gitId":"-"},"content":""},{"lineNumber":536,"author":{"gitId":"-"},"content":" getProfilesData(): Promise\u003cResponse\u003e {"},{"lineNumber":537,"author":{"gitId":"-"},"content":" return fetch(AppConfig.clientDataUrl);"},{"lineNumber":538,"author":{"gitId":"-"},"content":" }"},{"lineNumber":539,"author":{"gitId":"-"},"content":""},{"lineNumber":540,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":541,"author":{"gitId":"-"},"content":" * Performs an API call to fetch a page of filtered issues with a given pageNumber."},{"lineNumber":542,"author":{"gitId":"-"},"content":" *"},{"lineNumber":543,"author":{"gitId":"-"},"content":" * The request is sent with the ETag of the latest cached HTTP response."},{"lineNumber":544,"author":{"gitId":"-"},"content":" * If page requested has the same ETag, or the request results in an error,"},{"lineNumber":545,"author":{"gitId":"-"},"content":" * then the cached page is returned instead."},{"lineNumber":546,"author":{"gitId":"-"},"content":" *"},{"lineNumber":547,"author":{"gitId":"-"},"content":" * @param filter - The issue filter"},{"lineNumber":548,"author":{"gitId":"-"},"content":" * @param pageNumber - The page to be fetched"},{"lineNumber":549,"author":{"gitId":"-"},"content":" * @returns An observable representing the response containing a single page of filtered issues"},{"lineNumber":550,"author":{"gitId":"-"},"content":" */"},{"lineNumber":551,"author":{"gitId":"-"},"content":" private getIssuesAPICall(filter: RestGithubIssueFilter, pageNumber: number): Observable\u003cGithubResponse\u003cGithubIssue[]\u003e\u003e {"},{"lineNumber":552,"author":{"gitId":"-"},"content":" const apiCall: Promise\u003cGithubResponse\u003cGithubIssue[]\u003e\u003e \u003d octokit.issues.listForRepo({"},{"lineNumber":553,"author":{"gitId":"-"},"content":" ...filter,"},{"lineNumber":554,"author":{"gitId":"-"},"content":" owner: ORG_NAME,"},{"lineNumber":555,"author":{"gitId":"-"},"content":" repo: REPO,"},{"lineNumber":556,"author":{"gitId":"-"},"content":" sort: \u0027created\u0027,"},{"lineNumber":557,"author":{"gitId":"-"},"content":" direction: \u0027desc\u0027,"},{"lineNumber":558,"author":{"gitId":"-"},"content":" per_page: MAX_ITEMS_PER_PAGE,"},{"lineNumber":559,"author":{"gitId":"-"},"content":" page: pageNumber,"},{"lineNumber":560,"author":{"gitId":"-"},"content":" headers: { \u0027If-None-Match\u0027: this.issuesCacheManager.getEtagFor(pageNumber) }"},{"lineNumber":561,"author":{"gitId":"-"},"content":" });"},{"lineNumber":562,"author":{"gitId":"-"},"content":" const apiCall$ \u003d from(apiCall);"},{"lineNumber":563,"author":{"gitId":"-"},"content":" return apiCall$.pipe("},{"lineNumber":564,"author":{"gitId":"-"},"content":" catchError((err) \u003d\u003e {"},{"lineNumber":565,"author":{"gitId":"-"},"content":" return of(this.issuesCacheManager.get(pageNumber));"},{"lineNumber":566,"author":{"gitId":"-"},"content":" })"},{"lineNumber":567,"author":{"gitId":"-"},"content":" );"},{"lineNumber":568,"author":{"gitId":"-"},"content":" }"},{"lineNumber":569,"author":{"gitId":"-"},"content":""},{"lineNumber":570,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":571,"author":{"gitId":"-"},"content":" * Fetches a list of items using a GraphQL query that queries for paginated data."},{"lineNumber":572,"author":{"gitId":"-"},"content":" *"},{"lineNumber":573,"author":{"gitId":"-"},"content":" * @param query - The GraphQL query that queries for paginated data."},{"lineNumber":574,"author":{"gitId":"-"},"content":" * @param variables - Additional variables for the GraphQL query."},{"lineNumber":575,"author":{"gitId":"-"},"content":" * @callback pluckEdges A function that returns a list of edges in a ApolloQueryResult."},{"lineNumber":576,"author":{"gitId":"-"},"content":" * @callback Model Constructor for the item model."},{"lineNumber":577,"author":{"gitId":"-"},"content":" * @returns A list of items from the query."},{"lineNumber":578,"author":{"gitId":"-"},"content":" */"},{"lineNumber":579,"author":{"gitId":"-"},"content":" private fetchGraphqlList\u003cT, M\u003e("},{"lineNumber":580,"author":{"gitId":"-"},"content":" query: DocumentNode,"},{"lineNumber":581,"author":{"gitId":"-"},"content":" variables: {},"},{"lineNumber":582,"author":{"gitId":"-"},"content":" pluckEdges: (results: ApolloQueryResult\u003cT\u003e) \u003d\u003e Array\u003cany\u003e,"},{"lineNumber":583,"author":{"gitId":"-"},"content":" Model: new (data) \u003d\u003e M"},{"lineNumber":584,"author":{"gitId":"-"},"content":" ): Observable\u003cArray\u003cM\u003e\u003e {"},{"lineNumber":585,"author":{"gitId":"-"},"content":" return from(this.withPagination\u003cT\u003e(pluckEdges)(query, variables)).pipe("},{"lineNumber":586,"author":{"gitId":"-"},"content":" map((results: Array\u003cApolloQueryResult\u003cT\u003e\u003e) \u003d\u003e {"},{"lineNumber":587,"author":{"gitId":"-"},"content":" const issues \u003d results.reduce((accumulated, current) \u003d\u003e accumulated.concat(pluckEdges(current)), []);"},{"lineNumber":588,"author":{"gitId":"-"},"content":" return issues.map((issue) \u003d\u003e new Model(issue.node));"},{"lineNumber":589,"author":{"gitId":"-"},"content":" }),"},{"lineNumber":590,"author":{"gitId":"-"},"content":" throwIfEmpty(() \u003d\u003e {"},{"lineNumber":591,"author":{"gitId":"-"},"content":" return new HttpErrorResponse({ status: 304 });"},{"lineNumber":592,"author":{"gitId":"-"},"content":" })"},{"lineNumber":593,"author":{"gitId":"-"},"content":" );"},{"lineNumber":594,"author":{"gitId":"-"},"content":" }"},{"lineNumber":595,"author":{"gitId":"-"},"content":""},{"lineNumber":596,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":597,"author":{"gitId":"-"},"content":" * Returns an async function that will accept a GraphQL query that requests for paginated items."},{"lineNumber":598,"author":{"gitId":"-"},"content":" * Said function will recursively query for all subsequent pages until a page that has less than 100 items is found,"},{"lineNumber":599,"author":{"gitId":"-"},"content":" * then return all queried pages in an array."},{"lineNumber":600,"author":{"gitId":"-"},"content":" *"},{"lineNumber":601,"author":{"gitId":"-"},"content":" * @callback pluckEdges - A function that returns a list of edges in a ApolloQueryResult."},{"lineNumber":602,"author":{"gitId":"-"},"content":" * @returns an async function that accepts a GraphQL query for paginated data and any additional variables to that query"},{"lineNumber":603,"author":{"gitId":"-"},"content":" */"},{"lineNumber":604,"author":{"gitId":"-"},"content":" private withPagination\u003cT\u003e(pluckEdges: (results: ApolloQueryResult\u003cT\u003e) \u003d\u003e Array\u003cany\u003e) {"},{"lineNumber":605,"author":{"gitId":"-"},"content":" return async (query: DocumentNode, variables: { [key: string]: any } \u003d {}): Promise\u003cArray\u003cApolloQueryResult\u003cT\u003e\u003e\u003e \u003d\u003e {"},{"lineNumber":606,"author":{"gitId":"-"},"content":" const cursor \u003d variables.cursor || null;"},{"lineNumber":607,"author":{"gitId":"-"},"content":" const graphqlQuery \u003d this.apollo.watchQuery\u003cT\u003e({ query, variables: { ...variables, cursor } });"},{"lineNumber":608,"author":{"gitId":"-"},"content":" return graphqlQuery.refetch().then(async (results: ApolloQueryResult\u003cT\u003e) \u003d\u003e {"},{"lineNumber":609,"author":{"gitId":"-"},"content":" const intermediate \u003d Array.isArray(results) ? results : [results];"},{"lineNumber":610,"author":{"gitId":"-"},"content":" const edges \u003d pluckEdges(results);"},{"lineNumber":611,"author":{"gitId":"-"},"content":" const nextCursor \u003d edges.length \u003d\u003d\u003d 0 ? null : edges[edges.length - 1].cursor;"},{"lineNumber":612,"author":{"gitId":"-"},"content":""},{"lineNumber":613,"author":{"gitId":"-"},"content":" if (edges.length \u003c MAX_ITEMS_PER_PAGE || !nextCursor) {"},{"lineNumber":614,"author":{"gitId":"-"},"content":" return intermediate;"},{"lineNumber":615,"author":{"gitId":"-"},"content":" }"},{"lineNumber":616,"author":{"gitId":"-"},"content":" const nextResults \u003d await this.withPagination\u003cT\u003e(pluckEdges)(query, {"},{"lineNumber":617,"author":{"gitId":"-"},"content":" ...variables,"},{"lineNumber":618,"author":{"gitId":"-"},"content":" cursor: nextCursor"},{"lineNumber":619,"author":{"gitId":"-"},"content":" });"},{"lineNumber":620,"author":{"gitId":"-"},"content":" return intermediate.concat(nextResults);"},{"lineNumber":621,"author":{"gitId":"-"},"content":" });"},{"lineNumber":622,"author":{"gitId":"-"},"content":" };"},{"lineNumber":623,"author":{"gitId":"-"},"content":" }"},{"lineNumber":624,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":82,"-":542}},{"path":"src/app/core/services/issue-table-settings.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"Arif-Khalid"},"content":"import { Injectable } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"Arif-Khalid"},"content":"import { TableSettings } from \u0027../models/table-settings.model\u0027;"},{"lineNumber":3,"author":{"gitId":"Arif-Khalid"},"content":"@Injectable({"},{"lineNumber":4,"author":{"gitId":"Arif-Khalid"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":5,"author":{"gitId":"Arif-Khalid"},"content":"})"},{"lineNumber":6,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":7,"author":{"gitId":"Arif-Khalid"},"content":"/**"},{"lineNumber":8,"author":{"gitId":"Arif-Khalid"},"content":" * Responsible for storing and retrieving the table settings for issue tables created"},{"lineNumber":9,"author":{"gitId":"Arif-Khalid"},"content":" * Map is required since there can be multiple tables within the same page"},{"lineNumber":10,"author":{"gitId":"Arif-Khalid"},"content":" */"},{"lineNumber":11,"author":{"gitId":"Arif-Khalid"},"content":"export class IssueTableSettingsService {"},{"lineNumber":12,"author":{"gitId":"Arif-Khalid"},"content":" private _tableSettingsMap: { [index: string]: TableSettings } \u003d {};"},{"lineNumber":13,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":14,"author":{"gitId":"Arif-Khalid"},"content":" public getTableSettings(tableName: string): TableSettings {"},{"lineNumber":15,"author":{"gitId":"Arif-Khalid"},"content":" return this._tableSettingsMap[tableName] || new TableSettings();"},{"lineNumber":16,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":17,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":18,"author":{"gitId":"Arif-Khalid"},"content":" public setTableSettings(tableName: string, tableSettings: TableSettings): void {"},{"lineNumber":19,"author":{"gitId":"Arif-Khalid"},"content":" this._tableSettingsMap[tableName] \u003d tableSettings;"},{"lineNumber":20,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":21,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":22,"author":{"gitId":"Arif-Khalid"},"content":" public clearTableSettings(): void {"},{"lineNumber":23,"author":{"gitId":"Arif-Khalid"},"content":" this._tableSettingsMap \u003d {};"},{"lineNumber":24,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":25,"author":{"gitId":"Arif-Khalid"},"content":"}"}],"authorContributionMap":{"Arif-Khalid":25}},{"path":"src/app/core/services/upload.service.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Injectable } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"nknguyenhc"},"content":"import { of, throwError } from \u0027rxjs\u0027;"},{"lineNumber":3,"author":{"gitId":"nknguyenhc"},"content":"import { catchError, mergeMap } from \u0027rxjs/operators\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { uuid } from \u0027../../shared/lib/uuid\u0027;"},{"lineNumber":5,"author":{"gitId":"nknguyenhc"},"content":"import { ERRORCODE_NOT_FOUND } from \u0027./error-handling.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027./github.service\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":"const SUPPORTED_VIDEO_FILE_TYPES \u003d [\u0027mp4\u0027, \u0027mov\u0027];"},{"lineNumber":9,"author":{"gitId":"-"},"content":"export const SUPPORTED_FILE_TYPES \u003d ["},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u0027gif\u0027,"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u0027jpeg\u0027,"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u0027jpg\u0027,"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u0027png\u0027,"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u0027docx\u0027,"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u0027gz\u0027,"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u0027log\u0027,"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u0027pdf\u0027,"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u0027pptx\u0027,"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u0027txt\u0027,"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u0027xlsx\u0027,"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u0027zip\u0027,"},{"lineNumber":22,"author":{"gitId":"-"},"content":" ...SUPPORTED_VIDEO_FILE_TYPES"},{"lineNumber":23,"author":{"gitId":"-"},"content":"];"},{"lineNumber":24,"author":{"gitId":"-"},"content":"export const FILE_TYPE_SUPPORT_ERROR \u003d \"We don\u0027t support that file type.\" + \u0027 Try again with \u0027 + SUPPORTED_FILE_TYPES.join(\u0027, \u0027) + \u0027.\u0027;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Returns an error message string for when file exceeds the defined size limit"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * @param fileType Canonical name for file, not to be confused with file extension"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * @param size Number of MBs"},{"lineNumber":29,"author":{"gitId":"-"},"content":" */"},{"lineNumber":30,"author":{"gitId":"-"},"content":"export const getSizeExceedErrorMsg \u003d (fileType: string, size: number): string \u003d\u003e `Oops, ${fileType} is too big. Keep it under ${size}MiB.`;"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":"@Injectable({"},{"lineNumber":33,"author":{"gitId":"-"},"content":" providedIn: \u0027root\u0027"},{"lineNumber":34,"author":{"gitId":"-"},"content":"})"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Responsible for upload of media files to the current phase\u0027s repository."},{"lineNumber":38,"author":{"gitId":"-"},"content":" */"},{"lineNumber":39,"author":{"gitId":"-"},"content":"export class UploadService {"},{"lineNumber":40,"author":{"gitId":"-"},"content":" constructor(private githubService: GithubService) {}"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":" uploadFile(base64File: string | ArrayBuffer, userFilename: string) {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" let base64String: string;"},{"lineNumber":44,"author":{"gitId":"-"},"content":" if (base64File instanceof ArrayBuffer) {"},{"lineNumber":45,"author":{"gitId":"-"},"content":" base64String \u003d String.fromCharCode.apply(null, new Uint16Array(base64File));"},{"lineNumber":46,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":47,"author":{"gitId":"-"},"content":" base64String \u003d base64File;"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }"},{"lineNumber":49,"author":{"gitId":"-"},"content":" const fileType \u003d this.getFileExtension(userFilename);"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"-"},"content":" if (SUPPORTED_FILE_TYPES.includes(fileType.toLowerCase())) {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" base64String \u003d base64String.split(\u0027,\u0027)[1];"},{"lineNumber":53,"author":{"gitId":"-"},"content":" const onlineFilename \u003d uuid();"},{"lineNumber":54,"author":{"gitId":"nknguyenhc"},"content":" const attemptUploadFile \u003d () \u003d\u003e this.githubService.uploadFile(`${onlineFilename}.${fileType}`, base64String);"},{"lineNumber":55,"author":{"gitId":"nknguyenhc"},"content":" return attemptUploadFile().pipe("},{"lineNumber":56,"author":{"gitId":"nknguyenhc"},"content":" catchError((err: any) \u003d\u003e {"},{"lineNumber":57,"author":{"gitId":"nknguyenhc"},"content":" if (!(err.status \u003d\u003d\u003d ERRORCODE_NOT_FOUND)) {"},{"lineNumber":58,"author":{"gitId":"nknguyenhc"},"content":" return throwError(err);"},{"lineNumber":59,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":60,"author":{"gitId":"nknguyenhc"},"content":" return of(false);"},{"lineNumber":61,"author":{"gitId":"nknguyenhc"},"content":" }),"},{"lineNumber":62,"author":{"gitId":"nknguyenhc"},"content":" mergeMap((isBranchPresent) \u003d\u003e {"},{"lineNumber":63,"author":{"gitId":"nknguyenhc"},"content":" if (isBranchPresent) {"},{"lineNumber":64,"author":{"gitId":"nknguyenhc"},"content":" return of(isBranchPresent);"},{"lineNumber":65,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":66,"author":{"gitId":"nknguyenhc"},"content":" return this.githubService.createBranch().pipe(mergeMap(attemptUploadFile));"},{"lineNumber":67,"author":{"gitId":"nknguyenhc"},"content":" })"},{"lineNumber":68,"author":{"gitId":"nknguyenhc"},"content":" );"},{"lineNumber":69,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return throwError(FILE_TYPE_SUPPORT_ERROR);"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }"},{"lineNumber":73,"author":{"gitId":"-"},"content":""},{"lineNumber":74,"author":{"gitId":"-"},"content":" getFileExtension(fileName: string): string {"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return fileName.split(\u0027.\u0027).pop();"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }"},{"lineNumber":77,"author":{"gitId":"-"},"content":""},{"lineNumber":78,"author":{"gitId":"-"},"content":" isVideoFile(fileName): boolean {"},{"lineNumber":79,"author":{"gitId":"-"},"content":" const fileType \u003d this.getFileExtension(fileName);"},{"lineNumber":80,"author":{"gitId":"-"},"content":" return SUPPORTED_VIDEO_FILE_TYPES.includes(fileType.toLowerCase());"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }"},{"lineNumber":82,"author":{"gitId":"-"},"content":""},{"lineNumber":83,"author":{"gitId":"-"},"content":" isSupportedFileType(fileName): boolean {"},{"lineNumber":84,"author":{"gitId":"-"},"content":" const fileType \u003d this.getFileExtension(fileName);"},{"lineNumber":85,"author":{"gitId":"-"},"content":" return SUPPORTED_FILE_TYPES.includes(fileType.toLowerCase());"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }"},{"lineNumber":87,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":18,"-":69}},{"path":"src/app/core/validators/noWhitespace.validator.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"MadLamprey"},"content":"import { AbstractControl, ValidationErrors, ValidatorFn } from \u0027@angular/forms\u0027;"},{"lineNumber":2,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":3,"author":{"gitId":"MadLamprey"},"content":"export function noWhitespace(): ValidatorFn {"},{"lineNumber":4,"author":{"gitId":"MadLamprey"},"content":" return (title: AbstractControl): ValidationErrors | null \u003d\u003e {"},{"lineNumber":5,"author":{"gitId":"MadLamprey"},"content":" if (title.value \u0026\u0026 title.value.trim() \u003d\u003d\u003d \u0027\u0027) {"},{"lineNumber":6,"author":{"gitId":"MadLamprey"},"content":" return { whitespace: true };"},{"lineNumber":7,"author":{"gitId":"MadLamprey"},"content":" }"},{"lineNumber":8,"author":{"gitId":"MadLamprey"},"content":" return null;"},{"lineNumber":9,"author":{"gitId":"MadLamprey"},"content":" };"},{"lineNumber":10,"author":{"gitId":"MadLamprey"},"content":"}"}],"authorContributionMap":{"MadLamprey":10}},{"path":"src/app/phase-bug-reporting/new-issue/new-issue.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003ch1 class\u003d\"mat-display-1 title\"\u003eNew Issue\u003c/h1\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003cform [formGroup]\u003d\"newIssueForm\" #myForm\u003d\"ngForm\" (ngSubmit)\u003d\"submitNewIssue(myForm)\"\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"form\"\u003e"},{"lineNumber":5,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"row\"\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"column left\"\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003cmat-form-field\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cinput id\u003d\"title\" formControlName\u003d\"title\" matInput placeholder\u003d\"Title\" required maxlength\u003d\"256\" /\u003e"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cmat-error *ngIf\u003d\"title.errors \u0026\u0026 title.errors[\u0027required\u0027] \u0026\u0026 (title.touched || title.dirty)\"\u003e Title required. \u003c/mat-error\u003e"},{"lineNumber":10,"author":{"gitId":"MadLamprey"},"content":" \u003cmat-error *ngIf\u003d\"title.errors \u0026\u0026 title.errors[\u0027whitespace\u0027]\"\u003e Title cannot contain only whitespaces. \u003c/mat-error\u003e"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cmat-error *ngIf\u003d\"title.errors \u0026\u0026 title.errors[\u0027maxlength\u0027]\"\u003e Title cannot exceed 256 characters. \u003c/mat-error\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cmat-hint *ngIf\u003d\"title.value?.length \u003e\u003d 206\"\u003e {{ 256 - title.value?.length }} characters remaining. \u003c/mat-hint\u003e"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":""},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cdiv style\u003d\"margin: 10px 0 10px 0\"\u003e"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003capp-comment-editor"},{"lineNumber":17,"author":{"gitId":"-"},"content":" [id]\u003d\"\u0027description\u0027\""},{"lineNumber":18,"author":{"gitId":"-"},"content":" [commentField]\u003d\"description\""},{"lineNumber":19,"author":{"gitId":"-"},"content":" [commentForm]\u003d\"this.newIssueForm\""},{"lineNumber":20,"author":{"gitId":"-"},"content":" [(isFormPending)]\u003d\"this.isFormPending\""},{"lineNumber":21,"author":{"gitId":"-"},"content":" [(submitButtonText)]\u003d\"this.submitButtonText\""},{"lineNumber":22,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003c/app-comment-editor\u003e"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":27,"author":{"gitId":"-"},"content":" style\u003d\"float: right\""},{"lineNumber":28,"author":{"gitId":"-"},"content":" class\u003d\"submit-new-bug-report\""},{"lineNumber":29,"author":{"gitId":"-"},"content":" type\u003d\"submit\""},{"lineNumber":30,"author":{"gitId":"-"},"content":" mat-stroked-button"},{"lineNumber":31,"author":{"gitId":"-"},"content":" color\u003d\"primary\""},{"lineNumber":32,"author":{"gitId":"-"},"content":" [disabled]\u003d\"!newIssueForm.valid || isFormPending\""},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":34,"author":{"gitId":"-"},"content":" {{ this.submitButtonText }}"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":36,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"column right\"\u003e"},{"lineNumber":39,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"severity-dropdown\"\u003e"},{"lineNumber":40,"author":{"gitId":"-"},"content":" \u003capp-label-dropdown initialValue\u003d\"\" attributeName\u003d\"severity\" [dropdownForm]\u003d\"newIssueForm\"\u003e\u003c/app-label-dropdown\u003e"},{"lineNumber":41,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":42,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"bug-dropdown\"\u003e"},{"lineNumber":43,"author":{"gitId":"-"},"content":" \u003capp-label-dropdown initialValue\u003d\"\" attributeName\u003d\"type\" [dropdownForm]\u003d\"newIssueForm\"\u003e\u003c/app-label-dropdown\u003e"},{"lineNumber":44,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":46,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":47,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":48,"author":{"gitId":"-"},"content":"\u003c/form\u003e"}],"authorContributionMap":{"MadLamprey":1,"-":47}},{"path":"src/app/phase-bug-reporting/new-issue/new-issue.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Component, OnInit } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { AbstractControl, FormBuilder, FormGroup, NgForm, Validators } from \u0027@angular/forms\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { Router } from \u0027@angular/router\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { finalize } from \u0027rxjs/operators\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../core/models/issue.model\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { ErrorHandlingService } from \u0027../../core/services/error-handling.service\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027../../core/services/issue.service\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { LabelService } from \u0027../../core/services/label.service\u0027;"},{"lineNumber":9,"author":{"gitId":"MadLamprey"},"content":"import { noWhitespace } from \u0027../../core/validators/noWhitespace.validator\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import { SUBMIT_BUTTON_TEXT } from \u0027../../shared/view-issue/view-issue.component\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":13,"author":{"gitId":"-"},"content":" selector: \u0027app-new-issue\u0027,"},{"lineNumber":14,"author":{"gitId":"-"},"content":" templateUrl: \u0027./new-issue.component.html\u0027,"},{"lineNumber":15,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./new-issue.component.css\u0027]"},{"lineNumber":16,"author":{"gitId":"-"},"content":"})"},{"lineNumber":17,"author":{"gitId":"-"},"content":"export class NewIssueComponent implements OnInit {"},{"lineNumber":18,"author":{"gitId":"-"},"content":" newIssueForm: FormGroup;"},{"lineNumber":19,"author":{"gitId":"-"},"content":" isFormPending \u003d false;"},{"lineNumber":20,"author":{"gitId":"-"},"content":" submitButtonText: string;"},{"lineNumber":21,"author":{"gitId":"-"},"content":""},{"lineNumber":22,"author":{"gitId":"-"},"content":" constructor("},{"lineNumber":23,"author":{"gitId":"-"},"content":" private issueService: IssueService,"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private formBuilder: FormBuilder,"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private errorHandlingService: ErrorHandlingService,"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public labelService: LabelService,"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private router: Router"},{"lineNumber":28,"author":{"gitId":"-"},"content":" ) {}"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":31,"author":{"gitId":"-"},"content":" this.newIssueForm \u003d this.formBuilder.group({"},{"lineNumber":32,"author":{"gitId":"MadLamprey"},"content":" title: [\u0027\u0027, [Validators.required, Validators.maxLength(256), noWhitespace()]],"},{"lineNumber":33,"author":{"gitId":"-"},"content":" description: [\u0027\u0027],"},{"lineNumber":34,"author":{"gitId":"-"},"content":" severity: [\u0027\u0027, Validators.required],"},{"lineNumber":35,"author":{"gitId":"-"},"content":" type: [\u0027\u0027, Validators.required]"},{"lineNumber":36,"author":{"gitId":"-"},"content":" });"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":" this.submitButtonText \u003d SUBMIT_BUTTON_TEXT.SUBMIT;"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" submitNewIssue(form: NgForm) {"},{"lineNumber":42,"author":{"gitId":"-"},"content":" if (this.newIssueForm.invalid) {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }"},{"lineNumber":45,"author":{"gitId":"MadLamprey"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":" this.isFormPending \u003d true;"},{"lineNumber":47,"author":{"gitId":"-"},"content":" this.issueService"},{"lineNumber":48,"author":{"gitId":"-"},"content":" .createIssue(this.title.value, Issue.updateDescription(this.description.value), this.severity.value, this.type.value)"},{"lineNumber":49,"author":{"gitId":"-"},"content":" .pipe(finalize(() \u003d\u003e (this.isFormPending \u003d false)))"},{"lineNumber":50,"author":{"gitId":"-"},"content":" .subscribe("},{"lineNumber":51,"author":{"gitId":"-"},"content":" (newIssue) \u003d\u003e {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" this.issueService.updateLocalStore(newIssue);"},{"lineNumber":53,"author":{"gitId":"-"},"content":" this.router.navigateByUrl(`phaseBugReporting/issues/${newIssue.id}`);"},{"lineNumber":54,"author":{"gitId":"-"},"content":" form.resetForm();"},{"lineNumber":55,"author":{"gitId":"-"},"content":" },"},{"lineNumber":56,"author":{"gitId":"-"},"content":" (error) \u003d\u003e {"},{"lineNumber":57,"author":{"gitId":"-"},"content":" this.errorHandlingService.handleError(error);"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }"},{"lineNumber":59,"author":{"gitId":"-"},"content":" );"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }"},{"lineNumber":61,"author":{"gitId":"-"},"content":""},{"lineNumber":62,"author":{"gitId":"-"},"content":" canDeactivate() {"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return ("},{"lineNumber":64,"author":{"gitId":"-"},"content":" !this.isAttributeEditing(this.title) \u0026\u0026"},{"lineNumber":65,"author":{"gitId":"-"},"content":" !this.isAttributeEditing(this.description) \u0026\u0026"},{"lineNumber":66,"author":{"gitId":"-"},"content":" !this.isAttributeEditing(this.severity) \u0026\u0026"},{"lineNumber":67,"author":{"gitId":"-"},"content":" !this.isAttributeEditing(this.type)"},{"lineNumber":68,"author":{"gitId":"-"},"content":" );"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }"},{"lineNumber":70,"author":{"gitId":"-"},"content":""},{"lineNumber":71,"author":{"gitId":"-"},"content":" isAttributeEditing(attribute: AbstractControl) {"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return attribute.value !\u003d\u003d null \u0026\u0026 attribute.value !\u003d\u003d \u0027\u0027;"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }"},{"lineNumber":74,"author":{"gitId":"-"},"content":""},{"lineNumber":75,"author":{"gitId":"-"},"content":" get title() {"},{"lineNumber":76,"author":{"gitId":"-"},"content":" return this.newIssueForm.get(\u0027title\u0027);"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }"},{"lineNumber":78,"author":{"gitId":"-"},"content":""},{"lineNumber":79,"author":{"gitId":"-"},"content":" get description() {"},{"lineNumber":80,"author":{"gitId":"-"},"content":" return this.newIssueForm.get(\u0027description\u0027);"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }"},{"lineNumber":82,"author":{"gitId":"-"},"content":""},{"lineNumber":83,"author":{"gitId":"-"},"content":" get severity() {"},{"lineNumber":84,"author":{"gitId":"-"},"content":" return this.newIssueForm.get(\u0027severity\u0027);"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }"},{"lineNumber":86,"author":{"gitId":"-"},"content":""},{"lineNumber":87,"author":{"gitId":"-"},"content":" get type() {"},{"lineNumber":88,"author":{"gitId":"-"},"content":" return this.newIssueForm.get(\u0027type\u0027);"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }"},{"lineNumber":90,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"MadLamprey":3,"-":87}},{"path":"src/app/shared/comment-editor/comment-editor.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cform [formGroup]\u003d\"commentForm\" style\u003d\"min-height: 350px\"\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003cmat-tab-group class\u003d\"mat-elevation-z1\" animationDuration\u003d\"0ms\" (selectedTabChange)\u003d\"commentField.setValue(commentTextArea.value)\"\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \u003cmat-tab label\u003d\"Write\"\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":" \u003cdiv"},{"lineNumber":5,"author":{"gitId":"-"},"content":" #dropArea"},{"lineNumber":6,"author":{"gitId":"-"},"content":" class\u003d\"tab-content\""},{"lineNumber":7,"author":{"gitId":"-"},"content":" (dragleave)\u003d\"onDragExit($event)\""},{"lineNumber":8,"author":{"gitId":"-"},"content":" (dragenter)\u003d\"onDragEnter($event)\""},{"lineNumber":9,"author":{"gitId":"-"},"content":" (drop)\u003d\"onDrop($event)\""},{"lineNumber":10,"author":{"gitId":"-"},"content":" (dragover)\u003d\"enableFileDrop($event)\""},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003capp-markdown-toolbar [forTextAreaId]\u003d\"this.id\"\u003e\u003c/app-markdown-toolbar\u003e"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003cmat-form-field appearance\u003d\"outline\" style\u003d\"width: 100%\"\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cmat-label\u003e\u003c/mat-label\u003e"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003ctextarea"},{"lineNumber":16,"author":{"gitId":"-"},"content":" (paste)\u003d\"onPaste($event)\""},{"lineNumber":17,"author":{"gitId":"-"},"content":" (keydown)\u003d\"onKeyPress($event)\""},{"lineNumber":18,"author":{"gitId":"-"},"content":" (beforeinput)\u003d\"handleBeforeInputChange($event)\""},{"lineNumber":19,"author":{"gitId":"-"},"content":" (input)\u003d\"handleInputChange($event)\""},{"lineNumber":20,"author":{"gitId":"-"},"content":" #commentTextArea"},{"lineNumber":21,"author":{"gitId":"-"},"content":" (dragover)\u003d\"disableCaretMovement($event)\""},{"lineNumber":22,"author":{"gitId":"-"},"content":" id\u003d\"{{ this.id }}\""},{"lineNumber":23,"author":{"gitId":"-"},"content":" formControlName\u003d\"{{ this.id }}\""},{"lineNumber":24,"author":{"gitId":"-"},"content":" matInput"},{"lineNumber":25,"author":{"gitId":"-"},"content":" cdkTextareaAutosize"},{"lineNumber":26,"author":{"gitId":"-"},"content":" #autosize\u003d\"cdkTextareaAutosize\""},{"lineNumber":27,"author":{"gitId":"-"},"content":" cdkAutosizeMinRows\u003d\"10\""},{"lineNumber":28,"author":{"gitId":"-"},"content":" cdkAutosizeMaxRows\u003d\"20\""},{"lineNumber":29,"author":{"gitId":"-"},"content":" class\u003d\"text-input-area\""},{"lineNumber":30,"author":{"gitId":"-"},"content":" placeholder\u003d\"{{ this.placeholderText }}\""},{"lineNumber":31,"author":{"gitId":"-"},"content":" maxlength\u003d\"{{ this.maxLength }}\""},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003e\u003c/textarea\u003e"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u003cmat-error *ngIf\u003d\"commentField.errors \u0026\u0026 commentField.errors[\u0027required\u0027] \u0026\u0026 commentField.touched\"\u003e"},{"lineNumber":34,"author":{"gitId":"-"},"content":" Description required."},{"lineNumber":35,"author":{"gitId":"-"},"content":" \u003c/mat-error\u003e"},{"lineNumber":36,"author":{"gitId":"-"},"content":" \u003cmat-error *ngIf\u003d\"commentField.errors \u0026\u0026 commentField.errors[\u0027maxLength\u0027]\"\u003e"},{"lineNumber":37,"author":{"gitId":"-"},"content":" Description cannot exceed {{ maxLength }} characters."},{"lineNumber":38,"author":{"gitId":"-"},"content":" \u003c/mat-error\u003e"},{"lineNumber":39,"author":{"gitId":"-"},"content":" \u003cmat-hint *ngIf\u003d\"commentField.value?.length \u003e\u003d maxLength - 50\"\u003e"},{"lineNumber":40,"author":{"gitId":"-"},"content":" {{ maxLength - commentField.value?.length }} character(s) remaining."},{"lineNumber":41,"author":{"gitId":"-"},"content":" \u003c/mat-hint\u003e"},{"lineNumber":42,"author":{"gitId":"-"},"content":""},{"lineNumber":43,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"drag-and-drop\"\u003e"},{"lineNumber":44,"author":{"gitId":"-"},"content":" \u003cspan *ngIf\u003d\"!isInErrorState\"\u003e Attach files by dragging \u0026 dropping or select them by clicking here. \u003c/span\u003e"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \u003cspan *ngIf\u003d\"isInErrorState\" class\u003d\"error\"\u003e {{ uploadErrorMessage }} \u003c/span\u003e"},{"lineNumber":46,"author":{"gitId":"-"},"content":" \u003cinput"},{"lineNumber":47,"author":{"gitId":"-"},"content":" #fileInput"},{"lineNumber":48,"author":{"gitId":"-"},"content":" [disabled]\u003d\"this.commentField.disabled\""},{"lineNumber":49,"author":{"gitId":"-"},"content":" [accept]\u003d\"SUPPORTED_FILE_TYPES\""},{"lineNumber":50,"author":{"gitId":"-"},"content":" type\u003d\"file\""},{"lineNumber":51,"author":{"gitId":"-"},"content":" class\u003d\"file\""},{"lineNumber":52,"author":{"gitId":"-"},"content":" (change)\u003d\"onFileInputUpload($event, fileInput)\""},{"lineNumber":53,"author":{"gitId":"-"},"content":" /\u003e"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003c/mat-tab\u003e"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003cmat-tab label\u003d\"Preview\"\u003e"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"tab-content\" style\u003d\"min-height: 228px\"\u003e"},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":" \u003cmarkdown #markdownArea *ngIf\u003d\"commentField.value !\u003d\u003d \u0027\u0027\" [data]\u003d\"sanitize(commentField.value)\" disableInternalLink\u003e\u003c/markdown\u003e"},{"lineNumber":61,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"commentField.value \u003d\u003d\u003d \u0027\u0027\"\u003eNothing to preview.\u003c/div\u003e"},{"lineNumber":62,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003c/mat-tab\u003e"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u003c/mat-tab-group\u003e"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003c/form\u003e"}],"authorContributionMap":{"NereusWB922":1,"-":64}},{"path":"src/app/shared/issue-tables/issue-tables.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"Arif-Khalid"},"content":"\u003cmat-table"},{"lineNumber":2,"author":{"gitId":"Arif-Khalid"},"content":" [dataSource]\u003d\"this.issues\""},{"lineNumber":3,"author":{"gitId":"Arif-Khalid"},"content":" matSort"},{"lineNumber":4,"author":{"gitId":"Arif-Khalid"},"content":" [matSortActive]\u003d\"this.tableSettings.sortActiveId\""},{"lineNumber":5,"author":{"gitId":"Arif-Khalid"},"content":" [matSortDirection]\u003d\"this.tableSettings.sortDirection\""},{"lineNumber":6,"author":{"gitId":"Arif-Khalid"},"content":" (matSortChange)\u003d\"this.sortChange($event)\""},{"lineNumber":7,"author":{"gitId":"Arif-Khalid"},"content":" class\u003d\"mat-elevation-z8\""},{"lineNumber":8,"author":{"gitId":"Arif-Khalid"},"content":"\u003e"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003c!-- ID Column --\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cng-container matColumnDef\u003d\"id\"\u003e"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cmat-header-cell *matHeaderCellDef mat-sort-header\u003e ID \u003c/mat-header-cell\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let issue\"\u003e"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003cspan (click)\u003d\"$event.stopPropagation()\" style\u003d\"cursor: default\"\u003e{{ issue.id }}\u003c/span\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003c!-- Title Column --\u003e"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003cng-container matColumnDef\u003d\"title\"\u003e"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003cmat-header-cell *matHeaderCellDef mat-sort-header\u003e Title \u003c/mat-header-cell\u003e"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let issue\"\u003e"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003ca class\u003d\"no-underline link-grey-dark title-wrap\" [routerLink]\u003d\"\u0027issues/\u0027 + issue.id\"\u003e {{ issue.title }} \u003c/a\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003c!-- Team Assigned Column --\u003e"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003cng-container *ngIf\u003d\"userService.currentUser.role !\u003d\u003d \u0027Student\u0027\" matColumnDef\u003d\"teamAssigned\"\u003e"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cmat-header-cell *matHeaderCellDef mat-sort-header\u003e Team \u003c/mat-header-cell\u003e"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let issue\"\u003e {{ (issue.teamAssigned \u0026\u0026 issue.teamAssigned.id) || \u0027-\u0027 }} \u003c/mat-cell\u003e"},{"lineNumber":29,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":" \u003c!-- Type Column --\u003e"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003cng-container matColumnDef\u003d\"type\"\u003e"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u003cmat-header-cell *matHeaderCellDef mat-sort-header\u003e Type \u003c/mat-header-cell\u003e"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let issue\"\u003e"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \u003cspan"},{"lineNumber":36,"author":{"gitId":"-"},"content":" (click)\u003d\"$event.stopPropagation()\""},{"lineNumber":37,"author":{"gitId":"-"},"content":" [ngStyle]\u003d\"this.labelService.setLabelStyle(this.labelService.getColorOfLabel(\u0027type\u0027, issue.type))\""},{"lineNumber":38,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":39,"author":{"gitId":"-"},"content":" {{ issue.type || \u0027-\u0027 }}"},{"lineNumber":40,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":41,"author":{"gitId":"-"},"content":" \u003cspan"},{"lineNumber":42,"author":{"gitId":"-"},"content":" *ngIf\u003d\"issue.teamChosenType \u0026\u0026 issue.teamChosenType !\u003d issue.type\""},{"lineNumber":43,"author":{"gitId":"-"},"content":" (click)\u003d\"$event.stopPropagation()\""},{"lineNumber":44,"author":{"gitId":"-"},"content":" style\u003d\"display: inline; padding: 1px 2px\""},{"lineNumber":45,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":46,"author":{"gitId":"-"},"content":" \u003cmat-icon class\u003d\"arrow-right\"\u003earrow_right_alt\u003c/mat-icon\u003e"},{"lineNumber":47,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003cspan"},{"lineNumber":49,"author":{"gitId":"-"},"content":" *ngIf\u003d\"issue.teamChosenType \u0026\u0026 issue.teamChosenType !\u003d issue.type\""},{"lineNumber":50,"author":{"gitId":"-"},"content":" (click)\u003d\"$event.stopPropagation()\""},{"lineNumber":51,"author":{"gitId":"-"},"content":" [ngStyle]\u003d\"this.labelService.setLabelStyle(this.labelService.getColorOfLabel(\u0027type\u0027, issue.teamChosenType))\""},{"lineNumber":52,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":53,"author":{"gitId":"-"},"content":" {{ issue.teamChosenType }}"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":57,"author":{"gitId":"-"},"content":""},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003c!-- Severity Column --\u003e"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003cng-container matColumnDef\u003d\"severity\"\u003e"},{"lineNumber":60,"author":{"gitId":"-"},"content":" \u003cmat-header-cell *matHeaderCellDef mat-sort-header\u003e Severity \u003c/mat-header-cell\u003e"},{"lineNumber":61,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let issue\"\u003e"},{"lineNumber":62,"author":{"gitId":"-"},"content":" \u003cspan"},{"lineNumber":63,"author":{"gitId":"-"},"content":" (click)\u003d\"$event.stopPropagation()\""},{"lineNumber":64,"author":{"gitId":"-"},"content":" [ngStyle]\u003d\"this.labelService.setLabelStyle(this.labelService.getColorOfLabel(\u0027severity\u0027, issue.severity))\""},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":66,"author":{"gitId":"-"},"content":" {{ issue.severity || \u0027-\u0027 }}"},{"lineNumber":67,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":68,"author":{"gitId":"-"},"content":" \u003cspan"},{"lineNumber":69,"author":{"gitId":"-"},"content":" *ngIf\u003d\"issue.teamChosenSeverity \u0026\u0026 issue.teamChosenSeverity !\u003d issue.severity\""},{"lineNumber":70,"author":{"gitId":"-"},"content":" (click)\u003d\"$event.stopPropagation()\""},{"lineNumber":71,"author":{"gitId":"-"},"content":" style\u003d\"display: inline; margin: 3px\""},{"lineNumber":72,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":73,"author":{"gitId":"-"},"content":" \u003cmat-icon class\u003d\"arrow-right\"\u003earrow_right_alt\u003c/mat-icon\u003e"},{"lineNumber":74,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":75,"author":{"gitId":"-"},"content":" \u003cspan"},{"lineNumber":76,"author":{"gitId":"-"},"content":" *ngIf\u003d\"issue.teamChosenSeverity \u0026\u0026 issue.teamChosenSeverity !\u003d issue.severity\""},{"lineNumber":77,"author":{"gitId":"-"},"content":" (click)\u003d\"$event.stopPropagation()\""},{"lineNumber":78,"author":{"gitId":"-"},"content":" [ngStyle]\u003d\"this.labelService.setLabelStyle(this.labelService.getColorOfLabel(\u0027severity\u0027, issue.teamChosenSeverity))\""},{"lineNumber":79,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":80,"author":{"gitId":"-"},"content":" {{ issue.teamChosenSeverity }}"},{"lineNumber":81,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":82,"author":{"gitId":"-"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":83,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":84,"author":{"gitId":"-"},"content":""},{"lineNumber":85,"author":{"gitId":"-"},"content":" \u003c!--Response Tag Column--\u003e"},{"lineNumber":86,"author":{"gitId":"-"},"content":" \u003cng-container matColumnDef\u003d\"response\"\u003e"},{"lineNumber":87,"author":{"gitId":"-"},"content":" \u003cmat-header-cell *matHeaderCellDef mat-sort-header\u003e Response \u003c/mat-header-cell\u003e"},{"lineNumber":88,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let issue\"\u003e"},{"lineNumber":89,"author":{"gitId":"-"},"content":" \u003cspan"},{"lineNumber":90,"author":{"gitId":"-"},"content":" (click)\u003d\"$event.stopPropagation()\""},{"lineNumber":91,"author":{"gitId":"-"},"content":" *ngIf\u003d\"issue.response\""},{"lineNumber":92,"author":{"gitId":"-"},"content":" [ngStyle]\u003d\"this.labelService.setLabelStyle(this.labelService.getColorOfLabel(\u0027response\u0027, issue.response))\""},{"lineNumber":93,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":94,"author":{"gitId":"-"},"content":" {{ issue.response }}"},{"lineNumber":95,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":96,"author":{"gitId":"-"},"content":" \u003cspan *ngIf\u003d\"!issue.response\" style\u003d\"margin-left: 10%\"\u003e"},{"lineNumber":97,"author":{"gitId":"-"},"content":" \u003cmat-icon matTooltip\u003d\"Should not be empty\" matTooltipPosition\u003d\"above\" color\u003d\"warn\"\u003ewarning\u003c/mat-icon\u003e"},{"lineNumber":98,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":99,"author":{"gitId":"-"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":100,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":101,"author":{"gitId":"-"},"content":""},{"lineNumber":102,"author":{"gitId":"-"},"content":" \u003c!--Assignee Column--\u003e"},{"lineNumber":103,"author":{"gitId":"-"},"content":" \u003cng-container matColumnDef\u003d\"assignees\"\u003e"},{"lineNumber":104,"author":{"gitId":"-"},"content":" \u003cmat-header-cell mat-header-cell *matHeaderCellDef mat-sort-header\u003e Assignees \u003c/mat-header-cell\u003e"},{"lineNumber":105,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let issue\"\u003e"},{"lineNumber":106,"author":{"gitId":"-"},"content":" \u003cspan (click)\u003d\"$event.stopPropagation()\" style\u003d\"cursor: default\" *ngIf\u003d\"issue.assignees.length !\u003d\u003d 0\"\u003e"},{"lineNumber":107,"author":{"gitId":"-"},"content":" {{ issue.assignees.join(\u0027, \u0027) }}"},{"lineNumber":108,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":109,"author":{"gitId":"-"},"content":" \u003cspan *ngIf\u003d\"issue.assignees.length \u003d\u003d\u003d 0\" style\u003d\"margin-left: 5%\"\u003e"},{"lineNumber":110,"author":{"gitId":"-"},"content":" \u003cmat-icon matTooltip\u003d\"We strongly recommend assigning all issues to someone\" matTooltipPosition\u003d\"above\" style\u003d\"color: #ffab40\"\u003e"},{"lineNumber":111,"author":{"gitId":"-"},"content":" warning"},{"lineNumber":112,"author":{"gitId":"-"},"content":" \u003c/mat-icon\u003e"},{"lineNumber":113,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":114,"author":{"gitId":"-"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":115,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":116,"author":{"gitId":"-"},"content":""},{"lineNumber":117,"author":{"gitId":"-"},"content":" \u003c!-- Duplicated Issues Column --\u003e"},{"lineNumber":118,"author":{"gitId":"-"},"content":" \u003cng-container matColumnDef\u003d\"duplicatedIssues\"\u003e"},{"lineNumber":119,"author":{"gitId":"-"},"content":" \u003cmat-header-cell *matHeaderCellDef\u003e Duplicates \u003c/mat-header-cell\u003e"},{"lineNumber":120,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let issue\"\u003e"},{"lineNumber":121,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"(issueService.getDuplicateIssuesFor(issue) | async).length \u003d\u003d\u003d 0\"\u003e-\u003c/div\u003e"},{"lineNumber":122,"author":{"gitId":"-"},"content":" \u003cmat-chip-list"},{"lineNumber":123,"author":{"gitId":"-"},"content":" *ngFor\u003d\"let duplicateIssue of issueService.getDuplicateIssuesFor(issue) | async\""},{"lineNumber":124,"author":{"gitId":"-"},"content":" style\u003d\"display: inline-block; margin-left: 5px\""},{"lineNumber":125,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":126,"author":{"gitId":"-"},"content":" \u003cmat-chip"},{"lineNumber":127,"author":{"gitId":"-"},"content":" [routerLink]\u003d\"[\u0027issues/\u0027 + duplicateIssue.id]\""},{"lineNumber":128,"author":{"gitId":"-"},"content":" [matTooltip]\u003d\"duplicateIssue.title\""},{"lineNumber":129,"author":{"gitId":"-"},"content":" matTooltipPosition\u003d\"above\""},{"lineNumber":130,"author":{"gitId":"-"},"content":" style\u003d\"font-size: 12px; cursor: pointer\""},{"lineNumber":131,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":132,"author":{"gitId":"-"},"content":" #{{ duplicateIssue.id }}"},{"lineNumber":133,"author":{"gitId":"-"},"content":" \u003c/mat-chip\u003e"},{"lineNumber":134,"author":{"gitId":"-"},"content":" \u003c/mat-chip-list\u003e"},{"lineNumber":135,"author":{"gitId":"-"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":136,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":137,"author":{"gitId":"-"},"content":""},{"lineNumber":138,"author":{"gitId":"-"},"content":" \u003c!-- To do Column --\u003e"},{"lineNumber":139,"author":{"gitId":"-"},"content":" \u003cng-container matColumnDef\u003d\"Todo Remaining\"\u003e"},{"lineNumber":140,"author":{"gitId":"-"},"content":" \u003cmat-header-cell *matHeaderCellDef mat-sort-header\u003e Todo Remaining \u003c/mat-header-cell\u003e"},{"lineNumber":141,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let issue\"\u003e"},{"lineNumber":142,"author":{"gitId":"-"},"content":" \u003cspan *ngIf\u003d\"isTodoListChecked(issue) \u0026\u0026 issue.issueDisputes.length \u003e 0\"\u003e \u003cfont color\u003d\"green\"\u003eAll tasks are completed\u003c/font\u003e \u003c/span\u003e"},{"lineNumber":143,"author":{"gitId":"-"},"content":" \u003cspan *ngIf\u003d\"!isTodoListChecked(issue)\"\u003e"},{"lineNumber":144,"author":{"gitId":"-"},"content":" \u003cfont color\u003d\"red\""},{"lineNumber":145,"author":{"gitId":"-"},"content":" \u003e{{ issue.issueDisputes.length - todoFinished(issue) }}/{{ issue.issueDisputes.length }} tasks pending.\u003c/font"},{"lineNumber":146,"author":{"gitId":"-"},"content":" \u003e\u003c/span"},{"lineNumber":147,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":148,"author":{"gitId":"-"},"content":" \u003cprogress"},{"lineNumber":149,"author":{"gitId":"-"},"content":" *ngIf\u003d\"issue.issueDisputes.length \u003e 0\""},{"lineNumber":150,"author":{"gitId":"-"},"content":" value\u003d\"{{ todoFinished(issue) }}\""},{"lineNumber":151,"author":{"gitId":"-"},"content":" max\u003d\"{{ issue.issueDisputes.length }}\""},{"lineNumber":152,"author":{"gitId":"-"},"content":" role\u003d\"progressbar\""},{"lineNumber":153,"author":{"gitId":"-"},"content":" style\u003d\"width: 100%\""},{"lineNumber":154,"author":{"gitId":"-"},"content":" aria-valuenow\u003d\"100\""},{"lineNumber":155,"author":{"gitId":"-"},"content":" aria-valuemin\u003d\"0\""},{"lineNumber":156,"author":{"gitId":"-"},"content":" aria-valuemax\u003d\"100\""},{"lineNumber":157,"author":{"gitId":"-"},"content":" \u003e\u003c/progress\u003e"},{"lineNumber":158,"author":{"gitId":"-"},"content":" \u003cspan *ngIf\u003d\"issue.issueDisputes.length \u003d\u003d\u003d 0\"\u003e No Todo List for this issue \u003c/span\u003e"},{"lineNumber":159,"author":{"gitId":"-"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":160,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":161,"author":{"gitId":"-"},"content":""},{"lineNumber":162,"author":{"gitId":"-"},"content":" \u003c!--Tester Disagree Column--\u003e"},{"lineNumber":163,"author":{"gitId":"-"},"content":" \u003cng-container matColumnDef\u003d\"testerDisagree\"\u003e"},{"lineNumber":164,"author":{"gitId":"-"},"content":" \u003cmat-header-cell mat-header-cell *matHeaderCellDef mat-sort-header\u003eResponse\u003c/mat-header-cell\u003e"},{"lineNumber":165,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let issue\"\u003e"},{"lineNumber":166,"author":{"gitId":"-"},"content":" \u003c!-- Response Agree/Disagree colours are the same as Response Agree/Rejected label colours for uniformity in the app --\u003e"},{"lineNumber":167,"author":{"gitId":"-"},"content":" \u003cspan"},{"lineNumber":168,"author":{"gitId":"-"},"content":" (click)\u003d\"$event.stopPropagation()\""},{"lineNumber":169,"author":{"gitId":"-"},"content":" *ngIf\u003d\"issue.testerDisagree\""},{"lineNumber":170,"author":{"gitId":"-"},"content":" [ngStyle]\u003d\"this.labelService.setLabelStyle(this.labelService.getColorOfLabel(\u0027response\u0027, \u0027Rejected\u0027))\""},{"lineNumber":171,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":172,"author":{"gitId":"-"},"content":" Disagree"},{"lineNumber":173,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":174,"author":{"gitId":"-"},"content":" \u003cspan"},{"lineNumber":175,"author":{"gitId":"-"},"content":" (click)\u003d\"$event.stopPropagation()\""},{"lineNumber":176,"author":{"gitId":"-"},"content":" *ngIf\u003d\"!issue.testerDisagree\""},{"lineNumber":177,"author":{"gitId":"-"},"content":" [ngStyle]\u003d\"this.labelService.setLabelStyle(this.labelService.getColorOfLabel(\u0027response\u0027, \u0027Accepted\u0027))\""},{"lineNumber":178,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":179,"author":{"gitId":"-"},"content":" Agree"},{"lineNumber":180,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":181,"author":{"gitId":"-"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":182,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":183,"author":{"gitId":"-"},"content":""},{"lineNumber":184,"author":{"gitId":"-"},"content":" \u003c!-- Action Buttons Column --\u003e"},{"lineNumber":185,"author":{"gitId":"-"},"content":" \u003cng-container matColumnDef\u003d\"actions\"\u003e"},{"lineNumber":186,"author":{"gitId":"-"},"content":" \u003cmat-header-cell *matHeaderCellDef\u003e Actions \u003c/mat-header-cell\u003e"},{"lineNumber":187,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let issue\"\u003e"},{"lineNumber":188,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":189,"author":{"gitId":"-"},"content":" mat-button"},{"lineNumber":190,"author":{"gitId":"-"},"content":" matTooltip\u003d\"View this issue on GitHub\""},{"lineNumber":191,"author":{"gitId":"-"},"content":" *ngIf\u003d\"this.isActionVisible(action_buttons.VIEW_IN_WEB)\""},{"lineNumber":192,"author":{"gitId":"-"},"content":" (click)\u003d\"this.viewIssueInBrowser(issue.id, $event)\""},{"lineNumber":193,"author":{"gitId":"-"},"content":" style\u003d\"transform: scale(0.8)\""},{"lineNumber":194,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":195,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003eopen_in_new\u003c/mat-icon\u003e"},{"lineNumber":196,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":197,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":198,"author":{"gitId":"-"},"content":" *ngIf\u003d\"this.isResponseEditable() \u0026\u0026 !issue.status \u0026\u0026 this.isActionVisible(action_buttons.RESPOND_TO_ISSUE); else tryEditIssue\""},{"lineNumber":199,"author":{"gitId":"-"},"content":" [routerLink]\u003d\"\u0027issues/\u0027 + issue.id\""},{"lineNumber":200,"author":{"gitId":"-"},"content":" mat-button"},{"lineNumber":201,"author":{"gitId":"-"},"content":" color\u003d\"accent\""},{"lineNumber":202,"author":{"gitId":"-"},"content":" style\u003d\"transform: scale(0.8)\""},{"lineNumber":203,"author":{"gitId":"-"},"content":" matTooltip\u003d\"Respond to this issue\""},{"lineNumber":204,"author":{"gitId":"-"},"content":" (click)\u003d\"this.logIssueRespondRouting(issue.id)\""},{"lineNumber":205,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":206,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003efeedback\u003c/mat-icon\u003e"},{"lineNumber":207,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":208,"author":{"gitId":"-"},"content":" \u003cng-template #tryEditIssue\u003e"},{"lineNumber":209,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":210,"author":{"gitId":"-"},"content":" *ngIf\u003d\"permissions.isIssueEditable() \u0026\u0026 this.isActionVisible(action_buttons.FIX_ISSUE)\""},{"lineNumber":211,"author":{"gitId":"-"},"content":" mat-button"},{"lineNumber":212,"author":{"gitId":"-"},"content":" color\u003d\"accent\""},{"lineNumber":213,"author":{"gitId":"-"},"content":" style\u003d\"transform: scale(0.8)\""},{"lineNumber":214,"author":{"gitId":"-"},"content":" matTooltip\u003d\"Edit this issue\""},{"lineNumber":215,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":216,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003eedit\u003c/mat-icon\u003e"},{"lineNumber":217,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":218,"author":{"gitId":"-"},"content":" \u003c/ng-template\u003e"},{"lineNumber":219,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":220,"author":{"gitId":"-"},"content":" *ngIf\u003d\"this.isResponseEditable() \u0026\u0026 issue.status \u0026\u0026 this.isActionVisible(action_buttons.MARK_AS_RESPONDED)\""},{"lineNumber":221,"author":{"gitId":"-"},"content":" mat-button"},{"lineNumber":222,"author":{"gitId":"-"},"content":" color\u003d\"primary\""},{"lineNumber":223,"author":{"gitId":"-"},"content":" (click)\u003d\"markAsResponded(issue, $event)\""},{"lineNumber":224,"author":{"gitId":"-"},"content":" style\u003d\"transform: scale(0.8)\""},{"lineNumber":225,"author":{"gitId":"-"},"content":" matTooltip\u003d\"Mark this issue as Responded\""},{"lineNumber":226,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":227,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003echeck_circle\u003c/mat-icon\u003e"},{"lineNumber":228,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":229,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":230,"author":{"gitId":"-"},"content":" color\u003d\"primary\""},{"lineNumber":231,"author":{"gitId":"-"},"content":" matTooltip\u003d\"Mark this issue as Pending\""},{"lineNumber":232,"author":{"gitId":"-"},"content":" mat-button"},{"lineNumber":233,"author":{"gitId":"-"},"content":" (click)\u003d\"markAsPending(issue, $event)\""},{"lineNumber":234,"author":{"gitId":"-"},"content":" style\u003d\"transform: scale(0.8)\""},{"lineNumber":235,"author":{"gitId":"-"},"content":" *ngIf\u003d\""},{"lineNumber":236,"author":{"gitId":"-"},"content":" (userService.currentUser.role \u003d\u003d\u003d \u0027Student\u0027 || userService.currentUser.role \u003d\u003d\u003d \u0027Admin\u0027) \u0026\u0026"},{"lineNumber":237,"author":{"gitId":"-"},"content":" this.isActionVisible(action_buttons.MARK_AS_PENDING)"},{"lineNumber":238,"author":{"gitId":"-"},"content":" \""},{"lineNumber":239,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":240,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003ecancel\u003c/mat-icon\u003e"},{"lineNumber":241,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":242,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":243,"author":{"gitId":"-"},"content":" mat-button"},{"lineNumber":244,"author":{"gitId":"-"},"content":" color\u003d\"warn\""},{"lineNumber":245,"author":{"gitId":"-"},"content":" *ngIf\u003d\"permissions.isIssueDeletable() \u0026\u0026 !issuesPendingDeletion[issue.id] \u0026\u0026 this.isActionVisible(action_buttons.DELETE_ISSUE)\""},{"lineNumber":246,"author":{"gitId":"-"},"content":" (click)\u003d\"openDeleteDialog(issue.id, $event); $event.stopPropagation()\""},{"lineNumber":247,"author":{"gitId":"-"},"content":" matTooltip\u003d\"Delete this issue\""},{"lineNumber":248,"author":{"gitId":"-"},"content":" style\u003d\"transform: scale(0.8)\""},{"lineNumber":249,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":250,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003edelete_outline\u003c/mat-icon\u003e"},{"lineNumber":251,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":252,"author":{"gitId":"-"},"content":" \u003cmat-spinner"},{"lineNumber":253,"author":{"gitId":"-"},"content":" color\u003d\"warn\""},{"lineNumber":254,"author":{"gitId":"-"},"content":" [diameter]\u003d\"25\""},{"lineNumber":255,"author":{"gitId":"-"},"content":" style\u003d\"display: inline; padding-right: 30px; margin-left: 5px\""},{"lineNumber":256,"author":{"gitId":"-"},"content":" *ngIf\u003d\"issuesPendingDeletion[issue.id] \u0026\u0026 this.isActionVisible(action_buttons.DELETE_ISSUE)\""},{"lineNumber":257,"author":{"gitId":"-"},"content":" \u003e\u003c/mat-spinner\u003e"},{"lineNumber":258,"author":{"gitId":"-"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":259,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":260,"author":{"gitId":"-"},"content":""},{"lineNumber":261,"author":{"gitId":"-"},"content":" \u003cmat-header-row *matHeaderRowDef\u003d\"this.headers\"\u003e\u003c/mat-header-row\u003e\u003e"},{"lineNumber":262,"author":{"gitId":"-"},"content":" \u003cmat-row"},{"lineNumber":263,"author":{"gitId":"-"},"content":" *matRowDef\u003d\"let issue; columns: this.headers\""},{"lineNumber":264,"author":{"gitId":"-"},"content":" (click)\u003d\"this.logIssueEditRouting(issue.id)\""},{"lineNumber":265,"author":{"gitId":"-"},"content":" [routerLink]\u003d\"\u0027issues/\u0027 + issue.id\""},{"lineNumber":266,"author":{"gitId":"-"},"content":" style\u003d\"cursor: pointer\""},{"lineNumber":267,"author":{"gitId":"-"},"content":" \u003e\u003c/mat-row\u003e"},{"lineNumber":268,"author":{"gitId":"-"},"content":"\u003c/mat-table\u003e"},{"lineNumber":269,"author":{"gitId":"-"},"content":"\u003cmat-card *ngIf\u003d\"this.issues.isLoading$ | async\" style\u003d\"display: flex; justify-content: center; align-items: center\"\u003e"},{"lineNumber":270,"author":{"gitId":"-"},"content":" \u003cmat-progress-spinner color\u003d\"primary\" mode\u003d\"indeterminate\" diameter\u003d\"50\" strokeWidth\u003d\"5\"\u003e\u003c/mat-progress-spinner\u003e"},{"lineNumber":271,"author":{"gitId":"-"},"content":"\u003c/mat-card\u003e"},{"lineNumber":272,"author":{"gitId":"Arif-Khalid"},"content":"\u003cmat-paginator"},{"lineNumber":273,"author":{"gitId":"Arif-Khalid"},"content":" [paginatorLocalStorage]\u003d\"this.table_name\""},{"lineNumber":274,"author":{"gitId":"Arif-Khalid"},"content":" [pageSize]\u003d\"this.tableSettings.pageSize\""},{"lineNumber":275,"author":{"gitId":"Arif-Khalid"},"content":" [pageSizeOptions]\u003d\"[10, 20, 50]\""},{"lineNumber":276,"author":{"gitId":"Arif-Khalid"},"content":" [pageIndex]\u003d\"this.tableSettings.pageIndex\""},{"lineNumber":277,"author":{"gitId":"Arif-Khalid"},"content":" (page)\u003d\"this.pageChange($event)\""},{"lineNumber":278,"author":{"gitId":"Arif-Khalid"},"content":"\u003e\u003c/mat-paginator\u003e"}],"authorContributionMap":{"Arif-Khalid":15,"-":263}},{"path":"src/app/shared/issue-tables/issue-tables.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { AfterViewInit, Component, Input, OnInit, ViewChild } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"Arif-Khalid"},"content":"import { MatPaginator, PageEvent } from \u0027@angular/material/paginator\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { MatSnackBar } from \u0027@angular/material/snack-bar\u0027;"},{"lineNumber":4,"author":{"gitId":"Arif-Khalid"},"content":"import { MatSort, Sort } from \u0027@angular/material/sort\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { finalize } from \u0027rxjs/operators\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { Issue, STATUS } from \u0027../../core/models/issue.model\u0027;"},{"lineNumber":7,"author":{"gitId":"Arif-Khalid"},"content":"import { TableSettings } from \u0027../../core/models/table-settings.model\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { DialogService } from \u0027../../core/services/dialog.service\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { ErrorHandlingService } from \u0027../../core/services/error-handling.service\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027../../core/services/github.service\u0027;"},{"lineNumber":11,"author":{"gitId":"Arif-Khalid"},"content":"import { IssueTableSettingsService } from \u0027../../core/services/issue-table-settings.service\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027../../core/services/issue.service\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import { LabelService } from \u0027../../core/services/label.service\u0027;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027../../core/services/logging.service\u0027;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import { PermissionService } from \u0027../../core/services/permission.service\u0027;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import { PhaseService } from \u0027../../core/services/phase.service\u0027;"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import { UserService } from \u0027../../core/services/user.service\u0027;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import { UndoActionComponent } from \u0027../../shared/action-toasters/undo-action/undo-action.component\u0027;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import { IssuesDataTable } from \u0027./IssuesDataTable\u0027;"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":"export enum ACTION_BUTTONS {"},{"lineNumber":22,"author":{"gitId":"-"},"content":" VIEW_IN_WEB,"},{"lineNumber":23,"author":{"gitId":"-"},"content":" MARK_AS_RESPONDED,"},{"lineNumber":24,"author":{"gitId":"-"},"content":" MARK_AS_PENDING,"},{"lineNumber":25,"author":{"gitId":"-"},"content":" RESPOND_TO_ISSUE,"},{"lineNumber":26,"author":{"gitId":"-"},"content":" FIX_ISSUE,"},{"lineNumber":27,"author":{"gitId":"-"},"content":" DELETE_ISSUE"},{"lineNumber":28,"author":{"gitId":"-"},"content":"}"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":31,"author":{"gitId":"-"},"content":" selector: \u0027app-issue-tables\u0027,"},{"lineNumber":32,"author":{"gitId":"-"},"content":" templateUrl: \u0027./issue-tables.component.html\u0027,"},{"lineNumber":33,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./issue-tables.component.css\u0027]"},{"lineNumber":34,"author":{"gitId":"-"},"content":"})"},{"lineNumber":35,"author":{"gitId":"-"},"content":"export class IssueTablesComponent implements OnInit, AfterViewInit {"},{"lineNumber":36,"author":{"gitId":"-"},"content":" snackBarAutoCloseTime \u003d 3000;"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":" @Input() headers: string[];"},{"lineNumber":39,"author":{"gitId":"-"},"content":" @Input() actions: ACTION_BUTTONS[];"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @Input() filters?: any \u003d undefined;"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @Input() table_name: string;"},{"lineNumber":42,"author":{"gitId":"-"},"content":""},{"lineNumber":43,"author":{"gitId":"-"},"content":" @ViewChild(MatSort, { static: true }) sort: MatSort;"},{"lineNumber":44,"author":{"gitId":"-"},"content":" @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator;"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":" issues: IssuesDataTable;"},{"lineNumber":47,"author":{"gitId":"-"},"content":" issuesPendingDeletion: { [id: number]: boolean };"},{"lineNumber":48,"author":{"gitId":"-"},"content":""},{"lineNumber":49,"author":{"gitId":"Arif-Khalid"},"content":" public tableSettings: TableSettings;"},{"lineNumber":50,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":51,"author":{"gitId":"-"},"content":" public readonly action_buttons \u003d ACTION_BUTTONS;"},{"lineNumber":52,"author":{"gitId":"-"},"content":""},{"lineNumber":53,"author":{"gitId":"-"},"content":" // Messages for the modal popup window upon deleting an issue"},{"lineNumber":54,"author":{"gitId":"-"},"content":" private readonly deleteIssueModalMessages \u003d [\u0027Do you wish to delete this issue?\u0027, \u0027This action is irreversible!\u0027];"},{"lineNumber":55,"author":{"gitId":"-"},"content":" private readonly yesButtonModalMessage \u003d \u0027Yes, I wish to delete this issue\u0027;"},{"lineNumber":56,"author":{"gitId":"-"},"content":" private readonly noButtonModalMessage \u003d \"No, I don\u0027t wish to delete this issue\";"},{"lineNumber":57,"author":{"gitId":"-"},"content":""},{"lineNumber":58,"author":{"gitId":"-"},"content":" constructor("},{"lineNumber":59,"author":{"gitId":"-"},"content":" public userService: UserService,"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public permissions: PermissionService,"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public labelService: LabelService,"},{"lineNumber":62,"author":{"gitId":"-"},"content":" private githubService: GithubService,"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public issueService: IssueService,"},{"lineNumber":64,"author":{"gitId":"Arif-Khalid"},"content":" public issueTableSettingsService: IssueTableSettingsService,"},{"lineNumber":65,"author":{"gitId":"-"},"content":" private phaseService: PhaseService,"},{"lineNumber":66,"author":{"gitId":"-"},"content":" private errorHandlingService: ErrorHandlingService,"},{"lineNumber":67,"author":{"gitId":"-"},"content":" private logger: LoggingService,"},{"lineNumber":68,"author":{"gitId":"-"},"content":" private dialogService: DialogService,"},{"lineNumber":69,"author":{"gitId":"-"},"content":" private snackBar: MatSnackBar \u003d null"},{"lineNumber":70,"author":{"gitId":"-"},"content":" ) {}"},{"lineNumber":71,"author":{"gitId":"-"},"content":""},{"lineNumber":72,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":73,"author":{"gitId":"-"},"content":" this.issues \u003d new IssuesDataTable(this.issueService, this.sort, this.paginator, this.headers, this.filters);"},{"lineNumber":74,"author":{"gitId":"-"},"content":" this.issuesPendingDeletion \u003d {};"},{"lineNumber":75,"author":{"gitId":"Arif-Khalid"},"content":" this.tableSettings \u003d this.issueTableSettingsService.getTableSettings(this.table_name);"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }"},{"lineNumber":77,"author":{"gitId":"-"},"content":""},{"lineNumber":78,"author":{"gitId":"-"},"content":" ngAfterViewInit(): void {"},{"lineNumber":79,"author":{"gitId":"-"},"content":" setTimeout(() \u003d\u003e {"},{"lineNumber":80,"author":{"gitId":"-"},"content":" this.issues.loadIssues();"},{"lineNumber":81,"author":{"gitId":"-"},"content":" });"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }"},{"lineNumber":83,"author":{"gitId":"-"},"content":""},{"lineNumber":84,"author":{"gitId":"Arif-Khalid"},"content":" sortChange(newSort: Sort) {"},{"lineNumber":85,"author":{"gitId":"Arif-Khalid"},"content":" this.tableSettings.sortActiveId \u003d newSort.active;"},{"lineNumber":86,"author":{"gitId":"Arif-Khalid"},"content":" this.tableSettings.sortDirection \u003d newSort.direction;"},{"lineNumber":87,"author":{"gitId":"Arif-Khalid"},"content":" this.issueTableSettingsService.setTableSettings(this.table_name, this.tableSettings);"},{"lineNumber":88,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":89,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":90,"author":{"gitId":"Arif-Khalid"},"content":" pageChange(pageEvent: PageEvent) {"},{"lineNumber":91,"author":{"gitId":"Arif-Khalid"},"content":" this.tableSettings.pageSize \u003d pageEvent.pageSize;"},{"lineNumber":92,"author":{"gitId":"Arif-Khalid"},"content":" this.tableSettings.pageIndex \u003d pageEvent.pageIndex;"},{"lineNumber":93,"author":{"gitId":"Arif-Khalid"},"content":" this.issueTableSettingsService.setTableSettings(this.table_name, this.tableSettings);"},{"lineNumber":94,"author":{"gitId":"Arif-Khalid"},"content":" }"},{"lineNumber":95,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":96,"author":{"gitId":"-"},"content":" isActionVisible(action: ACTION_BUTTONS): boolean {"},{"lineNumber":97,"author":{"gitId":"-"},"content":" return this.actions.includes(action);"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }"},{"lineNumber":99,"author":{"gitId":"-"},"content":""},{"lineNumber":100,"author":{"gitId":"-"},"content":" markAsResponded(issue: Issue, event: Event) {"},{"lineNumber":101,"author":{"gitId":"-"},"content":" this.logger.info(`IssueTablesComponent: Marking Issue ${issue.id} as Responded`);"},{"lineNumber":102,"author":{"gitId":"-"},"content":" const newIssue \u003d issue.clone(this.phaseService.currentPhase);"},{"lineNumber":103,"author":{"gitId":"-"},"content":" newIssue.status \u003d STATUS.Done;"},{"lineNumber":104,"author":{"gitId":"-"},"content":" this.issueService.updateIssue(newIssue).subscribe("},{"lineNumber":105,"author":{"gitId":"-"},"content":" (updatedIssue) \u003d\u003e {"},{"lineNumber":106,"author":{"gitId":"-"},"content":" this.issueService.updateLocalStore(updatedIssue);"},{"lineNumber":107,"author":{"gitId":"-"},"content":" },"},{"lineNumber":108,"author":{"gitId":"-"},"content":" (error) \u003d\u003e {"},{"lineNumber":109,"author":{"gitId":"-"},"content":" this.errorHandlingService.handleError(error);"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }"},{"lineNumber":111,"author":{"gitId":"-"},"content":" );"},{"lineNumber":112,"author":{"gitId":"-"},"content":" event.stopPropagation();"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }"},{"lineNumber":114,"author":{"gitId":"-"},"content":""},{"lineNumber":115,"author":{"gitId":"-"},"content":" isResponseEditable() {"},{"lineNumber":116,"author":{"gitId":"-"},"content":" return this.permissions.isTeamResponseEditable() || this.permissions.isTesterResponseEditable();"},{"lineNumber":117,"author":{"gitId":"-"},"content":" }"},{"lineNumber":118,"author":{"gitId":"-"},"content":""},{"lineNumber":119,"author":{"gitId":"-"},"content":" markAsPending(issue: Issue, event: Event) {"},{"lineNumber":120,"author":{"gitId":"-"},"content":" this.logger.info(`IssueTablesComponent: Marking Issue ${issue.id} as Pending`);"},{"lineNumber":121,"author":{"gitId":"-"},"content":" const newIssue \u003d issue.clone(this.phaseService.currentPhase);"},{"lineNumber":122,"author":{"gitId":"-"},"content":" newIssue.status \u003d STATUS.Incomplete;"},{"lineNumber":123,"author":{"gitId":"-"},"content":" this.issueService.updateIssue(newIssue).subscribe("},{"lineNumber":124,"author":{"gitId":"-"},"content":" (updatedIssue) \u003d\u003e {"},{"lineNumber":125,"author":{"gitId":"-"},"content":" this.issueService.updateLocalStore(updatedIssue);"},{"lineNumber":126,"author":{"gitId":"-"},"content":" },"},{"lineNumber":127,"author":{"gitId":"-"},"content":" (error) \u003d\u003e {"},{"lineNumber":128,"author":{"gitId":"-"},"content":" this.errorHandlingService.handleError(error);"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }"},{"lineNumber":130,"author":{"gitId":"-"},"content":" );"},{"lineNumber":131,"author":{"gitId":"-"},"content":" event.stopPropagation();"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }"},{"lineNumber":133,"author":{"gitId":"-"},"content":""},{"lineNumber":134,"author":{"gitId":"-"},"content":" logIssueRespondRouting(id: number) {"},{"lineNumber":135,"author":{"gitId":"-"},"content":" this.logger.info(`IssueTablesComponent: Proceeding to Respond to Issue ${id}`);"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }"},{"lineNumber":137,"author":{"gitId":"-"},"content":""},{"lineNumber":138,"author":{"gitId":"-"},"content":" logIssueEditRouting(id: number) {"},{"lineNumber":139,"author":{"gitId":"-"},"content":" this.logger.info(`IssueTablesComponent: Proceeding to Edit Issue ${id}`);"},{"lineNumber":140,"author":{"gitId":"-"},"content":" }"},{"lineNumber":141,"author":{"gitId":"-"},"content":""},{"lineNumber":142,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":143,"author":{"gitId":"-"},"content":" * Gets the number of resolved disputes."},{"lineNumber":144,"author":{"gitId":"-"},"content":" */"},{"lineNumber":145,"author":{"gitId":"-"},"content":" todoFinished(issue: Issue): number {"},{"lineNumber":146,"author":{"gitId":"-"},"content":" return issue.issueDisputes.length - issue.numOfUnresolvedDisputes();"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }"},{"lineNumber":148,"author":{"gitId":"-"},"content":""},{"lineNumber":149,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":150,"author":{"gitId":"-"},"content":" * Checks if all the disputes are resolved."},{"lineNumber":151,"author":{"gitId":"-"},"content":" */"},{"lineNumber":152,"author":{"gitId":"-"},"content":" isTodoListChecked(issue: Issue): boolean {"},{"lineNumber":153,"author":{"gitId":"-"},"content":" return issue.issueDisputes \u0026\u0026 issue.numOfUnresolvedDisputes() \u003d\u003d\u003d 0;"},{"lineNumber":154,"author":{"gitId":"-"},"content":" }"},{"lineNumber":155,"author":{"gitId":"-"},"content":""},{"lineNumber":156,"author":{"gitId":"-"},"content":" viewIssueInBrowser(id: number, event: Event) {"},{"lineNumber":157,"author":{"gitId":"-"},"content":" this.logger.info(`IssueTablesComponent: Opening Issue ${id} on Github`);"},{"lineNumber":158,"author":{"gitId":"-"},"content":" this.githubService.viewIssueInBrowser(id, event);"},{"lineNumber":159,"author":{"gitId":"-"},"content":" }"},{"lineNumber":160,"author":{"gitId":"-"},"content":""},{"lineNumber":161,"author":{"gitId":"-"},"content":" deleteIssue(id: number, event: Event) {"},{"lineNumber":162,"author":{"gitId":"-"},"content":" this.logger.info(`IssueTablesComponent: Deleting Issue ${id}`);"},{"lineNumber":163,"author":{"gitId":"-"},"content":" this.issuesPendingDeletion \u003d {"},{"lineNumber":164,"author":{"gitId":"-"},"content":" ...this.issuesPendingDeletion,"},{"lineNumber":165,"author":{"gitId":"-"},"content":" [id]: true"},{"lineNumber":166,"author":{"gitId":"-"},"content":" };"},{"lineNumber":167,"author":{"gitId":"-"},"content":" this.issueService"},{"lineNumber":168,"author":{"gitId":"-"},"content":" .deleteIssue(id)"},{"lineNumber":169,"author":{"gitId":"-"},"content":" .pipe("},{"lineNumber":170,"author":{"gitId":"-"},"content":" finalize(() \u003d\u003e {"},{"lineNumber":171,"author":{"gitId":"-"},"content":" const { [id]: issueRemoved, ...theRest } \u003d this.issuesPendingDeletion;"},{"lineNumber":172,"author":{"gitId":"-"},"content":" this.issuesPendingDeletion \u003d theRest;"},{"lineNumber":173,"author":{"gitId":"-"},"content":" })"},{"lineNumber":174,"author":{"gitId":"-"},"content":" )"},{"lineNumber":175,"author":{"gitId":"-"},"content":" .subscribe("},{"lineNumber":176,"author":{"gitId":"-"},"content":" (removedIssue) \u003d\u003e {},"},{"lineNumber":177,"author":{"gitId":"-"},"content":" (error) \u003d\u003e {"},{"lineNumber":178,"author":{"gitId":"-"},"content":" this.errorHandlingService.handleError(error);"},{"lineNumber":179,"author":{"gitId":"-"},"content":" }"},{"lineNumber":180,"author":{"gitId":"-"},"content":" );"},{"lineNumber":181,"author":{"gitId":"-"},"content":" event.stopPropagation();"},{"lineNumber":182,"author":{"gitId":"-"},"content":""},{"lineNumber":183,"author":{"gitId":"-"},"content":" let snackBarRef \u003d null;"},{"lineNumber":184,"author":{"gitId":"-"},"content":" snackBarRef \u003d this.snackBar.openFromComponent(UndoActionComponent, {"},{"lineNumber":185,"author":{"gitId":"-"},"content":" data: { message: `Deleted issue ${id}` },"},{"lineNumber":186,"author":{"gitId":"-"},"content":" duration: this.snackBarAutoCloseTime"},{"lineNumber":187,"author":{"gitId":"-"},"content":" });"},{"lineNumber":188,"author":{"gitId":"-"},"content":" snackBarRef.onAction().subscribe(() \u003d\u003e {"},{"lineNumber":189,"author":{"gitId":"-"},"content":" this.undeleteIssue(id, event);"},{"lineNumber":190,"author":{"gitId":"-"},"content":" });"},{"lineNumber":191,"author":{"gitId":"-"},"content":" }"},{"lineNumber":192,"author":{"gitId":"-"},"content":""},{"lineNumber":193,"author":{"gitId":"-"},"content":" undeleteIssue(id: number, event: Event) {"},{"lineNumber":194,"author":{"gitId":"-"},"content":" this.logger.info(`IssueTablesComponent: Undeleting Issue ${id}`);"},{"lineNumber":195,"author":{"gitId":"-"},"content":" this.issueService.undeleteIssue(id).subscribe("},{"lineNumber":196,"author":{"gitId":"-"},"content":" (reopenedIssue) \u003d\u003e {},"},{"lineNumber":197,"author":{"gitId":"-"},"content":" (error) \u003d\u003e {"},{"lineNumber":198,"author":{"gitId":"-"},"content":" this.errorHandlingService.handleError(error);"},{"lineNumber":199,"author":{"gitId":"-"},"content":" }"},{"lineNumber":200,"author":{"gitId":"-"},"content":" );"},{"lineNumber":201,"author":{"gitId":"-"},"content":" event.stopPropagation();"},{"lineNumber":202,"author":{"gitId":"-"},"content":""},{"lineNumber":203,"author":{"gitId":"-"},"content":" this.snackBar.open(`Restored issue ${id}`, \u0027\u0027, { duration: this.snackBarAutoCloseTime });"},{"lineNumber":204,"author":{"gitId":"-"},"content":" }"},{"lineNumber":205,"author":{"gitId":"-"},"content":""},{"lineNumber":206,"author":{"gitId":"-"},"content":" openDeleteDialog(id: number, event: Event) {"},{"lineNumber":207,"author":{"gitId":"-"},"content":" const dialogRef \u003d this.dialogService.openUserConfirmationModal("},{"lineNumber":208,"author":{"gitId":"-"},"content":" this.deleteIssueModalMessages,"},{"lineNumber":209,"author":{"gitId":"-"},"content":" this.yesButtonModalMessage,"},{"lineNumber":210,"author":{"gitId":"-"},"content":" this.noButtonModalMessage"},{"lineNumber":211,"author":{"gitId":"-"},"content":" );"},{"lineNumber":212,"author":{"gitId":"-"},"content":""},{"lineNumber":213,"author":{"gitId":"-"},"content":" dialogRef.afterClosed().subscribe((res) \u003d\u003e {"},{"lineNumber":214,"author":{"gitId":"-"},"content":" if (res) {"},{"lineNumber":215,"author":{"gitId":"-"},"content":" this.logger.info(`IssueTablesComponent: Deleting issue ${id}`);"},{"lineNumber":216,"author":{"gitId":"-"},"content":" this.deleteIssue(id, event);"},{"lineNumber":217,"author":{"gitId":"-"},"content":" }"},{"lineNumber":218,"author":{"gitId":"-"},"content":" });"},{"lineNumber":219,"author":{"gitId":"-"},"content":" }"},{"lineNumber":220,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"Arif-Khalid":20,"-":200}},{"path":"src/app/shared/issue/description/description.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003ch3 class\u003d\"mat-title\"\u003e{{ descriptionTitle }}\u003c/h3\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":"\u003cform [formGroup]\u003d\"issueDescriptionForm\" #myForm\u003d\"ngForm\" (ngSubmit)\u003d\"updateDescription(myForm)\"\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"timeline-comment\"\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"timeline-header\"\u003e"},{"lineNumber":5,"author":{"gitId":"-"},"content":" \u003cspan\u003e \u003cstrong\u003e Tester \u003c/strong\u003e posted on {{ issue.created_at }}. \u003c/span\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cbutton style\u003d\"float: right\" mat-button *ngIf\u003d\"permissions.isIssueDescriptionEditable() \u0026\u0026 !isEditing\" (click)\u003d\"changeToEditMode()\"\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":" Edit"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"!isEditing\" class\u003d\"comment\"\u003e"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" \u003cmarkdown [data]\u003d\"issue.description\" disableInternalLink\u003e\u003c/markdown\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"isEditing\"\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003capp-comment-editor"},{"lineNumber":15,"author":{"gitId":"-"},"content":" [id]\u003d\"\u0027description\u0027\""},{"lineNumber":16,"author":{"gitId":"-"},"content":" [commentField]\u003d\"this.issueDescriptionForm.get(\u0027description\u0027)\""},{"lineNumber":17,"author":{"gitId":"-"},"content":" [commentForm]\u003d\"this.issueDescriptionForm\""},{"lineNumber":18,"author":{"gitId":"-"},"content":" [(isFormPending)]\u003d\"this.isSavePending\""},{"lineNumber":19,"author":{"gitId":"-"},"content":" [(submitButtonText)]\u003d\"this.submitButtonText\""},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003c/app-comment-editor\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"editor-actions\"\u003e"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":24,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":25,"author":{"gitId":"-"},"content":" *ngIf\u003d\"conflict\""},{"lineNumber":26,"author":{"gitId":"-"},"content":" type\u003d\"button\""},{"lineNumber":27,"author":{"gitId":"-"},"content":" [disabled]\u003d\"isSavePending\""},{"lineNumber":28,"author":{"gitId":"-"},"content":" mat-raised-button"},{"lineNumber":29,"author":{"gitId":"-"},"content":" color\u003d\"primary\""},{"lineNumber":30,"author":{"gitId":"-"},"content":" (click)\u003d\"viewChanges()\""},{"lineNumber":31,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":32,"author":{"gitId":"-"},"content":" View Updated Description"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":35,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":36,"author":{"gitId":"-"},"content":" type\u003d\"button\""},{"lineNumber":37,"author":{"gitId":"-"},"content":" [disabled]\u003d\"isSavePending\""},{"lineNumber":38,"author":{"gitId":"-"},"content":" mat-stroked-button"},{"lineNumber":39,"author":{"gitId":"-"},"content":" color\u003d\"warn\""},{"lineNumber":40,"author":{"gitId":"-"},"content":" (click)\u003d\"openCancelDialogIfModified()\""},{"lineNumber":41,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":42,"author":{"gitId":"-"},"content":" Cancel"},{"lineNumber":43,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":44,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":45,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":46,"author":{"gitId":"-"},"content":" *ngIf\u003d\"conflict\""},{"lineNumber":47,"author":{"gitId":"-"},"content":" type\u003d\"submit\""},{"lineNumber":48,"author":{"gitId":"-"},"content":" [disabled]\u003d\"issueDescriptionForm.invalid || isSavePending\""},{"lineNumber":49,"author":{"gitId":"-"},"content":" mat-raised-button"},{"lineNumber":50,"author":{"gitId":"-"},"content":" color\u003d\"warn\""},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":52,"author":{"gitId":"-"},"content":" {{ submitButtonText }}"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":55,"author":{"gitId":"-"},"content":" class\u003d\"editor-action additional-editor-style\""},{"lineNumber":56,"author":{"gitId":"-"},"content":" *ngIf\u003d\"!conflict\""},{"lineNumber":57,"author":{"gitId":"-"},"content":" type\u003d\"submit\""},{"lineNumber":58,"author":{"gitId":"-"},"content":" [disabled]\u003d\"issueDescriptionForm.invalid || isSavePending\""},{"lineNumber":59,"author":{"gitId":"-"},"content":" mat-stroked-button"},{"lineNumber":60,"author":{"gitId":"-"},"content":" color\u003d\"primary\""},{"lineNumber":61,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":62,"author":{"gitId":"-"},"content":" \u003cmat-button-content\u003e"},{"lineNumber":63,"author":{"gitId":"-"},"content":" {{ submitButtonText }}"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u003cng-container #loadingSpinnerContainer\u003e\u003c/ng-container\u003e"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003c/mat-button-content\u003e"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":67,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":68,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":69,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":70,"author":{"gitId":"-"},"content":"\u003c/form\u003e"}],"authorContributionMap":{"NereusWB922":1,"-":69}},{"path":"src/app/shared/issue/duplicatedIssues/duplicated-issues.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cdiv\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003cspan class\u003d\"mat-title\"\u003e Duplicated Issues \u003c/span\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \u003cmat-chip-list\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":" \u003cmat-chip"},{"lineNumber":5,"author":{"gitId":"-"},"content":" *ngFor\u003d\"let duplicatedIssue of duplicatedIssues | async\""},{"lineNumber":6,"author":{"gitId":"-"},"content":" style\u003d\"cursor: pointer\""},{"lineNumber":7,"author":{"gitId":"-"},"content":" [matTooltip]\u003d\"duplicatedIssue.title\""},{"lineNumber":8,"author":{"gitId":"-"},"content":" matTooltipPosition\u003d\"above\""},{"lineNumber":9,"author":{"gitId":"-"},"content":" (removed)\u003d\"removeDuplicateStatus(duplicatedIssue)\""},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":11,"author":{"gitId":"nknguyenhc"},"content":" \u003ca class\u003d\"no-underline link-grey-dark\" [routerLink]\u003d\"[\u0027../\u0027 + duplicatedIssue.id]\"\u003e #{{ duplicatedIssue.id }} \u003c/a\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cmat-icon *ngIf\u003d\"permissions.isTeamResponseEditable() || permissions.isTutorResponseEditable()\" matChipRemove\u003ecancel\u003c/mat-icon\u003e"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/mat-chip\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003c/mat-chip-list\u003e"},{"lineNumber":15,"author":{"gitId":"-"},"content":"\u003c/div\u003e"}],"authorContributionMap":{"nknguyenhc":1,"-":14}},{"path":"src/app/shared/layout/header.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Location } from \u0027@angular/common\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Component, OnInit } from \u0027@angular/core\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { Router, RoutesRecognized } from \u0027@angular/router\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { filter, pairwise } from \u0027rxjs/operators\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { AppConfig } from \u0027../../../environments/environment\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { Phase } from \u0027../../core/models/phase.model\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { UserRole } from \u0027../../core/models/user.model\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { AuthService } from \u0027../../core/services/auth.service\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { DialogService } from \u0027../../core/services/dialog.service\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import { ErrorHandlingService } from \u0027../../core/services/error-handling.service\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027../../core/services/github.service\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import { GithubEventService } from \u0027../../core/services/githubevent.service\u0027;"},{"lineNumber":13,"author":{"gitId":"Arif-Khalid"},"content":"import { IssueTableSettingsService } from \u0027../../core/services/issue-table-settings.service\u0027;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027../../core/services/issue.service\u0027;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027../../core/services/logging.service\u0027;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import { PhaseDescription, PhaseService } from \u0027../../core/services/phase.service\u0027;"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import { UserService } from \u0027../../core/services/user.service\u0027;"},{"lineNumber":18,"author":{"gitId":"-"},"content":""},{"lineNumber":19,"author":{"gitId":"-"},"content":"const ISSUE_TRACKER_URL \u003d \u0027https://github.com/CATcher-org/CATcher/issues\u0027;"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":22,"author":{"gitId":"-"},"content":" selector: \u0027app-layout-header\u0027,"},{"lineNumber":23,"author":{"gitId":"-"},"content":" templateUrl: \u0027./header.component.html\u0027"},{"lineNumber":24,"author":{"gitId":"-"},"content":"})"},{"lineNumber":25,"author":{"gitId":"-"},"content":"export class HeaderComponent implements OnInit {"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private prevUrl;"},{"lineNumber":27,"author":{"gitId":"-"},"content":" isReloadButtonDisabled \u003d false;"},{"lineNumber":28,"author":{"gitId":"-"},"content":" ISSUE_FILTER \u003d \u0027/issues?q\u003dis:issue+is:open\u0027; // the filtered list must be an issue and must be open"},{"lineNumber":29,"author":{"gitId":"-"},"content":" TUTORIAL_LABEL \u003d \u0027+label:tutorial.\u0027;"},{"lineNumber":30,"author":{"gitId":"-"},"content":" TEAM_LABEL \u003d \u0027+label:team.\u0027;"},{"lineNumber":31,"author":{"gitId":"-"},"content":" EXCLUDE_DUPLICATE \u003d \u0027+-label:duplicate\u0027; // exclude duplicate issues"},{"lineNumber":32,"author":{"gitId":"-"},"content":""},{"lineNumber":33,"author":{"gitId":"-"},"content":" // Messages for the modal popup window upon logging out"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private readonly logOutDialogMessages \u003d [\u0027Do you wish to log out?\u0027];"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private readonly yesButtonDialogMessage \u003d \u0027Yes, I wish to log out\u0027;"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private readonly noButtonDialogMessage \u003d \"No, I don\u0027t wish to log out\";"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":" constructor("},{"lineNumber":39,"author":{"gitId":"-"},"content":" private router: Router,"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public auth: AuthService,"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public phaseService: PhaseService,"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public userService: UserService,"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public logger: LoggingService,"},{"lineNumber":44,"author":{"gitId":"-"},"content":" private location: Location,"},{"lineNumber":45,"author":{"gitId":"-"},"content":" private githubEventService: GithubEventService,"},{"lineNumber":46,"author":{"gitId":"-"},"content":" private issueService: IssueService,"},{"lineNumber":47,"author":{"gitId":"-"},"content":" private errorHandlingService: ErrorHandlingService,"},{"lineNumber":48,"author":{"gitId":"-"},"content":" private githubService: GithubService,"},{"lineNumber":49,"author":{"gitId":"Arif-Khalid"},"content":" private dialogService: DialogService,"},{"lineNumber":50,"author":{"gitId":"Arif-Khalid"},"content":" private issueTableSettingsService: IssueTableSettingsService"},{"lineNumber":51,"author":{"gitId":"-"},"content":" ) {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" router.events"},{"lineNumber":53,"author":{"gitId":"-"},"content":" .pipe("},{"lineNumber":54,"author":{"gitId":"-"},"content":" filter((e: any) \u003d\u003e e instanceof RoutesRecognized),"},{"lineNumber":55,"author":{"gitId":"-"},"content":" pairwise()"},{"lineNumber":56,"author":{"gitId":"-"},"content":" )"},{"lineNumber":57,"author":{"gitId":"-"},"content":" .subscribe((e) \u003d\u003e {"},{"lineNumber":58,"author":{"gitId":"-"},"content":" this.prevUrl \u003d e[0].urlAfterRedirects;"},{"lineNumber":59,"author":{"gitId":"-"},"content":" });"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }"},{"lineNumber":61,"author":{"gitId":"-"},"content":""},{"lineNumber":62,"author":{"gitId":"-"},"content":" ngOnInit() {}"},{"lineNumber":63,"author":{"gitId":"-"},"content":""},{"lineNumber":64,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":65,"author":{"gitId":"-"},"content":" * Replaces and resets the current phase data and routes the app to the"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * newly selected phase."},{"lineNumber":67,"author":{"gitId":"-"},"content":" * @param openPhase - Open Phase that is selected by the user."},{"lineNumber":68,"author":{"gitId":"-"},"content":" */"},{"lineNumber":69,"author":{"gitId":"-"},"content":" routeToSelectedPhase(openPhase: string): void {"},{"lineNumber":70,"author":{"gitId":"-"},"content":" // Do nothing if the selected phase is the current phase."},{"lineNumber":71,"author":{"gitId":"-"},"content":" if (this.phaseService.currentPhase \u003d\u003d\u003d Phase[openPhase]) {"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }"},{"lineNumber":74,"author":{"gitId":"-"},"content":" // Replace Current Phase Data."},{"lineNumber":75,"author":{"gitId":"-"},"content":" this.phaseService.currentPhase \u003d Phase[openPhase];"},{"lineNumber":76,"author":{"gitId":"-"},"content":" this.githubService.storePhaseDetails("},{"lineNumber":77,"author":{"gitId":"-"},"content":" this.phaseService.getPhaseOwner(this.phaseService.currentPhase),"},{"lineNumber":78,"author":{"gitId":"-"},"content":" this.phaseService.sessionData[openPhase]"},{"lineNumber":79,"author":{"gitId":"-"},"content":" );"},{"lineNumber":80,"author":{"gitId":"-"},"content":""},{"lineNumber":81,"author":{"gitId":"-"},"content":" // Remove current phase issues and load selected phase issues."},{"lineNumber":82,"author":{"gitId":"-"},"content":" this.githubService.reset();"},{"lineNumber":83,"author":{"gitId":"-"},"content":" this.issueService.reset(false);"},{"lineNumber":84,"author":{"gitId":"-"},"content":" this.reload();"},{"lineNumber":85,"author":{"gitId":"-"},"content":""},{"lineNumber":86,"author":{"gitId":"Arif-Khalid"},"content":" // Reset Issue Table Settings"},{"lineNumber":87,"author":{"gitId":"Arif-Khalid"},"content":" this.issueTableSettingsService.clearTableSettings();"},{"lineNumber":88,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":89,"author":{"gitId":"-"},"content":" // Route app to new phase."},{"lineNumber":90,"author":{"gitId":"-"},"content":" this.router.navigateByUrl(this.phaseService.currentPhase);"},{"lineNumber":91,"author":{"gitId":"-"},"content":" }"},{"lineNumber":92,"author":{"gitId":"-"},"content":""},{"lineNumber":93,"author":{"gitId":"-"},"content":" isBackButtonShown(): boolean {"},{"lineNumber":94,"author":{"gitId":"-"},"content":" return `/${this.phaseService.currentPhase}` !\u003d\u003d this.router.url \u0026\u0026 this.router.url !\u003d\u003d \u0027/\u0027 \u0026\u0026 !this.router.url.startsWith(\u0027/?code\u0027);"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }"},{"lineNumber":96,"author":{"gitId":"-"},"content":""},{"lineNumber":97,"author":{"gitId":"-"},"content":" isReloadButtonShown(): boolean {"},{"lineNumber":98,"author":{"gitId":"-"},"content":" return this.router.url !\u003d\u003d \u0027/phaseBugReporting/issues/new\u0027;"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }"},{"lineNumber":100,"author":{"gitId":"-"},"content":""},{"lineNumber":101,"author":{"gitId":"-"},"content":" isOpenUrlButtonShown(): boolean {"},{"lineNumber":102,"author":{"gitId":"-"},"content":" return ("},{"lineNumber":103,"author":{"gitId":"-"},"content":" this.phaseService.currentPhase \u003d\u003d\u003d Phase.phaseBugReporting ||"},{"lineNumber":104,"author":{"gitId":"-"},"content":" this.userService.currentUser.role \u003d\u003d\u003d UserRole.Student ||"},{"lineNumber":105,"author":{"gitId":"-"},"content":" this.issueService.getIssueTeamFilter() !\u003d\u003d \u0027All Teams\u0027 ||"},{"lineNumber":106,"author":{"gitId":"-"},"content":" this.router.url.includes(\u0027/issues\u0027)"},{"lineNumber":107,"author":{"gitId":"-"},"content":" );"},{"lineNumber":108,"author":{"gitId":"-"},"content":" }"},{"lineNumber":109,"author":{"gitId":"-"},"content":""},{"lineNumber":110,"author":{"gitId":"-"},"content":" getVersion(): string {"},{"lineNumber":111,"author":{"gitId":"-"},"content":" return AppConfig.version;"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }"},{"lineNumber":113,"author":{"gitId":"-"},"content":""},{"lineNumber":114,"author":{"gitId":"-"},"content":" getPhaseDescription(openPhase: string): string {"},{"lineNumber":115,"author":{"gitId":"-"},"content":" return PhaseDescription[openPhase];"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }"},{"lineNumber":117,"author":{"gitId":"-"},"content":""},{"lineNumber":118,"author":{"gitId":"-"},"content":" goBack() {"},{"lineNumber":119,"author":{"gitId":"-"},"content":" if (this.prevUrl \u003d\u003d\u003d `/${this.phaseService.currentPhase}/issues/new`) {"},{"lineNumber":120,"author":{"gitId":"-"},"content":" this.router.navigate([\u0027/phaseBugReporting\u0027]);"},{"lineNumber":121,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":122,"author":{"gitId":"-"},"content":" this.location.back();"},{"lineNumber":123,"author":{"gitId":"-"},"content":" }"},{"lineNumber":124,"author":{"gitId":"-"},"content":" }"},{"lineNumber":125,"author":{"gitId":"-"},"content":""},{"lineNumber":126,"author":{"gitId":"-"},"content":" viewBrowser() {"},{"lineNumber":127,"author":{"gitId":"-"},"content":" const routerUrl \u003d this.router.url.substring(1); // remove the first \u0027/\u0027 from string"},{"lineNumber":128,"author":{"gitId":"-"},"content":" const issueUrlIndex \u003d routerUrl.indexOf(\u0027/\u0027); // find the index of second \u0027/\u0027"},{"lineNumber":129,"author":{"gitId":"-"},"content":" let issueUrl: string;"},{"lineNumber":130,"author":{"gitId":"-"},"content":""},{"lineNumber":131,"author":{"gitId":"-"},"content":" // If can\u0027t find the index of second \u0027/\u0027, then router is at the /issues (table list) page"},{"lineNumber":132,"author":{"gitId":"-"},"content":" if (issueUrlIndex \u003c 0) {"},{"lineNumber":133,"author":{"gitId":"-"},"content":" // Apply filters to the issueUrl"},{"lineNumber":134,"author":{"gitId":"-"},"content":" issueUrl \u003d this.ISSUE_FILTER.concat(this.getTeamFilterString());"},{"lineNumber":135,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":136,"author":{"gitId":"-"},"content":" // issueUrl will be from the second \u0027/\u0027"},{"lineNumber":137,"author":{"gitId":"-"},"content":" issueUrl \u003d routerUrl.substring(issueUrlIndex);"},{"lineNumber":138,"author":{"gitId":"-"},"content":" }"},{"lineNumber":139,"author":{"gitId":"-"},"content":" // Open the url in user\u0027s preferred browser"},{"lineNumber":140,"author":{"gitId":"-"},"content":" window.open(\u0027https://github.com/\u0027.concat(this.githubService.getRepoURL()).concat(issueUrl));"},{"lineNumber":141,"author":{"gitId":"-"},"content":" }"},{"lineNumber":142,"author":{"gitId":"-"},"content":""},{"lineNumber":143,"author":{"gitId":"-"},"content":" openIssueTracker() {"},{"lineNumber":144,"author":{"gitId":"-"},"content":" window.open(ISSUE_TRACKER_URL);"},{"lineNumber":145,"author":{"gitId":"-"},"content":" }"},{"lineNumber":146,"author":{"gitId":"-"},"content":""},{"lineNumber":147,"author":{"gitId":"-"},"content":" private getTeamFilterString() {"},{"lineNumber":148,"author":{"gitId":"-"},"content":" // First Phase does not need team filtering"},{"lineNumber":149,"author":{"gitId":"-"},"content":" if (this.phaseService.currentPhase \u003d\u003d\u003d Phase.phaseBugReporting || this.phaseService.currentPhase \u003d\u003d\u003d Phase.phaseTesterResponse) {"},{"lineNumber":150,"author":{"gitId":"-"},"content":" return \u0027\u0027;"},{"lineNumber":151,"author":{"gitId":"-"},"content":" }"},{"lineNumber":152,"author":{"gitId":"-"},"content":""},{"lineNumber":153,"author":{"gitId":"-"},"content":" // Initialise the team filter for Students in other Phases, as they do not have team filter assigned by default"},{"lineNumber":154,"author":{"gitId":"-"},"content":" if (this.userService.currentUser.team) {"},{"lineNumber":155,"author":{"gitId":"-"},"content":" this.issueService.setIssueTeamFilter(this.userService.currentUser.team.id); // e.g W12-3"},{"lineNumber":156,"author":{"gitId":"-"},"content":" }"},{"lineNumber":157,"author":{"gitId":"-"},"content":""},{"lineNumber":158,"author":{"gitId":"-"},"content":" const teamFilter \u003d this.issueService.getIssueTeamFilter().split(\u0027-\u0027); // e.g CS2103T-W12-3 -\u003e CS2103T, W12 and 3"},{"lineNumber":159,"author":{"gitId":"-"},"content":" // The team filter string E.g \"+label:tutorial.W12+label:team.3\""},{"lineNumber":160,"author":{"gitId":"-"},"content":" const teamFilterString \u003d this.TUTORIAL_LABEL.concat(`${teamFilter[0]}-${teamFilter[1]}`).concat(this.TEAM_LABEL).concat(teamFilter[2]);"},{"lineNumber":161,"author":{"gitId":"-"},"content":" // Only include duplicate Issues in last Phase"},{"lineNumber":162,"author":{"gitId":"-"},"content":" return this.phaseService.currentPhase \u003d\u003d\u003d Phase.phaseModeration ? teamFilterString : this.EXCLUDE_DUPLICATE.concat(teamFilterString);"},{"lineNumber":163,"author":{"gitId":"-"},"content":" }"},{"lineNumber":164,"author":{"gitId":"-"},"content":""},{"lineNumber":165,"author":{"gitId":"-"},"content":" reload() {"},{"lineNumber":166,"author":{"gitId":"-"},"content":" this.isReloadButtonDisabled \u003d true;"},{"lineNumber":167,"author":{"gitId":"-"},"content":""},{"lineNumber":168,"author":{"gitId":"-"},"content":" this.githubEventService.reloadPage().subscribe("},{"lineNumber":169,"author":{"gitId":"-"},"content":" (success) \u003d\u003e success,"},{"lineNumber":170,"author":{"gitId":"-"},"content":" (error) \u003d\u003e {"},{"lineNumber":171,"author":{"gitId":"-"},"content":" this.errorHandlingService.handleError(error, () \u003d\u003e this.githubEventService.reloadPage());"},{"lineNumber":172,"author":{"gitId":"-"},"content":" }"},{"lineNumber":173,"author":{"gitId":"-"},"content":" );"},{"lineNumber":174,"author":{"gitId":"-"},"content":""},{"lineNumber":175,"author":{"gitId":"-"},"content":" // Prevent user from spamming the reload button"},{"lineNumber":176,"author":{"gitId":"-"},"content":" setTimeout(() \u003d\u003e {"},{"lineNumber":177,"author":{"gitId":"-"},"content":" this.isReloadButtonDisabled \u003d false;"},{"lineNumber":178,"author":{"gitId":"-"},"content":" }, 3000);"},{"lineNumber":179,"author":{"gitId":"-"},"content":" }"},{"lineNumber":180,"author":{"gitId":"-"},"content":""},{"lineNumber":181,"author":{"gitId":"-"},"content":" logOut() {"},{"lineNumber":182,"author":{"gitId":"-"},"content":" this.auth.logOut();"},{"lineNumber":183,"author":{"gitId":"-"},"content":" }"},{"lineNumber":184,"author":{"gitId":"-"},"content":""},{"lineNumber":185,"author":{"gitId":"-"},"content":" openLogOutDialog() {"},{"lineNumber":186,"author":{"gitId":"-"},"content":" const dialogRef \u003d this.dialogService.openUserConfirmationModal("},{"lineNumber":187,"author":{"gitId":"-"},"content":" this.logOutDialogMessages,"},{"lineNumber":188,"author":{"gitId":"-"},"content":" this.yesButtonDialogMessage,"},{"lineNumber":189,"author":{"gitId":"-"},"content":" this.noButtonDialogMessage"},{"lineNumber":190,"author":{"gitId":"-"},"content":" );"},{"lineNumber":191,"author":{"gitId":"-"},"content":""},{"lineNumber":192,"author":{"gitId":"-"},"content":" dialogRef.afterClosed().subscribe((res) \u003d\u003e {"},{"lineNumber":193,"author":{"gitId":"-"},"content":" if (res) {"},{"lineNumber":194,"author":{"gitId":"-"},"content":" this.logger.info(`HeaderComponent: Logging out from ${this.userService.currentUser.loginId}`);"},{"lineNumber":195,"author":{"gitId":"-"},"content":" this.logOut();"},{"lineNumber":196,"author":{"gitId":"-"},"content":" }"},{"lineNumber":197,"author":{"gitId":"-"},"content":" });"},{"lineNumber":198,"author":{"gitId":"-"},"content":" }"},{"lineNumber":199,"author":{"gitId":"-"},"content":""},{"lineNumber":200,"author":{"gitId":"-"},"content":" exportLogFile() {"},{"lineNumber":201,"author":{"gitId":"-"},"content":" this.logger.exportLogFile();"},{"lineNumber":202,"author":{"gitId":"-"},"content":" }"},{"lineNumber":203,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"Arif-Khalid":6,"-":197}},{"path":"src/app/shared/lib/marked.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { MarkedOptions, MarkedRenderer } from \u0027ngx-markdown\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"export function markedOptionsFactory(): MarkedOptions {"},{"lineNumber":4,"author":{"gitId":"-"},"content":" const renderer \u003d new MarkedRenderer();"},{"lineNumber":5,"author":{"gitId":"-"},"content":" const linkRenderer \u003d renderer.link;"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":" renderer.link \u003d (href, title, text) \u003d\u003e {"},{"lineNumber":8,"author":{"gitId":"-"},"content":" const html \u003d linkRenderer.call(renderer, href, title, text);"},{"lineNumber":9,"author":{"gitId":"-"},"content":" return html.replace(/^\u003ca /, \u0027\u003ca target\u003d\"_blank\" \u0027);"},{"lineNumber":10,"author":{"gitId":"-"},"content":" };"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":" renderer.checkbox \u003d (checked) \u003d\u003e {"},{"lineNumber":13,"author":{"gitId":"-"},"content":" return checked ? \u0027\u003ci class\u003d\"fa-solid fa-square-check\"\u003e\u003c/i\u003e \u0027 : \u0027\u003ci class\u003d\"fa-solid fa-square\"\u003e\u003c/i\u003e \u0027;"},{"lineNumber":14,"author":{"gitId":"-"},"content":" };"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":" return {"},{"lineNumber":17,"author":{"gitId":"-"},"content":" renderer,"},{"lineNumber":18,"author":{"gitId":"-"},"content":" gfm: true,"},{"lineNumber":19,"author":{"gitId":"nknguyenhc"},"content":" breaks: true,"},{"lineNumber":20,"author":{"gitId":"-"},"content":" pedantic: false,"},{"lineNumber":21,"author":{"gitId":"-"},"content":" smartLists: true,"},{"lineNumber":22,"author":{"gitId":"-"},"content":" smartypants: false"},{"lineNumber":23,"author":{"gitId":"-"},"content":" };"},{"lineNumber":24,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":1,"-":23}},{"path":"src/app/shared/shared.module.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { CommonModule } from \u0027@angular/common\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { HttpClientModule } from \u0027@angular/common/http\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { NgModule } from \u0027@angular/core\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { FormsModule, ReactiveFormsModule } from \u0027@angular/forms\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { RouterModule } from \u0027@angular/router\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { FormDisableControlDirective } from \u0027../core/directives/form-disable-control.directive\u0027;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"import { InternalLinkDisableDirective } from \u0027../core/directives/internal-link-disable.directive\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { ActionToasterModule } from \u0027./action-toasters/action-toasters.module\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { ErrorToasterModule } from \u0027./error-toasters/error-toaster.module\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import { MaterialModule } from \u0027./material.module\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"@NgModule({"},{"lineNumber":13,"author":{"gitId":"-"},"content":" imports: [CommonModule, FormsModule, ReactiveFormsModule, HttpClientModule, RouterModule, MaterialModule, ErrorToasterModule],"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" declarations: [FormDisableControlDirective, InternalLinkDisableDirective],"},{"lineNumber":15,"author":{"gitId":"-"},"content":" exports: ["},{"lineNumber":16,"author":{"gitId":"-"},"content":" FormDisableControlDirective,"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" InternalLinkDisableDirective,"},{"lineNumber":18,"author":{"gitId":"-"},"content":" CommonModule,"},{"lineNumber":19,"author":{"gitId":"-"},"content":" FormsModule,"},{"lineNumber":20,"author":{"gitId":"-"},"content":" ReactiveFormsModule,"},{"lineNumber":21,"author":{"gitId":"-"},"content":" HttpClientModule,"},{"lineNumber":22,"author":{"gitId":"-"},"content":" RouterModule,"},{"lineNumber":23,"author":{"gitId":"-"},"content":" MaterialModule,"},{"lineNumber":24,"author":{"gitId":"-"},"content":" ErrorToasterModule,"},{"lineNumber":25,"author":{"gitId":"-"},"content":" ActionToasterModule"},{"lineNumber":26,"author":{"gitId":"-"},"content":" ]"},{"lineNumber":27,"author":{"gitId":"-"},"content":"})"},{"lineNumber":28,"author":{"gitId":"-"},"content":"export class SharedModule {}"}],"authorContributionMap":{"NereusWB922":3,"-":25}},{"path":"src/app/shared/view-issue/issue-dispute/issue-dispute.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003ch3 class\u003d\"mat-title\"\u003eDisputes\u003c/h3\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":"\u003cform [formGroup]\u003d\"tutorResponseForm\" #tutorForm\u003d\"ngForm\" (ngSubmit)\u003d\"submitTutorResponseForm(tutorForm)\"\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"timeline-comment\"\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"timeline-header\"\u003e"},{"lineNumber":5,"author":{"gitId":"-"},"content":" \u003cspan\u003e Post your response here. \u003c/span\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cbutton mat-button style\u003d\"float: right\" *ngIf\u003d\"!isEditing\" (click)\u003d\"changeToEditMode()\"\u003eEdit\u003c/button\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cdiv\u003e"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"container\" *ngFor\u003d\"let dispute of issue.issueDisputes; index as i; trackBy: trackDisputeList\"\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cdiv style\u003d\"display: flex; align-items: center\"\u003e"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"question-mark\"\u003e?\u003c/div\u003e"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" \u003cmarkdown [data]\u003d\"this.getItemTitleText(dispute.title)\" disableInternalLink\u003e\u003c/markdown\u003e"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cbr /\u003e"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" \u003cmarkdown [data]\u003d\"dispute.description\" disableInternalLink\u003e\u003c/markdown\u003e"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003cbr /\u003e"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003cdiv\u003e"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003cmat-checkbox"},{"lineNumber":19,"author":{"gitId":"-"},"content":" style\u003d\"display: inline-block; width: 20%\""},{"lineNumber":20,"author":{"gitId":"-"},"content":" [id]\u003d\"getTodoFormId(i)\""},{"lineNumber":21,"author":{"gitId":"-"},"content":" [formControlName]\u003d\"getTodoFormId(i)\""},{"lineNumber":22,"author":{"gitId":"-"},"content":" [disableControl]\u003d\"!isEditing\""},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":24,"author":{"gitId":"-"},"content":" Done"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003c/mat-checkbox\u003e"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cbr /\u003e"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003cdiv\u003e"},{"lineNumber":29,"author":{"gitId":"-"},"content":" \u003cmarkdown data\u003d\"### Tutor\u0027s Response: \"\u003e\u003c/markdown\u003e"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" \u003cmarkdown [data]\u003d\"dispute.tutorResponse\" *ngIf\u003d\"!isEditing\" disableInternalLink\u003e\u003c/markdown\u003e"},{"lineNumber":31,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"isEditing\"\u003e"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u003capp-comment-editor"},{"lineNumber":34,"author":{"gitId":"-"},"content":" [commentField]\u003d\"tutorResponseForm.get(getTutorResponseFormId(i))\""},{"lineNumber":35,"author":{"gitId":"-"},"content":" [commentForm]\u003d\"tutorResponseForm\""},{"lineNumber":36,"author":{"gitId":"-"},"content":" [id]\u003d\"getTutorResponseFormId(i)\""},{"lineNumber":37,"author":{"gitId":"-"},"content":" [(isFormPending)]\u003d\"isFormPending\""},{"lineNumber":38,"author":{"gitId":"-"},"content":" [(submitButtonText)]\u003d\"submitButtonText\""},{"lineNumber":39,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":40,"author":{"gitId":"-"},"content":" \u003c/app-comment-editor\u003e"},{"lineNumber":41,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":42,"author":{"gitId":"-"},"content":" \u003cbr /\u003e"},{"lineNumber":43,"author":{"gitId":"-"},"content":" \u003cmarkdown data\u003d\"-------------------\"\u003e\u003c/markdown\u003e \u003cbr /\u003e"},{"lineNumber":44,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \u003cmat-divider\u003e\u003c/mat-divider\u003e"},{"lineNumber":46,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"editor-actions\" *ngIf\u003d\"isEditing\"\u003e"},{"lineNumber":47,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":48,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":49,"author":{"gitId":"-"},"content":" *ngIf\u003d\"conflict\""},{"lineNumber":50,"author":{"gitId":"-"},"content":" type\u003d\"button\""},{"lineNumber":51,"author":{"gitId":"-"},"content":" [disabled]\u003d\"isFormPending\""},{"lineNumber":52,"author":{"gitId":"-"},"content":" mat-raised-button"},{"lineNumber":53,"author":{"gitId":"-"},"content":" color\u003d\"primary\""},{"lineNumber":54,"author":{"gitId":"-"},"content":" (click)\u003d\"viewInGithub()\""},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":56,"author":{"gitId":"-"},"content":" View Updated Response On Github"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":59,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":60,"author":{"gitId":"-"},"content":" type\u003d\"submit\""},{"lineNumber":61,"author":{"gitId":"-"},"content":" *ngIf\u003d\"!conflict\""},{"lineNumber":62,"author":{"gitId":"-"},"content":" [disabled]\u003d\"tutorResponseForm.invalid || isFormPending\""},{"lineNumber":63,"author":{"gitId":"-"},"content":" mat-stroked-button"},{"lineNumber":64,"author":{"gitId":"-"},"content":" color\u003d\"primary\""},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":66,"author":{"gitId":"-"},"content":" {{ submitButtonText }}"},{"lineNumber":67,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":68,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":69,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":70,"author":{"gitId":"-"},"content":" type\u003d\"submit\""},{"lineNumber":71,"author":{"gitId":"-"},"content":" [disabled]\u003d\"tutorResponseForm.invalid || isFormPending\""},{"lineNumber":72,"author":{"gitId":"-"},"content":" mat-raised-button"},{"lineNumber":73,"author":{"gitId":"-"},"content":" color\u003d\"warn\""},{"lineNumber":74,"author":{"gitId":"-"},"content":" *ngIf\u003d\"conflict\""},{"lineNumber":75,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":76,"author":{"gitId":"-"},"content":" {{ submitButtonText }}"},{"lineNumber":77,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":78,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":79,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":80,"author":{"gitId":"-"},"content":" type\u003d\"button\""},{"lineNumber":81,"author":{"gitId":"-"},"content":" [disabled]\u003d\"isFormPending\""},{"lineNumber":82,"author":{"gitId":"-"},"content":" style\u003d\"margin-left: 10px\""},{"lineNumber":83,"author":{"gitId":"-"},"content":" *ngIf\u003d\"!this.isNewResponse()\""},{"lineNumber":84,"author":{"gitId":"-"},"content":" mat-stroked-button"},{"lineNumber":85,"author":{"gitId":"-"},"content":" color\u003d\"warn\""},{"lineNumber":86,"author":{"gitId":"-"},"content":" (click)\u003d\"cancelEditMode()\""},{"lineNumber":87,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":88,"author":{"gitId":"-"},"content":" Cancel"},{"lineNumber":89,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":90,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":91,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":92,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":93,"author":{"gitId":"-"},"content":"\u003c/form\u003e"}],"authorContributionMap":{"NereusWB922":3,"-":90}},{"path":"src/app/shared/view-issue/team-response/team-response.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003ch3 class\u003d\"mat-title\"\u003eTeam\u0027s Response\u003c/h3\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":"\u003cform [formGroup]\u003d\"responseForm\" #myForm\u003d\"ngForm\" (ngSubmit)\u003d\"updateResponse(myForm)\"\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"timeline-comment\"\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"timeline-header\"\u003e"},{"lineNumber":5,"author":{"gitId":"-"},"content":" \u003cspan\u003e \u003cstrong\u003e Team \u003c/strong\u003e responded. \u003c/span\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cbutton style\u003d\"float: right\" mat-button *ngIf\u003d\"canEditIssue() \u0026\u0026 !isEditing\" (click)\u003d\"changeToEditMode()\"\u003eEdit\u003c/button\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"!isEditing\" class\u003d\"comment\"\u003e"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" \u003cmarkdown [data]\u003d\"issue.teamResponse\" disableInternalLink\u003e\u003c/markdown\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"isEditing\"\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003capp-comment-editor"},{"lineNumber":13,"author":{"gitId":"-"},"content":" [id]\u003d\"\u0027description\u0027\""},{"lineNumber":14,"author":{"gitId":"-"},"content":" [commentField]\u003d\"this.responseForm.get(\u0027description\u0027)\""},{"lineNumber":15,"author":{"gitId":"-"},"content":" [commentForm]\u003d\"this.responseForm\""},{"lineNumber":16,"author":{"gitId":"-"},"content":" [(isFormPending)]\u003d\"this.isSavePending\""},{"lineNumber":17,"author":{"gitId":"-"},"content":" [(submitButtonText)]\u003d\"this.submitButtonText\""},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003c/app-comment-editor\u003e"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"editor-actions\"\u003e"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":22,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":23,"author":{"gitId":"-"},"content":" *ngIf\u003d\"conflict\""},{"lineNumber":24,"author":{"gitId":"-"},"content":" type\u003d\"button\""},{"lineNumber":25,"author":{"gitId":"-"},"content":" [disabled]\u003d\"isSavePending\""},{"lineNumber":26,"author":{"gitId":"-"},"content":" mat-raised-button"},{"lineNumber":27,"author":{"gitId":"-"},"content":" color\u003d\"primary\""},{"lineNumber":28,"author":{"gitId":"-"},"content":" (click)\u003d\"viewChanges()\""},{"lineNumber":29,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":30,"author":{"gitId":"-"},"content":" View Updated Response"},{"lineNumber":31,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":33,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":34,"author":{"gitId":"-"},"content":" *ngIf\u003d\"conflict\""},{"lineNumber":35,"author":{"gitId":"-"},"content":" type\u003d\"submit\""},{"lineNumber":36,"author":{"gitId":"-"},"content":" [disabled]\u003d\"responseForm.invalid || isSavePending\""},{"lineNumber":37,"author":{"gitId":"-"},"content":" mat-raised-button"},{"lineNumber":38,"author":{"gitId":"-"},"content":" color\u003d\"warn\""},{"lineNumber":39,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":40,"author":{"gitId":"-"},"content":" {{ submitButtonText }}"},{"lineNumber":41,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":42,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":43,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":44,"author":{"gitId":"-"},"content":" *ngIf\u003d\"!conflict\""},{"lineNumber":45,"author":{"gitId":"-"},"content":" type\u003d\"submit\""},{"lineNumber":46,"author":{"gitId":"-"},"content":" [disabled]\u003d\"responseForm.invalid || isSavePending\""},{"lineNumber":47,"author":{"gitId":"-"},"content":" mat-stroked-button"},{"lineNumber":48,"author":{"gitId":"-"},"content":" color\u003d\"primary\""},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":50,"author":{"gitId":"-"},"content":" {{ submitButtonText }}"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":52,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":53,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":54,"author":{"gitId":"-"},"content":" type\u003d\"button\""},{"lineNumber":55,"author":{"gitId":"-"},"content":" [disabled]\u003d\"isSavePending\""},{"lineNumber":56,"author":{"gitId":"-"},"content":" mat-stroked-button"},{"lineNumber":57,"author":{"gitId":"-"},"content":" color\u003d\"warn\""},{"lineNumber":58,"author":{"gitId":"-"},"content":" (click)\u003d\"openCancelDialogIfModified()\""},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":60,"author":{"gitId":"-"},"content":" Cancel"},{"lineNumber":61,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":62,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003c/form\u003e"}],"authorContributionMap":{"NereusWB922":1,"-":64}},{"path":"src/app/shared/view-issue/tester-response/conflict-dialog/conflict-dialog.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cdiv style\u003d\"display: flex; margin-bottom: 20px; align-items: center\"\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003ch1 mat-dialog-title style\u003d\"margin: 0\"\u003e{{ \u0027The content you are editing has changed\u0027 }}\u003c/h1\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \u003cmat-slide-toggle style\u003d\"display: inline-block; margin-left: 50px\" color\u003d\"primary\" [checked]\u003d\"showDiff\" (change)\u003d\"handleChangeShowDiff()\"\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":" Show Difference"},{"lineNumber":5,"author":{"gitId":"-"},"content":" \u003c/mat-slide-toggle\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cbutton mat-icon-button color\u003d\"default\" style\u003d\"margin: 0 0 0 auto\" (click)\u003d\"close()\"\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003eclose\u003c/mat-icon\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c/div\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003cdiv mat-dialog-content\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cmat-accordion [multi]\u003d\"true\"\u003e"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003cmat-expansion-panel class\u003d\"full-width\" *ngFor\u003d\"let conflict of conflicts; index as i\" [expanded]\u003d\"panelOpenStates[i]\"\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cmat-expansion-panel-header\u003e"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cmat-panel-title class\u003d\"response-title\"\u003e"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"question-mark\"\u003e?\u003c/div\u003e"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" \u003cmarkdown [data]\u003d\"data.updatedResponses[i].getTitleInMarkDown()\" disableInternalLink\u003e\u003c/markdown\u003e"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003c/mat-panel-title\u003e"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003cmat-panel-description\u003e"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003cmat-chip-list\u003e"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003cmat-chip *ngIf\u003d\"data.outdatedResponses[i].compareTo(data.updatedResponses[i]) \u003d\u003d\u003d 0\" style\u003d\"margin-top: 10px\"\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":" No Changes"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003c/mat-chip\u003e"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003c/mat-chip-list\u003e"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003c/mat-panel-description\u003e"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/mat-expansion-panel-header\u003e"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cbr /\u003e"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" \u003cmarkdown [data]\u003d\"data.updatedResponses[i].description\" disableInternalLink\u003e\u003c/markdown\u003e"},{"lineNumber":29,"author":{"gitId":"-"},"content":" \u003cbr /\u003e"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \u003cdiv"},{"lineNumber":31,"author":{"gitId":"-"},"content":" *ngIf\u003d\"data.updatedResponses[i].isDisagree() \u003d\u003d\u003d data.outdatedResponses[i].isDisagree() || !showDiff\""},{"lineNumber":32,"author":{"gitId":"-"},"content":" style\u003d\"margin-bottom: 10px\""},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \u003cmat-checkbox style\u003d\"display: inline-block; width: 20%\" [disabled]\u003d\"true\" [checked]\u003d\"data.updatedResponses[i].isDisagree()\"\u003e"},{"lineNumber":35,"author":{"gitId":"-"},"content":" I disagree"},{"lineNumber":36,"author":{"gitId":"-"},"content":" \u003c/mat-checkbox\u003e"},{"lineNumber":37,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":38,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"!data.outdatedResponses[i].isDisagree() \u0026\u0026 data.updatedResponses[i].isDisagree() \u0026\u0026 showDiff\" class\u003d\"checkbox-changes\"\u003e"},{"lineNumber":39,"author":{"gitId":"-"},"content":" \u003ci style\u003d\"color: green\" class\u003d\"material-icons-outlined\"\u003eadd_box\u003c/i\u003e"},{"lineNumber":40,"author":{"gitId":"-"},"content":" \u003cins style\u003d\"background: #d4fcbc; text-decoration: none\"\u003e I disagree \u003c/ins\u003e"},{"lineNumber":41,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":42,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"data.outdatedResponses[i].isDisagree() \u0026\u0026 !data.updatedResponses[i].isDisagree() \u0026\u0026 showDiff\" class\u003d\"checkbox-changes\"\u003e"},{"lineNumber":43,"author":{"gitId":"-"},"content":" \u003ci style\u003d\"color: red\" class\u003d\"material-icons-outlined\"\u003eindeterminate_check_box\u003c/i\u003e"},{"lineNumber":44,"author":{"gitId":"-"},"content":" \u003cdel style\u003d\"background: #fbb\"\u003eI disagree\u003c/del\u003e"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":" \u003cmat-tab-group style\u003d\"margin-bottom: 20px\" class\u003d\"mat-elevation-z1\" animationDuration\u003d\"0ms\"\u003e"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003cmat-tab label\u003d\"Markdown Text\"\u003e"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"tab-content\" *ngIf\u003d\"isReady\"\u003e"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"showDiff\" [innerHTML]\u003d\"diffHtmls[i]\"\u003e\u003c/div\u003e"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"!showDiff\" [innerHTML]\u003d\"updatedHtmls[i]\"\u003e\u003c/div\u003e"},{"lineNumber":52,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/mat-tab\u003e"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003cmat-tab label\u003d\"Preview Updated Content\"\u003e"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"tab-content\"\u003e"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003cmarkdown\u003e{{ conflict.updatedContent }}\u003c/markdown\u003e"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003c/mat-tab\u003e"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003c/mat-tab-group\u003e"},{"lineNumber":60,"author":{"gitId":"-"},"content":" \u003c/mat-expansion-panel\u003e"},{"lineNumber":61,"author":{"gitId":"-"},"content":" \u003c/mat-accordion\u003e"},{"lineNumber":62,"author":{"gitId":"-"},"content":"\u003c/div\u003e"}],"authorContributionMap":{"NereusWB922":2,"-":60}},{"path":"src/app/shared/view-issue/tester-response/tester-response.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003ch3 class\u003d\"mat-title\"\u003eTester\u0027s Response\u003c/h3\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":"\u003cform [formGroup]\u003d\"testerResponseForm\" (ngSubmit)\u003d\"submitTesterResponseForm()\"\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"timeline-comment\"\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"timeline-header\"\u003e"},{"lineNumber":5,"author":{"gitId":"-"},"content":" \u003cspan *ngIf\u003d\"this.isNewResponse()\"\u003e Please verify the following item(s). \u003c/span\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cspan *ngIf\u003d\"!this.isNewResponse()\"\u003e \u003cstrong\u003eTester\u003c/strong\u003e responded. \u003c/span\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003cbutton mat-button style\u003d\"float: right\" *ngIf\u003d\"!isEditing\" (click)\u003d\"changeToEditMode()\"\u003eEdit\u003c/button\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cdiv\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"container\" *ngFor\u003d\"let response of issue.testerResponses; index as i; trackBy: trackDisagreeList\"\u003e"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cdiv style\u003d\"display: flex; align-items: center\"\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"question-mark\"\u003e?\u003c/div\u003e"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" \u003cmarkdown [data]\u003d\"response.getTitleInMarkDown()\" disableInternalLink\u003e\u003c/markdown\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cbr /\u003e"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" \u003cmarkdown [data]\u003d\"response.description\" disableInternalLink\u003e\u003c/markdown\u003e"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003cbr /\u003e"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003cdiv\u003e"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003cmat-radio-group"},{"lineNumber":20,"author":{"gitId":"-"},"content":" style\u003d\"display: inline-block; width: 20%\""},{"lineNumber":21,"author":{"gitId":"-"},"content":" aria-label\u003d\"Select Agree or Disagree to Team\u0027s Response\""},{"lineNumber":22,"author":{"gitId":"-"},"content":" [disableControl]\u003d\"!isEditing\""},{"lineNumber":23,"author":{"gitId":"-"},"content":" [id]\u003d\"getDisagreeRadioFormId(i)\""},{"lineNumber":24,"author":{"gitId":"-"},"content":" [formControlName]\u003d\"getDisagreeRadioFormId(i)\""},{"lineNumber":25,"author":{"gitId":"-"},"content":" (change)\u003d\"handleChangeOfDisagreeRadioButton($event, i)\""},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cmat-radio-button [value]\u003d\"false\"\u003e I Agree \u003c/mat-radio-button\u003e"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003cmat-radio-button [value]\u003d\"true\"\u003e I Disagree \u003c/mat-radio-button\u003e"},{"lineNumber":29,"author":{"gitId":"-"},"content":" \u003c/mat-radio-group\u003e"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":31,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"testerResponseForm.get(getDisagreeRadioFormId(i)).value\"\u003e"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003cdiv\u003e"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u003cp style\u003d\"font-weight: 500\"\u003eReason for Disagreement:\u003c/p\u003e"},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" \u003cmarkdown [data]\u003d\"response.reasonForDisagreement\" *ngIf\u003d\"!isEditing\" disableInternalLink\u003e\u003c/markdown\u003e"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":36,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"isEditing\"\u003e"},{"lineNumber":37,"author":{"gitId":"-"},"content":" \u003capp-comment-editor"},{"lineNumber":38,"author":{"gitId":"-"},"content":" [commentField]\u003d\"testerResponseForm.get(getTesterResponseFormId(i))\""},{"lineNumber":39,"author":{"gitId":"-"},"content":" [id]\u003d\"getTesterResponseFormId(i)\""},{"lineNumber":40,"author":{"gitId":"-"},"content":" [commentForm]\u003d\"testerResponseForm\""},{"lineNumber":41,"author":{"gitId":"-"},"content":" [(isFormPending)]\u003d\"isFormPending\""},{"lineNumber":42,"author":{"gitId":"-"},"content":" [(submitButtonText)]\u003d\"submitButtonText\""},{"lineNumber":43,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":44,"author":{"gitId":"-"},"content":" \u003c/app-comment-editor\u003e"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":46,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":47,"author":{"gitId":"-"},"content":" \u003cbr /\u003e"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003cmarkdown data\u003d\"-------------------\"\u003e\u003c/markdown\u003e \u003cbr /\u003e"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003cmat-divider\u003e\u003c/mat-divider\u003e"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"editor-actions\" *ngIf\u003d\"isEditing\"\u003e"},{"lineNumber":52,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":53,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":54,"author":{"gitId":"-"},"content":" *ngIf\u003d\"conflict\""},{"lineNumber":55,"author":{"gitId":"-"},"content":" type\u003d\"button\""},{"lineNumber":56,"author":{"gitId":"-"},"content":" [disabled]\u003d\"isFormPending\""},{"lineNumber":57,"author":{"gitId":"-"},"content":" mat-raised-button"},{"lineNumber":58,"author":{"gitId":"-"},"content":" color\u003d\"primary\""},{"lineNumber":59,"author":{"gitId":"-"},"content":" (click)\u003d\"viewChanges()\""},{"lineNumber":60,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":61,"author":{"gitId":"-"},"content":" View Updated Response"},{"lineNumber":62,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003cbutton type\u003d\"submit\" [disabled]\u003d\"testerResponseForm.invalid || isFormPending\" mat-stroked-button color\u003d\"primary\" *ngIf\u003d\"!conflict\"\u003e"},{"lineNumber":64,"author":{"gitId":"-"},"content":" {{ submitButtonText }}"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":67,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":68,"author":{"gitId":"-"},"content":" type\u003d\"submit\""},{"lineNumber":69,"author":{"gitId":"-"},"content":" [disabled]\u003d\"testerResponseForm.invalid || isFormPending\""},{"lineNumber":70,"author":{"gitId":"-"},"content":" mat-raised-button"},{"lineNumber":71,"author":{"gitId":"-"},"content":" color\u003d\"warn\""},{"lineNumber":72,"author":{"gitId":"-"},"content":" *ngIf\u003d\"conflict\""},{"lineNumber":73,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":74,"author":{"gitId":"-"},"content":" {{ submitButtonText }}"},{"lineNumber":75,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":76,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":77,"author":{"gitId":"-"},"content":" class\u003d\"editor-action\""},{"lineNumber":78,"author":{"gitId":"-"},"content":" type\u003d\"button\""},{"lineNumber":79,"author":{"gitId":"-"},"content":" [disabled]\u003d\"isFormPending\""},{"lineNumber":80,"author":{"gitId":"-"},"content":" *ngIf\u003d\"!this.isNewResponse()\""},{"lineNumber":81,"author":{"gitId":"-"},"content":" mat-stroked-button"},{"lineNumber":82,"author":{"gitId":"-"},"content":" color\u003d\"warn\""},{"lineNumber":83,"author":{"gitId":"-"},"content":" (click)\u003d\"openCancelDialogIfModified()\""},{"lineNumber":84,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":85,"author":{"gitId":"-"},"content":" Cancel"},{"lineNumber":86,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":87,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":88,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":89,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":90,"author":{"gitId":"-"},"content":"\u003c/form\u003e"}],"authorContributionMap":{"NereusWB922":3,"-":87}}] diff --git a/CATcher-org_CATcher_master/commits.json b/CATcher-org_CATcher_master/commits.json index 7b2956a..676f222 100644 --- a/CATcher-org_CATcher_master/commits.json +++ b/CATcher-org_CATcher_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"xenosf":[],"sopa301":[],"mingyuanc":[],"jingting1412":[],"KevinEyo1":[],"LamJiuFong":[],"yiwen101":[],"jonasongg":[],"domoberzin":[],"asdfghjkxd":[],"yuanxi1":[],"supermii2":[],"marquestye":[],"nknguyenhc":[{"date":"2024-01-25","commitResults":[{"hash":"b20b3ef240a8c4fe32f4e016da21d89dd173b6de","isMergeCommit":false,"messageTitle":"Fix broken duplicate link (#1233)","messageBody":"Fix the broken link of a duplicate issue\r\n\r\nCurrently, the user cannot open the link to a duplicate issue\r\nwhen opening an issue, as described in CATcher-org/CATcher#1228.\r\n\r\nThe links now work as expected.","fileTypesAndContributionMap":{"html":{"insertions":1,"deletions":1}}}]},{"date":"2024-02-08","commitResults":[{"hash":"2c18b71969540c87e89050689e7bfd9b30654677","isMergeCommit":false,"messageTitle":"Set default branch to `main`","messageBody":"Previously, image uploads depend on the user\u0027s default branch.\r\nNow, we set the branch for image upload to be `main`. Images will \r\nbe uploaded to `main` as a result.\r\n\r\n---------\r\n\r\nCo-authored-by: Chee Hong \u003cc.h.wong2606@gmail.com\u003e","fileTypesAndContributionMap":{"ts":{"insertions":100,"deletions":2}}}]},{"date":"2024-02-12","commitResults":[{"hash":"a9d38dd71eb2ef0ad5cf3e750471437f6c8d8eb4","isMergeCommit":false,"messageTitle":"Preserve linebreaks (#1241)","messageBody":"With preserving linebreaks, subset list items are rendered as a list,\r\nand paragraph rendering is the same as Github.","fileTypesAndContributionMap":{"ts":{"insertions":1,"deletions":1}}}]}],"Arif-Khalid":[],"NereusWB922":[{"date":"2024-02-03","commitResults":[{"hash":"d4b5422a2a0c83a73956032f3791dd6835a25090","isMergeCommit":false,"messageTitle":"Fix uncaught errors when attempting to access an invalid route","messageBody":"There is an uncaught error when the users click on an invalid internal link in Markdown or enter an invalid link in browser.\r\n\r\nInternal links are unlikely to be used for bug reporting and are more likely to be invalid.\r\n\r\nLet\u0027s show an error toaster and stop the navigation when clicking on an internal link in Markdown. Also, redirect the users to the login page if the users enter invalid link in browser.","fileTypesAndContributionMap":{"html":{"insertions":11,"deletions":11},"ts":{"insertions":37,"deletions":2}}}]}],"dishenggg":[],"MadLamprey":[{"date":"2024-01-25","commitResults":[{"hash":"fe7be44f9ae19c5caabb0506cb631743b9e84bb9","isMergeCommit":false,"messageTitle":"Add whitespace validation (#1237)","messageBody":"* Add whitespace validation\r\n\r\n* Update whitespace validation for new issue\r\n\r\n* Update whitespace validation for title of new issues\r\n\r\n* Update whitespace validation for title of new issues\r\n\r\n* Move validators into core\r\n\r\n* Update import order\r\n\r\n---------\r\n\r\nCo-authored-by: Misra Aditya \u003ce1096355@u.nus.edu\u003e","fileTypesAndContributionMap":{"html":{"insertions":1,"deletions":0},"ts":{"insertions":13,"deletions":1}}}]}],"Tim-Siu":[]},"authorFileTypeContributionMap":{"xenosf":{"js":0,"css":0,"html":0,"ts":0},"sopa301":{"js":0,"css":0,"html":0,"ts":0},"mingyuanc":{"js":0,"css":0,"html":0,"ts":0},"jingting1412":{"js":0,"css":0,"html":0,"ts":0},"KevinEyo1":{"js":0,"css":0,"html":0,"ts":0},"LamJiuFong":{"js":0,"css":0,"html":0,"ts":0},"yiwen101":{"js":0,"css":0,"html":0,"ts":0},"jonasongg":{"js":0,"css":0,"html":0,"ts":0},"domoberzin":{"js":0,"css":0,"html":0,"ts":0},"asdfghjkxd":{"js":0,"css":0,"html":0,"ts":0},"yuanxi1":{"js":0,"css":0,"html":0,"ts":0},"supermii2":{"js":0,"css":0,"html":0,"ts":0},"marquestye":{"js":0,"css":0,"html":0,"ts":0},"nknguyenhc":{"js":0,"css":0,"html":1,"ts":101},"Arif-Khalid":{"js":0,"css":0,"html":0,"ts":0},"NereusWB922":{"js":0,"css":0,"html":11,"ts":37},"dishenggg":{"js":0,"css":0,"html":0,"ts":0},"MadLamprey":{"js":0,"css":0,"html":1,"ts":13},"Tim-Siu":{"js":0,"css":0,"html":0,"ts":0}},"authorContributionVariance":{"xenosf":0.0,"sopa301":0.0,"mingyuanc":0.0,"jingting1412":0.0,"KevinEyo1":0.0,"LamJiuFong":0.0,"yiwen101":0.0,"jonasongg":0.0,"domoberzin":0.0,"asdfghjkxd":0.0,"yuanxi1":0.0,"supermii2":0.0,"marquestye":0.0,"nknguyenhc":138.65083,"Arif-Khalid":0.0,"NereusWB922":49.604263,"dishenggg":0.0,"MadLamprey":2.999453,"Tim-Siu":0.0},"authorDisplayNameMap":{"xenosf":"XENO..NONG","sopa301":"POON..RYAN","mingyuanc":"CHIN..YUAN","jingting1412":"WANG..TING","KevinEyo1":"EYO ..EVIN","LamJiuFong":"LAM ..FONG","yiwen101":"WANG..IWEN","jonasongg":"JONA.. WEI","domoberzin":"DOMI.. GIN","asdfghjkxd":"GEOR.. YAO","yuanxi1":"ZHU ..ANXI","supermii2":"ALVI..S NG","marquestye":"TYE ..QUES","nknguyenhc":"NGUY..UYEN","Arif-Khalid":"ARIF..ALID","NereusWB922":"NERE.. BIN","dishenggg":"YEO ..HENG","MadLamprey":"MISR..ITYA","Tim-Siu":"XU S..UYAO"}} +{"authorDailyContributionsMap":{"xenosf":[],"sopa301":[],"mingyuanc":[],"jingting1412":[],"KevinEyo1":[],"LamJiuFong":[],"yiwen101":[],"jonasongg":[],"domoberzin":[],"asdfghjkxd":[],"yuanxi1":[],"supermii2":[],"marquestye":[],"nknguyenhc":[{"date":"2024-01-25","commitResults":[{"hash":"b20b3ef240a8c4fe32f4e016da21d89dd173b6de","isMergeCommit":false,"messageTitle":"Fix broken duplicate link (#1233)","messageBody":"Fix the broken link of a duplicate issue\r\n\r\nCurrently, the user cannot open the link to a duplicate issue\r\nwhen opening an issue, as described in CATcher-org/CATcher#1228.\r\n\r\nThe links now work as expected.","fileTypesAndContributionMap":{"html":{"insertions":1,"deletions":1}}}]},{"date":"2024-02-08","commitResults":[{"hash":"2c18b71969540c87e89050689e7bfd9b30654677","isMergeCommit":false,"messageTitle":"Set default branch to `main`","messageBody":"Previously, image uploads depend on the user\u0027s default branch.\r\nNow, we set the branch for image upload to be `main`. Images will \r\nbe uploaded to `main` as a result.\r\n\r\n---------\r\n\r\nCo-authored-by: Chee Hong \u003cc.h.wong2606@gmail.com\u003e","fileTypesAndContributionMap":{"ts":{"insertions":100,"deletions":2}}}]},{"date":"2024-02-12","commitResults":[{"hash":"a9d38dd71eb2ef0ad5cf3e750471437f6c8d8eb4","isMergeCommit":false,"messageTitle":"Preserve linebreaks (#1241)","messageBody":"With preserving linebreaks, subset list items are rendered as a list,\r\nand paragraph rendering is the same as Github.","fileTypesAndContributionMap":{"ts":{"insertions":1,"deletions":1}}}]}],"Arif-Khalid":[{"date":"2024-02-19","commitResults":[{"hash":"a1b500006959f1b45210fdacb3e4117d25ac2092","isMergeCommit":false,"messageTitle":"Faulty list view when back navigating (#1243)","messageBody":"Issue table settings such as page index are not \r\nsaved when table is re-mounted.\r\n\r\nThis behavior inconveniences users as their settings \r\nare reset everytime they navigate to a specific issue and back.\r\n\r\nLet\u0027s lift up the table settings of each mounted table to \r\na service which the tables pull from when mounted.","fileTypesAndContributionMap":{"html":{"insertions":15,"deletions":2},"ts":{"insertions":57,"deletions":3}}}]}],"NereusWB922":[{"date":"2024-02-03","commitResults":[{"hash":"d4b5422a2a0c83a73956032f3791dd6835a25090","isMergeCommit":false,"messageTitle":"Fix uncaught errors when attempting to access an invalid route","messageBody":"There is an uncaught error when the users click on an invalid internal link in Markdown or enter an invalid link in browser.\r\n\r\nInternal links are unlikely to be used for bug reporting and are more likely to be invalid.\r\n\r\nLet\u0027s show an error toaster and stop the navigation when clicking on an internal link in Markdown. Also, redirect the users to the login page if the users enter invalid link in browser.","fileTypesAndContributionMap":{"html":{"insertions":11,"deletions":11},"ts":{"insertions":37,"deletions":2}}}]}],"dishenggg":[],"MadLamprey":[{"date":"2024-01-25","commitResults":[{"hash":"fe7be44f9ae19c5caabb0506cb631743b9e84bb9","isMergeCommit":false,"messageTitle":"Add whitespace validation (#1237)","messageBody":"* Add whitespace validation\r\n\r\n* Update whitespace validation for new issue\r\n\r\n* Update whitespace validation for title of new issues\r\n\r\n* Update whitespace validation for title of new issues\r\n\r\n* Move validators into core\r\n\r\n* Update import order\r\n\r\n---------\r\n\r\nCo-authored-by: Misra Aditya \u003ce1096355@u.nus.edu\u003e","fileTypesAndContributionMap":{"html":{"insertions":1,"deletions":0},"ts":{"insertions":13,"deletions":1}}}]}],"Tim-Siu":[]},"authorFileTypeContributionMap":{"xenosf":{"js":0,"css":0,"html":0,"ts":0},"sopa301":{"js":0,"css":0,"html":0,"ts":0},"mingyuanc":{"js":0,"css":0,"html":0,"ts":0},"jingting1412":{"js":0,"css":0,"html":0,"ts":0},"KevinEyo1":{"js":0,"css":0,"html":0,"ts":0},"LamJiuFong":{"js":0,"css":0,"html":0,"ts":0},"yiwen101":{"js":0,"css":0,"html":0,"ts":0},"jonasongg":{"js":0,"css":0,"html":0,"ts":0},"domoberzin":{"js":0,"css":0,"html":0,"ts":0},"asdfghjkxd":{"js":0,"css":0,"html":0,"ts":0},"yuanxi1":{"js":0,"css":0,"html":0,"ts":0},"supermii2":{"js":0,"css":0,"html":0,"ts":0},"marquestye":{"js":0,"css":0,"html":0,"ts":0},"nknguyenhc":{"js":0,"css":0,"html":1,"ts":101},"Arif-Khalid":{"js":0,"css":0,"html":15,"ts":57},"NereusWB922":{"js":0,"css":0,"html":11,"ts":37},"dishenggg":{"js":0,"css":0,"html":0,"ts":0},"MadLamprey":{"js":0,"css":0,"html":1,"ts":13},"Tim-Siu":{"js":0,"css":0,"html":0,"ts":0}},"authorContributionVariance":{"xenosf":0.0,"sopa301":0.0,"mingyuanc":0.0,"jingting1412":0.0,"KevinEyo1":0.0,"LamJiuFong":0.0,"yiwen101":0.0,"jonasongg":0.0,"domoberzin":0.0,"asdfghjkxd":0.0,"yuanxi1":0.0,"supermii2":0.0,"marquestye":0.0,"nknguyenhc":126.8307,"Arif-Khalid":72.29386,"NereusWB922":45.37113,"dishenggg":0.0,"MadLamprey":2.7434819,"Tim-Siu":0.0},"authorDisplayNameMap":{"xenosf":"XENO..NONG","sopa301":"POON..RYAN","mingyuanc":"CHIN..YUAN","jingting1412":"WANG..TING","KevinEyo1":"EYO ..EVIN","LamJiuFong":"LAM ..FONG","yiwen101":"WANG..IWEN","jonasongg":"JONA.. WEI","domoberzin":"DOMI.. GIN","asdfghjkxd":"GEOR.. YAO","yuanxi1":"ZHU ..ANXI","supermii2":"ALVI..S NG","marquestye":"TYE ..QUES","nknguyenhc":"NGUY..UYEN","Arif-Khalid":"ARIF..ALID","NereusWB922":"NERE.. BIN","dishenggg":"YEO ..HENG","MadLamprey":"MISR..ITYA","Tim-Siu":"XU S..UYAO"}} diff --git a/CATcher-org_WATcher_main/authorship.json b/CATcher-org_WATcher_main/authorship.json index 58c6f56..1ea69de 100644 --- a/CATcher-org_WATcher_main/authorship.json +++ b/CATcher-org_WATcher_main/authorship.json @@ -1 +1 @@ -[{"path":"src/app/activity-dashboard/activity-dashboard.component.css","fileType":"css","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":".event-tables-wrapper {"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" display: flex;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" overflow-x: auto;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":4}},{"path":"src/app/activity-dashboard/activity-dashboard.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cdiv\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003cmat-grid-list cols\u003d\"4\" rowHeight\u003d\"80px\"\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \u003cmat-grid-tile\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"grid-flush-left\"\u003e"},{"lineNumber":5,"author":{"gitId":"-"},"content":" \u003ch1 class\u003d\"mat-headline\" style\u003d\"margin: 0px\"\u003eActivity\u003c/h1\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003c/mat-grid-tile\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cmat-grid-tile\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cmat-form-field appearance\u003d\"fill\"\u003e"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cmat-label\u003eStart Date\u003c/mat-label\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cinput matInput [min]\u003d\"startMinDate\" [max]\u003d\"startMaxDate\" [matDatepicker]\u003d\"startPicker\" (dateChange)\u003d\"pickStartDate($event)\" /\u003e"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003cmat-hint\u003eMM/DD/YYYY\u003c/mat-hint\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cmat-datepicker-toggle matSuffix [for]\u003d\"startPicker\"\u003e\u003c/mat-datepicker-toggle\u003e"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cmat-datepicker startView\u003d\"year\" #startPicker\u003e\u003c/mat-datepicker\u003e"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003c/mat-grid-tile\u003e"},{"lineNumber":18,"author":{"gitId":"-"},"content":""},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003cmat-grid-tile\u003e"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003cmat-form-field appearance\u003d\"fill\"\u003e"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003cmat-label\u003eEnd Date\u003c/mat-label\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \u003cinput matInput [min]\u003d\"endMinDate\" [max]\u003d\"endMaxDate\" [matDatepicker]\u003d\"endPicker\" (dateChange)\u003d\"pickEndDate($event)\" /\u003e"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cmat-hint\u003eMM/DD/YYYY\u003c/mat-hint\u003e"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003cmat-datepicker-toggle matSuffix [for]\u003d\"endPicker\"\u003e\u003c/mat-datepicker-toggle\u003e"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cmat-datepicker startView\u003d\"year\" #endPicker\u003e\u003c/mat-datepicker\u003e"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003c/mat-grid-tile\u003e"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003c/mat-grid-list\u003e"},{"lineNumber":29,"author":{"gitId":"-"},"content":"\u003c/div\u003e"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":"\u003cdiv class\u003d\"event-tables-wrapper\"\u003e"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003capp-event-tables"},{"lineNumber":33,"author":{"gitId":"-"},"content":" *ngFor\u003d\"let assignee of assignees\""},{"lineNumber":34,"author":{"gitId":"-"},"content":" class\u003d\"issue-table\""},{"lineNumber":35,"author":{"gitId":"-"},"content":" [actor]\u003d\"assignee\""},{"lineNumber":36,"author":{"gitId":"-"},"content":" [columnsToDisplay]\u003d\"this.displayedColumns\""},{"lineNumber":37,"author":{"gitId":"-"},"content":" [expandedColumnsToDisplay]\u003d\"this.expandedColumns\""},{"lineNumber":38,"author":{"gitId":"-"},"content":" [actions]\u003d\"this.actionButtons\""},{"lineNumber":39,"author":{"gitId":"-"},"content":" \u003e\u003c/app-event-tables\u003e"},{"lineNumber":40,"author":{"gitId":"-"},"content":"\u003c/div\u003e"}],"authorContributionMap":{"NereusWB922":1,"-":39}},{"path":"src/app/activity-dashboard/activity-dashboard.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Component, OnInit, QueryList, ViewChildren } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { MatDatepickerInputEvent } from \u0027@angular/material/datepicker\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import * as moment from \u0027moment\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { GithubUser } from \u0027../core/models/github-user.model\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027../core/services/github.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { GithubEventService } from \u0027../core/services/githubevent.service\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { EXPANDED_TABLE_COLUMNS, TABLE_COLUMNS } from \u0027./event-tables/event-tables-columns\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { ACTION_BUTTONS, EventTablesComponent } from \u0027./event-tables/event-tables.component\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":11,"author":{"gitId":"-"},"content":" selector: \u0027app-activity-dashboard\u0027,"},{"lineNumber":12,"author":{"gitId":"-"},"content":" templateUrl: \u0027./activity-dashboard.component.html\u0027,"},{"lineNumber":13,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./activity-dashboard.component.css\u0027]"},{"lineNumber":14,"author":{"gitId":"-"},"content":"})"},{"lineNumber":15,"author":{"gitId":"-"},"content":"export class ActivityDashboardComponent implements OnInit {"},{"lineNumber":16,"author":{"gitId":"-"},"content":" readonly displayedColumns \u003d [TABLE_COLUMNS.DATE_START, TABLE_COLUMNS.ISSUE_COUNT, TABLE_COLUMNS.PR_COUNT, TABLE_COLUMNS.COMMENT_COUNT];"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" readonly expandedColumns \u003d [EXPANDED_TABLE_COLUMNS.TITLE, EXPANDED_TABLE_COLUMNS.DATE];"},{"lineNumber":18,"author":{"gitId":"-"},"content":" readonly actionButtons: ACTION_BUTTONS[] \u003d [ACTION_BUTTONS.VIEW_IN_WEB];"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":" startMinDate: Date;"},{"lineNumber":21,"author":{"gitId":"-"},"content":" startMaxDate \u003d moment().endOf(\u0027day\u0027).toDate();"},{"lineNumber":22,"author":{"gitId":"-"},"content":" endMinDate: Date;"},{"lineNumber":23,"author":{"gitId":"-"},"content":" endMaxDate \u003d moment().endOf(\u0027day\u0027).toDate();"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":" assignees: GithubUser[];"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"-"},"content":" @ViewChildren(EventTablesComponent) tables: QueryList\u003cEventTablesComponent\u003e;"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" constructor(private githubService: GithubService, private githubEventService: GithubEventService) {}"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":32,"author":{"gitId":"-"},"content":" this.githubEventService.getEvents();"},{"lineNumber":33,"author":{"gitId":"-"},"content":" this.githubService.getUsersAssignable().subscribe((x) \u003d\u003e (this.assignees \u003d x));"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":" pickStartDate(event: MatDatepickerInputEvent\u003cDate\u003e) {"},{"lineNumber":37,"author":{"gitId":"-"},"content":" this.endMinDate \u003d event.value;"},{"lineNumber":38,"author":{"gitId":"-"},"content":" this.tables.forEach((t) \u003d\u003e (t.githubEvents.start \u003d `${event.value}`));"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" pickEndDate(event: MatDatepickerInputEvent\u003cDate\u003e) {"},{"lineNumber":42,"author":{"gitId":"-"},"content":" this.startMaxDate \u003d event.value;"},{"lineNumber":43,"author":{"gitId":"-"},"content":" this.tables.forEach((t) \u003d\u003e (t.githubEvents.end \u003d `${event.value}`));"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }"},{"lineNumber":45,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"NereusWB922":1,"-":44}},{"path":"src/app/activity-dashboard/activity-dashboard.module.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { CommonModule } from \u0027@angular/common\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { NgModule } from \u0027@angular/core\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { SharedModule } from \u0027../shared/shared.module\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { ActivityDashboardRoutingModule } from \u0027./activity-dashboard-routing.module\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { ActivityDashboardComponent } from \u0027./activity-dashboard.component\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { EventTablesModule } from \u0027./event-tables/event-tables.module\u0027;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"import { EventWeekDetailsComponent } from \u0027./event-week-details/event-week-details.component\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"@NgModule({"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" declarations: [ActivityDashboardComponent, EventWeekDetailsComponent],"},{"lineNumber":11,"author":{"gitId":"-"},"content":" imports: [CommonModule, SharedModule, ActivityDashboardRoutingModule, EventTablesModule]"},{"lineNumber":12,"author":{"gitId":"-"},"content":"})"},{"lineNumber":13,"author":{"gitId":"-"},"content":"export class ActivityDashboardModule {}"}],"authorContributionMap":{"NereusWB922":2,"-":11}},{"path":"src/app/activity-dashboard/event-tables/event-tables.component.css","fileType":"css","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":".table-container {"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" margin: 10px;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" min-width: 400px;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":".actor-card {"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" display: flex;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" align-items: center;"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" padding: 10px;"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" margin-bottom: 1px;"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":".actor-username {"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" flex-grow: 1;"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" font-size: 15px;"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" margin: 0;"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" text-align: center;"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" word-break: break-word;"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":".avatar-container {"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" margin-right: 10px;"},{"lineNumber":23,"author":{"gitId":"-"},"content":"}"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":".mat-table {"},{"lineNumber":26,"author":{"gitId":"-"},"content":" /* flex-wrap: wrap; */"},{"lineNumber":27,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":28,"author":{"gitId":"-"},"content":"}"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":".mat-cell {"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" display: flex;"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" align-items: center;"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":" justify-content: center;"},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" text-align: center;"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":" padding: 0;"},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":".mat-header-cell {"},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" display: flex;"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" align-items: center;"},{"lineNumber":41,"author":{"gitId":"NereusWB922"},"content":" justify-content: center;"},{"lineNumber":42,"author":{"gitId":"NereusWB922"},"content":" text-align: center;"},{"lineNumber":43,"author":{"gitId":"NereusWB922"},"content":" padding: 0;"},{"lineNumber":44,"author":{"gitId":"-"},"content":"}"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":".mat-header-row {"},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" white-space: nowrap;"},{"lineNumber":48,"author":{"gitId":"-"},"content":"}"},{"lineNumber":49,"author":{"gitId":"-"},"content":""},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":".example-element-row:hover {"},{"lineNumber":51,"author":{"gitId":"NereusWB922"},"content":" border: 3px solid rgba(0, 0, 0, 0.514);"},{"lineNumber":52,"author":{"gitId":"NereusWB922"},"content":" border-radius: 3px;"},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" color: #210749;"},{"lineNumber":54,"author":{"gitId":"-"},"content":"}"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":".example-element-row td {"},{"lineNumber":57,"author":{"gitId":"-"},"content":" border-bottom-width: 0;"},{"lineNumber":58,"author":{"gitId":"-"},"content":"}"},{"lineNumber":59,"author":{"gitId":"-"},"content":""},{"lineNumber":60,"author":{"gitId":"-"},"content":".example-element-detail {"},{"lineNumber":61,"author":{"gitId":"-"},"content":" overflow: hidden;"},{"lineNumber":62,"author":{"gitId":"-"},"content":" display: flex;"},{"lineNumber":63,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":64,"author":{"gitId":"-"},"content":"}"},{"lineNumber":65,"author":{"gitId":"-"},"content":""},{"lineNumber":66,"author":{"gitId":"-"},"content":"/* Colour cells */"},{"lineNumber":67,"author":{"gitId":"-"},"content":""},{"lineNumber":68,"author":{"gitId":"-"},"content":".white {"},{"lineNumber":69,"author":{"gitId":"-"},"content":" background-color: white;"},{"lineNumber":70,"author":{"gitId":"-"},"content":"}"},{"lineNumber":71,"author":{"gitId":"-"},"content":""},{"lineNumber":72,"author":{"gitId":"-"},"content":".pale-green {"},{"lineNumber":73,"author":{"gitId":"-"},"content":" background-color: palegreen;"},{"lineNumber":74,"author":{"gitId":"-"},"content":"}"},{"lineNumber":75,"author":{"gitId":"-"},"content":""},{"lineNumber":76,"author":{"gitId":"-"},"content":".green {"},{"lineNumber":77,"author":{"gitId":"-"},"content":" background-color: green;"},{"lineNumber":78,"author":{"gitId":"-"},"content":"}"},{"lineNumber":79,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":80,"author":{"gitId":"NereusWB922"},"content":".scrollable-container {"},{"lineNumber":81,"author":{"gitId":"NereusWB922"},"content":" height: 53vh;"},{"lineNumber":82,"author":{"gitId":"NereusWB922"},"content":" overflow: auto;"},{"lineNumber":83,"author":{"gitId":"NereusWB922"},"content":" margin-bottom: 2px;"},{"lineNumber":84,"author":{"gitId":"NereusWB922"},"content":" scrollbar-width: none;"},{"lineNumber":85,"author":{"gitId":"NereusWB922"},"content":" position: relative;"},{"lineNumber":86,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":87,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":88,"author":{"gitId":"NereusWB922"},"content":".scrollable-container::-webkit-scrollbar {"},{"lineNumber":89,"author":{"gitId":"NereusWB922"},"content":" display: none;"},{"lineNumber":90,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":91,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":92,"author":{"gitId":"NereusWB922"},"content":"/* Ref: https://css-scroll-shadows.vercel.app */"},{"lineNumber":93,"author":{"gitId":"NereusWB922"},"content":".scrollable-container::before {"},{"lineNumber":94,"author":{"gitId":"NereusWB922"},"content":" pointer-events: none;"},{"lineNumber":95,"author":{"gitId":"NereusWB922"},"content":" content: \u0027\u0027;"},{"lineNumber":96,"author":{"gitId":"NereusWB922"},"content":" position: absolute;"},{"lineNumber":97,"author":{"gitId":"NereusWB922"},"content":" z-index: 2;"},{"lineNumber":98,"author":{"gitId":"NereusWB922"},"content":" height: 6px;"},{"lineNumber":99,"author":{"gitId":"NereusWB922"},"content":" width: 100%;"},{"lineNumber":100,"author":{"gitId":"NereusWB922"},"content":" display: block;"},{"lineNumber":101,"author":{"gitId":"NereusWB922"},"content":" background-image: linear-gradient(to bottom, white 66%, transparent);"},{"lineNumber":102,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":103,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":104,"author":{"gitId":"NereusWB922"},"content":".scrollable-container::after {"},{"lineNumber":105,"author":{"gitId":"NereusWB922"},"content":" pointer-events: none;"},{"lineNumber":106,"author":{"gitId":"NereusWB922"},"content":" content: \u0027\u0027;"},{"lineNumber":107,"author":{"gitId":"NereusWB922"},"content":" position: sticky;"},{"lineNumber":108,"author":{"gitId":"NereusWB922"},"content":" z-index: 2;"},{"lineNumber":109,"author":{"gitId":"NereusWB922"},"content":" top: 100%;"},{"lineNumber":110,"author":{"gitId":"NereusWB922"},"content":" height: 6px;"},{"lineNumber":111,"author":{"gitId":"NereusWB922"},"content":" width: 100%;"},{"lineNumber":112,"author":{"gitId":"NereusWB922"},"content":" display: block;"},{"lineNumber":113,"author":{"gitId":"NereusWB922"},"content":" background-image: linear-gradient(to top, white 66%, transparent);"},{"lineNumber":114,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":115,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":116,"author":{"gitId":"NereusWB922"},"content":".scrollable-container-wrapper {"},{"lineNumber":117,"author":{"gitId":"NereusWB922"},"content":" position: relative;"},{"lineNumber":118,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":119,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":120,"author":{"gitId":"NereusWB922"},"content":".scrollable-container-wrapper::before {"},{"lineNumber":121,"author":{"gitId":"NereusWB922"},"content":" pointer-events: none;"},{"lineNumber":122,"author":{"gitId":"NereusWB922"},"content":" content: \u0027\u0027;"},{"lineNumber":123,"author":{"gitId":"NereusWB922"},"content":" position: absolute;"},{"lineNumber":124,"author":{"gitId":"NereusWB922"},"content":" z-index: 1;"},{"lineNumber":125,"author":{"gitId":"NereusWB922"},"content":" top: 0;"},{"lineNumber":126,"author":{"gitId":"NereusWB922"},"content":" left: 0;"},{"lineNumber":127,"author":{"gitId":"NereusWB922"},"content":" right: 0;"},{"lineNumber":128,"author":{"gitId":"NereusWB922"},"content":" height: 5px;"},{"lineNumber":129,"author":{"gitId":"NereusWB922"},"content":" background-image: radial-gradient(farthest-side at 50% 0, rgba(0, 0, 0, 0.5), transparent);"},{"lineNumber":130,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":131,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":132,"author":{"gitId":"NereusWB922"},"content":".scrollable-container-wrapper::after {"},{"lineNumber":133,"author":{"gitId":"NereusWB922"},"content":" pointer-events: none;"},{"lineNumber":134,"author":{"gitId":"NereusWB922"},"content":" content: \u0027\u0027;"},{"lineNumber":135,"author":{"gitId":"NereusWB922"},"content":" position: absolute;"},{"lineNumber":136,"author":{"gitId":"NereusWB922"},"content":" z-index: 1;"},{"lineNumber":137,"author":{"gitId":"NereusWB922"},"content":" bottom: 0;"},{"lineNumber":138,"author":{"gitId":"NereusWB922"},"content":" left: 0;"},{"lineNumber":139,"author":{"gitId":"NereusWB922"},"content":" right: 0;"},{"lineNumber":140,"author":{"gitId":"NereusWB922"},"content":" height: 5px;"},{"lineNumber":141,"author":{"gitId":"NereusWB922"},"content":" background-image: radial-gradient(farthest-side at 50% 100%, rgba(0, 0, 0, 0.5), transparent);"},{"lineNumber":142,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":105,"-":37}},{"path":"src/app/activity-dashboard/event-tables/event-tables.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cdiv class\u003d\"table-container\"\u003e"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card class\u003d\"actor-card\"\u003e"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" mat-card-avatar"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" *ngIf\u003d\"this.actor\""},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" class\u003d\"avatar-container\""},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" [ngStyle]\u003d\"{"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" background: \u0027url(\u0027 + this.actor.avatar_url + \u0027)\u0027,"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" \u0027background-size\u0027: \u002740px\u0027"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" }\""},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" \u003e\u003c/div\u003e"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card-title class\u003d\"actor-username\"\u003e"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" {{ this.actor !\u003d\u003d undefined ? this.actor.login : \u0027Unknown\u0027 }}"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-card-title\u003e"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-card\u003e"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv class\u003d\"scrollable-container-wrapper\"\u003e"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv class\u003d\"scrollable-container\"\u003e"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-table [dataSource]\u003d\"this.githubEvents\" matSort multiTemplateDataRows\u003e"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003cng-container matColumnDef\u003d\"date_start\"\u003e"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003cmat-header-cell *matHeaderCellDef mat-sort-header\u003e Date \u003c/mat-header-cell\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let element\"\u003e"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cspan (click)\u003d\"$event.stopPropagation()\" style\u003d\"cursor: default\"\u003e"},{"lineNumber":24,"author":{"gitId":"-"},"content":" {{ element.date_start }}"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" \u003cng-container matColumnDef\u003d\"issue_count\"\u003e"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \u003cmat-header-cell *matHeaderCellDef mat-sort-header\u003e Issue # \u003c/mat-header-cell\u003e"},{"lineNumber":31,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let element\" [ngClass]\u003d\"colorCell(element.issue_count)\"\u003e"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003cspan (click)\u003d\"$event.stopPropagation()\" style\u003d\"cursor: default\"\u003e"},{"lineNumber":33,"author":{"gitId":"-"},"content":" {{ element.issue_count }}"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":36,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":" \u003cng-container matColumnDef\u003d\"pr_count\"\u003e"},{"lineNumber":39,"author":{"gitId":"-"},"content":" \u003cmat-header-cell *matHeaderCellDef mat-sort-header\u003e PR # \u003c/mat-header-cell\u003e"},{"lineNumber":40,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let element\" [ngClass]\u003d\"colorCell(element.pr_count)\"\u003e"},{"lineNumber":41,"author":{"gitId":"-"},"content":" \u003cspan (click)\u003d\"$event.stopPropagation()\" style\u003d\"cursor: default\"\u003e"},{"lineNumber":42,"author":{"gitId":"-"},"content":" {{ element.pr_count }}"},{"lineNumber":43,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":44,"author":{"gitId":"-"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":" \u003cng-container matColumnDef\u003d\"comment_count\"\u003e"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003cmat-header-cell *matHeaderCellDef mat-sort-header\u003e Comment # \u003c/mat-header-cell\u003e"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let element\" [ngClass]\u003d\"colorCell(element.comment_count)\"\u003e"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003cspan (click)\u003d\"$event.stopPropagation()\" style\u003d\"cursor: default\"\u003e"},{"lineNumber":51,"author":{"gitId":"-"},"content":" {{ element.comment_count }}"},{"lineNumber":52,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-header-row *matHeaderRowDef\u003d\"this.columnsToDisplay\"\u003e\u003c/mat-header-row\u003e"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003cmat-row"},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" *matRowDef\u003d\"let eventWeek; columns: this.columnsToDisplay\""},{"lineNumber":59,"author":{"gitId":"-"},"content":" class\u003d\"example-element-row\""},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":" (click)\u003d\"openDialog(eventWeek)\""},{"lineNumber":61,"author":{"gitId":"-"},"content":" \u003e\u003c/mat-row\u003e"},{"lineNumber":62,"author":{"gitId":"-"},"content":" \u003c/mat-table\u003e"},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":" \u003c/div\u003e"},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" \u003c/div\u003e"},{"lineNumber":65,"author":{"gitId":"-"},"content":""},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003cmat-card *ngIf\u003d\"this.githubEvents.isLoading$ | async\" style\u003d\"display: flex; justify-content: center; align-items: center\"\u003e"},{"lineNumber":67,"author":{"gitId":"-"},"content":" \u003cmat-progress-spinner color\u003d\"primary\" mode\u003d\"indeterminate\" diameter\u003d\"50\" strokeWidth\u003d\"5\"\u003e\u003c/mat-progress-spinner\u003e"},{"lineNumber":68,"author":{"gitId":"-"},"content":" \u003c/mat-card\u003e"},{"lineNumber":69,"author":{"gitId":"-"},"content":" \u003cmat-paginator [pageSize]\u003d\"20\" [pageSizeOptions]\u003d\"[10, 20, 50]\"\u003e\u003c/mat-paginator\u003e"},{"lineNumber":70,"author":{"gitId":"-"},"content":"\u003c/div\u003e"}],"authorContributionMap":{"NereusWB922":22,"-":48}},{"path":"src/app/activity-dashboard/event-tables/event-tables.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { animate, state, style, transition, trigger } from \u0027@angular/animations\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { AfterViewInit, Component, Input, OnInit, ViewChild } from \u0027@angular/core\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { MatDialog } from \u0027@angular/material/dialog\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { MatPaginator } from \u0027@angular/material/paginator\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { MatSort } from \u0027@angular/material/sort\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { GithubUser } from \u0027../../core/models/github-user.model\u0027;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"import { ErrorHandlingService } from \u0027../../core/services/error-handling.service\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { GithubEventService } from \u0027../../core/services/githubevent.service\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027../../core/services/logging.service\u0027;"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"import { EventWeekDetailsComponent } from \u0027../event-week-details/event-week-details.component\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import { EventWeek } from \u0027../event-week.model\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import { GithubEventDataTable } from \u0027./GithubEventDataTable\u0027;"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":"import { NoEventsError } from \u0027./no-events-error.model\u0027;"},{"lineNumber":14,"author":{"gitId":"-"},"content":""},{"lineNumber":15,"author":{"gitId":"-"},"content":"export enum ACTION_BUTTONS {"},{"lineNumber":16,"author":{"gitId":"-"},"content":" VIEW_IN_WEB,"},{"lineNumber":17,"author":{"gitId":"-"},"content":" COLLAPSE"},{"lineNumber":18,"author":{"gitId":"-"},"content":"}"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":21,"author":{"gitId":"-"},"content":" selector: \u0027app-event-tables\u0027,"},{"lineNumber":22,"author":{"gitId":"-"},"content":" templateUrl: \u0027./event-tables.component.html\u0027,"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" styleUrls: [\u0027./event-tables.component.css\u0027]"},{"lineNumber":24,"author":{"gitId":"-"},"content":"})"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Angular Table Expandable Rows"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * ref: https://material.angular.io/components/table/examples#table-expandable-rows"},{"lineNumber":29,"author":{"gitId":"-"},"content":" */"},{"lineNumber":30,"author":{"gitId":"-"},"content":"export class EventTablesComponent implements OnInit, AfterViewInit {"},{"lineNumber":31,"author":{"gitId":"-"},"content":" @Input() columnsToDisplay: string[];"},{"lineNumber":32,"author":{"gitId":"-"},"content":" @Input() expandedColumnsToDisplay: string[];"},{"lineNumber":33,"author":{"gitId":"-"},"content":" @Input() actions: ACTION_BUTTONS[];"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Input() actor?: GithubUser \u003d undefined;"},{"lineNumber":35,"author":{"gitId":"-"},"content":" @Input() filters?: any \u003d undefined;"},{"lineNumber":36,"author":{"gitId":"-"},"content":""},{"lineNumber":37,"author":{"gitId":"-"},"content":" @ViewChild(MatSort, { static: true }) sort: MatSort;"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator;"},{"lineNumber":39,"author":{"gitId":"-"},"content":""},{"lineNumber":40,"author":{"gitId":"-"},"content":" githubEvents: GithubEventDataTable;"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":" public readonly action_buttons \u003d ACTION_BUTTONS;"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" constructor("},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":" public githubEventService: GithubEventService,"},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":" public dialog: MatDialog,"},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" private logger: LoggingService,"},{"lineNumber":48,"author":{"gitId":"NereusWB922"},"content":" private errorHandling: ErrorHandlingService"},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":" ) {}"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" this.githubEvents \u003d new GithubEventDataTable(this.githubEventService, this.logger, this.sort, this.paginator, this.actor, this.filters);"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }"},{"lineNumber":54,"author":{"gitId":"-"},"content":""},{"lineNumber":55,"author":{"gitId":"-"},"content":" ngAfterViewInit(): void {"},{"lineNumber":56,"author":{"gitId":"-"},"content":" setTimeout(() \u003d\u003e {"},{"lineNumber":57,"author":{"gitId":"-"},"content":" this.githubEvents.loadEvents();"},{"lineNumber":58,"author":{"gitId":"-"},"content":" });"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }"},{"lineNumber":60,"author":{"gitId":"-"},"content":""},{"lineNumber":61,"author":{"gitId":"-"},"content":" reload() {"},{"lineNumber":62,"author":{"gitId":"-"},"content":" this.githubEvents.loadEvents();"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }"},{"lineNumber":64,"author":{"gitId":"-"},"content":""},{"lineNumber":65,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * Formats the title text to account for those that contain long words."},{"lineNumber":67,"author":{"gitId":"-"},"content":" * @param title - Title of Event that is to be displayed in the Table Row."},{"lineNumber":68,"author":{"gitId":"-"},"content":" */"},{"lineNumber":69,"author":{"gitId":"-"},"content":" fitTitleText(title: string): string {"},{"lineNumber":70,"author":{"gitId":"-"},"content":" // Arbitrary Length of Characters beyond which an overflow occurs."},{"lineNumber":71,"author":{"gitId":"-"},"content":" const MAX_WORD_LENGTH \u003d 43;"},{"lineNumber":72,"author":{"gitId":"-"},"content":" const SPLITTER_TEXT \u003d \u0027 \u0027;"},{"lineNumber":73,"author":{"gitId":"-"},"content":" const ELLIPSES \u003d \u0027...\u0027;"},{"lineNumber":74,"author":{"gitId":"-"},"content":""},{"lineNumber":75,"author":{"gitId":"-"},"content":" return title"},{"lineNumber":76,"author":{"gitId":"-"},"content":" .split(SPLITTER_TEXT)"},{"lineNumber":77,"author":{"gitId":"-"},"content":" .map((word) \u003d\u003e {"},{"lineNumber":78,"author":{"gitId":"-"},"content":" if (word.length \u003e MAX_WORD_LENGTH) {"},{"lineNumber":79,"author":{"gitId":"-"},"content":" return word.substring(0, MAX_WORD_LENGTH - 5).concat(ELLIPSES);"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return word;"},{"lineNumber":82,"author":{"gitId":"-"},"content":" })"},{"lineNumber":83,"author":{"gitId":"-"},"content":" .join(SPLITTER_TEXT);"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }"},{"lineNumber":85,"author":{"gitId":"-"},"content":""},{"lineNumber":86,"author":{"gitId":"-"},"content":" /** Not implemented yet. */"},{"lineNumber":87,"author":{"gitId":"-"},"content":" viewEventInBrowser(id: number, event: Event) {"},{"lineNumber":88,"author":{"gitId":"-"},"content":" this.logger.info(`EventTablesComponent: Opening Event ${id} on Github`);"},{"lineNumber":89,"author":{"gitId":"-"},"content":" // window.open(\u0027https://github.com/\u0027, \u0027_blank\u0027);"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }"},{"lineNumber":91,"author":{"gitId":"-"},"content":""},{"lineNumber":92,"author":{"gitId":"NereusWB922"},"content":" /** Opens dialog to show the event details of the selected week. */"},{"lineNumber":93,"author":{"gitId":"NereusWB922"},"content":" openDialog(eventWeek: EventWeek) {"},{"lineNumber":94,"author":{"gitId":"NereusWB922"},"content":" if (eventWeek.events.length \u003c\u003d 0) {"},{"lineNumber":95,"author":{"gitId":"NereusWB922"},"content":" this.errorHandling.handleError(new NoEventsError());"},{"lineNumber":96,"author":{"gitId":"NereusWB922"},"content":" return;"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }"},{"lineNumber":98,"author":{"gitId":"NereusWB922"},"content":" this.dialog.open(EventWeekDetailsComponent, {"},{"lineNumber":99,"author":{"gitId":"NereusWB922"},"content":" data: {"},{"lineNumber":100,"author":{"gitId":"NereusWB922"},"content":" eventWeek,"},{"lineNumber":101,"author":{"gitId":"NereusWB922"},"content":" expandedColumnsToDisplay: this.expandedColumnsToDisplay"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }"},{"lineNumber":103,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }"},{"lineNumber":105,"author":{"gitId":"-"},"content":""},{"lineNumber":106,"author":{"gitId":"-"},"content":" /** Returns color string of cell. Shade darkens with magnitude of number. */"},{"lineNumber":107,"author":{"gitId":"-"},"content":" colorCell(count: number) {"},{"lineNumber":108,"author":{"gitId":"-"},"content":" if (count \u003d\u003d\u003d 0) {"},{"lineNumber":109,"author":{"gitId":"-"},"content":" return \u0027white\u0027;"},{"lineNumber":110,"author":{"gitId":"-"},"content":" } else if (count \u003e 0 \u0026\u0026 count \u003c\u003d 5) {"},{"lineNumber":111,"author":{"gitId":"-"},"content":" return \u0027pale-green\u0027;"},{"lineNumber":112,"author":{"gitId":"-"},"content":" } else if (count \u003e 6) {"},{"lineNumber":113,"author":{"gitId":"-"},"content":" return \u0027green\u0027;"},{"lineNumber":114,"author":{"gitId":"-"},"content":" }"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }"},{"lineNumber":116,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"NereusWB922":21,"-":95}},{"path":"src/app/activity-dashboard/event-tables/no-events-error.model.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"export class NoEventsError extends Error {"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" constructor() {"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" super(\u0027No events found for this week.\u0027);"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" Object.setPrototypeOf(this, NoEventsError.prototype);"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":6}},{"path":"src/app/activity-dashboard/event-week-details/event-week-details.component.css","fileType":"css","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":".mat-cell {"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" white-space: nowrap;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" display: flex;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" align-items: center;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" justify-content: center;"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" text-align: center;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" padding: 0;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":".mat-header-cell {"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" display: flex;"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" align-items: center;"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" justify-content: center;"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" text-align: center;"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" padding: 0;"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":".mat-dialog-content {"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" min-width: 500px;"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":20}},{"path":"src/app/activity-dashboard/event-week-details/event-week-details.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"\u003ch2 mat-dialog-title\u003eEvent Week Details\u003c/h2\u003e"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"\u003cmat-dialog-content class\u003d\"mat-typography\"\u003e"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-table [dataSource]\u003d\"data.eventWeek.events\"\u003e"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" \u003cng-container matColumnDef\u003d\"{{ expandableColumn }}\" *ngFor\u003d\"let expandableColumn of data.expandedColumnsToDisplay\"\u003e"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-header-cell *matHeaderCellDef\u003e{{ expandableColumn }}\u003c/mat-header-cell\u003e"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-cell *matCellDef\u003d\"let property\"\u003e"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" {{ property[expandableColumn] }}"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" \u003c/ng-container\u003e"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-header-row *matHeaderRowDef\u003d\"data.expandedColumnsToDisplay\"\u003e\u003c/mat-header-row\u003e"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-row *matRowDef\u003d\"let property; columns: data.expandedColumnsToDisplay\"\u003e\u003c/mat-row\u003e"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-table\u003e"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":"\u003c/mat-dialog-content\u003e"}],"authorContributionMap":{"NereusWB922":13}},{"path":"src/app/activity-dashboard/event-week-details/event-week-details.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { Component, Inject } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { MAT_DIALOG_DATA } from \u0027@angular/material/dialog\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { EventWeek } from \u0027../event-week.model\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"export interface DialogData {"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" eventWeek: EventWeek;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" expandedColumnsToDisplay: string[];"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"@Component({"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" selector: \u0027app-event-week-detail\u0027,"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" templateUrl: \u0027./event-week-details.component.html\u0027,"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" styleUrls: [\u0027./event-week-details.component.css\u0027]"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":"})"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":"export class EventWeekDetailsComponent {"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" constructor(@Inject(MAT_DIALOG_DATA) public data: DialogData) {}"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":17}},{"path":"src/app/app.module.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { HttpClientModule } from \u0027@angular/common/http\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { ErrorHandler, NgModule, NgZone } from \u0027@angular/core\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { BrowserModule, Title } from \u0027@angular/platform-browser\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { BrowserAnimationsModule } from \u0027@angular/platform-browser/animations\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { Router } from \u0027@angular/router\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { Apollo, ApolloModule } from \u0027apollo-angular\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { HttpLink, HttpLinkModule } from \u0027apollo-angular-link-http\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { InMemoryCache, IntrospectionFragmentMatcher } from \u0027apollo-cache-inmemory\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { ApolloLink } from \u0027apollo-link\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import { setContext } from \u0027apollo-link-context\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import \u0027reflect-metadata\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import graphqlTypes from \u0027../../graphql/graphql-types\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import \u0027../polyfills\u0027;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import { ActivityDashboardModule } from \u0027./activity-dashboard/activity-dashboard.module\u0027;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import { AppRoutingModule } from \u0027./app-routing.module\u0027;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import { AppComponent } from \u0027./app.component\u0027;"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import { AuthModule } from \u0027./auth/auth.module\u0027;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import { UserConfirmationComponent } from \u0027./core/guards/user-confirmation/user-confirmation.component\u0027;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import { AuthService } from \u0027./core/services/auth.service\u0027;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import { ErrorHandlingService } from \u0027./core/services/error-handling.service\u0027;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import { ErrorMessageService } from \u0027./core/services/error-message.service\u0027;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import { AuthServiceFactory } from \u0027./core/services/factories/factory.auth.service\u0027;"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import { GithubServiceFactory } from \u0027./core/services/factories/factory.github.service\u0027;"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import { IssueServiceFactory } from \u0027./core/services/factories/factory.issue.service\u0027;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027./core/services/github.service\u0027;"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import { GithubEventService } from \u0027./core/services/githubevent.service\u0027;"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027./core/services/issue.service\u0027;"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import { LabelService } from \u0027./core/services/label.service\u0027;"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027./core/services/logging.service\u0027;"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import { PhaseService } from \u0027./core/services/phase.service\u0027;"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import { RepoSessionStorageService } from \u0027./core/services/repo-session-storage.service\u0027;"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import { UserService } from \u0027./core/services/user.service\u0027;"},{"lineNumber":33,"author":{"gitId":"-"},"content":"import { IssuesViewerModule } from \u0027./issues-viewer/issues-viewer.module\u0027;"},{"lineNumber":34,"author":{"gitId":"-"},"content":"import { LabelDefinitionPopupComponent } from \u0027./shared/label-definition-popup/label-definition-popup.component\u0027;"},{"lineNumber":35,"author":{"gitId":"-"},"content":"import { HeaderComponent } from \u0027./shared/layout\u0027;"},{"lineNumber":36,"author":{"gitId":"-"},"content":"import { RepoChangeFormComponent } from \u0027./shared/repo-change-form/repo-change-form.component\u0027;"},{"lineNumber":37,"author":{"gitId":"-"},"content":"import { SharedModule } from \u0027./shared/shared.module\u0027;"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"-"},"content":"@NgModule({"},{"lineNumber":40,"author":{"gitId":"Arif-Khalid"},"content":" declarations: [AppComponent, HeaderComponent, UserConfirmationComponent, LabelDefinitionPopupComponent, RepoChangeFormComponent],"},{"lineNumber":41,"author":{"gitId":"-"},"content":" imports: ["},{"lineNumber":42,"author":{"gitId":"-"},"content":" BrowserModule,"},{"lineNumber":43,"author":{"gitId":"-"},"content":" BrowserAnimationsModule,"},{"lineNumber":44,"author":{"gitId":"-"},"content":" AuthModule,"},{"lineNumber":45,"author":{"gitId":"-"},"content":" IssuesViewerModule,"},{"lineNumber":46,"author":{"gitId":"-"},"content":" ActivityDashboardModule,"},{"lineNumber":47,"author":{"gitId":"-"},"content":" SharedModule,"},{"lineNumber":48,"author":{"gitId":"-"},"content":" HttpClientModule,"},{"lineNumber":49,"author":{"gitId":"-"},"content":" AppRoutingModule,"},{"lineNumber":50,"author":{"gitId":"-"},"content":" ApolloModule,"},{"lineNumber":51,"author":{"gitId":"-"},"content":" HttpLinkModule"},{"lineNumber":52,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":53,"author":{"gitId":"-"},"content":" providers: ["},{"lineNumber":54,"author":{"gitId":"-"},"content":" {"},{"lineNumber":55,"author":{"gitId":"-"},"content":" provide: GithubService,"},{"lineNumber":56,"author":{"gitId":"-"},"content":" useFactory: GithubServiceFactory,"},{"lineNumber":57,"author":{"gitId":"-"},"content":" deps: [ErrorHandlingService, Apollo, LoggingService]"},{"lineNumber":58,"author":{"gitId":"-"},"content":" },"},{"lineNumber":59,"author":{"gitId":"-"},"content":" {"},{"lineNumber":60,"author":{"gitId":"-"},"content":" provide: AuthService,"},{"lineNumber":61,"author":{"gitId":"-"},"content":" useFactory: AuthServiceFactory,"},{"lineNumber":62,"author":{"gitId":"-"},"content":" deps: ["},{"lineNumber":63,"author":{"gitId":"-"},"content":" Router,"},{"lineNumber":64,"author":{"gitId":"-"},"content":" NgZone,"},{"lineNumber":65,"author":{"gitId":"-"},"content":" GithubService,"},{"lineNumber":66,"author":{"gitId":"-"},"content":" UserService,"},{"lineNumber":67,"author":{"gitId":"-"},"content":" IssueService,"},{"lineNumber":68,"author":{"gitId":"-"},"content":" LabelService,"},{"lineNumber":69,"author":{"gitId":"-"},"content":" PhaseService,"},{"lineNumber":70,"author":{"gitId":"-"},"content":" GithubEventService,"},{"lineNumber":71,"author":{"gitId":"-"},"content":" Title,"},{"lineNumber":72,"author":{"gitId":"-"},"content":" ErrorHandlingService,"},{"lineNumber":73,"author":{"gitId":"-"},"content":" LoggingService"},{"lineNumber":74,"author":{"gitId":"-"},"content":" ]"},{"lineNumber":75,"author":{"gitId":"-"},"content":" },"},{"lineNumber":76,"author":{"gitId":"-"},"content":" {"},{"lineNumber":77,"author":{"gitId":"-"},"content":" provide: IssueService,"},{"lineNumber":78,"author":{"gitId":"-"},"content":" useFactory: IssueServiceFactory,"},{"lineNumber":79,"author":{"gitId":"-"},"content":" deps: [GithubService, UserService, PhaseService]"},{"lineNumber":80,"author":{"gitId":"-"},"content":" },"},{"lineNumber":81,"author":{"gitId":"-"},"content":" {"},{"lineNumber":82,"author":{"gitId":"-"},"content":" provide: ErrorHandler,"},{"lineNumber":83,"author":{"gitId":"-"},"content":" useClass: ErrorHandlingService"},{"lineNumber":84,"author":{"gitId":"-"},"content":" },"},{"lineNumber":85,"author":{"gitId":"-"},"content":" ErrorMessageService,"},{"lineNumber":86,"author":{"gitId":"-"},"content":" RepoSessionStorageService"},{"lineNumber":87,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":88,"author":{"gitId":"-"},"content":" bootstrap: [AppComponent]"},{"lineNumber":89,"author":{"gitId":"-"},"content":"})"},{"lineNumber":90,"author":{"gitId":"-"},"content":"export class AppModule {"},{"lineNumber":91,"author":{"gitId":"-"},"content":" constructor(private apollo: Apollo, private httpLink: HttpLink, private authService: AuthService, private logger: LoggingService) {"},{"lineNumber":92,"author":{"gitId":"-"},"content":" const URI \u003d \u0027https://api.github.com/graphql\u0027;"},{"lineNumber":93,"author":{"gitId":"-"},"content":" const log \u003d new ApolloLink((operation, forward) \u003d\u003e {"},{"lineNumber":94,"author":{"gitId":"-"},"content":" operation.setContext({ start: performance.now() });"},{"lineNumber":95,"author":{"gitId":"-"},"content":" this.logger.info(\u0027AppModule: GraphQL request\u0027, operation.getContext());"},{"lineNumber":96,"author":{"gitId":"-"},"content":" return forward(operation).map((result) \u003d\u003e {"},{"lineNumber":97,"author":{"gitId":"-"},"content":" const time \u003d performance.now() - operation.getContext().start;"},{"lineNumber":98,"author":{"gitId":"-"},"content":" this.logger.info(\u0027AppModule: GraphQL response\u0027, operation.getContext(), `in ${Math.round(time)}ms`);"},{"lineNumber":99,"author":{"gitId":"-"},"content":" const repo \u003d operation.getContext().response.body.data.repository;"},{"lineNumber":100,"author":{"gitId":"-"},"content":" const item \u003d Object.keys(repo)[0];"},{"lineNumber":101,"author":{"gitId":"-"},"content":" this.logger.debug(\u0027AppModule: GraphQL response body\u0027, item, repo[item].edges.length, repo[item].edges);"},{"lineNumber":102,"author":{"gitId":"-"},"content":" return result;"},{"lineNumber":103,"author":{"gitId":"-"},"content":" });"},{"lineNumber":104,"author":{"gitId":"-"},"content":" });"},{"lineNumber":105,"author":{"gitId":"-"},"content":" const basic \u003d setContext(() \u003d\u003e {"},{"lineNumber":106,"author":{"gitId":"-"},"content":" return { headers: { Accept: \u0027charset\u003dutf-8\u0027 } };"},{"lineNumber":107,"author":{"gitId":"-"},"content":" });"},{"lineNumber":108,"author":{"gitId":"-"},"content":" const auth \u003d setContext(() \u003d\u003e {"},{"lineNumber":109,"author":{"gitId":"-"},"content":" return { headers: { Authorization: `Token ${this.authService.accessToken.getValue()}` } };"},{"lineNumber":110,"author":{"gitId":"-"},"content":" });"},{"lineNumber":111,"author":{"gitId":"-"},"content":" const link \u003d ApolloLink.from([log, basic, auth, this.httpLink.create({ uri: URI })]);"},{"lineNumber":112,"author":{"gitId":"-"},"content":" const fragmentMatcher \u003d new IntrospectionFragmentMatcher({"},{"lineNumber":113,"author":{"gitId":"-"},"content":" introspectionQueryResultData: graphqlTypes"},{"lineNumber":114,"author":{"gitId":"-"},"content":" });"},{"lineNumber":115,"author":{"gitId":"-"},"content":" const cache \u003d new InMemoryCache({ fragmentMatcher });"},{"lineNumber":116,"author":{"gitId":"-"},"content":" this.apollo.create({"},{"lineNumber":117,"author":{"gitId":"-"},"content":" link: link,"},{"lineNumber":118,"author":{"gitId":"-"},"content":" cache: cache"},{"lineNumber":119,"author":{"gitId":"-"},"content":" });"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }"},{"lineNumber":121,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"Arif-Khalid":1,"-":120}},{"path":"src/app/issues-viewer/card-view/card-view.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"nknguyenhc"},"content":"import { AfterViewInit, Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { MatPaginator } from \u0027@angular/material/paginator\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { MatSort } from \u0027@angular/material/sort\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { Observable } from \u0027rxjs\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { GithubUser } from \u0027../../core/models/github-user.model\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../core/models/issue.model\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027../../core/services/issue.service\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { FilterableComponent, FilterableSource } from \u0027../../shared/issue-tables/filterableTypes\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { IssuesDataTable } from \u0027../../shared/issue-tables/IssuesDataTable\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":12,"author":{"gitId":"-"},"content":" selector: \u0027app-card-view\u0027,"},{"lineNumber":13,"author":{"gitId":"-"},"content":" templateUrl: \u0027./card-view.component.html\u0027,"},{"lineNumber":14,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./card-view.component.css\u0027]"},{"lineNumber":15,"author":{"gitId":"-"},"content":"})"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Displays issues as Cards."},{"lineNumber":19,"author":{"gitId":"-"},"content":" */"},{"lineNumber":20,"author":{"gitId":"-"},"content":"export class CardViewComponent implements OnInit, AfterViewInit, OnDestroy, FilterableComponent {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" @Input() headers: string[];"},{"lineNumber":22,"author":{"gitId":"-"},"content":" @Input() assignee?: GithubUser \u003d undefined;"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Input() filters?: any \u003d undefined;"},{"lineNumber":24,"author":{"gitId":"-"},"content":" @Input() sort?: MatSort \u003d undefined;"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":" @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator;"},{"lineNumber":27,"author":{"gitId":"-"},"content":""},{"lineNumber":28,"author":{"gitId":"-"},"content":" issues: IssuesDataTable;"},{"lineNumber":29,"author":{"gitId":"-"},"content":" issues$: Observable\u003cIssue[]\u003e;"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"Arif-Khalid"},"content":" isLoading \u003d true;"},{"lineNumber":32,"author":{"gitId":"Arif-Khalid"},"content":" issueLength \u003d 0;"},{"lineNumber":33,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":34,"author":{"gitId":"nknguyenhc"},"content":" @Output() issueLengthChange: EventEmitter\u003cNumber\u003e \u003d new EventEmitter\u003cNumber\u003e();"},{"lineNumber":35,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":36,"author":{"gitId":"Arif-Khalid"},"content":" constructor(public element: ElementRef, public issueService: IssueService) {}"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":39,"author":{"gitId":"-"},"content":" this.issues \u003d new IssuesDataTable(this.issueService, this.sort, this.paginator, this.headers, this.assignee, this.filters);"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":" ngAfterViewInit(): void {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" setTimeout(() \u003d\u003e {"},{"lineNumber":44,"author":{"gitId":"-"},"content":" this.issues.loadIssues();"},{"lineNumber":45,"author":{"gitId":"-"},"content":" this.issues$ \u003d this.issues.connect();"},{"lineNumber":46,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":47,"author":{"gitId":"Arif-Khalid"},"content":" // Emit event when issues change"},{"lineNumber":48,"author":{"gitId":"Arif-Khalid"},"content":" this.issues$.subscribe((issues) \u003d\u003e {"},{"lineNumber":49,"author":{"gitId":"Arif-Khalid"},"content":" this.issueLength \u003d issues.length;"},{"lineNumber":50,"author":{"gitId":"nknguyenhc"},"content":" this.issueLengthChange.emit(this.issueLength);"},{"lineNumber":51,"author":{"gitId":"Arif-Khalid"},"content":" });"},{"lineNumber":52,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":53,"author":{"gitId":"Arif-Khalid"},"content":" // Emit event when loading state changes"},{"lineNumber":54,"author":{"gitId":"Arif-Khalid"},"content":" this.issues.isLoading$.subscribe((isLoadingUpdate) \u003d\u003e {"},{"lineNumber":55,"author":{"gitId":"Arif-Khalid"},"content":" this.isLoading \u003d isLoadingUpdate;"},{"lineNumber":56,"author":{"gitId":"Arif-Khalid"},"content":" });"},{"lineNumber":57,"author":{"gitId":"-"},"content":" });"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }"},{"lineNumber":59,"author":{"gitId":"-"},"content":""},{"lineNumber":60,"author":{"gitId":"-"},"content":" ngOnDestroy(): void {"},{"lineNumber":61,"author":{"gitId":"-"},"content":" setTimeout(() \u003d\u003e {"},{"lineNumber":62,"author":{"gitId":"-"},"content":" this.issues.disconnect();"},{"lineNumber":63,"author":{"gitId":"-"},"content":" });"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }"},{"lineNumber":65,"author":{"gitId":"-"},"content":""},{"lineNumber":66,"author":{"gitId":"-"},"content":" retrieveFilterable(): FilterableSource {"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return this.issues;"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":4,"Arif-Khalid":14,"-":51}},{"path":"src/app/issues-viewer/hidden-users/hidden-users.component.css","fileType":"css","lines":[{"lineNumber":1,"author":{"gitId":"nknguyenhc"},"content":".hidden-users {"},{"lineNumber":2,"author":{"gitId":"nknguyenhc"},"content":" margin: 8px;"},{"lineNumber":3,"author":{"gitId":"nknguyenhc"},"content":" min-width: 150px;"},{"lineNumber":4,"author":{"gitId":"nknguyenhc"},"content":" max-width: 300px;"},{"lineNumber":5,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":6,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":7,"author":{"gitId":"nknguyenhc"},"content":".row-count {"},{"lineNumber":8,"author":{"gitId":"nknguyenhc"},"content":" background-color: rgb(222, 222, 222);"},{"lineNumber":9,"author":{"gitId":"nknguyenhc"},"content":" border-radius: 3px;"},{"lineNumber":10,"author":{"gitId":"nknguyenhc"},"content":" cursor: default;"},{"lineNumber":11,"author":{"gitId":"nknguyenhc"},"content":" padding: 6px;"},{"lineNumber":12,"author":{"gitId":"nknguyenhc"},"content":" color: rgb(0, 0, 0);"},{"lineNumber":13,"author":{"gitId":"nknguyenhc"},"content":" font-weight: 410;"},{"lineNumber":14,"author":{"gitId":"nknguyenhc"},"content":" display: inline-flex;"},{"lineNumber":15,"author":{"gitId":"nknguyenhc"},"content":" font-size: 14px;"},{"lineNumber":16,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":17,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":18,"author":{"gitId":"nknguyenhc"},"content":".mat-card-header {"},{"lineNumber":19,"author":{"gitId":"nknguyenhc"},"content":" display: flex;"},{"lineNumber":20,"author":{"gitId":"nknguyenhc"},"content":" flex-direction: row;"},{"lineNumber":21,"author":{"gitId":"nknguyenhc"},"content":" align-items: center;"},{"lineNumber":22,"author":{"gitId":"nknguyenhc"},"content":" width: 100%;"},{"lineNumber":23,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":24,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":25,"author":{"gitId":"nknguyenhc"},"content":".mat-card {"},{"lineNumber":26,"author":{"gitId":"nknguyenhc"},"content":" margin: 8px 0px;"},{"lineNumber":27,"author":{"gitId":"nknguyenhc"},"content":" height: 40px;"},{"lineNumber":28,"author":{"gitId":"nknguyenhc"},"content":" padding: 10px;"},{"lineNumber":29,"author":{"gitId":"nknguyenhc"},"content":" display: flex;"},{"lineNumber":30,"author":{"gitId":"nknguyenhc"},"content":" align-items: center;"},{"lineNumber":31,"author":{"gitId":"nknguyenhc"},"content":" justify-content: center;"},{"lineNumber":32,"author":{"gitId":"nknguyenhc"},"content":" flex-direction: row;"},{"lineNumber":33,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":34,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":35,"author":{"gitId":"nknguyenhc"},"content":".mat-card-title {"},{"lineNumber":36,"author":{"gitId":"nknguyenhc"},"content":" font-size: 14px;"},{"lineNumber":37,"author":{"gitId":"nknguyenhc"},"content":" text-align: center;"},{"lineNumber":38,"author":{"gitId":"nknguyenhc"},"content":" margin: 0;"},{"lineNumber":39,"author":{"gitId":"nknguyenhc"},"content":" flex-grow: 1;"},{"lineNumber":40,"author":{"gitId":"nknguyenhc"},"content":" margin: 2px;"},{"lineNumber":41,"author":{"gitId":"nknguyenhc"},"content":" word-break: break-word;"},{"lineNumber":42,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":43,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":44,"author":{"gitId":"nknguyenhc"},"content":".mat-card-avatar {"},{"lineNumber":45,"author":{"gitId":"nknguyenhc"},"content":" height: 30px;"},{"lineNumber":46,"author":{"gitId":"nknguyenhc"},"content":" width: 30px;"},{"lineNumber":47,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":48,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":49,"author":{"gitId":"nknguyenhc"},"content":".mat-card-header .mat-card-title {"},{"lineNumber":50,"author":{"gitId":"nknguyenhc"},"content":" font-size: 12px;"},{"lineNumber":51,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":52,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":53,"author":{"gitId":"nknguyenhc"},"content":".scrollable-container {"},{"lineNumber":54,"author":{"gitId":"nknguyenhc"},"content":" height: 67vh;"},{"lineNumber":55,"author":{"gitId":"nknguyenhc"},"content":" overflow: auto;"},{"lineNumber":56,"author":{"gitId":"nknguyenhc"},"content":" scrollbar-width: none;"},{"lineNumber":57,"author":{"gitId":"nknguyenhc"},"content":" -ms-overflow-style: none;"},{"lineNumber":58,"author":{"gitId":"nknguyenhc"},"content":" position: relative;"},{"lineNumber":59,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":60,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":61,"author":{"gitId":"nknguyenhc"},"content":".scrollable-containers::-webkit-scrollbar {"},{"lineNumber":62,"author":{"gitId":"nknguyenhc"},"content":" display: none;"},{"lineNumber":63,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":64,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":65,"author":{"gitId":"nknguyenhc"},"content":".scrollable-container::before,"},{"lineNumber":66,"author":{"gitId":"nknguyenhc"},"content":".scrollable-container::after {"},{"lineNumber":67,"author":{"gitId":"nknguyenhc"},"content":" pointer-events: none;"},{"lineNumber":68,"author":{"gitId":"nknguyenhc"},"content":" content: \u0027\u0027;"},{"lineNumber":69,"author":{"gitId":"nknguyenhc"},"content":" z-index: 2;"},{"lineNumber":70,"author":{"gitId":"nknguyenhc"},"content":" height: 6px;"},{"lineNumber":71,"author":{"gitId":"nknguyenhc"},"content":" width: 100%;"},{"lineNumber":72,"author":{"gitId":"nknguyenhc"},"content":" display: block;"},{"lineNumber":73,"author":{"gitId":"nknguyenhc"},"content":" background-image: linear-gradient(to bottom, white 66%, transparent);"},{"lineNumber":74,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":75,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":76,"author":{"gitId":"nknguyenhc"},"content":".scrollable-container::before {"},{"lineNumber":77,"author":{"gitId":"nknguyenhc"},"content":" position: absolute;"},{"lineNumber":78,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":79,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":80,"author":{"gitId":"nknguyenhc"},"content":".scrollable-container::after {"},{"lineNumber":81,"author":{"gitId":"nknguyenhc"},"content":" position: sticky;"},{"lineNumber":82,"author":{"gitId":"nknguyenhc"},"content":"}"}],"authorContributionMap":{"nknguyenhc":82}},{"path":"src/app/issues-viewer/hidden-users/hidden-users.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"nknguyenhc"},"content":"\u003cdiv *ngIf\u003d\"users.length \u003e 0\" class\u003d\"hidden-users\"\u003e"},{"lineNumber":2,"author":{"gitId":"nknguyenhc"},"content":" \u003cmat-card\u003e"},{"lineNumber":3,"author":{"gitId":"nknguyenhc"},"content":" \u003cmat-card-title\u003eHidden users\u003c/mat-card-title\u003e"},{"lineNumber":4,"author":{"gitId":"nknguyenhc"},"content":" \u003cdiv class\u003d\"row-count\"\u003e{{ users.length }}\u003c/div\u003e"},{"lineNumber":5,"author":{"gitId":"nknguyenhc"},"content":" \u003c/mat-card\u003e"},{"lineNumber":6,"author":{"gitId":"nknguyenhc"},"content":" \u003cdiv class\u003d\"scrollable-container\"\u003e"},{"lineNumber":7,"author":{"gitId":"nknguyenhc"},"content":" \u003cdiv *ngFor\u003d\"let user of users\"\u003e"},{"lineNumber":8,"author":{"gitId":"nknguyenhc"},"content":" \u003cmat-card\u003e"},{"lineNumber":9,"author":{"gitId":"nknguyenhc"},"content":" \u003cmar-card-header class\u003d\"mat-card-header\"\u003e"},{"lineNumber":10,"author":{"gitId":"nknguyenhc"},"content":" \u003cdiv"},{"lineNumber":11,"author":{"gitId":"nknguyenhc"},"content":" mat-card-avatar"},{"lineNumber":12,"author":{"gitId":"nknguyenhc"},"content":" [ngStyle]\u003d\"{"},{"lineNumber":13,"author":{"gitId":"nknguyenhc"},"content":" background: \u0027url(\u0027 + user.avatar_url + \u0027)\u0027,"},{"lineNumber":14,"author":{"gitId":"nknguyenhc"},"content":" \u0027background-size\u0027: \u002730px\u0027"},{"lineNumber":15,"author":{"gitId":"nknguyenhc"},"content":" }\""},{"lineNumber":16,"author":{"gitId":"nknguyenhc"},"content":" \u003e\u003c/div\u003e"},{"lineNumber":17,"author":{"gitId":"nknguyenhc"},"content":" \u003cmat-card-title\u003e{{ user.login }}\u003c/mat-card-title\u003e"},{"lineNumber":18,"author":{"gitId":"nknguyenhc"},"content":" \u003c/mar-card-header\u003e"},{"lineNumber":19,"author":{"gitId":"nknguyenhc"},"content":" \u003c/mat-card\u003e"},{"lineNumber":20,"author":{"gitId":"nknguyenhc"},"content":" \u003c/div\u003e"},{"lineNumber":21,"author":{"gitId":"nknguyenhc"},"content":" \u003c/div\u003e"},{"lineNumber":22,"author":{"gitId":"nknguyenhc"},"content":"\u003c/div\u003e"}],"authorContributionMap":{"nknguyenhc":22}},{"path":"src/app/issues-viewer/hidden-users/hidden-users.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"nknguyenhc"},"content":"import { Component, Input } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"nknguyenhc"},"content":"import { GithubUser } from \u0027../../core/models/github-user.model\u0027;"},{"lineNumber":3,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":4,"author":{"gitId":"nknguyenhc"},"content":"@Component({"},{"lineNumber":5,"author":{"gitId":"nknguyenhc"},"content":" selector: \u0027app-hidden-users\u0027,"},{"lineNumber":6,"author":{"gitId":"nknguyenhc"},"content":" templateUrl: \u0027./hidden-users.component.html\u0027,"},{"lineNumber":7,"author":{"gitId":"nknguyenhc"},"content":" styleUrls: [\u0027./hidden-users.component.css\u0027]"},{"lineNumber":8,"author":{"gitId":"nknguyenhc"},"content":"})"},{"lineNumber":9,"author":{"gitId":"nknguyenhc"},"content":"export class HiddenUsersComponent {"},{"lineNumber":10,"author":{"gitId":"nknguyenhc"},"content":" @Input() users: GithubUser[] \u003d [];"},{"lineNumber":11,"author":{"gitId":"nknguyenhc"},"content":"}"}],"authorContributionMap":{"nknguyenhc":11}},{"path":"src/app/issues-viewer/issues-viewer.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cdiv\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"loading-spinner\" *ngIf\u003d\"this.phaseService.isChangingRepo | async; else elseBlock\"\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \u003cmat-progress-spinner color\u003d\"primary\" mode\u003d\"indeterminate\" diameter\u003d\"50\" strokeWidth\u003d\"5\"\u003e \u003c/mat-progress-spinner\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cng-template #elseBlock\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003capp-filter-bar [views$]\u003d\"views\" #filterbar\u003e\u003c/app-filter-bar\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"wrapper\"\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003capp-card-view"},{"lineNumber":11,"author":{"gitId":"-"},"content":" *ngFor\u003d\"let assignee of assignees\""},{"lineNumber":12,"author":{"gitId":"-"},"content":" class\u003d\"issue-table\""},{"lineNumber":13,"author":{"gitId":"Arif-Khalid"},"content":" #card"},{"lineNumber":14,"author":{"gitId":"Arif-Khalid"},"content":" [ngStyle]\u003d\"{ display: card.isLoading || card.issueLength \u003e 0 ? \u0027initial\u0027 : \u0027none\u0027 }\""},{"lineNumber":15,"author":{"gitId":"-"},"content":" [assignee]\u003d\"assignee\""},{"lineNumber":16,"author":{"gitId":"-"},"content":" [headers]\u003d\"this.displayedColumns\""},{"lineNumber":17,"author":{"gitId":"-"},"content":" [sort]\u003d\"filterbar.matSort\""},{"lineNumber":18,"author":{"gitId":"nknguyenhc"},"content":" (issueLengthChange)\u003d\"updateHiddenUsers($event, assignee)\""},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003e\u003c/app-card-view\u003e"},{"lineNumber":20,"author":{"gitId":"Arif-Khalid"},"content":" \u003capp-card-view"},{"lineNumber":21,"author":{"gitId":"Arif-Khalid"},"content":" class\u003d\"issue-table\""},{"lineNumber":22,"author":{"gitId":"Arif-Khalid"},"content":" #card"},{"lineNumber":23,"author":{"gitId":"Arif-Khalid"},"content":" [ngStyle]\u003d\"{ display: card.isLoading || card.issueLength \u003e 0 ? \u0027initial\u0027 : \u0027none\u0027 }\""},{"lineNumber":24,"author":{"gitId":"Arif-Khalid"},"content":" [headers]\u003d\"this.displayedColumns\""},{"lineNumber":25,"author":{"gitId":"Arif-Khalid"},"content":" [sort]\u003d\"filterbar.matSort\""},{"lineNumber":26,"author":{"gitId":"Arif-Khalid"},"content":" \u003e"},{"lineNumber":27,"author":{"gitId":"Arif-Khalid"},"content":" \u003c/app-card-view\u003e"},{"lineNumber":28,"author":{"gitId":"nknguyenhc"},"content":" \u003capp-hidden-users [users]\u003d\"hiddenAssignees\"\u003e\u003c/app-hidden-users\u003e"},{"lineNumber":29,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \u003c/ng-template\u003e"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003c/div\u003e"}],"authorContributionMap":{"nknguyenhc":2,"Arif-Khalid":10,"-":19}},{"path":"src/app/issues-viewer/issues-viewer.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { AfterViewInit, Component, OnDestroy, OnInit, QueryList, ViewChild, ViewChildren } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { BehaviorSubject, of, Subscription } from \u0027rxjs\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { GithubUser } from \u0027../core/models/github-user.model\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { Repo } from \u0027../core/models/repo.model\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { ErrorMessageService } from \u0027../core/services/error-message.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027../core/services/github.service\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027../core/services/issue.service\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { LabelService } from \u0027../core/services/label.service\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { MilestoneService } from \u0027../core/services/milestone.service\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import { PhaseService } from \u0027../core/services/phase.service\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import { TABLE_COLUMNS } from \u0027../shared/issue-tables/issue-tables-columns\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import { CardViewComponent } from \u0027./card-view/card-view.component\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":15,"author":{"gitId":"-"},"content":" selector: \u0027app-issues-viewer\u0027,"},{"lineNumber":16,"author":{"gitId":"-"},"content":" templateUrl: \u0027./issues-viewer.component.html\u0027,"},{"lineNumber":17,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./issues-viewer.component.css\u0027]"},{"lineNumber":18,"author":{"gitId":"-"},"content":"})"},{"lineNumber":19,"author":{"gitId":"-"},"content":"export class IssuesViewerComponent implements OnInit, AfterViewInit, OnDestroy {"},{"lineNumber":20,"author":{"gitId":"-"},"content":" readonly displayedColumns \u003d [TABLE_COLUMNS.ID, TABLE_COLUMNS.TITLE, TABLE_COLUMNS.ASSIGNEE, TABLE_COLUMNS.LABEL];"},{"lineNumber":21,"author":{"gitId":"-"},"content":""},{"lineNumber":22,"author":{"gitId":"-"},"content":" /** Observes for any change in repo*/"},{"lineNumber":23,"author":{"gitId":"-"},"content":" repoChangeSubscription: Subscription;"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":" /** Observes for any change in the cardviews */"},{"lineNumber":26,"author":{"gitId":"-"},"content":" viewChange: Subscription;"},{"lineNumber":27,"author":{"gitId":"-"},"content":""},{"lineNumber":28,"author":{"gitId":"-"},"content":" /** Users to show as columns */"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assignees: GithubUser[];"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"nknguyenhc"},"content":" /** The list of users with 0 issues (hidden) */"},{"lineNumber":32,"author":{"gitId":"nknguyenhc"},"content":" hiddenAssignees: GithubUser[] \u003d [];"},{"lineNumber":33,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":34,"author":{"gitId":"-"},"content":" @ViewChildren(CardViewComponent) cardViews: QueryList\u003cCardViewComponent\u003e;"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":" views \u003d new BehaviorSubject\u003cQueryList\u003cCardViewComponent\u003e\u003e(undefined);"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":" constructor("},{"lineNumber":39,"author":{"gitId":"-"},"content":" public phaseService: PhaseService,"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public githubService: GithubService,"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public issueService: IssueService,"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public labelService: LabelService,"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public milestoneService: MilestoneService"},{"lineNumber":44,"author":{"gitId":"-"},"content":" ) {"},{"lineNumber":45,"author":{"gitId":"-"},"content":" this.repoChangeSubscription \u003d this.phaseService.repoChanged$.subscribe((newRepo) \u003d\u003e {"},{"lineNumber":46,"author":{"gitId":"-"},"content":" this.issueService.reset(false);"},{"lineNumber":47,"author":{"gitId":"-"},"content":" this.labelService.reset();"},{"lineNumber":48,"author":{"gitId":"-"},"content":" this.initialize();"},{"lineNumber":49,"author":{"gitId":"-"},"content":" });"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }"},{"lineNumber":51,"author":{"gitId":"-"},"content":""},{"lineNumber":52,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":53,"author":{"gitId":"-"},"content":" this.initialize();"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":" ngAfterViewInit(): void {"},{"lineNumber":57,"author":{"gitId":"-"},"content":" this.viewChange \u003d this.cardViews.changes.subscribe((x) \u003d\u003e this.views.next(x));"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }"},{"lineNumber":59,"author":{"gitId":"-"},"content":""},{"lineNumber":60,"author":{"gitId":"-"},"content":" ngOnDestroy(): void {"},{"lineNumber":61,"author":{"gitId":"-"},"content":" this.repoChangeSubscription.unsubscribe();"},{"lineNumber":62,"author":{"gitId":"-"},"content":" this.viewChange.unsubscribe();"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }"},{"lineNumber":64,"author":{"gitId":"-"},"content":""},{"lineNumber":65,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * Fetch and initialize all information from repository to populate Issue Dashboard."},{"lineNumber":67,"author":{"gitId":"-"},"content":" */"},{"lineNumber":68,"author":{"gitId":"-"},"content":" private initialize() {"},{"lineNumber":69,"author":{"gitId":"-"},"content":" this.checkIfValidRepository().subscribe((isValidRepository) \u003d\u003e {"},{"lineNumber":70,"author":{"gitId":"-"},"content":" if (!isValidRepository) {"},{"lineNumber":71,"author":{"gitId":"-"},"content":" throw new Error(ErrorMessageService.repositoryNotPresentMessage());"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }"},{"lineNumber":73,"author":{"gitId":"-"},"content":" });"},{"lineNumber":74,"author":{"gitId":"-"},"content":""},{"lineNumber":75,"author":{"gitId":"-"},"content":" // Fetch assignees"},{"lineNumber":76,"author":{"gitId":"-"},"content":" this.assignees \u003d [];"},{"lineNumber":77,"author":{"gitId":"nknguyenhc"},"content":" this.hiddenAssignees \u003d [];"},{"lineNumber":78,"author":{"gitId":"-"},"content":""},{"lineNumber":79,"author":{"gitId":"-"},"content":" this.githubService.getUsersAssignable().subscribe((x) \u003d\u003e (this.assignees \u003d x));"},{"lineNumber":80,"author":{"gitId":"-"},"content":""},{"lineNumber":81,"author":{"gitId":"-"},"content":" // Fetch issues"},{"lineNumber":82,"author":{"gitId":"-"},"content":" this.issueService.reloadAllIssues();"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }"},{"lineNumber":84,"author":{"gitId":"-"},"content":""},{"lineNumber":85,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":86,"author":{"gitId":"-"},"content":" * Checks if our current repository available on phase service is indeed a valid repository"},{"lineNumber":87,"author":{"gitId":"-"},"content":" */"},{"lineNumber":88,"author":{"gitId":"-"},"content":" private checkIfValidRepository() {"},{"lineNumber":89,"author":{"gitId":"-"},"content":" const currentRepo \u003d this.phaseService.currentRepo;"},{"lineNumber":90,"author":{"gitId":"-"},"content":""},{"lineNumber":91,"author":{"gitId":"-"},"content":" if (Repo.isInvalidRepoName(currentRepo)) {"},{"lineNumber":92,"author":{"gitId":"-"},"content":" return of(false);"},{"lineNumber":93,"author":{"gitId":"-"},"content":" }"},{"lineNumber":94,"author":{"gitId":"-"},"content":""},{"lineNumber":95,"author":{"gitId":"-"},"content":" return this.githubService.isRepositoryPresent(currentRepo.owner, currentRepo.name);"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }"},{"lineNumber":97,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":98,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":99,"author":{"gitId":"nknguyenhc"},"content":" * Update the list of hidden user based on the new info."},{"lineNumber":100,"author":{"gitId":"nknguyenhc"},"content":" * @param issueLength The number of issues assigned to this user."},{"lineNumber":101,"author":{"gitId":"nknguyenhc"},"content":" * @param assignee The assignee."},{"lineNumber":102,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":103,"author":{"gitId":"nknguyenhc"},"content":" updateHiddenUsers(issueLength: number, assignee: GithubUser) {"},{"lineNumber":104,"author":{"gitId":"nknguyenhc"},"content":" if (issueLength \u003d\u003d\u003d 0) {"},{"lineNumber":105,"author":{"gitId":"nknguyenhc"},"content":" this.updateHiddenUser(assignee);"},{"lineNumber":106,"author":{"gitId":"nknguyenhc"},"content":" } else {"},{"lineNumber":107,"author":{"gitId":"nknguyenhc"},"content":" this.removeHiddenUser(assignee);"},{"lineNumber":108,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":109,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":110,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":111,"author":{"gitId":"nknguyenhc"},"content":" private updateHiddenUser(assignee: GithubUser) {"},{"lineNumber":112,"author":{"gitId":"nknguyenhc"},"content":" if (!this.hiddenAssignees.includes(assignee)) {"},{"lineNumber":113,"author":{"gitId":"nknguyenhc"},"content":" this.hiddenAssignees.push(assignee);"},{"lineNumber":114,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":115,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":116,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":117,"author":{"gitId":"nknguyenhc"},"content":" private removeHiddenUser(assignee: GithubUser) {"},{"lineNumber":118,"author":{"gitId":"nknguyenhc"},"content":" this.hiddenAssignees \u003d this.hiddenAssignees.filter((user) \u003d\u003e user !\u003d\u003d assignee);"},{"lineNumber":119,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":120,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":27,"-":93}},{"path":"src/app/issues-viewer/issues-viewer.module.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { NgModule } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { FilterBarModule } from \u0027../shared/filter-bar/filter-bar.module\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { IssuesPrCardModule } from \u0027../shared/issue-pr-card/issue-pr-card.module\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { SharedModule } from \u0027../shared/shared.module\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { CardViewComponent } from \u0027./card-view/card-view.component\u0027;"},{"lineNumber":6,"author":{"gitId":"nknguyenhc"},"content":"import { HiddenUsersComponent } from \u0027./hidden-users/hidden-users.component\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { IssuesViewerRoutingModule } from \u0027./issues-viewer-routing.module\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { IssuesViewerComponent } from \u0027./issues-viewer.component\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"@NgModule({"},{"lineNumber":11,"author":{"gitId":"-"},"content":" imports: [FilterBarModule, IssuesViewerRoutingModule, IssuesPrCardModule, SharedModule],"},{"lineNumber":12,"author":{"gitId":"nknguyenhc"},"content":" declarations: [IssuesViewerComponent, CardViewComponent, HiddenUsersComponent],"},{"lineNumber":13,"author":{"gitId":"-"},"content":" exports: [IssuesViewerComponent, CardViewComponent]"},{"lineNumber":14,"author":{"gitId":"-"},"content":"})"},{"lineNumber":15,"author":{"gitId":"-"},"content":"export class IssuesViewerModule {}"}],"authorContributionMap":{"nknguyenhc":2,"-":13}},{"path":"src/app/shared/filter-bar/label-filter-bar/label-filter-bar.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cbutton mat-stroked-button *ngIf\u003d\"loaded\" [matMenuTriggerFor]\u003d\"menu\"\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":" {{ selectedLabelNames.length \u003d\u003d 0 ? \u0027All\u0027 : selectedLabelNames.length }} Selected | {{ hiddenLabelNames?.size || 0 }} Hidden ▾"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/button\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cbutton mat-stroked-button disabled *ngIf\u003d\"!loaded\" color\u003d\"accent\"\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cmat-progress-bar mode\u003d\"query\"\u003e\u003c/mat-progress-bar\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":"\u003c/button\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003cmat-menu #menu\u003d\"matMenu\" class\u003d\"popupmenu\"\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cdiv (click)\u003d\"$event.stopPropagation()\" class\u003d\"popup-container\"\u003e"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cmat-form-field appearance\u003d\"standard\" class\u003d\"input-field\"\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cmat-label\u003eLabels\u003c/mat-label\u003e"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003cinput #input matInput placeholder\u003d\"Find labels\" /\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003cbutton mat-button (click)\u003d\"removeAllSelection()\"\u003eRemove all\u003c/button\u003e"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"!hasLabels(input.value)\" class\u003d\"no-labels\"\u003eNo Labels Found!\u003c/div\u003e"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"scroll-container-wrapper\"\u003e"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"scroll-container\"\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \u003cmat-selection-list [(ngModel)]\u003d\"selectedLabelNames\" (selectionChange)\u003d\"updateSelection()\"\u003e"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cmat-list-option"},{"lineNumber":24,"author":{"gitId":"-"},"content":" #option"},{"lineNumber":25,"author":{"gitId":"-"},"content":" *ngFor\u003d\"let label of this.labels$ | async\""},{"lineNumber":26,"author":{"gitId":"nknguyenhc"},"content":" [value]\u003d\"label.formattedName\""},{"lineNumber":27,"author":{"gitId":"nknguyenhc"},"content":" [selected]\u003d\"selectedLabelNames.includes(label.formattedName)\""},{"lineNumber":28,"author":{"gitId":"-"},"content":" class\u003d\"list-option\""},{"lineNumber":29,"author":{"gitId":"-"},"content":" [class.hidden]\u003d\"filter(input.value, label.name)\""},{"lineNumber":30,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":31,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"flexbox-container\"\u003e"},{"lineNumber":32,"author":{"gitId":"nknguyenhc"},"content":" \u003cbutton"},{"lineNumber":33,"author":{"gitId":"nknguyenhc"},"content":" mat-icon-button"},{"lineNumber":34,"author":{"gitId":"nknguyenhc"},"content":" *ngIf\u003d\"!hiddenLabelNames.has(label.formattedName)\""},{"lineNumber":35,"author":{"gitId":"nknguyenhc"},"content":" (click)\u003d\"hide(label.formattedName); $event.stopPropagation()\""},{"lineNumber":36,"author":{"gitId":"nknguyenhc"},"content":" \u003e"},{"lineNumber":37,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003evisibility\u003c/mat-icon\u003e"},{"lineNumber":38,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":39,"author":{"gitId":"nknguyenhc"},"content":" \u003cbutton"},{"lineNumber":40,"author":{"gitId":"nknguyenhc"},"content":" mat-icon-button"},{"lineNumber":41,"author":{"gitId":"nknguyenhc"},"content":" *ngIf\u003d\"hiddenLabelNames.has(label.formattedName)\""},{"lineNumber":42,"author":{"gitId":"nknguyenhc"},"content":" (click)\u003d\"show(label.formattedName); $event.stopPropagation()\""},{"lineNumber":43,"author":{"gitId":"nknguyenhc"},"content":" \u003e"},{"lineNumber":44,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003evisibility_off\u003c/mat-icon\u003e"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":46,"author":{"gitId":"-"},"content":" \u003cmat-chip"},{"lineNumber":47,"author":{"gitId":"-"},"content":" [ngStyle]\u003d\"labelService.setLabelStyle(label.color)\""},{"lineNumber":48,"author":{"gitId":"nknguyenhc"},"content":" [disabled]\u003d\"hiddenLabelNames.has(label.formattedName)\""},{"lineNumber":49,"author":{"gitId":"-"},"content":" (click)\u003d\"simulateClick(option); $event.stopPropagation()\""},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":51,"author":{"gitId":"-"},"content":" {{ label.formattedName }}"},{"lineNumber":52,"author":{"gitId":"-"},"content":" \u003c/mat-chip\u003e"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003c/mat-list-option\u003e"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003c/mat-selection-list\u003e"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":59,"author":{"gitId":"-"},"content":"\u003c/mat-menu\u003e"}],"authorContributionMap":{"nknguyenhc":13,"-":46}},{"path":"src/app/shared/layout/header.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cmat-toolbar color\u003d\"primary\" style\u003d\"position: sticky; position: -webkit-sticky; top: 0; z-index: 1000\"\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":3,"author":{"gitId":"-"},"content":" *ngIf\u003d\"isBackButtonShown()\""},{"lineNumber":4,"author":{"gitId":"-"},"content":" mat-icon-button"},{"lineNumber":5,"author":{"gitId":"-"},"content":" class\u003d\"mat-toolbar mat-primary back-button\""},{"lineNumber":6,"author":{"gitId":"-"},"content":" style\u003d\"transform: scale(0.9)\""},{"lineNumber":7,"author":{"gitId":"-"},"content":" (click)\u003d\"goBack()\""},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003earrow_back_ios\u003c/mat-icon\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":11,"author":{"gitId":"MadLamprey"},"content":" \u003ca"},{"lineNumber":12,"author":{"gitId":"MadLamprey"},"content":" class\u003d\"mat-toolbar mat-primary\""},{"lineNumber":13,"author":{"gitId":"MadLamprey"},"content":" style\u003d\"text-decoration: none\""},{"lineNumber":14,"author":{"gitId":"MadLamprey"},"content":" [routerLink]\u003d\"phaseService.isRepoSet() ? phaseService.currentPhase : null\""},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003eWATcher v{{ this.getVersion() }}\u003c/a"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003cspan id\u003d\"phase-descriptor\" *ngIf\u003d\"auth.isAuthenticated()\" style\u003d\"margin-left: 10px\"\u003e"},{"lineNumber":18,"author":{"gitId":"-"},"content":" ({{ this.getPhaseDescription(phaseService.currentPhase) }})"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"auth.isAuthenticated() \u0026\u0026 this.phaseService.sessionData.sessionRepo.length \u003e 1\"\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \u003cbutton mat-button [matMenuTriggerFor]\u003d\"menu\"\u003e\u003cmat-icon style\u003d\"color: white\"\u003eexpand_more\u003c/mat-icon\u003e\u003c/button\u003e"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cmat-menu #menu\u003d\"matMenu\"\u003e"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":25,"author":{"gitId":"-"},"content":" mat-menu-item"},{"lineNumber":26,"author":{"gitId":"-"},"content":" *ngFor\u003d\"let sessionRepo of this.phaseService.sessionData.sessionRepo\""},{"lineNumber":27,"author":{"gitId":"-"},"content":" (click)\u003d\"this.routeToSelectedPhase(sessionRepo.phase)\""},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":29,"author":{"gitId":"-"},"content":" \u003cspan\u003e"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \u003cmat-icon [ngStyle]\u003d\"{ color: \u0027green\u0027, visibility: this.phaseService.currentPhase \u003d\u003d\u003d sessionRepo.phase ? \u0027visible\u0027 : \u0027hidden\u0027 }\""},{"lineNumber":31,"author":{"gitId":"-"},"content":" \u003edone\u003c/mat-icon"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":33,"author":{"gitId":"-"},"content":" {{ this.getPhaseDescription(sessionRepo.phase) }}"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":36,"author":{"gitId":"-"},"content":" \u003c/mat-menu\u003e"},{"lineNumber":37,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"-"},"content":" \u003c!-- everything else --\u003e"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" \u003cspan style\u003d\"flex: 1 1 auto\"\u003e\u003c/span\u003e"},{"lineNumber":42,"author":{"gitId":"-"},"content":""},{"lineNumber":43,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"auth.isAuthenticated() \u0026\u0026 phaseService.isRepoSet()\"\u003e"},{"lineNumber":44,"author":{"gitId":"-"},"content":" \u003cspan id\u003d\"phase-descriptor\" style\u003d\"margin-left: 10px\"\u003e"},{"lineNumber":45,"author":{"gitId":"-"},"content":" {{ this.currentRepo || \u0027No Repository Set\u0027 }}"},{"lineNumber":46,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":47,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":48,"author":{"gitId":"-"},"content":" mat-button"},{"lineNumber":49,"author":{"gitId":"-"},"content":" matTooltip\u003d\"{{ phaseService.isRepoSet() ? \u0027Change Repository\u0027 : \u0027Select Repository\u0027 }}\""},{"lineNumber":50,"author":{"gitId":"-"},"content":" (click)\u003d\"this.openChangeRepoDialog()\""},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":52,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003eedit\u003c/mat-icon\u003e"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003cspan style\u003d\"flex: 1 1 auto\"\u003e\u003c/span\u003e"},{"lineNumber":57,"author":{"gitId":"-"},"content":""},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003cbutton mat-button matTooltip\u003d\"Download WATcher Log\" (click)\u003d\"this.exportLogFile()\"\u003e"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003ereceipt\u003c/mat-icon\u003e"},{"lineNumber":60,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":61,"author":{"gitId":"-"},"content":" \u003cbutton mat-button matTooltip\u003d\"Give feedback about WATcher\" (click)\u003d\"openIssueTracker()\"\u003e"},{"lineNumber":62,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003email\u003c/mat-icon\u003e"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":64,"author":{"gitId":"-"},"content":""},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":66,"author":{"gitId":"-"},"content":" *ngIf\u003d\"auth.isAuthenticated() \u0026\u0026 phaseService.isRepoSet() \u0026\u0026 isOpenUrlButtonShown()\""},{"lineNumber":67,"author":{"gitId":"-"},"content":" mat-button"},{"lineNumber":68,"author":{"gitId":"-"},"content":" matTooltip\u003d\"View current page on GitHub\""},{"lineNumber":69,"author":{"gitId":"-"},"content":" (click)\u003d\"viewBrowser()\""},{"lineNumber":70,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":71,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003eopen_in_new\u003c/mat-icon\u003e"},{"lineNumber":72,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":73,"author":{"gitId":"-"},"content":""},{"lineNumber":74,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"sync-spinner\" *ngIf\u003d\"auth.isAuthenticated() \u0026\u0026 (this.isLoading$ | async); else notLoading\"\u003e"},{"lineNumber":75,"author":{"gitId":"-"},"content":" \u003cmat-spinner class\u003d\"white-spinner\" [diameter]\u003d\"20\"\u003e\u003c/mat-spinner\u003e"},{"lineNumber":76,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":77,"author":{"gitId":"-"},"content":""},{"lineNumber":78,"author":{"gitId":"-"},"content":" \u003cng-template #notLoading\u003e"},{"lineNumber":79,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":80,"author":{"gitId":"-"},"content":" *ngIf\u003d\"auth.isAuthenticated() \u0026\u0026 phaseService.isRepoSet() \u0026\u0026 isReloadButtonShown() \u0026\u0026 !this.isReloadButtonDisabled\""},{"lineNumber":81,"author":{"gitId":"-"},"content":" mat-button"},{"lineNumber":82,"author":{"gitId":"-"},"content":" matTooltip\u003d\"Synchronize with Github data\""},{"lineNumber":83,"author":{"gitId":"-"},"content":" (click)\u003d\"reload()\""},{"lineNumber":84,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":85,"author":{"gitId":"-"},"content":" Sync"},{"lineNumber":86,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003erefresh\u003c/mat-icon\u003e"},{"lineNumber":87,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":88,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"sync-spinner\" *ngIf\u003d\"auth.isAuthenticated() \u0026\u0026 isReloadButtonShown() \u0026\u0026 this.isReloadButtonDisabled\"\u003e"},{"lineNumber":89,"author":{"gitId":"-"},"content":" \u003cspan style\u003d\"font-size: 14px; margin-right: 7px\"\u003eSync\u003c/span\u003e"},{"lineNumber":90,"author":{"gitId":"-"},"content":" \u003cmat-spinner class\u003d\"white-spinner\" [diameter]\u003d\"20\"\u003e\u003c/mat-spinner\u003e"},{"lineNumber":91,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":92,"author":{"gitId":"-"},"content":" \u003c/ng-template\u003e"},{"lineNumber":93,"author":{"gitId":"-"},"content":""},{"lineNumber":94,"author":{"gitId":"-"},"content":" \u003cbutton *ngIf\u003d\"auth.isAuthenticated()\" mat-button matTooltip\u003d\"Log out\" (click)\u003d\"openLogOutDialog(); $event.stopPropagation()\"\u003e"},{"lineNumber":95,"author":{"gitId":"-"},"content":" ({{ userService.currentUser.loginId }})"},{"lineNumber":96,"author":{"gitId":"-"},"content":" \u003cmat-icon style\u003d\"margin-left: 2px\"\u003eexit_to_app\u003c/mat-icon\u003e"},{"lineNumber":97,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003c/mat-toolbar\u003e"}],"authorContributionMap":{"MadLamprey":4,"-":94}},{"path":"tests/app/auth/login/login.component.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { ComponentFixture, TestBed, waitForAsync } from \u0027@angular/core/testing\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { LoginComponent } from \u0027../../../../src/app/auth/login/login.component\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { AuthService, AuthState } from \u0027../../../../src/app/core/services/auth.service\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { ErrorHandlingService } from \u0027../../../../src/app/core/services/error-handling.service\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027../../../../src/app/core/services/logging.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"describe(\u0027LoginComponent\u0027, () \u003d\u003e {"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" let authServiceSpy: jasmine.SpyObj\u003cAuthService\u003e;"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" let errorHandlingServiceSpy: jasmine.SpyObj\u003cErrorHandlingService\u003e;"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" let loggingServiceSpy: jasmine.SpyObj\u003cLoggingService\u003e;"},{"lineNumber":11,"author":{"gitId":"-"},"content":" let component: LoginComponent;"},{"lineNumber":12,"author":{"gitId":"-"},"content":" let fixture: ComponentFixture\u003cLoginComponent\u003e;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":" beforeEach("},{"lineNumber":15,"author":{"gitId":"-"},"content":" waitForAsync(() \u003d\u003e {"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" authServiceSpy \u003d jasmine.createSpyObj\u003cAuthService\u003e(\u0027AuthService\u0027, [\u0027startOAuthProcess\u0027, \u0027changeAuthState\u0027]);"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" loggingServiceSpy \u003d jasmine.createSpyObj\u003cLoggingService\u003e(\u0027LoggingService\u0027, [\u0027info\u0027]);"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" errorHandlingServiceSpy \u003d jasmine.createSpyObj\u003cErrorHandlingService\u003e(\u0027ErrorHandlingService\u0027, [\u0027handleError\u0027]);"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":" TestBed.configureTestingModule({"},{"lineNumber":21,"author":{"gitId":"-"},"content":" providers: ["},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" { provide: AuthService, useValue: authServiceSpy },"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" { provide: LoggingService, useValue: loggingServiceSpy },"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" { provide: ErrorHandlingService, useValue: errorHandlingServiceSpy }"},{"lineNumber":25,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":26,"author":{"gitId":"-"},"content":" declarations: [LoginComponent]"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }).compileComponents();"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" fixture \u003d TestBed.createComponent(LoginComponent);"},{"lineNumber":30,"author":{"gitId":"-"},"content":" component \u003d fixture.componentInstance;"},{"lineNumber":31,"author":{"gitId":"-"},"content":" fixture.detectChanges();"},{"lineNumber":32,"author":{"gitId":"-"},"content":" })"},{"lineNumber":33,"author":{"gitId":"-"},"content":" );"},{"lineNumber":34,"author":{"gitId":"-"},"content":""},{"lineNumber":35,"author":{"gitId":"-"},"content":" it(\u0027should create\u0027, () \u003d\u003e {"},{"lineNumber":36,"author":{"gitId":"-"},"content":" expect(component).toBeTruthy();"},{"lineNumber":37,"author":{"gitId":"-"},"content":" });"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" it(\u0027startPublicOnlyLoginProcess should call startLoginProcess with false\u0027, () \u003d\u003e {"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" spyOn(component, \u0027startLoginProcess\u0027);"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"NereusWB922"},"content":" component.startPublicOnlyLoginProcess();"},{"lineNumber":43,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" expect(component.startLoginProcess).toHaveBeenCalledWith(false);"},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" it(\u0027startIncludePrivateLoginProcess should call startLoginProcess with true\u0027, () \u003d\u003e {"},{"lineNumber":48,"author":{"gitId":"NereusWB922"},"content":" spyOn(component, \u0027startLoginProcess\u0027);"},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":" component.startIncludePrivateLoginProcess();"},{"lineNumber":51,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":52,"author":{"gitId":"NereusWB922"},"content":" expect(component.startLoginProcess).toHaveBeenCalledWith(true);"},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":54,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":55,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should call authService.startOAuthProcess on startLoginProcess\u0027, () \u003d\u003e {"},{"lineNumber":56,"author":{"gitId":"NereusWB922"},"content":" const hasPrivateConsent \u003d false;"},{"lineNumber":57,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" component.startLoginProcess(hasPrivateConsent);"},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":" expect(authServiceSpy.startOAuthProcess).toHaveBeenCalledWith(hasPrivateConsent);"},{"lineNumber":61,"author":{"gitId":"NereusWB922"},"content":" expect(loggingServiceSpy.info).toHaveBeenCalledWith(\u0027LoginComponent: Beginning login process\u0027);"},{"lineNumber":62,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should call error handling methods when error is thrown\u0027, () \u003d\u003e {"},{"lineNumber":65,"author":{"gitId":"NereusWB922"},"content":" const hasPrivateConsent \u003d false;"},{"lineNumber":66,"author":{"gitId":"NereusWB922"},"content":" const errorMessage \u003d \u0027Error!\u0027;"},{"lineNumber":67,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":68,"author":{"gitId":"NereusWB922"},"content":" const error: Error \u003d new Error(errorMessage);"},{"lineNumber":69,"author":{"gitId":"NereusWB922"},"content":" authServiceSpy.startOAuthProcess.and.throwError(error);"},{"lineNumber":70,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":71,"author":{"gitId":"NereusWB922"},"content":" component.startLoginProcess(hasPrivateConsent);"},{"lineNumber":72,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":73,"author":{"gitId":"NereusWB922"},"content":" expect(authServiceSpy.changeAuthState).toHaveBeenCalledWith(AuthState.NotAuthenticated);"},{"lineNumber":74,"author":{"gitId":"NereusWB922"},"content":" expect(errorHandlingServiceSpy.handleError).toHaveBeenCalledWith(error);"},{"lineNumber":75,"author":{"gitId":"NereusWB922"},"content":" expect(loggingServiceSpy.info.calls.allArgs()).toEqual(["},{"lineNumber":76,"author":{"gitId":"NereusWB922"},"content":" [\u0027LoginComponent: Beginning login process\u0027],"},{"lineNumber":77,"author":{"gitId":"NereusWB922"},"content":" [`LoginComponent: Login process failed with an error: ${error}`]"},{"lineNumber":78,"author":{"gitId":"NereusWB922"},"content":" ]);"},{"lineNumber":79,"author":{"gitId":"-"},"content":" });"},{"lineNumber":80,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"NereusWB922":49,"-":31}},{"path":"tests/app/core/models/session-model.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { of } from \u0027rxjs\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { Phase } from \u0027../../../../src/app/core/models/phase.model\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import {"},{"lineNumber":4,"author":{"gitId":"-"},"content":" assertSessionDataIntegrity,"},{"lineNumber":5,"author":{"gitId":"-"},"content":" NO_VALID_OPEN_PHASES,"},{"lineNumber":6,"author":{"gitId":"-"},"content":" OPENED_PHASE_REPO_UNDEFINED,"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" SESSION_DATA_MISSING_FIELDS,"},{"lineNumber":8,"author":{"gitId":"-"},"content":" SESSION_DATA_UNAVAILABLE"},{"lineNumber":9,"author":{"gitId":"-"},"content":"} from \u0027../../../../src/app/core/models/session.model\u0027;"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"import { VALID_SESSION_DATA, WATCHER_REPO } from \u0027../../../constants/session.constants\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"describe(\u0027Session Model\u0027, () \u003d\u003e {"},{"lineNumber":13,"author":{"gitId":"-"},"content":" describe(\u0027assertSessionDataIntegrity()\u0027, () \u003d\u003e {"},{"lineNumber":14,"author":{"gitId":"-"},"content":" it(\u0027should throw error on unavailable session\u0027, () \u003d\u003e {"},{"lineNumber":15,"author":{"gitId":"-"},"content":" of(undefined)"},{"lineNumber":16,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":17,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":18,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":19,"author":{"gitId":"-"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(SESSION_DATA_UNAVAILABLE))"},{"lineNumber":20,"author":{"gitId":"-"},"content":" });"},{"lineNumber":21,"author":{"gitId":"-"},"content":" });"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should throw error on session data with invalid session\u0027, () \u003d\u003e {"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: null })"},{"lineNumber":25,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":26,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":27,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(SESSION_DATA_MISSING_FIELDS))"},{"lineNumber":29,"author":{"gitId":"-"},"content":" });"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: [] })"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" .subscribe({"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(SESSION_DATA_MISSING_FIELDS))"},{"lineNumber":35,"author":{"gitId":"-"},"content":" });"},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: \u0027repo\u0027 })"},{"lineNumber":37,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":38,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":39,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(SESSION_DATA_MISSING_FIELDS))"},{"lineNumber":41,"author":{"gitId":"-"},"content":" });"},{"lineNumber":42,"author":{"gitId":"-"},"content":" });"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should throw error on session with invalid phases\u0027, () \u003d\u003e {"},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: [{ phase: \u0027invalidPhase\u0027 as Phase, repos: [WATCHER_REPO] }] })"},{"lineNumber":46,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":47,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":48,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":49,"author":{"gitId":"-"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(NO_VALID_OPEN_PHASES))"},{"lineNumber":50,"author":{"gitId":"-"},"content":" });"},{"lineNumber":51,"author":{"gitId":"-"},"content":" });"},{"lineNumber":52,"author":{"gitId":"-"},"content":""},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should throw error on session data with invalid repo\u0027, () \u003d\u003e {"},{"lineNumber":54,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: [{ phase: Phase.issuesViewer, repo: undefined }] })"},{"lineNumber":55,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":56,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":57,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":58,"author":{"gitId":"-"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(OPENED_PHASE_REPO_UNDEFINED))"},{"lineNumber":59,"author":{"gitId":"-"},"content":" });"},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: [{ phase: Phase.issuesViewer, repo: null }] })"},{"lineNumber":61,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":62,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":63,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":64,"author":{"gitId":"-"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(OPENED_PHASE_REPO_UNDEFINED))"},{"lineNumber":65,"author":{"gitId":"-"},"content":" });"},{"lineNumber":66,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: [{ phase: Phase.issuesViewer, repo: \u0027\u0027 }] })"},{"lineNumber":67,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":68,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":69,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":70,"author":{"gitId":"-"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(OPENED_PHASE_REPO_UNDEFINED))"},{"lineNumber":71,"author":{"gitId":"-"},"content":" });"},{"lineNumber":72,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: [{ phase: Phase.issuesViewer, repo: [] }] })"},{"lineNumber":73,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":74,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":75,"author":{"gitId":"NereusWB922"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":76,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(OPENED_PHASE_REPO_UNDEFINED))"},{"lineNumber":77,"author":{"gitId":"-"},"content":" });"},{"lineNumber":78,"author":{"gitId":"-"},"content":" });"},{"lineNumber":79,"author":{"gitId":"-"},"content":""},{"lineNumber":80,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should pass for valid session data\u0027, () \u003d\u003e {"},{"lineNumber":81,"author":{"gitId":"NereusWB922"},"content":" of(VALID_SESSION_DATA)"},{"lineNumber":82,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":83,"author":{"gitId":"NereusWB922"},"content":" .subscribe((el) \u003d\u003e expect(el).toEqual(VALID_SESSION_DATA));"},{"lineNumber":84,"author":{"gitId":"-"},"content":" });"},{"lineNumber":85,"author":{"gitId":"-"},"content":" });"},{"lineNumber":86,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"NereusWB922":25,"-":61}},{"path":"tests/app/shared/issue-tables/issue-paginator.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { MatPaginator } from \u0027@angular/material/paginator\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../../../src/app/core/models/issue.model\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { paginateData } from \u0027../../../../src/app/shared/issue-tables/issue-paginator\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import {"},{"lineNumber":5,"author":{"gitId":"-"},"content":" ISSUE_WITH_ASSIGNEES,"},{"lineNumber":6,"author":{"gitId":"-"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION,"},{"lineNumber":7,"author":{"gitId":"-"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION_HIGH_SEVERITY,"},{"lineNumber":8,"author":{"gitId":"-"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION_LOW_SEVERITY"},{"lineNumber":9,"author":{"gitId":"-"},"content":"} from \u0027../../../constants/githubissue.constants\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"describe(\u0027issue-paginator\u0027, () \u003d\u003e {"},{"lineNumber":12,"author":{"gitId":"-"},"content":" describe(\u0027paginateData()\u0027, () \u003d\u003e {"},{"lineNumber":13,"author":{"gitId":"-"},"content":" let dataSet_7: Issue[];"},{"lineNumber":14,"author":{"gitId":"-"},"content":" let paginator: MatPaginator;"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" const mediumSeverityIssueWithResponse: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION);"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" const mediumSeverityIssueWithAssigneee: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_ASSIGNEES);"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" const lowSeverityFeatureFlawIssue: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION_LOW_SEVERITY);"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" const highSeverityDocumentationBugIssue: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION_HIGH_SEVERITY);"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":" beforeEach(() \u003d\u003e {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" dataSet_7 \u003d ["},{"lineNumber":22,"author":{"gitId":"-"},"content":" mediumSeverityIssueWithResponse,"},{"lineNumber":23,"author":{"gitId":"-"},"content":" mediumSeverityIssueWithAssigneee,"},{"lineNumber":24,"author":{"gitId":"-"},"content":" lowSeverityFeatureFlawIssue,"},{"lineNumber":25,"author":{"gitId":"-"},"content":" mediumSeverityIssueWithResponse,"},{"lineNumber":26,"author":{"gitId":"-"},"content":" mediumSeverityIssueWithAssigneee,"},{"lineNumber":27,"author":{"gitId":"-"},"content":" lowSeverityFeatureFlawIssue,"},{"lineNumber":28,"author":{"gitId":"-"},"content":" highSeverityDocumentationBugIssue"},{"lineNumber":29,"author":{"gitId":"-"},"content":" ];"},{"lineNumber":30,"author":{"gitId":"-"},"content":" paginator \u003d { pageSize: 3 } as MatPaginator;"},{"lineNumber":31,"author":{"gitId":"-"},"content":" });"},{"lineNumber":32,"author":{"gitId":"-"},"content":""},{"lineNumber":33,"author":{"gitId":"-"},"content":" it(\u0027should set the length of paginator to the length of data\u0027, () \u003d\u003e {"},{"lineNumber":34,"author":{"gitId":"-"},"content":" paginateData(paginator, dataSet_7);"},{"lineNumber":35,"author":{"gitId":"-"},"content":" expect(paginator.length).toEqual(7);"},{"lineNumber":36,"author":{"gitId":"-"},"content":" });"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":" it(\u0027should return list of issues according to page index\u0027, () \u003d\u003e {"},{"lineNumber":39,"author":{"gitId":"-"},"content":" paginator.pageIndex \u003d 0;"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" // Returns issues index 0 to 2"},{"lineNumber":42,"author":{"gitId":"-"},"content":" const returnedList \u003d paginateData(paginator, dataSet_7);"},{"lineNumber":43,"author":{"gitId":"-"},"content":" expect(returnedList).toEqual([mediumSeverityIssueWithResponse, mediumSeverityIssueWithAssigneee, lowSeverityFeatureFlawIssue]);"},{"lineNumber":44,"author":{"gitId":"-"},"content":" });"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":" it(\u0027should return list of issues in the previous page if there are no issues on the current page\u0027, () \u003d\u003e {"},{"lineNumber":47,"author":{"gitId":"-"},"content":" paginator.pageIndex \u003d 3;"},{"lineNumber":48,"author":{"gitId":"-"},"content":""},{"lineNumber":49,"author":{"gitId":"-"},"content":" // Returns issues index 6 on page 2"},{"lineNumber":50,"author":{"gitId":"-"},"content":" const returnedList \u003d paginateData(paginator, dataSet_7);"},{"lineNumber":51,"author":{"gitId":"-"},"content":" expect(returnedList).toEqual([highSeverityDocumentationBugIssue]);"},{"lineNumber":52,"author":{"gitId":"-"},"content":" });"},{"lineNumber":53,"author":{"gitId":"-"},"content":" });"},{"lineNumber":54,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"NereusWB922":4,"-":50}},{"path":"tests/app/shared/issue-tables/issue-sorter.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { MatSort } from \u0027@angular/material/sort\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../../../src/app/core/models/issue.model\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { getSortedData } from \u0027../../../../src/app/shared/issue-tables/issue-sorter\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"import {"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" ISSUE_UPDATED_EARLIER,"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" ISSUE_UPDATED_LATER,"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" ISSUE_WITH_ASSIGNEES,"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":"} from \u0027../../../constants/githubissue.constants\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"describe(\u0027issuer-sorter\u0027, () \u003d\u003e {"},{"lineNumber":12,"author":{"gitId":"-"},"content":" describe(\u0027getSortedData()\u0027, () \u003d\u003e {"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" const dummyIssue: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION);"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" const otherDummyIssue: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_ASSIGNEES);"},{"lineNumber":15,"author":{"gitId":"-"},"content":" const issuesList: Issue[] \u003d [dummyIssue, otherDummyIssue];"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" const issueUpdatedEarlier: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_UPDATED_EARLIER);"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" const issueUpdatedLater: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_UPDATED_LATER);"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" const issuesWithDifferentUpdatedDate: Issue[] \u003d [issueUpdatedEarlier, issueUpdatedLater];"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":" const matSort: MatSort \u003d new MatSort();"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should return the same data if sort.active is not set\u0027, () \u003d\u003e {"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" const sortedData \u003d getSortedData(matSort, issuesList);"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" expect(sortedData).toEqual(issuesList);"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":28,"author":{"gitId":"-"},"content":" it(\u0027sorts issues based on their assignees correctly\u0027, () \u003d\u003e {"},{"lineNumber":29,"author":{"gitId":"-"},"content":" matSort.active \u003d \u0027assignees\u0027;"},{"lineNumber":30,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027asc\u0027;"},{"lineNumber":31,"author":{"gitId":"-"},"content":" const sortedIssuesByAssigneesAsc \u003d getSortedData(matSort, issuesList);"},{"lineNumber":32,"author":{"gitId":"-"},"content":" assertOrder(sortedIssuesByAssigneesAsc, dummyIssue, otherDummyIssue);"},{"lineNumber":33,"author":{"gitId":"-"},"content":""},{"lineNumber":34,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027desc\u0027;"},{"lineNumber":35,"author":{"gitId":"-"},"content":" const sortedIssuesByAssigneesDesc \u003d getSortedData(matSort, issuesList);"},{"lineNumber":36,"author":{"gitId":"-"},"content":" assertOrder(sortedIssuesByAssigneesDesc, otherDummyIssue, dummyIssue);"},{"lineNumber":37,"author":{"gitId":"-"},"content":" });"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"-"},"content":" it(\u0027sorts issues based on their string fields correctly\u0027, () \u003d\u003e {"},{"lineNumber":40,"author":{"gitId":"-"},"content":" matSort.active \u003d \u0027title\u0027;"},{"lineNumber":41,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027asc\u0027;"},{"lineNumber":42,"author":{"gitId":"-"},"content":" const sortedIssuesByTitleAsc \u003d getSortedData(matSort, issuesList);"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertOrder(sortedIssuesByTitleAsc, dummyIssue, otherDummyIssue);"},{"lineNumber":44,"author":{"gitId":"-"},"content":""},{"lineNumber":45,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027desc\u0027;"},{"lineNumber":46,"author":{"gitId":"-"},"content":" const sortedIssuesByTitleDesc \u003d getSortedData(matSort, issuesList);"},{"lineNumber":47,"author":{"gitId":"-"},"content":" assertOrder(sortedIssuesByTitleDesc, otherDummyIssue, dummyIssue);"},{"lineNumber":48,"author":{"gitId":"-"},"content":" });"},{"lineNumber":49,"author":{"gitId":"-"},"content":""},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":" it(\u0027sorts issues based on their id fields correctly\u0027, () \u003d\u003e {"},{"lineNumber":51,"author":{"gitId":"-"},"content":" matSort.active \u003d \u0027id\u0027;"},{"lineNumber":52,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027asc\u0027;"},{"lineNumber":53,"author":{"gitId":"-"},"content":" const sortedIssuedByIdAsc \u003d getSortedData(matSort, issuesList);"},{"lineNumber":54,"author":{"gitId":"-"},"content":" assertOrder(sortedIssuedByIdAsc, otherDummyIssue, dummyIssue);"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027desc\u0027;"},{"lineNumber":57,"author":{"gitId":"-"},"content":" const sortedIssuedByIdDesc \u003d getSortedData(matSort, issuesList);"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertOrder(sortedIssuedByIdDesc, dummyIssue, otherDummyIssue);"},{"lineNumber":59,"author":{"gitId":"-"},"content":" });"},{"lineNumber":60,"author":{"gitId":"-"},"content":""},{"lineNumber":61,"author":{"gitId":"NereusWB922"},"content":" it(\u0027sorts issues based on their updated date fields correctly\u0027, () \u003d\u003e {"},{"lineNumber":62,"author":{"gitId":"NereusWB922"},"content":" matSort.active \u003d \u0027date\u0027;"},{"lineNumber":63,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027asc\u0027;"},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":65,"author":{"gitId":"NereusWB922"},"content":" const sortedIssuedByDateAsc \u003d getSortedData(matSort, issuesWithDifferentUpdatedDate);"},{"lineNumber":66,"author":{"gitId":"NereusWB922"},"content":" assertOrder(sortedIssuedByDateAsc, issueUpdatedEarlier, issueUpdatedLater);"},{"lineNumber":67,"author":{"gitId":"-"},"content":""},{"lineNumber":68,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027desc\u0027;"},{"lineNumber":69,"author":{"gitId":"NereusWB922"},"content":" const sortedIssuedByDateDesc \u003d getSortedData(matSort, issuesWithDifferentUpdatedDate);"},{"lineNumber":70,"author":{"gitId":"NereusWB922"},"content":" assertOrder(sortedIssuedByDateDesc, issueUpdatedLater, issueUpdatedEarlier);"},{"lineNumber":71,"author":{"gitId":"-"},"content":" });"},{"lineNumber":72,"author":{"gitId":"-"},"content":" });"},{"lineNumber":73,"author":{"gitId":"-"},"content":"});"},{"lineNumber":74,"author":{"gitId":"-"},"content":""},{"lineNumber":75,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * This helper method helps to check if the sorted issues are in their"},{"lineNumber":77,"author":{"gitId":"-"},"content":" * correct order based on the variable arguments provided."},{"lineNumber":78,"author":{"gitId":"-"},"content":" */"},{"lineNumber":79,"author":{"gitId":"-"},"content":"function assertOrder(sortedIssues: Issue[], ...expectedSortedIssues: Issue[]) {"},{"lineNumber":80,"author":{"gitId":"-"},"content":" for (let i \u003d 0; i \u003c sortedIssues.length; i++) {"},{"lineNumber":81,"author":{"gitId":"-"},"content":" expect(sortedIssues[i].id).toBe(expectedSortedIssues[i].id);"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }"},{"lineNumber":83,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"NereusWB922":25,"-":58}},{"path":"tests/app/shared/issue-tables/search-filter.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../../../src/app/core/models/issue.model\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027../../../../src/app/core/services/issue.service\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { TABLE_COLUMNS } from \u0027../../../../src/app/shared/issue-tables/issue-tables-columns\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { applySearchFilter } from \u0027../../../../src/app/shared/issue-tables/search-filter\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { USER_ANUBHAV } from \u0027../../../constants/data.constants\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import {"},{"lineNumber":7,"author":{"gitId":"-"},"content":" ISSUE_WITH_ASSIGNEES,"},{"lineNumber":8,"author":{"gitId":"-"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION,"},{"lineNumber":9,"author":{"gitId":"-"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION_HIGH_SEVERITY,"},{"lineNumber":10,"author":{"gitId":"-"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION_LOW_SEVERITY"},{"lineNumber":11,"author":{"gitId":"-"},"content":"} from \u0027../../../constants/githubissue.constants\u0027;"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":"import { GITHUB_LABEL_FEATURE_FLAW } from \u0027../../../constants/githublabel.constants\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"describe(\u0027search-filter\u0027, () \u003d\u003e {"},{"lineNumber":15,"author":{"gitId":"-"},"content":" describe(\u0027applySearchFilter()\u0027, () \u003d\u003e {"},{"lineNumber":16,"author":{"gitId":"-"},"content":" let searchKey: string;"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" const mediumSeverityIssueWithResponse: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION);"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" const mediumSeverityIssueWithAssigneee: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_ASSIGNEES);"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" const lowSeverityFeatureFlawIssue: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION_LOW_SEVERITY);"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" const highSeverityDocumentationBugIssue: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION_HIGH_SEVERITY);"},{"lineNumber":21,"author":{"gitId":"-"},"content":""},{"lineNumber":22,"author":{"gitId":"-"},"content":" const issuesList: Issue[] \u003d ["},{"lineNumber":23,"author":{"gitId":"-"},"content":" mediumSeverityIssueWithResponse,"},{"lineNumber":24,"author":{"gitId":"-"},"content":" mediumSeverityIssueWithAssigneee,"},{"lineNumber":25,"author":{"gitId":"-"},"content":" lowSeverityFeatureFlawIssue,"},{"lineNumber":26,"author":{"gitId":"-"},"content":" highSeverityDocumentationBugIssue"},{"lineNumber":27,"author":{"gitId":"-"},"content":" ];"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" const displayedColumns: string[] \u003d [TABLE_COLUMNS.ID, TABLE_COLUMNS.TITLE, TABLE_COLUMNS.ASSIGNEE, TABLE_COLUMNS.LABEL];"},{"lineNumber":29,"author":{"gitId":"-"},"content":" const issueService: IssueService \u003d new IssueService(null, null, null);"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":" it(\u0027can filter for issues which are assigned to a specific user\u0027, () \u003d\u003e {"},{"lineNumber":32,"author":{"gitId":"-"},"content":" searchKey \u003d USER_ANUBHAV.loginId;"},{"lineNumber":33,"author":{"gitId":"-"},"content":" expect(applySearchFilter(searchKey, displayedColumns, issueService, issuesList)).toEqual([mediumSeverityIssueWithAssigneee]);"},{"lineNumber":34,"author":{"gitId":"-"},"content":" });"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" it(\u0027can filter for issues using label\u0027, () \u003d\u003e {"},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":" searchKey \u003d GITHUB_LABEL_FEATURE_FLAW.name;"},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":" expect(applySearchFilter(searchKey, displayedColumns, issueService, issuesList)).toEqual([lowSeverityFeatureFlawIssue]);"},{"lineNumber":39,"author":{"gitId":"-"},"content":" });"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" it(\u0027can filter for issues that contain the search key in any other column\u0027, () \u003d\u003e {"},{"lineNumber":42,"author":{"gitId":"-"},"content":" // Search by id of issue"},{"lineNumber":43,"author":{"gitId":"-"},"content":" searchKey \u003d mediumSeverityIssueWithResponse.id.toString();"},{"lineNumber":44,"author":{"gitId":"-"},"content":" expect(applySearchFilter(searchKey, displayedColumns, issueService, issuesList)).toEqual([mediumSeverityIssueWithResponse]);"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":" // Search by title of issue"},{"lineNumber":47,"author":{"gitId":"-"},"content":" searchKey \u003d mediumSeverityIssueWithAssigneee.title;"},{"lineNumber":48,"author":{"gitId":"-"},"content":" expect(applySearchFilter(searchKey, displayedColumns, issueService, issuesList)).toEqual([mediumSeverityIssueWithAssigneee]);"},{"lineNumber":49,"author":{"gitId":"-"},"content":" });"},{"lineNumber":50,"author":{"gitId":"-"},"content":" });"},{"lineNumber":51,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"NereusWB922":9,"-":42}},{"path":"tests/constants/githubissue.constants.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { IssueState, IssueStateReason } from \u0027../../graphql/graphql-types\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { GithubIssue } from \u0027../../src/app/core/models/github/github-issue.model\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { GithubLabel } from \u0027../../src/app/core/models/github/github-label.model\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { USER_ANUBHAV, USER_SHUMING } from \u0027./data.constants\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { EMPTY_TEAM_RESPONSE, PENDING_TUTOR_MODERATION } from \u0027./githubcomment.constants\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import {"},{"lineNumber":7,"author":{"gitId":"-"},"content":" GITHUB_LABEL_DOCUMENTATION_BUG,"},{"lineNumber":8,"author":{"gitId":"-"},"content":" GITHUB_LABEL_FEATURE_FLAW,"},{"lineNumber":9,"author":{"gitId":"-"},"content":" GITHUB_LABEL_FUNCTIONALITY_BUG,"},{"lineNumber":10,"author":{"gitId":"-"},"content":" GITHUB_LABEL_HIGH_SEVERITY,"},{"lineNumber":11,"author":{"gitId":"-"},"content":" GITHUB_LABEL_LOW_SEVERITY,"},{"lineNumber":12,"author":{"gitId":"-"},"content":" GITHUB_LABEL_MEDIUM_SEVERITY,"},{"lineNumber":13,"author":{"gitId":"-"},"content":" GITHUB_LABEL_TEAM_LABEL,"},{"lineNumber":14,"author":{"gitId":"-"},"content":" GITHUB_LABEL_TUTORIAL_LABEL"},{"lineNumber":15,"author":{"gitId":"-"},"content":"} from \u0027./githublabel.constants\u0027;"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":"const randomId: () \u003d\u003e string \u003d () \u003d\u003e {"},{"lineNumber":18,"author":{"gitId":"-"},"content":" return Math.floor(Math.random() * 1000000000).toString();"},{"lineNumber":19,"author":{"gitId":"-"},"content":"};"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":"const randomIssueNumber: () \u003d\u003e number \u003d () \u003d\u003e {"},{"lineNumber":22,"author":{"gitId":"-"},"content":" return Math.round(Math.random() * 1000);"},{"lineNumber":23,"author":{"gitId":"-"},"content":"};"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":"const randomISODate: (startDate?: Date, endDate?: Date) \u003d\u003e string \u003d ("},{"lineNumber":26,"author":{"gitId":"-"},"content":" startDate: Date \u003d new Date(2020, 1, 1),"},{"lineNumber":27,"author":{"gitId":"-"},"content":" endDate: Date \u003d new Date()"},{"lineNumber":28,"author":{"gitId":"-"},"content":") \u003d\u003e {"},{"lineNumber":29,"author":{"gitId":"-"},"content":" return new Date(startDate.getTime() + Math.random() * (startDate.getTime() - endDate.getTime())).toISOString();"},{"lineNumber":30,"author":{"gitId":"-"},"content":"};"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":"const USER_ANUBHAV_DETAILS \u003d {"},{"lineNumber":33,"author":{"gitId":"-"},"content":" login: USER_ANUBHAV.loginId,"},{"lineNumber":34,"author":{"gitId":"-"},"content":" avatar_url: \u0027https://avatars1.githubusercontent.com/u/35621759?v\u003d4\u0027,"},{"lineNumber":35,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/users/anubh-v\u0027"},{"lineNumber":36,"author":{"gitId":"-"},"content":"};"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":"const USER_ANUBHAV_ASSIGNEE_DETAILS \u003d {"},{"lineNumber":39,"author":{"gitId":"-"},"content":" login: USER_ANUBHAV.loginId,"},{"lineNumber":40,"author":{"gitId":"-"},"content":" id: 35621759,"},{"lineNumber":41,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/users/anubh-v\u0027"},{"lineNumber":42,"author":{"gitId":"-"},"content":"};"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":"const USER_SHUMING_DETAILS \u003d {"},{"lineNumber":45,"author":{"gitId":"-"},"content":" login: USER_SHUMING.loginId,"},{"lineNumber":46,"author":{"gitId":"-"},"content":" avatar_url: \u0027https://avatars0.githubusercontent.com/u/43642522?v\u003d4\u0027,"},{"lineNumber":47,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/users/geshuming\u0027"},{"lineNumber":48,"author":{"gitId":"-"},"content":"};"},{"lineNumber":49,"author":{"gitId":"-"},"content":""},{"lineNumber":50,"author":{"gitId":"-"},"content":"const USER_SHUMING_ASSIGNEE_DETAILS \u003d {"},{"lineNumber":51,"author":{"gitId":"-"},"content":" login: \u0027geshuming\u0027,"},{"lineNumber":52,"author":{"gitId":"-"},"content":" id: 43642522,"},{"lineNumber":53,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/users/geshuming\u0027"},{"lineNumber":54,"author":{"gitId":"-"},"content":"};"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":"const ISSUE_BODY \u003d"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u0027# Issue Description\\n{original issue description}\\n\u0027 +"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \"# Team\u0027s Response\\n{team\u0027s response}\\n # Disputes\\n\\n\" +"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \"## :question: Issue Type\\n\\n### Team says:\\r\\n{the team\u0027s action that is being disputed}\\r\\n\\r\\n\" +"},{"lineNumber":60,"author":{"gitId":"-"},"content":" \"### Tester says:\\r\\n{tester\u0027s objection}\\n\\n-------------------\\n## :question: Issue Severity\\n\\n\" +"},{"lineNumber":61,"author":{"gitId":"-"},"content":" \"### Team says:\\r\\n{the team\u0027s action that is being disputed}\\r\\n\\r\\n\" +"},{"lineNumber":62,"author":{"gitId":"-"},"content":" \"### Tester says:\\r\\n{tester\u0027s objection}\\n\\n-------------------\\n## :question: Not Related Question\\n\\n\" +"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \"### Team says:\\r\\n{the team\u0027s action that is being disputed}\\r\\n\\r\\n\" +"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \"### Tester says:\\r\\n{tester\u0027s objection}\\n\\n-------------------\\n\\n\";"},{"lineNumber":65,"author":{"gitId":"-"},"content":""},{"lineNumber":66,"author":{"gitId":"-"},"content":"export const ISSUE_WITH_EMPTY_DESCRIPTION \u003d new GithubIssue({"},{"lineNumber":67,"author":{"gitId":"-"},"content":" id: \u0027574085971\u0027,"},{"lineNumber":68,"author":{"gitId":"-"},"content":" number: 92,"},{"lineNumber":69,"author":{"gitId":"-"},"content":" assignees: [],"},{"lineNumber":70,"author":{"gitId":"-"},"content":" comments: [],"},{"lineNumber":71,"author":{"gitId":"-"},"content":" body: \u0027\u0027,"},{"lineNumber":72,"author":{"gitId":"-"},"content":" created_at: \u00272020-03-02T16:19:02Z\u0027,"},{"lineNumber":73,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_FUNCTIONALITY_BUG, GITHUB_LABEL_MEDIUM_SEVERITY],"},{"lineNumber":74,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":75,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":76,"author":{"gitId":"-"},"content":" title: \u0027App starts to lag when given large amount of input\u0027,"},{"lineNumber":77,"author":{"gitId":"-"},"content":" updated_at: \u00272020-03-13T13:37:32Z\u0027,"},{"lineNumber":78,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/92\u0027,"},{"lineNumber":79,"author":{"gitId":"-"},"content":" user: USER_ANUBHAV_DETAILS"},{"lineNumber":80,"author":{"gitId":"-"},"content":"});"},{"lineNumber":81,"author":{"gitId":"-"},"content":""},{"lineNumber":82,"author":{"gitId":"NereusWB922"},"content":"export const ISSUE_UPDATED_EARLIER \u003d new GithubIssue({"},{"lineNumber":83,"author":{"gitId":"NereusWB922"},"content":" id: \u0027000000001\u0027,"},{"lineNumber":84,"author":{"gitId":"NereusWB922"},"content":" number: 1,"},{"lineNumber":85,"author":{"gitId":"NereusWB922"},"content":" assignees: [],"},{"lineNumber":86,"author":{"gitId":"NereusWB922"},"content":" comments: [],"},{"lineNumber":87,"author":{"gitId":"NereusWB922"},"content":" body: \u0027\u0027,"},{"lineNumber":88,"author":{"gitId":"NereusWB922"},"content":" created_at: \u00272020-09-02T16:19:02Z\u0027,"},{"lineNumber":89,"author":{"gitId":"NereusWB922"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_FUNCTIONALITY_BUG, GITHUB_LABEL_MEDIUM_SEVERITY],"},{"lineNumber":90,"author":{"gitId":"NereusWB922"},"content":" state: IssueState.Open,"},{"lineNumber":91,"author":{"gitId":"NereusWB922"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":92,"author":{"gitId":"NereusWB922"},"content":" title: \u0027App starts to lag when given large amount of input\u0027,"},{"lineNumber":93,"author":{"gitId":"NereusWB922"},"content":" updated_at: \u00272020-09-03T13:37:32Z\u0027,"},{"lineNumber":94,"author":{"gitId":"NereusWB922"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/93\u0027,"},{"lineNumber":95,"author":{"gitId":"NereusWB922"},"content":" user: USER_ANUBHAV_DETAILS"},{"lineNumber":96,"author":{"gitId":"NereusWB922"},"content":"});"},{"lineNumber":97,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":98,"author":{"gitId":"NereusWB922"},"content":"export const ISSUE_UPDATED_LATER \u003d new GithubIssue({"},{"lineNumber":99,"author":{"gitId":"NereusWB922"},"content":" id: \u0027000000002\u0027,"},{"lineNumber":100,"author":{"gitId":"NereusWB922"},"content":" number: 2,"},{"lineNumber":101,"author":{"gitId":"NereusWB922"},"content":" assignees: [],"},{"lineNumber":102,"author":{"gitId":"NereusWB922"},"content":" comments: [],"},{"lineNumber":103,"author":{"gitId":"NereusWB922"},"content":" body: \u0027\u0027,"},{"lineNumber":104,"author":{"gitId":"NereusWB922"},"content":" created_at: \u00272020-10-02T16:19:02Z\u0027,"},{"lineNumber":105,"author":{"gitId":"NereusWB922"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_FUNCTIONALITY_BUG, GITHUB_LABEL_MEDIUM_SEVERITY],"},{"lineNumber":106,"author":{"gitId":"NereusWB922"},"content":" state: IssueState.Open,"},{"lineNumber":107,"author":{"gitId":"NereusWB922"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":108,"author":{"gitId":"NereusWB922"},"content":" title: \u0027App starts to lag when given large amount of input\u0027,"},{"lineNumber":109,"author":{"gitId":"NereusWB922"},"content":" updated_at: \u00272020-10-22T13:37:32Z\u0027,"},{"lineNumber":110,"author":{"gitId":"NereusWB922"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/94\u0027,"},{"lineNumber":111,"author":{"gitId":"NereusWB922"},"content":" user: USER_ANUBHAV_DETAILS"},{"lineNumber":112,"author":{"gitId":"NereusWB922"},"content":"});"},{"lineNumber":113,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":114,"author":{"gitId":"-"},"content":"export const ISSUE_WITH_EMPTY_DESCRIPTION_LOW_SEVERITY \u003d new GithubIssue({"},{"lineNumber":115,"author":{"gitId":"-"},"content":" id: \u0027384830567\u0027,"},{"lineNumber":116,"author":{"gitId":"-"},"content":" number: 130,"},{"lineNumber":117,"author":{"gitId":"-"},"content":" assignees: [],"},{"lineNumber":118,"author":{"gitId":"-"},"content":" comments: [],"},{"lineNumber":119,"author":{"gitId":"-"},"content":" body: \u0027\u0027,"},{"lineNumber":120,"author":{"gitId":"-"},"content":" created_at: \u00272020-03-02T16:19:02Z\u0027,"},{"lineNumber":121,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_FEATURE_FLAW, GITHUB_LABEL_LOW_SEVERITY],"},{"lineNumber":122,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":123,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":124,"author":{"gitId":"-"},"content":" title: \u0027App is sometimes slow\u0027,"},{"lineNumber":125,"author":{"gitId":"-"},"content":" updated_at: \u00272020-03-13T13:37:32Z\u0027,"},{"lineNumber":126,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/130\u0027,"},{"lineNumber":127,"author":{"gitId":"-"},"content":" user: USER_ANUBHAV_DETAILS"},{"lineNumber":128,"author":{"gitId":"-"},"content":"});"},{"lineNumber":129,"author":{"gitId":"-"},"content":""},{"lineNumber":130,"author":{"gitId":"-"},"content":"export const ISSUE_WITH_EMPTY_DESCRIPTION_HIGH_SEVERITY \u003d new GithubIssue({"},{"lineNumber":131,"author":{"gitId":"-"},"content":" id: \u0027573957398\u0027,"},{"lineNumber":132,"author":{"gitId":"-"},"content":" number: 32,"},{"lineNumber":133,"author":{"gitId":"-"},"content":" assignees: [],"},{"lineNumber":134,"author":{"gitId":"-"},"content":" comments: [],"},{"lineNumber":135,"author":{"gitId":"-"},"content":" body: \u0027\u0027,"},{"lineNumber":136,"author":{"gitId":"-"},"content":" created_at: \u00272010-03-12T19:12:02Z\u0027,"},{"lineNumber":137,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_DOCUMENTATION_BUG, GITHUB_LABEL_HIGH_SEVERITY],"},{"lineNumber":138,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":139,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":140,"author":{"gitId":"-"},"content":" title: \u0027Too many typos\u0027,"},{"lineNumber":141,"author":{"gitId":"-"},"content":" updated_at: \u00272012-03-12T19:12:02Z\u0027,"},{"lineNumber":142,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/130\u0027,"},{"lineNumber":143,"author":{"gitId":"-"},"content":" user: USER_ANUBHAV_DETAILS"},{"lineNumber":144,"author":{"gitId":"-"},"content":"});"},{"lineNumber":145,"author":{"gitId":"-"},"content":""},{"lineNumber":146,"author":{"gitId":"-"},"content":"export const DUPLICATED_ISSUE_WITH_EMPTY_DESCRIPTION_HIGH_SEVERITY \u003d new GithubIssue({"},{"lineNumber":147,"author":{"gitId":"-"},"content":" id: \u0027573957399\u0027,"},{"lineNumber":148,"author":{"gitId":"-"},"content":" number: 33,"},{"lineNumber":149,"author":{"gitId":"-"},"content":" assignees: [],"},{"lineNumber":150,"author":{"gitId":"-"},"content":" comments: [],"},{"lineNumber":151,"author":{"gitId":"-"},"content":" body: \u0027\u0027,"},{"lineNumber":152,"author":{"gitId":"-"},"content":" created_at: \u00272010-04-12T19:12:02Z\u0027,"},{"lineNumber":153,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_DOCUMENTATION_BUG, GITHUB_LABEL_HIGH_SEVERITY],"},{"lineNumber":154,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":155,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":156,"author":{"gitId":"-"},"content":" title: \u0027Too many typos 2\u0027,"},{"lineNumber":157,"author":{"gitId":"-"},"content":" updated_at: \u00272012-04-12T19:12:02Z\u0027,"},{"lineNumber":158,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/130\u0027,"},{"lineNumber":159,"author":{"gitId":"-"},"content":" user: USER_ANUBHAV_DETAILS"},{"lineNumber":160,"author":{"gitId":"-"},"content":"});"},{"lineNumber":161,"author":{"gitId":"-"},"content":""},{"lineNumber":162,"author":{"gitId":"-"},"content":"export const ISSUE_WITH_ASSIGNEES \u003d new GithubIssue({"},{"lineNumber":163,"author":{"gitId":"-"},"content":" id: \u0027551732011\u0027,"},{"lineNumber":164,"author":{"gitId":"-"},"content":" number: 91,"},{"lineNumber":165,"author":{"gitId":"-"},"content":" assignees: [USER_ANUBHAV_ASSIGNEE_DETAILS],"},{"lineNumber":166,"author":{"gitId":"-"},"content":" body: \u0027Screen freezes every few minutes\u0027,"},{"lineNumber":167,"author":{"gitId":"-"},"content":" created_at: \u00272020-01-18T07:01:45Z\u0027,"},{"lineNumber":168,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_FUNCTIONALITY_BUG, GITHUB_LABEL_MEDIUM_SEVERITY],"},{"lineNumber":169,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":170,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":171,"author":{"gitId":"-"},"content":" title: \u0027Screen freezes\u0027,"},{"lineNumber":172,"author":{"gitId":"-"},"content":" updated_at: \u00272020-03-02T12:50:02Z\u0027,"},{"lineNumber":173,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/91\u0027,"},{"lineNumber":174,"author":{"gitId":"-"},"content":" user: USER_ANUBHAV_DETAILS,"},{"lineNumber":175,"author":{"gitId":"-"},"content":" comments: [EMPTY_TEAM_RESPONSE]"},{"lineNumber":176,"author":{"gitId":"-"},"content":"});"},{"lineNumber":177,"author":{"gitId":"-"},"content":""},{"lineNumber":178,"author":{"gitId":"-"},"content":"export const generateIssueWithRandomData: () \u003d\u003e GithubIssue \u003d () \u003d\u003e {"},{"lineNumber":179,"author":{"gitId":"-"},"content":" const created_and_updated_date: string \u003d randomISODate();"},{"lineNumber":180,"author":{"gitId":"-"},"content":" const issueNumber: number \u003d randomIssueNumber();"},{"lineNumber":181,"author":{"gitId":"-"},"content":" const severityLabels: GithubLabel[] \u003d [GITHUB_LABEL_LOW_SEVERITY, GITHUB_LABEL_MEDIUM_SEVERITY, GITHUB_LABEL_HIGH_SEVERITY];"},{"lineNumber":182,"author":{"gitId":"-"},"content":" const typeLabels: GithubLabel[] \u003d [GITHUB_LABEL_FUNCTIONALITY_BUG, GITHUB_LABEL_FEATURE_FLAW, GITHUB_LABEL_DOCUMENTATION_BUG];"},{"lineNumber":183,"author":{"gitId":"-"},"content":" return new GithubIssue({"},{"lineNumber":184,"author":{"gitId":"-"},"content":" id: randomId(),"},{"lineNumber":185,"author":{"gitId":"-"},"content":" number: issueNumber,"},{"lineNumber":186,"author":{"gitId":"-"},"content":" assignees: [],"},{"lineNumber":187,"author":{"gitId":"-"},"content":" comments: [],"},{"lineNumber":188,"author":{"gitId":"-"},"content":" body: `Issue No.: ${issueNumber}\\nSample Content.`,"},{"lineNumber":189,"author":{"gitId":"-"},"content":" created_at: created_and_updated_date,"},{"lineNumber":190,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, typeLabels[issueNumber % 3], severityLabels[issueNumber % 3]],"},{"lineNumber":191,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":192,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":193,"author":{"gitId":"-"},"content":" title: `Random Issue: ${issueNumber}`,"},{"lineNumber":194,"author":{"gitId":"-"},"content":" updated_at: created_and_updated_date,"},{"lineNumber":195,"author":{"gitId":"-"},"content":" url: `https://api.github.com/repos/CATcher-org/pe-results/issues/${issueNumber}`,"},{"lineNumber":196,"author":{"gitId":"-"},"content":" user: USER_ANUBHAV_DETAILS"},{"lineNumber":197,"author":{"gitId":"-"},"content":" });"},{"lineNumber":198,"author":{"gitId":"-"},"content":"};"},{"lineNumber":199,"author":{"gitId":"-"},"content":""},{"lineNumber":200,"author":{"gitId":"-"},"content":"export const ISSUE_PENDING_MODERATION \u003d new GithubIssue({"},{"lineNumber":201,"author":{"gitId":"-"},"content":" id: \u0027574674360\u0027,"},{"lineNumber":202,"author":{"gitId":"-"},"content":" number: 26,"},{"lineNumber":203,"author":{"gitId":"-"},"content":" assignees: [USER_SHUMING_ASSIGNEE_DETAILS],"},{"lineNumber":204,"author":{"gitId":"-"},"content":" body: ISSUE_BODY,"},{"lineNumber":205,"author":{"gitId":"-"},"content":" created_at: \u00272020-03-03T13:38:32Z\u0027,"},{"lineNumber":206,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_FUNCTIONALITY_BUG, GITHUB_LABEL_MEDIUM_SEVERITY],"},{"lineNumber":207,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":208,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":209,"author":{"gitId":"-"},"content":" title: \u0027Basic Issue, Three Disputes, Unsure\u0027,"},{"lineNumber":210,"author":{"gitId":"-"},"content":" updated_at: \u00272020-08-15T06:39:40Z\u0027,"},{"lineNumber":211,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/26\u0027,"},{"lineNumber":212,"author":{"gitId":"-"},"content":" user: USER_SHUMING_DETAILS,"},{"lineNumber":213,"author":{"gitId":"-"},"content":" comments: [PENDING_TUTOR_MODERATION]"},{"lineNumber":214,"author":{"gitId":"-"},"content":"});"},{"lineNumber":215,"author":{"gitId":"-"},"content":""},{"lineNumber":216,"author":{"gitId":"-"},"content":"export const ISSUE_PENDING_MODERATION_HIGH_SEVERITY_FEATURE_FLAW \u003d new GithubIssue({"},{"lineNumber":217,"author":{"gitId":"-"},"content":" id: \u0027239538360\u0027,"},{"lineNumber":218,"author":{"gitId":"-"},"content":" number: 93,"},{"lineNumber":219,"author":{"gitId":"-"},"content":" assignees: [USER_SHUMING_ASSIGNEE_DETAILS],"},{"lineNumber":220,"author":{"gitId":"-"},"content":" body: ISSUE_BODY,"},{"lineNumber":221,"author":{"gitId":"-"},"content":" created_at: \u00272020-10-14T10:28:32Z\u0027,"},{"lineNumber":222,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_FEATURE_FLAW, GITHUB_LABEL_HIGH_SEVERITY],"},{"lineNumber":223,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":224,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":225,"author":{"gitId":"-"},"content":" title: \u0027Redundant buggy feature\u0027,"},{"lineNumber":226,"author":{"gitId":"-"},"content":" updated_at: \u00272020-11-25T13:19:40Z\u0027,"},{"lineNumber":227,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/26\u0027,"},{"lineNumber":228,"author":{"gitId":"-"},"content":" user: USER_SHUMING_DETAILS,"},{"lineNumber":229,"author":{"gitId":"-"},"content":" comments: [PENDING_TUTOR_MODERATION]"},{"lineNumber":230,"author":{"gitId":"-"},"content":"});"},{"lineNumber":231,"author":{"gitId":"-"},"content":""},{"lineNumber":232,"author":{"gitId":"-"},"content":"export const ISSUE_PENDING_MODERATION_LOW_SEVERITY_DOCUMENTATION_BUG \u003d new GithubIssue({"},{"lineNumber":233,"author":{"gitId":"-"},"content":" id: \u0027384756360\u0027,"},{"lineNumber":234,"author":{"gitId":"-"},"content":" number: 6,"},{"lineNumber":235,"author":{"gitId":"-"},"content":" assignees: [USER_SHUMING_ASSIGNEE_DETAILS],"},{"lineNumber":236,"author":{"gitId":"-"},"content":" body: ISSUE_BODY,"},{"lineNumber":237,"author":{"gitId":"-"},"content":" created_at: \u00272020-03-26T09:08:12Z\u0027,"},{"lineNumber":238,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_DOCUMENTATION_BUG, GITHUB_LABEL_LOW_SEVERITY],"},{"lineNumber":239,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":240,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":241,"author":{"gitId":"-"},"content":" title: \u0027Documentation bug, too many typos\u0027,"},{"lineNumber":242,"author":{"gitId":"-"},"content":" updated_at: \u00272020-11-10T16:59:40Z\u0027,"},{"lineNumber":243,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/26\u0027,"},{"lineNumber":244,"author":{"gitId":"-"},"content":" user: USER_SHUMING_DETAILS,"},{"lineNumber":245,"author":{"gitId":"-"},"content":" comments: [PENDING_TUTOR_MODERATION]"},{"lineNumber":246,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"NereusWB922":32,"-":214}},{"path":"tests/constants/githublabel.constants.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { GithubLabel } from \u0027../../src/app/core/models/github/github-label.model\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_FUNCTIONALITY_BUG \u003d {"},{"lineNumber":4,"author":{"gitId":"-"},"content":" color: \u00279900cc\u0027,"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" name: \u0027type.FunctionalityBug\u0027"},{"lineNumber":6,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_FEATURE_FLAW \u003d {"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" color: \u0027d966ff\u0027,"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" name: \u0027type.FeatureFlaw\u0027"},{"lineNumber":11,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_DOCUMENTATION_BUG \u003d {"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" color: \u0027d966ff\u0027,"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" name: \u0027type.DocumentationBug\u0027"},{"lineNumber":16,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_LOW_SEVERITY \u003d {"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" color: \u0027ffcccc\u0027,"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" name: \u0027severity.Low\u0027"},{"lineNumber":21,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_HIGH_SEVERITY \u003d {"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" color: \u0027ff6666\u0027,"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" name: \u0027severity.High\u0027"},{"lineNumber":26,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":27,"author":{"gitId":"-"},"content":""},{"lineNumber":28,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_MEDIUM_SEVERITY \u003d {"},{"lineNumber":29,"author":{"gitId":"-"},"content":" color: \u0027ff9999\u0027,"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" name: \u0027severity.Medium\u0027"},{"lineNumber":31,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":32,"author":{"gitId":"-"},"content":""},{"lineNumber":33,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_TUTORIAL_LABEL \u003d {"},{"lineNumber":34,"author":{"gitId":"-"},"content":" color: \u0027c2e0c6\u0027,"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":" name: \u0027tutorial.CS2103T-W12\u0027"},{"lineNumber":36,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_TEAM_LABEL \u003d {"},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" color: \u0027d4c5f9\u0027,"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" name: \u0027team.3\u0027"},{"lineNumber":41,"author":{"gitId":"-"},"content":"} as GithubLabel;"}],"authorContributionMap":{"NereusWB922":13,"-":28}},{"path":"tests/constants/session.constants.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Phase } from \u0027../../src/app/core/models/phase.model\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { Repo } from \u0027../../src/app/core/models/repo.model\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { SessionData, SessionRepo } from \u0027../../src/app/core/models/session.model\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"export const WATCHER_REPO: Repo \u003d Repo.of(\u0027CATcher-org/WATcher\u0027);"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"const ISSUES_VIEWER_SESSION_REPO: SessionRepo \u003d {"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" phase: Phase.issuesViewer,"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" repos: [WATCHER_REPO]"},{"lineNumber":10,"author":{"gitId":"-"},"content":"};"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":"const ACTIVITY_DASHBOARD_SESSION_REPO: SessionRepo \u003d {"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" phase: Phase.activityDashboard,"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" repos: [WATCHER_REPO]"},{"lineNumber":15,"author":{"gitId":"-"},"content":"};"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":"export const VALID_SESSION_DATA: SessionData \u003d {"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" sessionRepo: [ISSUES_VIEWER_SESSION_REPO, ACTIVITY_DASHBOARD_SESSION_REPO]"},{"lineNumber":19,"author":{"gitId":"-"},"content":"};"}],"authorContributionMap":{"NereusWB922":11,"-":8}}] +[{"path":"src/app/activity-dashboard/activity-dashboard.component.css","fileType":"css","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":".event-tables-wrapper {"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" display: flex;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" overflow-x: auto;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":4}},{"path":"src/app/activity-dashboard/activity-dashboard.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cdiv\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003cmat-grid-list cols\u003d\"4\" rowHeight\u003d\"80px\"\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \u003cmat-grid-tile\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"grid-flush-left\"\u003e"},{"lineNumber":5,"author":{"gitId":"-"},"content":" \u003ch1 class\u003d\"mat-headline\" style\u003d\"margin: 0px\"\u003eActivity\u003c/h1\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003c/mat-grid-tile\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cmat-grid-tile\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cmat-form-field appearance\u003d\"fill\"\u003e"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cmat-label\u003eStart Date\u003c/mat-label\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cinput matInput [min]\u003d\"startMinDate\" [max]\u003d\"startMaxDate\" [matDatepicker]\u003d\"startPicker\" (dateChange)\u003d\"pickStartDate($event)\" /\u003e"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003cmat-hint\u003eMM/DD/YYYY\u003c/mat-hint\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cmat-datepicker-toggle matSuffix [for]\u003d\"startPicker\"\u003e\u003c/mat-datepicker-toggle\u003e"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cmat-datepicker startView\u003d\"year\" #startPicker\u003e\u003c/mat-datepicker\u003e"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003c/mat-grid-tile\u003e"},{"lineNumber":18,"author":{"gitId":"-"},"content":""},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003cmat-grid-tile\u003e"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003cmat-form-field appearance\u003d\"fill\"\u003e"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003cmat-label\u003eEnd Date\u003c/mat-label\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \u003cinput matInput [min]\u003d\"endMinDate\" [max]\u003d\"endMaxDate\" [matDatepicker]\u003d\"endPicker\" (dateChange)\u003d\"pickEndDate($event)\" /\u003e"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cmat-hint\u003eMM/DD/YYYY\u003c/mat-hint\u003e"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003cmat-datepicker-toggle matSuffix [for]\u003d\"endPicker\"\u003e\u003c/mat-datepicker-toggle\u003e"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cmat-datepicker startView\u003d\"year\" #endPicker\u003e\u003c/mat-datepicker\u003e"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003c/mat-grid-tile\u003e"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003c/mat-grid-list\u003e"},{"lineNumber":29,"author":{"gitId":"-"},"content":"\u003c/div\u003e"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":"\u003cdiv class\u003d\"event-tables-wrapper\"\u003e"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003capp-event-tables"},{"lineNumber":33,"author":{"gitId":"-"},"content":" *ngFor\u003d\"let assignee of assignees\""},{"lineNumber":34,"author":{"gitId":"-"},"content":" class\u003d\"issue-table\""},{"lineNumber":35,"author":{"gitId":"-"},"content":" [actor]\u003d\"assignee\""},{"lineNumber":36,"author":{"gitId":"-"},"content":" [columnsToDisplay]\u003d\"this.displayedColumns\""},{"lineNumber":37,"author":{"gitId":"-"},"content":" [expandedColumnsToDisplay]\u003d\"this.expandedColumns\""},{"lineNumber":38,"author":{"gitId":"-"},"content":" [actions]\u003d\"this.actionButtons\""},{"lineNumber":39,"author":{"gitId":"-"},"content":" \u003e\u003c/app-event-tables\u003e"},{"lineNumber":40,"author":{"gitId":"-"},"content":"\u003c/div\u003e"}],"authorContributionMap":{"NereusWB922":1,"-":39}},{"path":"src/app/activity-dashboard/activity-dashboard.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Component, OnInit, QueryList, ViewChildren } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { MatDatepickerInputEvent } from \u0027@angular/material/datepicker\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import * as moment from \u0027moment\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { GithubUser } from \u0027../core/models/github-user.model\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027../core/services/github.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { GithubEventService } from \u0027../core/services/githubevent.service\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { EXPANDED_TABLE_COLUMNS, TABLE_COLUMNS } from \u0027./event-tables/event-tables-columns\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { ACTION_BUTTONS, EventTablesComponent } from \u0027./event-tables/event-tables.component\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":11,"author":{"gitId":"-"},"content":" selector: \u0027app-activity-dashboard\u0027,"},{"lineNumber":12,"author":{"gitId":"-"},"content":" templateUrl: \u0027./activity-dashboard.component.html\u0027,"},{"lineNumber":13,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./activity-dashboard.component.css\u0027]"},{"lineNumber":14,"author":{"gitId":"-"},"content":"})"},{"lineNumber":15,"author":{"gitId":"-"},"content":"export class ActivityDashboardComponent implements OnInit {"},{"lineNumber":16,"author":{"gitId":"-"},"content":" readonly displayedColumns \u003d [TABLE_COLUMNS.DATE_START, TABLE_COLUMNS.ISSUE_COUNT, TABLE_COLUMNS.PR_COUNT, TABLE_COLUMNS.COMMENT_COUNT];"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" readonly expandedColumns \u003d [EXPANDED_TABLE_COLUMNS.TITLE, EXPANDED_TABLE_COLUMNS.DATE];"},{"lineNumber":18,"author":{"gitId":"-"},"content":" readonly actionButtons: ACTION_BUTTONS[] \u003d [ACTION_BUTTONS.VIEW_IN_WEB];"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":" startMinDate: Date;"},{"lineNumber":21,"author":{"gitId":"-"},"content":" startMaxDate \u003d moment().endOf(\u0027day\u0027).toDate();"},{"lineNumber":22,"author":{"gitId":"-"},"content":" endMinDate: Date;"},{"lineNumber":23,"author":{"gitId":"-"},"content":" endMaxDate \u003d moment().endOf(\u0027day\u0027).toDate();"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":" assignees: GithubUser[];"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"-"},"content":" @ViewChildren(EventTablesComponent) tables: QueryList\u003cEventTablesComponent\u003e;"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" constructor(private githubService: GithubService, private githubEventService: GithubEventService) {}"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":32,"author":{"gitId":"-"},"content":" this.githubEventService.getEvents();"},{"lineNumber":33,"author":{"gitId":"-"},"content":" this.githubService.getUsersAssignable().subscribe((x) \u003d\u003e (this.assignees \u003d x));"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":" pickStartDate(event: MatDatepickerInputEvent\u003cDate\u003e) {"},{"lineNumber":37,"author":{"gitId":"-"},"content":" this.endMinDate \u003d event.value;"},{"lineNumber":38,"author":{"gitId":"-"},"content":" this.tables.forEach((t) \u003d\u003e (t.githubEvents.start \u003d `${event.value}`));"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" pickEndDate(event: MatDatepickerInputEvent\u003cDate\u003e) {"},{"lineNumber":42,"author":{"gitId":"-"},"content":" this.startMaxDate \u003d event.value;"},{"lineNumber":43,"author":{"gitId":"-"},"content":" this.tables.forEach((t) \u003d\u003e (t.githubEvents.end \u003d `${event.value}`));"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }"},{"lineNumber":45,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"NereusWB922":1,"-":44}},{"path":"src/app/activity-dashboard/activity-dashboard.module.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { CommonModule } from \u0027@angular/common\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { NgModule } from \u0027@angular/core\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { SharedModule } from \u0027../shared/shared.module\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { ActivityDashboardRoutingModule } from \u0027./activity-dashboard-routing.module\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { ActivityDashboardComponent } from \u0027./activity-dashboard.component\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { EventTablesModule } from \u0027./event-tables/event-tables.module\u0027;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"import { EventWeekDetailsComponent } from \u0027./event-week-details/event-week-details.component\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"@NgModule({"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" declarations: [ActivityDashboardComponent, EventWeekDetailsComponent],"},{"lineNumber":11,"author":{"gitId":"-"},"content":" imports: [CommonModule, SharedModule, ActivityDashboardRoutingModule, EventTablesModule]"},{"lineNumber":12,"author":{"gitId":"-"},"content":"})"},{"lineNumber":13,"author":{"gitId":"-"},"content":"export class ActivityDashboardModule {}"}],"authorContributionMap":{"NereusWB922":2,"-":11}},{"path":"src/app/activity-dashboard/event-tables/event-tables.component.css","fileType":"css","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":".table-container {"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" margin: 10px;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" min-width: 400px;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":".actor-card {"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" display: flex;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" align-items: center;"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" padding: 10px;"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" margin-bottom: 1px;"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":".actor-username {"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" flex-grow: 1;"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" font-size: 15px;"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" margin: 0;"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" text-align: center;"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" word-break: break-word;"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":21,"author":{"gitId":"NereusWB922"},"content":".avatar-container {"},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" margin-right: 10px;"},{"lineNumber":23,"author":{"gitId":"-"},"content":"}"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":".mat-table {"},{"lineNumber":26,"author":{"gitId":"-"},"content":" /* flex-wrap: wrap; */"},{"lineNumber":27,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":28,"author":{"gitId":"-"},"content":"}"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":".mat-cell {"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" display: flex;"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" align-items: center;"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":" justify-content: center;"},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" text-align: center;"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":" padding: 0;"},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":".mat-header-cell {"},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" display: flex;"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" align-items: center;"},{"lineNumber":41,"author":{"gitId":"NereusWB922"},"content":" justify-content: center;"},{"lineNumber":42,"author":{"gitId":"NereusWB922"},"content":" text-align: center;"},{"lineNumber":43,"author":{"gitId":"NereusWB922"},"content":" padding: 0;"},{"lineNumber":44,"author":{"gitId":"-"},"content":"}"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":".mat-header-row {"},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" white-space: nowrap;"},{"lineNumber":48,"author":{"gitId":"-"},"content":"}"},{"lineNumber":49,"author":{"gitId":"-"},"content":""},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":".example-element-row:hover {"},{"lineNumber":51,"author":{"gitId":"NereusWB922"},"content":" border: 3px solid rgba(0, 0, 0, 0.514);"},{"lineNumber":52,"author":{"gitId":"NereusWB922"},"content":" border-radius: 3px;"},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" color: #210749;"},{"lineNumber":54,"author":{"gitId":"-"},"content":"}"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":".example-element-row td {"},{"lineNumber":57,"author":{"gitId":"-"},"content":" border-bottom-width: 0;"},{"lineNumber":58,"author":{"gitId":"-"},"content":"}"},{"lineNumber":59,"author":{"gitId":"-"},"content":""},{"lineNumber":60,"author":{"gitId":"-"},"content":".example-element-detail {"},{"lineNumber":61,"author":{"gitId":"-"},"content":" overflow: hidden;"},{"lineNumber":62,"author":{"gitId":"-"},"content":" display: flex;"},{"lineNumber":63,"author":{"gitId":"-"},"content":" width: 100%;"},{"lineNumber":64,"author":{"gitId":"-"},"content":"}"},{"lineNumber":65,"author":{"gitId":"-"},"content":""},{"lineNumber":66,"author":{"gitId":"-"},"content":"/* Colour cells */"},{"lineNumber":67,"author":{"gitId":"-"},"content":""},{"lineNumber":68,"author":{"gitId":"-"},"content":".white {"},{"lineNumber":69,"author":{"gitId":"-"},"content":" background-color: white;"},{"lineNumber":70,"author":{"gitId":"-"},"content":"}"},{"lineNumber":71,"author":{"gitId":"-"},"content":""},{"lineNumber":72,"author":{"gitId":"-"},"content":".pale-green {"},{"lineNumber":73,"author":{"gitId":"-"},"content":" background-color: palegreen;"},{"lineNumber":74,"author":{"gitId":"-"},"content":"}"},{"lineNumber":75,"author":{"gitId":"-"},"content":""},{"lineNumber":76,"author":{"gitId":"-"},"content":".green {"},{"lineNumber":77,"author":{"gitId":"-"},"content":" background-color: green;"},{"lineNumber":78,"author":{"gitId":"-"},"content":"}"},{"lineNumber":79,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":80,"author":{"gitId":"NereusWB922"},"content":".scrollable-container {"},{"lineNumber":81,"author":{"gitId":"NereusWB922"},"content":" height: 53vh;"},{"lineNumber":82,"author":{"gitId":"NereusWB922"},"content":" overflow: auto;"},{"lineNumber":83,"author":{"gitId":"NereusWB922"},"content":" margin-bottom: 2px;"},{"lineNumber":84,"author":{"gitId":"NereusWB922"},"content":" scrollbar-width: none;"},{"lineNumber":85,"author":{"gitId":"NereusWB922"},"content":" position: relative;"},{"lineNumber":86,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":87,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":88,"author":{"gitId":"NereusWB922"},"content":".scrollable-container::-webkit-scrollbar {"},{"lineNumber":89,"author":{"gitId":"NereusWB922"},"content":" display: none;"},{"lineNumber":90,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":91,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":92,"author":{"gitId":"NereusWB922"},"content":"/* Ref: https://css-scroll-shadows.vercel.app */"},{"lineNumber":93,"author":{"gitId":"NereusWB922"},"content":".scrollable-container::before {"},{"lineNumber":94,"author":{"gitId":"NereusWB922"},"content":" pointer-events: none;"},{"lineNumber":95,"author":{"gitId":"NereusWB922"},"content":" content: \u0027\u0027;"},{"lineNumber":96,"author":{"gitId":"NereusWB922"},"content":" position: absolute;"},{"lineNumber":97,"author":{"gitId":"NereusWB922"},"content":" z-index: 2;"},{"lineNumber":98,"author":{"gitId":"NereusWB922"},"content":" height: 6px;"},{"lineNumber":99,"author":{"gitId":"NereusWB922"},"content":" width: 100%;"},{"lineNumber":100,"author":{"gitId":"NereusWB922"},"content":" display: block;"},{"lineNumber":101,"author":{"gitId":"NereusWB922"},"content":" background-image: linear-gradient(to bottom, white 66%, transparent);"},{"lineNumber":102,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":103,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":104,"author":{"gitId":"NereusWB922"},"content":".scrollable-container::after {"},{"lineNumber":105,"author":{"gitId":"NereusWB922"},"content":" pointer-events: none;"},{"lineNumber":106,"author":{"gitId":"NereusWB922"},"content":" content: \u0027\u0027;"},{"lineNumber":107,"author":{"gitId":"NereusWB922"},"content":" position: sticky;"},{"lineNumber":108,"author":{"gitId":"NereusWB922"},"content":" z-index: 2;"},{"lineNumber":109,"author":{"gitId":"NereusWB922"},"content":" top: 100%;"},{"lineNumber":110,"author":{"gitId":"NereusWB922"},"content":" height: 6px;"},{"lineNumber":111,"author":{"gitId":"NereusWB922"},"content":" width: 100%;"},{"lineNumber":112,"author":{"gitId":"NereusWB922"},"content":" display: block;"},{"lineNumber":113,"author":{"gitId":"NereusWB922"},"content":" background-image: linear-gradient(to top, white 66%, transparent);"},{"lineNumber":114,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":115,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":116,"author":{"gitId":"NereusWB922"},"content":".scrollable-container-wrapper {"},{"lineNumber":117,"author":{"gitId":"NereusWB922"},"content":" position: relative;"},{"lineNumber":118,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":119,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":120,"author":{"gitId":"NereusWB922"},"content":".scrollable-container-wrapper::before {"},{"lineNumber":121,"author":{"gitId":"NereusWB922"},"content":" pointer-events: none;"},{"lineNumber":122,"author":{"gitId":"NereusWB922"},"content":" content: \u0027\u0027;"},{"lineNumber":123,"author":{"gitId":"NereusWB922"},"content":" position: absolute;"},{"lineNumber":124,"author":{"gitId":"NereusWB922"},"content":" z-index: 1;"},{"lineNumber":125,"author":{"gitId":"NereusWB922"},"content":" top: 0;"},{"lineNumber":126,"author":{"gitId":"NereusWB922"},"content":" left: 0;"},{"lineNumber":127,"author":{"gitId":"NereusWB922"},"content":" right: 0;"},{"lineNumber":128,"author":{"gitId":"NereusWB922"},"content":" height: 5px;"},{"lineNumber":129,"author":{"gitId":"NereusWB922"},"content":" background-image: radial-gradient(farthest-side at 50% 0, rgba(0, 0, 0, 0.5), transparent);"},{"lineNumber":130,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":131,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":132,"author":{"gitId":"NereusWB922"},"content":".scrollable-container-wrapper::after {"},{"lineNumber":133,"author":{"gitId":"NereusWB922"},"content":" pointer-events: none;"},{"lineNumber":134,"author":{"gitId":"NereusWB922"},"content":" content: \u0027\u0027;"},{"lineNumber":135,"author":{"gitId":"NereusWB922"},"content":" position: absolute;"},{"lineNumber":136,"author":{"gitId":"NereusWB922"},"content":" z-index: 1;"},{"lineNumber":137,"author":{"gitId":"NereusWB922"},"content":" bottom: 0;"},{"lineNumber":138,"author":{"gitId":"NereusWB922"},"content":" left: 0;"},{"lineNumber":139,"author":{"gitId":"NereusWB922"},"content":" right: 0;"},{"lineNumber":140,"author":{"gitId":"NereusWB922"},"content":" height: 5px;"},{"lineNumber":141,"author":{"gitId":"NereusWB922"},"content":" background-image: radial-gradient(farthest-side at 50% 100%, rgba(0, 0, 0, 0.5), transparent);"},{"lineNumber":142,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":105,"-":37}},{"path":"src/app/activity-dashboard/event-tables/event-tables.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cdiv class\u003d\"table-container\"\u003e"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card class\u003d\"actor-card\"\u003e"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" mat-card-avatar"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" *ngIf\u003d\"this.actor\""},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" class\u003d\"avatar-container\""},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" [ngStyle]\u003d\"{"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" background: \u0027url(\u0027 + this.actor.avatar_url + \u0027)\u0027,"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" \u0027background-size\u0027: \u002740px\u0027"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" }\""},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" \u003e\u003c/div\u003e"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-card-title class\u003d\"actor-username\"\u003e"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" {{ this.actor !\u003d\u003d undefined ? this.actor.login : \u0027Unknown\u0027 }}"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-card-title\u003e"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-card\u003e"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv class\u003d\"scrollable-container-wrapper\"\u003e"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" \u003cdiv class\u003d\"scrollable-container\"\u003e"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-table [dataSource]\u003d\"this.githubEvents\" matSort multiTemplateDataRows\u003e"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003cng-container matColumnDef\u003d\"date_start\"\u003e"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003cmat-header-cell *matHeaderCellDef mat-sort-header\u003e Date \u003c/mat-header-cell\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let element\"\u003e"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cspan (click)\u003d\"$event.stopPropagation()\" style\u003d\"cursor: default\"\u003e"},{"lineNumber":24,"author":{"gitId":"-"},"content":" {{ element.date_start }}"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" \u003cng-container matColumnDef\u003d\"issue_count\"\u003e"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \u003cmat-header-cell *matHeaderCellDef mat-sort-header\u003e Issue # \u003c/mat-header-cell\u003e"},{"lineNumber":31,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let element\" [ngClass]\u003d\"colorCell(element.issue_count)\"\u003e"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003cspan (click)\u003d\"$event.stopPropagation()\" style\u003d\"cursor: default\"\u003e"},{"lineNumber":33,"author":{"gitId":"-"},"content":" {{ element.issue_count }}"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":36,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":" \u003cng-container matColumnDef\u003d\"pr_count\"\u003e"},{"lineNumber":39,"author":{"gitId":"-"},"content":" \u003cmat-header-cell *matHeaderCellDef mat-sort-header\u003e PR # \u003c/mat-header-cell\u003e"},{"lineNumber":40,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let element\" [ngClass]\u003d\"colorCell(element.pr_count)\"\u003e"},{"lineNumber":41,"author":{"gitId":"-"},"content":" \u003cspan (click)\u003d\"$event.stopPropagation()\" style\u003d\"cursor: default\"\u003e"},{"lineNumber":42,"author":{"gitId":"-"},"content":" {{ element.pr_count }}"},{"lineNumber":43,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":44,"author":{"gitId":"-"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":" \u003cng-container matColumnDef\u003d\"comment_count\"\u003e"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003cmat-header-cell *matHeaderCellDef mat-sort-header\u003e Comment # \u003c/mat-header-cell\u003e"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003cmat-cell *matCellDef\u003d\"let element\" [ngClass]\u003d\"colorCell(element.comment_count)\"\u003e"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003cspan (click)\u003d\"$event.stopPropagation()\" style\u003d\"cursor: default\"\u003e"},{"lineNumber":51,"author":{"gitId":"-"},"content":" {{ element.comment_count }}"},{"lineNumber":52,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003c/ng-container\u003e"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-header-row *matHeaderRowDef\u003d\"this.columnsToDisplay\"\u003e\u003c/mat-header-row\u003e"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003cmat-row"},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" *matRowDef\u003d\"let eventWeek; columns: this.columnsToDisplay\""},{"lineNumber":59,"author":{"gitId":"-"},"content":" class\u003d\"example-element-row\""},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":" (click)\u003d\"openDialog(eventWeek)\""},{"lineNumber":61,"author":{"gitId":"-"},"content":" \u003e\u003c/mat-row\u003e"},{"lineNumber":62,"author":{"gitId":"-"},"content":" \u003c/mat-table\u003e"},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":" \u003c/div\u003e"},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" \u003c/div\u003e"},{"lineNumber":65,"author":{"gitId":"-"},"content":""},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003cmat-card *ngIf\u003d\"this.githubEvents.isLoading$ | async\" style\u003d\"display: flex; justify-content: center; align-items: center\"\u003e"},{"lineNumber":67,"author":{"gitId":"-"},"content":" \u003cmat-progress-spinner color\u003d\"primary\" mode\u003d\"indeterminate\" diameter\u003d\"50\" strokeWidth\u003d\"5\"\u003e\u003c/mat-progress-spinner\u003e"},{"lineNumber":68,"author":{"gitId":"-"},"content":" \u003c/mat-card\u003e"},{"lineNumber":69,"author":{"gitId":"-"},"content":" \u003cmat-paginator [pageSize]\u003d\"20\" [pageSizeOptions]\u003d\"[10, 20, 50]\"\u003e\u003c/mat-paginator\u003e"},{"lineNumber":70,"author":{"gitId":"-"},"content":"\u003c/div\u003e"}],"authorContributionMap":{"NereusWB922":22,"-":48}},{"path":"src/app/activity-dashboard/event-tables/event-tables.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { animate, state, style, transition, trigger } from \u0027@angular/animations\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { AfterViewInit, Component, Input, OnInit, ViewChild } from \u0027@angular/core\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { MatDialog } from \u0027@angular/material/dialog\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { MatPaginator } from \u0027@angular/material/paginator\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { MatSort } from \u0027@angular/material/sort\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { GithubUser } from \u0027../../core/models/github-user.model\u0027;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"import { ErrorHandlingService } from \u0027../../core/services/error-handling.service\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { GithubEventService } from \u0027../../core/services/githubevent.service\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027../../core/services/logging.service\u0027;"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"import { EventWeekDetailsComponent } from \u0027../event-week-details/event-week-details.component\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import { EventWeek } from \u0027../event-week.model\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import { GithubEventDataTable } from \u0027./GithubEventDataTable\u0027;"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":"import { NoEventsError } from \u0027./no-events-error.model\u0027;"},{"lineNumber":14,"author":{"gitId":"-"},"content":""},{"lineNumber":15,"author":{"gitId":"-"},"content":"export enum ACTION_BUTTONS {"},{"lineNumber":16,"author":{"gitId":"-"},"content":" VIEW_IN_WEB,"},{"lineNumber":17,"author":{"gitId":"-"},"content":" COLLAPSE"},{"lineNumber":18,"author":{"gitId":"-"},"content":"}"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":21,"author":{"gitId":"-"},"content":" selector: \u0027app-event-tables\u0027,"},{"lineNumber":22,"author":{"gitId":"-"},"content":" templateUrl: \u0027./event-tables.component.html\u0027,"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" styleUrls: [\u0027./event-tables.component.css\u0027]"},{"lineNumber":24,"author":{"gitId":"-"},"content":"})"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Angular Table Expandable Rows"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * ref: https://material.angular.io/components/table/examples#table-expandable-rows"},{"lineNumber":29,"author":{"gitId":"-"},"content":" */"},{"lineNumber":30,"author":{"gitId":"-"},"content":"export class EventTablesComponent implements OnInit, AfterViewInit {"},{"lineNumber":31,"author":{"gitId":"-"},"content":" @Input() columnsToDisplay: string[];"},{"lineNumber":32,"author":{"gitId":"-"},"content":" @Input() expandedColumnsToDisplay: string[];"},{"lineNumber":33,"author":{"gitId":"-"},"content":" @Input() actions: ACTION_BUTTONS[];"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Input() actor?: GithubUser \u003d undefined;"},{"lineNumber":35,"author":{"gitId":"-"},"content":" @Input() filters?: any \u003d undefined;"},{"lineNumber":36,"author":{"gitId":"-"},"content":""},{"lineNumber":37,"author":{"gitId":"-"},"content":" @ViewChild(MatSort, { static: true }) sort: MatSort;"},{"lineNumber":38,"author":{"gitId":"-"},"content":" @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator;"},{"lineNumber":39,"author":{"gitId":"-"},"content":""},{"lineNumber":40,"author":{"gitId":"-"},"content":" githubEvents: GithubEventDataTable;"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":" public readonly action_buttons \u003d ACTION_BUTTONS;"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" constructor("},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":" public githubEventService: GithubEventService,"},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":" public dialog: MatDialog,"},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" private logger: LoggingService,"},{"lineNumber":48,"author":{"gitId":"NereusWB922"},"content":" private errorHandling: ErrorHandlingService"},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":" ) {}"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" this.githubEvents \u003d new GithubEventDataTable(this.githubEventService, this.logger, this.sort, this.paginator, this.actor, this.filters);"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }"},{"lineNumber":54,"author":{"gitId":"-"},"content":""},{"lineNumber":55,"author":{"gitId":"-"},"content":" ngAfterViewInit(): void {"},{"lineNumber":56,"author":{"gitId":"-"},"content":" setTimeout(() \u003d\u003e {"},{"lineNumber":57,"author":{"gitId":"-"},"content":" this.githubEvents.loadEvents();"},{"lineNumber":58,"author":{"gitId":"-"},"content":" });"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }"},{"lineNumber":60,"author":{"gitId":"-"},"content":""},{"lineNumber":61,"author":{"gitId":"-"},"content":" reload() {"},{"lineNumber":62,"author":{"gitId":"-"},"content":" this.githubEvents.loadEvents();"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }"},{"lineNumber":64,"author":{"gitId":"-"},"content":""},{"lineNumber":65,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * Formats the title text to account for those that contain long words."},{"lineNumber":67,"author":{"gitId":"-"},"content":" * @param title - Title of Event that is to be displayed in the Table Row."},{"lineNumber":68,"author":{"gitId":"-"},"content":" */"},{"lineNumber":69,"author":{"gitId":"-"},"content":" fitTitleText(title: string): string {"},{"lineNumber":70,"author":{"gitId":"-"},"content":" // Arbitrary Length of Characters beyond which an overflow occurs."},{"lineNumber":71,"author":{"gitId":"-"},"content":" const MAX_WORD_LENGTH \u003d 43;"},{"lineNumber":72,"author":{"gitId":"-"},"content":" const SPLITTER_TEXT \u003d \u0027 \u0027;"},{"lineNumber":73,"author":{"gitId":"-"},"content":" const ELLIPSES \u003d \u0027...\u0027;"},{"lineNumber":74,"author":{"gitId":"-"},"content":""},{"lineNumber":75,"author":{"gitId":"-"},"content":" return title"},{"lineNumber":76,"author":{"gitId":"-"},"content":" .split(SPLITTER_TEXT)"},{"lineNumber":77,"author":{"gitId":"-"},"content":" .map((word) \u003d\u003e {"},{"lineNumber":78,"author":{"gitId":"-"},"content":" if (word.length \u003e MAX_WORD_LENGTH) {"},{"lineNumber":79,"author":{"gitId":"-"},"content":" return word.substring(0, MAX_WORD_LENGTH - 5).concat(ELLIPSES);"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }"},{"lineNumber":81,"author":{"gitId":"-"},"content":" return word;"},{"lineNumber":82,"author":{"gitId":"-"},"content":" })"},{"lineNumber":83,"author":{"gitId":"-"},"content":" .join(SPLITTER_TEXT);"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }"},{"lineNumber":85,"author":{"gitId":"-"},"content":""},{"lineNumber":86,"author":{"gitId":"-"},"content":" /** Not implemented yet. */"},{"lineNumber":87,"author":{"gitId":"-"},"content":" viewEventInBrowser(id: number, event: Event) {"},{"lineNumber":88,"author":{"gitId":"-"},"content":" this.logger.info(`EventTablesComponent: Opening Event ${id} on Github`);"},{"lineNumber":89,"author":{"gitId":"-"},"content":" // window.open(\u0027https://github.com/\u0027, \u0027_blank\u0027);"},{"lineNumber":90,"author":{"gitId":"-"},"content":" }"},{"lineNumber":91,"author":{"gitId":"-"},"content":""},{"lineNumber":92,"author":{"gitId":"NereusWB922"},"content":" /** Opens dialog to show the event details of the selected week. */"},{"lineNumber":93,"author":{"gitId":"NereusWB922"},"content":" openDialog(eventWeek: EventWeek) {"},{"lineNumber":94,"author":{"gitId":"NereusWB922"},"content":" if (eventWeek.events.length \u003c\u003d 0) {"},{"lineNumber":95,"author":{"gitId":"NereusWB922"},"content":" this.errorHandling.handleError(new NoEventsError());"},{"lineNumber":96,"author":{"gitId":"NereusWB922"},"content":" return;"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }"},{"lineNumber":98,"author":{"gitId":"NereusWB922"},"content":" this.dialog.open(EventWeekDetailsComponent, {"},{"lineNumber":99,"author":{"gitId":"NereusWB922"},"content":" data: {"},{"lineNumber":100,"author":{"gitId":"NereusWB922"},"content":" eventWeek,"},{"lineNumber":101,"author":{"gitId":"NereusWB922"},"content":" expandedColumnsToDisplay: this.expandedColumnsToDisplay"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }"},{"lineNumber":103,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }"},{"lineNumber":105,"author":{"gitId":"-"},"content":""},{"lineNumber":106,"author":{"gitId":"-"},"content":" /** Returns color string of cell. Shade darkens with magnitude of number. */"},{"lineNumber":107,"author":{"gitId":"-"},"content":" colorCell(count: number) {"},{"lineNumber":108,"author":{"gitId":"-"},"content":" if (count \u003d\u003d\u003d 0) {"},{"lineNumber":109,"author":{"gitId":"-"},"content":" return \u0027white\u0027;"},{"lineNumber":110,"author":{"gitId":"-"},"content":" } else if (count \u003e 0 \u0026\u0026 count \u003c\u003d 5) {"},{"lineNumber":111,"author":{"gitId":"-"},"content":" return \u0027pale-green\u0027;"},{"lineNumber":112,"author":{"gitId":"-"},"content":" } else if (count \u003e 6) {"},{"lineNumber":113,"author":{"gitId":"-"},"content":" return \u0027green\u0027;"},{"lineNumber":114,"author":{"gitId":"-"},"content":" }"},{"lineNumber":115,"author":{"gitId":"-"},"content":" }"},{"lineNumber":116,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"NereusWB922":21,"-":95}},{"path":"src/app/activity-dashboard/event-tables/no-events-error.model.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"export class NoEventsError extends Error {"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" constructor() {"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" super(\u0027No events found for this week.\u0027);"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" Object.setPrototypeOf(this, NoEventsError.prototype);"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" }"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":6}},{"path":"src/app/activity-dashboard/event-week-details/event-week-details.component.css","fileType":"css","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":".mat-cell {"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":" white-space: nowrap;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" display: flex;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" align-items: center;"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" justify-content: center;"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" text-align: center;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" padding: 0;"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":".mat-header-cell {"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" display: flex;"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" align-items: center;"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" justify-content: center;"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" text-align: center;"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" padding: 0;"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":".mat-dialog-content {"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" min-width: 500px;"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":20}},{"path":"src/app/activity-dashboard/event-week-details/event-week-details.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"\u003ch2 mat-dialog-title\u003eEvent Week Details\u003c/h2\u003e"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"\u003cmat-dialog-content class\u003d\"mat-typography\"\u003e"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-table [dataSource]\u003d\"data.eventWeek.events\"\u003e"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":" \u003cng-container matColumnDef\u003d\"{{ expandableColumn }}\" *ngFor\u003d\"let expandableColumn of data.expandedColumnsToDisplay\"\u003e"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-header-cell *matHeaderCellDef\u003e{{ expandableColumn }}\u003c/mat-header-cell\u003e"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-cell *matCellDef\u003d\"let property\"\u003e"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" {{ property[expandableColumn] }}"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-cell\u003e"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" \u003c/ng-container\u003e"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-header-row *matHeaderRowDef\u003d\"data.expandedColumnsToDisplay\"\u003e\u003c/mat-header-row\u003e"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" \u003cmat-row *matRowDef\u003d\"let property; columns: data.expandedColumnsToDisplay\"\u003e\u003c/mat-row\u003e"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" \u003c/mat-table\u003e"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":"\u003c/mat-dialog-content\u003e"}],"authorContributionMap":{"NereusWB922":13}},{"path":"src/app/activity-dashboard/event-week-details/event-week-details.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"NereusWB922"},"content":"import { Component, Inject } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { MAT_DIALOG_DATA } from \u0027@angular/material/dialog\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { EventWeek } from \u0027../event-week.model\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"export interface DialogData {"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" eventWeek: EventWeek;"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" expandedColumnsToDisplay: string[];"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":"}"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"@Component({"},{"lineNumber":11,"author":{"gitId":"NereusWB922"},"content":" selector: \u0027app-event-week-detail\u0027,"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":" templateUrl: \u0027./event-week-details.component.html\u0027,"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" styleUrls: [\u0027./event-week-details.component.css\u0027]"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":"})"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":"export class EventWeekDetailsComponent {"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" constructor(@Inject(MAT_DIALOG_DATA) public data: DialogData) {}"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":"}"}],"authorContributionMap":{"NereusWB922":17}},{"path":"src/app/app.module.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { HttpClientModule } from \u0027@angular/common/http\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { ErrorHandler, NgModule, NgZone } from \u0027@angular/core\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { BrowserModule, Title } from \u0027@angular/platform-browser\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { BrowserAnimationsModule } from \u0027@angular/platform-browser/animations\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { Router } from \u0027@angular/router\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { Apollo, ApolloModule } from \u0027apollo-angular\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { HttpLink, HttpLinkModule } from \u0027apollo-angular-link-http\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { InMemoryCache, IntrospectionFragmentMatcher } from \u0027apollo-cache-inmemory\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { ApolloLink } from \u0027apollo-link\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import { setContext } from \u0027apollo-link-context\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import \u0027reflect-metadata\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import graphqlTypes from \u0027../../graphql/graphql-types\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import \u0027../polyfills\u0027;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import { ActivityDashboardModule } from \u0027./activity-dashboard/activity-dashboard.module\u0027;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import { AppRoutingModule } from \u0027./app-routing.module\u0027;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import { AppComponent } from \u0027./app.component\u0027;"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import { AuthModule } from \u0027./auth/auth.module\u0027;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import { UserConfirmationComponent } from \u0027./core/guards/user-confirmation/user-confirmation.component\u0027;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import { AuthService } from \u0027./core/services/auth.service\u0027;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import { ErrorHandlingService } from \u0027./core/services/error-handling.service\u0027;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import { ErrorMessageService } from \u0027./core/services/error-message.service\u0027;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import { AuthServiceFactory } from \u0027./core/services/factories/factory.auth.service\u0027;"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import { GithubServiceFactory } from \u0027./core/services/factories/factory.github.service\u0027;"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import { IssueServiceFactory } from \u0027./core/services/factories/factory.issue.service\u0027;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027./core/services/github.service\u0027;"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import { GithubEventService } from \u0027./core/services/githubevent.service\u0027;"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027./core/services/issue.service\u0027;"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import { LabelService } from \u0027./core/services/label.service\u0027;"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027./core/services/logging.service\u0027;"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import { PhaseService } from \u0027./core/services/phase.service\u0027;"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import { RepoSessionStorageService } from \u0027./core/services/repo-session-storage.service\u0027;"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import { UserService } from \u0027./core/services/user.service\u0027;"},{"lineNumber":33,"author":{"gitId":"-"},"content":"import { IssuesViewerModule } from \u0027./issues-viewer/issues-viewer.module\u0027;"},{"lineNumber":34,"author":{"gitId":"-"},"content":"import { LabelDefinitionPopupComponent } from \u0027./shared/label-definition-popup/label-definition-popup.component\u0027;"},{"lineNumber":35,"author":{"gitId":"-"},"content":"import { HeaderComponent } from \u0027./shared/layout\u0027;"},{"lineNumber":36,"author":{"gitId":"-"},"content":"import { RepoChangeFormComponent } from \u0027./shared/repo-change-form/repo-change-form.component\u0027;"},{"lineNumber":37,"author":{"gitId":"-"},"content":"import { SharedModule } from \u0027./shared/shared.module\u0027;"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"-"},"content":"@NgModule({"},{"lineNumber":40,"author":{"gitId":"Arif-Khalid"},"content":" declarations: [AppComponent, HeaderComponent, UserConfirmationComponent, LabelDefinitionPopupComponent, RepoChangeFormComponent],"},{"lineNumber":41,"author":{"gitId":"-"},"content":" imports: ["},{"lineNumber":42,"author":{"gitId":"-"},"content":" BrowserModule,"},{"lineNumber":43,"author":{"gitId":"-"},"content":" BrowserAnimationsModule,"},{"lineNumber":44,"author":{"gitId":"-"},"content":" AuthModule,"},{"lineNumber":45,"author":{"gitId":"-"},"content":" IssuesViewerModule,"},{"lineNumber":46,"author":{"gitId":"-"},"content":" ActivityDashboardModule,"},{"lineNumber":47,"author":{"gitId":"-"},"content":" SharedModule,"},{"lineNumber":48,"author":{"gitId":"-"},"content":" HttpClientModule,"},{"lineNumber":49,"author":{"gitId":"-"},"content":" AppRoutingModule,"},{"lineNumber":50,"author":{"gitId":"-"},"content":" ApolloModule,"},{"lineNumber":51,"author":{"gitId":"-"},"content":" HttpLinkModule"},{"lineNumber":52,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":53,"author":{"gitId":"-"},"content":" providers: ["},{"lineNumber":54,"author":{"gitId":"-"},"content":" {"},{"lineNumber":55,"author":{"gitId":"-"},"content":" provide: GithubService,"},{"lineNumber":56,"author":{"gitId":"-"},"content":" useFactory: GithubServiceFactory,"},{"lineNumber":57,"author":{"gitId":"-"},"content":" deps: [ErrorHandlingService, Apollo, LoggingService]"},{"lineNumber":58,"author":{"gitId":"-"},"content":" },"},{"lineNumber":59,"author":{"gitId":"-"},"content":" {"},{"lineNumber":60,"author":{"gitId":"-"},"content":" provide: AuthService,"},{"lineNumber":61,"author":{"gitId":"-"},"content":" useFactory: AuthServiceFactory,"},{"lineNumber":62,"author":{"gitId":"-"},"content":" deps: ["},{"lineNumber":63,"author":{"gitId":"-"},"content":" Router,"},{"lineNumber":64,"author":{"gitId":"-"},"content":" NgZone,"},{"lineNumber":65,"author":{"gitId":"-"},"content":" GithubService,"},{"lineNumber":66,"author":{"gitId":"-"},"content":" UserService,"},{"lineNumber":67,"author":{"gitId":"-"},"content":" IssueService,"},{"lineNumber":68,"author":{"gitId":"-"},"content":" LabelService,"},{"lineNumber":69,"author":{"gitId":"-"},"content":" PhaseService,"},{"lineNumber":70,"author":{"gitId":"-"},"content":" GithubEventService,"},{"lineNumber":71,"author":{"gitId":"-"},"content":" Title,"},{"lineNumber":72,"author":{"gitId":"-"},"content":" ErrorHandlingService,"},{"lineNumber":73,"author":{"gitId":"-"},"content":" LoggingService"},{"lineNumber":74,"author":{"gitId":"-"},"content":" ]"},{"lineNumber":75,"author":{"gitId":"-"},"content":" },"},{"lineNumber":76,"author":{"gitId":"-"},"content":" {"},{"lineNumber":77,"author":{"gitId":"-"},"content":" provide: IssueService,"},{"lineNumber":78,"author":{"gitId":"-"},"content":" useFactory: IssueServiceFactory,"},{"lineNumber":79,"author":{"gitId":"-"},"content":" deps: [GithubService, UserService, PhaseService]"},{"lineNumber":80,"author":{"gitId":"-"},"content":" },"},{"lineNumber":81,"author":{"gitId":"-"},"content":" {"},{"lineNumber":82,"author":{"gitId":"-"},"content":" provide: ErrorHandler,"},{"lineNumber":83,"author":{"gitId":"-"},"content":" useClass: ErrorHandlingService"},{"lineNumber":84,"author":{"gitId":"-"},"content":" },"},{"lineNumber":85,"author":{"gitId":"-"},"content":" ErrorMessageService,"},{"lineNumber":86,"author":{"gitId":"-"},"content":" RepoSessionStorageService"},{"lineNumber":87,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":88,"author":{"gitId":"-"},"content":" bootstrap: [AppComponent]"},{"lineNumber":89,"author":{"gitId":"-"},"content":"})"},{"lineNumber":90,"author":{"gitId":"-"},"content":"export class AppModule {"},{"lineNumber":91,"author":{"gitId":"-"},"content":" constructor(private apollo: Apollo, private httpLink: HttpLink, private authService: AuthService, private logger: LoggingService) {"},{"lineNumber":92,"author":{"gitId":"-"},"content":" const URI \u003d \u0027https://api.github.com/graphql\u0027;"},{"lineNumber":93,"author":{"gitId":"-"},"content":" const log \u003d new ApolloLink((operation, forward) \u003d\u003e {"},{"lineNumber":94,"author":{"gitId":"-"},"content":" operation.setContext({ start: performance.now() });"},{"lineNumber":95,"author":{"gitId":"-"},"content":" this.logger.info(\u0027AppModule: GraphQL request\u0027, operation.getContext());"},{"lineNumber":96,"author":{"gitId":"-"},"content":" return forward(operation).map((result) \u003d\u003e {"},{"lineNumber":97,"author":{"gitId":"-"},"content":" const time \u003d performance.now() - operation.getContext().start;"},{"lineNumber":98,"author":{"gitId":"-"},"content":" this.logger.info(\u0027AppModule: GraphQL response\u0027, operation.getContext(), `in ${Math.round(time)}ms`);"},{"lineNumber":99,"author":{"gitId":"-"},"content":" const repo \u003d operation.getContext().response.body.data.repository;"},{"lineNumber":100,"author":{"gitId":"-"},"content":" const item \u003d Object.keys(repo)[0];"},{"lineNumber":101,"author":{"gitId":"-"},"content":" this.logger.debug(\u0027AppModule: GraphQL response body\u0027, item, repo[item].edges.length, repo[item].edges);"},{"lineNumber":102,"author":{"gitId":"-"},"content":" return result;"},{"lineNumber":103,"author":{"gitId":"-"},"content":" });"},{"lineNumber":104,"author":{"gitId":"-"},"content":" });"},{"lineNumber":105,"author":{"gitId":"-"},"content":" const basic \u003d setContext(() \u003d\u003e {"},{"lineNumber":106,"author":{"gitId":"-"},"content":" return { headers: { Accept: \u0027charset\u003dutf-8\u0027 } };"},{"lineNumber":107,"author":{"gitId":"-"},"content":" });"},{"lineNumber":108,"author":{"gitId":"-"},"content":" const auth \u003d setContext(() \u003d\u003e {"},{"lineNumber":109,"author":{"gitId":"-"},"content":" return { headers: { Authorization: `Token ${this.authService.accessToken.getValue()}` } };"},{"lineNumber":110,"author":{"gitId":"-"},"content":" });"},{"lineNumber":111,"author":{"gitId":"-"},"content":" const link \u003d ApolloLink.from([log, basic, auth, this.httpLink.create({ uri: URI })]);"},{"lineNumber":112,"author":{"gitId":"-"},"content":" const fragmentMatcher \u003d new IntrospectionFragmentMatcher({"},{"lineNumber":113,"author":{"gitId":"-"},"content":" introspectionQueryResultData: graphqlTypes"},{"lineNumber":114,"author":{"gitId":"-"},"content":" });"},{"lineNumber":115,"author":{"gitId":"-"},"content":" const cache \u003d new InMemoryCache({ fragmentMatcher });"},{"lineNumber":116,"author":{"gitId":"-"},"content":" this.apollo.create({"},{"lineNumber":117,"author":{"gitId":"-"},"content":" link: link,"},{"lineNumber":118,"author":{"gitId":"-"},"content":" cache: cache"},{"lineNumber":119,"author":{"gitId":"-"},"content":" });"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }"},{"lineNumber":121,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"Arif-Khalid":1,"-":120}},{"path":"src/app/core/models/label.model.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":2,"author":{"gitId":"-"},"content":" * Represents a label and its attributes."},{"lineNumber":3,"author":{"gitId":"-"},"content":" */"},{"lineNumber":4,"author":{"gitId":"-"},"content":"export class Label implements SimpleLabel {"},{"lineNumber":5,"author":{"gitId":"-"},"content":" readonly name: string;"},{"lineNumber":6,"author":{"gitId":"-"},"content":" color: string;"},{"lineNumber":7,"author":{"gitId":"-"},"content":" definition?: string;"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":" constructor(label: { name: string; color: string; definition?: string }) {"},{"lineNumber":10,"author":{"gitId":"nknguyenhc"},"content":" this.name \u003d label.name;"},{"lineNumber":11,"author":{"gitId":"-"},"content":" this.color \u003d label.color;"},{"lineNumber":12,"author":{"gitId":"-"},"content":" this.definition \u003d label.definition;"},{"lineNumber":13,"author":{"gitId":"-"},"content":" }"},{"lineNumber":14,"author":{"gitId":"-"},"content":"}"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Represents a simplified label with name and color"},{"lineNumber":18,"author":{"gitId":"-"},"content":" */"},{"lineNumber":19,"author":{"gitId":"-"},"content":"export type SimpleLabel \u003d {"},{"lineNumber":20,"author":{"gitId":"nknguyenhc"},"content":" name: string;"},{"lineNumber":21,"author":{"gitId":"-"},"content":" color: string;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"};"}],"authorContributionMap":{"nknguyenhc":2,"-":20}},{"path":"src/app/issues-viewer/card-view/card-view.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"nknguyenhc"},"content":"import { AfterViewInit, Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { MatPaginator } from \u0027@angular/material/paginator\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { MatSort } from \u0027@angular/material/sort\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { Observable } from \u0027rxjs\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { GithubUser } from \u0027../../core/models/github-user.model\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../core/models/issue.model\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027../../core/services/issue.service\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { FilterableComponent, FilterableSource } from \u0027../../shared/issue-tables/filterableTypes\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { IssuesDataTable } from \u0027../../shared/issue-tables/IssuesDataTable\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":12,"author":{"gitId":"-"},"content":" selector: \u0027app-card-view\u0027,"},{"lineNumber":13,"author":{"gitId":"-"},"content":" templateUrl: \u0027./card-view.component.html\u0027,"},{"lineNumber":14,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./card-view.component.css\u0027]"},{"lineNumber":15,"author":{"gitId":"-"},"content":"})"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Displays issues as Cards."},{"lineNumber":19,"author":{"gitId":"-"},"content":" */"},{"lineNumber":20,"author":{"gitId":"-"},"content":"export class CardViewComponent implements OnInit, AfterViewInit, OnDestroy, FilterableComponent {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" @Input() headers: string[];"},{"lineNumber":22,"author":{"gitId":"-"},"content":" @Input() assignee?: GithubUser \u003d undefined;"},{"lineNumber":23,"author":{"gitId":"-"},"content":" @Input() filters?: any \u003d undefined;"},{"lineNumber":24,"author":{"gitId":"-"},"content":" @Input() sort?: MatSort \u003d undefined;"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":" @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator;"},{"lineNumber":27,"author":{"gitId":"-"},"content":""},{"lineNumber":28,"author":{"gitId":"-"},"content":" issues: IssuesDataTable;"},{"lineNumber":29,"author":{"gitId":"-"},"content":" issues$: Observable\u003cIssue[]\u003e;"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"Arif-Khalid"},"content":" isLoading \u003d true;"},{"lineNumber":32,"author":{"gitId":"Arif-Khalid"},"content":" issueLength \u003d 0;"},{"lineNumber":33,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":34,"author":{"gitId":"nknguyenhc"},"content":" @Output() issueLengthChange: EventEmitter\u003cNumber\u003e \u003d new EventEmitter\u003cNumber\u003e();"},{"lineNumber":35,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":36,"author":{"gitId":"Arif-Khalid"},"content":" constructor(public element: ElementRef, public issueService: IssueService) {}"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":39,"author":{"gitId":"-"},"content":" this.issues \u003d new IssuesDataTable(this.issueService, this.sort, this.paginator, this.headers, this.assignee, this.filters);"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":" ngAfterViewInit(): void {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" setTimeout(() \u003d\u003e {"},{"lineNumber":44,"author":{"gitId":"-"},"content":" this.issues.loadIssues();"},{"lineNumber":45,"author":{"gitId":"-"},"content":" this.issues$ \u003d this.issues.connect();"},{"lineNumber":46,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":47,"author":{"gitId":"Arif-Khalid"},"content":" // Emit event when issues change"},{"lineNumber":48,"author":{"gitId":"Arif-Khalid"},"content":" this.issues$.subscribe((issues) \u003d\u003e {"},{"lineNumber":49,"author":{"gitId":"Arif-Khalid"},"content":" this.issueLength \u003d issues.length;"},{"lineNumber":50,"author":{"gitId":"nknguyenhc"},"content":" this.issueLengthChange.emit(this.issueLength);"},{"lineNumber":51,"author":{"gitId":"Arif-Khalid"},"content":" });"},{"lineNumber":52,"author":{"gitId":"Arif-Khalid"},"content":""},{"lineNumber":53,"author":{"gitId":"Arif-Khalid"},"content":" // Emit event when loading state changes"},{"lineNumber":54,"author":{"gitId":"Arif-Khalid"},"content":" this.issues.isLoading$.subscribe((isLoadingUpdate) \u003d\u003e {"},{"lineNumber":55,"author":{"gitId":"Arif-Khalid"},"content":" this.isLoading \u003d isLoadingUpdate;"},{"lineNumber":56,"author":{"gitId":"Arif-Khalid"},"content":" });"},{"lineNumber":57,"author":{"gitId":"-"},"content":" });"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }"},{"lineNumber":59,"author":{"gitId":"-"},"content":""},{"lineNumber":60,"author":{"gitId":"-"},"content":" ngOnDestroy(): void {"},{"lineNumber":61,"author":{"gitId":"-"},"content":" setTimeout(() \u003d\u003e {"},{"lineNumber":62,"author":{"gitId":"-"},"content":" this.issues.disconnect();"},{"lineNumber":63,"author":{"gitId":"-"},"content":" });"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }"},{"lineNumber":65,"author":{"gitId":"-"},"content":""},{"lineNumber":66,"author":{"gitId":"-"},"content":" retrieveFilterable(): FilterableSource {"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return this.issues;"},{"lineNumber":68,"author":{"gitId":"-"},"content":" }"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":4,"Arif-Khalid":14,"-":51}},{"path":"src/app/issues-viewer/hidden-users/hidden-users.component.css","fileType":"css","lines":[{"lineNumber":1,"author":{"gitId":"nknguyenhc"},"content":".hidden-users {"},{"lineNumber":2,"author":{"gitId":"nknguyenhc"},"content":" margin: 8px;"},{"lineNumber":3,"author":{"gitId":"nknguyenhc"},"content":" min-width: 150px;"},{"lineNumber":4,"author":{"gitId":"nknguyenhc"},"content":" max-width: 300px;"},{"lineNumber":5,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":6,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":7,"author":{"gitId":"nknguyenhc"},"content":".row-count {"},{"lineNumber":8,"author":{"gitId":"nknguyenhc"},"content":" background-color: rgb(222, 222, 222);"},{"lineNumber":9,"author":{"gitId":"nknguyenhc"},"content":" border-radius: 3px;"},{"lineNumber":10,"author":{"gitId":"nknguyenhc"},"content":" cursor: default;"},{"lineNumber":11,"author":{"gitId":"nknguyenhc"},"content":" padding: 6px;"},{"lineNumber":12,"author":{"gitId":"nknguyenhc"},"content":" color: rgb(0, 0, 0);"},{"lineNumber":13,"author":{"gitId":"nknguyenhc"},"content":" font-weight: 410;"},{"lineNumber":14,"author":{"gitId":"nknguyenhc"},"content":" display: inline-flex;"},{"lineNumber":15,"author":{"gitId":"nknguyenhc"},"content":" font-size: 14px;"},{"lineNumber":16,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":17,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":18,"author":{"gitId":"nknguyenhc"},"content":".mat-card-header {"},{"lineNumber":19,"author":{"gitId":"nknguyenhc"},"content":" display: flex;"},{"lineNumber":20,"author":{"gitId":"nknguyenhc"},"content":" flex-direction: row;"},{"lineNumber":21,"author":{"gitId":"nknguyenhc"},"content":" align-items: center;"},{"lineNumber":22,"author":{"gitId":"nknguyenhc"},"content":" width: 100%;"},{"lineNumber":23,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":24,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":25,"author":{"gitId":"nknguyenhc"},"content":".mat-card {"},{"lineNumber":26,"author":{"gitId":"nknguyenhc"},"content":" margin: 8px 0px;"},{"lineNumber":27,"author":{"gitId":"nknguyenhc"},"content":" height: 40px;"},{"lineNumber":28,"author":{"gitId":"nknguyenhc"},"content":" padding: 10px;"},{"lineNumber":29,"author":{"gitId":"nknguyenhc"},"content":" display: flex;"},{"lineNumber":30,"author":{"gitId":"nknguyenhc"},"content":" align-items: center;"},{"lineNumber":31,"author":{"gitId":"nknguyenhc"},"content":" justify-content: center;"},{"lineNumber":32,"author":{"gitId":"nknguyenhc"},"content":" flex-direction: row;"},{"lineNumber":33,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":34,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":35,"author":{"gitId":"nknguyenhc"},"content":".mat-card-title {"},{"lineNumber":36,"author":{"gitId":"nknguyenhc"},"content":" font-size: 14px;"},{"lineNumber":37,"author":{"gitId":"nknguyenhc"},"content":" text-align: center;"},{"lineNumber":38,"author":{"gitId":"nknguyenhc"},"content":" margin: 0;"},{"lineNumber":39,"author":{"gitId":"nknguyenhc"},"content":" flex-grow: 1;"},{"lineNumber":40,"author":{"gitId":"nknguyenhc"},"content":" margin: 2px;"},{"lineNumber":41,"author":{"gitId":"nknguyenhc"},"content":" word-break: break-word;"},{"lineNumber":42,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":43,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":44,"author":{"gitId":"nknguyenhc"},"content":".mat-card-avatar {"},{"lineNumber":45,"author":{"gitId":"nknguyenhc"},"content":" height: 30px;"},{"lineNumber":46,"author":{"gitId":"nknguyenhc"},"content":" width: 30px;"},{"lineNumber":47,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":48,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":49,"author":{"gitId":"nknguyenhc"},"content":".mat-card-header .mat-card-title {"},{"lineNumber":50,"author":{"gitId":"nknguyenhc"},"content":" font-size: 12px;"},{"lineNumber":51,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":52,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":53,"author":{"gitId":"nknguyenhc"},"content":".scrollable-container {"},{"lineNumber":54,"author":{"gitId":"nknguyenhc"},"content":" height: 67vh;"},{"lineNumber":55,"author":{"gitId":"nknguyenhc"},"content":" overflow: auto;"},{"lineNumber":56,"author":{"gitId":"nknguyenhc"},"content":" scrollbar-width: none;"},{"lineNumber":57,"author":{"gitId":"nknguyenhc"},"content":" -ms-overflow-style: none;"},{"lineNumber":58,"author":{"gitId":"nknguyenhc"},"content":" position: relative;"},{"lineNumber":59,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":60,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":61,"author":{"gitId":"nknguyenhc"},"content":".scrollable-containers::-webkit-scrollbar {"},{"lineNumber":62,"author":{"gitId":"nknguyenhc"},"content":" display: none;"},{"lineNumber":63,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":64,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":65,"author":{"gitId":"nknguyenhc"},"content":".scrollable-container::before,"},{"lineNumber":66,"author":{"gitId":"nknguyenhc"},"content":".scrollable-container::after {"},{"lineNumber":67,"author":{"gitId":"nknguyenhc"},"content":" pointer-events: none;"},{"lineNumber":68,"author":{"gitId":"nknguyenhc"},"content":" content: \u0027\u0027;"},{"lineNumber":69,"author":{"gitId":"nknguyenhc"},"content":" z-index: 2;"},{"lineNumber":70,"author":{"gitId":"nknguyenhc"},"content":" height: 6px;"},{"lineNumber":71,"author":{"gitId":"nknguyenhc"},"content":" width: 100%;"},{"lineNumber":72,"author":{"gitId":"nknguyenhc"},"content":" display: block;"},{"lineNumber":73,"author":{"gitId":"nknguyenhc"},"content":" background-image: linear-gradient(to bottom, white 66%, transparent);"},{"lineNumber":74,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":75,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":76,"author":{"gitId":"nknguyenhc"},"content":".scrollable-container::before {"},{"lineNumber":77,"author":{"gitId":"nknguyenhc"},"content":" position: absolute;"},{"lineNumber":78,"author":{"gitId":"nknguyenhc"},"content":"}"},{"lineNumber":79,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":80,"author":{"gitId":"nknguyenhc"},"content":".scrollable-container::after {"},{"lineNumber":81,"author":{"gitId":"nknguyenhc"},"content":" position: sticky;"},{"lineNumber":82,"author":{"gitId":"nknguyenhc"},"content":"}"}],"authorContributionMap":{"nknguyenhc":82}},{"path":"src/app/issues-viewer/hidden-users/hidden-users.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"nknguyenhc"},"content":"\u003cdiv *ngIf\u003d\"users.length \u003e 0\" class\u003d\"hidden-users\"\u003e"},{"lineNumber":2,"author":{"gitId":"nknguyenhc"},"content":" \u003cmat-card\u003e"},{"lineNumber":3,"author":{"gitId":"nknguyenhc"},"content":" \u003cmat-card-title\u003eHidden users\u003c/mat-card-title\u003e"},{"lineNumber":4,"author":{"gitId":"nknguyenhc"},"content":" \u003cdiv class\u003d\"row-count\"\u003e{{ users.length }}\u003c/div\u003e"},{"lineNumber":5,"author":{"gitId":"nknguyenhc"},"content":" \u003c/mat-card\u003e"},{"lineNumber":6,"author":{"gitId":"nknguyenhc"},"content":" \u003cdiv class\u003d\"scrollable-container\"\u003e"},{"lineNumber":7,"author":{"gitId":"nknguyenhc"},"content":" \u003cdiv *ngFor\u003d\"let user of users\"\u003e"},{"lineNumber":8,"author":{"gitId":"nknguyenhc"},"content":" \u003cmat-card\u003e"},{"lineNumber":9,"author":{"gitId":"nknguyenhc"},"content":" \u003cmar-card-header class\u003d\"mat-card-header\"\u003e"},{"lineNumber":10,"author":{"gitId":"nknguyenhc"},"content":" \u003cdiv"},{"lineNumber":11,"author":{"gitId":"nknguyenhc"},"content":" mat-card-avatar"},{"lineNumber":12,"author":{"gitId":"nknguyenhc"},"content":" [ngStyle]\u003d\"{"},{"lineNumber":13,"author":{"gitId":"nknguyenhc"},"content":" background: \u0027url(\u0027 + user.avatar_url + \u0027)\u0027,"},{"lineNumber":14,"author":{"gitId":"nknguyenhc"},"content":" \u0027background-size\u0027: \u002730px\u0027"},{"lineNumber":15,"author":{"gitId":"nknguyenhc"},"content":" }\""},{"lineNumber":16,"author":{"gitId":"nknguyenhc"},"content":" \u003e\u003c/div\u003e"},{"lineNumber":17,"author":{"gitId":"nknguyenhc"},"content":" \u003cmat-card-title\u003e{{ user.login }}\u003c/mat-card-title\u003e"},{"lineNumber":18,"author":{"gitId":"nknguyenhc"},"content":" \u003c/mar-card-header\u003e"},{"lineNumber":19,"author":{"gitId":"nknguyenhc"},"content":" \u003c/mat-card\u003e"},{"lineNumber":20,"author":{"gitId":"nknguyenhc"},"content":" \u003c/div\u003e"},{"lineNumber":21,"author":{"gitId":"nknguyenhc"},"content":" \u003c/div\u003e"},{"lineNumber":22,"author":{"gitId":"nknguyenhc"},"content":"\u003c/div\u003e"}],"authorContributionMap":{"nknguyenhc":22}},{"path":"src/app/issues-viewer/hidden-users/hidden-users.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"nknguyenhc"},"content":"import { Component, Input } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"nknguyenhc"},"content":"import { GithubUser } from \u0027../../core/models/github-user.model\u0027;"},{"lineNumber":3,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":4,"author":{"gitId":"nknguyenhc"},"content":"@Component({"},{"lineNumber":5,"author":{"gitId":"nknguyenhc"},"content":" selector: \u0027app-hidden-users\u0027,"},{"lineNumber":6,"author":{"gitId":"nknguyenhc"},"content":" templateUrl: \u0027./hidden-users.component.html\u0027,"},{"lineNumber":7,"author":{"gitId":"nknguyenhc"},"content":" styleUrls: [\u0027./hidden-users.component.css\u0027]"},{"lineNumber":8,"author":{"gitId":"nknguyenhc"},"content":"})"},{"lineNumber":9,"author":{"gitId":"nknguyenhc"},"content":"export class HiddenUsersComponent {"},{"lineNumber":10,"author":{"gitId":"nknguyenhc"},"content":" @Input() users: GithubUser[] \u003d [];"},{"lineNumber":11,"author":{"gitId":"nknguyenhc"},"content":"}"}],"authorContributionMap":{"nknguyenhc":11}},{"path":"src/app/issues-viewer/issues-viewer.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cdiv\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"loading-spinner\" *ngIf\u003d\"this.phaseService.isChangingRepo | async; else elseBlock\"\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \u003cmat-progress-spinner color\u003d\"primary\" mode\u003d\"indeterminate\" diameter\u003d\"50\" strokeWidth\u003d\"5\"\u003e \u003c/mat-progress-spinner\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cng-template #elseBlock\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003capp-filter-bar [views$]\u003d\"views\" #filterbar\u003e\u003c/app-filter-bar\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"wrapper\"\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003capp-card-view"},{"lineNumber":11,"author":{"gitId":"-"},"content":" *ngFor\u003d\"let assignee of assignees\""},{"lineNumber":12,"author":{"gitId":"-"},"content":" class\u003d\"issue-table\""},{"lineNumber":13,"author":{"gitId":"Arif-Khalid"},"content":" #card"},{"lineNumber":14,"author":{"gitId":"Arif-Khalid"},"content":" [ngStyle]\u003d\"{ display: card.isLoading || card.issueLength \u003e 0 ? \u0027initial\u0027 : \u0027none\u0027 }\""},{"lineNumber":15,"author":{"gitId":"-"},"content":" [assignee]\u003d\"assignee\""},{"lineNumber":16,"author":{"gitId":"-"},"content":" [headers]\u003d\"this.displayedColumns\""},{"lineNumber":17,"author":{"gitId":"-"},"content":" [sort]\u003d\"filterbar.matSort\""},{"lineNumber":18,"author":{"gitId":"nknguyenhc"},"content":" (issueLengthChange)\u003d\"updateHiddenUsers($event, assignee)\""},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003e\u003c/app-card-view\u003e"},{"lineNumber":20,"author":{"gitId":"Arif-Khalid"},"content":" \u003capp-card-view"},{"lineNumber":21,"author":{"gitId":"Arif-Khalid"},"content":" class\u003d\"issue-table\""},{"lineNumber":22,"author":{"gitId":"Arif-Khalid"},"content":" #card"},{"lineNumber":23,"author":{"gitId":"Arif-Khalid"},"content":" [ngStyle]\u003d\"{ display: card.isLoading || card.issueLength \u003e 0 ? \u0027initial\u0027 : \u0027none\u0027 }\""},{"lineNumber":24,"author":{"gitId":"Arif-Khalid"},"content":" [headers]\u003d\"this.displayedColumns\""},{"lineNumber":25,"author":{"gitId":"Arif-Khalid"},"content":" [sort]\u003d\"filterbar.matSort\""},{"lineNumber":26,"author":{"gitId":"Arif-Khalid"},"content":" \u003e"},{"lineNumber":27,"author":{"gitId":"Arif-Khalid"},"content":" \u003c/app-card-view\u003e"},{"lineNumber":28,"author":{"gitId":"nknguyenhc"},"content":" \u003capp-hidden-users [users]\u003d\"hiddenAssignees\"\u003e\u003c/app-hidden-users\u003e"},{"lineNumber":29,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \u003c/ng-template\u003e"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003c/div\u003e"}],"authorContributionMap":{"nknguyenhc":2,"Arif-Khalid":10,"-":19}},{"path":"src/app/issues-viewer/issues-viewer.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { AfterViewInit, Component, OnDestroy, OnInit, QueryList, ViewChild, ViewChildren } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { BehaviorSubject, of, Subscription } from \u0027rxjs\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { GithubUser } from \u0027../core/models/github-user.model\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { Repo } from \u0027../core/models/repo.model\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { ErrorMessageService } from \u0027../core/services/error-message.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { GithubService } from \u0027../core/services/github.service\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027../core/services/issue.service\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { LabelService } from \u0027../core/services/label.service\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import { MilestoneService } from \u0027../core/services/milestone.service\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import { PhaseService } from \u0027../core/services/phase.service\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import { TABLE_COLUMNS } from \u0027../shared/issue-tables/issue-tables-columns\u0027;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import { CardViewComponent } from \u0027./card-view/card-view.component\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":15,"author":{"gitId":"-"},"content":" selector: \u0027app-issues-viewer\u0027,"},{"lineNumber":16,"author":{"gitId":"-"},"content":" templateUrl: \u0027./issues-viewer.component.html\u0027,"},{"lineNumber":17,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./issues-viewer.component.css\u0027]"},{"lineNumber":18,"author":{"gitId":"-"},"content":"})"},{"lineNumber":19,"author":{"gitId":"-"},"content":"export class IssuesViewerComponent implements OnInit, AfterViewInit, OnDestroy {"},{"lineNumber":20,"author":{"gitId":"-"},"content":" readonly displayedColumns \u003d [TABLE_COLUMNS.ID, TABLE_COLUMNS.TITLE, TABLE_COLUMNS.ASSIGNEE, TABLE_COLUMNS.LABEL];"},{"lineNumber":21,"author":{"gitId":"-"},"content":""},{"lineNumber":22,"author":{"gitId":"-"},"content":" /** Observes for any change in repo*/"},{"lineNumber":23,"author":{"gitId":"-"},"content":" repoChangeSubscription: Subscription;"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":" /** Observes for any change in the cardviews */"},{"lineNumber":26,"author":{"gitId":"-"},"content":" viewChange: Subscription;"},{"lineNumber":27,"author":{"gitId":"-"},"content":""},{"lineNumber":28,"author":{"gitId":"-"},"content":" /** Users to show as columns */"},{"lineNumber":29,"author":{"gitId":"-"},"content":" assignees: GithubUser[];"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"nknguyenhc"},"content":" /** The list of users with 0 issues (hidden) */"},{"lineNumber":32,"author":{"gitId":"nknguyenhc"},"content":" hiddenAssignees: GithubUser[] \u003d [];"},{"lineNumber":33,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":34,"author":{"gitId":"-"},"content":" @ViewChildren(CardViewComponent) cardViews: QueryList\u003cCardViewComponent\u003e;"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":" views \u003d new BehaviorSubject\u003cQueryList\u003cCardViewComponent\u003e\u003e(undefined);"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":" constructor("},{"lineNumber":39,"author":{"gitId":"-"},"content":" public phaseService: PhaseService,"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public githubService: GithubService,"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public issueService: IssueService,"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public labelService: LabelService,"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public milestoneService: MilestoneService"},{"lineNumber":44,"author":{"gitId":"-"},"content":" ) {"},{"lineNumber":45,"author":{"gitId":"-"},"content":" this.repoChangeSubscription \u003d this.phaseService.repoChanged$.subscribe((newRepo) \u003d\u003e {"},{"lineNumber":46,"author":{"gitId":"-"},"content":" this.issueService.reset(false);"},{"lineNumber":47,"author":{"gitId":"-"},"content":" this.labelService.reset();"},{"lineNumber":48,"author":{"gitId":"-"},"content":" this.initialize();"},{"lineNumber":49,"author":{"gitId":"-"},"content":" });"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }"},{"lineNumber":51,"author":{"gitId":"-"},"content":""},{"lineNumber":52,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":53,"author":{"gitId":"-"},"content":" this.initialize();"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":" ngAfterViewInit(): void {"},{"lineNumber":57,"author":{"gitId":"-"},"content":" this.viewChange \u003d this.cardViews.changes.subscribe((x) \u003d\u003e this.views.next(x));"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }"},{"lineNumber":59,"author":{"gitId":"-"},"content":""},{"lineNumber":60,"author":{"gitId":"-"},"content":" ngOnDestroy(): void {"},{"lineNumber":61,"author":{"gitId":"-"},"content":" this.repoChangeSubscription.unsubscribe();"},{"lineNumber":62,"author":{"gitId":"-"},"content":" this.viewChange.unsubscribe();"},{"lineNumber":63,"author":{"gitId":"-"},"content":" }"},{"lineNumber":64,"author":{"gitId":"-"},"content":""},{"lineNumber":65,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * Fetch and initialize all information from repository to populate Issue Dashboard."},{"lineNumber":67,"author":{"gitId":"-"},"content":" */"},{"lineNumber":68,"author":{"gitId":"-"},"content":" private initialize() {"},{"lineNumber":69,"author":{"gitId":"-"},"content":" this.checkIfValidRepository().subscribe((isValidRepository) \u003d\u003e {"},{"lineNumber":70,"author":{"gitId":"-"},"content":" if (!isValidRepository) {"},{"lineNumber":71,"author":{"gitId":"-"},"content":" throw new Error(ErrorMessageService.repositoryNotPresentMessage());"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }"},{"lineNumber":73,"author":{"gitId":"-"},"content":" });"},{"lineNumber":74,"author":{"gitId":"-"},"content":""},{"lineNumber":75,"author":{"gitId":"-"},"content":" // Fetch assignees"},{"lineNumber":76,"author":{"gitId":"-"},"content":" this.assignees \u003d [];"},{"lineNumber":77,"author":{"gitId":"nknguyenhc"},"content":" this.hiddenAssignees \u003d [];"},{"lineNumber":78,"author":{"gitId":"-"},"content":""},{"lineNumber":79,"author":{"gitId":"-"},"content":" this.githubService.getUsersAssignable().subscribe((x) \u003d\u003e (this.assignees \u003d x));"},{"lineNumber":80,"author":{"gitId":"-"},"content":""},{"lineNumber":81,"author":{"gitId":"-"},"content":" // Fetch issues"},{"lineNumber":82,"author":{"gitId":"-"},"content":" this.issueService.reloadAllIssues();"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }"},{"lineNumber":84,"author":{"gitId":"-"},"content":""},{"lineNumber":85,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":86,"author":{"gitId":"-"},"content":" * Checks if our current repository available on phase service is indeed a valid repository"},{"lineNumber":87,"author":{"gitId":"-"},"content":" */"},{"lineNumber":88,"author":{"gitId":"-"},"content":" private checkIfValidRepository() {"},{"lineNumber":89,"author":{"gitId":"-"},"content":" const currentRepo \u003d this.phaseService.currentRepo;"},{"lineNumber":90,"author":{"gitId":"-"},"content":""},{"lineNumber":91,"author":{"gitId":"-"},"content":" if (Repo.isInvalidRepoName(currentRepo)) {"},{"lineNumber":92,"author":{"gitId":"-"},"content":" return of(false);"},{"lineNumber":93,"author":{"gitId":"-"},"content":" }"},{"lineNumber":94,"author":{"gitId":"-"},"content":""},{"lineNumber":95,"author":{"gitId":"-"},"content":" return this.githubService.isRepositoryPresent(currentRepo.owner, currentRepo.name);"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }"},{"lineNumber":97,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":98,"author":{"gitId":"nknguyenhc"},"content":" /**"},{"lineNumber":99,"author":{"gitId":"nknguyenhc"},"content":" * Update the list of hidden user based on the new info."},{"lineNumber":100,"author":{"gitId":"nknguyenhc"},"content":" * @param issueLength The number of issues assigned to this user."},{"lineNumber":101,"author":{"gitId":"nknguyenhc"},"content":" * @param assignee The assignee."},{"lineNumber":102,"author":{"gitId":"nknguyenhc"},"content":" */"},{"lineNumber":103,"author":{"gitId":"nknguyenhc"},"content":" updateHiddenUsers(issueLength: number, assignee: GithubUser) {"},{"lineNumber":104,"author":{"gitId":"nknguyenhc"},"content":" if (issueLength \u003d\u003d\u003d 0) {"},{"lineNumber":105,"author":{"gitId":"nknguyenhc"},"content":" this.updateHiddenUser(assignee);"},{"lineNumber":106,"author":{"gitId":"nknguyenhc"},"content":" } else {"},{"lineNumber":107,"author":{"gitId":"nknguyenhc"},"content":" this.removeHiddenUser(assignee);"},{"lineNumber":108,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":109,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":110,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":111,"author":{"gitId":"nknguyenhc"},"content":" private updateHiddenUser(assignee: GithubUser) {"},{"lineNumber":112,"author":{"gitId":"nknguyenhc"},"content":" if (!this.hiddenAssignees.includes(assignee)) {"},{"lineNumber":113,"author":{"gitId":"nknguyenhc"},"content":" this.hiddenAssignees.push(assignee);"},{"lineNumber":114,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":115,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":116,"author":{"gitId":"nknguyenhc"},"content":""},{"lineNumber":117,"author":{"gitId":"nknguyenhc"},"content":" private removeHiddenUser(assignee: GithubUser) {"},{"lineNumber":118,"author":{"gitId":"nknguyenhc"},"content":" this.hiddenAssignees \u003d this.hiddenAssignees.filter((user) \u003d\u003e user !\u003d\u003d assignee);"},{"lineNumber":119,"author":{"gitId":"nknguyenhc"},"content":" }"},{"lineNumber":120,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":27,"-":93}},{"path":"src/app/issues-viewer/issues-viewer.module.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { NgModule } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { FilterBarModule } from \u0027../shared/filter-bar/filter-bar.module\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { IssuesPrCardModule } from \u0027../shared/issue-pr-card/issue-pr-card.module\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { SharedModule } from \u0027../shared/shared.module\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { CardViewComponent } from \u0027./card-view/card-view.component\u0027;"},{"lineNumber":6,"author":{"gitId":"nknguyenhc"},"content":"import { HiddenUsersComponent } from \u0027./hidden-users/hidden-users.component\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import { IssuesViewerRoutingModule } from \u0027./issues-viewer-routing.module\u0027;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import { IssuesViewerComponent } from \u0027./issues-viewer.component\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"@NgModule({"},{"lineNumber":11,"author":{"gitId":"-"},"content":" imports: [FilterBarModule, IssuesViewerRoutingModule, IssuesPrCardModule, SharedModule],"},{"lineNumber":12,"author":{"gitId":"nknguyenhc"},"content":" declarations: [IssuesViewerComponent, CardViewComponent, HiddenUsersComponent],"},{"lineNumber":13,"author":{"gitId":"-"},"content":" exports: [IssuesViewerComponent, CardViewComponent]"},{"lineNumber":14,"author":{"gitId":"-"},"content":"})"},{"lineNumber":15,"author":{"gitId":"-"},"content":"export class IssuesViewerModule {}"}],"authorContributionMap":{"nknguyenhc":2,"-":13}},{"path":"src/app/shared/filter-bar/label-filter-bar/label-filter-bar.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cbutton mat-stroked-button *ngIf\u003d\"loaded\" [matMenuTriggerFor]\u003d\"menu\"\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":" {{ selectedLabelNames.length \u003d\u003d 0 ? \u0027All\u0027 : selectedLabelNames.length }} Selected | {{ hiddenLabelNames?.size || 0 }} Hidden ▾"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/button\u003e"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cbutton mat-stroked-button disabled *ngIf\u003d\"!loaded\" color\u003d\"accent\"\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cmat-progress-bar mode\u003d\"query\"\u003e\u003c/mat-progress-bar\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":"\u003c/button\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003cmat-menu #menu\u003d\"matMenu\" class\u003d\"popupmenu\"\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cdiv (click)\u003d\"$event.stopPropagation()\" class\u003d\"popup-container\"\u003e"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cmat-form-field appearance\u003d\"standard\" class\u003d\"input-field\"\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cmat-label\u003eLabels\u003c/mat-label\u003e"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003cinput #input matInput placeholder\u003d\"Find labels\" /\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003c/mat-form-field\u003e"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003cbutton mat-button (click)\u003d\"removeAllSelection()\"\u003eRemove all\u003c/button\u003e"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"!hasLabels(input.value)\" class\u003d\"no-labels\"\u003eNo Labels Found!\u003c/div\u003e"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"scroll-container-wrapper\"\u003e"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"scroll-container\"\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \u003cmat-selection-list [(ngModel)]\u003d\"selectedLabelNames\" (selectionChange)\u003d\"updateSelection()\"\u003e"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cmat-list-option"},{"lineNumber":24,"author":{"gitId":"-"},"content":" #option"},{"lineNumber":25,"author":{"gitId":"-"},"content":" *ngFor\u003d\"let label of this.labels$ | async\""},{"lineNumber":26,"author":{"gitId":"-"},"content":" [value]\u003d\"label.name\""},{"lineNumber":27,"author":{"gitId":"-"},"content":" [selected]\u003d\"selectedLabelNames.includes(label.name)\""},{"lineNumber":28,"author":{"gitId":"-"},"content":" class\u003d\"list-option\""},{"lineNumber":29,"author":{"gitId":"-"},"content":" [class.hidden]\u003d\"filter(input.value, label.name)\""},{"lineNumber":30,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":31,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"flexbox-container\"\u003e"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003cbutton mat-icon-button *ngIf\u003d\"!hiddenLabelNames.has(label.name)\" (click)\u003d\"hide(label.name); $event.stopPropagation()\"\u003e"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003evisibility\u003c/mat-icon\u003e"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \u003cbutton mat-icon-button *ngIf\u003d\"hiddenLabelNames.has(label.name)\" (click)\u003d\"show(label.name); $event.stopPropagation()\"\u003e"},{"lineNumber":36,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003evisibility_off\u003c/mat-icon\u003e"},{"lineNumber":37,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":38,"author":{"gitId":"-"},"content":" \u003cmat-chip"},{"lineNumber":39,"author":{"gitId":"-"},"content":" [ngStyle]\u003d\"labelService.setLabelStyle(label.color)\""},{"lineNumber":40,"author":{"gitId":"-"},"content":" [disabled]\u003d\"hiddenLabelNames.has(label.name)\""},{"lineNumber":41,"author":{"gitId":"-"},"content":" (click)\u003d\"simulateClick(option); $event.stopPropagation()\""},{"lineNumber":42,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":43,"author":{"gitId":"nknguyenhc"},"content":" {{ label.name }}"},{"lineNumber":44,"author":{"gitId":"-"},"content":" \u003c/mat-chip\u003e"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":46,"author":{"gitId":"-"},"content":" \u003c/mat-list-option\u003e"},{"lineNumber":47,"author":{"gitId":"-"},"content":" \u003c/mat-selection-list\u003e"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":51,"author":{"gitId":"-"},"content":"\u003c/mat-menu\u003e"}],"authorContributionMap":{"nknguyenhc":1,"-":50}},{"path":"src/app/shared/filter-bar/label-filter-bar/label-filter-bar.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { AfterViewInit, Component, Input, OnDestroy, OnInit, ViewChild } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { MatListOption, MatSelectionList } from \u0027@angular/material/list\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { BehaviorSubject, Observable, Subscription } from \u0027rxjs\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { SimpleLabel } from \u0027../../../core/models/label.model\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { LabelService } from \u0027../../../core/services/label.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027../../../core/services/logging.service\u0027;"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":9,"author":{"gitId":"-"},"content":" selector: \u0027app-label-filter-bar\u0027,"},{"lineNumber":10,"author":{"gitId":"-"},"content":" templateUrl: \u0027./label-filter-bar.component.html\u0027,"},{"lineNumber":11,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./label-filter-bar.component.css\u0027]"},{"lineNumber":12,"author":{"gitId":"-"},"content":"})"},{"lineNumber":13,"author":{"gitId":"-"},"content":"export class LabelFilterBarComponent implements OnInit, AfterViewInit, OnDestroy {"},{"lineNumber":14,"author":{"gitId":"-"},"content":" @Input() selectedLabels: BehaviorSubject\u003cstring[]\u003e;"},{"lineNumber":15,"author":{"gitId":"-"},"content":" @Input() hiddenLabels: BehaviorSubject\u003cSet\u003cstring\u003e\u003e;"},{"lineNumber":16,"author":{"gitId":"-"},"content":" @ViewChild(MatSelectionList) matSelectionList;"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":" labels$: Observable\u003cSimpleLabel[]\u003e;"},{"lineNumber":19,"author":{"gitId":"-"},"content":" allLabels: SimpleLabel[];"},{"lineNumber":20,"author":{"gitId":"-"},"content":" selectedLabelNames: string[] \u003d [];"},{"lineNumber":21,"author":{"gitId":"-"},"content":" hiddenLabelNames: Set\u003cstring\u003e \u003d new Set();"},{"lineNumber":22,"author":{"gitId":"-"},"content":" loaded \u003d false;"},{"lineNumber":23,"author":{"gitId":"-"},"content":""},{"lineNumber":24,"author":{"gitId":"-"},"content":" labelSubscription: Subscription;"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":" constructor(private labelService: LabelService, private logger: LoggingService) {}"},{"lineNumber":27,"author":{"gitId":"-"},"content":""},{"lineNumber":28,"author":{"gitId":"-"},"content":" ngOnInit() {"},{"lineNumber":29,"author":{"gitId":"-"},"content":" this.loaded \u003d false;"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":" ngAfterViewInit(): void {"},{"lineNumber":33,"author":{"gitId":"-"},"content":" setTimeout(() \u003d\u003e {"},{"lineNumber":34,"author":{"gitId":"-"},"content":" this.load();"},{"lineNumber":35,"author":{"gitId":"-"},"content":" this.labels$ \u003d this.labelService.connect();"},{"lineNumber":36,"author":{"gitId":"-"},"content":" this.labels$.subscribe((labels) \u003d\u003e {"},{"lineNumber":37,"author":{"gitId":"-"},"content":" this.allLabels \u003d labels;"},{"lineNumber":38,"author":{"gitId":"-"},"content":" });"},{"lineNumber":39,"author":{"gitId":"-"},"content":" });"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":" ngOnDestroy(): void {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" this.labelSubscription?.unsubscribe();"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":" hide(label: string): void {"},{"lineNumber":47,"author":{"gitId":"-"},"content":" if (this.hiddenLabelNames.has(label)) {"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"-"},"content":" this.hiddenLabelNames.add(label);"},{"lineNumber":52,"author":{"gitId":"-"},"content":" this.hiddenLabels.next(this.hiddenLabelNames);"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }"},{"lineNumber":54,"author":{"gitId":"-"},"content":""},{"lineNumber":55,"author":{"gitId":"-"},"content":" /** Show labels that were hidden */"},{"lineNumber":56,"author":{"gitId":"-"},"content":" show(label: string): void {"},{"lineNumber":57,"author":{"gitId":"-"},"content":" if (!this.hiddenLabelNames.has(label)) {"},{"lineNumber":58,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }"},{"lineNumber":60,"author":{"gitId":"-"},"content":" this.hiddenLabelNames.delete(label);"},{"lineNumber":61,"author":{"gitId":"-"},"content":" this.hiddenLabels.next(this.hiddenLabelNames);"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }"},{"lineNumber":63,"author":{"gitId":"-"},"content":""},{"lineNumber":64,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":65,"author":{"gitId":"-"},"content":" * chip as of the current project version consumes click events"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * this method is used as an workaround the issue."},{"lineNumber":67,"author":{"gitId":"-"},"content":" * https://github.com/angular/components/issues/19759"},{"lineNumber":68,"author":{"gitId":"-"},"content":" */"},{"lineNumber":69,"author":{"gitId":"-"},"content":" simulateClick(el: MatListOption): void {"},{"lineNumber":70,"author":{"gitId":"-"},"content":" if (el.disabled) {"},{"lineNumber":71,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }"},{"lineNumber":73,"author":{"gitId":"-"},"content":" el.toggle();"},{"lineNumber":74,"author":{"gitId":"-"},"content":" this.selectedLabels.next(this.selectedLabelNames);"},{"lineNumber":75,"author":{"gitId":"-"},"content":" }"},{"lineNumber":76,"author":{"gitId":"-"},"content":""},{"lineNumber":77,"author":{"gitId":"-"},"content":" /** loads in the labels in the repository */"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public load() {"},{"lineNumber":79,"author":{"gitId":"-"},"content":" this.labelService.startPollLabels();"},{"lineNumber":80,"author":{"gitId":"-"},"content":" this.labelSubscription \u003d this.labelService.fetchLabels().subscribe("},{"lineNumber":81,"author":{"gitId":"-"},"content":" (response) \u003d\u003e {"},{"lineNumber":82,"author":{"gitId":"-"},"content":" this.logger.debug(\u0027LabelFilterBarComponent: Fetched labels from Github\u0027);"},{"lineNumber":83,"author":{"gitId":"-"},"content":" },"},{"lineNumber":84,"author":{"gitId":"-"},"content":" (err) \u003d\u003e {},"},{"lineNumber":85,"author":{"gitId":"-"},"content":" () \u003d\u003e {"},{"lineNumber":86,"author":{"gitId":"-"},"content":" this.loaded \u003d true;"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }"},{"lineNumber":88,"author":{"gitId":"-"},"content":" );"},{"lineNumber":89,"author":{"gitId":"-"},"content":" }"},{"lineNumber":90,"author":{"gitId":"-"},"content":""},{"lineNumber":91,"author":{"gitId":"-"},"content":" filter(filter: string, target: string): boolean {"},{"lineNumber":92,"author":{"gitId":"-"},"content":" return !target.toLowerCase().includes(filter.toLowerCase());"},{"lineNumber":93,"author":{"gitId":"-"},"content":" }"},{"lineNumber":94,"author":{"gitId":"-"},"content":""},{"lineNumber":95,"author":{"gitId":"-"},"content":" hasLabels(filter: string): boolean {"},{"lineNumber":96,"author":{"gitId":"-"},"content":" if (this.allLabels \u003d\u003d\u003d undefined || this.allLabels.length \u003d\u003d\u003d 0) {"},{"lineNumber":97,"author":{"gitId":"-"},"content":" return false;"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }"},{"lineNumber":99,"author":{"gitId":"nknguyenhc"},"content":" return this.allLabels.some((label) \u003d\u003e !this.filter(filter, label.name));"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }"},{"lineNumber":101,"author":{"gitId":"-"},"content":""},{"lineNumber":102,"author":{"gitId":"-"},"content":" updateSelection(): void {"},{"lineNumber":103,"author":{"gitId":"-"},"content":" this.selectedLabels.next(this.selectedLabelNames);"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }"},{"lineNumber":105,"author":{"gitId":"-"},"content":""},{"lineNumber":106,"author":{"gitId":"-"},"content":" removeAllSelection(): void {"},{"lineNumber":107,"author":{"gitId":"-"},"content":" this.matSelectionList.deselectAll();"},{"lineNumber":108,"author":{"gitId":"-"},"content":" this.updateSelection();"},{"lineNumber":109,"author":{"gitId":"-"},"content":" }"},{"lineNumber":110,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":1,"-":109}},{"path":"src/app/shared/issue-pr-card/issue-pr-card-labels/issue-pr-card-labels.component.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Component, Input } from \u0027@angular/core\u0027;"},{"lineNumber":2,"author":{"gitId":"nknguyenhc"},"content":"import { GithubLabel } from \u0027../../../core/models/github/github-label.model\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { LabelService } from \u0027../../../core/services/label.service\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"-"},"content":"@Component({"},{"lineNumber":6,"author":{"gitId":"-"},"content":" selector: \u0027app-issue-pr-card-labels\u0027,"},{"lineNumber":7,"author":{"gitId":"-"},"content":" templateUrl: \u0027./issue-pr-card-labels.component.html\u0027,"},{"lineNumber":8,"author":{"gitId":"-"},"content":" styleUrls: [\u0027./issue-pr-card-labels.component.css\u0027]"},{"lineNumber":9,"author":{"gitId":"-"},"content":"})"},{"lineNumber":10,"author":{"gitId":"-"},"content":"export class IssuePrCardLabelsComponent {"},{"lineNumber":11,"author":{"gitId":"nknguyenhc"},"content":" @Input() labels: GithubLabel[];"},{"lineNumber":12,"author":{"gitId":"nknguyenhc"},"content":" @Input() labelSet: Set\u003cstring\u003e;"},{"lineNumber":13,"author":{"gitId":"-"},"content":" constructor(public labelService: LabelService) {}"},{"lineNumber":14,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"nknguyenhc":3,"-":11}},{"path":"src/app/shared/layout/header.component.html","fileType":"html","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003cmat-toolbar color\u003d\"primary\" style\u003d\"position: sticky; position: -webkit-sticky; top: 0; z-index: 1000\"\u003e"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":3,"author":{"gitId":"-"},"content":" *ngIf\u003d\"isBackButtonShown()\""},{"lineNumber":4,"author":{"gitId":"-"},"content":" mat-icon-button"},{"lineNumber":5,"author":{"gitId":"-"},"content":" class\u003d\"mat-toolbar mat-primary back-button\""},{"lineNumber":6,"author":{"gitId":"-"},"content":" style\u003d\"transform: scale(0.9)\""},{"lineNumber":7,"author":{"gitId":"-"},"content":" (click)\u003d\"goBack()\""},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003earrow_back_ios\u003c/mat-icon\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":11,"author":{"gitId":"MadLamprey"},"content":" \u003ca"},{"lineNumber":12,"author":{"gitId":"MadLamprey"},"content":" class\u003d\"mat-toolbar mat-primary\""},{"lineNumber":13,"author":{"gitId":"MadLamprey"},"content":" style\u003d\"text-decoration: none\""},{"lineNumber":14,"author":{"gitId":"MadLamprey"},"content":" [routerLink]\u003d\"phaseService.isRepoSet() ? phaseService.currentPhase : null\""},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003eWATcher v{{ this.getVersion() }}\u003c/a"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003cspan id\u003d\"phase-descriptor\" *ngIf\u003d\"auth.isAuthenticated()\" style\u003d\"margin-left: 10px\"\u003e"},{"lineNumber":18,"author":{"gitId":"-"},"content":" ({{ this.getPhaseDescription(phaseService.currentPhase) }})"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"auth.isAuthenticated() \u0026\u0026 this.phaseService.sessionData.sessionRepo.length \u003e 1\"\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \u003cbutton mat-button [matMenuTriggerFor]\u003d\"menu\"\u003e\u003cmat-icon style\u003d\"color: white\"\u003eexpand_more\u003c/mat-icon\u003e\u003c/button\u003e"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cmat-menu #menu\u003d\"matMenu\"\u003e"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":25,"author":{"gitId":"-"},"content":" mat-menu-item"},{"lineNumber":26,"author":{"gitId":"-"},"content":" *ngFor\u003d\"let sessionRepo of this.phaseService.sessionData.sessionRepo\""},{"lineNumber":27,"author":{"gitId":"-"},"content":" (click)\u003d\"this.routeToSelectedPhase(sessionRepo.phase)\""},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":29,"author":{"gitId":"-"},"content":" \u003cspan\u003e"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \u003cmat-icon [ngStyle]\u003d\"{ color: \u0027green\u0027, visibility: this.phaseService.currentPhase \u003d\u003d\u003d sessionRepo.phase ? \u0027visible\u0027 : \u0027hidden\u0027 }\""},{"lineNumber":31,"author":{"gitId":"-"},"content":" \u003edone\u003c/mat-icon"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":33,"author":{"gitId":"-"},"content":" {{ this.getPhaseDescription(sessionRepo.phase) }}"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":36,"author":{"gitId":"-"},"content":" \u003c/mat-menu\u003e"},{"lineNumber":37,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"-"},"content":" \u003c!-- everything else --\u003e"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" \u003cspan style\u003d\"flex: 1 1 auto\"\u003e\u003c/span\u003e"},{"lineNumber":42,"author":{"gitId":"-"},"content":""},{"lineNumber":43,"author":{"gitId":"-"},"content":" \u003cdiv *ngIf\u003d\"auth.isAuthenticated() \u0026\u0026 phaseService.isRepoSet()\"\u003e"},{"lineNumber":44,"author":{"gitId":"-"},"content":" \u003cspan id\u003d\"phase-descriptor\" style\u003d\"margin-left: 10px\"\u003e"},{"lineNumber":45,"author":{"gitId":"-"},"content":" {{ this.currentRepo || \u0027No Repository Set\u0027 }}"},{"lineNumber":46,"author":{"gitId":"-"},"content":" \u003c/span\u003e"},{"lineNumber":47,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":48,"author":{"gitId":"-"},"content":" mat-button"},{"lineNumber":49,"author":{"gitId":"-"},"content":" matTooltip\u003d\"{{ phaseService.isRepoSet() ? \u0027Change Repository\u0027 : \u0027Select Repository\u0027 }}\""},{"lineNumber":50,"author":{"gitId":"-"},"content":" (click)\u003d\"this.openChangeRepoDialog()\""},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":52,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003eedit\u003c/mat-icon\u003e"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003cspan style\u003d\"flex: 1 1 auto\"\u003e\u003c/span\u003e"},{"lineNumber":57,"author":{"gitId":"-"},"content":""},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003cbutton mat-button matTooltip\u003d\"Download WATcher Log\" (click)\u003d\"this.exportLogFile()\"\u003e"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003ereceipt\u003c/mat-icon\u003e"},{"lineNumber":60,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":61,"author":{"gitId":"-"},"content":" \u003cbutton mat-button matTooltip\u003d\"Give feedback about WATcher\" (click)\u003d\"openIssueTracker()\"\u003e"},{"lineNumber":62,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003email\u003c/mat-icon\u003e"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":64,"author":{"gitId":"-"},"content":""},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":66,"author":{"gitId":"-"},"content":" *ngIf\u003d\"auth.isAuthenticated() \u0026\u0026 phaseService.isRepoSet() \u0026\u0026 isOpenUrlButtonShown()\""},{"lineNumber":67,"author":{"gitId":"-"},"content":" mat-button"},{"lineNumber":68,"author":{"gitId":"-"},"content":" matTooltip\u003d\"View current page on GitHub\""},{"lineNumber":69,"author":{"gitId":"-"},"content":" (click)\u003d\"viewBrowser()\""},{"lineNumber":70,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":71,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003eopen_in_new\u003c/mat-icon\u003e"},{"lineNumber":72,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":73,"author":{"gitId":"-"},"content":""},{"lineNumber":74,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"sync-spinner\" *ngIf\u003d\"auth.isAuthenticated() \u0026\u0026 (this.isLoading$ | async); else notLoading\"\u003e"},{"lineNumber":75,"author":{"gitId":"-"},"content":" \u003cmat-spinner class\u003d\"white-spinner\" [diameter]\u003d\"20\"\u003e\u003c/mat-spinner\u003e"},{"lineNumber":76,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":77,"author":{"gitId":"-"},"content":""},{"lineNumber":78,"author":{"gitId":"-"},"content":" \u003cng-template #notLoading\u003e"},{"lineNumber":79,"author":{"gitId":"-"},"content":" \u003cbutton"},{"lineNumber":80,"author":{"gitId":"-"},"content":" *ngIf\u003d\"auth.isAuthenticated() \u0026\u0026 phaseService.isRepoSet() \u0026\u0026 isReloadButtonShown() \u0026\u0026 !this.isReloadButtonDisabled\""},{"lineNumber":81,"author":{"gitId":"-"},"content":" mat-button"},{"lineNumber":82,"author":{"gitId":"-"},"content":" matTooltip\u003d\"Synchronize with Github data\""},{"lineNumber":83,"author":{"gitId":"-"},"content":" (click)\u003d\"reload()\""},{"lineNumber":84,"author":{"gitId":"-"},"content":" \u003e"},{"lineNumber":85,"author":{"gitId":"-"},"content":" Sync"},{"lineNumber":86,"author":{"gitId":"-"},"content":" \u003cmat-icon\u003erefresh\u003c/mat-icon\u003e"},{"lineNumber":87,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":88,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"sync-spinner\" *ngIf\u003d\"auth.isAuthenticated() \u0026\u0026 isReloadButtonShown() \u0026\u0026 this.isReloadButtonDisabled\"\u003e"},{"lineNumber":89,"author":{"gitId":"-"},"content":" \u003cspan style\u003d\"font-size: 14px; margin-right: 7px\"\u003eSync\u003c/span\u003e"},{"lineNumber":90,"author":{"gitId":"-"},"content":" \u003cmat-spinner class\u003d\"white-spinner\" [diameter]\u003d\"20\"\u003e\u003c/mat-spinner\u003e"},{"lineNumber":91,"author":{"gitId":"-"},"content":" \u003c/div\u003e"},{"lineNumber":92,"author":{"gitId":"-"},"content":" \u003c/ng-template\u003e"},{"lineNumber":93,"author":{"gitId":"-"},"content":""},{"lineNumber":94,"author":{"gitId":"-"},"content":" \u003cbutton *ngIf\u003d\"auth.isAuthenticated()\" mat-button matTooltip\u003d\"Log out\" (click)\u003d\"openLogOutDialog(); $event.stopPropagation()\"\u003e"},{"lineNumber":95,"author":{"gitId":"-"},"content":" ({{ userService.currentUser.loginId }})"},{"lineNumber":96,"author":{"gitId":"-"},"content":" \u003cmat-icon style\u003d\"margin-left: 2px\"\u003eexit_to_app\u003c/mat-icon\u003e"},{"lineNumber":97,"author":{"gitId":"-"},"content":" \u003c/button\u003e"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003c/mat-toolbar\u003e"}],"authorContributionMap":{"MadLamprey":4,"-":94}},{"path":"tests/app/auth/login/login.component.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { ComponentFixture, TestBed, waitForAsync } from \u0027@angular/core/testing\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { LoginComponent } from \u0027../../../../src/app/auth/login/login.component\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { AuthService, AuthState } from \u0027../../../../src/app/core/services/auth.service\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { ErrorHandlingService } from \u0027../../../../src/app/core/services/error-handling.service\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { LoggingService } from \u0027../../../../src/app/core/services/logging.service\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"describe(\u0027LoginComponent\u0027, () \u003d\u003e {"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" let authServiceSpy: jasmine.SpyObj\u003cAuthService\u003e;"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" let errorHandlingServiceSpy: jasmine.SpyObj\u003cErrorHandlingService\u003e;"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" let loggingServiceSpy: jasmine.SpyObj\u003cLoggingService\u003e;"},{"lineNumber":11,"author":{"gitId":"-"},"content":" let component: LoginComponent;"},{"lineNumber":12,"author":{"gitId":"-"},"content":" let fixture: ComponentFixture\u003cLoginComponent\u003e;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":" beforeEach("},{"lineNumber":15,"author":{"gitId":"-"},"content":" waitForAsync(() \u003d\u003e {"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" authServiceSpy \u003d jasmine.createSpyObj\u003cAuthService\u003e(\u0027AuthService\u0027, [\u0027startOAuthProcess\u0027, \u0027changeAuthState\u0027]);"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" loggingServiceSpy \u003d jasmine.createSpyObj\u003cLoggingService\u003e(\u0027LoggingService\u0027, [\u0027info\u0027]);"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" errorHandlingServiceSpy \u003d jasmine.createSpyObj\u003cErrorHandlingService\u003e(\u0027ErrorHandlingService\u0027, [\u0027handleError\u0027]);"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":" TestBed.configureTestingModule({"},{"lineNumber":21,"author":{"gitId":"-"},"content":" providers: ["},{"lineNumber":22,"author":{"gitId":"NereusWB922"},"content":" { provide: AuthService, useValue: authServiceSpy },"},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" { provide: LoggingService, useValue: loggingServiceSpy },"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" { provide: ErrorHandlingService, useValue: errorHandlingServiceSpy }"},{"lineNumber":25,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":26,"author":{"gitId":"-"},"content":" declarations: [LoginComponent]"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }).compileComponents();"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" fixture \u003d TestBed.createComponent(LoginComponent);"},{"lineNumber":30,"author":{"gitId":"-"},"content":" component \u003d fixture.componentInstance;"},{"lineNumber":31,"author":{"gitId":"-"},"content":" fixture.detectChanges();"},{"lineNumber":32,"author":{"gitId":"-"},"content":" })"},{"lineNumber":33,"author":{"gitId":"-"},"content":" );"},{"lineNumber":34,"author":{"gitId":"-"},"content":""},{"lineNumber":35,"author":{"gitId":"-"},"content":" it(\u0027should create\u0027, () \u003d\u003e {"},{"lineNumber":36,"author":{"gitId":"-"},"content":" expect(component).toBeTruthy();"},{"lineNumber":37,"author":{"gitId":"-"},"content":" });"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" it(\u0027startPublicOnlyLoginProcess should call startLoginProcess with false\u0027, () \u003d\u003e {"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" spyOn(component, \u0027startLoginProcess\u0027);"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"NereusWB922"},"content":" component.startPublicOnlyLoginProcess();"},{"lineNumber":43,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" expect(component.startLoginProcess).toHaveBeenCalledWith(false);"},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":46,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":47,"author":{"gitId":"NereusWB922"},"content":" it(\u0027startIncludePrivateLoginProcess should call startLoginProcess with true\u0027, () \u003d\u003e {"},{"lineNumber":48,"author":{"gitId":"NereusWB922"},"content":" spyOn(component, \u0027startLoginProcess\u0027);"},{"lineNumber":49,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":" component.startIncludePrivateLoginProcess();"},{"lineNumber":51,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":52,"author":{"gitId":"NereusWB922"},"content":" expect(component.startLoginProcess).toHaveBeenCalledWith(true);"},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":54,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":55,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should call authService.startOAuthProcess on startLoginProcess\u0027, () \u003d\u003e {"},{"lineNumber":56,"author":{"gitId":"NereusWB922"},"content":" const hasPrivateConsent \u003d false;"},{"lineNumber":57,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":58,"author":{"gitId":"NereusWB922"},"content":" component.startLoginProcess(hasPrivateConsent);"},{"lineNumber":59,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":" expect(authServiceSpy.startOAuthProcess).toHaveBeenCalledWith(hasPrivateConsent);"},{"lineNumber":61,"author":{"gitId":"NereusWB922"},"content":" expect(loggingServiceSpy.info).toHaveBeenCalledWith(\u0027LoginComponent: Beginning login process\u0027);"},{"lineNumber":62,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":63,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should call error handling methods when error is thrown\u0027, () \u003d\u003e {"},{"lineNumber":65,"author":{"gitId":"NereusWB922"},"content":" const hasPrivateConsent \u003d false;"},{"lineNumber":66,"author":{"gitId":"NereusWB922"},"content":" const errorMessage \u003d \u0027Error!\u0027;"},{"lineNumber":67,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":68,"author":{"gitId":"NereusWB922"},"content":" const error: Error \u003d new Error(errorMessage);"},{"lineNumber":69,"author":{"gitId":"NereusWB922"},"content":" authServiceSpy.startOAuthProcess.and.throwError(error);"},{"lineNumber":70,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":71,"author":{"gitId":"NereusWB922"},"content":" component.startLoginProcess(hasPrivateConsent);"},{"lineNumber":72,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":73,"author":{"gitId":"NereusWB922"},"content":" expect(authServiceSpy.changeAuthState).toHaveBeenCalledWith(AuthState.NotAuthenticated);"},{"lineNumber":74,"author":{"gitId":"NereusWB922"},"content":" expect(errorHandlingServiceSpy.handleError).toHaveBeenCalledWith(error);"},{"lineNumber":75,"author":{"gitId":"NereusWB922"},"content":" expect(loggingServiceSpy.info.calls.allArgs()).toEqual(["},{"lineNumber":76,"author":{"gitId":"NereusWB922"},"content":" [\u0027LoginComponent: Beginning login process\u0027],"},{"lineNumber":77,"author":{"gitId":"NereusWB922"},"content":" [`LoginComponent: Login process failed with an error: ${error}`]"},{"lineNumber":78,"author":{"gitId":"NereusWB922"},"content":" ]);"},{"lineNumber":79,"author":{"gitId":"-"},"content":" });"},{"lineNumber":80,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"NereusWB922":49,"-":31}},{"path":"tests/app/core/models/session-model.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { of } from \u0027rxjs\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { Phase } from \u0027../../../../src/app/core/models/phase.model\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import {"},{"lineNumber":4,"author":{"gitId":"-"},"content":" assertSessionDataIntegrity,"},{"lineNumber":5,"author":{"gitId":"-"},"content":" NO_VALID_OPEN_PHASES,"},{"lineNumber":6,"author":{"gitId":"-"},"content":" OPENED_PHASE_REPO_UNDEFINED,"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" SESSION_DATA_MISSING_FIELDS,"},{"lineNumber":8,"author":{"gitId":"-"},"content":" SESSION_DATA_UNAVAILABLE"},{"lineNumber":9,"author":{"gitId":"-"},"content":"} from \u0027../../../../src/app/core/models/session.model\u0027;"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":"import { VALID_SESSION_DATA, WATCHER_REPO } from \u0027../../../constants/session.constants\u0027;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"describe(\u0027Session Model\u0027, () \u003d\u003e {"},{"lineNumber":13,"author":{"gitId":"-"},"content":" describe(\u0027assertSessionDataIntegrity()\u0027, () \u003d\u003e {"},{"lineNumber":14,"author":{"gitId":"-"},"content":" it(\u0027should throw error on unavailable session\u0027, () \u003d\u003e {"},{"lineNumber":15,"author":{"gitId":"-"},"content":" of(undefined)"},{"lineNumber":16,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":17,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":18,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":19,"author":{"gitId":"-"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(SESSION_DATA_UNAVAILABLE))"},{"lineNumber":20,"author":{"gitId":"-"},"content":" });"},{"lineNumber":21,"author":{"gitId":"-"},"content":" });"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should throw error on session data with invalid session\u0027, () \u003d\u003e {"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: null })"},{"lineNumber":25,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":26,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":27,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(SESSION_DATA_MISSING_FIELDS))"},{"lineNumber":29,"author":{"gitId":"-"},"content":" });"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: [] })"},{"lineNumber":31,"author":{"gitId":"NereusWB922"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":32,"author":{"gitId":"NereusWB922"},"content":" .subscribe({"},{"lineNumber":33,"author":{"gitId":"NereusWB922"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":34,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(SESSION_DATA_MISSING_FIELDS))"},{"lineNumber":35,"author":{"gitId":"-"},"content":" });"},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: \u0027repo\u0027 })"},{"lineNumber":37,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":38,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":39,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(SESSION_DATA_MISSING_FIELDS))"},{"lineNumber":41,"author":{"gitId":"-"},"content":" });"},{"lineNumber":42,"author":{"gitId":"-"},"content":" });"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should throw error on session with invalid phases\u0027, () \u003d\u003e {"},{"lineNumber":45,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: [{ phase: \u0027invalidPhase\u0027 as Phase, repos: [WATCHER_REPO] }] })"},{"lineNumber":46,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":47,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":48,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":49,"author":{"gitId":"-"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(NO_VALID_OPEN_PHASES))"},{"lineNumber":50,"author":{"gitId":"-"},"content":" });"},{"lineNumber":51,"author":{"gitId":"-"},"content":" });"},{"lineNumber":52,"author":{"gitId":"-"},"content":""},{"lineNumber":53,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should throw error on session data with invalid repo\u0027, () \u003d\u003e {"},{"lineNumber":54,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: [{ phase: Phase.issuesViewer, repo: undefined }] })"},{"lineNumber":55,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":56,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":57,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":58,"author":{"gitId":"-"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(OPENED_PHASE_REPO_UNDEFINED))"},{"lineNumber":59,"author":{"gitId":"-"},"content":" });"},{"lineNumber":60,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: [{ phase: Phase.issuesViewer, repo: null }] })"},{"lineNumber":61,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":62,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":63,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":64,"author":{"gitId":"-"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(OPENED_PHASE_REPO_UNDEFINED))"},{"lineNumber":65,"author":{"gitId":"-"},"content":" });"},{"lineNumber":66,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: [{ phase: Phase.issuesViewer, repo: \u0027\u0027 }] })"},{"lineNumber":67,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":68,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":69,"author":{"gitId":"-"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":70,"author":{"gitId":"-"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(OPENED_PHASE_REPO_UNDEFINED))"},{"lineNumber":71,"author":{"gitId":"-"},"content":" });"},{"lineNumber":72,"author":{"gitId":"NereusWB922"},"content":" of({ sessionRepo: [{ phase: Phase.issuesViewer, repo: [] }] })"},{"lineNumber":73,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":74,"author":{"gitId":"-"},"content":" .subscribe({"},{"lineNumber":75,"author":{"gitId":"NereusWB922"},"content":" next: () \u003d\u003e fail(),"},{"lineNumber":76,"author":{"gitId":"NereusWB922"},"content":" error: (err) \u003d\u003e expect(err).toEqual(new Error(OPENED_PHASE_REPO_UNDEFINED))"},{"lineNumber":77,"author":{"gitId":"-"},"content":" });"},{"lineNumber":78,"author":{"gitId":"-"},"content":" });"},{"lineNumber":79,"author":{"gitId":"-"},"content":""},{"lineNumber":80,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should pass for valid session data\u0027, () \u003d\u003e {"},{"lineNumber":81,"author":{"gitId":"NereusWB922"},"content":" of(VALID_SESSION_DATA)"},{"lineNumber":82,"author":{"gitId":"-"},"content":" .pipe(assertSessionDataIntegrity())"},{"lineNumber":83,"author":{"gitId":"NereusWB922"},"content":" .subscribe((el) \u003d\u003e expect(el).toEqual(VALID_SESSION_DATA));"},{"lineNumber":84,"author":{"gitId":"-"},"content":" });"},{"lineNumber":85,"author":{"gitId":"-"},"content":" });"},{"lineNumber":86,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"NereusWB922":25,"-":61}},{"path":"tests/app/shared/issue-tables/issue-paginator.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { MatPaginator } from \u0027@angular/material/paginator\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../../../src/app/core/models/issue.model\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { paginateData } from \u0027../../../../src/app/shared/issue-tables/issue-paginator\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import {"},{"lineNumber":5,"author":{"gitId":"-"},"content":" ISSUE_WITH_ASSIGNEES,"},{"lineNumber":6,"author":{"gitId":"-"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION,"},{"lineNumber":7,"author":{"gitId":"-"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION_HIGH_SEVERITY,"},{"lineNumber":8,"author":{"gitId":"-"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION_LOW_SEVERITY"},{"lineNumber":9,"author":{"gitId":"-"},"content":"} from \u0027../../../constants/githubissue.constants\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"describe(\u0027issue-paginator\u0027, () \u003d\u003e {"},{"lineNumber":12,"author":{"gitId":"-"},"content":" describe(\u0027paginateData()\u0027, () \u003d\u003e {"},{"lineNumber":13,"author":{"gitId":"-"},"content":" let dataSet_7: Issue[];"},{"lineNumber":14,"author":{"gitId":"-"},"content":" let paginator: MatPaginator;"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" const mediumSeverityIssueWithResponse: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION);"},{"lineNumber":16,"author":{"gitId":"NereusWB922"},"content":" const mediumSeverityIssueWithAssigneee: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_ASSIGNEES);"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" const lowSeverityFeatureFlawIssue: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION_LOW_SEVERITY);"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" const highSeverityDocumentationBugIssue: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION_HIGH_SEVERITY);"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":" beforeEach(() \u003d\u003e {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" dataSet_7 \u003d ["},{"lineNumber":22,"author":{"gitId":"-"},"content":" mediumSeverityIssueWithResponse,"},{"lineNumber":23,"author":{"gitId":"-"},"content":" mediumSeverityIssueWithAssigneee,"},{"lineNumber":24,"author":{"gitId":"-"},"content":" lowSeverityFeatureFlawIssue,"},{"lineNumber":25,"author":{"gitId":"-"},"content":" mediumSeverityIssueWithResponse,"},{"lineNumber":26,"author":{"gitId":"-"},"content":" mediumSeverityIssueWithAssigneee,"},{"lineNumber":27,"author":{"gitId":"-"},"content":" lowSeverityFeatureFlawIssue,"},{"lineNumber":28,"author":{"gitId":"-"},"content":" highSeverityDocumentationBugIssue"},{"lineNumber":29,"author":{"gitId":"-"},"content":" ];"},{"lineNumber":30,"author":{"gitId":"-"},"content":" paginator \u003d { pageSize: 3 } as MatPaginator;"},{"lineNumber":31,"author":{"gitId":"-"},"content":" });"},{"lineNumber":32,"author":{"gitId":"-"},"content":""},{"lineNumber":33,"author":{"gitId":"-"},"content":" it(\u0027should set the length of paginator to the length of data\u0027, () \u003d\u003e {"},{"lineNumber":34,"author":{"gitId":"-"},"content":" paginateData(paginator, dataSet_7);"},{"lineNumber":35,"author":{"gitId":"-"},"content":" expect(paginator.length).toEqual(7);"},{"lineNumber":36,"author":{"gitId":"-"},"content":" });"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":" it(\u0027should return list of issues according to page index\u0027, () \u003d\u003e {"},{"lineNumber":39,"author":{"gitId":"-"},"content":" paginator.pageIndex \u003d 0;"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" // Returns issues index 0 to 2"},{"lineNumber":42,"author":{"gitId":"-"},"content":" const returnedList \u003d paginateData(paginator, dataSet_7);"},{"lineNumber":43,"author":{"gitId":"-"},"content":" expect(returnedList).toEqual([mediumSeverityIssueWithResponse, mediumSeverityIssueWithAssigneee, lowSeverityFeatureFlawIssue]);"},{"lineNumber":44,"author":{"gitId":"-"},"content":" });"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":" it(\u0027should return list of issues in the previous page if there are no issues on the current page\u0027, () \u003d\u003e {"},{"lineNumber":47,"author":{"gitId":"-"},"content":" paginator.pageIndex \u003d 3;"},{"lineNumber":48,"author":{"gitId":"-"},"content":""},{"lineNumber":49,"author":{"gitId":"-"},"content":" // Returns issues index 6 on page 2"},{"lineNumber":50,"author":{"gitId":"-"},"content":" const returnedList \u003d paginateData(paginator, dataSet_7);"},{"lineNumber":51,"author":{"gitId":"-"},"content":" expect(returnedList).toEqual([highSeverityDocumentationBugIssue]);"},{"lineNumber":52,"author":{"gitId":"-"},"content":" });"},{"lineNumber":53,"author":{"gitId":"-"},"content":" });"},{"lineNumber":54,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"NereusWB922":4,"-":50}},{"path":"tests/app/shared/issue-tables/issue-sorter.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { MatSort } from \u0027@angular/material/sort\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../../../src/app/core/models/issue.model\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { getSortedData } from \u0027../../../../src/app/shared/issue-tables/issue-sorter\u0027;"},{"lineNumber":4,"author":{"gitId":"NereusWB922"},"content":"import {"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" ISSUE_UPDATED_EARLIER,"},{"lineNumber":6,"author":{"gitId":"NereusWB922"},"content":" ISSUE_UPDATED_LATER,"},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":" ISSUE_WITH_ASSIGNEES,"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":"} from \u0027../../../constants/githubissue.constants\u0027;"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"describe(\u0027issuer-sorter\u0027, () \u003d\u003e {"},{"lineNumber":12,"author":{"gitId":"-"},"content":" describe(\u0027getSortedData()\u0027, () \u003d\u003e {"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" const dummyIssue: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION);"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" const otherDummyIssue: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_ASSIGNEES);"},{"lineNumber":15,"author":{"gitId":"-"},"content":" const issuesList: Issue[] \u003d [dummyIssue, otherDummyIssue];"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" const issueUpdatedEarlier: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_UPDATED_EARLIER);"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" const issueUpdatedLater: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_UPDATED_LATER);"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" const issuesWithDifferentUpdatedDate: Issue[] \u003d [issueUpdatedEarlier, issueUpdatedLater];"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":" const matSort: MatSort \u003d new MatSort();"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"NereusWB922"},"content":" it(\u0027should return the same data if sort.active is not set\u0027, () \u003d\u003e {"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" const sortedData \u003d getSortedData(matSort, issuesList);"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" expect(sortedData).toEqual(issuesList);"},{"lineNumber":26,"author":{"gitId":"NereusWB922"},"content":" });"},{"lineNumber":27,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":28,"author":{"gitId":"-"},"content":" it(\u0027sorts issues based on their assignees correctly\u0027, () \u003d\u003e {"},{"lineNumber":29,"author":{"gitId":"-"},"content":" matSort.active \u003d \u0027assignees\u0027;"},{"lineNumber":30,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027asc\u0027;"},{"lineNumber":31,"author":{"gitId":"-"},"content":" const sortedIssuesByAssigneesAsc \u003d getSortedData(matSort, issuesList);"},{"lineNumber":32,"author":{"gitId":"-"},"content":" assertOrder(sortedIssuesByAssigneesAsc, dummyIssue, otherDummyIssue);"},{"lineNumber":33,"author":{"gitId":"-"},"content":""},{"lineNumber":34,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027desc\u0027;"},{"lineNumber":35,"author":{"gitId":"-"},"content":" const sortedIssuesByAssigneesDesc \u003d getSortedData(matSort, issuesList);"},{"lineNumber":36,"author":{"gitId":"-"},"content":" assertOrder(sortedIssuesByAssigneesDesc, otherDummyIssue, dummyIssue);"},{"lineNumber":37,"author":{"gitId":"-"},"content":" });"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"-"},"content":" it(\u0027sorts issues based on their string fields correctly\u0027, () \u003d\u003e {"},{"lineNumber":40,"author":{"gitId":"-"},"content":" matSort.active \u003d \u0027title\u0027;"},{"lineNumber":41,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027asc\u0027;"},{"lineNumber":42,"author":{"gitId":"-"},"content":" const sortedIssuesByTitleAsc \u003d getSortedData(matSort, issuesList);"},{"lineNumber":43,"author":{"gitId":"-"},"content":" assertOrder(sortedIssuesByTitleAsc, dummyIssue, otherDummyIssue);"},{"lineNumber":44,"author":{"gitId":"-"},"content":""},{"lineNumber":45,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027desc\u0027;"},{"lineNumber":46,"author":{"gitId":"-"},"content":" const sortedIssuesByTitleDesc \u003d getSortedData(matSort, issuesList);"},{"lineNumber":47,"author":{"gitId":"-"},"content":" assertOrder(sortedIssuesByTitleDesc, otherDummyIssue, dummyIssue);"},{"lineNumber":48,"author":{"gitId":"-"},"content":" });"},{"lineNumber":49,"author":{"gitId":"-"},"content":""},{"lineNumber":50,"author":{"gitId":"NereusWB922"},"content":" it(\u0027sorts issues based on their id fields correctly\u0027, () \u003d\u003e {"},{"lineNumber":51,"author":{"gitId":"-"},"content":" matSort.active \u003d \u0027id\u0027;"},{"lineNumber":52,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027asc\u0027;"},{"lineNumber":53,"author":{"gitId":"-"},"content":" const sortedIssuedByIdAsc \u003d getSortedData(matSort, issuesList);"},{"lineNumber":54,"author":{"gitId":"-"},"content":" assertOrder(sortedIssuedByIdAsc, otherDummyIssue, dummyIssue);"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027desc\u0027;"},{"lineNumber":57,"author":{"gitId":"-"},"content":" const sortedIssuedByIdDesc \u003d getSortedData(matSort, issuesList);"},{"lineNumber":58,"author":{"gitId":"-"},"content":" assertOrder(sortedIssuedByIdDesc, dummyIssue, otherDummyIssue);"},{"lineNumber":59,"author":{"gitId":"-"},"content":" });"},{"lineNumber":60,"author":{"gitId":"-"},"content":""},{"lineNumber":61,"author":{"gitId":"NereusWB922"},"content":" it(\u0027sorts issues based on their updated date fields correctly\u0027, () \u003d\u003e {"},{"lineNumber":62,"author":{"gitId":"NereusWB922"},"content":" matSort.active \u003d \u0027date\u0027;"},{"lineNumber":63,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027asc\u0027;"},{"lineNumber":64,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":65,"author":{"gitId":"NereusWB922"},"content":" const sortedIssuedByDateAsc \u003d getSortedData(matSort, issuesWithDifferentUpdatedDate);"},{"lineNumber":66,"author":{"gitId":"NereusWB922"},"content":" assertOrder(sortedIssuedByDateAsc, issueUpdatedEarlier, issueUpdatedLater);"},{"lineNumber":67,"author":{"gitId":"-"},"content":""},{"lineNumber":68,"author":{"gitId":"-"},"content":" matSort.direction \u003d \u0027desc\u0027;"},{"lineNumber":69,"author":{"gitId":"NereusWB922"},"content":" const sortedIssuedByDateDesc \u003d getSortedData(matSort, issuesWithDifferentUpdatedDate);"},{"lineNumber":70,"author":{"gitId":"NereusWB922"},"content":" assertOrder(sortedIssuedByDateDesc, issueUpdatedLater, issueUpdatedEarlier);"},{"lineNumber":71,"author":{"gitId":"-"},"content":" });"},{"lineNumber":72,"author":{"gitId":"-"},"content":" });"},{"lineNumber":73,"author":{"gitId":"-"},"content":"});"},{"lineNumber":74,"author":{"gitId":"-"},"content":""},{"lineNumber":75,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * This helper method helps to check if the sorted issues are in their"},{"lineNumber":77,"author":{"gitId":"-"},"content":" * correct order based on the variable arguments provided."},{"lineNumber":78,"author":{"gitId":"-"},"content":" */"},{"lineNumber":79,"author":{"gitId":"-"},"content":"function assertOrder(sortedIssues: Issue[], ...expectedSortedIssues: Issue[]) {"},{"lineNumber":80,"author":{"gitId":"-"},"content":" for (let i \u003d 0; i \u003c sortedIssues.length; i++) {"},{"lineNumber":81,"author":{"gitId":"-"},"content":" expect(sortedIssues[i].id).toBe(expectedSortedIssues[i].id);"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }"},{"lineNumber":83,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"NereusWB922":25,"-":58}},{"path":"tests/app/shared/issue-tables/search-filter.spec.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Issue } from \u0027../../../../src/app/core/models/issue.model\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { IssueService } from \u0027../../../../src/app/core/services/issue.service\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { TABLE_COLUMNS } from \u0027../../../../src/app/shared/issue-tables/issue-tables-columns\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { applySearchFilter } from \u0027../../../../src/app/shared/issue-tables/search-filter\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { USER_ANUBHAV } from \u0027../../../constants/data.constants\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import {"},{"lineNumber":7,"author":{"gitId":"-"},"content":" ISSUE_WITH_ASSIGNEES,"},{"lineNumber":8,"author":{"gitId":"-"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION,"},{"lineNumber":9,"author":{"gitId":"-"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION_HIGH_SEVERITY,"},{"lineNumber":10,"author":{"gitId":"-"},"content":" ISSUE_WITH_EMPTY_DESCRIPTION_LOW_SEVERITY"},{"lineNumber":11,"author":{"gitId":"-"},"content":"} from \u0027../../../constants/githubissue.constants\u0027;"},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":"import { GITHUB_LABEL_FEATURE_FLAW } from \u0027../../../constants/githublabel.constants\u0027;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"describe(\u0027search-filter\u0027, () \u003d\u003e {"},{"lineNumber":15,"author":{"gitId":"-"},"content":" describe(\u0027applySearchFilter()\u0027, () \u003d\u003e {"},{"lineNumber":16,"author":{"gitId":"-"},"content":" let searchKey: string;"},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":" const mediumSeverityIssueWithResponse: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION);"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" const mediumSeverityIssueWithAssigneee: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_ASSIGNEES);"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" const lowSeverityFeatureFlawIssue: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION_LOW_SEVERITY);"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" const highSeverityDocumentationBugIssue: Issue \u003d Issue.createPhaseBugReportingIssue(ISSUE_WITH_EMPTY_DESCRIPTION_HIGH_SEVERITY);"},{"lineNumber":21,"author":{"gitId":"-"},"content":""},{"lineNumber":22,"author":{"gitId":"-"},"content":" const issuesList: Issue[] \u003d ["},{"lineNumber":23,"author":{"gitId":"-"},"content":" mediumSeverityIssueWithResponse,"},{"lineNumber":24,"author":{"gitId":"-"},"content":" mediumSeverityIssueWithAssigneee,"},{"lineNumber":25,"author":{"gitId":"-"},"content":" lowSeverityFeatureFlawIssue,"},{"lineNumber":26,"author":{"gitId":"-"},"content":" highSeverityDocumentationBugIssue"},{"lineNumber":27,"author":{"gitId":"-"},"content":" ];"},{"lineNumber":28,"author":{"gitId":"NereusWB922"},"content":" const displayedColumns: string[] \u003d [TABLE_COLUMNS.ID, TABLE_COLUMNS.TITLE, TABLE_COLUMNS.ASSIGNEE, TABLE_COLUMNS.LABEL];"},{"lineNumber":29,"author":{"gitId":"-"},"content":" const issueService: IssueService \u003d new IssueService(null, null, null);"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":" it(\u0027can filter for issues which are assigned to a specific user\u0027, () \u003d\u003e {"},{"lineNumber":32,"author":{"gitId":"-"},"content":" searchKey \u003d USER_ANUBHAV.loginId;"},{"lineNumber":33,"author":{"gitId":"-"},"content":" expect(applySearchFilter(searchKey, displayedColumns, issueService, issuesList)).toEqual([mediumSeverityIssueWithAssigneee]);"},{"lineNumber":34,"author":{"gitId":"-"},"content":" });"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"NereusWB922"},"content":" it(\u0027can filter for issues using label\u0027, () \u003d\u003e {"},{"lineNumber":37,"author":{"gitId":"NereusWB922"},"content":" searchKey \u003d GITHUB_LABEL_FEATURE_FLAW.name;"},{"lineNumber":38,"author":{"gitId":"NereusWB922"},"content":" expect(applySearchFilter(searchKey, displayedColumns, issueService, issuesList)).toEqual([lowSeverityFeatureFlawIssue]);"},{"lineNumber":39,"author":{"gitId":"-"},"content":" });"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" it(\u0027can filter for issues that contain the search key in any other column\u0027, () \u003d\u003e {"},{"lineNumber":42,"author":{"gitId":"-"},"content":" // Search by id of issue"},{"lineNumber":43,"author":{"gitId":"-"},"content":" searchKey \u003d mediumSeverityIssueWithResponse.id.toString();"},{"lineNumber":44,"author":{"gitId":"-"},"content":" expect(applySearchFilter(searchKey, displayedColumns, issueService, issuesList)).toEqual([mediumSeverityIssueWithResponse]);"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":" // Search by title of issue"},{"lineNumber":47,"author":{"gitId":"-"},"content":" searchKey \u003d mediumSeverityIssueWithAssigneee.title;"},{"lineNumber":48,"author":{"gitId":"-"},"content":" expect(applySearchFilter(searchKey, displayedColumns, issueService, issuesList)).toEqual([mediumSeverityIssueWithAssigneee]);"},{"lineNumber":49,"author":{"gitId":"-"},"content":" });"},{"lineNumber":50,"author":{"gitId":"-"},"content":" });"},{"lineNumber":51,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"NereusWB922":9,"-":42}},{"path":"tests/constants/githubissue.constants.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { IssueState, IssueStateReason } from \u0027../../graphql/graphql-types\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":"import { GithubIssue } from \u0027../../src/app/core/models/github/github-issue.model\u0027;"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import { GithubLabel } from \u0027../../src/app/core/models/github/github-label.model\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import { USER_ANUBHAV, USER_SHUMING } from \u0027./data.constants\u0027;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import { EMPTY_TEAM_RESPONSE, PENDING_TUTOR_MODERATION } from \u0027./githubcomment.constants\u0027;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import {"},{"lineNumber":7,"author":{"gitId":"-"},"content":" GITHUB_LABEL_DOCUMENTATION_BUG,"},{"lineNumber":8,"author":{"gitId":"-"},"content":" GITHUB_LABEL_FEATURE_FLAW,"},{"lineNumber":9,"author":{"gitId":"-"},"content":" GITHUB_LABEL_FUNCTIONALITY_BUG,"},{"lineNumber":10,"author":{"gitId":"-"},"content":" GITHUB_LABEL_HIGH_SEVERITY,"},{"lineNumber":11,"author":{"gitId":"-"},"content":" GITHUB_LABEL_LOW_SEVERITY,"},{"lineNumber":12,"author":{"gitId":"-"},"content":" GITHUB_LABEL_MEDIUM_SEVERITY,"},{"lineNumber":13,"author":{"gitId":"-"},"content":" GITHUB_LABEL_TEAM_LABEL,"},{"lineNumber":14,"author":{"gitId":"-"},"content":" GITHUB_LABEL_TUTORIAL_LABEL"},{"lineNumber":15,"author":{"gitId":"-"},"content":"} from \u0027./githublabel.constants\u0027;"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":"const randomId: () \u003d\u003e string \u003d () \u003d\u003e {"},{"lineNumber":18,"author":{"gitId":"-"},"content":" return Math.floor(Math.random() * 1000000000).toString();"},{"lineNumber":19,"author":{"gitId":"-"},"content":"};"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":"const randomIssueNumber: () \u003d\u003e number \u003d () \u003d\u003e {"},{"lineNumber":22,"author":{"gitId":"-"},"content":" return Math.round(Math.random() * 1000);"},{"lineNumber":23,"author":{"gitId":"-"},"content":"};"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":"const randomISODate: (startDate?: Date, endDate?: Date) \u003d\u003e string \u003d ("},{"lineNumber":26,"author":{"gitId":"-"},"content":" startDate: Date \u003d new Date(2020, 1, 1),"},{"lineNumber":27,"author":{"gitId":"-"},"content":" endDate: Date \u003d new Date()"},{"lineNumber":28,"author":{"gitId":"-"},"content":") \u003d\u003e {"},{"lineNumber":29,"author":{"gitId":"-"},"content":" return new Date(startDate.getTime() + Math.random() * (startDate.getTime() - endDate.getTime())).toISOString();"},{"lineNumber":30,"author":{"gitId":"-"},"content":"};"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":"const USER_ANUBHAV_DETAILS \u003d {"},{"lineNumber":33,"author":{"gitId":"-"},"content":" login: USER_ANUBHAV.loginId,"},{"lineNumber":34,"author":{"gitId":"-"},"content":" avatar_url: \u0027https://avatars1.githubusercontent.com/u/35621759?v\u003d4\u0027,"},{"lineNumber":35,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/users/anubh-v\u0027"},{"lineNumber":36,"author":{"gitId":"-"},"content":"};"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":"const USER_ANUBHAV_ASSIGNEE_DETAILS \u003d {"},{"lineNumber":39,"author":{"gitId":"-"},"content":" login: USER_ANUBHAV.loginId,"},{"lineNumber":40,"author":{"gitId":"-"},"content":" id: 35621759,"},{"lineNumber":41,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/users/anubh-v\u0027"},{"lineNumber":42,"author":{"gitId":"-"},"content":"};"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":"const USER_SHUMING_DETAILS \u003d {"},{"lineNumber":45,"author":{"gitId":"-"},"content":" login: USER_SHUMING.loginId,"},{"lineNumber":46,"author":{"gitId":"-"},"content":" avatar_url: \u0027https://avatars0.githubusercontent.com/u/43642522?v\u003d4\u0027,"},{"lineNumber":47,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/users/geshuming\u0027"},{"lineNumber":48,"author":{"gitId":"-"},"content":"};"},{"lineNumber":49,"author":{"gitId":"-"},"content":""},{"lineNumber":50,"author":{"gitId":"-"},"content":"const USER_SHUMING_ASSIGNEE_DETAILS \u003d {"},{"lineNumber":51,"author":{"gitId":"-"},"content":" login: \u0027geshuming\u0027,"},{"lineNumber":52,"author":{"gitId":"-"},"content":" id: 43642522,"},{"lineNumber":53,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/users/geshuming\u0027"},{"lineNumber":54,"author":{"gitId":"-"},"content":"};"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":"const ISSUE_BODY \u003d"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u0027# Issue Description\\n{original issue description}\\n\u0027 +"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \"# Team\u0027s Response\\n{team\u0027s response}\\n # Disputes\\n\\n\" +"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \"## :question: Issue Type\\n\\n### Team says:\\r\\n{the team\u0027s action that is being disputed}\\r\\n\\r\\n\" +"},{"lineNumber":60,"author":{"gitId":"-"},"content":" \"### Tester says:\\r\\n{tester\u0027s objection}\\n\\n-------------------\\n## :question: Issue Severity\\n\\n\" +"},{"lineNumber":61,"author":{"gitId":"-"},"content":" \"### Team says:\\r\\n{the team\u0027s action that is being disputed}\\r\\n\\r\\n\" +"},{"lineNumber":62,"author":{"gitId":"-"},"content":" \"### Tester says:\\r\\n{tester\u0027s objection}\\n\\n-------------------\\n## :question: Not Related Question\\n\\n\" +"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \"### Team says:\\r\\n{the team\u0027s action that is being disputed}\\r\\n\\r\\n\" +"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \"### Tester says:\\r\\n{tester\u0027s objection}\\n\\n-------------------\\n\\n\";"},{"lineNumber":65,"author":{"gitId":"-"},"content":""},{"lineNumber":66,"author":{"gitId":"-"},"content":"export const ISSUE_WITH_EMPTY_DESCRIPTION \u003d new GithubIssue({"},{"lineNumber":67,"author":{"gitId":"-"},"content":" id: \u0027574085971\u0027,"},{"lineNumber":68,"author":{"gitId":"-"},"content":" number: 92,"},{"lineNumber":69,"author":{"gitId":"-"},"content":" assignees: [],"},{"lineNumber":70,"author":{"gitId":"-"},"content":" comments: [],"},{"lineNumber":71,"author":{"gitId":"-"},"content":" body: \u0027\u0027,"},{"lineNumber":72,"author":{"gitId":"-"},"content":" created_at: \u00272020-03-02T16:19:02Z\u0027,"},{"lineNumber":73,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_FUNCTIONALITY_BUG, GITHUB_LABEL_MEDIUM_SEVERITY],"},{"lineNumber":74,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":75,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":76,"author":{"gitId":"-"},"content":" title: \u0027App starts to lag when given large amount of input\u0027,"},{"lineNumber":77,"author":{"gitId":"-"},"content":" updated_at: \u00272020-03-13T13:37:32Z\u0027,"},{"lineNumber":78,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/92\u0027,"},{"lineNumber":79,"author":{"gitId":"-"},"content":" user: USER_ANUBHAV_DETAILS"},{"lineNumber":80,"author":{"gitId":"-"},"content":"});"},{"lineNumber":81,"author":{"gitId":"-"},"content":""},{"lineNumber":82,"author":{"gitId":"NereusWB922"},"content":"export const ISSUE_UPDATED_EARLIER \u003d new GithubIssue({"},{"lineNumber":83,"author":{"gitId":"NereusWB922"},"content":" id: \u0027000000001\u0027,"},{"lineNumber":84,"author":{"gitId":"NereusWB922"},"content":" number: 1,"},{"lineNumber":85,"author":{"gitId":"NereusWB922"},"content":" assignees: [],"},{"lineNumber":86,"author":{"gitId":"NereusWB922"},"content":" comments: [],"},{"lineNumber":87,"author":{"gitId":"NereusWB922"},"content":" body: \u0027\u0027,"},{"lineNumber":88,"author":{"gitId":"NereusWB922"},"content":" created_at: \u00272020-09-02T16:19:02Z\u0027,"},{"lineNumber":89,"author":{"gitId":"NereusWB922"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_FUNCTIONALITY_BUG, GITHUB_LABEL_MEDIUM_SEVERITY],"},{"lineNumber":90,"author":{"gitId":"NereusWB922"},"content":" state: IssueState.Open,"},{"lineNumber":91,"author":{"gitId":"NereusWB922"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":92,"author":{"gitId":"NereusWB922"},"content":" title: \u0027App starts to lag when given large amount of input\u0027,"},{"lineNumber":93,"author":{"gitId":"NereusWB922"},"content":" updated_at: \u00272020-09-03T13:37:32Z\u0027,"},{"lineNumber":94,"author":{"gitId":"NereusWB922"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/93\u0027,"},{"lineNumber":95,"author":{"gitId":"NereusWB922"},"content":" user: USER_ANUBHAV_DETAILS"},{"lineNumber":96,"author":{"gitId":"NereusWB922"},"content":"});"},{"lineNumber":97,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":98,"author":{"gitId":"NereusWB922"},"content":"export const ISSUE_UPDATED_LATER \u003d new GithubIssue({"},{"lineNumber":99,"author":{"gitId":"NereusWB922"},"content":" id: \u0027000000002\u0027,"},{"lineNumber":100,"author":{"gitId":"NereusWB922"},"content":" number: 2,"},{"lineNumber":101,"author":{"gitId":"NereusWB922"},"content":" assignees: [],"},{"lineNumber":102,"author":{"gitId":"NereusWB922"},"content":" comments: [],"},{"lineNumber":103,"author":{"gitId":"NereusWB922"},"content":" body: \u0027\u0027,"},{"lineNumber":104,"author":{"gitId":"NereusWB922"},"content":" created_at: \u00272020-10-02T16:19:02Z\u0027,"},{"lineNumber":105,"author":{"gitId":"NereusWB922"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_FUNCTIONALITY_BUG, GITHUB_LABEL_MEDIUM_SEVERITY],"},{"lineNumber":106,"author":{"gitId":"NereusWB922"},"content":" state: IssueState.Open,"},{"lineNumber":107,"author":{"gitId":"NereusWB922"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":108,"author":{"gitId":"NereusWB922"},"content":" title: \u0027App starts to lag when given large amount of input\u0027,"},{"lineNumber":109,"author":{"gitId":"NereusWB922"},"content":" updated_at: \u00272020-10-22T13:37:32Z\u0027,"},{"lineNumber":110,"author":{"gitId":"NereusWB922"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/94\u0027,"},{"lineNumber":111,"author":{"gitId":"NereusWB922"},"content":" user: USER_ANUBHAV_DETAILS"},{"lineNumber":112,"author":{"gitId":"NereusWB922"},"content":"});"},{"lineNumber":113,"author":{"gitId":"NereusWB922"},"content":""},{"lineNumber":114,"author":{"gitId":"-"},"content":"export const ISSUE_WITH_EMPTY_DESCRIPTION_LOW_SEVERITY \u003d new GithubIssue({"},{"lineNumber":115,"author":{"gitId":"-"},"content":" id: \u0027384830567\u0027,"},{"lineNumber":116,"author":{"gitId":"-"},"content":" number: 130,"},{"lineNumber":117,"author":{"gitId":"-"},"content":" assignees: [],"},{"lineNumber":118,"author":{"gitId":"-"},"content":" comments: [],"},{"lineNumber":119,"author":{"gitId":"-"},"content":" body: \u0027\u0027,"},{"lineNumber":120,"author":{"gitId":"-"},"content":" created_at: \u00272020-03-02T16:19:02Z\u0027,"},{"lineNumber":121,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_FEATURE_FLAW, GITHUB_LABEL_LOW_SEVERITY],"},{"lineNumber":122,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":123,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":124,"author":{"gitId":"-"},"content":" title: \u0027App is sometimes slow\u0027,"},{"lineNumber":125,"author":{"gitId":"-"},"content":" updated_at: \u00272020-03-13T13:37:32Z\u0027,"},{"lineNumber":126,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/130\u0027,"},{"lineNumber":127,"author":{"gitId":"-"},"content":" user: USER_ANUBHAV_DETAILS"},{"lineNumber":128,"author":{"gitId":"-"},"content":"});"},{"lineNumber":129,"author":{"gitId":"-"},"content":""},{"lineNumber":130,"author":{"gitId":"-"},"content":"export const ISSUE_WITH_EMPTY_DESCRIPTION_HIGH_SEVERITY \u003d new GithubIssue({"},{"lineNumber":131,"author":{"gitId":"-"},"content":" id: \u0027573957398\u0027,"},{"lineNumber":132,"author":{"gitId":"-"},"content":" number: 32,"},{"lineNumber":133,"author":{"gitId":"-"},"content":" assignees: [],"},{"lineNumber":134,"author":{"gitId":"-"},"content":" comments: [],"},{"lineNumber":135,"author":{"gitId":"-"},"content":" body: \u0027\u0027,"},{"lineNumber":136,"author":{"gitId":"-"},"content":" created_at: \u00272010-03-12T19:12:02Z\u0027,"},{"lineNumber":137,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_DOCUMENTATION_BUG, GITHUB_LABEL_HIGH_SEVERITY],"},{"lineNumber":138,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":139,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":140,"author":{"gitId":"-"},"content":" title: \u0027Too many typos\u0027,"},{"lineNumber":141,"author":{"gitId":"-"},"content":" updated_at: \u00272012-03-12T19:12:02Z\u0027,"},{"lineNumber":142,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/130\u0027,"},{"lineNumber":143,"author":{"gitId":"-"},"content":" user: USER_ANUBHAV_DETAILS"},{"lineNumber":144,"author":{"gitId":"-"},"content":"});"},{"lineNumber":145,"author":{"gitId":"-"},"content":""},{"lineNumber":146,"author":{"gitId":"-"},"content":"export const DUPLICATED_ISSUE_WITH_EMPTY_DESCRIPTION_HIGH_SEVERITY \u003d new GithubIssue({"},{"lineNumber":147,"author":{"gitId":"-"},"content":" id: \u0027573957399\u0027,"},{"lineNumber":148,"author":{"gitId":"-"},"content":" number: 33,"},{"lineNumber":149,"author":{"gitId":"-"},"content":" assignees: [],"},{"lineNumber":150,"author":{"gitId":"-"},"content":" comments: [],"},{"lineNumber":151,"author":{"gitId":"-"},"content":" body: \u0027\u0027,"},{"lineNumber":152,"author":{"gitId":"-"},"content":" created_at: \u00272010-04-12T19:12:02Z\u0027,"},{"lineNumber":153,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_DOCUMENTATION_BUG, GITHUB_LABEL_HIGH_SEVERITY],"},{"lineNumber":154,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":155,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":156,"author":{"gitId":"-"},"content":" title: \u0027Too many typos 2\u0027,"},{"lineNumber":157,"author":{"gitId":"-"},"content":" updated_at: \u00272012-04-12T19:12:02Z\u0027,"},{"lineNumber":158,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/130\u0027,"},{"lineNumber":159,"author":{"gitId":"-"},"content":" user: USER_ANUBHAV_DETAILS"},{"lineNumber":160,"author":{"gitId":"-"},"content":"});"},{"lineNumber":161,"author":{"gitId":"-"},"content":""},{"lineNumber":162,"author":{"gitId":"-"},"content":"export const ISSUE_WITH_ASSIGNEES \u003d new GithubIssue({"},{"lineNumber":163,"author":{"gitId":"-"},"content":" id: \u0027551732011\u0027,"},{"lineNumber":164,"author":{"gitId":"-"},"content":" number: 91,"},{"lineNumber":165,"author":{"gitId":"-"},"content":" assignees: [USER_ANUBHAV_ASSIGNEE_DETAILS],"},{"lineNumber":166,"author":{"gitId":"-"},"content":" body: \u0027Screen freezes every few minutes\u0027,"},{"lineNumber":167,"author":{"gitId":"-"},"content":" created_at: \u00272020-01-18T07:01:45Z\u0027,"},{"lineNumber":168,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_FUNCTIONALITY_BUG, GITHUB_LABEL_MEDIUM_SEVERITY],"},{"lineNumber":169,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":170,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":171,"author":{"gitId":"-"},"content":" title: \u0027Screen freezes\u0027,"},{"lineNumber":172,"author":{"gitId":"-"},"content":" updated_at: \u00272020-03-02T12:50:02Z\u0027,"},{"lineNumber":173,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/91\u0027,"},{"lineNumber":174,"author":{"gitId":"-"},"content":" user: USER_ANUBHAV_DETAILS,"},{"lineNumber":175,"author":{"gitId":"-"},"content":" comments: [EMPTY_TEAM_RESPONSE]"},{"lineNumber":176,"author":{"gitId":"-"},"content":"});"},{"lineNumber":177,"author":{"gitId":"-"},"content":""},{"lineNumber":178,"author":{"gitId":"-"},"content":"export const generateIssueWithRandomData: () \u003d\u003e GithubIssue \u003d () \u003d\u003e {"},{"lineNumber":179,"author":{"gitId":"-"},"content":" const created_and_updated_date: string \u003d randomISODate();"},{"lineNumber":180,"author":{"gitId":"-"},"content":" const issueNumber: number \u003d randomIssueNumber();"},{"lineNumber":181,"author":{"gitId":"-"},"content":" const severityLabels: GithubLabel[] \u003d [GITHUB_LABEL_LOW_SEVERITY, GITHUB_LABEL_MEDIUM_SEVERITY, GITHUB_LABEL_HIGH_SEVERITY];"},{"lineNumber":182,"author":{"gitId":"-"},"content":" const typeLabels: GithubLabel[] \u003d [GITHUB_LABEL_FUNCTIONALITY_BUG, GITHUB_LABEL_FEATURE_FLAW, GITHUB_LABEL_DOCUMENTATION_BUG];"},{"lineNumber":183,"author":{"gitId":"-"},"content":" return new GithubIssue({"},{"lineNumber":184,"author":{"gitId":"-"},"content":" id: randomId(),"},{"lineNumber":185,"author":{"gitId":"-"},"content":" number: issueNumber,"},{"lineNumber":186,"author":{"gitId":"-"},"content":" assignees: [],"},{"lineNumber":187,"author":{"gitId":"-"},"content":" comments: [],"},{"lineNumber":188,"author":{"gitId":"-"},"content":" body: `Issue No.: ${issueNumber}\\nSample Content.`,"},{"lineNumber":189,"author":{"gitId":"-"},"content":" created_at: created_and_updated_date,"},{"lineNumber":190,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, typeLabels[issueNumber % 3], severityLabels[issueNumber % 3]],"},{"lineNumber":191,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":192,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":193,"author":{"gitId":"-"},"content":" title: `Random Issue: ${issueNumber}`,"},{"lineNumber":194,"author":{"gitId":"-"},"content":" updated_at: created_and_updated_date,"},{"lineNumber":195,"author":{"gitId":"-"},"content":" url: `https://api.github.com/repos/CATcher-org/pe-results/issues/${issueNumber}`,"},{"lineNumber":196,"author":{"gitId":"-"},"content":" user: USER_ANUBHAV_DETAILS"},{"lineNumber":197,"author":{"gitId":"-"},"content":" });"},{"lineNumber":198,"author":{"gitId":"-"},"content":"};"},{"lineNumber":199,"author":{"gitId":"-"},"content":""},{"lineNumber":200,"author":{"gitId":"-"},"content":"export const ISSUE_PENDING_MODERATION \u003d new GithubIssue({"},{"lineNumber":201,"author":{"gitId":"-"},"content":" id: \u0027574674360\u0027,"},{"lineNumber":202,"author":{"gitId":"-"},"content":" number: 26,"},{"lineNumber":203,"author":{"gitId":"-"},"content":" assignees: [USER_SHUMING_ASSIGNEE_DETAILS],"},{"lineNumber":204,"author":{"gitId":"-"},"content":" body: ISSUE_BODY,"},{"lineNumber":205,"author":{"gitId":"-"},"content":" created_at: \u00272020-03-03T13:38:32Z\u0027,"},{"lineNumber":206,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_FUNCTIONALITY_BUG, GITHUB_LABEL_MEDIUM_SEVERITY],"},{"lineNumber":207,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":208,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":209,"author":{"gitId":"-"},"content":" title: \u0027Basic Issue, Three Disputes, Unsure\u0027,"},{"lineNumber":210,"author":{"gitId":"-"},"content":" updated_at: \u00272020-08-15T06:39:40Z\u0027,"},{"lineNumber":211,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/26\u0027,"},{"lineNumber":212,"author":{"gitId":"-"},"content":" user: USER_SHUMING_DETAILS,"},{"lineNumber":213,"author":{"gitId":"-"},"content":" comments: [PENDING_TUTOR_MODERATION]"},{"lineNumber":214,"author":{"gitId":"-"},"content":"});"},{"lineNumber":215,"author":{"gitId":"-"},"content":""},{"lineNumber":216,"author":{"gitId":"-"},"content":"export const ISSUE_PENDING_MODERATION_HIGH_SEVERITY_FEATURE_FLAW \u003d new GithubIssue({"},{"lineNumber":217,"author":{"gitId":"-"},"content":" id: \u0027239538360\u0027,"},{"lineNumber":218,"author":{"gitId":"-"},"content":" number: 93,"},{"lineNumber":219,"author":{"gitId":"-"},"content":" assignees: [USER_SHUMING_ASSIGNEE_DETAILS],"},{"lineNumber":220,"author":{"gitId":"-"},"content":" body: ISSUE_BODY,"},{"lineNumber":221,"author":{"gitId":"-"},"content":" created_at: \u00272020-10-14T10:28:32Z\u0027,"},{"lineNumber":222,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_FEATURE_FLAW, GITHUB_LABEL_HIGH_SEVERITY],"},{"lineNumber":223,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":224,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":225,"author":{"gitId":"-"},"content":" title: \u0027Redundant buggy feature\u0027,"},{"lineNumber":226,"author":{"gitId":"-"},"content":" updated_at: \u00272020-11-25T13:19:40Z\u0027,"},{"lineNumber":227,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/26\u0027,"},{"lineNumber":228,"author":{"gitId":"-"},"content":" user: USER_SHUMING_DETAILS,"},{"lineNumber":229,"author":{"gitId":"-"},"content":" comments: [PENDING_TUTOR_MODERATION]"},{"lineNumber":230,"author":{"gitId":"-"},"content":"});"},{"lineNumber":231,"author":{"gitId":"-"},"content":""},{"lineNumber":232,"author":{"gitId":"-"},"content":"export const ISSUE_PENDING_MODERATION_LOW_SEVERITY_DOCUMENTATION_BUG \u003d new GithubIssue({"},{"lineNumber":233,"author":{"gitId":"-"},"content":" id: \u0027384756360\u0027,"},{"lineNumber":234,"author":{"gitId":"-"},"content":" number: 6,"},{"lineNumber":235,"author":{"gitId":"-"},"content":" assignees: [USER_SHUMING_ASSIGNEE_DETAILS],"},{"lineNumber":236,"author":{"gitId":"-"},"content":" body: ISSUE_BODY,"},{"lineNumber":237,"author":{"gitId":"-"},"content":" created_at: \u00272020-03-26T09:08:12Z\u0027,"},{"lineNumber":238,"author":{"gitId":"-"},"content":" labels: [GITHUB_LABEL_TEAM_LABEL, GITHUB_LABEL_TUTORIAL_LABEL, GITHUB_LABEL_DOCUMENTATION_BUG, GITHUB_LABEL_LOW_SEVERITY],"},{"lineNumber":239,"author":{"gitId":"-"},"content":" state: IssueState.Open,"},{"lineNumber":240,"author":{"gitId":"-"},"content":" stateReason: IssueStateReason.Reopened,"},{"lineNumber":241,"author":{"gitId":"-"},"content":" title: \u0027Documentation bug, too many typos\u0027,"},{"lineNumber":242,"author":{"gitId":"-"},"content":" updated_at: \u00272020-11-10T16:59:40Z\u0027,"},{"lineNumber":243,"author":{"gitId":"-"},"content":" url: \u0027https://api.github.com/repos/CATcher-org/pe-results/issues/26\u0027,"},{"lineNumber":244,"author":{"gitId":"-"},"content":" user: USER_SHUMING_DETAILS,"},{"lineNumber":245,"author":{"gitId":"-"},"content":" comments: [PENDING_TUTOR_MODERATION]"},{"lineNumber":246,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"NereusWB922":32,"-":214}},{"path":"tests/constants/githublabel.constants.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { GithubLabel } from \u0027../../src/app/core/models/github/github-label.model\u0027;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_FUNCTIONALITY_BUG \u003d {"},{"lineNumber":4,"author":{"gitId":"-"},"content":" color: \u00279900cc\u0027,"},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":" name: \u0027type.FunctionalityBug\u0027"},{"lineNumber":6,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_FEATURE_FLAW \u003d {"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" color: \u0027d966ff\u0027,"},{"lineNumber":10,"author":{"gitId":"NereusWB922"},"content":" name: \u0027type.FeatureFlaw\u0027"},{"lineNumber":11,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_DOCUMENTATION_BUG \u003d {"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" color: \u0027d966ff\u0027,"},{"lineNumber":15,"author":{"gitId":"NereusWB922"},"content":" name: \u0027type.DocumentationBug\u0027"},{"lineNumber":16,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_LOW_SEVERITY \u003d {"},{"lineNumber":19,"author":{"gitId":"NereusWB922"},"content":" color: \u0027ffcccc\u0027,"},{"lineNumber":20,"author":{"gitId":"NereusWB922"},"content":" name: \u0027severity.Low\u0027"},{"lineNumber":21,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_HIGH_SEVERITY \u003d {"},{"lineNumber":24,"author":{"gitId":"NereusWB922"},"content":" color: \u0027ff6666\u0027,"},{"lineNumber":25,"author":{"gitId":"NereusWB922"},"content":" name: \u0027severity.High\u0027"},{"lineNumber":26,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":27,"author":{"gitId":"-"},"content":""},{"lineNumber":28,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_MEDIUM_SEVERITY \u003d {"},{"lineNumber":29,"author":{"gitId":"-"},"content":" color: \u0027ff9999\u0027,"},{"lineNumber":30,"author":{"gitId":"NereusWB922"},"content":" name: \u0027severity.Medium\u0027"},{"lineNumber":31,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":32,"author":{"gitId":"-"},"content":""},{"lineNumber":33,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_TUTORIAL_LABEL \u003d {"},{"lineNumber":34,"author":{"gitId":"-"},"content":" color: \u0027c2e0c6\u0027,"},{"lineNumber":35,"author":{"gitId":"NereusWB922"},"content":" name: \u0027tutorial.CS2103T-W12\u0027"},{"lineNumber":36,"author":{"gitId":"-"},"content":"} as GithubLabel;"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":"export const GITHUB_LABEL_TEAM_LABEL \u003d {"},{"lineNumber":39,"author":{"gitId":"NereusWB922"},"content":" color: \u0027d4c5f9\u0027,"},{"lineNumber":40,"author":{"gitId":"NereusWB922"},"content":" name: \u0027team.3\u0027"},{"lineNumber":41,"author":{"gitId":"-"},"content":"} as GithubLabel;"}],"authorContributionMap":{"NereusWB922":13,"-":28}},{"path":"tests/constants/session.constants.ts","fileType":"ts","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"import { Phase } from \u0027../../src/app/core/models/phase.model\u0027;"},{"lineNumber":2,"author":{"gitId":"NereusWB922"},"content":"import { Repo } from \u0027../../src/app/core/models/repo.model\u0027;"},{"lineNumber":3,"author":{"gitId":"NereusWB922"},"content":"import { SessionData, SessionRepo } from \u0027../../src/app/core/models/session.model\u0027;"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"NereusWB922"},"content":"export const WATCHER_REPO: Repo \u003d Repo.of(\u0027CATcher-org/WATcher\u0027);"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"NereusWB922"},"content":"const ISSUES_VIEWER_SESSION_REPO: SessionRepo \u003d {"},{"lineNumber":8,"author":{"gitId":"NereusWB922"},"content":" phase: Phase.issuesViewer,"},{"lineNumber":9,"author":{"gitId":"NereusWB922"},"content":" repos: [WATCHER_REPO]"},{"lineNumber":10,"author":{"gitId":"-"},"content":"};"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"NereusWB922"},"content":"const ACTIVITY_DASHBOARD_SESSION_REPO: SessionRepo \u003d {"},{"lineNumber":13,"author":{"gitId":"NereusWB922"},"content":" phase: Phase.activityDashboard,"},{"lineNumber":14,"author":{"gitId":"NereusWB922"},"content":" repos: [WATCHER_REPO]"},{"lineNumber":15,"author":{"gitId":"-"},"content":"};"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"NereusWB922"},"content":"export const VALID_SESSION_DATA: SessionData \u003d {"},{"lineNumber":18,"author":{"gitId":"NereusWB922"},"content":" sessionRepo: [ISSUES_VIEWER_SESSION_REPO, ACTIVITY_DASHBOARD_SESSION_REPO]"},{"lineNumber":19,"author":{"gitId":"-"},"content":"};"}],"authorContributionMap":{"NereusWB922":11,"-":8}}] diff --git a/CATcher-org_WATcher_main/commits.json b/CATcher-org_WATcher_main/commits.json index 3336bc7..12355a9 100644 --- a/CATcher-org_WATcher_main/commits.json +++ b/CATcher-org_WATcher_main/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"xenosf":[],"sopa301":[],"mingyuanc":[],"jingting1412":[],"KevinEyo1":[],"LamJiuFong":[],"yiwen101":[],"jonasongg":[],"domoberzin":[],"asdfghjkxd":[],"yuanxi1":[],"supermii2":[],"marquestye":[],"nknguyenhc":[{"date":"2024-02-06","commitResults":[{"hash":"043311b90c12118a4d9d8468a64e1fc7021ad64d","isMergeCommit":false,"messageTitle":"Fix label filter not working (#230)","messageBody":"Fix label filter not working\r\n\r\nFilters takes the value of `label.formattedName` instead of `label.name`.","fileTypesAndContributionMap":{"html":{"insertions":13,"deletions":5}}}]},{"date":"2024-02-13","commitResults":[{"hash":"64a68624b77c88cee70cd870e2966c1c27b89eb8","isMergeCommit":false,"messageTitle":"Add column of hidden users (#235)","messageBody":"After #192, assignees of a repo without any issues or PRs\r\nare hidden. Now, add the column to display such users\r\nwith 0 PRs and issues.\r\n\r\nCo-authored-by: Gabriel Goh \u003c77230723+gycgabriel@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"css":{"insertions":82,"deletions":0},"html":{"insertions":24,"deletions":0},"ts":{"insertions":44,"deletions":2}}}]}],"Arif-Khalid":[{"date":"2024-01-25","commitResults":[{"hash":"79602d69bd13e2ab8c06ab6d9a6eca8b4a61e8b0","isMergeCommit":false,"messageTitle":"Hide 0 issue columns (#223)","messageBody":"Hide 0 issue columns.\r\n\r\n0 Issue columns are shown.\r\n\r\nHiding issues with 0 columns reduces the clutter on screen, \r\ncreating a better user experience. \r\nIllogical columns such as issues that are unassigned when sorting by\r\npull requests are also removed inherently.\r\n\r\nLet\u0027s add logic to hide the columns when they have no issues \r\nassociated to them.","fileTypesAndContributionMap":{"html":{"insertions":10,"deletions":1},"ts":{"insertions":15,"deletions":2}}}]},{"date":"2024-02-06","commitResults":[{"hash":"cd0d7e9f2a5169307c0c92a89a33e24610381839","isMergeCommit":false,"messageTitle":"Remove unused services (#238)","messageBody":"Couple of unused services copied from CATcher.\r\n\r\nUnused code should be removed to simplify code base \r\nand improve developer experience.\r\n\r\nLet\u0027s remove these unused services.","fileTypesAndContributionMap":{"ts":{"insertions":0,"deletions":359}}}]},{"date":"2024-02-14","commitResults":[{"hash":"5031ee2e33b49d0275892849703b81a1fc028a3d","isMergeCommit":false,"messageTitle":"Remove unused models in WATcher","messageBody":"There are a few of unused models ported from CATcher.\r\n\r\nUnnecessary models contributes to code clutter and hurts understandability\r\nof code base.\r\n\r\nLet\u0027s remove these unused models from WATcher to increase code cleanliness.","fileTypesAndContributionMap":{"ts":{"insertions":0,"deletions":40}}},{"hash":"09ef51d1e360350d0d73a4a66063df59f805d3e2","isMergeCommit":false,"messageTitle":"Remove unused session-fix-confirmation component in WATcher","messageBody":"This is a component only used in CATcher.\r\n\r\nUnnecessary components contributes to code clutter and hurts understandability\r\nof code base.\r\n\r\nLet\u0027s remove this unused component from WATcher to increase code cleanliness.","fileTypesAndContributionMap":{"css":{"insertions":0,"deletions":0},"html":{"insertions":0,"deletions":9},"ts":{"insertions":1,"deletions":27}}}]}],"NereusWB922":[{"date":"2024-02-06","commitResults":[{"hash":"552868032ec6a8340d1f8c8d662ad22189d134f1","isMergeCommit":false,"messageTitle":"Improve activity dashboard design (#233)","messageBody":"Improve activity dashboard design\r\n\r\nThe ID column in the event table is not useful for the user.\r\n\r\nThe design of the dashboard is too simple. The event table\u0027s height is\r\nnot fixed, and the expanded event details might cause the table to be\r\ntoo long, which is very inconvenient.\r\n\r\nTo address this, let\u0027s hide the ID column, add some information about\r\nthe actor, fix the event table height and make it scrollable, and\r\nimplement a dialog to display event details.","fileTypesAndContributionMap":{"css":{"insertions":129,"deletions":10},"html":{"insertions":72,"deletions":67},"ts":{"insertions":48,"deletions":18}}}]},{"date":"2024-02-08","commitResults":[{"hash":"a6efcb9a2fa9bcd321c37a824e4d2aafa8d07a81","isMergeCommit":false,"messageTitle":"Refactor test cases","messageBody":"The test cases for the Login Component and Session Model are outdated. \r\n\r\nAdditionally, the Conflict Model has been removed. \r\n\r\nLet\u0027s refactor the test cases for the Login Component and Session Model \r\nand remove the test cases for the Conflict Model.\r\n","fileTypesAndContributionMap":{"ts":{"insertions":86,"deletions":106}}},{"hash":"339b319aaa87913d2109774f1fc6826d37992172","isMergeCommit":false,"messageTitle":"Refactor test cases for issue paginator","messageBody":"The test cases for the issue paginator are outdated. \r\n\r\nLet\u0027s refactor the test cases for the issue paginator.","fileTypesAndContributionMap":{"ts":{"insertions":4,"deletions":9}}},{"hash":"6dc82ffeb34973054ecfb3a10ea107f2c653c7cc","isMergeCommit":false,"messageTitle":"Refactor test cases for issue sorter","messageBody":"The test cases for the issue sorter are outdated. \r\n\r\nLet\u0027s refactor the test cases for the issue sorter.","fileTypesAndContributionMap":{"ts":{"insertions":57,"deletions":15}}},{"hash":"aefd63e82bad15390696d3aa88c9cbe93cdecaf4","isMergeCommit":false,"messageTitle":"Refactor github label constants","messageBody":"GithubLabel model\u0027s properties have been changed.\r\n\r\nLet\u0027s refactor the github label constants.","fileTypesAndContributionMap":{"ts":{"insertions":13,"deletions":29}}},{"hash":"bb4cb781ae5ba81e77cd83d789277530d37aaea6","isMergeCommit":false,"messageTitle":"Refactor test cases for search filter","messageBody":"The test cases for the search filter are outdated. \r\n\r\nLet\u0027s refactor the test cases for the search filter.","fileTypesAndContributionMap":{"ts":{"insertions":9,"deletions":48}}}]}],"dishenggg":[],"MadLamprey":[{"date":"2024-01-27","commitResults":[{"hash":"bb4a7f4063c0aa33b80188a83bfc610fe147950a","isMergeCommit":false,"messageTitle":"Prevent redirection when repo not set (#228)","messageBody":"Co-authored-by: Misra Aditya \u003ce1096355@u.nus.edu\u003e","fileTypesAndContributionMap":{"html":{"insertions":4,"deletions":1}}}]}],"Tim-Siu":[]},"authorFileTypeContributionMap":{"xenosf":{"js":0,"css":0,"html":0,"ts":0},"sopa301":{"js":0,"css":0,"html":0,"ts":0},"mingyuanc":{"js":0,"css":0,"html":0,"ts":0},"jingting1412":{"js":0,"css":0,"html":0,"ts":0},"KevinEyo1":{"js":0,"css":0,"html":0,"ts":0},"LamJiuFong":{"js":0,"css":0,"html":0,"ts":0},"yiwen101":{"js":0,"css":0,"html":0,"ts":0},"jonasongg":{"js":0,"css":0,"html":0,"ts":0},"domoberzin":{"js":0,"css":0,"html":0,"ts":0},"asdfghjkxd":{"js":0,"css":0,"html":0,"ts":0},"yuanxi1":{"js":0,"css":0,"html":0,"ts":0},"supermii2":{"js":0,"css":0,"html":0,"ts":0},"marquestye":{"js":0,"css":0,"html":0,"ts":0},"nknguyenhc":{"js":0,"css":82,"html":37,"ts":44},"Arif-Khalid":{"js":0,"css":0,"html":10,"ts":15},"NereusWB922":{"js":0,"css":129,"html":36,"ts":215},"dishenggg":{"js":0,"css":0,"html":0,"ts":0},"MadLamprey":{"js":0,"css":0,"html":4,"ts":0},"Tim-Siu":{"js":0,"css":0,"html":0,"ts":0}},"authorContributionVariance":{"xenosf":0.0,"sopa301":0.0,"mingyuanc":0.0,"jingting1412":0.0,"KevinEyo1":0.0,"LamJiuFong":0.0,"yiwen101":0.0,"jonasongg":0.0,"domoberzin":0.0,"asdfghjkxd":0.0,"yuanxi1":0.0,"supermii2":0.0,"marquestye":0.0,"nknguyenhc":303.25967,"Arif-Khalid":1746.8573,"NereusWB922":3327.5122,"dishenggg":0.0,"MadLamprey":0.32461897,"Tim-Siu":0.0},"authorDisplayNameMap":{"xenosf":"XENO..NONG","sopa301":"POON..RYAN","mingyuanc":"CHIN..YUAN","jingting1412":"WANG..TING","KevinEyo1":"EYO ..EVIN","LamJiuFong":"LAM ..FONG","yiwen101":"WANG..IWEN","jonasongg":"JONA.. WEI","domoberzin":"DOMI.. GIN","asdfghjkxd":"GEOR.. YAO","yuanxi1":"ZHU ..ANXI","supermii2":"ALVI..S NG","marquestye":"TYE ..QUES","nknguyenhc":"NGUY..UYEN","Arif-Khalid":"ARIF..ALID","NereusWB922":"NERE.. BIN","dishenggg":"YEO ..HENG","MadLamprey":"MISR..ITYA","Tim-Siu":"XU S..UYAO"}} +{"authorDailyContributionsMap":{"xenosf":[],"sopa301":[],"mingyuanc":[],"jingting1412":[],"KevinEyo1":[],"LamJiuFong":[],"yiwen101":[],"jonasongg":[],"domoberzin":[],"asdfghjkxd":[],"yuanxi1":[],"supermii2":[],"marquestye":[],"nknguyenhc":[{"date":"2024-02-06","commitResults":[{"hash":"043311b90c12118a4d9d8468a64e1fc7021ad64d","isMergeCommit":false,"messageTitle":"Fix label filter not working (#230)","messageBody":"Fix label filter not working\r\n\r\nFilters takes the value of `label.formattedName` instead of `label.name`.","fileTypesAndContributionMap":{"html":{"insertions":13,"deletions":5}}}]},{"date":"2024-02-13","commitResults":[{"hash":"64a68624b77c88cee70cd870e2966c1c27b89eb8","isMergeCommit":false,"messageTitle":"Add column of hidden users (#235)","messageBody":"After #192, assignees of a repo without any issues or PRs\r\nare hidden. Now, add the column to display such users\r\nwith 0 PRs and issues.\r\n\r\nCo-authored-by: Gabriel Goh \u003c77230723+gycgabriel@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"css":{"insertions":82,"deletions":0},"html":{"insertions":24,"deletions":0},"ts":{"insertions":44,"deletions":2}}}]},{"date":"2024-02-19","commitResults":[{"hash":"d6dadf4a49a6fc19e2eaa99bb37c7fe89f458a81","isMergeCommit":false,"messageTitle":"Refactor Label model (#254)","messageBody":"Previously, label full names are separated into label name\r\nand label category. However, this is not necessary for WATcher.\r\n\r\nLet\u0027s remove the separation so that filters only make use\r\nof the full name.","fileTypesAndContributionMap":{"html":{"insertions":6,"deletions":14},"ts":{"insertions":6,"deletions":14}}}]}],"Arif-Khalid":[{"date":"2024-01-25","commitResults":[{"hash":"79602d69bd13e2ab8c06ab6d9a6eca8b4a61e8b0","isMergeCommit":false,"messageTitle":"Hide 0 issue columns (#223)","messageBody":"Hide 0 issue columns.\r\n\r\n0 Issue columns are shown.\r\n\r\nHiding issues with 0 columns reduces the clutter on screen, \r\ncreating a better user experience. \r\nIllogical columns such as issues that are unassigned when sorting by\r\npull requests are also removed inherently.\r\n\r\nLet\u0027s add logic to hide the columns when they have no issues \r\nassociated to them.","fileTypesAndContributionMap":{"html":{"insertions":10,"deletions":1},"ts":{"insertions":15,"deletions":2}}}]},{"date":"2024-02-06","commitResults":[{"hash":"cd0d7e9f2a5169307c0c92a89a33e24610381839","isMergeCommit":false,"messageTitle":"Remove unused services (#238)","messageBody":"Couple of unused services copied from CATcher.\r\n\r\nUnused code should be removed to simplify code base \r\nand improve developer experience.\r\n\r\nLet\u0027s remove these unused services.","fileTypesAndContributionMap":{"ts":{"insertions":0,"deletions":359}}}]},{"date":"2024-02-14","commitResults":[{"hash":"5031ee2e33b49d0275892849703b81a1fc028a3d","isMergeCommit":false,"messageTitle":"Remove unused models in WATcher","messageBody":"There are a few of unused models ported from CATcher.\r\n\r\nUnnecessary models contributes to code clutter and hurts understandability\r\nof code base.\r\n\r\nLet\u0027s remove these unused models from WATcher to increase code cleanliness.","fileTypesAndContributionMap":{"ts":{"insertions":0,"deletions":40}}},{"hash":"09ef51d1e360350d0d73a4a66063df59f805d3e2","isMergeCommit":false,"messageTitle":"Remove unused session-fix-confirmation component in WATcher","messageBody":"This is a component only used in CATcher.\r\n\r\nUnnecessary components contributes to code clutter and hurts understandability\r\nof code base.\r\n\r\nLet\u0027s remove this unused component from WATcher to increase code cleanliness.","fileTypesAndContributionMap":{"css":{"insertions":0,"deletions":0},"html":{"insertions":0,"deletions":9},"ts":{"insertions":1,"deletions":27}}}]}],"NereusWB922":[{"date":"2024-02-06","commitResults":[{"hash":"552868032ec6a8340d1f8c8d662ad22189d134f1","isMergeCommit":false,"messageTitle":"Improve activity dashboard design (#233)","messageBody":"Improve activity dashboard design\r\n\r\nThe ID column in the event table is not useful for the user.\r\n\r\nThe design of the dashboard is too simple. The event table\u0027s height is\r\nnot fixed, and the expanded event details might cause the table to be\r\ntoo long, which is very inconvenient.\r\n\r\nTo address this, let\u0027s hide the ID column, add some information about\r\nthe actor, fix the event table height and make it scrollable, and\r\nimplement a dialog to display event details.","fileTypesAndContributionMap":{"css":{"insertions":129,"deletions":10},"html":{"insertions":72,"deletions":67},"ts":{"insertions":48,"deletions":18}}}]},{"date":"2024-02-08","commitResults":[{"hash":"a6efcb9a2fa9bcd321c37a824e4d2aafa8d07a81","isMergeCommit":false,"messageTitle":"Refactor test cases","messageBody":"The test cases for the Login Component and Session Model are outdated. \r\n\r\nAdditionally, the Conflict Model has been removed. \r\n\r\nLet\u0027s refactor the test cases for the Login Component and Session Model \r\nand remove the test cases for the Conflict Model.\r\n","fileTypesAndContributionMap":{"ts":{"insertions":86,"deletions":106}}},{"hash":"339b319aaa87913d2109774f1fc6826d37992172","isMergeCommit":false,"messageTitle":"Refactor test cases for issue paginator","messageBody":"The test cases for the issue paginator are outdated. \r\n\r\nLet\u0027s refactor the test cases for the issue paginator.","fileTypesAndContributionMap":{"ts":{"insertions":4,"deletions":9}}},{"hash":"6dc82ffeb34973054ecfb3a10ea107f2c653c7cc","isMergeCommit":false,"messageTitle":"Refactor test cases for issue sorter","messageBody":"The test cases for the issue sorter are outdated. \r\n\r\nLet\u0027s refactor the test cases for the issue sorter.","fileTypesAndContributionMap":{"ts":{"insertions":57,"deletions":15}}},{"hash":"aefd63e82bad15390696d3aa88c9cbe93cdecaf4","isMergeCommit":false,"messageTitle":"Refactor github label constants","messageBody":"GithubLabel model\u0027s properties have been changed.\r\n\r\nLet\u0027s refactor the github label constants.","fileTypesAndContributionMap":{"ts":{"insertions":13,"deletions":29}}},{"hash":"bb4cb781ae5ba81e77cd83d789277530d37aaea6","isMergeCommit":false,"messageTitle":"Refactor test cases for search filter","messageBody":"The test cases for the search filter are outdated. \r\n\r\nLet\u0027s refactor the test cases for the search filter.","fileTypesAndContributionMap":{"ts":{"insertions":9,"deletions":48}}}]}],"dishenggg":[],"MadLamprey":[{"date":"2024-01-27","commitResults":[{"hash":"bb4a7f4063c0aa33b80188a83bfc610fe147950a","isMergeCommit":false,"messageTitle":"Prevent redirection when repo not set (#228)","messageBody":"Co-authored-by: Misra Aditya \u003ce1096355@u.nus.edu\u003e","fileTypesAndContributionMap":{"html":{"insertions":4,"deletions":1}}}]}],"Tim-Siu":[]},"authorFileTypeContributionMap":{"xenosf":{"js":0,"css":0,"html":0,"ts":0},"sopa301":{"js":0,"css":0,"html":0,"ts":0},"mingyuanc":{"js":0,"css":0,"html":0,"ts":0},"jingting1412":{"js":0,"css":0,"html":0,"ts":0},"KevinEyo1":{"js":0,"css":0,"html":0,"ts":0},"LamJiuFong":{"js":0,"css":0,"html":0,"ts":0},"yiwen101":{"js":0,"css":0,"html":0,"ts":0},"jonasongg":{"js":0,"css":0,"html":0,"ts":0},"domoberzin":{"js":0,"css":0,"html":0,"ts":0},"asdfghjkxd":{"js":0,"css":0,"html":0,"ts":0},"yuanxi1":{"js":0,"css":0,"html":0,"ts":0},"supermii2":{"js":0,"css":0,"html":0,"ts":0},"marquestye":{"js":0,"css":0,"html":0,"ts":0},"nknguyenhc":{"js":0,"css":82,"html":25,"ts":50},"Arif-Khalid":{"js":0,"css":0,"html":10,"ts":15},"NereusWB922":{"js":0,"css":129,"html":36,"ts":215},"dishenggg":{"js":0,"css":0,"html":0,"ts":0},"MadLamprey":{"js":0,"css":0,"html":4,"ts":0},"Tim-Siu":{"js":0,"css":0,"html":0,"ts":0}},"authorContributionVariance":{"xenosf":0.0,"sopa301":0.0,"mingyuanc":0.0,"jingting1412":0.0,"KevinEyo1":0.0,"LamJiuFong":0.0,"yiwen101":0.0,"jonasongg":0.0,"domoberzin":0.0,"asdfghjkxd":0.0,"yuanxi1":0.0,"supermii2":0.0,"marquestye":0.0,"nknguyenhc":302.26608,"Arif-Khalid":1641.1852,"NereusWB922":3127.3093,"dishenggg":0.0,"MadLamprey":0.3048317,"Tim-Siu":0.0},"authorDisplayNameMap":{"xenosf":"XENO..NONG","sopa301":"POON..RYAN","mingyuanc":"CHIN..YUAN","jingting1412":"WANG..TING","KevinEyo1":"EYO ..EVIN","LamJiuFong":"LAM ..FONG","yiwen101":"WANG..IWEN","jonasongg":"JONA.. WEI","domoberzin":"DOMI.. GIN","asdfghjkxd":"GEOR.. YAO","yuanxi1":"ZHU ..ANXI","supermii2":"ALVI..S NG","marquestye":"TYE ..QUES","nknguyenhc":"NGUY..UYEN","Arif-Khalid":"ARIF..ALID","NereusWB922":"NERE.. BIN","dishenggg":"YEO ..HENG","MadLamprey":"MISR..ITYA","Tim-Siu":"XU S..UYAO"}} diff --git a/archive.zip b/archive.zip index 6ccf01eed8e98f08a685b7c28510c287acc35e68..69ebd4f18f2b2aa4330bb9427564fae49c12df2e 100644 GIT binary patch delta 190178 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®#%~*nSeRNB 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 delta 163608 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 p8cgrh^e}QKrebZXG&NF-L(lM=;?}R0n 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 Npm@L9DE?Ez{{dV6Ktccj diff --git a/reposense-logs/reposense.log.0 b/reposense-logs/reposense.log.0 index 823b438..3204111 100644 --- a/reposense-logs/reposense.log.0 +++ b/reposense-logs/reposense.log.0 @@ -1,1546 +1,1546 @@ -Feb 19, 2024 12:02:24 AM reposense.system.LogsManager addFileHandler +Feb 20, 2024 12:02:05 AM reposense.system.LogsManager addFileHandler INFO: Log temp folder has been successfully created -Feb 19, 2024 12:02:24 AM reposense.parser.CsvParser validateHeader +Feb 20, 2024 12:02:06 AM reposense.parser.CsvParser validateHeader INFO: Parsed header of CSV file, repo-config.csv, and recognized columns: Ignore Standalone Config, Repository's Location, Branch, Shallow Cloning, File formats, Ignore Glob List, Ignore Authors List, Find Previous Authors, Ignore Commits List -Feb 19, 2024 12:02:24 AM reposense.parser.CsvParser validateHeader +Feb 20, 2024 12:02:06 AM reposense.parser.CsvParser validateHeader INFO: Parsed header of CSV file, author-config.csv, and recognized columns: Author's Emails, Repository's Location, Author's GitHub ID, Branch, Author's Display Name, Ignore Glob List, Author's Git Author Name -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias marquestye found. The alias will belong to the last author - marquestye -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias marquestye found. The alias will belong to the last author - marquestye -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias marquestye found. The alias will belong to the last author - marquestye -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias marquestye found. The alias will belong to the last author - marquestye -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias marquestye found. The alias will belong to the last author - marquestye -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias marquestye found. The alias will belong to the last author - marquestye -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias arif-khalid found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias arif-khalid found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias arif-khalid found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias arif-khalid found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias arif-khalid found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias arif-khalid found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias kevineyo1 found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias kevineyo1 found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias kevineyo1 found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias kevineyo1 found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias kevineyo1 found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias kevineyo1 found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias domoberzin found. The alias will belong to the last author - domoberzin -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - domoberzin -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias domoberzin found. The alias will belong to the last author - domoberzin -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - domoberzin -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias domoberzin found. The alias will belong to the last author - domoberzin -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - domoberzin -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias domoberzin found. The alias will belong to the last author - domoberzin -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - domoberzin -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias domoberzin found. The alias will belong to the last author - domoberzin -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - domoberzin -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias domoberzin found. The alias will belong to the last author - domoberzin -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - domoberzin -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yuanxi1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yuanxi1 found. The alias will belong to the last author - yuanxi1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yuanxi1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yuanxi1 found. The alias will belong to the last author - yuanxi1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yuanxi1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yuanxi1 found. The alias will belong to the last author - yuanxi1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yuanxi1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yuanxi1 found. The alias will belong to the last author - yuanxi1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yuanxi1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yuanxi1 found. The alias will belong to the last author - yuanxi1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yuanxi1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yuanxi1 found. The alias will belong to the last author - yuanxi1 -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias dishenggg found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias dishenggg found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias dishenggg found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias dishenggg found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias dishenggg found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias dishenggg found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:24 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias supermii2 found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias supermii2 found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias supermii2 found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias supermii2 found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias supermii2 found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias supermii2 found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jonasongg found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jonasongg found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jonasongg found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jonasongg found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jonasongg found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jonasongg found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nereuswb922 found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nereuswb922 found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nereuswb922 found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nereuswb922 found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nereuswb922 found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nereuswb922 found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lamjiufong found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lamjiufong found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lamjiufong found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lamjiufong found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lamjiufong found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lamjiufong found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yiwen101 found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yiwen101 found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yiwen101 found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yiwen101 found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yiwen101 found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yiwen101 found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sopa301 found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sopa301 found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sopa301 found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sopa301 found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sopa301 found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sopa301 found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias mingyuanc found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias mingyuanc found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias mingyuanc found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias mingyuanc found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias mingyuanc found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias mingyuanc found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nknguyenhc found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nknguyenhc found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nknguyenhc found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nknguyenhc found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nknguyenhc found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nknguyenhc found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jingting1412 found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jingting1412 found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jingting1412 found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jingting1412 found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jingting1412 found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jingting1412 found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias tim-siu found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias tim-siu found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias tim-siu found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias tim-siu found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias tim-siu found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias tim-siu found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias marquestye found. The alias will belong to the last author - marquestye -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias arif-khalid found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias kevineyo1 found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias domoberzin found. The alias will belong to the last author - domoberzin -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - domoberzin -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yuanxi1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yuanxi1 found. The alias will belong to the last author - yuanxi1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias dishenggg found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias supermii2 found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jonasongg found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nereuswb922 found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lamjiufong found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yiwen101 found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sopa301 found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias mingyuanc found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nknguyenhc found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jingting1412 found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias tim-siu found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias marquestye found. The alias will belong to the last author - marquestye -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias arif-khalid found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias kevineyo1 found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias domoberzin found. The alias will belong to the last author - domoberzin -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - domoberzin -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yuanxi1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yuanxi1 found. The alias will belong to the last author - yuanxi1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias dishenggg found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias supermii2 found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jonasongg found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nereuswb922 found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lamjiufong found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yiwen101 found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sopa301 found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias mingyuanc found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nknguyenhc found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jingting1412 found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias tim-siu found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias marquestye found. The alias will belong to the last author - marquestye -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias arif-khalid found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias kevineyo1 found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias domoberzin found. The alias will belong to the last author - domoberzin -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - domoberzin -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yuanxi1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yuanxi1 found. The alias will belong to the last author - yuanxi1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias dishenggg found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias supermii2 found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jonasongg found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nereuswb922 found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lamjiufong found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yiwen101 found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sopa301 found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias mingyuanc found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nknguyenhc found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jingting1412 found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias tim-siu found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias marquestye found. The alias will belong to the last author - marquestye -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias arif-khalid found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias kevineyo1 found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias domoberzin found. The alias will belong to the last author - domoberzin -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - domoberzin -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yuanxi1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yuanxi1 found. The alias will belong to the last author - yuanxi1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias dishenggg found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias supermii2 found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jonasongg found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nereuswb922 found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lamjiufong found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yiwen101 found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sopa301 found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias mingyuanc found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nknguyenhc found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jingting1412 found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias tim-siu found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias marquestye found. The alias will belong to the last author - marquestye -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias arif-khalid found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias kevineyo1 found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias domoberzin found. The alias will belong to the last author - domoberzin -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - domoberzin -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yuanxi1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yuanxi1 found. The alias will belong to the last author - yuanxi1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias dishenggg found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias supermii2 found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jonasongg found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nereuswb922 found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lamjiufong found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yiwen101 found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sopa301 found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias mingyuanc found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nknguyenhc found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jingting1412 found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias tim-siu found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias marquestye found. The alias will belong to the last author - marquestye -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias arif-khalid found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Arif-Khalid -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias kevineyo1 found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - KevinEyo1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias domoberzin found. The alias will belong to the last author - domoberzin -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - domoberzin -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yuanxi1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yuanxi1 found. The alias will belong to the last author - yuanxi1 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias dishenggg found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - dishenggg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - asdfghjkxd -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias supermii2 found. The alias will belong to the last author - supermii2 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jonasongg found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jonasongg -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nereuswb922 found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - NereusWB922 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lamjiufong found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - LamJiuFong -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - xenosf -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias yiwen101 found. The alias will belong to the last author - yiwen101 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sopa301 found. The alias will belong to the last author - sopa301 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias mingyuanc found. The alias will belong to the last author - mingyuanc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias nknguyenhc found. The alias will belong to the last author - nknguyenhc -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jingting1412 found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - jingting1412 -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias tim-siu found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - Tim-Siu -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias sean leong found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jiachen found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Feb 20, 2024 12:02:06 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias lzq found. The alias will belong to the last author - MadLamprey -Feb 19, 2024 12:02:25 AM reposense.git.GitConfig getGlobalGitLfsConfig +Feb 20, 2024 12:02:06 AM reposense.git.GitConfig getGlobalGitLfsConfig WARNING: Could not get global git lfs config java.lang.RuntimeException: reposense.system.CommandRunnerProcessException: Error returned from command git config --global --list on path . : fatal: unable to read config file '/home/runner/.gitconfig': No such file or directory @@ -1556,117 +1556,117 @@ fatal: unable to read config file '/home/runner/.gitconfig': No such file or dir at reposense.system.CommandRunner.runCommand(CommandRunner.java:21) ... 3 more -Feb 19, 2024 12:02:25 AM reposense.report.RepoCloner spawnCloneProcess +Feb 20, 2024 12:02:06 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/TEAMMATES/teammates.git... +Feb 20, 2024 12:02:06 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/markbind/markbind.git... -Feb 19, 2024 12:02:25 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/reposense/reposense.git... -Feb 19, 2024 12:02:25 AM reposense.report.RepoCloner spawnCloneProcess +Feb 20, 2024 12:02:06 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/CATcher-org/WATcher.git... -Feb 19, 2024 12:02:25 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/TEAMMATES/teammates.git... -Feb 19, 2024 12:02:25 AM reposense.report.RepoCloner waitForCloneProcess +Feb 20, 2024 12:02:06 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/reposense/reposense.git... +Feb 20, 2024 12:02:06 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/CATcher-org/WATcher.git to complete... +Feb 20, 2024 12:02:06 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/TEAMMATES/teammates.git to complete... -Feb 19, 2024 12:02:25 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/markbind/markbind.git to complete... -Feb 19, 2024 12:02:25 AM reposense.report.RepoCloner waitForCloneProcess +Feb 20, 2024 12:02:06 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/reposense/reposense.git to complete... -Feb 19, 2024 12:02:25 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/CATcher-org/WATcher.git to complete... -Feb 19, 2024 12:02:26 AM reposense.report.RepoCloner waitForCloneProcess +Feb 20, 2024 12:02:06 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/markbind/markbind.git to complete... +Feb 20, 2024 12:02:07 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/CATcher-org/WATcher.git completed! -Feb 19, 2024 12:02:26 AM reposense.report.RepoCloner spawnCloneProcess +Feb 20, 2024 12:02:07 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/CATcher-org/CATcher.git... -Feb 19, 2024 12:02:26 AM reposense.report.ReportGenerator analyzeRepos +Feb 20, 2024 12:02:07 AM reposense.report.ReportGenerator analyzeRepos INFO: [1/6] Analyzing https://github.com/CATcher-org/WATcher.git (main)... -Feb 19, 2024 12:02:26 AM reposense.report.RepoCloner waitForCloneProcess +Feb 20, 2024 12:02:07 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/CATcher-org/CATcher.git to complete... -Feb 19, 2024 12:02:26 AM reposense.report.ReportGenerator updateRepoConfig +Feb 20, 2024 12:02:07 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/CATcher-org/WATcher.git (main) does not contain a standalone config file. -Feb 19, 2024 12:02:26 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Feb 20, 2024 12:02:07 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/CATcher-org/WATcher.git (main)... -Feb 19, 2024 12:02:28 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Feb 20, 2024 12:02:09 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/CATcher-org/WATcher.git (main)... -Feb 19, 2024 12:02:28 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/CATcher-org/WATcher.git (main)... -Feb 19, 2024 12:02:28 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/CATcher-org/WATcher.git (main) completed! -Feb 19, 2024 12:02:28 AM reposense.report.RepoCloner waitForCloneProcess +Feb 20, 2024 12:02:09 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/CATcher-org/CATcher.git completed! -Feb 19, 2024 12:02:28 AM reposense.report.RepoCloner spawnCloneProcess +Feb 20, 2024 12:02:09 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/se-edu/addressbook-level3.git... -Feb 19, 2024 12:02:28 AM reposense.report.ReportGenerator analyzeRepos +Feb 20, 2024 12:02:09 AM reposense.report.ReportGenerator analyzeRepos INFO: [2/6] Analyzing https://github.com/CATcher-org/CATcher.git (master)... -Feb 19, 2024 12:02:28 AM reposense.report.RepoCloner waitForCloneProcess +Feb 20, 2024 12:02:09 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/se-edu/addressbook-level3.git to complete... -Feb 19, 2024 12:02:29 AM reposense.report.ReportGenerator updateRepoConfig +Feb 20, 2024 12:02:09 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/CATcher-org/CATcher.git (master) does not contain a standalone config file. -Feb 19, 2024 12:02:29 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Feb 20, 2024 12:02:09 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/CATcher-org/CATcher.git (master)... -Feb 19, 2024 12:02:29 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Feb 20, 2024 12:02:09 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/CATcher-org/WATcher.git (main)... +Feb 20, 2024 12:02:09 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/CATcher-org/WATcher.git (main) completed! +Feb 20, 2024 12:02:10 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/CATcher-org/CATcher.git (master)... -Feb 19, 2024 12:02:30 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/markbind/markbind.git completed! -Feb 19, 2024 12:02:30 AM reposense.report.ReportGenerator analyzeRepos -INFO: [3/6] Analyzing https://github.com/markbind/markbind.git (master)... -Feb 19, 2024 12:02:30 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Feb 20, 2024 12:02:10 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/CATcher-org/CATcher.git (master)... -Feb 19, 2024 12:02:30 AM reposense.report.ReportGenerator analyzeRepo +Feb 20, 2024 12:02:10 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/CATcher-org/CATcher.git (master) completed! -Feb 19, 2024 12:02:30 AM reposense.report.RepoCloner waitForCloneProcess +Feb 20, 2024 12:02:11 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/se-edu/addressbook-level3.git completed! -Feb 19, 2024 12:02:30 AM reposense.report.ReportGenerator analyzeRepos -INFO: [4/6] Analyzing https://github.com/se-edu/addressbook-level3.git (master)... -Feb 19, 2024 12:02:31 AM reposense.report.ReportGenerator updateRepoConfig +Feb 20, 2024 12:02:11 AM reposense.report.ReportGenerator analyzeRepos +INFO: [3/6] Analyzing https://github.com/se-edu/addressbook-level3.git (master)... +Feb 20, 2024 12:02:11 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/se-edu/addressbook-level3.git (master) does not contain a standalone config file. -Feb 19, 2024 12:02:31 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Feb 20, 2024 12:02:11 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/se-edu/addressbook-level3.git (master)... -Feb 19, 2024 12:02:31 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/markbind/markbind.git (master) does not contain a standalone config file. -Feb 19, 2024 12:02:31 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/markbind/markbind.git (master)... -Feb 19, 2024 12:02:31 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Feb 20, 2024 12:02:11 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/se-edu/addressbook-level3.git (master)... -Feb 19, 2024 12:02:31 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Feb 20, 2024 12:02:11 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/se-edu/addressbook-level3.git (master)... -Feb 19, 2024 12:02:31 AM reposense.report.ReportGenerator analyzeRepo +Feb 20, 2024 12:02:11 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/se-edu/addressbook-level3.git (master) completed! -Feb 19, 2024 12:02:34 AM reposense.report.RepoCloner waitForCloneProcess +Feb 20, 2024 12:02:12 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/markbind/markbind.git completed! +Feb 20, 2024 12:02:12 AM reposense.report.ReportGenerator analyzeRepos +INFO: [4/6] Analyzing https://github.com/markbind/markbind.git (master)... +Feb 20, 2024 12:02:12 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/markbind/markbind.git (master) does not contain a standalone config file. +Feb 20, 2024 12:02:12 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/markbind/markbind.git (master)... +Feb 20, 2024 12:02:14 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/reposense/reposense.git completed! -Feb 19, 2024 12:02:34 AM reposense.report.ReportGenerator analyzeRepos +Feb 20, 2024 12:02:14 AM reposense.report.ReportGenerator analyzeRepos INFO: [5/6] Analyzing https://github.com/reposense/reposense.git (master)... -Feb 19, 2024 12:02:34 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/markbind/markbind.git (master)... -Feb 19, 2024 12:02:34 AM reposense.report.ReportGenerator updateRepoConfig +Feb 20, 2024 12:02:15 AM reposense.report.ReportGenerator updateRepoConfig INFO: Ignoring standalone config file in https://github.com/reposense/reposense.git (master). -Feb 19, 2024 12:02:34 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Feb 20, 2024 12:02:15 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/reposense/reposense.git (master)... -Feb 19, 2024 12:02:34 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Feb 20, 2024 12:02:15 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/markbind/markbind.git (master)... +Feb 20, 2024 12:02:15 AM reposense.authorship.FileInfoExtractor generateFileInfo +WARNING: File "frontend/package-lock.json" has 1156545B size. The file size limit is set at 500000B. Exact line diffs will be excluded from report... +Feb 20, 2024 12:02:15 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/markbind/markbind.git (master)... -Feb 19, 2024 12:02:34 AM reposense.report.ReportGenerator analyzeRepo +Feb 20, 2024 12:02:15 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/markbind/markbind.git (master) completed! -Feb 19, 2024 12:02:35 AM reposense.authorship.FileInfoExtractor generateFileInfo -WARNING: File "frontend/package-lock.json" has 1151635B size. The file size limit is set at 500000B. Exact line diffs will be excluded from report... -Feb 19, 2024 12:02:38 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Feb 20, 2024 12:02:19 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/reposense/reposense.git (master)... -Feb 19, 2024 12:02:38 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Feb 20, 2024 12:02:19 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/reposense/reposense.git (master)... -Feb 19, 2024 12:02:38 AM reposense.report.ReportGenerator analyzeRepo +Feb 20, 2024 12:02:19 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/reposense/reposense.git (master) completed! -Feb 19, 2024 12:02:44 AM reposense.report.RepoCloner waitForCloneProcess +Feb 20, 2024 12:02:25 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/TEAMMATES/teammates.git completed! -Feb 19, 2024 12:02:44 AM reposense.report.ReportGenerator analyzeRepos +Feb 20, 2024 12:02:25 AM reposense.report.ReportGenerator analyzeRepos INFO: [6/6] Analyzing https://github.com/TEAMMATES/teammates.git (master)... -Feb 19, 2024 12:02:44 AM reposense.report.ReportGenerator updateRepoConfig +Feb 20, 2024 12:02:25 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/TEAMMATES/teammates.git (master) does not contain a standalone config file. -Feb 19, 2024 12:02:44 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Feb 20, 2024 12:02:25 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/TEAMMATES/teammates.git (master)... -Feb 19, 2024 12:03:02 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Feb 20, 2024 12:02:44 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/TEAMMATES/teammates.git (master)... -Feb 19, 2024 12:03:02 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Feb 20, 2024 12:02:44 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/TEAMMATES/teammates.git (master)... -Feb 19, 2024 12:03:02 AM reposense.report.ReportGenerator analyzeRepo +Feb 20, 2024 12:02:44 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/TEAMMATES/teammates.git (master) completed! -Feb 19, 2024 12:03:02 AM reposense.report.ReportGenerator generateReposReport +Feb 20, 2024 12:02:44 AM reposense.report.ReportGenerator generateReposReport INFO: The report is generated at /home/runner/work/2024-dashboard/2024-dashboard/reposense-report -Feb 19, 2024 12:03:02 AM reposense.RepoSense main -INFO: Elapsed processing time: 38.01 second(s) +Feb 20, 2024 12:02:44 AM reposense.RepoSense main +INFO: Elapsed processing time: 38.81 second(s) diff --git a/reposense_reposense_master/authorship.json b/reposense_reposense_master/authorship.json index 5f63c62..482faf0 100644 --- a/reposense_reposense_master/authorship.json +++ b/reposense_reposense_master/authorship.json @@ -1 +1 @@ -[{"path":"docs/dg/learningBasics.md","fileType":"md","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"{% set title \u003d \"Learning the Basics\" %}"},{"lineNumber":2,"author":{"gitId":"-"},"content":"\u003cfrontmatter\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"{{ title | safe }}\""},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003c/frontmatter\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"{% from \u0027scripts/macros.njk\u0027 import embed, step with context %}"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003ch1 class\u003d\"display-4\"\u003e\u003cmd\u003e{{ title }}\u003c/md\u003e\u003c/h1\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003cdiv class\u003d\"lead\"\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"-"},"content":"This is a learning guide for developers who are new to RepoSense."},{"lineNumber":14,"author":{"gitId":"-"},"content":"\u003c/div\u003e"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":"Depending on what you know already and what you would like to work on (i.e., backend or frontend), you may find certain sections irrelevant to you and you can skip them accordingly."},{"lineNumber":19,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":"\u003c!-- \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d --\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":"## Backend"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"-"},"content":"This section is for developers who want to contribute to the backend of RepoSense. You may skip this section if you want to contribute as a pure frontend developer. Before you get started, you should have set up the project on your computer according to [the _Setting up_ page](settingUp.html)."},{"lineNumber":28,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"-"},"content":"The backend implementation of RepoSense is located in `src/main`."},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":"{{ step(1) }} **Know Java**"},{"lineNumber":33,"author":{"gitId":"-"},"content":""},{"lineNumber":34,"author":{"gitId":"-"},"content":"The RepoSense backend is mostly written in `Java 8`."},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":"1. You need to have a basic knowledge of Java before getting started, including its syntax, [API](https://docs.oracle.com/javase/8/docs/api/), and certain frameworks such as [JUnit](https://se-education.org/learningresources/contents/java/JUnit.html)."},{"lineNumber":37,"author":{"gitId":"-"},"content":"1. Once you are familiar with the basic syntax, you may wish to learn more advanced topics such as [concurrency](https://se-education.org/learningresources/contents/java/JavaConcurrency.html), [synchronization](https://se-education.org/learningresources/contents/java/JavaSynchronization.html), and [streams](https://se-education.org/learningresources/contents/java/streams-an-introduction.html). These topics can help you to understand certain part of the backend implementation (concurrent cloning and analysis of multiple repositories, etc.). They are optional but you may find them useful when working on certain issues."},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"-"},"content":"{{ step(2) }} **Learn the RepoSense backend architecture**"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":"You may want to refer to the [backend architecture](architecture.html) to understand the RepoSense backend implementation logic."},{"lineNumber":42,"author":{"gitId":"-"},"content":""},{"lineNumber":43,"author":{"gitId":"-"},"content":"To gain a more concrete idea of how the backend works, you can use the IDE Debugger and run RepoSense under the debugging mode to trace through the steps of how arguments from command line and CSV files are parsed, how repositories are cloned and analyzed, and how the JSON files are generated."},{"lineNumber":44,"author":{"gitId":"-"},"content":""},{"lineNumber":45,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":"The information below is for **Intellij**. If you are using a different IDE, you may need to check the documentation of how to use the debugger separately."},{"lineNumber":48,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":49,"author":{"gitId":"-"},"content":""},{"lineNumber":50,"author":{"gitId":"-"},"content":"* Check the [debugging guide](https://www.jetbrains.com/help/idea/debugging-your-first-java-application.html) if you are not familiar with debugging in **Intelij**."},{"lineNumber":51,"author":{"gitId":"-"},"content":"* In `RepoSense.java`, the main class, set appropriate break points. Here are some relevant method calls in the `main` method at which you can set the breakpoints:"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * `ArgsParser.parse(args)`: RepoSense parses the CLI arguments from the command given by the user."},{"lineNumber":53,"author":{"gitId":"-"},"content":" * `getRepoConfigurations(cliArguments)`: RepoSense gets the configuration for each repository by parsing the CSV files."},{"lineNumber":54,"author":{"gitId":"-"},"content":" * `getReportConfigurations(cliArguments)`: RepoSense gets the report configuration (report title) by parsing the JSON files."},{"lineNumber":55,"author":{"gitId":"-"},"content":" * `ReportGenerator.generateReposReport(...)` This is where the bulk of the work is conducted, including cloning repositories, analyzing repositories, and generating the JSON files to be used by the report."},{"lineNumber":56,"author":{"gitId":"-"},"content":"* To supply debugging arguments, right-click on the run button of `RepoSense.main`, click `Modify Run Configuration`, and add [CLI flags](https://reposense.org/ug/customizingReports.html#customize-using-cli-flags) in `Program arguments`. Examples: `--since 16/12/2021 --until 18/12/2022`; `-s 16/12/2021 -u 18/12/2022`."},{"lineNumber":57,"author":{"gitId":"-"},"content":""},{"lineNumber":58,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":59,"author":{"gitId":"-"},"content":""},{"lineNumber":60,"author":{"gitId":"-"},"content":"When tracing through the program execution, you can cross reference the architecture diagram and Javadoc of the class and method to check your understanding of the procedure."},{"lineNumber":61,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":62,"author":{"gitId":"-"},"content":""},{"lineNumber":63,"author":{"gitId":"-"},"content":"{{ step(3) }} **Gain some hands-on experience**"},{"lineNumber":64,"author":{"gitId":"-"},"content":""},{"lineNumber":65,"author":{"gitId":"-"},"content":"Here are some small tasks for you to gain some basic knowledge of the code related to the RepoSense backend. You can do each in a separate branch in your local copy of the code."},{"lineNumber":66,"author":{"gitId":"-"},"content":""},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003cpanel header\u003d\"**Task 1: Add a flag to pretty-print the JSON file**\" type\u003d\"primary\"\u003e"},{"lineNumber":68,"author":{"gitId":"-"},"content":""},{"lineNumber":69,"author":{"gitId":"-"},"content":" **Task 1: Add a flag to pretty-print the JSON file**"},{"lineNumber":70,"author":{"gitId":"-"},"content":""},{"lineNumber":71,"author":{"gitId":"-"},"content":" 1. [Generate a report locally](../ug/generatingReports.html#generating-reports-locally)."},{"lineNumber":72,"author":{"gitId":"-"},"content":" 2. Open a generated JSON file. For example, you can open `summary.json` of the generated report."},{"lineNumber":73,"author":{"gitId":"-"},"content":" 3. You should see that the content in the JSON is compactly organized in 1 single line. This may affect readability for developer who wants to investigate the content in the JSON file."},{"lineNumber":74,"author":{"gitId":"-"},"content":""},{"lineNumber":75,"author":{"gitId":"-"},"content":" **Your Task**"},{"lineNumber":76,"author":{"gitId":"-"},"content":""},{"lineNumber":77,"author":{"gitId":"-"},"content":" Add a new CLI argument `--use-json-pretty-printing`, such that when a user runs the command `java -jar RepoSense.jar --repos LIST_OF_REPO_URLS --view --use-json-pretty-printing`, the JSON files `summary.json`, `authorship.json`, and `commits.json` will be printed in a more readable way."},{"lineNumber":78,"author":{"gitId":"-"},"content":""},{"lineNumber":79,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 1\"\u003e"},{"lineNumber":80,"author":{"gitId":"-"},"content":""},{"lineNumber":81,"author":{"gitId":"-"},"content":" Try to understand the parsing process of the Command Line Arguments, which starts from `ArgsParser.parse(args)` in `RepoSense.java` and uses `ArgumentParser` to capture the arguments in the command string."},{"lineNumber":82,"author":{"gitId":"-"},"content":""},{"lineNumber":83,"author":{"gitId":"-"},"content":" Therefore, the first step you can take is to add the following to `ArgsParser`."},{"lineNumber":84,"author":{"gitId":"-"},"content":""},{"lineNumber":85,"author":{"gitId":"asdfghjkxd"},"content":" ```java"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public static final String[] JSON_PRINT_MODE_FLAGS \u003d new String[]{\"--use-json-pretty-printing\", \"-j\"};"},{"lineNumber":87,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":88,"author":{"gitId":"-"},"content":""},{"lineNumber":89,"author":{"gitId":"-"},"content":" In `getArgumentParser` method, add the following content to make `ArgumentParser` capture the new argument."},{"lineNumber":90,"author":{"gitId":"-"},"content":""},{"lineNumber":91,"author":{"gitId":"asdfghjkxd"},"content":" ```java"},{"lineNumber":92,"author":{"gitId":"-"},"content":" parser.addArgument(JSON_PRINT_MODE_FLAGS)"},{"lineNumber":93,"author":{"gitId":"-"},"content":" .dest(JSON_PRINT_MODE_FLAGS[0])"},{"lineNumber":94,"author":{"gitId":"-"},"content":" .action(Arguments.storeTrue())"},{"lineNumber":95,"author":{"gitId":"-"},"content":" .help(\"A flag to use json pretty printing when generating the json files.\");"},{"lineNumber":96,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":97,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":98,"author":{"gitId":"-"},"content":""},{"lineNumber":99,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 2\"\u003e"},{"lineNumber":100,"author":{"gitId":"-"},"content":""},{"lineNumber":101,"author":{"gitId":"-"},"content":" After the step in hint 1, the argument is captured by `ArgumentParser`. Now make corresponding changes to `CliArguments.java`, `ConfigCliArguments.java`, and the `parse` method in `ArgsParser.java` to make the return result of `parse` include the new argument."},{"lineNumber":102,"author":{"gitId":"-"},"content":""},{"lineNumber":103,"author":{"gitId":"-"},"content":" 1. Add the following content to `CliArguments` to include `isPrettyPrintingUsed` as a new attribute to the class."},{"lineNumber":104,"author":{"gitId":"-"},"content":""},{"lineNumber":105,"author":{"gitId":"asdfghjkxd"},"content":" ```java"},{"lineNumber":106,"author":{"gitId":"-"},"content":" protected boolean isPrettyPrintingUsed;"},{"lineNumber":107,"author":{"gitId":"-"},"content":""},{"lineNumber":108,"author":{"gitId":"-"},"content":" public boolean isPrettyPrintingUsed() {"},{"lineNumber":109,"author":{"gitId":"-"},"content":" return isPrettyPrintingUsed;"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }"},{"lineNumber":111,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":112,"author":{"gitId":"-"},"content":""},{"lineNumber":113,"author":{"gitId":"-"},"content":" 2. In the constructor of `ConfigCliArguments`, add `isPrettyPrintingUsed` as a new parameter of the method, and add the following instruction to the method body."},{"lineNumber":114,"author":{"gitId":"-"},"content":""},{"lineNumber":115,"author":{"gitId":"asdfghjkxd"},"content":" ```java"},{"lineNumber":116,"author":{"gitId":"-"},"content":" this.isPrettyPrintingUsed \u003d isPrettyPrintingUsed;"},{"lineNumber":117,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":118,"author":{"gitId":"-"},"content":""},{"lineNumber":119,"author":{"gitId":"-"},"content":" 3. In the `parse` method of `ArgsParser`, add the following instruction to get `isJsonPrettyPrintingUsed` from `ArgmentParser`."},{"lineNumber":120,"author":{"gitId":"-"},"content":""},{"lineNumber":121,"author":{"gitId":"asdfghjkxd"},"content":" ```java"},{"lineNumber":122,"author":{"gitId":"-"},"content":" boolean isJsonPrettyPrintingUsed \u003d results.get(JSON_PRINT_MODE_FLAGS[0]);"},{"lineNumber":123,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":124,"author":{"gitId":"-"},"content":""},{"lineNumber":125,"author":{"gitId":"-"},"content":" 4. Additionally, change the return statement of the `parse` method so that the `ConfigCliArguments` object returned will now include `isJsonPrettyPrintingUsed`."},{"lineNumber":126,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":127,"author":{"gitId":"-"},"content":""},{"lineNumber":128,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 3\"\u003e"},{"lineNumber":129,"author":{"gitId":"-"},"content":""},{"lineNumber":130,"author":{"gitId":"-"},"content":" After the steps in hint 1 and hint 2, the result returned from `ArgsParser.parse(args)` in `RepoSense.java` should be able to capture the new argument when it is specified in the command."},{"lineNumber":131,"author":{"gitId":"-"},"content":""},{"lineNumber":132,"author":{"gitId":"-"},"content":" The next step is to extract the argument from the `CliArguments` object, and pass it to JSON file writer to notify it of the specified printing mode."},{"lineNumber":133,"author":{"gitId":"-"},"content":""},{"lineNumber":134,"author":{"gitId":"-"},"content":" Note that the creation and writing of JSON file is invoked in `ReportGenerator.generateReposReport`, which calls `FileUtil.writeJsonFile` directly to write the `summary.json` file or indirectly (Check `generateIndividualRepoReport` and `generateEmptyRepoReport`) to write the `commits.json` or `authorship.json` files of individual repositories."},{"lineNumber":135,"author":{"gitId":"-"},"content":""},{"lineNumber":136,"author":{"gitId":"-"},"content":" Therefore, the task now is to make `FileUtil.writeJsonFile` switch between different printing mode."},{"lineNumber":137,"author":{"gitId":"-"},"content":""},{"lineNumber":138,"author":{"gitId":"-"},"content":" 1. You can find out what [`Gson.setPrettyPrinting`](https://www.javadoc.io/doc/com.google.code.gson/gson/2.8.5/com/google/gson/GsonBuilder.html#setPrettyPrinting--) does and how it can be used in the `writeJsonFile` method of [`FileUtil.java`](https://github.com/reposense/RepoSense/blob/master/src/main/java/reposense/util/FileUtil.java)."},{"lineNumber":139,"author":{"gitId":"-"},"content":""},{"lineNumber":140,"author":{"gitId":"-"},"content":" 2. Add the following content to `FileUtil`."},{"lineNumber":141,"author":{"gitId":"-"},"content":""},{"lineNumber":142,"author":{"gitId":"asdfghjkxd"},"content":" ```java"},{"lineNumber":143,"author":{"gitId":"-"},"content":" private static boolean isPrettyPrintingUsed \u003d false;"},{"lineNumber":144,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":145,"author":{"gitId":"-"},"content":""},{"lineNumber":146,"author":{"gitId":"-"},"content":" 3. In the `writeJsonFile` method, Replace the creation of the `Gson` object with the following instructions."},{"lineNumber":147,"author":{"gitId":"-"},"content":""},{"lineNumber":148,"author":{"gitId":"asdfghjkxd"},"content":" ```java"},{"lineNumber":149,"author":{"gitId":"-"},"content":" GsonBuilder gsonBuilder \u003d new GsonBuilder()"},{"lineNumber":150,"author":{"gitId":"-"},"content":" .registerTypeAdapter(LocalDateTime.class, (JsonSerializer\u003cLocalDateTime\u003e) (date, typeOfSrc, context)"},{"lineNumber":151,"author":{"gitId":"-"},"content":" -\u003e new JsonPrimitive(date.format(DateTimeFormatter.ofPattern(GITHUB_API_DATE_FORMAT))))"},{"lineNumber":152,"author":{"gitId":"-"},"content":" .registerTypeAdapter(FileType.class, new FileType.FileTypeSerializer());"},{"lineNumber":153,"author":{"gitId":"-"},"content":" Gson gson;"},{"lineNumber":154,"author":{"gitId":"-"},"content":" if (isPrettyPrintingUsed) {"},{"lineNumber":155,"author":{"gitId":"-"},"content":" gson \u003d gsonBuilder.setPrettyPrinting().create();"},{"lineNumber":156,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":157,"author":{"gitId":"-"},"content":" gson \u003d gsonBuilder.create();"},{"lineNumber":158,"author":{"gitId":"-"},"content":" }"},{"lineNumber":159,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":160,"author":{"gitId":"-"},"content":""},{"lineNumber":161,"author":{"gitId":"-"},"content":" 4. To notify `FileUtil` of the switch between different printing mode, add the following method to `FileUtil`."},{"lineNumber":162,"author":{"gitId":"-"},"content":""},{"lineNumber":163,"author":{"gitId":"asdfghjkxd"},"content":" ```java"},{"lineNumber":164,"author":{"gitId":"-"},"content":" public static void setPrettyPrintingMode(boolean isPrettyPrintingAdopted) {"},{"lineNumber":165,"author":{"gitId":"-"},"content":" isPrettyPrintingUsed \u003d isPrettyPrintingAdopted;"},{"lineNumber":166,"author":{"gitId":"-"},"content":" }"},{"lineNumber":167,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":168,"author":{"gitId":"-"},"content":""},{"lineNumber":169,"author":{"gitId":"-"},"content":" 5. It is now possible to notify `FileUtil` of the printing mode switch by extracting the argument from the `CliArguments` object in the `main` method of `RepoSense.java` and passing it to the corresponding method in `FileUtil`."},{"lineNumber":170,"author":{"gitId":"-"},"content":""},{"lineNumber":171,"author":{"gitId":"asdfghjkxd"},"content":" ```java"},{"lineNumber":172,"author":{"gitId":"-"},"content":" FileUtil.setPrettyPrintingMode(cliArguments.isPrettyPrintingUsed());"},{"lineNumber":173,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":174,"author":{"gitId":"-"},"content":""},{"lineNumber":175,"author":{"gitId":"-"},"content":" Now the parsing of argument and changing of printing mode should have been completed."},{"lineNumber":176,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":177,"author":{"gitId":"-"},"content":""},{"lineNumber":178,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Suggested solution\"\u003e"},{"lineNumber":179,"author":{"gitId":"-"},"content":""},{"lineNumber":180,"author":{"gitId":"-"},"content":" There is more than 1 way to achieve this. By combining the changes in hint 1, hint 2, and hint 3, you should be able to get a possible solution."},{"lineNumber":181,"author":{"gitId":"-"},"content":""},{"lineNumber":182,"author":{"gitId":"-"},"content":" Try the command `java -jar RepoSense.jar --repos https://github.com/reposense/RepoSense.git --view --use-json-pretty-printing` and check the generated JSON files to see if it works."},{"lineNumber":183,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":184,"author":{"gitId":"-"},"content":""},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003c/panel\u003e"},{"lineNumber":186,"author":{"gitId":"-"},"content":""},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cpanel header\u003d\"**Task 2: Add exception message during repository cloning to the summary view**\" type\u003d\"primary\"\u003e"},{"lineNumber":188,"author":{"gitId":"-"},"content":""},{"lineNumber":189,"author":{"gitId":"-"},"content":" **Task 2: Add exception message during repository cloning to the summary view**"},{"lineNumber":190,"author":{"gitId":"-"},"content":""},{"lineNumber":191,"author":{"gitId":"-"},"content":" 1. Open a [report](https://dashboard-1507-pr-reposense-reposense.surge.sh/)."},{"lineNumber":192,"author":{"gitId":"-"},"content":" 2. You should see that there is a red panel in the summary view containing the following message, indicating that there is an issue in the cloning process of the repository `reposense/testrepo-Empty`."},{"lineNumber":193,"author":{"gitId":"-"},"content":""},{"lineNumber":194,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":195,"author":{"gitId":"-"},"content":" reposense/testrepo-Empty[master]"},{"lineNumber":196,"author":{"gitId":"-"},"content":" Failed to clone from https://github.com/reposense/testrepo-Empty.git"},{"lineNumber":197,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":198,"author":{"gitId":"-"},"content":""},{"lineNumber":199,"author":{"gitId":"-"},"content":" **Your task**"},{"lineNumber":200,"author":{"gitId":"-"},"content":""},{"lineNumber":201,"author":{"gitId":"-"},"content":" For the repository with the message `Failed to clone from ...`, find out what exception causes this cloning error, and add that exception message to the panel as well."},{"lineNumber":202,"author":{"gitId":"-"},"content":""},{"lineNumber":203,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 1\"\u003e"},{"lineNumber":204,"author":{"gitId":"-"},"content":""},{"lineNumber":205,"author":{"gitId":"-"},"content":" You can find out what [`ErrorSummary.java`](https://github.com/reposense/RepoSense/blob/master/src/main/java/reposense/report/ErrorSummary.java) and [`RepoCloner.java`](https://github.com/reposense/RepoSense/blob/master/src/main/java/reposense/report/RepoCloner.java) do, and where they are used."},{"lineNumber":206,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":207,"author":{"gitId":"-"},"content":""},{"lineNumber":208,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 2\"\u003e"},{"lineNumber":209,"author":{"gitId":"-"},"content":""},{"lineNumber":210,"author":{"gitId":"-"},"content":" Try to understand the cloning process."},{"lineNumber":211,"author":{"gitId":"-"},"content":""},{"lineNumber":212,"author":{"gitId":"-"},"content":" * The cloning process is invoked by [`RepoGenerator.java`](https://github.com/reposense/RepoSense/blob/master/src/main/java/reposense/report/ReportGenerator.java) in the `cloneAndAnalyzeRepos` method, which subsequently calls `cloneBare` in `RepoCloner.java` to start the cloning."},{"lineNumber":213,"author":{"gitId":"-"},"content":" * The `cloneAndAnalyzeRepos` method will then call `getRepoLocation` in `RepoCloner.java` to try to get the repository location."},{"lineNumber":214,"author":{"gitId":"-"},"content":" * Beneath the surface, `RepoCloner` will first execute `spawnCloneProcess` and then execute `waitForCloneProcess` when it is invoked by `RepoGenerator` for the first and second time respectively."},{"lineNumber":215,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":216,"author":{"gitId":"-"},"content":""},{"lineNumber":217,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 3\"\u003e"},{"lineNumber":218,"author":{"gitId":"-"},"content":""},{"lineNumber":219,"author":{"gitId":"-"},"content":" In `RepoCloner`, the potential exceptions in `spawnCloneProcess` and `waitForCloneProcess` are caught but not recorded by `ErrorSummary`."},{"lineNumber":220,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":221,"author":{"gitId":"-"},"content":""},{"lineNumber":222,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Suggested solution\"\u003e"},{"lineNumber":223,"author":{"gitId":"-"},"content":""},{"lineNumber":224,"author":{"gitId":"-"},"content":" There is more than 1 way to achieve this. One solution is shown as the following:"},{"lineNumber":225,"author":{"gitId":"-"},"content":""},{"lineNumber":226,"author":{"gitId":"-"},"content":" Add this to the catch block of `spawnCloneProcess` and `waitForCloneProcess`, so that the message will be captured in `summary.json`."},{"lineNumber":227,"author":{"gitId":"-"},"content":""},{"lineNumber":228,"author":{"gitId":"asdfghjkxd"},"content":" ```java"},{"lineNumber":229,"author":{"gitId":"-"},"content":" ErrorSummary.getInstance().addErrorMessage(config.getDisplayName(), e.getMessage());"},{"lineNumber":230,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":231,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":232,"author":{"gitId":"-"},"content":""},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003c/panel\u003e"},{"lineNumber":234,"author":{"gitId":"-"},"content":""},{"lineNumber":235,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":236,"author":{"gitId":"-"},"content":""},{"lineNumber":237,"author":{"gitId":"-"},"content":"This is only for your practice. There is no need for you to commit this change and submit it in a pull request."},{"lineNumber":238,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":239,"author":{"gitId":"-"},"content":""},{"lineNumber":240,"author":{"gitId":"-"},"content":"{{ step(4) }} **Next Step**"},{"lineNumber":241,"author":{"gitId":"-"},"content":""},{"lineNumber":242,"author":{"gitId":"-"},"content":"You can now proceed to learn the [contributing workflow](workflow.html)."},{"lineNumber":243,"author":{"gitId":"-"},"content":""},{"lineNumber":244,"author":{"gitId":"-"},"content":"\u003c!-- \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d --\u003e"},{"lineNumber":245,"author":{"gitId":"-"},"content":""},{"lineNumber":246,"author":{"gitId":"-"},"content":"## Frontend"},{"lineNumber":247,"author":{"gitId":"-"},"content":""},{"lineNumber":248,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":249,"author":{"gitId":"-"},"content":""},{"lineNumber":250,"author":{"gitId":"-"},"content":"This section is for developers who want to contribute to the frontend of RepoSense. You may skip this section if you want to contribute as a pure backend developer."},{"lineNumber":251,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":252,"author":{"gitId":"-"},"content":""},{"lineNumber":253,"author":{"gitId":"-"},"content":"The frontend implementation of RepoSense is located in `frontend/src`."},{"lineNumber":254,"author":{"gitId":"-"},"content":""},{"lineNumber":255,"author":{"gitId":"-"},"content":"{{ step(1) }} **Learn the necessary tools**"},{"lineNumber":256,"author":{"gitId":"-"},"content":""},{"lineNumber":257,"author":{"gitId":"-"},"content":"It is necessary for you to learn the basics of Vue.js, Pug, and SCSS before working on the project."},{"lineNumber":258,"author":{"gitId":"-"},"content":""},{"lineNumber":259,"author":{"gitId":"-"},"content":"\u003c!-- ------------------------------------------------------------------------------------------------------ --\u003e"},{"lineNumber":260,"author":{"gitId":"-"},"content":""},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Vue.js"},{"lineNumber":262,"author":{"gitId":"-"},"content":""},{"lineNumber":263,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":264,"author":{"gitId":"-"},"content":""},{"lineNumber":265,"author":{"gitId":"-"},"content":"Vue.js uses JavaScript as its programming language. Before learning **Vue.js**, you may need to first get yourself familiar with JavaScript syntax first."},{"lineNumber":266,"author":{"gitId":"-"},"content":"You can refer to the [Javascript documentation](https://devdocs.io/javascript/) to learn the basic syntax. There are plenty of other resources available and please feel free to find the resource most suitable for you."},{"lineNumber":267,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":268,"author":{"gitId":"-"},"content":""},{"lineNumber":269,"author":{"gitId":"-"},"content":"RepoSense uses **Vue.js** (Vue3) in its front-end implementation. In particular, major user interface components, such as [summary view](report.html#summary-view-v-summary-js), [authorship view](report.html#authorship-view-v-authorship-js), and [zoom view](report.html#zoom-view-v-zoom-js), are implemented as Vue components. The corresponding source files are in `frontend/src`."},{"lineNumber":270,"author":{"gitId":"-"},"content":""},{"lineNumber":271,"author":{"gitId":"-"},"content":"* If you are new to Vue.js, you may want to start learning by looking at [the beginner tutorial](https://www.vuemastery.com/courses/intro-to-vue-js/)."},{"lineNumber":272,"author":{"gitId":"-"},"content":"* You can dive deeper later by checking the [Vue.js documentation](https://vuejs.org/guide/introduction.html) to learn about essential concepts such as component life cycle hooks, and component properties."},{"lineNumber":273,"author":{"gitId":"-"},"content":"* It is recommended if you can work on some small projects first to gain more solid understanding of Vue.js."},{"lineNumber":274,"author":{"gitId":"-"},"content":""},{"lineNumber":275,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e"},{"lineNumber":276,"author":{"gitId":"-"},"content":""},{"lineNumber":277,"author":{"gitId":"-"},"content":"The guide above uses HTML as the component template, which is not the case with RepoSense. You may wish to learn more about [Pug](#pug) and its connection with HTML."},{"lineNumber":278,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":279,"author":{"gitId":"-"},"content":""},{"lineNumber":280,"author":{"gitId":"-"},"content":"#### Vuex"},{"lineNumber":281,"author":{"gitId":"-"},"content":""},{"lineNumber":282,"author":{"gitId":"-"},"content":"RepoSense uses **Vuex** for the state management of the Vue components."},{"lineNumber":283,"author":{"gitId":"-"},"content":""},{"lineNumber":284,"author":{"gitId":"-"},"content":"* You can check the [Vuex guide](https://vuex.vuejs.org/guide/#the-simplest-store) to find out how Vuex can be used in a Vue project."},{"lineNumber":285,"author":{"gitId":"-"},"content":"* There is also a [course](https://vueschool.io/courses/vuex-for-everyone) available that will walk you through an example of creating Vue application with Vuex."},{"lineNumber":286,"author":{"gitId":"-"},"content":""},{"lineNumber":287,"author":{"gitId":"-"},"content":"\u003c!-- ------------------------------------------------------------------------------------------------------ --\u003e"},{"lineNumber":288,"author":{"gitId":"-"},"content":""},{"lineNumber":289,"author":{"gitId":"-"},"content":"### Pug"},{"lineNumber":290,"author":{"gitId":"-"},"content":""},{"lineNumber":291,"author":{"gitId":"-"},"content":"RepoSense uses Pug files as the template of each Vue component. The corresponding HTML templates will later be generated from the Pug files by [spuild](https://github.com/ongspxm/spuild2) when generating the report."},{"lineNumber":292,"author":{"gitId":"-"},"content":""},{"lineNumber":293,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":294,"author":{"gitId":"-"},"content":""},{"lineNumber":295,"author":{"gitId":"-"},"content":"Since Pug is used to generate the HTML template, it is recommended that you have a basic knowledge of HTML before starting to learn Pug. Once you understand how HTML works, you can proceed to focus on how Pug is translated into HTML."},{"lineNumber":296,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":297,"author":{"gitId":"-"},"content":""},{"lineNumber":298,"author":{"gitId":"-"},"content":"* You can refer to the [official documentation](https://pugjs.org/api/getting-started.html) or [this tutorial](https://www.youtube.com/watch?v\u003dkt3cEjjkCZA) to learn about the syntax of pug and how it is translated into HTML."},{"lineNumber":299,"author":{"gitId":"-"},"content":"* To get a hands-on experience, here is a [Pug to HTML converter](https://pughtml.com/). Feel free to try out a couple of examples on your own."},{"lineNumber":300,"author":{"gitId":"-"},"content":""},{"lineNumber":301,"author":{"gitId":"-"},"content":"\u003c!-- ------------------------------------------------------------------------------------------------------ --\u003e"},{"lineNumber":302,"author":{"gitId":"-"},"content":""},{"lineNumber":303,"author":{"gitId":"-"},"content":"### Scss"},{"lineNumber":304,"author":{"gitId":"-"},"content":""},{"lineNumber":305,"author":{"gitId":"-"},"content":"SCSS is used for styling the Pug template. The corresponding CSS will later be generated from the SCSS files by [spuild](https://github.com/ongspxm/spuild2) when generating the report. The corresponding source files are in `frontend/src/styles`."},{"lineNumber":306,"author":{"gitId":"-"},"content":""},{"lineNumber":307,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":308,"author":{"gitId":"-"},"content":""},{"lineNumber":309,"author":{"gitId":"-"},"content":"It is recommended that you have a basic knowledge of CSS before starting to learn SCSS. Once you understand how CSS works, you can proceed to focus on how SCSS is translated into CSS."},{"lineNumber":310,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":311,"author":{"gitId":"-"},"content":""},{"lineNumber":312,"author":{"gitId":"-"},"content":"* You can refer to the [style rules](https://sass-lang.com/documentation/style-rules) to learn about the similarities and differences between SCSS and CSS."},{"lineNumber":313,"author":{"gitId":"-"},"content":""},{"lineNumber":314,"author":{"gitId":"-"},"content":"{{ step(2) }} **Learn the RepoSense frontend architecture**"},{"lineNumber":315,"author":{"gitId":"-"},"content":""},{"lineNumber":316,"author":{"gitId":"-"},"content":"* You may want to refer to the [frontend architecture](report.html#report-architecture) to understand the implementation."},{"lineNumber":317,"author":{"gitId":"-"},"content":"* Another way for you to understand the frontend is to use **Vue.js devtools** to learn how the various Vue Components interact with each other. You can refer to the [frontend debugging guide](workflow.html#debugging-front-end) for more information."},{"lineNumber":318,"author":{"gitId":"-"},"content":""},{"lineNumber":319,"author":{"gitId":"-"},"content":"{{ step(3) }} **Gain some hands-on experience**"},{"lineNumber":320,"author":{"gitId":"-"},"content":""},{"lineNumber":321,"author":{"gitId":"-"},"content":"Here are some small tasks for you to gain some basic knowledge of the code related to the RepoSense frontend. You can do each in a separate branch in your local copy of the code."},{"lineNumber":322,"author":{"gitId":"-"},"content":""},{"lineNumber":323,"author":{"gitId":"-"},"content":"\u003cpanel header\u003d\"**Task 1: Highlight the selected author name in the summary view**\" type\u003d\"primary\"\u003e"},{"lineNumber":324,"author":{"gitId":"-"},"content":""},{"lineNumber":325,"author":{"gitId":"-"},"content":" **Task 1: Highlight the selected author name in the summary view**"},{"lineNumber":326,"author":{"gitId":"-"},"content":""},{"lineNumber":327,"author":{"gitId":"-"},"content":" 1. Open a [report](https://dashboard-1507-pr-reposense-reposense.surge.sh/)."},{"lineNumber":328,"author":{"gitId":"-"},"content":" 2. Randomly open the authorship contribution panel of an author (The icon is `\u003c/\u003e`)."},{"lineNumber":329,"author":{"gitId":"-"},"content":" 3. You should see that, after you open the panel, the author title background on the chart panel becomes yellow, and the background of the `\u003c/\u003e` icon you clicked becomes green."},{"lineNumber":330,"author":{"gitId":"-"},"content":""},{"lineNumber":331,"author":{"gitId":"-"},"content":" **Your Task**"},{"lineNumber":332,"author":{"gitId":"-"},"content":""},{"lineNumber":333,"author":{"gitId":"-"},"content":" Make corresponding changes to `summary charts` so that in step 3, after opening the panel, the font colour of the author title (in the form of `authorDisplayName(authorName)`) on the chart panel also becomes green."},{"lineNumber":334,"author":{"gitId":"-"},"content":""},{"lineNumber":335,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 1\"\u003e"},{"lineNumber":336,"author":{"gitId":"-"},"content":""},{"lineNumber":337,"author":{"gitId":"-"},"content":" Try to locate where the author title is in [`c-summary-charts.vue`](https://github.com/reposense/RepoSense/blob/master/frontend/src/components/c-summary-charts.vue)."},{"lineNumber":338,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":339,"author":{"gitId":"-"},"content":""},{"lineNumber":340,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 2\"\u003e"},{"lineNumber":341,"author":{"gitId":"-"},"content":""},{"lineNumber":342,"author":{"gitId":"-"},"content":" You can check what `activeUser` and `activeRepo` do in [`c-summary-charts.vue`](https://github.com/reposense/RepoSense/blob/master/frontend/src/components/c-summary-charts.vue)."},{"lineNumber":343,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":344,"author":{"gitId":"-"},"content":""},{"lineNumber":345,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 3\"\u003e"},{"lineNumber":346,"author":{"gitId":"-"},"content":""},{"lineNumber":347,"author":{"gitId":"-"},"content":" Refer to how changes are made to the title background and icon background in [`c-summary-charts.vue`](https://github.com/reposense/RepoSense/blob/master/frontend/src/components/c-summary-charts.vue)."},{"lineNumber":348,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":349,"author":{"gitId":"-"},"content":""},{"lineNumber":350,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 4\"\u003e"},{"lineNumber":351,"author":{"gitId":"-"},"content":""},{"lineNumber":352,"author":{"gitId":"-"},"content":" Some of the CSS styling for `c-summary-charts.vue` is in [`style.scss`](https://github.com/reposense/RepoSense/blob/master/frontend/src/styles/style.scss). You can add corresponding class selector if necessary."},{"lineNumber":353,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":354,"author":{"gitId":"-"},"content":""},{"lineNumber":355,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Suggested solution\"\u003e"},{"lineNumber":356,"author":{"gitId":"-"},"content":""},{"lineNumber":357,"author":{"gitId":"-"},"content":" There is more than 1 way to achieve this. One solution is shown as the following:"},{"lineNumber":358,"author":{"gitId":"-"},"content":""},{"lineNumber":359,"author":{"gitId":"-"},"content":" Add this to `c_summary.scss`."},{"lineNumber":360,"author":{"gitId":"-"},"content":""},{"lineNumber":361,"author":{"gitId":"asdfghjkxd"},"content":" ```css"},{"lineNumber":362,"author":{"gitId":"-"},"content":" .active-text {"},{"lineNumber":363,"author":{"gitId":"-"},"content":" color: mui-color(\u0027green\u0027);"},{"lineNumber":364,"author":{"gitId":"-"},"content":" }"},{"lineNumber":365,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":366,"author":{"gitId":"-"},"content":""},{"lineNumber":367,"author":{"gitId":"-"},"content":" In `c-summary-charts.vue`, locate `summary-chart__title--name`, and add the following to its `v-bind:class` attribute map."},{"lineNumber":368,"author":{"gitId":"-"},"content":""},{"lineNumber":369,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":370,"author":{"gitId":"-"},"content":" \u0027active-text\u0027: user.name \u003d\u003d\u003d activeUser \u0026\u0026 user.repoName \u003d\u003d\u003d activeRepo"},{"lineNumber":371,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":372,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":373,"author":{"gitId":"-"},"content":""},{"lineNumber":374,"author":{"gitId":"-"},"content":"\u003c/panel\u003e"},{"lineNumber":375,"author":{"gitId":"-"},"content":""},{"lineNumber":376,"author":{"gitId":"-"},"content":"\u003cpanel header\u003d\"**Task 2: Add tooltip for file path in authorship panel**\" type\u003d\"primary\"\u003e"},{"lineNumber":377,"author":{"gitId":"-"},"content":""},{"lineNumber":378,"author":{"gitId":"-"},"content":" **Task 2: Add tooltip for file path in authorship panel**"},{"lineNumber":379,"author":{"gitId":"-"},"content":""},{"lineNumber":380,"author":{"gitId":"-"},"content":" 1. Open a [report](https://dashboard-1507-pr-reposense-reposense.surge.sh/)."},{"lineNumber":381,"author":{"gitId":"-"},"content":" 2. Randomly open the authorship contribution panel of an author (The icon is `\u003c/\u003e`)."},{"lineNumber":382,"author":{"gitId":"-"},"content":" 3. Select a random file in the authorship contribution panel, and hover your mouse on an icon on the file title, a corresponding tooltip will show up, suggesting what the purpose of the icon is. However, when you hover the mouse over the file path on the file title, there is no tool tip shown, even if clicking the path itself will also trigger some event."},{"lineNumber":383,"author":{"gitId":"-"},"content":""},{"lineNumber":384,"author":{"gitId":"-"},"content":" \u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":385,"author":{"gitId":"-"},"content":""},{"lineNumber":386,"author":{"gitId":"-"},"content":" For example, if you open the authorship contribution panel of an author in `reposense/RepoSense[master]` and hover the mouse over the triangular icon beside the file path `src/main/java/reposense/model/Author.java`, you should see a tooltip saying `Click to hide file details` above the icon. However, when you hover the mouse over the file path `src/main/java/reposense/model/Author.java`, there is no corresponding tooltip shown."},{"lineNumber":387,"author":{"gitId":"-"},"content":" \u003c/box\u003e"},{"lineNumber":388,"author":{"gitId":"-"},"content":""},{"lineNumber":389,"author":{"gitId":"-"},"content":" **Your Task**"},{"lineNumber":390,"author":{"gitId":"-"},"content":""},{"lineNumber":391,"author":{"gitId":"-"},"content":" Make corresponding `authorship contribution panel` so that in step 3, when hovering your mouse over the file path:"},{"lineNumber":392,"author":{"gitId":"-"},"content":" * A tip saying `This is the file path. Click to hide file details` will show up when the file details are shown"},{"lineNumber":393,"author":{"gitId":"-"},"content":" * A tip saying `This is the file path. Click to show file details` will show up when the file details are not shown."},{"lineNumber":394,"author":{"gitId":"-"},"content":""},{"lineNumber":395,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 1\"\u003e"},{"lineNumber":396,"author":{"gitId":"-"},"content":""},{"lineNumber":397,"author":{"gitId":"-"},"content":" Try to locate where the file title and the file path are in [`c-authorship.vue`](https://github.com/reposense/RepoSense/blob/master/frontend/src/views/c-authorship.vue)."},{"lineNumber":398,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":399,"author":{"gitId":"-"},"content":""},{"lineNumber":400,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 2\"\u003e"},{"lineNumber":401,"author":{"gitId":"-"},"content":""},{"lineNumber":402,"author":{"gitId":"-"},"content":" You can check how tooltip is added for the triangular icon in the file title in [`c-authorship.vue`](https://github.com/reposense/RepoSense/blob/master/frontend/src/views/c-authorship.vue)."},{"lineNumber":403,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":404,"author":{"gitId":"-"},"content":""},{"lineNumber":405,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 3\"\u003e"},{"lineNumber":406,"author":{"gitId":"-"},"content":""},{"lineNumber":407,"author":{"gitId":"-"},"content":" You can check what `file.active` does and how it is used to switch between different tooltip messages when hovering the mouse on the corresponding icon."},{"lineNumber":408,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":409,"author":{"gitId":"-"},"content":""},{"lineNumber":410,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Suggested solution\"\u003e"},{"lineNumber":411,"author":{"gitId":"-"},"content":""},{"lineNumber":412,"author":{"gitId":"-"},"content":" There is more than 1 way to achieve this. One solution is shown as the following:"},{"lineNumber":413,"author":{"gitId":"-"},"content":""},{"lineNumber":414,"author":{"gitId":"-"},"content":" 1. In `c-authorship.vue`, locate the section that iterates through each file in `selectedFiles`."},{"lineNumber":415,"author":{"gitId":"-"},"content":" 2. There is a specific portion of the section that renders the toggle icon, the file index, and the file path of the file title."},{"lineNumber":416,"author":{"gitId":"-"},"content":" 3. Try to locate the `span` tag that renders `file.path`, and wraps it inside a new `tooptip`."},{"lineNumber":417,"author":{"gitId":"-"},"content":" 4. In the `tooltip`, use the following instructions to handle the switch of tooltip message."},{"lineNumber":418,"author":{"gitId":"-"},"content":""},{"lineNumber":419,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":420,"author":{"gitId":"-"},"content":" span.tooltip-text(v-show\u003d\"file.active\") This is the file path. Click to hide file details"},{"lineNumber":421,"author":{"gitId":"-"},"content":" span.tooltip-text(v-show\u003d\"!file.active\") This is the file path. Click to show file details"},{"lineNumber":422,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":423,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":424,"author":{"gitId":"-"},"content":""},{"lineNumber":425,"author":{"gitId":"-"},"content":"\u003c/panel\u003e"},{"lineNumber":426,"author":{"gitId":"-"},"content":""},{"lineNumber":427,"author":{"gitId":"-"},"content":"\u003cpanel header\u003d\"**Task 3: Add tooltip for commit message title in zoom panel**\" type\u003d\"primary\"\u003e"},{"lineNumber":428,"author":{"gitId":"-"},"content":""},{"lineNumber":429,"author":{"gitId":"-"},"content":" **Task 3: Add tooltip for commit message title in zoom panel**"},{"lineNumber":430,"author":{"gitId":"-"},"content":""},{"lineNumber":431,"author":{"gitId":"-"},"content":" 1. Open a [report](https://dashboard-1507-pr-reposense-reposense.surge.sh/)."},{"lineNumber":432,"author":{"gitId":"-"},"content":" 2. Randomly open the commits panel of an author."},{"lineNumber":433,"author":{"gitId":"-"},"content":" 3. Select a random commit in the commits panel, and hover your mouse on the icons on the commit title, there is no tooltip shown saying that it will redirect you to a different site."},{"lineNumber":434,"author":{"gitId":"-"},"content":""},{"lineNumber":435,"author":{"gitId":"-"},"content":" \u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":436,"author":{"gitId":"-"},"content":""},{"lineNumber":437,"author":{"gitId":"-"},"content":" For example, given the [report](https://dashboard-1507-pr-reposense-reposense.surge.sh/?search\u003d\u0026sort\u003dgroupTitle\u0026sortWithin\u003dtitle\u0026since\u003d\u0026timeframe\u003dcommit\u0026mergegroup\u003d\u0026groupSelect\u003dgroupByRepos\u0026breakdown\u003dfalse\u0026tabOpen\u003dtrue\u0026tabType\u003dzoom\u0026zA\u003deugenepeh\u0026zR\u003dreposense%2FRepoSense%5Bmaster%5D\u0026zACS\u003d99.28792569659443\u0026zS\u003d2017-10-09\u0026zFS\u003d\u0026zU\u003d2021-04-04\u0026zMG\u003dundefined\u0026zFTF\u003dcommit\u0026zFGS\u003dgroupByRepos\u0026zFR\u003dfalse), if you hover the mouse over the commit title `README: add acknowledgements section (#978)`, there is no corresponding tooltip shown, but when you click on the commit title, you will be redirected to a different site to see the commit details."},{"lineNumber":438,"author":{"gitId":"-"},"content":" \u003c/box\u003e"},{"lineNumber":439,"author":{"gitId":"-"},"content":""},{"lineNumber":440,"author":{"gitId":"-"},"content":" **Your Task**"},{"lineNumber":441,"author":{"gitId":"-"},"content":""},{"lineNumber":442,"author":{"gitId":"-"},"content":" Make corresponding changes to `zoom panel` so that in step 3, when hovering your mouse over the commit title, a tooltip saying `Click to view the detailed file changes in the commit` will show up on the commit title."},{"lineNumber":443,"author":{"gitId":"-"},"content":""},{"lineNumber":444,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 1\"\u003e"},{"lineNumber":445,"author":{"gitId":"-"},"content":""},{"lineNumber":446,"author":{"gitId":"-"},"content":" Try to locate where the commit title is in [`c-zoom.vue`](https://github.com/reposense/RepoSense/blob/master/frontend/src/views/c-zoom.vue)."},{"lineNumber":447,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":448,"author":{"gitId":"-"},"content":""},{"lineNumber":449,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 2\"\u003e"},{"lineNumber":450,"author":{"gitId":"-"},"content":""},{"lineNumber":451,"author":{"gitId":"-"},"content":" You can check how tooltip is added for other icons in [`c-zoom.vue`](https://github.com/reposense/RepoSense/blob/master/frontend/src/views/c-zoom.vue)."},{"lineNumber":452,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":453,"author":{"gitId":"-"},"content":""},{"lineNumber":454,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 3\"\u003e"},{"lineNumber":455,"author":{"gitId":"-"},"content":""},{"lineNumber":456,"author":{"gitId":"-"},"content":" Check what `selectedCommits` does and how the link and commit title of each commit is retrieved."},{"lineNumber":457,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":458,"author":{"gitId":"-"},"content":""},{"lineNumber":459,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Suggested solution\"\u003e"},{"lineNumber":460,"author":{"gitId":"-"},"content":""},{"lineNumber":461,"author":{"gitId":"-"},"content":" There is more than 1 way to achieve this. One solution is shown as the following:"},{"lineNumber":462,"author":{"gitId":"-"},"content":""},{"lineNumber":463,"author":{"gitId":"-"},"content":" 1. In `c-zoom.vue`, locate the section that iterates through each `day` in `selectedCommits`."},{"lineNumber":464,"author":{"gitId":"-"},"content":" 2. The component that helps render the commit message title should be an `a` tag which uses the `getSliceLink` method to set the link to the commit details and uses `slice.messageTitle` to show the commit message title."},{"lineNumber":465,"author":{"gitId":"-"},"content":" 3. Wrap the `a` tag in a new `tooltip`."},{"lineNumber":466,"author":{"gitId":"-"},"content":" 4. In the `tooltip`, add the following content to show the tooltip message."},{"lineNumber":467,"author":{"gitId":"-"},"content":""},{"lineNumber":468,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":469,"author":{"gitId":"-"},"content":" span.tooltip-text Click to view the detailed file changes in the commit"},{"lineNumber":470,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":471,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":472,"author":{"gitId":"-"},"content":""},{"lineNumber":473,"author":{"gitId":"-"},"content":"\u003c/panel\u003e"},{"lineNumber":474,"author":{"gitId":"-"},"content":""},{"lineNumber":475,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":476,"author":{"gitId":"-"},"content":""},{"lineNumber":477,"author":{"gitId":"-"},"content":"This is only for your practice. There is no need for you to commit this change and submit it in a pull request."},{"lineNumber":478,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":479,"author":{"gitId":"-"},"content":""},{"lineNumber":480,"author":{"gitId":"-"},"content":"{{ step(4) }} **Next Step**"},{"lineNumber":481,"author":{"gitId":"-"},"content":""},{"lineNumber":482,"author":{"gitId":"-"},"content":"You can now proceed to learn the [contributing workflow](workflow.html)."},{"lineNumber":483,"author":{"gitId":"-"},"content":""},{"lineNumber":484,"author":{"gitId":"-"},"content":"\u003c!-- \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d --\u003e"},{"lineNumber":485,"author":{"gitId":"-"},"content":""},{"lineNumber":486,"author":{"gitId":"-"},"content":"## DevOps"},{"lineNumber":487,"author":{"gitId":"-"},"content":""},{"lineNumber":488,"author":{"gitId":"supermii2"},"content":"If you want to understand and contribute to the DevOps aspect of RepoSense, you can refer to the [DevOps guide](devOpsGuide.html) for more information."}],"authorContributionMap":{"asdfghjkxd":11,"supermii2":1,"-":476}},{"path":"docs/dg/settingUp.md","fileType":"md","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"{% set title \u003d \"Setting up\" %}"},{"lineNumber":2,"author":{"gitId":"-"},"content":"\u003cfrontmatter\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"{{ title | safe }}\""},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003c/frontmatter\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"{% from \u0027scripts/macros.njk\u0027 import embed with context %}"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003ch1 class\u003d\"display-4\"\u003e\u003cmd\u003e{{ title }}\u003c/md\u003e\u003c/h1\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"**Prerequisites:**"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* **JDK `1.8.0_60`** up to **`17`** ([download :fas-download:](https://www.oracle.com/technetwork/java/javase/downloads/index.html))."},{"lineNumber":13,"author":{"gitId":"-"},"content":"* **Node.js** `16.19.1` to the latest minor version for `18` ([download :fas-download:](https://www.npmjs.com/get-npm))."},{"lineNumber":14,"author":{"gitId":"-"},"content":"* **git `2.23`** or later ([download :fas-download:](https://git-scm.com/downloads))."},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"supermii2"},"content":" Type `java -version`, `node -v` and `git --version` respectively on your OS terminal and ensure that you have the correct version of each prerequisite installed."},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003c/box\u003e"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":"\u003c!-- \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d --\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":"## Getting the code"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":"1. **Fork** the [reposense/reposense](https://github.com/reposense/RepoSense) repo."},{"lineNumber":26,"author":{"gitId":"-"},"content":"1. **Clone** the fork to your computer."},{"lineNumber":27,"author":{"gitId":"-"},"content":""},{"lineNumber":28,"author":{"gitId":"-"},"content":"## Setting up the IDE"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":"The recommended IDE is **Intellij IDEA**. While it is not compulsory to use it, note that we will not be able to help you troubleshoot IDE problems if you use any other IDE."},{"lineNumber":33,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":34,"author":{"gitId":"-"},"content":""},{"lineNumber":35,"author":{"gitId":"-"},"content":"1. **Ensure you have configured IDEA for the correct JDK**, as explained in [this tutorial](https://se-education.org/guides/tutorials/intellijJdk.html)."},{"lineNumber":36,"author":{"gitId":"-"},"content":"1. **Import the project as a Gradle project**, as explained in [this tutorial](https://se-education.org/guides/tutorials/intellijImportGradleProject.html)."},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":"\u003c!-- \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d --\u003e"},{"lineNumber":39,"author":{"gitId":"-"},"content":""},{"lineNumber":40,"author":{"gitId":"-"},"content":"## Verifying the setup"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":"This project is already configured to use Gradle for build automation. If you are new to Gradle, see [this tutorial](https://se-education.org/guides/tutorials/gradle.html) to learn how to use it."},{"lineNumber":45,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":"1. Open a command prompt and navigate to the project root."},{"lineNumber":48,"author":{"gitId":"-"},"content":"1. Run `gradlew clean build` (`./gradlew clean build` if you on a Unix-like OS), and ensure that it finishes with a `BUILD SUCCESSFUL` message."},{"lineNumber":49,"author":{"gitId":"-"},"content":"1. Run the tests using the `gradlew test systemtest` command and ensure it succeeds too."},{"lineNumber":50,"author":{"gitId":"-"},"content":"1. You can also try running the app using code, as given in the panel below."},{"lineNumber":51,"author":{"gitId":"-"},"content":""},{"lineNumber":52,"author":{"gitId":"-"},"content":"{{ embed(\u0027Developer guide → **Workflow → Running the app from code**\u0027, \u0027workflow.md#section-running-from-code\u0027, level\u003d2) }}"},{"lineNumber":53,"author":{"gitId":"-"},"content":""},{"lineNumber":54,"author":{"gitId":"-"},"content":"## Before you start coding"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":"... read the [Workflow](workflow.html) section."}],"authorContributionMap":{"supermii2":1,"-":55}},{"path":"docs/dg/styleGuides.md","fileType":"md","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"{% set title \u003d \"Appendix: Style guides\" %}"},{"lineNumber":2,"author":{"gitId":"-"},"content":"\u003cfrontmatter\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"{{ title | safe }}\""},{"lineNumber":4,"author":{"gitId":"-"},"content":"\u003c/frontmatter\u003e"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"\u003ch1 class\u003d\"display-4\"\u003e\u003cmd\u003e{{ title }}\u003c/md\u003e\u003c/h1\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":"\u003cdiv class\u003d\"lead\"\u003e"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"Our coding standards are mostly based on those at [se-education.org/guides](https://se-education.org/guides)."},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003c/div\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"-"},"content":"* [**CSS** coding standard](https://se-education.org/guides/conventions/css.html)"},{"lineNumber":14,"author":{"gitId":"-"},"content":"* [**Files/folders** naming conventions](https://se-education.org/guides/conventions/files.html)"},{"lineNumber":15,"author":{"gitId":"-"},"content":"* [**HTML** coding standard](https://se-education.org/guides/conventions/html.html)"},{"lineNumber":16,"author":{"gitId":"-"},"content":"* [**Markdown/MarkBind** coding standard](https://se-education.org/guides/conventions/markdown.html)"},{"lineNumber":17,"author":{"gitId":"-"},"content":"* [**Java** coding standard](https://se-education.org/guides/conventions/java/index.html)"},{"lineNumber":18,"author":{"gitId":"-"},"content":"* [**JavaScript** coding standard](https://se-education.org/guides/conventions/javascript.html)"},{"lineNumber":19,"author":{"gitId":"-"},"content":"* **TypeScript**: In addition to the JavaScript coding standard, follow the [**recommended ESLint rules**](https://typescript-eslint.io/rules/) and the formatting rules [described below](#typescript-specific-formatting)."},{"lineNumber":20,"author":{"gitId":"-"},"content":"* **Vue Components**: Follow the [**Vue style guide**](https://vuejs.org/style-guide/), up to the **Recommended** section."},{"lineNumber":21,"author":{"gitId":"-"},"content":"* **Documentation**: Follow the [**Google developer documentation style guide**](https://developers.google.com/style)."},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":"## Note on Ternary Operators:"},{"lineNumber":24,"author":{"gitId":"-"},"content":"Ternary operators can be used to shorten if-else blocks such as this:"},{"lineNumber":25,"author":{"gitId":"asdfghjkxd"},"content":"```java"},{"lineNumber":26,"author":{"gitId":"-"},"content":"LocalDateTime min \u003d ARBITRARY_FIRST_COMMIT_DATE_UTC.withZoneSameInstant(zoneId).toLocalDateTime();"},{"lineNumber":27,"author":{"gitId":"-"},"content":"if (!commitInfos.isEmpty()) {"},{"lineNumber":28,"author":{"gitId":"-"},"content":" min \u003d commitInfos.get(0).getTime();"},{"lineNumber":29,"author":{"gitId":"-"},"content":"}"},{"lineNumber":30,"author":{"gitId":"-"},"content":"return min;"},{"lineNumber":31,"author":{"gitId":"-"},"content":"```"},{"lineNumber":32,"author":{"gitId":"-"},"content":""},{"lineNumber":33,"author":{"gitId":"-"},"content":"The result would look something like this:"},{"lineNumber":34,"author":{"gitId":"asdfghjkxd"},"content":"```java"},{"lineNumber":35,"author":{"gitId":"-"},"content":"return (commitInfos.isEmpty())"},{"lineNumber":36,"author":{"gitId":"-"},"content":" ? ARBITRARY_FIRST_COMMIT_DATE_UTC.withZoneSameInstant(zoneId).toLocalDateTime()"},{"lineNumber":37,"author":{"gitId":"-"},"content":" : commitInfos.get(0).getTime();"},{"lineNumber":38,"author":{"gitId":"-"},"content":"```"},{"lineNumber":39,"author":{"gitId":"-"},"content":""},{"lineNumber":40,"author":{"gitId":"-"},"content":"To preserve readability, it is recommended that if-else blocks should only be"},{"lineNumber":41,"author":{"gitId":"-"},"content":"converted to ternary operators if the resultant code can be kept at most 3 lines long"},{"lineNumber":42,"author":{"gitId":"-"},"content":"(in accordance to the coding standard)."},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":"## Additional Javadoc requirements:"},{"lineNumber":45,"author":{"gitId":"-"},"content":"In addition to what has been mentioned in the [**Java** coding standard (SE-EDU)](https://se-education.org/guides/conventions/java/index.html) and [**Google Java Style Guide**](https://google.github.io/styleguide/javaguide.html), we also stipulate the following standards for Javadoc:"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* If Javadoc is written for a method, all input parameters should be described in the Javadoc, either in the description with `@code tags` or through `@param` block tags."},{"lineNumber":47,"author":{"gitId":"-"},"content":" * If `@param` block tags are used, they must be used for all parameters."},{"lineNumber":48,"author":{"gitId":"-"},"content":" * This is not necessary (although still recommended) for methods with `@Override` annotations if Javadoc is used. However, if the method that is being overriden is part of your code and has Javadoc, all parameters must be described."},{"lineNumber":49,"author":{"gitId":"-"},"content":""},{"lineNumber":50,"author":{"gitId":"-"},"content":"Negative Examples:"},{"lineNumber":51,"author":{"gitId":"asdfghjkxd"},"content":"```java"},{"lineNumber":52,"author":{"gitId":"asdfghjkxd"},"content":"// Not okay (Only mentions zoneId parameter):"},{"lineNumber":53,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * Returns a {@link LocalDateTime} object adjusted for timezone given by {@code zoneId}."},{"lineNumber":55,"author":{"gitId":"-"},"content":" */"},{"lineNumber":56,"author":{"gitId":"-"},"content":"public LocalDateTime adjustTimeZone(LocalDateTime sinceDate, ZoneId zoneId) {"},{"lineNumber":57,"author":{"gitId":"-"},"content":" //Code here"},{"lineNumber":58,"author":{"gitId":"-"},"content":"}"},{"lineNumber":59,"author":{"gitId":"-"},"content":""},{"lineNumber":60,"author":{"gitId":"asdfghjkxd"},"content":"// Not okay (@param tag used only for zoneId)"},{"lineNumber":61,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * Returns a {@link LocalDateTime} object by adjusting {@code sinceDate}"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * to the timezone given by {@code zoneId}."},{"lineNumber":64,"author":{"gitId":"-"},"content":" *"},{"lineNumber":65,"author":{"gitId":"-"},"content":" * @param zoneId The timezone ID to adjust the sinceDate to."},{"lineNumber":66,"author":{"gitId":"-"},"content":" */"},{"lineNumber":67,"author":{"gitId":"-"},"content":"public LocalDateTime adjustTimeZone(LocalDateTime sinceDate, ZoneId zoneId) {"},{"lineNumber":68,"author":{"gitId":"-"},"content":" //Code here"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}"},{"lineNumber":70,"author":{"gitId":"-"},"content":"```"},{"lineNumber":71,"author":{"gitId":"-"},"content":"Positive Example #1:"},{"lineNumber":72,"author":{"gitId":"asdfghjkxd"},"content":"```java"},{"lineNumber":73,"author":{"gitId":"asdfghjkxd"},"content":"// Okay (No @param tags):"},{"lineNumber":74,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":75,"author":{"gitId":"-"},"content":" * Returns a {@link LocalDateTime} object by adjusting {@code sinceDate}"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * to the timezone given by {@code zoneId}."},{"lineNumber":77,"author":{"gitId":"-"},"content":" */"},{"lineNumber":78,"author":{"gitId":"-"},"content":"public LocalDateTime adjustTimeZone(LocalDateTime sinceDate, ZoneId zoneId) {"},{"lineNumber":79,"author":{"gitId":"-"},"content":" //Code here"},{"lineNumber":80,"author":{"gitId":"-"},"content":"}"},{"lineNumber":81,"author":{"gitId":"-"},"content":"```"},{"lineNumber":82,"author":{"gitId":"-"},"content":"Positive Example #2:"},{"lineNumber":83,"author":{"gitId":"asdfghjkxd"},"content":"```java"},{"lineNumber":84,"author":{"gitId":"asdfghjkxd"},"content":"// Okay (@param tags used for all inputs):"},{"lineNumber":85,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":86,"author":{"gitId":"-"},"content":" * Returns a {@link LocalDateTime} object by adjusting {@code sinceDate}"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * to the timezone given by {@code zoneId}."},{"lineNumber":88,"author":{"gitId":"-"},"content":" *"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * @param sinceDate The date prior to the timezone conversion."},{"lineNumber":90,"author":{"gitId":"-"},"content":" * @param zoneId The timezone ID to adjust the sinceDate to."},{"lineNumber":91,"author":{"gitId":"-"},"content":" */"},{"lineNumber":92,"author":{"gitId":"-"},"content":"public LocalDateTime adjustTimeZone(LocalDateTime sinceDate, ZoneId zoneId) {"},{"lineNumber":93,"author":{"gitId":"-"},"content":" //Code here"},{"lineNumber":94,"author":{"gitId":"-"},"content":"}"},{"lineNumber":95,"author":{"gitId":"-"},"content":"```"},{"lineNumber":96,"author":{"gitId":"-"},"content":""},{"lineNumber":97,"author":{"gitId":"-"},"content":"* Within the main code, if an exception is thrown in a method (both header and body) for which Javadoc is written, a `@throws` tag must be used to describe how the exception is likely to arise."},{"lineNumber":98,"author":{"gitId":"-"},"content":" * This requirement does not apply to test code."},{"lineNumber":99,"author":{"gitId":"-"},"content":" * One `@throws` tag per unique exception."},{"lineNumber":100,"author":{"gitId":"-"},"content":" * The order of exceptions in the `@throws` tag block should match that of the method\u0027s `throws` statement."},{"lineNumber":101,"author":{"gitId":"asdfghjkxd"},"content":"```java"},{"lineNumber":102,"author":{"gitId":"asdfghjkxd"},"content":"// Not okay (order of exceptions in tag block and method signature do not match):"},{"lineNumber":103,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":104,"author":{"gitId":"-"},"content":" * Returns a {@link LocalDateTime} object from {@code dateString}."},{"lineNumber":105,"author":{"gitId":"-"},"content":" *"},{"lineNumber":106,"author":{"gitId":"-"},"content":" * @throws ParseException if {@code dateString} cannot be parsed."},{"lineNumber":107,"author":{"gitId":"-"},"content":" * @throws NullPointerException if {@code dateString} is null."},{"lineNumber":108,"author":{"gitId":"-"},"content":" */"},{"lineNumber":109,"author":{"gitId":"-"},"content":"public LocalDateTime parseDate(String dateString) throws NullPointerException, ParseException {"},{"lineNumber":110,"author":{"gitId":"-"},"content":" String trimmedString \u003d dateString.toUpperCase(); // NullPointerException may happen here."},{"lineNumber":111,"author":{"gitId":"-"},"content":" // Code here"},{"lineNumber":112,"author":{"gitId":"-"},"content":"}"},{"lineNumber":113,"author":{"gitId":"-"},"content":""},{"lineNumber":114,"author":{"gitId":"asdfghjkxd"},"content":"// Should be:"},{"lineNumber":115,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":116,"author":{"gitId":"-"},"content":" * Returns a {@link LocalDateTime} object from {@code dateString}."},{"lineNumber":117,"author":{"gitId":"-"},"content":" *"},{"lineNumber":118,"author":{"gitId":"-"},"content":" * @throws NullPointerException if {@code dateString} is null."},{"lineNumber":119,"author":{"gitId":"-"},"content":" * @throws ParseException if {@code dateString} cannot be parsed."},{"lineNumber":120,"author":{"gitId":"-"},"content":" */"},{"lineNumber":121,"author":{"gitId":"-"},"content":"public LocalDateTime parseDate(String dateString) throws NullPointerException, ParseException {"},{"lineNumber":122,"author":{"gitId":"-"},"content":" String trimmedString \u003d dateString.toUpperCase(); // NullPointerException may happen here."},{"lineNumber":123,"author":{"gitId":"-"},"content":" // Code here"},{"lineNumber":124,"author":{"gitId":"-"},"content":"}"},{"lineNumber":125,"author":{"gitId":"-"},"content":"```"},{"lineNumber":126,"author":{"gitId":"-"},"content":"## TypeScript specific formatting"},{"lineNumber":127,"author":{"gitId":"-"},"content":""},{"lineNumber":128,"author":{"gitId":"-"},"content":"For TypeScript specific code, such as within an `interface` or type annotations, we also stipulate the following standards:"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* Use semicolons as delimiters for TypeScript interfaces and types."},{"lineNumber":130,"author":{"gitId":"-"},"content":""},{"lineNumber":131,"author":{"gitId":"-"},"content":"Negative Examples:"},{"lineNumber":132,"author":{"gitId":"-"},"content":"```typescript"},{"lineNumber":133,"author":{"gitId":"-"},"content":"// missing semicolon delimiter"},{"lineNumber":134,"author":{"gitId":"-"},"content":"interface Foo {"},{"lineNumber":135,"author":{"gitId":"-"},"content":" name: string"},{"lineNumber":136,"author":{"gitId":"-"},"content":" greet(): string"},{"lineNumber":137,"author":{"gitId":"-"},"content":"}"},{"lineNumber":138,"author":{"gitId":"-"},"content":""},{"lineNumber":139,"author":{"gitId":"-"},"content":"// using incorrect delimiter"},{"lineNumber":140,"author":{"gitId":"-"},"content":"interface Foo {"},{"lineNumber":141,"author":{"gitId":"-"},"content":" name: string,"},{"lineNumber":142,"author":{"gitId":"-"},"content":" greet(): string,"},{"lineNumber":143,"author":{"gitId":"-"},"content":"}"},{"lineNumber":144,"author":{"gitId":"-"},"content":"```"},{"lineNumber":145,"author":{"gitId":"-"},"content":"Positive Example:"},{"lineNumber":146,"author":{"gitId":"-"},"content":"```typescript"},{"lineNumber":147,"author":{"gitId":"-"},"content":"// semicolon delimiter"},{"lineNumber":148,"author":{"gitId":"-"},"content":"interface Foo {"},{"lineNumber":149,"author":{"gitId":"-"},"content":" name: string;"},{"lineNumber":150,"author":{"gitId":"-"},"content":" greet(): string;"},{"lineNumber":151,"author":{"gitId":"-"},"content":"}"},{"lineNumber":152,"author":{"gitId":"-"},"content":"```"},{"lineNumber":153,"author":{"gitId":"-"},"content":"* For type annotations, use a space after but not before."},{"lineNumber":154,"author":{"gitId":"-"},"content":""},{"lineNumber":155,"author":{"gitId":"-"},"content":"Negative Examples:"},{"lineNumber":156,"author":{"gitId":"-"},"content":"```typescript"},{"lineNumber":157,"author":{"gitId":"-"},"content":"let foo:string \u003d \"bar\";"},{"lineNumber":158,"author":{"gitId":"-"},"content":"let foo :string \u003d \"bar\";"},{"lineNumber":159,"author":{"gitId":"-"},"content":"let foo : string \u003d \"bar\";"},{"lineNumber":160,"author":{"gitId":"-"},"content":""},{"lineNumber":161,"author":{"gitId":"-"},"content":"function foo():string {}"},{"lineNumber":162,"author":{"gitId":"-"},"content":"function foo() :string {}"},{"lineNumber":163,"author":{"gitId":"-"},"content":"function foo() : string {}"},{"lineNumber":164,"author":{"gitId":"-"},"content":""},{"lineNumber":165,"author":{"gitId":"-"},"content":"class Foo {"},{"lineNumber":166,"author":{"gitId":"-"},"content":" name:string;"},{"lineNumber":167,"author":{"gitId":"-"},"content":"}"},{"lineNumber":168,"author":{"gitId":"-"},"content":""},{"lineNumber":169,"author":{"gitId":"-"},"content":"class Foo {"},{"lineNumber":170,"author":{"gitId":"-"},"content":" name :string;"},{"lineNumber":171,"author":{"gitId":"-"},"content":"}"},{"lineNumber":172,"author":{"gitId":"-"},"content":""},{"lineNumber":173,"author":{"gitId":"-"},"content":"class Foo {"},{"lineNumber":174,"author":{"gitId":"-"},"content":" name : string;"},{"lineNumber":175,"author":{"gitId":"-"},"content":"}"},{"lineNumber":176,"author":{"gitId":"-"},"content":"```"},{"lineNumber":177,"author":{"gitId":"-"},"content":"Positive Examples:"},{"lineNumber":178,"author":{"gitId":"-"},"content":"```typescript"},{"lineNumber":179,"author":{"gitId":"-"},"content":"let foo: string \u003d \"bar\";"},{"lineNumber":180,"author":{"gitId":"-"},"content":""},{"lineNumber":181,"author":{"gitId":"-"},"content":"function foo(): string {}"},{"lineNumber":182,"author":{"gitId":"-"},"content":""},{"lineNumber":183,"author":{"gitId":"-"},"content":"class Foo {"},{"lineNumber":184,"author":{"gitId":"-"},"content":" name: string;"},{"lineNumber":185,"author":{"gitId":"-"},"content":"}"},{"lineNumber":186,"author":{"gitId":"-"},"content":"```"}],"authorContributionMap":{"asdfghjkxd":12,"-":174}},{"path":"docs/ug/configFiles.md","fileType":"md","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"{% set title \u003d \"Appendix: Config files format\" %}"},{"lineNumber":2,"author":{"gitId":"-"},"content":"\u003cfrontmatter\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"{{ title | safe }}\""},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003c/frontmatter\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"{% set mandatory %}\u003cspan class\u003d\"badge bg-danger\"\u003emandatory\u003c/span\u003e{% endset %}"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"{% from \u0027scripts/macros.njk\u0027 import embed with context %}"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003ch1 class\u003d\"display-4\"\u003e\u003cmd\u003e{{ title }}\u003c/md\u003e\u003c/h1\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"-"},"content":"\u003cdiv class\u003d\"lead\"\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":""},{"lineNumber":15,"author":{"gitId":"-"},"content":"Given below are the details of the various config files used by RepoSense."},{"lineNumber":16,"author":{"gitId":"-"},"content":"\u003c/div\u003e"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":"**RepoSense ignores the order of column headers in the CSV config files. However, the spelling of the column headers must match the specified headers exactly, or the column would be ignored by RepoSense.**"},{"lineNumber":21,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":"**A value in a config file is optional to provide unless it is specified as {{ mandatory }}**."},{"lineNumber":26,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c!-- \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d --\u003e"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":"## `repo-config.csv`"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":"**`repo-config.csv` file contains repo-level config data.** Each row represents a repository\u0027s configuration ([example](repo-config.csv))."},{"lineNumber":32,"author":{"gitId":"-"},"content":""},{"lineNumber":33,"author":{"gitId":"-"},"content":""},{"lineNumber":34,"author":{"gitId":"-"},"content":"| Column Name | Explanation |"},{"lineNumber":35,"author":{"gitId":"-"},"content":"|-------------|-------------|"},{"lineNumber":36,"author":{"gitId":"-"},"content":"| Repository\u0027s Location {{ mandatory }} | The `Remote Repo URL` or `Disk Path` to the git repository e.g., `https://github.com/foo/bar.git` or `C:\\Users\\user\\Desktop\\GitHub\\foo\\bar` |"},{"lineNumber":37,"author":{"gitId":"-"},"content":"| Branch | The branch to analyze in the target repository e.g., `master`. Default: the default branch of the repo |"},{"lineNumber":38,"author":{"gitId":"-"},"content":"| File formats\u003csup\u003e*+\u003c/sup\u003e | The file extensions to analyze. Binary file formats, such as `png` and `jpg`, will be automatically labelled as the file type `binary` in the generated report. Default: all file formats |"},{"lineNumber":39,"author":{"gitId":"-"},"content":"| Find Previous Authors | Enter **`yes`** to utilize Git blame\u0027s ignore revisions functionality, RepoSense will attempt to blame the line changes caused by commits in the ignore commit list to the previous authors who altered those lines (if available). |"},{"lineNumber":40,"author":{"gitId":"-"},"content":"| Ignore Glob List\u003csup\u003e*+\u003c/sup\u003e | The list of file path globs to ignore during analysis for each author e.g., `test/**;temp/**`. Refer to the [_glob format_](https://docs.oracle.com/javase/tutorial/essential/io/fileOps.html#glob) for the path glob syntax. |"},{"lineNumber":41,"author":{"gitId":"-"},"content":"| Ignore standalone config | To ignore the standalone config file (if any) in target repository, enter **`yes`**. If the cell is empty, the standalone config file in the repo (if any) will take precedence over configurations provided in the csv files. |"},{"lineNumber":42,"author":{"gitId":"-"},"content":"| Ignore Commits List\u003csup\u003e*+\u003c/sup\u003e | The list of commits to ignore during analysis. For accurate results, the commits should be provided with their full hash. Additionally, a range of commits can be specified using the `..` notation e.g. `abc123..def456` (both inclusive). |"},{"lineNumber":43,"author":{"gitId":"-"},"content":"| Ignore Authors List\u003csup\u003e*+\u003c/sup\u003e | The list of authors to ignore during analysis. Authors should be specified by their [Git Author Name](#a-note-about-git-author-name). |"},{"lineNumber":44,"author":{"gitId":"-"},"content":"| Shallow Cloning | Enter **`yes`** to clone the repository using Git\u0027s shallow cloning functionality. This option can significantly reduce the time taken to clone large repositories. However, the option should ideally be disabled for smaller repositories where the `.git` file is smaller than 500 MB, as it would create overhead. |"},{"lineNumber":45,"author":{"gitId":"-"},"content":"| File Size Limit\u003csup\u003e+\u003c/sup\u003e | Enter a file size limit for the repository in bytes as a single number without units (for a size limit of 1MB for example, enter 1000000). This file size limit will override the default file size limit (500KB). Files exceeding the file size limit will be marked as ignored and only the file name and line count will be reflected in the report. |"},{"lineNumber":46,"author":{"gitId":"-"},"content":"| Ignore File Size Limit | Enter **`yes`** to ignore both the default file size limit and the file size limit possibly set by the user in `repo-config.csv`. |"},{"lineNumber":47,"author":{"gitId":"-"},"content":"| Skip Ignored File Analysis | Enter **`yes`** to ignore analysis of files exceeding the file size limit entirely. If file analysis is skipped, all information about the file will be omitted from the generated report. This option can significantly improve report generation time. |"},{"lineNumber":48,"author":{"gitId":"-"},"content":""},{"lineNumber":49,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":50,"author":{"gitId":"-"},"content":"The Shallow Cloning option is incompatible with the \"--last-modified-date\" CLI flag."},{"lineNumber":51,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":52,"author":{"gitId":"-"},"content":""},{"lineNumber":53,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":54,"author":{"gitId":"-"},"content":"If Ignore File Size Limit is yes, the File Size Limit and Skip Ignored File Analysis columns are ignored."},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":56,"author":{"gitId":"-"},"content":""},{"lineNumber":57,"author":{"gitId":"-"},"content":"\u003csup\u003e* **Multi-value column**: multiple values can be entered in this column using a semicolon `;` as the separator.\u003c/sup\u003e\u003c/br\u003e"},{"lineNumber":58,"author":{"gitId":"-"},"content":"\u003csup\u003e+ **Overrideable column**: prepend with `override:` to use entered value(s) instead of value(s) from standalone config.\u003c/sup\u003e"},{"lineNumber":59,"author":{"gitId":"-"},"content":""},{"lineNumber":60,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":61,"author":{"gitId":"-"},"content":""},{"lineNumber":62,"author":{"gitId":"-"},"content":"When using [standalone config](#config-json-standalone-config-file) (if it is not ignored), it is possible to override specific values from the standalone config by prepending the entered value with `override:`."},{"lineNumber":63,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":64,"author":{"gitId":"-"},"content":""},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003c!-- \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d --\u003e"},{"lineNumber":66,"author":{"gitId":"-"},"content":""},{"lineNumber":67,"author":{"gitId":"-"},"content":"## `author-config.csv`"},{"lineNumber":68,"author":{"gitId":"-"},"content":""},{"lineNumber":69,"author":{"gitId":"-"},"content":"Optionally, you can use an `author-config.csv` (which should be in the same directory as the `repo-config.csv` file) to provide more details about the authors to analyze ([example](author-config.csv)). It should contain the following columns:"},{"lineNumber":70,"author":{"gitId":"-"},"content":""},{"lineNumber":71,"author":{"gitId":"-"},"content":"| Column Name | Explanation |"},{"lineNumber":72,"author":{"gitId":"-"},"content":"|--------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|"},{"lineNumber":73,"author":{"gitId":"-"},"content":"| Repository\u0027s Location\u003csup\u003e*\u003c/sup\u003e | Same as `repo-config.csv`. Default: all the repos in `repo-config.csv`. |"},{"lineNumber":74,"author":{"gitId":"-"},"content":"| Branch | The branch to analyze for this author, e.g., `master`. Default: the author will be bound to all the repos in `repo-config.csv` that has the same repo\u0027s location, regardless of branch. |"},{"lineNumber":75,"author":{"gitId":"-"},"content":"| Author\u0027s Git Host ID\u003csup\u003e#\u003c/sup\u003e {{ mandatory }} | Username of the target author\u0027s profile on GitHub, GitLab or Bitbucket, e.g.`JohnDoe`. |"},{"lineNumber":76,"author":{"gitId":"-"},"content":"| Author\u0027s Emails\u003csup\u003e*\u003c/sup\u003e | Associated emails of the author. For GitHub users, this can be found in your [GitHub settings](https://github.com/settings/emails). |"},{"lineNumber":77,"author":{"gitId":"-"},"content":"| Author\u0027s Display Name | The name to display for the author. Default: author\u0027s username. |"},{"lineNumber":78,"author":{"gitId":"-"},"content":"| Author\u0027s Git Author Name\u003csup\u003e*\u003c/sup\u003e | The meaning of _Git Author Name_ is explained in [_A note about git author name_](#a-note-about-git-author-name). |"},{"lineNumber":79,"author":{"gitId":"-"},"content":"| Ignore Glob List\u003csup\u003e*\u003c/sup\u003e | Files to ignore for this author, in addition to files ignored by the patterns specified in `repo-config.csv`. The path glob syntax is the same as that of Ignore Glob List in `repo-config.csv`. |"},{"lineNumber":80,"author":{"gitId":"-"},"content":""},{"lineNumber":81,"author":{"gitId":"-"},"content":"\u003csup\u003e* **Multi-value column**: multiple values can be entered in this column using a semicolon `;` as the separator.\u003c/sup\u003e"},{"lineNumber":82,"author":{"gitId":"-"},"content":"\u003c/br\u003e"},{"lineNumber":83,"author":{"gitId":"-"},"content":"\u003csup\u003e# For backward compatibility, `Author\u0027s GitHub ID` is still accepted as the header in place of `Author\u0027s Git Host ID`.\u003c/sup\u003e"},{"lineNumber":84,"author":{"gitId":"-"},"content":""},{"lineNumber":85,"author":{"gitId":"-"},"content":"If `author-config.csv` is not given and the repo has not provided author details in a standalone config file, all the authors of the repositories within the date range specified (if any) will be analyzed."},{"lineNumber":86,"author":{"gitId":"-"},"content":""},{"lineNumber":87,"author":{"gitId":"-"},"content":"`author-config.csv` has some advanced syntax that can help to reduce duplication of the author\u0027s information. The syntax guide is given below:"},{"lineNumber":88,"author":{"gitId":"-"},"content":""},{"lineNumber":89,"author":{"gitId":"-"},"content":"{{ embed(\"Appendix: `author-config.csv` advanced syntax\", \"authorConfigSyntax.md\") }}"},{"lineNumber":90,"author":{"gitId":"-"},"content":""},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003c!-- \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d --\u003e"},{"lineNumber":92,"author":{"gitId":"-"},"content":""},{"lineNumber":93,"author":{"gitId":"-"},"content":"## `group-config.csv`"},{"lineNumber":94,"author":{"gitId":"-"},"content":""},{"lineNumber":95,"author":{"gitId":"-"},"content":"Optionally, you can provide a `group-config.csv`(which should be in the same directory as `repo-config.csv` file) to provide details on any custom groupings for files in specified repositories ([example](group-config.csv)). It should contain the following columns:"},{"lineNumber":96,"author":{"gitId":"-"},"content":""},{"lineNumber":97,"author":{"gitId":"-"},"content":"| Column Name | Explanation |"},{"lineNumber":98,"author":{"gitId":"-"},"content":"|-------------|-------------|"},{"lineNumber":99,"author":{"gitId":"-"},"content":"| Repository\u0027s Location | Same as `repo-config.csv`. Default: all the repos in `repo-config.csv` |"},{"lineNumber":100,"author":{"gitId":"-"},"content":"| Group Name {{ mandatory }} | Name of the group, e.g.,`test`. |"},{"lineNumber":101,"author":{"gitId":"-"},"content":"| Globs * {{ mandatory }} | The list of file path globs to include for specified group, e.g.,`**/test/*;**.java`. |"},{"lineNumber":102,"author":{"gitId":"-"},"content":""},{"lineNumber":103,"author":{"gitId":"-"},"content":"\u003csup\u003e* **Multi-value column**: multiple values can be entered in this column using a semicolon `;` as the separator.\u003c/sup\u003e"},{"lineNumber":104,"author":{"gitId":"-"},"content":""},{"lineNumber":105,"author":{"gitId":"-"},"content":"Note that a file in a given repository should only be tagged to one group. \u003cbr\u003e"},{"lineNumber":106,"author":{"gitId":"-"},"content":"e.g.: `example.java` in `example-repo` can either be in the `test` group or the `code` group, but not in both `test` and `code` group. If multiple groups are specified for a given file, the latter group (i.e., `code` group) is set for the file."},{"lineNumber":107,"author":{"gitId":"-"},"content":""},{"lineNumber":108,"author":{"gitId":"-"},"content":"\u003c!-- \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d --\u003e"},{"lineNumber":109,"author":{"gitId":"-"},"content":""},{"lineNumber":110,"author":{"gitId":"-"},"content":"## `report-config.json`"},{"lineNumber":111,"author":{"gitId":"-"},"content":""},{"lineNumber":112,"author":{"gitId":"-"},"content":"You can optionally use `report-config.json` to customize report generation by providing the following information. ([example](report-config.json))"},{"lineNumber":113,"author":{"gitId":"-"},"content":""},{"lineNumber":114,"author":{"gitId":"-"},"content":"**Fields to provide**:"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* `title`: Title of the generated report, which is also the title of the deployed dashboard. Default: \"RepoSense Report\""},{"lineNumber":116,"author":{"gitId":"-"},"content":""},{"lineNumber":117,"author":{"gitId":"-"},"content":"\u003c!-- \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d --\u003e"},{"lineNumber":118,"author":{"gitId":"-"},"content":""},{"lineNumber":119,"author":{"gitId":"-"},"content":"\u003cdiv id\u003d\"section-standalone\"\u003e"},{"lineNumber":120,"author":{"gitId":"-"},"content":""},{"lineNumber":121,"author":{"gitId":"-"},"content":"## `config.json` (standalone config file)"},{"lineNumber":122,"author":{"gitId":"-"},"content":""},{"lineNumber":123,"author":{"gitId":"-"},"content":"Repo owners can provide the following additional information to RepoSense using a config file that we call the **_standalone config file_**:"},{"lineNumber":124,"author":{"gitId":"-"},"content":"* which files/authors/commits to analyze/omit"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* which git and git host usernames belong to which authors"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* the display of an author"},{"lineNumber":127,"author":{"gitId":"-"},"content":""},{"lineNumber":128,"author":{"gitId":"-"},"content":"To use this feature, add a `_reposense/config.json` to the root of your repo using the format in the example below ([another example](https://github.com/reposense/RepoSense/blob/master/_reposense/config.json)) and **commit it** (reason: RepoSense can see committed code only):"},{"lineNumber":129,"author":{"gitId":"-"},"content":"```json {.no-line-numbers}"},{"lineNumber":130,"author":{"gitId":"-"},"content":"{"},{"lineNumber":131,"author":{"gitId":"-"},"content":" \"ignoreGlobList\": [\"about-us/**\", \"**index.html\"],"},{"lineNumber":132,"author":{"gitId":"-"},"content":" \"formats\": [\"html\", \"css\"],"},{"lineNumber":133,"author":{"gitId":"-"},"content":" \"ignoreCommitList\": [\"90018e49f129ce7e0abdc8b18e91c9813588c601\", \"67890def\", \"abc123..def456\"],"},{"lineNumber":134,"author":{"gitId":"-"},"content":" \"ignoreAuthorList\": [\"charlie\"],"},{"lineNumber":135,"author":{"gitId":"-"},"content":" \"authors\":"},{"lineNumber":136,"author":{"gitId":"-"},"content":" ["},{"lineNumber":137,"author":{"gitId":"-"},"content":" {"},{"lineNumber":138,"author":{"gitId":"-"},"content":" \"gitId\": \"alice\","},{"lineNumber":139,"author":{"gitId":"-"},"content":" \"emails\": [\"alice@example.com\", \"alicet@example.com\"],"},{"lineNumber":140,"author":{"gitId":"-"},"content":" \"displayName\": \"Alice T.\","},{"lineNumber":141,"author":{"gitId":"-"},"content":" \"authorNames\": [\"AT\", \"A\"],"},{"lineNumber":142,"author":{"gitId":"-"},"content":" \"ignoreGlobList\": [\"**.css\"]"},{"lineNumber":143,"author":{"gitId":"-"},"content":" },"},{"lineNumber":144,"author":{"gitId":"-"},"content":" {"},{"lineNumber":145,"author":{"gitId":"-"},"content":" \"gitId\": \"bob\""},{"lineNumber":146,"author":{"gitId":"-"},"content":" }"},{"lineNumber":147,"author":{"gitId":"-"},"content":" ]"},{"lineNumber":148,"author":{"gitId":"-"},"content":"}"},{"lineNumber":149,"author":{"gitId":"-"},"content":"```"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Note: all fields are optional unless specified otherwise."},{"lineNumber":151,"author":{"gitId":"-"},"content":""},{"lineNumber":152,"author":{"gitId":"-"},"content":"**Fields to provide _repository-level_ info**:"},{"lineNumber":153,"author":{"gitId":"-"},"content":""},{"lineNumber":154,"author":{"gitId":"-"},"content":"* `ignoreGlobList`: Folders/files to ignore, specified using the [_glob format_](https://docs.oracle.com/javase/tutorial/essential/io/fileOps.html#glob)."},{"lineNumber":155,"author":{"gitId":"-"},"content":"* `formats`: File formats to analyze. Binary file formats, such as `png` and `jpg`, will be automatically labelled as the file type `binary` in the generated report. Default: all file formats"},{"lineNumber":156,"author":{"gitId":"-"},"content":"* `ignoreCommitList`: The list of commits to ignore during analysis. For accurate results, the commits should be provided with their full hash. Additionally, a range of commits can be specified using the `..` notation e.g. `abc123..def456` (both inclusive)."},{"lineNumber":157,"author":{"gitId":"-"},"content":"* `ignoreAuthorList`: The list of authors to ignore during analysis. Authors specified in `authors` field or `author-config.csv` will be also be omitted if they are in this list. Authors should be specified by their [Git Author Name](#a-note-about-git-author-name)."},{"lineNumber":158,"author":{"gitId":"-"},"content":"* `fileSizeLimit`: A file size limit for the repository in bytes as a single number without units, that will override the default file size limit. If not specified, the default file size limit will continue to be used."},{"lineNumber":159,"author":{"gitId":"-"},"content":""},{"lineNumber":160,"author":{"gitId":"-"},"content":"**Fields to provide _author-level_ info**:\u003cbr\u003e"},{"lineNumber":161,"author":{"gitId":"-"},"content":"Note: `authors` field should contain _all_ authors that should be captured in the analysis."},{"lineNumber":162,"author":{"gitId":"-"},"content":"* `gitId`: Username of the author. {{ mandatory }} field."},{"lineNumber":163,"author":{"gitId":"-"},"content":"* `emails`: Associated git emails of the author. For GitHub, this can be found in your [GitHub settings](https://github.com/settings/emails)."},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `displayName`: Name to display on the report for this author."},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `authorNames`: Git Author Name(s) used in the author\u0027s commits. By default, RepoSense assumes an author would use their remote Git Host username as the Git username too. The meaning of _Git Author Name_ is explained in [_A note about git author name_](#a-note-about-git-author-name)."},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `ignoreGlobList`: _Additional_ (i.e. on top of the repo-level `ignoreGlobList`) folders/files to ignore for a specific author. The path glob syntax is specified by the [_glob format_](https://docs.oracle.com/javase/tutorial/essential/io/fileOps.html#glob). In the example above, the actual `ignoreGlobList` for `alice` would be `[\"about-us/**\", \"**index.html\", \"**.css\"]`."},{"lineNumber":167,"author":{"gitId":"-"},"content":""},{"lineNumber":168,"author":{"gitId":"-"},"content":"To verify your standalone configuration is as intended, add the `_reposense/config.json` to your local copy of repo and run RepoSense against it as follows:\u003cbr\u003e"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* Format: `java -jar RepoSense.jar --repo LOCAL_REPO_LOCATION` \u003cbr\u003e"},{"lineNumber":170,"author":{"gitId":"-"},"content":"* Example: `java -jar RepoSense.jar --repo c:/myRepose/foo/bar`\u003cbr\u003e"},{"lineNumber":171,"author":{"gitId":"-"},"content":"After that, view the report to see if the configuration you specified in the config file is being reflected correctly in the report."},{"lineNumber":172,"author":{"gitId":"-"},"content":""},{"lineNumber":173,"author":{"gitId":"-"},"content":"## A note about git author name"},{"lineNumber":174,"author":{"gitId":"-"},"content":""},{"lineNumber":175,"author":{"gitId":"-"},"content":"`Git Author Name` refers to the customizable author\u0027s display name set in the local `.gitconfig` file. For example, in the Git Log\u0027s display:"},{"lineNumber":176,"author":{"gitId":"-"},"content":"``` {.no-line-numbers}"},{"lineNumber":177,"author":{"gitId":"-"},"content":"..."},{"lineNumber":178,"author":{"gitId":"-"},"content":"commit cd7f610e0becbdf331d5231887d8010a689f87c7"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Author: ConfiguredAuthorName \u003cauthor@example.com\u003e"},{"lineNumber":180,"author":{"gitId":"-"},"content":"Date: Fri Feb 9 19:14:41 2018 +0800"},{"lineNumber":181,"author":{"gitId":"-"},"content":""},{"lineNumber":182,"author":{"gitId":"-"},"content":" Make some changes to show my new author\u0027s name"},{"lineNumber":183,"author":{"gitId":"-"},"content":""},{"lineNumber":184,"author":{"gitId":"-"},"content":"commit e3f699fd4ef128eebce98d5b4e5b3bb06a512f49"},{"lineNumber":185,"author":{"gitId":"-"},"content":"Author: ActualGitHostId \u003cauthor@example.com\u003e"},{"lineNumber":186,"author":{"gitId":"-"},"content":"Date: Fri Feb 9 19:13:13 2018 +0800"},{"lineNumber":187,"author":{"gitId":"-"},"content":""},{"lineNumber":188,"author":{"gitId":"-"},"content":" Initial commit"},{"lineNumber":189,"author":{"gitId":"-"},"content":" ..."},{"lineNumber":190,"author":{"gitId":"-"},"content":"```"},{"lineNumber":191,"author":{"gitId":"-"},"content":"`ActualGitHostId` and `ConfiguredAuthorName` are both `Git Author Name` of the same author.\u003cbr\u003e"},{"lineNumber":192,"author":{"gitId":"-"},"content":"To find the author name that you are currently using for your current git repository, run the following command within your git repository:"},{"lineNumber":193,"author":{"gitId":"asdfghjkxd"},"content":"``` shell {.no-line-numbers}"},{"lineNumber":194,"author":{"gitId":"-"},"content":"git config user.name"},{"lineNumber":195,"author":{"gitId":"-"},"content":"```"},{"lineNumber":196,"author":{"gitId":"-"},"content":"To set the author name to the value you want (e.g., to set it to your GitHub username) for your current git repository, you can use the following command ([more info](https://www.git-tower.com/learn/git/faq/change-author-name-email)):"},{"lineNumber":197,"author":{"gitId":"asdfghjkxd"},"content":"``` shell {.no-line-numbers}"},{"lineNumber":198,"author":{"gitId":"-"},"content":"git config user.name \"YOUR_AUTHOR_NAME”"},{"lineNumber":199,"author":{"gitId":"-"},"content":"```"},{"lineNumber":200,"author":{"gitId":"-"},"content":"To set the author name to use a default value you want for future git repositories, you can use the following command:"},{"lineNumber":201,"author":{"gitId":"asdfghjkxd"},"content":"``` shell {.no-line-numbers}"},{"lineNumber":202,"author":{"gitId":"-"},"content":"git config --global user.name \"YOUR_AUTHOR_NAME”"},{"lineNumber":203,"author":{"gitId":"-"},"content":"```"},{"lineNumber":204,"author":{"gitId":"-"},"content":"RepoSense expects the Git Author Name to be the same as author\u0027s username on the Git hosting platform (GitHub, GitLab, BitBucket). If an author\u0027s `Git Author Name` is different from their username on the Git hosting platform, the `Git Author Name` needs to be specified in the standalone config file. If the author has more than one `Git Author Name`, multiple values can be entered too."},{"lineNumber":205,"author":{"gitId":"-"},"content":""},{"lineNumber":206,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e"},{"lineNumber":207,"author":{"gitId":"-"},"content":""},{"lineNumber":208,"author":{"gitId":"-"},"content":"Note: Symbols such as `\"`, `!`, `/` etc. in your author name will be omitted, which may reduce the accuracy of the analysis if 2 names in the repository are approximately similar."},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":210,"author":{"gitId":"-"},"content":""},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003c/div\u003e"}],"authorContributionMap":{"asdfghjkxd":3,"-":208}},{"path":"frontend/.eslintrc.json","fileType":"json","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"{"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \"env\": {"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \"browser\": true"},{"lineNumber":4,"author":{"gitId":"-"},"content":" },"},{"lineNumber":5,"author":{"gitId":"-"},"content":" \"extends\": ["},{"lineNumber":6,"author":{"gitId":"-"},"content":" \"airbnb-base\","},{"lineNumber":7,"author":{"gitId":"-"},"content":" \"plugin:vue/recommended\","},{"lineNumber":8,"author":{"gitId":"-"},"content":" \"@vue/typescript\","},{"lineNumber":9,"author":{"gitId":"-"},"content":" \"plugin:import/typescript\""},{"lineNumber":10,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \"rules\": {"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \"vue/component-definition-name-casing\": ["},{"lineNumber":13,"author":{"gitId":"-"},"content":" \"error\","},{"lineNumber":14,"author":{"gitId":"-"},"content":" \"kebab-case\""},{"lineNumber":15,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \"vue/require-prop-types\": 0,"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \"no-param-reassign\": 0,"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \"arrow-parens\": ["},{"lineNumber":19,"author":{"gitId":"-"},"content":" \"error\","},{"lineNumber":20,"author":{"gitId":"-"},"content":" \"always\""},{"lineNumber":21,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \"indent\": ["},{"lineNumber":23,"author":{"gitId":"-"},"content":" \"error\","},{"lineNumber":24,"author":{"gitId":"-"},"content":" 2,"},{"lineNumber":25,"author":{"gitId":"-"},"content":" {"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \"ignoredNodes\": ["},{"lineNumber":27,"author":{"gitId":"-"},"content":" \"ConditionalExpression\""},{"lineNumber":28,"author":{"gitId":"-"},"content":" ]"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }"},{"lineNumber":30,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":31,"author":{"gitId":"-"},"content":" \"prefer-destructuring\": 0,"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \"func-names\": ["},{"lineNumber":33,"author":{"gitId":"-"},"content":" \"error\","},{"lineNumber":34,"author":{"gitId":"-"},"content":" \"as-needed\""},{"lineNumber":35,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":36,"author":{"gitId":"-"},"content":" \"no-alert\": 0,"},{"lineNumber":37,"author":{"gitId":"-"},"content":" \"linebreak-style\": 0,"},{"lineNumber":38,"author":{"gitId":"-"},"content":" \"max-len\": ["},{"lineNumber":39,"author":{"gitId":"-"},"content":" \"error\","},{"lineNumber":40,"author":{"gitId":"-"},"content":" {"},{"lineNumber":41,"author":{"gitId":"-"},"content":" \"code\": 120"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }"},{"lineNumber":43,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":44,"author":{"gitId":"-"},"content":" \"prefer-object-spread\": 0,"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \"function-call-argument-newline\": 0,"},{"lineNumber":46,"author":{"gitId":"-"},"content":" \"vue/no-computed-properties-in-data\": 0,"},{"lineNumber":47,"author":{"gitId":"-"},"content":" \"import/extensions\": ["},{"lineNumber":48,"author":{"gitId":"-"},"content":" \"error\","},{"lineNumber":49,"author":{"gitId":"-"},"content":" {"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \"js\": \"never\","},{"lineNumber":51,"author":{"gitId":"-"},"content":" \"ts\": \"never\""},{"lineNumber":52,"author":{"gitId":"-"},"content":" }"},{"lineNumber":53,"author":{"gitId":"-"},"content":" ]"},{"lineNumber":54,"author":{"gitId":"-"},"content":" },"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \"parserOptions\": {"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \"parser\": \"@typescript-eslint/parser\""},{"lineNumber":57,"author":{"gitId":"-"},"content":" },"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \"overrides\": ["},{"lineNumber":59,"author":{"gitId":"-"},"content":" {"},{"lineNumber":60,"author":{"gitId":"-"},"content":" \"files\": [\"*.ts\"],"},{"lineNumber":61,"author":{"gitId":"-"},"content":" \"extends\": ["},{"lineNumber":62,"author":{"gitId":"-"},"content":" \"airbnb-typescript/base\","},{"lineNumber":63,"author":{"gitId":"-"},"content":" \"plugin:@typescript-eslint/recommended\""},{"lineNumber":64,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \"parserOptions\": {"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \"project\": [\"./tsconfig.json\"]"},{"lineNumber":67,"author":{"gitId":"-"},"content":" },"},{"lineNumber":68,"author":{"gitId":"-"},"content":" \"rules\": {"},{"lineNumber":69,"author":{"gitId":"-"},"content":" \"indent\": \"off\","},{"lineNumber":70,"author":{"gitId":"-"},"content":" \"@typescript-eslint/indent\": ["},{"lineNumber":71,"author":{"gitId":"-"},"content":" \"error\","},{"lineNumber":72,"author":{"gitId":"-"},"content":" 2,"},{"lineNumber":73,"author":{"gitId":"-"},"content":" {"},{"lineNumber":74,"author":{"gitId":"-"},"content":" \"ignoredNodes\": ["},{"lineNumber":75,"author":{"gitId":"-"},"content":" \"ConditionalExpression\""},{"lineNumber":76,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":77,"author":{"gitId":"-"},"content":" \"SwitchCase\": 0"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }"},{"lineNumber":79,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":80,"author":{"gitId":"-"},"content":" \"@typescript-eslint/member-delimiter-style\": \"error\","},{"lineNumber":81,"author":{"gitId":"sopa301"},"content":" \"@typescript-eslint/type-annotation-spacing\": \"error\","},{"lineNumber":82,"author":{"gitId":"sopa301"},"content":" \"@typescript-eslint/array-type\": ["},{"lineNumber":83,"author":{"gitId":"sopa301"},"content":" \"error\","},{"lineNumber":84,"author":{"gitId":"sopa301"},"content":" {"},{"lineNumber":85,"author":{"gitId":"sopa301"},"content":" \"default\": \"array-simple\","},{"lineNumber":86,"author":{"gitId":"sopa301"},"content":" \"readonly\": \"array-simple\""},{"lineNumber":87,"author":{"gitId":"sopa301"},"content":" }"},{"lineNumber":88,"author":{"gitId":"sopa301"},"content":" ]"},{"lineNumber":89,"author":{"gitId":"sopa301"},"content":" }"},{"lineNumber":90,"author":{"gitId":"sopa301"},"content":" },"},{"lineNumber":91,"author":{"gitId":"sopa301"},"content":" {"},{"lineNumber":92,"author":{"gitId":"sopa301"},"content":" \"files\": [\"*.vue\"],"},{"lineNumber":93,"author":{"gitId":"sopa301"},"content":" \"rules\": {"},{"lineNumber":94,"author":{"gitId":"sopa301"},"content":" \"@typescript-eslint/array-type\": ["},{"lineNumber":95,"author":{"gitId":"sopa301"},"content":" \"error\","},{"lineNumber":96,"author":{"gitId":"sopa301"},"content":" {"},{"lineNumber":97,"author":{"gitId":"sopa301"},"content":" \"default\": \"generic\","},{"lineNumber":98,"author":{"gitId":"sopa301"},"content":" \"readonly\": \"generic\""},{"lineNumber":99,"author":{"gitId":"sopa301"},"content":" }"},{"lineNumber":100,"author":{"gitId":"sopa301"},"content":" ]"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }"},{"lineNumber":103,"author":{"gitId":"-"},"content":" ]"},{"lineNumber":104,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"sopa301":20,"-":84}},{"path":"frontend/.stylelintrc.json","fileType":"json","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"{"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \"plugins\": ["},{"lineNumber":3,"author":{"gitId":"-"},"content":" \"stylelint-order\""},{"lineNumber":4,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":5,"author":{"gitId":"-"},"content":" \"extends\": ["},{"lineNumber":6,"author":{"gitId":"-"},"content":" \"stylelint-config-recommended-scss\","},{"lineNumber":7,"author":{"gitId":"-"},"content":" \"stylelint-config-recommended-vue\""},{"lineNumber":8,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \"rules\": {"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \"color-no-invalid-hex\": true,"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \"string-no-newline\": true,"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \"unit-no-unknown\": true,"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \"property-no-unknown\": true,"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \"block-no-empty\": true,"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \"comment-no-empty\": true,"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \"no-extra-semicolons\": true,"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \"no-invalid-double-slash-comments\": true,"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \"declaration-no-important\": true,"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \"declaration-block-single-line-max-declarations\": 1,"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \"number-leading-zero\": \"never\","},{"lineNumber":21,"author":{"gitId":"-"},"content":" \"number-no-trailing-zeros\": null,"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \"string-quotes\": \"single\","},{"lineNumber":23,"author":{"gitId":"-"},"content":" \"length-zero-no-unit\": true,"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \"value-keyword-case\": \"lower\","},{"lineNumber":25,"author":{"gitId":"-"},"content":" \"property-case\": \"lower\","},{"lineNumber":26,"author":{"gitId":"-"},"content":" \"declaration-colon-space-after\": \"always\","},{"lineNumber":27,"author":{"gitId":"-"},"content":" \"selector-type-case\": \"lower\","},{"lineNumber":28,"author":{"gitId":"-"},"content":" \"selector-list-comma-newline-after\": \"always\","},{"lineNumber":29,"author":{"gitId":"-"},"content":" \"no-eol-whitespace\": true,"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \"order/properties-alphabetical-order\": true,"},{"lineNumber":31,"author":{"gitId":"-"},"content":" \"indentation\": 2,"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \"scss/at-import-partial-extension\": null,"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \"function-no-unknown\": null,"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \"scss/at-import-no-partial-leading-underscore\": null,"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \"no-descending-specificity\": null,"},{"lineNumber":36,"author":{"gitId":"-"},"content":" \"scss/no-global-function-names\": null,"},{"lineNumber":37,"author":{"gitId":"-"},"content":" \"selector-type-no-unknown\": null,"},{"lineNumber":38,"author":{"gitId":"-"},"content":" \"at-rule-no-unknown\": null,"},{"lineNumber":39,"author":{"gitId":"sopa301"},"content":" \"no-duplicate-selectors\": null,"},{"lineNumber":40,"author":{"gitId":"sopa301"},"content":" \"block-opening-brace-space-before\": \"always\","},{"lineNumber":41,"author":{"gitId":"sopa301"},"content":" \"declaration-colon-space-before\": \"never\""},{"lineNumber":42,"author":{"gitId":"-"},"content":" }"},{"lineNumber":43,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"sopa301":3,"-":40}},{"path":"frontend/cypress/tests/chartView/chartView_zoomFeature.cy.js","fileType":"js","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"const extractDate \u003d (str) \u003d\u003e {"},{"lineNumber":2,"author":{"gitId":"-"},"content":" const regex \u003d /\\[(.*?)\\]/g;"},{"lineNumber":3,"author":{"gitId":"-"},"content":" const matches \u003d str.match(regex);"},{"lineNumber":4,"author":{"gitId":"-"},"content":" return new Date(matches[0].slice(1, -1));"},{"lineNumber":5,"author":{"gitId":"-"},"content":"};"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"describe(\u0027zoom features in code view\u0027, () \u003d\u003e {"},{"lineNumber":8,"author":{"gitId":"-"},"content":" const zoomKey \u003d Cypress.platform \u003d\u003d\u003d \u0027darwin\u0027 ? \u0027{meta}\u0027 : \u0027{ctrl}\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":" it(\u0027click on view commits button\u0027, () \u003d\u003e {"},{"lineNumber":10,"author":{"gitId":"-"},"content":" cy.get(\u0027.icon-button.fa-list-ul\u0027)"},{"lineNumber":11,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":12,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":13,"author":{"gitId":"-"},"content":" .click();"},{"lineNumber":14,"author":{"gitId":"-"},"content":""},{"lineNumber":15,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom\u0027)"},{"lineNumber":16,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027);"},{"lineNumber":17,"author":{"gitId":"-"},"content":" });"},{"lineNumber":18,"author":{"gitId":"-"},"content":""},{"lineNumber":19,"author":{"gitId":"-"},"content":" it(\u0027zoom into ramp\u0027, () \u003d\u003e {"},{"lineNumber":20,"author":{"gitId":"-"},"content":" // clicking from the 10th px to the 50th px in the ramp"},{"lineNumber":21,"author":{"gitId":"-"},"content":" cy.get(\u0027body\u0027).type(zoomKey, { release: false })"},{"lineNumber":22,"author":{"gitId":"-"},"content":" .get(\u0027#summary-charts .summary-chart__ramp .ramp\u0027)"},{"lineNumber":23,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":24,"author":{"gitId":"-"},"content":" .click(10, 20)"},{"lineNumber":25,"author":{"gitId":"-"},"content":" .click(50, 20);"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom\u0027)"},{"lineNumber":28,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027);"},{"lineNumber":29,"author":{"gitId":"-"},"content":" });"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":" it(\u0027zoom into ramp when merge group\u0027, () \u003d\u003e {"},{"lineNumber":32,"author":{"gitId":"-"},"content":" cy.get(\u0027#summary label.merge-group \u003e input:visible\u0027)"},{"lineNumber":33,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":34,"author":{"gitId":"-"},"content":" .check()"},{"lineNumber":35,"author":{"gitId":"-"},"content":" .should(\u0027be.checked\u0027);"},{"lineNumber":36,"author":{"gitId":"-"},"content":""},{"lineNumber":37,"author":{"gitId":"-"},"content":" // clicking from the 10th px to the 50th px in the ramp"},{"lineNumber":38,"author":{"gitId":"-"},"content":" cy.get(\u0027body\u0027).type(zoomKey, { release: false })"},{"lineNumber":39,"author":{"gitId":"-"},"content":" .get(\u0027#summary-charts .summary-chart__ramp .ramp\u0027)"},{"lineNumber":40,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":41,"author":{"gitId":"-"},"content":" .click(10, 20)"},{"lineNumber":42,"author":{"gitId":"-"},"content":" .click(50, 20);"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom\u0027)"},{"lineNumber":45,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027);"},{"lineNumber":46,"author":{"gitId":"-"},"content":" });"},{"lineNumber":47,"author":{"gitId":"-"},"content":"});"},{"lineNumber":48,"author":{"gitId":"-"},"content":""},{"lineNumber":49,"author":{"gitId":"-"},"content":"// Assumptions: Contributer \u0027eugenepeh\u0027 is the first result."},{"lineNumber":50,"author":{"gitId":"-"},"content":"describe(\u0027date changes in chart view should reflect in zoom\u0027, () \u003d\u003e {"},{"lineNumber":51,"author":{"gitId":"-"},"content":" it(\u0027setting \\\u0027since\\\u0027 date range changes the zoom view\u0027, () \u003d\u003e {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-textfield.search_box \u003e input:visible\u0027)"},{"lineNumber":53,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":54,"author":{"gitId":"-"},"content":" .type(\u0027eugenepeh\u0027);"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":" cy.get(\u0027input[name\u003d\"since\"]:visible\u0027)"},{"lineNumber":57,"author":{"gitId":"-"},"content":" .type(\u00272018-06-11\u0027);"},{"lineNumber":58,"author":{"gitId":"-"},"content":""},{"lineNumber":59,"author":{"gitId":"-"},"content":" cy.get(\u0027.icon-button.fa-list-ul\u0027)"},{"lineNumber":60,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":61,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":62,"author":{"gitId":"-"},"content":" .click();"},{"lineNumber":63,"author":{"gitId":"-"},"content":""},{"lineNumber":64,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom\u0027)"},{"lineNumber":65,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027);"},{"lineNumber":66,"author":{"gitId":"-"},"content":""},{"lineNumber":67,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":68,"author":{"gitId":"-"},"content":" .each(($element) \u003d\u003e {"},{"lineNumber":69,"author":{"gitId":"-"},"content":" cy.wrap($element)"},{"lineNumber":70,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":71,"author":{"gitId":"-"},"content":" .then((titleStr) \u003d\u003e {"},{"lineNumber":72,"author":{"gitId":"-"},"content":" const date \u003d extractDate(titleStr);"},{"lineNumber":73,"author":{"gitId":"-"},"content":" cy.wrap(date).should(\u0027be.gte\u0027, new Date(\u00272018-06-11\u0027));"},{"lineNumber":74,"author":{"gitId":"-"},"content":" });"},{"lineNumber":75,"author":{"gitId":"-"},"content":" });"},{"lineNumber":76,"author":{"gitId":"-"},"content":" });"},{"lineNumber":77,"author":{"gitId":"-"},"content":" // Assumptions: Contributer \u0027yong24s\u0027 is the first result."},{"lineNumber":78,"author":{"gitId":"-"},"content":" it(\u0027setting \\\u0027since\\\u0027 date again results in a different zoom view\u0027, () \u003d\u003e {"},{"lineNumber":79,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-textfield.search_box \u003e input:visible\u0027)"},{"lineNumber":80,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":81,"author":{"gitId":"-"},"content":" .type(\u0027yong24s\u0027);"},{"lineNumber":82,"author":{"gitId":"-"},"content":""},{"lineNumber":83,"author":{"gitId":"-"},"content":" cy.get(\u0027input[name\u003d\"since\"]:visible\u0027)"},{"lineNumber":84,"author":{"gitId":"-"},"content":" .type(\u00272018-05-20\u0027);"},{"lineNumber":85,"author":{"gitId":"-"},"content":""},{"lineNumber":86,"author":{"gitId":"-"},"content":" cy.get(\u0027.icon-button.fa-list-ul\u0027)"},{"lineNumber":87,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":88,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":89,"author":{"gitId":"-"},"content":" .click();"},{"lineNumber":90,"author":{"gitId":"-"},"content":""},{"lineNumber":91,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom\u0027)"},{"lineNumber":92,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027);"},{"lineNumber":93,"author":{"gitId":"-"},"content":""},{"lineNumber":94,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":95,"author":{"gitId":"-"},"content":" .each(($element) \u003d\u003e {"},{"lineNumber":96,"author":{"gitId":"-"},"content":" cy.wrap($element)"},{"lineNumber":97,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":98,"author":{"gitId":"-"},"content":" .then((titleStr) \u003d\u003e {"},{"lineNumber":99,"author":{"gitId":"-"},"content":" const date \u003d extractDate(titleStr);"},{"lineNumber":100,"author":{"gitId":"-"},"content":" cy.wrap(date).should(\u0027be.gte\u0027, new Date(\u00272018-05-20\u0027));"},{"lineNumber":101,"author":{"gitId":"-"},"content":" });"},{"lineNumber":102,"author":{"gitId":"-"},"content":" });"},{"lineNumber":103,"author":{"gitId":"-"},"content":" });"},{"lineNumber":104,"author":{"gitId":"-"},"content":""},{"lineNumber":105,"author":{"gitId":"-"},"content":" // Assumptions: Contributer \u0027eugenepeh\u0027 is the first result."},{"lineNumber":106,"author":{"gitId":"-"},"content":" it(\u0027setting the \\\u0027until\\\u0027 date changes the zoom view\u0027, () \u003d\u003e {"},{"lineNumber":107,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-textfield.search_box \u003e input:visible\u0027)"},{"lineNumber":108,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":109,"author":{"gitId":"-"},"content":" .type(\u0027eugenepeh\u0027);"},{"lineNumber":110,"author":{"gitId":"-"},"content":""},{"lineNumber":111,"author":{"gitId":"-"},"content":" cy.get(\u0027input[name\u003d\"until\"]:visible\u0027)"},{"lineNumber":112,"author":{"gitId":"-"},"content":" .type(\u00272019-08-19\u0027);"},{"lineNumber":113,"author":{"gitId":"-"},"content":""},{"lineNumber":114,"author":{"gitId":"-"},"content":" cy.get(\u0027.icon-button.fa-list-ul\u0027)"},{"lineNumber":115,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":116,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":117,"author":{"gitId":"-"},"content":" .click();"},{"lineNumber":118,"author":{"gitId":"-"},"content":""},{"lineNumber":119,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom\u0027)"},{"lineNumber":120,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027);"},{"lineNumber":121,"author":{"gitId":"-"},"content":""},{"lineNumber":122,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":123,"author":{"gitId":"-"},"content":" .each(($element) \u003d\u003e {"},{"lineNumber":124,"author":{"gitId":"-"},"content":" cy.wrap($element)"},{"lineNumber":125,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":126,"author":{"gitId":"-"},"content":" .then((titleStr) \u003d\u003e {"},{"lineNumber":127,"author":{"gitId":"-"},"content":" const date \u003d extractDate(titleStr);"},{"lineNumber":128,"author":{"gitId":"-"},"content":" cy.wrap(date).should(\u0027be.lte\u0027, new Date(\u00272019-08-19\u0027));"},{"lineNumber":129,"author":{"gitId":"-"},"content":" });"},{"lineNumber":130,"author":{"gitId":"-"},"content":" });"},{"lineNumber":131,"author":{"gitId":"-"},"content":" });"},{"lineNumber":132,"author":{"gitId":"-"},"content":""},{"lineNumber":133,"author":{"gitId":"-"},"content":" // Assumptions: Contributer \u0027ongspxm\u0027 is the first result."},{"lineNumber":134,"author":{"gitId":"-"},"content":" it(\u0027setting the \\\u0027until\\\u0027 date again results in a different zoom view\u0027, () \u003d\u003e {"},{"lineNumber":135,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-textfield.search_box \u003e input:visible\u0027)"},{"lineNumber":136,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":137,"author":{"gitId":"-"},"content":" .type(\u0027ongspxm\u0027);"},{"lineNumber":138,"author":{"gitId":"-"},"content":""},{"lineNumber":139,"author":{"gitId":"-"},"content":" cy.get(\u0027input[name\u003d\"until\"]:visible\u0027)"},{"lineNumber":140,"author":{"gitId":"-"},"content":" .type(\u00272018-07-20\u0027);"},{"lineNumber":141,"author":{"gitId":"-"},"content":""},{"lineNumber":142,"author":{"gitId":"-"},"content":" cy.get(\u0027.icon-button.fa-list-ul\u0027)"},{"lineNumber":143,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":144,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":145,"author":{"gitId":"-"},"content":" .click();"},{"lineNumber":146,"author":{"gitId":"-"},"content":""},{"lineNumber":147,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom\u0027)"},{"lineNumber":148,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027);"},{"lineNumber":149,"author":{"gitId":"-"},"content":""},{"lineNumber":150,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":151,"author":{"gitId":"-"},"content":" .each(($element) \u003d\u003e {"},{"lineNumber":152,"author":{"gitId":"-"},"content":" cy.wrap($element)"},{"lineNumber":153,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":154,"author":{"gitId":"-"},"content":" .then((titleStr) \u003d\u003e {"},{"lineNumber":155,"author":{"gitId":"-"},"content":" const date \u003d extractDate(titleStr);"},{"lineNumber":156,"author":{"gitId":"-"},"content":" cy.wrap(date).should(\u0027be.lte\u0027, new Date(\u00272018-07-20\u0027));"},{"lineNumber":157,"author":{"gitId":"-"},"content":" });"},{"lineNumber":158,"author":{"gitId":"-"},"content":" });"},{"lineNumber":159,"author":{"gitId":"-"},"content":" });"},{"lineNumber":160,"author":{"gitId":"-"},"content":""},{"lineNumber":161,"author":{"gitId":"-"},"content":" // Assumptions: Contributer \u0027eugenepeh\u0027 is the first result."},{"lineNumber":162,"author":{"gitId":"-"},"content":" it(\u0027setting the \\\u0027until\\\u0027 and \\\u0027since\\\u0027 date changes the zoom view\u0027, () \u003d\u003e {"},{"lineNumber":163,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-textfield.search_box \u003e input:visible\u0027)"},{"lineNumber":164,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":165,"author":{"gitId":"-"},"content":" .type(\u0027eugenepeh\u0027);"},{"lineNumber":166,"author":{"gitId":"-"},"content":""},{"lineNumber":167,"author":{"gitId":"-"},"content":" cy.get(\u0027input[name\u003d\"since\"]:visible\u0027)"},{"lineNumber":168,"author":{"gitId":"-"},"content":" .type(\u00272018-08-27\u0027);"},{"lineNumber":169,"author":{"gitId":"-"},"content":""},{"lineNumber":170,"author":{"gitId":"-"},"content":" cy.get(\u0027input[name\u003d\"until\"]:visible\u0027)"},{"lineNumber":171,"author":{"gitId":"-"},"content":" .type(\u00272019-03-09\u0027);"},{"lineNumber":172,"author":{"gitId":"-"},"content":""},{"lineNumber":173,"author":{"gitId":"-"},"content":" cy.get(\u0027.icon-button.fa-list-ul\u0027)"},{"lineNumber":174,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":175,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":176,"author":{"gitId":"-"},"content":" .click();"},{"lineNumber":177,"author":{"gitId":"-"},"content":""},{"lineNumber":178,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom\u0027)"},{"lineNumber":179,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027);"},{"lineNumber":180,"author":{"gitId":"-"},"content":""},{"lineNumber":181,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":182,"author":{"gitId":"-"},"content":" .each(($element) \u003d\u003e {"},{"lineNumber":183,"author":{"gitId":"-"},"content":" cy.wrap($element)"},{"lineNumber":184,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":185,"author":{"gitId":"-"},"content":" .then((titleStr) \u003d\u003e {"},{"lineNumber":186,"author":{"gitId":"-"},"content":" const date \u003d extractDate(titleStr);"},{"lineNumber":187,"author":{"gitId":"-"},"content":" cy.wrap(date).should(\u0027be.lte\u0027, new Date(\u00272019-03-09\u0027));"},{"lineNumber":188,"author":{"gitId":"-"},"content":" });"},{"lineNumber":189,"author":{"gitId":"-"},"content":" });"},{"lineNumber":190,"author":{"gitId":"-"},"content":""},{"lineNumber":191,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":192,"author":{"gitId":"-"},"content":" .each(($element) \u003d\u003e {"},{"lineNumber":193,"author":{"gitId":"-"},"content":" cy.wrap($element)"},{"lineNumber":194,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":195,"author":{"gitId":"-"},"content":" .then((titleStr) \u003d\u003e {"},{"lineNumber":196,"author":{"gitId":"-"},"content":" const date \u003d extractDate(titleStr);"},{"lineNumber":197,"author":{"gitId":"-"},"content":" cy.wrap(date).should(\u0027be.gte\u0027, new Date(\u00272018-08-27\u0027));"},{"lineNumber":198,"author":{"gitId":"-"},"content":" });"},{"lineNumber":199,"author":{"gitId":"-"},"content":" });"},{"lineNumber":200,"author":{"gitId":"-"},"content":" });"},{"lineNumber":201,"author":{"gitId":"-"},"content":""},{"lineNumber":202,"author":{"gitId":"-"},"content":" // Assumptions: Contributer \u0027jamessspanggg\u0027 is the first result."},{"lineNumber":203,"author":{"gitId":"-"},"content":" it(\u0027setting the \\\u0027until\\\u0027 and \\\u0027since\\\u0027 date again results in a different zoom view\u0027, () \u003d\u003e {"},{"lineNumber":204,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-textfield.search_box \u003e input:visible\u0027)"},{"lineNumber":205,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":206,"author":{"gitId":"-"},"content":" .type(\u0027jamessspanggg\u0027);"},{"lineNumber":207,"author":{"gitId":"-"},"content":""},{"lineNumber":208,"author":{"gitId":"-"},"content":" cy.get(\u0027input[name\u003d\"since\"]:visible\u0027)"},{"lineNumber":209,"author":{"gitId":"-"},"content":" .type(\u00272019-07-22\u0027);"},{"lineNumber":210,"author":{"gitId":"-"},"content":""},{"lineNumber":211,"author":{"gitId":"-"},"content":" cy.get(\u0027input[name\u003d\"until\"]:visible\u0027)"},{"lineNumber":212,"author":{"gitId":"-"},"content":" .type(\u00272019-08-01\u0027);"},{"lineNumber":213,"author":{"gitId":"-"},"content":""},{"lineNumber":214,"author":{"gitId":"-"},"content":" cy.get(\u0027.icon-button.fa-list-ul\u0027)"},{"lineNumber":215,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":216,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":217,"author":{"gitId":"-"},"content":" .click();"},{"lineNumber":218,"author":{"gitId":"-"},"content":""},{"lineNumber":219,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom\u0027)"},{"lineNumber":220,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027);"},{"lineNumber":221,"author":{"gitId":"-"},"content":""},{"lineNumber":222,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":223,"author":{"gitId":"-"},"content":" .each(($element) \u003d\u003e {"},{"lineNumber":224,"author":{"gitId":"-"},"content":" cy.wrap($element)"},{"lineNumber":225,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":226,"author":{"gitId":"-"},"content":" .then((titleStr) \u003d\u003e {"},{"lineNumber":227,"author":{"gitId":"-"},"content":" const date \u003d extractDate(titleStr);"},{"lineNumber":228,"author":{"gitId":"-"},"content":" cy.wrap(date).should(\u0027be.lte\u0027, new Date(\u00272019-08-01\u0027));"},{"lineNumber":229,"author":{"gitId":"-"},"content":" });"},{"lineNumber":230,"author":{"gitId":"-"},"content":" });"},{"lineNumber":231,"author":{"gitId":"-"},"content":""},{"lineNumber":232,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":233,"author":{"gitId":"-"},"content":" .each(($element) \u003d\u003e {"},{"lineNumber":234,"author":{"gitId":"-"},"content":" cy.wrap($element)"},{"lineNumber":235,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":236,"author":{"gitId":"-"},"content":" .then((titleStr) \u003d\u003e {"},{"lineNumber":237,"author":{"gitId":"-"},"content":" const date \u003d extractDate(titleStr);"},{"lineNumber":238,"author":{"gitId":"-"},"content":" cy.wrap(date).should(\u0027be.gte\u0027, new Date(\u00272019-07-22\u0027));"},{"lineNumber":239,"author":{"gitId":"-"},"content":" });"},{"lineNumber":240,"author":{"gitId":"-"},"content":" });"},{"lineNumber":241,"author":{"gitId":"-"},"content":" });"},{"lineNumber":242,"author":{"gitId":"-"},"content":"});"},{"lineNumber":243,"author":{"gitId":"-"},"content":""},{"lineNumber":244,"author":{"gitId":"-"},"content":"describe(\u0027range changes in chartview should reflect in zoom\u0027, () \u003d\u003e {"},{"lineNumber":245,"author":{"gitId":"-"},"content":" const zoomKey \u003d Cypress.platform \u003d\u003d\u003d \u0027darwin\u0027 ? \u0027{meta}\u0027 : \u0027{ctrl}\u0027;"},{"lineNumber":246,"author":{"gitId":"-"},"content":""},{"lineNumber":247,"author":{"gitId":"-"},"content":" // Assumptions: Contributer \u0027jamessspanggg\u0027 is the first result,"},{"lineNumber":248,"author":{"gitId":"-"},"content":" // he does not add more commits in the future,"},{"lineNumber":249,"author":{"gitId":"-"},"content":" // and the sort feature is working as expected."},{"lineNumber":250,"author":{"gitId":"-"},"content":" it(\u0027selecting the initial righthand and lefthand boundary\u0027, () \u003d\u003e {"},{"lineNumber":251,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-textfield.search_box \u003e input:visible\u0027)"},{"lineNumber":252,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":253,"author":{"gitId":"-"},"content":" .type(\u0027jamessspanggg\u0027);"},{"lineNumber":254,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027input[name\u003d\"until\"]:visible\u0027)"},{"lineNumber":255,"author":{"gitId":"jonasongg"},"content":" .type(\u00272023-12-31\u0027);"},{"lineNumber":256,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":257,"author":{"gitId":"-"},"content":" cy.get(\u0027body\u0027).type(zoomKey, { release: false })"},{"lineNumber":258,"author":{"gitId":"-"},"content":" .get(\u0027#summary-charts .summary-chart__ramp .ramp\u0027)"},{"lineNumber":259,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":260,"author":{"gitId":"-"},"content":" .click(120, 20)"},{"lineNumber":261,"author":{"gitId":"-"},"content":" .click(250, 20);"},{"lineNumber":262,"author":{"gitId":"-"},"content":""},{"lineNumber":263,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom\u0027)"},{"lineNumber":264,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027);"},{"lineNumber":265,"author":{"gitId":"-"},"content":""},{"lineNumber":266,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":267,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":268,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":269,"author":{"gitId":"-"},"content":" .should(\u0027eq\u0027, \u0027[2021-01-04] Update `About us` page (#1393): +55 -30 lines \u0027);"},{"lineNumber":270,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":271,"author":{"gitId":"-"},"content":" .last()"},{"lineNumber":272,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":273,"author":{"gitId":"-"},"content":" .should(\u0027eq\u0027, \u0027[2019-12-20] [#46] Show total time after batch processing (#758): +43 -0 lines \u0027);"},{"lineNumber":274,"author":{"gitId":"-"},"content":" });"},{"lineNumber":275,"author":{"gitId":"-"},"content":""},{"lineNumber":276,"author":{"gitId":"-"},"content":" // Assumptions: Contributer \u0027jamessspanggg\u0027 is the first result,"},{"lineNumber":277,"author":{"gitId":"-"},"content":" // he does not add more commits in the future,"},{"lineNumber":278,"author":{"gitId":"-"},"content":" // and the sort feature is working as expected."},{"lineNumber":279,"author":{"gitId":"-"},"content":" it(\u0027changing the righthand boundary\u0027, () \u003d\u003e {"},{"lineNumber":280,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-textfield.search_box \u003e input:visible\u0027)"},{"lineNumber":281,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":282,"author":{"gitId":"-"},"content":" .type(\u0027jamessspanggg\u0027);"},{"lineNumber":283,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027input[name\u003d\"until\"]:visible\u0027)"},{"lineNumber":284,"author":{"gitId":"jonasongg"},"content":" .type(\u00272023-12-31\u0027);"},{"lineNumber":285,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":286,"author":{"gitId":"-"},"content":" cy.get(\u0027body\u0027).type(zoomKey, { release: false })"},{"lineNumber":287,"author":{"gitId":"-"},"content":" .get(\u0027#summary-charts .summary-chart__ramp .ramp\u0027)"},{"lineNumber":288,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":289,"author":{"gitId":"-"},"content":" .click(120, 20)"},{"lineNumber":290,"author":{"gitId":"-"},"content":" .click(170, 20);"},{"lineNumber":291,"author":{"gitId":"-"},"content":""},{"lineNumber":292,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom\u0027)"},{"lineNumber":293,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027);"},{"lineNumber":294,"author":{"gitId":"-"},"content":""},{"lineNumber":295,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":296,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":297,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":298,"author":{"gitId":"-"},"content":" .should(\u0027eq\u0027, \u0027[2020-05-23] [#1241] Restore checked file types (#1256): +14 -1 lines \u0027);"},{"lineNumber":299,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":300,"author":{"gitId":"-"},"content":" .last()"},{"lineNumber":301,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":302,"author":{"gitId":"-"},"content":" .should(\u0027eq\u0027, \u0027[2019-12-20] [#46] Show total time after batch processing (#758): +43 -0 lines \u0027);"},{"lineNumber":303,"author":{"gitId":"-"},"content":" });"},{"lineNumber":304,"author":{"gitId":"-"},"content":""},{"lineNumber":305,"author":{"gitId":"-"},"content":" // Assumptions: Contributer \u0027jamessspanggg\u0027 is the first result,"},{"lineNumber":306,"author":{"gitId":"-"},"content":" // he does not add more commits in the future,"},{"lineNumber":307,"author":{"gitId":"-"},"content":" // and the sort feature is working as expected."},{"lineNumber":308,"author":{"gitId":"-"},"content":" it(\u0027changing the lefthand boundary\u0027, () \u003d\u003e {"},{"lineNumber":309,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-textfield.search_box \u003e input:visible\u0027)"},{"lineNumber":310,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":311,"author":{"gitId":"-"},"content":" .type(\u0027jamessspanggg\u0027);"},{"lineNumber":312,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027input[name\u003d\"until\"]:visible\u0027)"},{"lineNumber":313,"author":{"gitId":"jonasongg"},"content":" .type(\u00272023-12-31\u0027);"},{"lineNumber":314,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":315,"author":{"gitId":"-"},"content":" cy.get(\u0027body\u0027).type(zoomKey, { release: false })"},{"lineNumber":316,"author":{"gitId":"-"},"content":" .get(\u0027#summary-charts .summary-chart__ramp .ramp\u0027)"},{"lineNumber":317,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":318,"author":{"gitId":"-"},"content":" .click(170, 20)"},{"lineNumber":319,"author":{"gitId":"-"},"content":" .click(250, 20);"},{"lineNumber":320,"author":{"gitId":"-"},"content":""},{"lineNumber":321,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom\u0027)"},{"lineNumber":322,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027);"},{"lineNumber":323,"author":{"gitId":"-"},"content":""},{"lineNumber":324,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":325,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":326,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":327,"author":{"gitId":"-"},"content":" .should(\u0027eq\u0027, \u0027[2021-01-04] Update `About us` page (#1393): +55 -30 lines \u0027);"},{"lineNumber":328,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":329,"author":{"gitId":"-"},"content":" .last()"},{"lineNumber":330,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":331,"author":{"gitId":"-"},"content":" .should(\u0027eq\u0027, \u0027[2020-09-27] Add optional check for quotes in diff file regex (#1330): +1 -1 lines \u0027);"},{"lineNumber":332,"author":{"gitId":"-"},"content":" });"},{"lineNumber":333,"author":{"gitId":"-"},"content":""},{"lineNumber":334,"author":{"gitId":"-"},"content":" // Assumptions: Contributer \u0027jamessspanggg\u0027 is the first result,"},{"lineNumber":335,"author":{"gitId":"-"},"content":" // he does not add more commits in the future,"},{"lineNumber":336,"author":{"gitId":"-"},"content":" // and the sort feature is working as expected."},{"lineNumber":337,"author":{"gitId":"-"},"content":" it(\u0027changing the righthand and lefthand boundary\u0027, () \u003d\u003e {"},{"lineNumber":338,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-textfield.search_box \u003e input:visible\u0027)"},{"lineNumber":339,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":340,"author":{"gitId":"-"},"content":" .type(\u0027jamessspanggg\u0027);"},{"lineNumber":341,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027input[name\u003d\"until\"]:visible\u0027)"},{"lineNumber":342,"author":{"gitId":"jonasongg"},"content":" .type(\u00272023-12-31\u0027);"},{"lineNumber":343,"author":{"gitId":"-"},"content":""},{"lineNumber":344,"author":{"gitId":"-"},"content":" cy.get(\u0027body\u0027).type(zoomKey, { release: false })"},{"lineNumber":345,"author":{"gitId":"-"},"content":" .get(\u0027#summary-charts .summary-chart__ramp .ramp\u0027)"},{"lineNumber":346,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":347,"author":{"gitId":"-"},"content":" .click(170, 20)"},{"lineNumber":348,"author":{"gitId":"-"},"content":" .click(225, 20);"},{"lineNumber":349,"author":{"gitId":"-"},"content":""},{"lineNumber":350,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom\u0027)"},{"lineNumber":351,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027);"},{"lineNumber":352,"author":{"gitId":"-"},"content":""},{"lineNumber":353,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":354,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":355,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":356,"author":{"gitId":"-"},"content":" .should("},{"lineNumber":357,"author":{"gitId":"-"},"content":" \u0027eq\u0027,"},{"lineNumber":358,"author":{"gitId":"-"},"content":" \u0027[2021-01-04] Update `About us` page (#1393): +55 -30 lines \u0027,"},{"lineNumber":359,"author":{"gitId":"-"},"content":" );"},{"lineNumber":360,"author":{"gitId":"-"},"content":""},{"lineNumber":361,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":362,"author":{"gitId":"-"},"content":" .last()"},{"lineNumber":363,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":364,"author":{"gitId":"-"},"content":" .should(\u0027eq\u0027, \u0027[2020-09-27] Add optional check for quotes in diff file regex (#1330): +1 -1 lines \u0027);"},{"lineNumber":365,"author":{"gitId":"-"},"content":" });"},{"lineNumber":366,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"-":355,"jonasongg":11}},{"path":"frontend/cypress/tests/codeView/codeView_renderFilterHash.cy.js","fileType":"js","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"describe(\u0027render filter hash\u0027, () \u003d\u003e {"},{"lineNumber":2,"author":{"gitId":"-"},"content":" it(\u0027search: url params should persist after change and reload\u0027, () \u003d\u003e {"},{"lineNumber":3,"author":{"gitId":"-"},"content":" /* Check initial state */"},{"lineNumber":4,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-textfield.search_box \u003e input:visible\u0027)"},{"lineNumber":5,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":6,"author":{"gitId":"-"},"content":" .invoke(\u0027val\u0027)"},{"lineNumber":7,"author":{"gitId":"-"},"content":" .should(\u0027eq\u0027, \u0027\u0027);"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":" /* Enter search and test URL before and after reload */"},{"lineNumber":10,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-textfield.search_box \u003e input:visible\u0027)"},{"lineNumber":11,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":12,"author":{"gitId":"-"},"content":" .type(\u0027eugene{enter}\u0027);"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":15,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027search\u003deugene\u0027);"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":18,"author":{"gitId":"-"},"content":""},{"lineNumber":19,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":20,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027search\u003deugene\u0027);"},{"lineNumber":21,"author":{"gitId":"-"},"content":" });"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":" it(\u0027group by: url params should persist after change and reload\u0027, () \u003d\u003e {"},{"lineNumber":24,"author":{"gitId":"-"},"content":" /* Check initial state */"},{"lineNumber":25,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.grouping \u003e select:visible\u0027)"},{"lineNumber":26,"author":{"gitId":"-"},"content":" .invoke(\u0027val\u0027)"},{"lineNumber":27,"author":{"gitId":"-"},"content":" .should(\u0027eq\u0027, \u0027groupByRepos\u0027);"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":30,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027groupSelect\u003dgroupByRepos\u0027);"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":" /* Select group by none and test URL before and after reload */"},{"lineNumber":33,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.grouping \u003e select:visible\u0027)"},{"lineNumber":34,"author":{"gitId":"-"},"content":" .select(\u0027groupByNone\u0027);"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":37,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027groupSelect\u003dgroupByNone\u0027);"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":42,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027groupSelect\u003dgroupByNone\u0027);"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":" /* Select group by authors and test URL before and after reload */"},{"lineNumber":45,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.grouping \u003e select:visible\u0027)"},{"lineNumber":46,"author":{"gitId":"-"},"content":" .select(\u0027groupByAuthors\u0027);"},{"lineNumber":47,"author":{"gitId":"-"},"content":""},{"lineNumber":48,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":49,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027groupSelect\u003dgroupByAuthors\u0027);"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":52,"author":{"gitId":"-"},"content":""},{"lineNumber":53,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":54,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027groupSelect\u003dgroupByAuthors\u0027);"},{"lineNumber":55,"author":{"gitId":"-"},"content":" });"},{"lineNumber":56,"author":{"gitId":"-"},"content":""},{"lineNumber":57,"author":{"gitId":"-"},"content":" it(\u0027sort groups by: url params should persist after change and reload\u0027, () \u003d\u003e {"},{"lineNumber":58,"author":{"gitId":"-"},"content":" /* Check initial state */"},{"lineNumber":59,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.sort-group \u003e select:visible\u0027)"},{"lineNumber":60,"author":{"gitId":"-"},"content":" .invoke(\u0027val\u0027)"},{"lineNumber":61,"author":{"gitId":"-"},"content":" .should(\u0027eq\u0027, \u0027groupTitle dsc\u0027);"},{"lineNumber":62,"author":{"gitId":"-"},"content":""},{"lineNumber":63,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":64,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sort\u003dgroupTitle%20dsc\u0027);"},{"lineNumber":65,"author":{"gitId":"-"},"content":""},{"lineNumber":66,"author":{"gitId":"-"},"content":" /* Select sort by group title ascending and test URL before and after reload */"},{"lineNumber":67,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.sort-group \u003e select:visible\u0027)"},{"lineNumber":68,"author":{"gitId":"-"},"content":" .select(\u0027groupTitle\u0027);"},{"lineNumber":69,"author":{"gitId":"-"},"content":""},{"lineNumber":70,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":71,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sort\u003dgroupTitle\u0027);"},{"lineNumber":72,"author":{"gitId":"-"},"content":""},{"lineNumber":73,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":74,"author":{"gitId":"-"},"content":""},{"lineNumber":75,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":76,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sort\u003dgroupTitle\u0027);"},{"lineNumber":77,"author":{"gitId":"-"},"content":""},{"lineNumber":78,"author":{"gitId":"-"},"content":" /* Select sort by contribution descending and test URL before and after reload */"},{"lineNumber":79,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.sort-group \u003e select:visible\u0027)"},{"lineNumber":80,"author":{"gitId":"-"},"content":" .select(\u0027totalCommits dsc\u0027);"},{"lineNumber":81,"author":{"gitId":"-"},"content":""},{"lineNumber":82,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":83,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sort\u003dtotalCommits%20dsc\u0027);"},{"lineNumber":84,"author":{"gitId":"-"},"content":""},{"lineNumber":85,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":86,"author":{"gitId":"-"},"content":""},{"lineNumber":87,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":88,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sort\u003dtotalCommits%20dsc\u0027);"},{"lineNumber":89,"author":{"gitId":"-"},"content":""},{"lineNumber":90,"author":{"gitId":"-"},"content":" /* Select sort by contribution ascending and test URL before and after reload */"},{"lineNumber":91,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.sort-group \u003e select:visible\u0027)"},{"lineNumber":92,"author":{"gitId":"-"},"content":" .select(\u0027totalCommits\u0027);"},{"lineNumber":93,"author":{"gitId":"-"},"content":""},{"lineNumber":94,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":95,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sort\u003dtotalCommits\u0027);"},{"lineNumber":96,"author":{"gitId":"-"},"content":""},{"lineNumber":97,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":98,"author":{"gitId":"-"},"content":""},{"lineNumber":99,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":100,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sort\u003dtotalCommits\u0027);"},{"lineNumber":101,"author":{"gitId":"-"},"content":""},{"lineNumber":102,"author":{"gitId":"-"},"content":" /* Select sort by variance descending and test URL before and after reload */"},{"lineNumber":103,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.sort-group \u003e select:visible\u0027)"},{"lineNumber":104,"author":{"gitId":"-"},"content":" .select(\u0027variance dsc\u0027);"},{"lineNumber":105,"author":{"gitId":"-"},"content":""},{"lineNumber":106,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":107,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sort\u003dvariance%20dsc\u0027);"},{"lineNumber":108,"author":{"gitId":"-"},"content":""},{"lineNumber":109,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":110,"author":{"gitId":"-"},"content":""},{"lineNumber":111,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":112,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sort\u003dvariance%20dsc\u0027);"},{"lineNumber":113,"author":{"gitId":"-"},"content":""},{"lineNumber":114,"author":{"gitId":"-"},"content":" /* Select sort by variance ascending and test URL before and after reload */"},{"lineNumber":115,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.sort-group \u003e select:visible\u0027)"},{"lineNumber":116,"author":{"gitId":"-"},"content":" .select(\u0027variance\u0027);"},{"lineNumber":117,"author":{"gitId":"-"},"content":""},{"lineNumber":118,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":119,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sort\u003dvariance\u0027);"},{"lineNumber":120,"author":{"gitId":"-"},"content":""},{"lineNumber":121,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":122,"author":{"gitId":"-"},"content":""},{"lineNumber":123,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":124,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sort\u003dvariance\u0027);"},{"lineNumber":125,"author":{"gitId":"-"},"content":" });"},{"lineNumber":126,"author":{"gitId":"-"},"content":""},{"lineNumber":127,"author":{"gitId":"-"},"content":" it(\u0027sort within groups by: url params should persist after change and reload\u0027, () \u003d\u003e {"},{"lineNumber":128,"author":{"gitId":"-"},"content":" /* Check initial state */"},{"lineNumber":129,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.sort-within-group \u003e select:visible\u0027)"},{"lineNumber":130,"author":{"gitId":"-"},"content":" .invoke(\u0027val\u0027)"},{"lineNumber":131,"author":{"gitId":"-"},"content":" .should(\u0027eq\u0027, \u0027title\u0027);"},{"lineNumber":132,"author":{"gitId":"-"},"content":""},{"lineNumber":133,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":134,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sortWithin\u003dtitle\u0027);"},{"lineNumber":135,"author":{"gitId":"-"},"content":""},{"lineNumber":136,"author":{"gitId":"-"},"content":" /* Select sort by group title ascending and test URL before and after reload */"},{"lineNumber":137,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.sort-within-group \u003e select:visible\u0027)"},{"lineNumber":138,"author":{"gitId":"-"},"content":" .select(\u0027title dsc\u0027);"},{"lineNumber":139,"author":{"gitId":"-"},"content":""},{"lineNumber":140,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":141,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sortWithin\u003dtitle\u0027);"},{"lineNumber":142,"author":{"gitId":"-"},"content":""},{"lineNumber":143,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":144,"author":{"gitId":"-"},"content":""},{"lineNumber":145,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":146,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sortWithin\u003dtitle\u0027);"},{"lineNumber":147,"author":{"gitId":"-"},"content":""},{"lineNumber":148,"author":{"gitId":"-"},"content":" /* Select sort by contribution descending and test URL before and after reload */"},{"lineNumber":149,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.sort-within-group \u003e select:visible\u0027)"},{"lineNumber":150,"author":{"gitId":"-"},"content":" .select(\u0027totalCommits dsc\u0027);"},{"lineNumber":151,"author":{"gitId":"-"},"content":""},{"lineNumber":152,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":153,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sortWithin\u003dtotalCommits%20dsc\u0027);"},{"lineNumber":154,"author":{"gitId":"-"},"content":""},{"lineNumber":155,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":156,"author":{"gitId":"-"},"content":""},{"lineNumber":157,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":158,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sortWithin\u003dtotalCommits%20dsc\u0027);"},{"lineNumber":159,"author":{"gitId":"-"},"content":""},{"lineNumber":160,"author":{"gitId":"-"},"content":" /* Select sort by contribution ascending and test URL before and after reload */"},{"lineNumber":161,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.sort-within-group \u003e select:visible\u0027)"},{"lineNumber":162,"author":{"gitId":"-"},"content":" .select(\u0027totalCommits\u0027);"},{"lineNumber":163,"author":{"gitId":"-"},"content":""},{"lineNumber":164,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":165,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sortWithin\u003dtotalCommits\u0027);"},{"lineNumber":166,"author":{"gitId":"-"},"content":""},{"lineNumber":167,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":168,"author":{"gitId":"-"},"content":""},{"lineNumber":169,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":170,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sortWithin\u003dtotalCommits\u0027);"},{"lineNumber":171,"author":{"gitId":"-"},"content":""},{"lineNumber":172,"author":{"gitId":"-"},"content":" /* Select sort by variance descending and test URL before and after reload */"},{"lineNumber":173,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.sort-within-group \u003e select:visible\u0027)"},{"lineNumber":174,"author":{"gitId":"-"},"content":" .select(\u0027variance dsc\u0027);"},{"lineNumber":175,"author":{"gitId":"-"},"content":""},{"lineNumber":176,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":177,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sortWithin\u003dvariance%20dsc\u0027);"},{"lineNumber":178,"author":{"gitId":"-"},"content":""},{"lineNumber":179,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":180,"author":{"gitId":"-"},"content":""},{"lineNumber":181,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":182,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sortWithin\u003dvariance%20dsc\u0027);"},{"lineNumber":183,"author":{"gitId":"-"},"content":""},{"lineNumber":184,"author":{"gitId":"-"},"content":" /* Select sort by variance ascending and test URL before and after reload */"},{"lineNumber":185,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.sort-within-group \u003e select:visible\u0027)"},{"lineNumber":186,"author":{"gitId":"-"},"content":" .select(\u0027variance\u0027);"},{"lineNumber":187,"author":{"gitId":"-"},"content":""},{"lineNumber":188,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":189,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sortWithin\u003dvariance\u0027);"},{"lineNumber":190,"author":{"gitId":"-"},"content":""},{"lineNumber":191,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":192,"author":{"gitId":"-"},"content":""},{"lineNumber":193,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":194,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sortWithin\u003dvariance\u0027);"},{"lineNumber":195,"author":{"gitId":"-"},"content":" });"},{"lineNumber":196,"author":{"gitId":"-"},"content":""},{"lineNumber":197,"author":{"gitId":"-"},"content":" it(\u0027granularity: url params should persist after change and reload\u0027, () \u003d\u003e {"},{"lineNumber":198,"author":{"gitId":"-"},"content":" /* Check initial state */"},{"lineNumber":199,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.granularity \u003e select:visible\u0027)"},{"lineNumber":200,"author":{"gitId":"-"},"content":" .invoke(\u0027val\u0027)"},{"lineNumber":201,"author":{"gitId":"-"},"content":" .should(\u0027eq\u0027, \u0027commit\u0027);"},{"lineNumber":202,"author":{"gitId":"-"},"content":""},{"lineNumber":203,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":204,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027timeframe\u003dcommit\u0027);"},{"lineNumber":205,"author":{"gitId":"-"},"content":""},{"lineNumber":206,"author":{"gitId":"-"},"content":" /* Select timeframe as day and test URL before and after reload */"},{"lineNumber":207,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.granularity \u003e select:visible\u0027)"},{"lineNumber":208,"author":{"gitId":"-"},"content":" .select(\u0027day\u0027);"},{"lineNumber":209,"author":{"gitId":"-"},"content":""},{"lineNumber":210,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":211,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027timeframe\u003dday\u0027);"},{"lineNumber":212,"author":{"gitId":"-"},"content":""},{"lineNumber":213,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":214,"author":{"gitId":"-"},"content":""},{"lineNumber":215,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":216,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027timeframe\u003dday\u0027);"},{"lineNumber":217,"author":{"gitId":"-"},"content":""},{"lineNumber":218,"author":{"gitId":"-"},"content":" /* Select timeframe as week and test URL before and after reload */"},{"lineNumber":219,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.granularity \u003e select:visible\u0027)"},{"lineNumber":220,"author":{"gitId":"-"},"content":" .select(\u0027week\u0027);"},{"lineNumber":221,"author":{"gitId":"-"},"content":""},{"lineNumber":222,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":223,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027timeframe\u003dweek\u0027);"},{"lineNumber":224,"author":{"gitId":"-"},"content":""},{"lineNumber":225,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":226,"author":{"gitId":"-"},"content":""},{"lineNumber":227,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":228,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027timeframe\u003dweek\u0027);"},{"lineNumber":229,"author":{"gitId":"-"},"content":" });"},{"lineNumber":230,"author":{"gitId":"-"},"content":""},{"lineNumber":231,"author":{"gitId":"-"},"content":" it(\u0027since: url params should persist after change and reload\u0027, () \u003d\u003e {"},{"lineNumber":232,"author":{"gitId":"-"},"content":" /* Check initial state */"},{"lineNumber":233,"author":{"gitId":"-"},"content":" cy.get(\u0027input[name\u003d\"since\"]:visible\u0027)"},{"lineNumber":234,"author":{"gitId":"-"},"content":" .invoke(\u0027val\u0027)"},{"lineNumber":235,"author":{"gitId":"-"},"content":" .should(\u0027eq\u0027, \u00272018-05-03\u0027);"},{"lineNumber":236,"author":{"gitId":"-"},"content":""},{"lineNumber":237,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":238,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027since\u003d2018-05-03\u0027);"},{"lineNumber":239,"author":{"gitId":"-"},"content":""},{"lineNumber":240,"author":{"gitId":"-"},"content":" /* Modify since date and test URL before and after reload */"},{"lineNumber":241,"author":{"gitId":"-"},"content":" cy.get(\u0027input[name\u003d\"since\"]:visible\u0027)"},{"lineNumber":242,"author":{"gitId":"-"},"content":" .type(\u00272019-06-04\u0027);"},{"lineNumber":243,"author":{"gitId":"-"},"content":""},{"lineNumber":244,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":245,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027since\u003d2019-06-04\u0027);"},{"lineNumber":246,"author":{"gitId":"-"},"content":""},{"lineNumber":247,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":248,"author":{"gitId":"-"},"content":""},{"lineNumber":249,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":250,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027since\u003d2019-06-04\u0027);"},{"lineNumber":251,"author":{"gitId":"-"},"content":" });"},{"lineNumber":252,"author":{"gitId":"-"},"content":""},{"lineNumber":253,"author":{"gitId":"-"},"content":" it(\u0027until: url params should persist after change and reload\u0027, () \u003d\u003e {"},{"lineNumber":254,"author":{"gitId":"-"},"content":" /* Check initial state (will require dayjs for getting current date) */"},{"lineNumber":255,"author":{"gitId":"-"},"content":" // cy.get(\u0027input[name\u003d\"until\"]:visible\u0027)"},{"lineNumber":256,"author":{"gitId":"-"},"content":" // .invoke(\u0027val\u0027)"},{"lineNumber":257,"author":{"gitId":"-"},"content":" // .should(\u0027eq\u0027, dayjs().format(\u0027YYYY-MM-DD\u0027));"},{"lineNumber":258,"author":{"gitId":"-"},"content":""},{"lineNumber":259,"author":{"gitId":"-"},"content":" // cy.url()"},{"lineNumber":260,"author":{"gitId":"-"},"content":" // .should(\u0027contain\u0027, \u0027date\u003d2023-07-06\u0027);"},{"lineNumber":261,"author":{"gitId":"-"},"content":""},{"lineNumber":262,"author":{"gitId":"-"},"content":" /* Modify since date and test URL before and after reload */"},{"lineNumber":263,"author":{"gitId":"-"},"content":" cy.get(\u0027input[name\u003d\"until\"]:visible\u0027)"},{"lineNumber":264,"author":{"gitId":"-"},"content":" .type(\u00272019-06-04\u0027);"},{"lineNumber":265,"author":{"gitId":"-"},"content":""},{"lineNumber":266,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":267,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027until\u003d2019-06-04\u0027);"},{"lineNumber":268,"author":{"gitId":"-"},"content":""},{"lineNumber":269,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":270,"author":{"gitId":"-"},"content":""},{"lineNumber":271,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":272,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027until\u003d2019-06-04\u0027);"},{"lineNumber":273,"author":{"gitId":"-"},"content":" });"},{"lineNumber":274,"author":{"gitId":"-"},"content":""},{"lineNumber":275,"author":{"gitId":"-"},"content":" it(\u0027breakdown by file type: url params should persist after change and reload\u0027, () \u003d\u003e {"},{"lineNumber":276,"author":{"gitId":"-"},"content":" cy.get(\u0027#summary label.filter-breakdown input:visible\u0027)"},{"lineNumber":277,"author":{"gitId":"-"},"content":" .should(\u0027not.be.checked\u0027);"},{"lineNumber":278,"author":{"gitId":"-"},"content":""},{"lineNumber":279,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":280,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027breakdown\u003dfalse\u0027);"},{"lineNumber":281,"author":{"gitId":"-"},"content":""},{"lineNumber":282,"author":{"gitId":"-"},"content":" cy.get(\u0027#summary label.filter-breakdown input:visible\u0027)"},{"lineNumber":283,"author":{"gitId":"-"},"content":" .check();"},{"lineNumber":284,"author":{"gitId":"-"},"content":""},{"lineNumber":285,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":286,"author":{"gitId":"-"},"content":""},{"lineNumber":287,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":288,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027breakdown\u003dtrue\u0027);"},{"lineNumber":289,"author":{"gitId":"-"},"content":" });"},{"lineNumber":290,"author":{"gitId":"-"},"content":""},{"lineNumber":291,"author":{"gitId":"-"},"content":" it(\u0027merge all groups: url params should persist after change and reload\u0027, () \u003d\u003e {"},{"lineNumber":292,"author":{"gitId":"-"},"content":" cy.get(\u0027#summary label.merge-group \u003e input:visible\u0027)"},{"lineNumber":293,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":294,"author":{"gitId":"-"},"content":" .check();"},{"lineNumber":295,"author":{"gitId":"-"},"content":""},{"lineNumber":296,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":297,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027mergegroup\u003dreposense%2FRepoSense%5Bcypress%5D\u0027);"},{"lineNumber":298,"author":{"gitId":"-"},"content":""},{"lineNumber":299,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":300,"author":{"gitId":"-"},"content":""},{"lineNumber":301,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":302,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027mergegroup\u003dreposense%2FRepoSense%5Bcypress%5D\u0027);"},{"lineNumber":303,"author":{"gitId":"-"},"content":" });"},{"lineNumber":304,"author":{"gitId":"-"},"content":""},{"lineNumber":305,"author":{"gitId":"-"},"content":" it(\u0027checked file types: url params should persist after change and reload\u0027, () \u003d\u003e {"},{"lineNumber":306,"author":{"gitId":"-"},"content":" cy.get(\u0027#summary label.filter-breakdown input:visible\u0027)"},{"lineNumber":307,"author":{"gitId":"-"},"content":" .should(\u0027not.be.checked\u0027);"},{"lineNumber":308,"author":{"gitId":"-"},"content":""},{"lineNumber":309,"author":{"gitId":"jonasongg"},"content":" // Assumption: gradle is the first file type and yml is the last file type to appear in the list"},{"lineNumber":310,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":311,"author":{"gitId":"-"},"content":" .should(\u0027not.contain\u0027, \u0027gradle\u0027);"},{"lineNumber":312,"author":{"gitId":"-"},"content":""},{"lineNumber":313,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":314,"author":{"gitId":"jonasongg"},"content":" .should(\u0027not.contain\u0027, \u0027yml\u0027);"},{"lineNumber":315,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":316,"author":{"gitId":"-"},"content":" cy.get(\u0027#summary label.filter-breakdown input:visible\u0027)"},{"lineNumber":317,"author":{"gitId":"-"},"content":" .check()"},{"lineNumber":318,"author":{"gitId":"-"},"content":" .should(\u0027be.checked\u0027);"},{"lineNumber":319,"author":{"gitId":"-"},"content":""},{"lineNumber":320,"author":{"gitId":"-"},"content":" cy.get(\u0027#summary div.fileTypes input[id\u003d\"gradle\"]\u0027)"},{"lineNumber":321,"author":{"gitId":"-"},"content":" .should(\u0027be.checked\u0027);"},{"lineNumber":322,"author":{"gitId":"-"},"content":""},{"lineNumber":323,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027#summary div.fileTypes input[id\u003d\"yml\"]\u0027)"},{"lineNumber":324,"author":{"gitId":"jonasongg"},"content":" .should(\u0027be.checked\u0027);"},{"lineNumber":325,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":326,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":327,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027gradle\u0027);"},{"lineNumber":328,"author":{"gitId":"-"},"content":""},{"lineNumber":329,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":330,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027yml\u0027);"},{"lineNumber":331,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":332,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":333,"author":{"gitId":"-"},"content":""},{"lineNumber":334,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027#summary div.fileTypes input[id\u003d\"gradle\"]\u0027)"},{"lineNumber":335,"author":{"gitId":"jonasongg"},"content":" .should(\u0027be.checked\u0027);"},{"lineNumber":336,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":337,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027#summary div.fileTypes input[id\u003d\"yml\"]\u0027)"},{"lineNumber":338,"author":{"gitId":"jonasongg"},"content":" .should(\u0027be.checked\u0027);"},{"lineNumber":339,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":340,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":341,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027gradle\u0027);"},{"lineNumber":342,"author":{"gitId":"-"},"content":""},{"lineNumber":343,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":344,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027yml\u0027);"},{"lineNumber":345,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":346,"author":{"gitId":"-"},"content":" cy.get(\u0027#summary div.fileTypes input[id\u003d\"gradle\"]\u0027)"},{"lineNumber":347,"author":{"gitId":"-"},"content":" .uncheck()"},{"lineNumber":348,"author":{"gitId":"-"},"content":" .should(\u0027not.be.checked\u0027);"},{"lineNumber":349,"author":{"gitId":"-"},"content":""},{"lineNumber":350,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":351,"author":{"gitId":"-"},"content":" .should(\u0027not.contain\u0027, \u0027gradle\u0027);"},{"lineNumber":352,"author":{"gitId":"-"},"content":""},{"lineNumber":353,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":354,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027yml\u0027);"},{"lineNumber":355,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":356,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":357,"author":{"gitId":"-"},"content":""},{"lineNumber":358,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027#summary div.fileTypes input[id\u003d\"gradle\"]\u0027)"},{"lineNumber":359,"author":{"gitId":"jonasongg"},"content":" .should(\u0027not.be.checked\u0027);"},{"lineNumber":360,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":361,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027#summary div.fileTypes input[id\u003d\"yml\"]\u0027)"},{"lineNumber":362,"author":{"gitId":"jonasongg"},"content":" .should(\u0027be.checked\u0027);"},{"lineNumber":363,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":364,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":365,"author":{"gitId":"-"},"content":" .should(\u0027not.contain\u0027, \u0027gradle\u0027);"},{"lineNumber":366,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":367,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":368,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027yml\u0027);"},{"lineNumber":369,"author":{"gitId":"jonasongg"},"content":" });"},{"lineNumber":370,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":371,"author":{"gitId":"jonasongg"},"content":" it(\u0027code panel: sort by: url params should persist after change and reload\u0027, () \u003d\u003e {"},{"lineNumber":372,"author":{"gitId":"jonasongg"},"content":" // open the code panel"},{"lineNumber":373,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027.icon-button.fa-code\u0027)"},{"lineNumber":374,"author":{"gitId":"jonasongg"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":375,"author":{"gitId":"jonasongg"},"content":" .first()"},{"lineNumber":376,"author":{"gitId":"jonasongg"},"content":" .click();"},{"lineNumber":377,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":378,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027div.mui-select.sort-by \u003e select:visible\u0027)"},{"lineNumber":379,"author":{"gitId":"jonasongg"},"content":" .invoke(\u0027val\u0027)"},{"lineNumber":380,"author":{"gitId":"jonasongg"},"content":" .should(\u0027eq\u0027, \u0027linesOfCode\u0027);"},{"lineNumber":381,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":382,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":383,"author":{"gitId":"jonasongg"},"content":" .should(\u0027not.contain\u0027, \u0027authorshipSortBy\u0027);"},{"lineNumber":384,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":385,"author":{"gitId":"jonasongg"},"content":" /* Select file name and test URL before and after reload */"},{"lineNumber":386,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027div.mui-select.sort-by \u003e select:visible\u0027)"},{"lineNumber":387,"author":{"gitId":"jonasongg"},"content":" .select(\u0027fileName\u0027);"},{"lineNumber":388,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":389,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":390,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027authorshipSortBy\u003dfileName\u0027);"},{"lineNumber":391,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":392,"author":{"gitId":"jonasongg"},"content":" cy.reload();"},{"lineNumber":393,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":394,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":395,"author":{"gitId":"jonasongg"},"content":" .should(\u0027not.contain\u0027, \u0027%23%2F\u0027);"},{"lineNumber":396,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":397,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":398,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027authorshipSortBy\u003dfileName\u0027);"},{"lineNumber":399,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":400,"author":{"gitId":"jonasongg"},"content":" /* Select file type and test URL before and after reload */"},{"lineNumber":401,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027div.mui-select.sort-by \u003e select:visible\u0027)"},{"lineNumber":402,"author":{"gitId":"jonasongg"},"content":" .select(\u0027fileType\u0027);"},{"lineNumber":403,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":404,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":405,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027authorshipSortBy\u003dfileType\u0027);"},{"lineNumber":406,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":407,"author":{"gitId":"jonasongg"},"content":" cy.reload();"},{"lineNumber":408,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":409,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":410,"author":{"gitId":"jonasongg"},"content":" .should(\u0027not.contain\u0027, \u0027%23%2F\u0027);"},{"lineNumber":411,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":412,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":413,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027authorshipSortBy\u003dfileType\u0027);"},{"lineNumber":414,"author":{"gitId":"jonasongg"},"content":" });"},{"lineNumber":415,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":416,"author":{"gitId":"jonasongg"},"content":" it(\u0027code panel: order: url params should persist after change and reload\u0027, () \u003d\u003e {"},{"lineNumber":417,"author":{"gitId":"jonasongg"},"content":" // open the code panel"},{"lineNumber":418,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027.icon-button.fa-code\u0027)"},{"lineNumber":419,"author":{"gitId":"jonasongg"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":420,"author":{"gitId":"jonasongg"},"content":" .first()"},{"lineNumber":421,"author":{"gitId":"jonasongg"},"content":" .click();"},{"lineNumber":422,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":423,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027div.mui-select.sort-order \u003e select:visible\u0027)"},{"lineNumber":424,"author":{"gitId":"jonasongg"},"content":" .invoke(\u0027val\u0027)"},{"lineNumber":425,"author":{"gitId":"jonasongg"},"content":" .should(\u0027eq\u0027, \u0027true\u0027); // true is Descending"},{"lineNumber":426,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":427,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":428,"author":{"gitId":"jonasongg"},"content":" .should(\u0027not.contain\u0027, \u0027reverseAuthorshipOrder\u0027);"},{"lineNumber":429,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":430,"author":{"gitId":"jonasongg"},"content":" /* Select ascending and test URL before and after reload */"},{"lineNumber":431,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027div.mui-select.sort-order \u003e select:visible\u0027)"},{"lineNumber":432,"author":{"gitId":"jonasongg"},"content":" .select(\u0027false\u0027);"},{"lineNumber":433,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":434,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":435,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027reverseAuthorshipOrder\u003dfalse\u0027);"},{"lineNumber":436,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":437,"author":{"gitId":"jonasongg"},"content":" cy.reload();"},{"lineNumber":438,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":439,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":440,"author":{"gitId":"jonasongg"},"content":" .should(\u0027not.contain\u0027, \u0027%23%2F\u0027);"},{"lineNumber":441,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":442,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":443,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027reverseAuthorshipOrder\u003dfalse\u0027);"},{"lineNumber":444,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":445,"author":{"gitId":"jonasongg"},"content":" /* Select descending and test URL before and after reload */"},{"lineNumber":446,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":447,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027div.mui-select.sort-order \u003e select:visible\u0027)"},{"lineNumber":448,"author":{"gitId":"jonasongg"},"content":" .select(\u0027true\u0027);"},{"lineNumber":449,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":450,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":451,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027reverseAuthorshipOrder\u003dtrue\u0027);"},{"lineNumber":452,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":453,"author":{"gitId":"jonasongg"},"content":" cy.reload();"},{"lineNumber":454,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":455,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":456,"author":{"gitId":"jonasongg"},"content":" .should(\u0027not.contain\u0027, \u0027%23%2F\u0027);"},{"lineNumber":457,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":458,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":459,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027reverseAuthorshipOrder\u003dtrue\u0027);"},{"lineNumber":460,"author":{"gitId":"jonasongg"},"content":" });"},{"lineNumber":461,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":462,"author":{"gitId":"jonasongg"},"content":" it(\u0027code panel: filter by glob: url params should persist after change and reload\u0027, () \u003d\u003e {"},{"lineNumber":463,"author":{"gitId":"jonasongg"},"content":" // open the code panel"},{"lineNumber":464,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027.icon-button.fa-code\u0027)"},{"lineNumber":465,"author":{"gitId":"jonasongg"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":466,"author":{"gitId":"jonasongg"},"content":" .first()"},{"lineNumber":467,"author":{"gitId":"jonasongg"},"content":" .click();"},{"lineNumber":468,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":469,"author":{"gitId":"jonasongg"},"content":" // click on filter glob radio button"},{"lineNumber":470,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027.radio-button--search\u0027)"},{"lineNumber":471,"author":{"gitId":"jonasongg"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":472,"author":{"gitId":"jonasongg"},"content":" .click();"},{"lineNumber":473,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":474,"author":{"gitId":"jonasongg"},"content":" // enter some input"},{"lineNumber":475,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027#search\u0027)"},{"lineNumber":476,"author":{"gitId":"jonasongg"},"content":" .type(\u0027README.md\u0027);"},{"lineNumber":477,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":478,"author":{"gitId":"jonasongg"},"content":" // submit"},{"lineNumber":479,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027#search\u0027)"},{"lineNumber":480,"author":{"gitId":"jonasongg"},"content":" .type(\u0027{enter}\u0027);"},{"lineNumber":481,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":482,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":483,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027authorshipFilesGlob\u003dREADME.md\u0027);"},{"lineNumber":484,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":485,"author":{"gitId":"jonasongg"},"content":" // Some bugs appear after two reloads, so reload twice here"},{"lineNumber":486,"author":{"gitId":"jonasongg"},"content":" cy.reload();"},{"lineNumber":487,"author":{"gitId":"jonasongg"},"content":" cy.reload();"},{"lineNumber":488,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":489,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":490,"author":{"gitId":"jonasongg"},"content":" .should(\u0027not.contain\u0027, \u0027%23%2F\u0027);"},{"lineNumber":491,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":492,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":493,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027authorshipFilesGlob\u003dREADME.md\u0027);"},{"lineNumber":494,"author":{"gitId":"-"},"content":" });"},{"lineNumber":495,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"-":339,"jonasongg":156}},{"path":"src/main/java/reposense/RepoSense.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.time.ZonedDateTime;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.time.format.DateTimeFormatter;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.logging.Level;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.helper.HelpScreenException;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import reposense.git.GitConfig;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import reposense.model.CliArguments;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import reposense.model.RepoConfiguration;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import reposense.model.ReportConfiguration;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import reposense.model.RunConfigurationDecider;"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import reposense.parser.ArgsParser;"},{"lineNumber":18,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidCsvException;"},{"lineNumber":19,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidHeaderException;"},{"lineNumber":20,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.ParseException;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import reposense.report.ReportGenerator;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import reposense.system.LogsManager;"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import reposense.system.ReportServer;"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import reposense.util.FileUtil;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import reposense.util.TimeUtil;"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * The main RepoSense class."},{"lineNumber":29,"author":{"gitId":"-"},"content":" */"},{"lineNumber":30,"author":{"gitId":"-"},"content":"public class RepoSense {"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsManager.getLogger(RepoSense.class);"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final int SERVER_PORT_NUMBER \u003d 9000;"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final DateTimeFormatter formatter \u003d DateTimeFormatter.ofPattern(\"E MMM d HH:mm:ss yyyy z\");"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final String VERSION_UNSPECIFIED \u003d \"unspecified\";"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * The entry point of the program."},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Additional flags are provided by the user in {@code args}."},{"lineNumber":39,"author":{"gitId":"-"},"content":" */"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public static void main(String[] args) {"},{"lineNumber":41,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":42,"author":{"gitId":"-"},"content":" TimeUtil.startTimer();"},{"lineNumber":43,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(args);"},{"lineNumber":44,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e configs \u003d null;"},{"lineNumber":45,"author":{"gitId":"-"},"content":" ReportConfiguration reportConfig \u003d new ReportConfiguration();"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":" if (cliArguments.isViewModeOnly()) {"},{"lineNumber":48,"author":{"gitId":"-"},"content":" ReportServer.startServer(SERVER_PORT_NUMBER, cliArguments.getReportDirectoryPath().toAbsolutePath());"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }"},{"lineNumber":51,"author":{"gitId":"-"},"content":""},{"lineNumber":52,"author":{"gitId":"-"},"content":" configs \u003d RunConfigurationDecider.getRunConfiguration(cliArguments).getRepoConfigurations();"},{"lineNumber":53,"author":{"gitId":"-"},"content":" reportConfig \u003d cliArguments.getReportConfiguration();"},{"lineNumber":54,"author":{"gitId":"-"},"content":""},{"lineNumber":55,"author":{"gitId":"-"},"content":" RepoConfiguration.setFormatsToRepoConfigs(configs, cliArguments.getFormats());"},{"lineNumber":56,"author":{"gitId":"-"},"content":" RepoConfiguration.setDatesToRepoConfigs(configs, cliArguments.getSinceDate(), cliArguments.getUntilDate());"},{"lineNumber":57,"author":{"gitId":"-"},"content":" RepoConfiguration.setZoneIdToRepoConfigs(configs, cliArguments.getZoneId());"},{"lineNumber":58,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(configs,"},{"lineNumber":59,"author":{"gitId":"-"},"content":" cliArguments.isStandaloneConfigIgnored());"},{"lineNumber":60,"author":{"gitId":"-"},"content":" RepoConfiguration.setFileSizeLimitIgnoredToRepoConfigs(configs,"},{"lineNumber":61,"author":{"gitId":"-"},"content":" cliArguments.isFileSizeLimitIgnored());"},{"lineNumber":62,"author":{"gitId":"-"},"content":" RepoConfiguration.setIsLastModifiedDateIncludedToRepoConfigs(configs,"},{"lineNumber":63,"author":{"gitId":"-"},"content":" cliArguments.isLastModifiedDateIncluded());"},{"lineNumber":64,"author":{"gitId":"-"},"content":" RepoConfiguration.setIsShallowCloningPerformedToRepoConfigs(configs,"},{"lineNumber":65,"author":{"gitId":"-"},"content":" cliArguments.isShallowCloningPerformed());"},{"lineNumber":66,"author":{"gitId":"-"},"content":" RepoConfiguration.setIsFindingPreviousAuthorsPerformedToRepoConfigs(configs,"},{"lineNumber":67,"author":{"gitId":"-"},"content":" cliArguments.isFindingPreviousAuthorsPerformed());"},{"lineNumber":68,"author":{"gitId":"-"},"content":""},{"lineNumber":69,"author":{"gitId":"-"},"content":" List\u003cString[]\u003e globalGitConfig \u003d GitConfig.getGlobalGitLfsConfig();"},{"lineNumber":70,"author":{"gitId":"-"},"content":" if (globalGitConfig.size() !\u003d 0) {"},{"lineNumber":71,"author":{"gitId":"-"},"content":" GitConfig.setGlobalGitLfsConfig(GitConfig.SKIP_SMUDGE_CONFIG_SETTINGS);"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }"},{"lineNumber":73,"author":{"gitId":"-"},"content":""},{"lineNumber":74,"author":{"gitId":"-"},"content":" ReportGenerator reportGenerator \u003d new ReportGenerator();"},{"lineNumber":75,"author":{"gitId":"-"},"content":" List\u003cPath\u003e reportFoldersAndFiles \u003d reportGenerator.generateReposReport(configs,"},{"lineNumber":76,"author":{"gitId":"-"},"content":" cliArguments.getOutputFilePath().toAbsolutePath().toString(),"},{"lineNumber":77,"author":{"gitId":"-"},"content":" cliArguments.getAssetsFilePath().toAbsolutePath().toString(), reportConfig,"},{"lineNumber":78,"author":{"gitId":"-"},"content":" formatter.format(ZonedDateTime.now(cliArguments.getZoneId())),"},{"lineNumber":79,"author":{"gitId":"-"},"content":" cliArguments.getSinceDate(), cliArguments.getUntilDate(),"},{"lineNumber":80,"author":{"gitId":"-"},"content":" cliArguments.isSinceDateProvided(), cliArguments.isUntilDateProvided(),"},{"lineNumber":81,"author":{"gitId":"-"},"content":" cliArguments.getNumCloningThreads(), cliArguments.getNumAnalysisThreads(),"},{"lineNumber":82,"author":{"gitId":"-"},"content":" TimeUtil::getElapsedTime, cliArguments.getZoneId(), cliArguments.isFreshClonePerformed());"},{"lineNumber":83,"author":{"gitId":"-"},"content":""},{"lineNumber":84,"author":{"gitId":"-"},"content":" FileUtil.zipFoldersAndFiles(reportFoldersAndFiles, cliArguments.getOutputFilePath().toAbsolutePath(),"},{"lineNumber":85,"author":{"gitId":"-"},"content":" \".json\");"},{"lineNumber":86,"author":{"gitId":"-"},"content":""},{"lineNumber":87,"author":{"gitId":"-"},"content":" // Set back to user\u0027s initial global git lfs config"},{"lineNumber":88,"author":{"gitId":"-"},"content":" GitConfig.setGlobalGitLfsConfig(globalGitConfig);"},{"lineNumber":89,"author":{"gitId":"-"},"content":""},{"lineNumber":90,"author":{"gitId":"-"},"content":" logger.info(TimeUtil.getElapsedTimeMessage());"},{"lineNumber":91,"author":{"gitId":"-"},"content":""},{"lineNumber":92,"author":{"gitId":"-"},"content":" if (cliArguments.isAutomaticallyLaunching()) {"},{"lineNumber":93,"author":{"gitId":"-"},"content":" ReportServer.startServer(SERVER_PORT_NUMBER, cliArguments.getOutputFilePath().toAbsolutePath());"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }"},{"lineNumber":95,"author":{"gitId":"-"},"content":" } catch (IOException | ParseException | InvalidCsvException | InvalidHeaderException e) {"},{"lineNumber":96,"author":{"gitId":"-"},"content":" logger.log(Level.WARNING, e.getMessage(), e);"},{"lineNumber":97,"author":{"gitId":"-"},"content":" } catch (HelpScreenException e) {"},{"lineNumber":98,"author":{"gitId":"-"},"content":" // help message was printed by the ArgumentParser; it is safe to exit."},{"lineNumber":99,"author":{"gitId":"-"},"content":" }"},{"lineNumber":100,"author":{"gitId":"-"},"content":""},{"lineNumber":101,"author":{"gitId":"-"},"content":" LogsManager.moveLogFileToOutputFolder();"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }"},{"lineNumber":103,"author":{"gitId":"-"},"content":""},{"lineNumber":104,"author":{"gitId":"-"},"content":" public static String getVersion() {"},{"lineNumber":105,"author":{"gitId":"-"},"content":" String version \u003d RepoSense.class.getPackage().getImplementationVersion();"},{"lineNumber":106,"author":{"gitId":"-"},"content":""},{"lineNumber":107,"author":{"gitId":"-"},"content":" if (version \u003d\u003d null || version.equals(VERSION_UNSPECIFIED)) {"},{"lineNumber":108,"author":{"gitId":"-"},"content":" version \u003d System.getProperty(\"version\");"},{"lineNumber":109,"author":{"gitId":"-"},"content":" }"},{"lineNumber":110,"author":{"gitId":"-"},"content":""},{"lineNumber":111,"author":{"gitId":"-"},"content":" return version;"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }"},{"lineNumber":113,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":3,"-":110}},{"path":"src/main/java/reposense/model/Author.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.model;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.FileSystems;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.PathMatcher;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.ArrayList;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":8,"author":{"gitId":"asdfghjkxd"},"content":"import java.util.regex.Pattern;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Represents a Git Author."},{"lineNumber":12,"author":{"gitId":"-"},"content":" */"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class Author {"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public static final String NAME_NO_AUTHOR_WITH_COMMITS_FOUND \u003d"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \"NO AUTHOR WITH COMMITS FOUND WITHIN THIS PERIOD OF TIME\";"},{"lineNumber":16,"author":{"gitId":"-"},"content":" private static final String UNKNOWN_AUTHOR_GIT_ID \u003d \"-\";"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":" private static final String STANDARD_GITHUB_EMAIL_DOMAIN \u003d \"@users.noreply.github.com\";"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private static final String STANDARD_GITLAB_EMAIL_DOMAIN \u003d \"@users.noreply.gitlab.com\";"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final String MESSAGE_UNCOMMON_EMAIL_PATTERN \u003d \"The provided email, %s, uses uncommon pattern.\";"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final String MESSAGE_UNCOMMON_GLOB_PATTERN \u003d \"The provided ignore glob, %s, uses uncommon pattern.\";"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final String COMMON_EMAIL_REGEX \u003d"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \"^([a-zA-Z0-9_\\\\-\\\\.\\\\+]+)@([a-zA-Z0-9_\\\\-\\\\.]+)\\\\.([a-zA-Z]{2,5})$\";"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String COMMON_GLOB_REGEX \u003d \"^[-a-zA-Z0-9 _/\\\\\\\\*!{}\\\\[\\\\]!(),:.]*$\";"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"-"},"content":" public static final Author UNKNOWN_AUTHOR \u003d new Author(UNKNOWN_AUTHOR_GIT_ID);"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" private final String gitId;"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":" private transient List\u003cString\u003e emails;"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private transient String displayName;"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private transient List\u003cString\u003e authorAliases;"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private transient List\u003cString\u003e ignoreGlobList;"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private transient PathMatcher ignoreGlobMatcher;"},{"lineNumber":36,"author":{"gitId":"-"},"content":""},{"lineNumber":37,"author":{"gitId":"-"},"content":" public Author(String gitId) {"},{"lineNumber":38,"author":{"gitId":"-"},"content":" this.gitId \u003d gitId;"},{"lineNumber":39,"author":{"gitId":"-"},"content":" this.emails \u003d new ArrayList\u003c\u003e();"},{"lineNumber":40,"author":{"gitId":"-"},"content":" this.displayName \u003d gitId;"},{"lineNumber":41,"author":{"gitId":"-"},"content":" this.authorAliases \u003d new ArrayList\u003c\u003e();"},{"lineNumber":42,"author":{"gitId":"-"},"content":" this.ignoreGlobList \u003d new ArrayList\u003c\u003e();"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":" addStandardGitHostEmails(this.emails);"},{"lineNumber":45,"author":{"gitId":"-"},"content":" updateIgnoreGlobMatcher();"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }"},{"lineNumber":47,"author":{"gitId":"-"},"content":""},{"lineNumber":48,"author":{"gitId":"-"},"content":" public Author(StandaloneAuthor sa) {"},{"lineNumber":49,"author":{"gitId":"-"},"content":" String gitId \u003d sa.getGitId();"},{"lineNumber":50,"author":{"gitId":"-"},"content":" List\u003cString\u003e emails \u003d new ArrayList\u003c\u003e(sa.getEmails());"},{"lineNumber":51,"author":{"gitId":"-"},"content":" String displayName \u003d !sa.getDisplayName().isEmpty() ? sa.getDisplayName() : sa.getGitId();"},{"lineNumber":52,"author":{"gitId":"-"},"content":" List\u003cString\u003e authorAliases \u003d sa.getAuthorNames();"},{"lineNumber":53,"author":{"gitId":"-"},"content":" List\u003cString\u003e ignoreGlobList \u003d sa.getIgnoreGlobList();"},{"lineNumber":54,"author":{"gitId":"-"},"content":""},{"lineNumber":55,"author":{"gitId":"-"},"content":" this.gitId \u003d gitId;"},{"lineNumber":56,"author":{"gitId":"-"},"content":" this.displayName \u003d displayName;"},{"lineNumber":57,"author":{"gitId":"-"},"content":" this.authorAliases \u003d authorAliases;"},{"lineNumber":58,"author":{"gitId":"-"},"content":""},{"lineNumber":59,"author":{"gitId":"-"},"content":" setEmails(emails);"},{"lineNumber":60,"author":{"gitId":"-"},"content":" setIgnoreGlobList(ignoreGlobList);"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }"},{"lineNumber":62,"author":{"gitId":"-"},"content":""},{"lineNumber":63,"author":{"gitId":"-"},"content":" public Author(Author another) {"},{"lineNumber":64,"author":{"gitId":"-"},"content":" this.gitId \u003d another.gitId;"},{"lineNumber":65,"author":{"gitId":"-"},"content":" this.emails \u003d another.emails;"},{"lineNumber":66,"author":{"gitId":"-"},"content":" this.displayName \u003d another.gitId;"},{"lineNumber":67,"author":{"gitId":"-"},"content":" this.authorAliases \u003d another.authorAliases;"},{"lineNumber":68,"author":{"gitId":"-"},"content":" this.ignoreGlobList \u003d another.ignoreGlobList;"},{"lineNumber":69,"author":{"gitId":"-"},"content":" this.ignoreGlobMatcher \u003d another.ignoreGlobMatcher;"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }"},{"lineNumber":71,"author":{"gitId":"-"},"content":""},{"lineNumber":72,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * Checks that all the strings in the {@code emails} only contains commonly used email patterns."},{"lineNumber":74,"author":{"gitId":"-"},"content":" *"},{"lineNumber":75,"author":{"gitId":"-"},"content":" * @throws IllegalArgumentException if any of the values do not meet the criteria."},{"lineNumber":76,"author":{"gitId":"-"},"content":" */"},{"lineNumber":77,"author":{"gitId":"-"},"content":" private static void validateEmails(List\u003cString\u003e emails) throws IllegalArgumentException {"},{"lineNumber":78,"author":{"gitId":"asdfghjkxd"},"content":" Pattern emailPattern \u003d Pattern.compile(COMMON_EMAIL_REGEX);"},{"lineNumber":79,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":80,"author":{"gitId":"-"},"content":" for (String email : emails) {"},{"lineNumber":81,"author":{"gitId":"asdfghjkxd"},"content":" if (!emailPattern.matcher(email).matches()) {"},{"lineNumber":82,"author":{"gitId":"-"},"content":" throw new IllegalArgumentException(String.format(MESSAGE_UNCOMMON_EMAIL_PATTERN, email));"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }"},{"lineNumber":86,"author":{"gitId":"-"},"content":""},{"lineNumber":87,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":88,"author":{"gitId":"-"},"content":" * Checks that all the strings in the {@code ignoreGlobList} only contains commonly used glob patterns."},{"lineNumber":89,"author":{"gitId":"-"},"content":" *"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * @throws IllegalArgumentException if any of the values do not meet the criteria."},{"lineNumber":91,"author":{"gitId":"-"},"content":" */"},{"lineNumber":92,"author":{"gitId":"-"},"content":" private static void validateIgnoreGlobs(List\u003cString\u003e ignoreGlobList) throws IllegalArgumentException {"},{"lineNumber":93,"author":{"gitId":"asdfghjkxd"},"content":" Pattern globPattern \u003d Pattern.compile(COMMON_GLOB_REGEX);"},{"lineNumber":94,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":95,"author":{"gitId":"-"},"content":" for (String glob : ignoreGlobList) {"},{"lineNumber":96,"author":{"gitId":"asdfghjkxd"},"content":" if (!globPattern.matcher(glob).matches()) {"},{"lineNumber":97,"author":{"gitId":"-"},"content":" throw new IllegalArgumentException(String.format(MESSAGE_UNCOMMON_GLOB_PATTERN, glob));"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }"},{"lineNumber":101,"author":{"gitId":"-"},"content":""},{"lineNumber":102,"author":{"gitId":"-"},"content":" public String getGitId() {"},{"lineNumber":103,"author":{"gitId":"-"},"content":" return gitId;"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }"},{"lineNumber":105,"author":{"gitId":"-"},"content":""},{"lineNumber":106,"author":{"gitId":"-"},"content":" public List\u003cString\u003e getEmails() {"},{"lineNumber":107,"author":{"gitId":"-"},"content":" return emails;"},{"lineNumber":108,"author":{"gitId":"-"},"content":" }"},{"lineNumber":109,"author":{"gitId":"-"},"content":""},{"lineNumber":110,"author":{"gitId":"-"},"content":" public void setEmails(List\u003cString\u003e emails) {"},{"lineNumber":111,"author":{"gitId":"-"},"content":" validateEmails(emails);"},{"lineNumber":112,"author":{"gitId":"-"},"content":" this.emails \u003d new ArrayList\u003c\u003e(emails);"},{"lineNumber":113,"author":{"gitId":"-"},"content":" addStandardGitHostEmails(this.emails);"},{"lineNumber":114,"author":{"gitId":"-"},"content":" }"},{"lineNumber":115,"author":{"gitId":"-"},"content":""},{"lineNumber":116,"author":{"gitId":"-"},"content":" public String getDisplayName() {"},{"lineNumber":117,"author":{"gitId":"-"},"content":" return displayName;"},{"lineNumber":118,"author":{"gitId":"-"},"content":" }"},{"lineNumber":119,"author":{"gitId":"-"},"content":""},{"lineNumber":120,"author":{"gitId":"-"},"content":" public void setDisplayName(String displayName) {"},{"lineNumber":121,"author":{"gitId":"-"},"content":" this.displayName \u003d displayName;"},{"lineNumber":122,"author":{"gitId":"-"},"content":" }"},{"lineNumber":123,"author":{"gitId":"-"},"content":""},{"lineNumber":124,"author":{"gitId":"-"},"content":" public List\u003cString\u003e getAuthorAliases() {"},{"lineNumber":125,"author":{"gitId":"-"},"content":" return authorAliases;"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }"},{"lineNumber":127,"author":{"gitId":"-"},"content":""},{"lineNumber":128,"author":{"gitId":"-"},"content":" public void setAuthorAliases(List\u003cString\u003e authorAliases) {"},{"lineNumber":129,"author":{"gitId":"-"},"content":" this.authorAliases \u003d authorAliases;"},{"lineNumber":130,"author":{"gitId":"-"},"content":" }"},{"lineNumber":131,"author":{"gitId":"-"},"content":""},{"lineNumber":132,"author":{"gitId":"-"},"content":" public List\u003cString\u003e getIgnoreGlobList() {"},{"lineNumber":133,"author":{"gitId":"-"},"content":" return ignoreGlobList;"},{"lineNumber":134,"author":{"gitId":"-"},"content":" }"},{"lineNumber":135,"author":{"gitId":"-"},"content":""},{"lineNumber":136,"author":{"gitId":"-"},"content":" public void setIgnoreGlobList(List\u003cString\u003e ignoreGlobList) {"},{"lineNumber":137,"author":{"gitId":"-"},"content":" validateIgnoreGlobs(ignoreGlobList);"},{"lineNumber":138,"author":{"gitId":"-"},"content":" this.ignoreGlobList \u003d new ArrayList\u003c\u003e(ignoreGlobList);"},{"lineNumber":139,"author":{"gitId":"-"},"content":" updateIgnoreGlobMatcher();"},{"lineNumber":140,"author":{"gitId":"-"},"content":" }"},{"lineNumber":141,"author":{"gitId":"-"},"content":""},{"lineNumber":142,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":143,"author":{"gitId":"-"},"content":" * Validates and adds {@code ignoreGlobList} into the {@link Author} class instance variable without duplicates"},{"lineNumber":144,"author":{"gitId":"-"},"content":" * and updates the ignore glob matcher."},{"lineNumber":145,"author":{"gitId":"-"},"content":" */"},{"lineNumber":146,"author":{"gitId":"-"},"content":" public void importIgnoreGlobList(List\u003cString\u003e ignoreGlobList) {"},{"lineNumber":147,"author":{"gitId":"-"},"content":" validateIgnoreGlobs(ignoreGlobList);"},{"lineNumber":148,"author":{"gitId":"-"},"content":" ignoreGlobList.forEach(ignoreGlob -\u003e {"},{"lineNumber":149,"author":{"gitId":"-"},"content":" if (!this.ignoreGlobList.contains(ignoreGlob)) {"},{"lineNumber":150,"author":{"gitId":"-"},"content":" this.ignoreGlobList.add(ignoreGlob);"},{"lineNumber":151,"author":{"gitId":"-"},"content":" }"},{"lineNumber":152,"author":{"gitId":"-"},"content":" });"},{"lineNumber":153,"author":{"gitId":"-"},"content":" updateIgnoreGlobMatcher();"},{"lineNumber":154,"author":{"gitId":"-"},"content":" }"},{"lineNumber":155,"author":{"gitId":"-"},"content":""},{"lineNumber":156,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":157,"author":{"gitId":"-"},"content":" * Returns true if this author is ignoring the {@code filePath} based on its ignore glob matcher."},{"lineNumber":158,"author":{"gitId":"-"},"content":" */"},{"lineNumber":159,"author":{"gitId":"-"},"content":" public boolean isIgnoringFile(Path filePath) {"},{"lineNumber":160,"author":{"gitId":"-"},"content":" return ignoreGlobMatcher.matches(filePath);"},{"lineNumber":161,"author":{"gitId":"-"},"content":" }"},{"lineNumber":162,"author":{"gitId":"-"},"content":""},{"lineNumber":163,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":164,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {"},{"lineNumber":165,"author":{"gitId":"-"},"content":" // short circuit if same object"},{"lineNumber":166,"author":{"gitId":"-"},"content":" if (this \u003d\u003d other) {"},{"lineNumber":167,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":168,"author":{"gitId":"-"},"content":" }"},{"lineNumber":169,"author":{"gitId":"-"},"content":""},{"lineNumber":170,"author":{"gitId":"-"},"content":" // instanceof handles null"},{"lineNumber":171,"author":{"gitId":"-"},"content":" if (!(other instanceof Author)) {"},{"lineNumber":172,"author":{"gitId":"-"},"content":" return false;"},{"lineNumber":173,"author":{"gitId":"-"},"content":" }"},{"lineNumber":174,"author":{"gitId":"-"},"content":""},{"lineNumber":175,"author":{"gitId":"-"},"content":" Author otherAuthor \u003d (Author) other;"},{"lineNumber":176,"author":{"gitId":"-"},"content":" return this.gitId.equalsIgnoreCase(otherAuthor.gitId);"},{"lineNumber":177,"author":{"gitId":"-"},"content":" }"},{"lineNumber":178,"author":{"gitId":"-"},"content":""},{"lineNumber":179,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":180,"author":{"gitId":"-"},"content":" public int hashCode() {"},{"lineNumber":181,"author":{"gitId":"-"},"content":" return gitId !\u003d null ? gitId.toLowerCase().hashCode() : 0;"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }"},{"lineNumber":183,"author":{"gitId":"-"},"content":""},{"lineNumber":184,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":185,"author":{"gitId":"-"},"content":" public String toString() {"},{"lineNumber":186,"author":{"gitId":"-"},"content":" return gitId;"},{"lineNumber":187,"author":{"gitId":"-"},"content":" }"},{"lineNumber":188,"author":{"gitId":"-"},"content":""},{"lineNumber":189,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":190,"author":{"gitId":"-"},"content":" * Updates the {@link PathMatcher} to the new ignore glob list set."},{"lineNumber":191,"author":{"gitId":"-"},"content":" * Called after a new ignore glob list is set."},{"lineNumber":192,"author":{"gitId":"-"},"content":" */"},{"lineNumber":193,"author":{"gitId":"-"},"content":" private void updateIgnoreGlobMatcher() {"},{"lineNumber":194,"author":{"gitId":"-"},"content":" String globString \u003d \"glob:{\" + String.join(\",\", ignoreGlobList) + \"}\";"},{"lineNumber":195,"author":{"gitId":"-"},"content":" ignoreGlobMatcher \u003d FileSystems.getDefault().getPathMatcher(globString);"},{"lineNumber":196,"author":{"gitId":"-"},"content":" }"},{"lineNumber":197,"author":{"gitId":"-"},"content":""},{"lineNumber":198,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":199,"author":{"gitId":"-"},"content":" * Adds the standard github and gitlab emails to {@code emails} if not present."},{"lineNumber":200,"author":{"gitId":"-"},"content":" */"},{"lineNumber":201,"author":{"gitId":"-"},"content":" private void addStandardGitHostEmails(List\u003cString\u003e emails) {"},{"lineNumber":202,"author":{"gitId":"-"},"content":" String standardGitHubEmail \u003d getGitId() + STANDARD_GITHUB_EMAIL_DOMAIN;"},{"lineNumber":203,"author":{"gitId":"-"},"content":" String standardGitLabEmail \u003d getGitId() + STANDARD_GITLAB_EMAIL_DOMAIN;"},{"lineNumber":204,"author":{"gitId":"-"},"content":" if (!emails.contains(standardGitHubEmail)) {"},{"lineNumber":205,"author":{"gitId":"-"},"content":" emails.add(standardGitHubEmail);"},{"lineNumber":206,"author":{"gitId":"-"},"content":" }"},{"lineNumber":207,"author":{"gitId":"-"},"content":" if (!emails.contains(standardGitLabEmail)) {"},{"lineNumber":208,"author":{"gitId":"-"},"content":" emails.add(standardGitLabEmail);"},{"lineNumber":209,"author":{"gitId":"-"},"content":" }"},{"lineNumber":210,"author":{"gitId":"-"},"content":" }"},{"lineNumber":211,"author":{"gitId":"-"},"content":"}"},{"lineNumber":212,"author":{"gitId":"-"},"content":""}],"authorContributionMap":{"asdfghjkxd":7,"-":205}},{"path":"src/main/java/reposense/model/CliRunConfiguration.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.model;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.ArrayList;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.logging.Level;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidLocationException;"},{"lineNumber":9,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.ParseException;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import reposense.system.LogsManager;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * Represents RepoSense run configured by CLI."},{"lineNumber":14,"author":{"gitId":"-"},"content":" */"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class CliRunConfiguration implements RunConfiguration {"},{"lineNumber":16,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsManager.getLogger(CliRunConfiguration.class);"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":" private final CliArguments cliArguments;"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":" public CliRunConfiguration(CliArguments cliArguments) {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" this.cliArguments \u003d cliArguments;"},{"lineNumber":22,"author":{"gitId":"-"},"content":" }"},{"lineNumber":23,"author":{"gitId":"-"},"content":""},{"lineNumber":24,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * Constructs a list of {@link RepoConfiguration}."},{"lineNumber":26,"author":{"gitId":"-"},"content":" *"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * @throws ParseException if all repo locations are invalid."},{"lineNumber":28,"author":{"gitId":"-"},"content":" */"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public List\u003cRepoConfiguration\u003e getRepoConfigurations() throws ParseException {"},{"lineNumber":31,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e configs \u003d new ArrayList\u003c\u003e();"},{"lineNumber":32,"author":{"gitId":"-"},"content":" for (String locationString : cliArguments.getLocations()) {"},{"lineNumber":33,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":34,"author":{"gitId":"asdfghjkxd"},"content":" configs.add("},{"lineNumber":35,"author":{"gitId":"asdfghjkxd"},"content":" new RepoConfiguration.Builder()"},{"lineNumber":36,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(locationString))"},{"lineNumber":37,"author":{"gitId":"asdfghjkxd"},"content":" .build()"},{"lineNumber":38,"author":{"gitId":"asdfghjkxd"},"content":" );"},{"lineNumber":39,"author":{"gitId":"-"},"content":" } catch (InvalidLocationException ile) {"},{"lineNumber":40,"author":{"gitId":"-"},"content":" logger.log(Level.WARNING, ile.getMessage(), ile);"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":" if (configs.isEmpty()) {"},{"lineNumber":45,"author":{"gitId":"-"},"content":" throw new ParseException(\"All repository locations are invalid.\");"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }"},{"lineNumber":47,"author":{"gitId":"-"},"content":""},{"lineNumber":48,"author":{"gitId":"-"},"content":" return configs;"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }"},{"lineNumber":50,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":7,"-":43}},{"path":"src/main/java/reposense/model/ConfigRunConfiguration.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.model;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Files;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.logging.Level;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"import reposense.parser.AuthorConfigCsvParser;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import reposense.parser.GroupConfigCsvParser;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import reposense.parser.RepoConfigCsvParser;"},{"lineNumber":13,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidCsvException;"},{"lineNumber":14,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidHeaderException;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import reposense.system.LogsManager;"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Represents RepoSense run configured by config files."},{"lineNumber":19,"author":{"gitId":"-"},"content":" */"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class ConfigRunConfiguration implements RunConfiguration {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsManager.getLogger(ConfigRunConfiguration.class);"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":" private final CliArguments cliArguments;"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":" public ConfigRunConfiguration(CliArguments cliArguments) {"},{"lineNumber":26,"author":{"gitId":"-"},"content":" this.cliArguments \u003d cliArguments;"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Constructs a list of {@link RepoConfiguration}."},{"lineNumber":32,"author":{"gitId":"-"},"content":" *"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * @throws IOException if user-supplied csv file does not exist or is not readable."},{"lineNumber":34,"author":{"gitId":"-"},"content":" * @throws InvalidCsvException if user-supplied repo-config csv is malformed."},{"lineNumber":35,"author":{"gitId":"-"},"content":" * @throws InvalidHeaderException if user-supplied csv file has header that cannot be parsed."},{"lineNumber":36,"author":{"gitId":"-"},"content":" */"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public List\u003cRepoConfiguration\u003e getRepoConfigurations()"},{"lineNumber":39,"author":{"gitId":"-"},"content":" throws IOException, InvalidCsvException, InvalidHeaderException {"},{"lineNumber":40,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e repoConfigs \u003d new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":41,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e authorConfigs;"},{"lineNumber":42,"author":{"gitId":"-"},"content":" List\u003cGroupConfiguration\u003e groupConfigs;"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":" Path authorConfigFilePath \u003d cliArguments.getAuthorConfigFilePath();"},{"lineNumber":45,"author":{"gitId":"-"},"content":" Path groupConfigFilePath \u003d cliArguments.getGroupConfigFilePath();"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":""},{"lineNumber":48,"author":{"gitId":"-"},"content":" if (authorConfigFilePath !\u003d null \u0026\u0026 Files.exists(authorConfigFilePath)) {"},{"lineNumber":49,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":50,"author":{"gitId":"-"},"content":" authorConfigs \u003d new AuthorConfigCsvParser(cliArguments.getAuthorConfigFilePath()).parse();"},{"lineNumber":51,"author":{"gitId":"-"},"content":" RepoConfiguration.merge(repoConfigs, authorConfigs);"},{"lineNumber":52,"author":{"gitId":"-"},"content":" RepoConfiguration.setHasAuthorConfigFileToRepoConfigs(repoConfigs, true);"},{"lineNumber":53,"author":{"gitId":"-"},"content":" } catch (IOException | InvalidCsvException e) {"},{"lineNumber":54,"author":{"gitId":"-"},"content":" // for all IO and invalid csv exceptions, log the error and continue"},{"lineNumber":55,"author":{"gitId":"-"},"content":" logger.log(Level.WARNING, e.getMessage(), e);"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }"},{"lineNumber":58,"author":{"gitId":"-"},"content":""},{"lineNumber":59,"author":{"gitId":"-"},"content":" if (groupConfigFilePath !\u003d null \u0026\u0026 Files.exists(groupConfigFilePath)) {"},{"lineNumber":60,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":61,"author":{"gitId":"-"},"content":" groupConfigs \u003d new GroupConfigCsvParser(cliArguments.getGroupConfigFilePath()).parse();"},{"lineNumber":62,"author":{"gitId":"-"},"content":" RepoConfiguration.setGroupConfigsToRepos(repoConfigs, groupConfigs);"},{"lineNumber":63,"author":{"gitId":"-"},"content":" } catch (IOException | InvalidCsvException e) {"},{"lineNumber":64,"author":{"gitId":"-"},"content":" // for all IO and invalid csv exceptions, log the error and continue"},{"lineNumber":65,"author":{"gitId":"-"},"content":" logger.log(Level.WARNING, e.getMessage(), e);"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }"},{"lineNumber":68,"author":{"gitId":"-"},"content":""},{"lineNumber":69,"author":{"gitId":"-"},"content":" return repoConfigs;"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }"},{"lineNumber":71,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":2,"-":69}},{"path":"src/main/java/reposense/model/RepoConfiguration.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.model;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.File;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.time.LocalDateTime;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.time.ZoneId;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.ArrayList;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Collections;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Map;"},{"lineNumber":10,"author":{"gitId":"asdfghjkxd"},"content":"import java.util.Optional;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"import reposense.git.GitBranch;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import reposense.git.exception.GitBranchException;"},{"lineNumber":16,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.ConfigurationBuildException;"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import reposense.system.LogsManager;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import reposense.util.FileUtil;"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Represents configuration information from CSV config file for a single repository."},{"lineNumber":22,"author":{"gitId":"-"},"content":" */"},{"lineNumber":23,"author":{"gitId":"-"},"content":"public class RepoConfiguration {"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public static final String DEFAULT_BRANCH \u003d \"HEAD\";"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static final String DEFAULT_EXTRA_OUTPUT_FOLDER_NAME \u003d \"\";"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static final long DEFAULT_FILE_SIZE_LIMIT \u003d 500000;"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsManager.getLogger(RepoConfiguration.class);"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" private RepoLocation location;"},{"lineNumber":30,"author":{"gitId":"asdfghjkxd"},"content":" private String branch \u003d DEFAULT_BRANCH;"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private String displayName;"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private String outputFolderName;"},{"lineNumber":33,"author":{"gitId":"asdfghjkxd"},"content":" private transient String extraOutputFolderName \u003d DEFAULT_EXTRA_OUTPUT_FOLDER_NAME;"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private transient ZoneId zoneId;"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private transient LocalDateTime sinceDate;"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private transient LocalDateTime untilDate;"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private transient String repoFolderName;"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"asdfghjkxd"},"content":" private transient FileTypeManager fileTypeManager \u003d new FileTypeManager(Collections.emptyList());"},{"lineNumber":40,"author":{"gitId":"-"},"content":" private transient List\u003cString\u003e ignoreGlobList \u003d new ArrayList\u003c\u003e();"},{"lineNumber":41,"author":{"gitId":"-"},"content":" private transient List\u003cString\u003e ignoredAuthorsList \u003d new ArrayList\u003c\u003e();"},{"lineNumber":42,"author":{"gitId":"-"},"content":" private transient AuthorConfiguration authorConfig;"},{"lineNumber":43,"author":{"gitId":"asdfghjkxd"},"content":" private transient boolean isStandaloneConfigIgnored \u003d false;"},{"lineNumber":44,"author":{"gitId":"asdfghjkxd"},"content":" private transient boolean isFileSizeLimitIgnored \u003d false;"},{"lineNumber":45,"author":{"gitId":"asdfghjkxd"},"content":" private transient List\u003cCommitHash\u003e ignoreCommitList \u003d Collections.emptyList();"},{"lineNumber":46,"author":{"gitId":"-"},"content":" private transient boolean isLastModifiedDateIncluded;"},{"lineNumber":47,"author":{"gitId":"asdfghjkxd"},"content":" private transient boolean isShallowCloningPerformed \u003d false;"},{"lineNumber":48,"author":{"gitId":"asdfghjkxd"},"content":" private transient boolean isFindingPreviousAuthorsPerformed \u003d false;"},{"lineNumber":49,"author":{"gitId":"asdfghjkxd"},"content":" private transient boolean isFormatsOverriding \u003d false;"},{"lineNumber":50,"author":{"gitId":"-"},"content":" private transient boolean isIgnoreGlobListOverriding;"},{"lineNumber":51,"author":{"gitId":"asdfghjkxd"},"content":" private transient boolean isIgnoreCommitListOverriding \u003d false;"},{"lineNumber":52,"author":{"gitId":"-"},"content":" private transient boolean isIgnoredAuthorsListOverriding;"},{"lineNumber":53,"author":{"gitId":"asdfghjkxd"},"content":" private transient long fileSizeLimit \u003d DEFAULT_FILE_SIZE_LIMIT;"},{"lineNumber":54,"author":{"gitId":"asdfghjkxd"},"content":" private transient boolean isFileSizeLimitOverriding \u003d false;"},{"lineNumber":55,"author":{"gitId":"asdfghjkxd"},"content":" private transient boolean isIgnoredFileAnalysisSkipped \u003d false;"},{"lineNumber":56,"author":{"gitId":"-"},"content":""},{"lineNumber":57,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":58,"author":{"gitId":"asdfghjkxd"},"content":" * Constructs an empty instance of {@code RepoConfiguration}, which is used by the {@code Builder}"},{"lineNumber":59,"author":{"gitId":"asdfghjkxd"},"content":" * to construct new {@code RepoConfiguration} instances."},{"lineNumber":60,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":61,"author":{"gitId":"asdfghjkxd"},"content":" private RepoConfiguration() {}"},{"lineNumber":62,"author":{"gitId":"-"},"content":""},{"lineNumber":63,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":64,"author":{"gitId":"asdfghjkxd"},"content":" * Builds the necessary configurations for RepoConfiguration."},{"lineNumber":65,"author":{"gitId":"asdfghjkxd"},"content":" * Obeys the Builder pattern as described in {@link CliArguments}."},{"lineNumber":66,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":67,"author":{"gitId":"asdfghjkxd"},"content":" public static class Builder {"},{"lineNumber":68,"author":{"gitId":"asdfghjkxd"},"content":" private String displayName;"},{"lineNumber":69,"author":{"gitId":"asdfghjkxd"},"content":" private String outputFolderName;"},{"lineNumber":70,"author":{"gitId":"asdfghjkxd"},"content":" private String repoFolderName;"},{"lineNumber":71,"author":{"gitId":"asdfghjkxd"},"content":" private RepoConfiguration repoConfiguration;"},{"lineNumber":72,"author":{"gitId":"-"},"content":""},{"lineNumber":73,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":74,"author":{"gitId":"asdfghjkxd"},"content":" * Returns an empty instance of the RepoConfiguration Builder."},{"lineNumber":75,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":76,"author":{"gitId":"asdfghjkxd"},"content":" public Builder() {"},{"lineNumber":77,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration \u003d new RepoConfiguration();"},{"lineNumber":78,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":79,"author":{"gitId":"-"},"content":""},{"lineNumber":80,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":81,"author":{"gitId":"asdfghjkxd"},"content":" * Processes the author configuration of the repository."},{"lineNumber":82,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":83,"author":{"gitId":"asdfghjkxd"},"content":" private void processAuthor() {"},{"lineNumber":84,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.authorConfig \u003d new AuthorConfiguration("},{"lineNumber":85,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.location,"},{"lineNumber":86,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.branch);"},{"lineNumber":87,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":88,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":89,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":90,"author":{"gitId":"asdfghjkxd"},"content":" * Processes the branch of the repository."},{"lineNumber":91,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":92,"author":{"gitId":"asdfghjkxd"},"content":" private void processBranch() {"},{"lineNumber":93,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.branch \u003d this.repoConfiguration.location.isEmpty()"},{"lineNumber":94,"author":{"gitId":"asdfghjkxd"},"content":" ? DEFAULT_BRANCH"},{"lineNumber":95,"author":{"gitId":"asdfghjkxd"},"content":" : this.repoConfiguration.branch;"},{"lineNumber":96,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":97,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":98,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":99,"author":{"gitId":"asdfghjkxd"},"content":" * Processes the relevant names of the repository configs."},{"lineNumber":100,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":101,"author":{"gitId":"asdfghjkxd"},"content":" private void processNames() {"},{"lineNumber":102,"author":{"gitId":"asdfghjkxd"},"content":" String repoName \u003d this.repoConfiguration.location.getRepoName();"},{"lineNumber":103,"author":{"gitId":"asdfghjkxd"},"content":" String org \u003d this.repoConfiguration.location.getOrganization();"},{"lineNumber":104,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":105,"author":{"gitId":"asdfghjkxd"},"content":" String defaultDisplayName \u003d repoName + \"[\" + this.repoConfiguration.branch + \"]\";"},{"lineNumber":106,"author":{"gitId":"asdfghjkxd"},"content":" String defaultOutputFolderName \u003d repoName + \"_\" + this.repoConfiguration.branch;"},{"lineNumber":107,"author":{"gitId":"asdfghjkxd"},"content":" String defaultRepoFolderName \u003d repoName;"},{"lineNumber":108,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":109,"author":{"gitId":"asdfghjkxd"},"content":" if (!org.isEmpty()) {"},{"lineNumber":110,"author":{"gitId":"asdfghjkxd"},"content":" defaultDisplayName \u003d org + \"/\" + defaultDisplayName;"},{"lineNumber":111,"author":{"gitId":"asdfghjkxd"},"content":" defaultRepoFolderName \u003d org + \"_\" + defaultRepoFolderName;"},{"lineNumber":112,"author":{"gitId":"asdfghjkxd"},"content":" defaultOutputFolderName \u003d org + \"_\" + defaultOutputFolderName;"},{"lineNumber":113,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":114,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":115,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.displayName \u003d Optional.ofNullable(this.displayName)"},{"lineNumber":116,"author":{"gitId":"asdfghjkxd"},"content":" .orElse(defaultDisplayName);"},{"lineNumber":117,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.outputFolderName \u003d Optional.ofNullable(this.outputFolderName)"},{"lineNumber":118,"author":{"gitId":"asdfghjkxd"},"content":" .orElse(defaultOutputFolderName);"},{"lineNumber":119,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.repoFolderName \u003d Optional.ofNullable(this.repoFolderName)"},{"lineNumber":120,"author":{"gitId":"asdfghjkxd"},"content":" .orElse(defaultRepoFolderName);"},{"lineNumber":121,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":122,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":123,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":124,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code location} for {@code RepoConfiguration}."},{"lineNumber":125,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":126,"author":{"gitId":"asdfghjkxd"},"content":" * @param location A repository location."},{"lineNumber":127,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object"},{"lineNumber":128,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":129,"author":{"gitId":"asdfghjkxd"},"content":" public Builder location(RepoLocation location) {"},{"lineNumber":130,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.location \u003d location;"},{"lineNumber":131,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":132,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":133,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":134,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":135,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code branch} for {@code RepoConfiguration}."},{"lineNumber":136,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":137,"author":{"gitId":"asdfghjkxd"},"content":" * @param branch Branch of the repository of interest."},{"lineNumber":138,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":139,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":140,"author":{"gitId":"asdfghjkxd"},"content":" public Builder branch(String branch) {"},{"lineNumber":141,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.branch \u003d branch;"},{"lineNumber":142,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":143,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":144,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":145,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":146,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code displayName} for {@code RepoConfiguration}."},{"lineNumber":147,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":148,"author":{"gitId":"asdfghjkxd"},"content":" * @param displayName Display name of the repository."},{"lineNumber":149,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":150,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":151,"author":{"gitId":"asdfghjkxd"},"content":" public Builder displayName(String displayName) {"},{"lineNumber":152,"author":{"gitId":"asdfghjkxd"},"content":" this.displayName \u003d displayName;"},{"lineNumber":153,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.displayName \u003d displayName;"},{"lineNumber":154,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":155,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":156,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":157,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":158,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code outputFolderName} for {@code RepoConfiguration}."},{"lineNumber":159,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":160,"author":{"gitId":"asdfghjkxd"},"content":" * @param outputFolderName Output folder name of the repository."},{"lineNumber":161,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":162,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":163,"author":{"gitId":"asdfghjkxd"},"content":" public Builder outputFolderName(String outputFolderName) {"},{"lineNumber":164,"author":{"gitId":"asdfghjkxd"},"content":" this.outputFolderName \u003d outputFolderName;"},{"lineNumber":165,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.outputFolderName \u003d outputFolderName;"},{"lineNumber":166,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":167,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":168,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":169,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":170,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code extraOutputFolderName} for {@code RepoConfiguration}."},{"lineNumber":171,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":172,"author":{"gitId":"asdfghjkxd"},"content":" * @param extraOutputFolderName Extra output folder name of the repository."},{"lineNumber":173,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":174,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":175,"author":{"gitId":"asdfghjkxd"},"content":" public Builder extraOutputFolderName(String extraOutputFolderName) {"},{"lineNumber":176,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.extraOutputFolderName \u003d extraOutputFolderName;"},{"lineNumber":177,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":178,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":179,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":180,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":181,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code zoneId} for {@code RepoConfiguration}."},{"lineNumber":182,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":183,"author":{"gitId":"asdfghjkxd"},"content":" * @param zoneId Time-zone of the repository."},{"lineNumber":184,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":185,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":186,"author":{"gitId":"asdfghjkxd"},"content":" public Builder zoneId(ZoneId zoneId) {"},{"lineNumber":187,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.zoneId \u003d zoneId;"},{"lineNumber":188,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":189,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":190,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":191,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":192,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code sinceDate} for {@code RepoConfiguration}."},{"lineNumber":193,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":194,"author":{"gitId":"asdfghjkxd"},"content":" * @param sinceDate Starting date of analysis."},{"lineNumber":195,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":196,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":197,"author":{"gitId":"asdfghjkxd"},"content":" public Builder sinceDate(LocalDateTime sinceDate) {"},{"lineNumber":198,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.sinceDate \u003d sinceDate;"},{"lineNumber":199,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":200,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":201,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":202,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":203,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code untilDate} for {@code RepoConfiguration}."},{"lineNumber":204,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":205,"author":{"gitId":"asdfghjkxd"},"content":" * @param untilDate Ending date of analysis."},{"lineNumber":206,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":207,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":208,"author":{"gitId":"asdfghjkxd"},"content":" public Builder untilDate(LocalDateTime untilDate) {"},{"lineNumber":209,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.untilDate \u003d untilDate;"},{"lineNumber":210,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":211,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":212,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":213,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":214,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code repoFolderName} for {@code RepoConfiguration}."},{"lineNumber":215,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":216,"author":{"gitId":"asdfghjkxd"},"content":" * @param repoFolderName Folder name of the repository."},{"lineNumber":217,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":218,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":219,"author":{"gitId":"asdfghjkxd"},"content":" public Builder repoFolderName(String repoFolderName) {"},{"lineNumber":220,"author":{"gitId":"asdfghjkxd"},"content":" this.repoFolderName \u003d repoFolderName;"},{"lineNumber":221,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.repoFolderName \u003d repoFolderName;"},{"lineNumber":222,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":223,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":224,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":225,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":226,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code fileTypeManager} for {@code RepoConfiguration}."},{"lineNumber":227,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":228,"author":{"gitId":"asdfghjkxd"},"content":" * @param fileTypes List of file types and groupings permitted."},{"lineNumber":229,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":230,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":231,"author":{"gitId":"asdfghjkxd"},"content":" public Builder fileTypeManager(List\u003cFileType\u003e fileTypes) {"},{"lineNumber":232,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.fileTypeManager \u003d new FileTypeManager(fileTypes);"},{"lineNumber":233,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":234,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":235,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":236,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":237,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code ignoreGlobList} for {@code RepoConfiguration}."},{"lineNumber":238,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":239,"author":{"gitId":"asdfghjkxd"},"content":" * @param ignoredGlobList List of glob patterns to ignore."},{"lineNumber":240,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":241,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":242,"author":{"gitId":"asdfghjkxd"},"content":" public Builder ignoreGlobList(List\u003cString\u003e ignoredGlobList) {"},{"lineNumber":243,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.ignoreGlobList \u003d ignoredGlobList;"},{"lineNumber":244,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":245,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":246,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":247,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":248,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code ignoredAuthorsList} for {@code RepoConfiguration}."},{"lineNumber":249,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":250,"author":{"gitId":"asdfghjkxd"},"content":" * @param ignoredAuthorsList List of authors to ignore."},{"lineNumber":251,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":252,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":253,"author":{"gitId":"asdfghjkxd"},"content":" public Builder ignoredAuthorsList(List\u003cString\u003e ignoredAuthorsList) {"},{"lineNumber":254,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.ignoredAuthorsList \u003d ignoredAuthorsList;"},{"lineNumber":255,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":256,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":257,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":258,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":259,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code authorConfig} for {@code RepoConfiguration}."},{"lineNumber":260,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":261,"author":{"gitId":"asdfghjkxd"},"content":" * @param authorConfig Author configuration information of the repository."},{"lineNumber":262,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":263,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":264,"author":{"gitId":"asdfghjkxd"},"content":" public Builder authorConfig(AuthorConfiguration authorConfig) {"},{"lineNumber":265,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.authorConfig \u003d authorConfig;"},{"lineNumber":266,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":267,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":268,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":269,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":270,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code isStandaloneConfigIgnored} for {@code RepoConfiguration}."},{"lineNumber":271,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":272,"author":{"gitId":"asdfghjkxd"},"content":" * @param isStandaloneConfigIgnored Checks if standalone config is ignored."},{"lineNumber":273,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":274,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":275,"author":{"gitId":"asdfghjkxd"},"content":" public Builder isStandaloneConfigIgnored(boolean isStandaloneConfigIgnored) {"},{"lineNumber":276,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.isStandaloneConfigIgnored \u003d isStandaloneConfigIgnored;"},{"lineNumber":277,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":278,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":279,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":280,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":281,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code isFileSizeLimitIgnored} for {@code RepoConfiguration}."},{"lineNumber":282,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":283,"author":{"gitId":"asdfghjkxd"},"content":" * @param isFileSizeLimitIgnored Checks if file size limit is ignored."},{"lineNumber":284,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":285,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":286,"author":{"gitId":"asdfghjkxd"},"content":" public Builder isFileSizeLimitIgnored(boolean isFileSizeLimitIgnored) {"},{"lineNumber":287,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.isFileSizeLimitIgnored \u003d isFileSizeLimitIgnored;"},{"lineNumber":288,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":289,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":290,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":291,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":292,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code ignoreCommitList} for {@code RepoConfiguration}."},{"lineNumber":293,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":294,"author":{"gitId":"asdfghjkxd"},"content":" * @param ignoreCommitList List of commits to ignore."},{"lineNumber":295,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":296,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":297,"author":{"gitId":"asdfghjkxd"},"content":" public Builder ignoreCommitList(List\u003cCommitHash\u003e ignoreCommitList) {"},{"lineNumber":298,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.ignoreCommitList \u003d ignoreCommitList;"},{"lineNumber":299,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":300,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":301,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":302,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":303,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code isLastModifiedDateIncluded} for {@code RepoConfiguration}."},{"lineNumber":304,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":305,"author":{"gitId":"asdfghjkxd"},"content":" * @param isLastModifiedDateIncluded Checks if last modified date is included."},{"lineNumber":306,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":307,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":308,"author":{"gitId":"asdfghjkxd"},"content":" public Builder isLastModifiedDateIncluded(boolean isLastModifiedDateIncluded) {"},{"lineNumber":309,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.isLastModifiedDateIncluded \u003d isLastModifiedDateIncluded;"},{"lineNumber":310,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":311,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":312,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":313,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":314,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code isShallowCloningPerformed} for {@code RepoConfiguration}."},{"lineNumber":315,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":316,"author":{"gitId":"asdfghjkxd"},"content":" * @param isShallowCloningPerformed Checks if shallow cloning is performed."},{"lineNumber":317,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":318,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":319,"author":{"gitId":"asdfghjkxd"},"content":" public Builder isShallowCloningPerformed(boolean isShallowCloningPerformed) {"},{"lineNumber":320,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.isShallowCloningPerformed \u003d isShallowCloningPerformed;"},{"lineNumber":321,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":322,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":323,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":324,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":325,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code isFindingPreviousAuthorsPerformed} for {@code RepoConfiguration}."},{"lineNumber":326,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":327,"author":{"gitId":"asdfghjkxd"},"content":" * @param isFindingPreviousAuthorsPerformed Checks if finding previous authors is performed."},{"lineNumber":328,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":329,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":330,"author":{"gitId":"asdfghjkxd"},"content":" public Builder isFindingPreviousAuthorsPerformed(boolean isFindingPreviousAuthorsPerformed) {"},{"lineNumber":331,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.isFindingPreviousAuthorsPerformed \u003d isFindingPreviousAuthorsPerformed;"},{"lineNumber":332,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":333,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":334,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":335,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":336,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code isFormatsOverriding} for {@code RepoConfiguration}."},{"lineNumber":337,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":338,"author":{"gitId":"asdfghjkxd"},"content":" * @param isFormatsOverriding Checks if file formats are overridden."},{"lineNumber":339,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":340,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":341,"author":{"gitId":"asdfghjkxd"},"content":" public Builder isFormatsOverriding(boolean isFormatsOverriding) {"},{"lineNumber":342,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.isFormatsOverriding \u003d isFormatsOverriding;"},{"lineNumber":343,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":344,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":345,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":346,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":347,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code isIgnoreGlobListOverriding} for {@code RepoConfiguration}."},{"lineNumber":348,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":349,"author":{"gitId":"asdfghjkxd"},"content":" * @param isIgnoreGlobListOverriding Checks if the list of ignored glob is overridden."},{"lineNumber":350,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":351,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":352,"author":{"gitId":"asdfghjkxd"},"content":" public Builder isIgnoreGlobListOverriding(boolean isIgnoreGlobListOverriding) {"},{"lineNumber":353,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.isIgnoreGlobListOverriding \u003d isIgnoreGlobListOverriding;"},{"lineNumber":354,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":355,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":356,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":357,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":358,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code isIgnoreCommitListOverriding} for {@code RepoConfiguration}."},{"lineNumber":359,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":360,"author":{"gitId":"asdfghjkxd"},"content":" * @param isIgnoreCommitListOverriding Checks if the list of ignored commits is overridden."},{"lineNumber":361,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":362,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":363,"author":{"gitId":"asdfghjkxd"},"content":" public Builder isIgnoreCommitListOverriding(boolean isIgnoreCommitListOverriding) {"},{"lineNumber":364,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.isIgnoreCommitListOverriding \u003d isIgnoreCommitListOverriding;"},{"lineNumber":365,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":366,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":367,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":368,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":369,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code isFileSizeLimitOverriding} for {@code RepoConfiguration}."},{"lineNumber":370,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":371,"author":{"gitId":"asdfghjkxd"},"content":" * @param isIgnoredAuthorsListOverriding Checks if the list of ignored authors is overridden."},{"lineNumber":372,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":373,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":374,"author":{"gitId":"asdfghjkxd"},"content":" public Builder isIgnoredAuthorsListOverriding(boolean isIgnoredAuthorsListOverriding) {"},{"lineNumber":375,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.isIgnoredAuthorsListOverriding \u003d isIgnoredAuthorsListOverriding;"},{"lineNumber":376,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":377,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":378,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":379,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":380,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code fileSizeLimit} for {@code RepoConfiguration}."},{"lineNumber":381,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":382,"author":{"gitId":"asdfghjkxd"},"content":" * @param fileSizeLimit File size limit of the repository."},{"lineNumber":383,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":384,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":385,"author":{"gitId":"asdfghjkxd"},"content":" public Builder fileSizeLimit(long fileSizeLimit) {"},{"lineNumber":386,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.fileSizeLimit \u003d fileSizeLimit;"},{"lineNumber":387,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":388,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":389,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":390,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":391,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code isFileSizeLimitOverriding} for {@code RepoConfiguration}."},{"lineNumber":392,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":393,"author":{"gitId":"asdfghjkxd"},"content":" * @param isFileSizeLimitOverriding Checks if the file size limit is overridden."},{"lineNumber":394,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":395,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":396,"author":{"gitId":"asdfghjkxd"},"content":" public Builder isFileSizeLimitOverriding(boolean isFileSizeLimitOverriding) {"},{"lineNumber":397,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.isFileSizeLimitOverriding \u003d isFileSizeLimitOverriding;"},{"lineNumber":398,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":399,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":400,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":401,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":402,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code isIgnoredFileAnalysisSkipped} for {@code RepoConfiguration}."},{"lineNumber":403,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":404,"author":{"gitId":"asdfghjkxd"},"content":" * @param isIgnoredFileAnalysisSkipped Checks if the analysis of ignored files is skipped."},{"lineNumber":405,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":406,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":407,"author":{"gitId":"asdfghjkxd"},"content":" public Builder isIgnoredFileAnalysisSkipped(boolean isIgnoredFileAnalysisSkipped) {"},{"lineNumber":408,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.isIgnoredFileAnalysisSkipped \u003d isIgnoredFileAnalysisSkipped;"},{"lineNumber":409,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":410,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":411,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":412,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":413,"author":{"gitId":"asdfghjkxd"},"content":" * Builds the {@code RepoConfiguration} object with the necessary configurations."},{"lineNumber":414,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":415,"author":{"gitId":"asdfghjkxd"},"content":" * @return {@code RepoConfiguration}."},{"lineNumber":416,"author":{"gitId":"asdfghjkxd"},"content":" * @throws ConfigurationBuildException if there was an issue building the {@code RepoConfiguration}"},{"lineNumber":417,"author":{"gitId":"asdfghjkxd"},"content":" * object."},{"lineNumber":418,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":419,"author":{"gitId":"asdfghjkxd"},"content":" public RepoConfiguration build() {"},{"lineNumber":420,"author":{"gitId":"asdfghjkxd"},"content":" if (!validate()) {"},{"lineNumber":421,"author":{"gitId":"asdfghjkxd"},"content":" throw new ConfigurationBuildException();"},{"lineNumber":422,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":423,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":424,"author":{"gitId":"asdfghjkxd"},"content":" this.processAuthor();"},{"lineNumber":425,"author":{"gitId":"asdfghjkxd"},"content":" this.processBranch();"},{"lineNumber":426,"author":{"gitId":"asdfghjkxd"},"content":" this.processNames();"},{"lineNumber":427,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":428,"author":{"gitId":"asdfghjkxd"},"content":" // save a reference to the current built object"},{"lineNumber":429,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration toReturn \u003d this.repoConfiguration;"},{"lineNumber":430,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":431,"author":{"gitId":"asdfghjkxd"},"content":" // reset the internal reference to avoid aliasing"},{"lineNumber":432,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration \u003d new RepoConfiguration();"},{"lineNumber":433,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":434,"author":{"gitId":"asdfghjkxd"},"content":" // return the reference to the built RepoConfiguration object"},{"lineNumber":435,"author":{"gitId":"asdfghjkxd"},"content":" return toReturn;"},{"lineNumber":436,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":437,"author":{"gitId":"-"},"content":""},{"lineNumber":438,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":439,"author":{"gitId":"asdfghjkxd"},"content":" * Checks if the current {@code RepoConfiguration} object contains all the necessary parameters"},{"lineNumber":440,"author":{"gitId":"asdfghjkxd"},"content":" * needed to build successfully."},{"lineNumber":441,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":442,"author":{"gitId":"asdfghjkxd"},"content":" * @return true if the {@code RepoConfiguration} object contains all the necessary parameters else false"},{"lineNumber":443,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":444,"author":{"gitId":"asdfghjkxd"},"content":" private boolean validate() {"},{"lineNumber":445,"author":{"gitId":"asdfghjkxd"},"content":" return Optional.ofNullable(this.repoConfiguration.location).isPresent();"},{"lineNumber":446,"author":{"gitId":"-"},"content":" }"},{"lineNumber":447,"author":{"gitId":"-"},"content":" }"},{"lineNumber":448,"author":{"gitId":"-"},"content":""},{"lineNumber":449,"author":{"gitId":"-"},"content":" public static void setDatesToRepoConfigs(List\u003cRepoConfiguration\u003e configs,"},{"lineNumber":450,"author":{"gitId":"-"},"content":" LocalDateTime sinceDate, LocalDateTime untilDate) {"},{"lineNumber":451,"author":{"gitId":"-"},"content":" for (RepoConfiguration config : configs) {"},{"lineNumber":452,"author":{"gitId":"-"},"content":" config.setSinceDate(sinceDate);"},{"lineNumber":453,"author":{"gitId":"-"},"content":" config.setUntilDate(untilDate);"},{"lineNumber":454,"author":{"gitId":"-"},"content":" }"},{"lineNumber":455,"author":{"gitId":"-"},"content":" }"},{"lineNumber":456,"author":{"gitId":"-"},"content":""},{"lineNumber":457,"author":{"gitId":"-"},"content":" public static void setZoneIdToRepoConfigs(List\u003cRepoConfiguration\u003e configs, ZoneId zoneId) {"},{"lineNumber":458,"author":{"gitId":"-"},"content":" for (RepoConfiguration config : configs) {"},{"lineNumber":459,"author":{"gitId":"-"},"content":" config.setZoneId(zoneId);"},{"lineNumber":460,"author":{"gitId":"-"},"content":" }"},{"lineNumber":461,"author":{"gitId":"-"},"content":" }"},{"lineNumber":462,"author":{"gitId":"-"},"content":""},{"lineNumber":463,"author":{"gitId":"-"},"content":" public static void setIsLastModifiedDateIncludedToRepoConfigs(List\u003cRepoConfiguration\u003e configs,"},{"lineNumber":464,"author":{"gitId":"-"},"content":" boolean isLastModifiedDateIncluded) {"},{"lineNumber":465,"author":{"gitId":"-"},"content":" for (RepoConfiguration config : configs) {"},{"lineNumber":466,"author":{"gitId":"-"},"content":" config.setIsLastModifiedDateIncluded(isLastModifiedDateIncluded);"},{"lineNumber":467,"author":{"gitId":"-"},"content":" }"},{"lineNumber":468,"author":{"gitId":"-"},"content":" }"},{"lineNumber":469,"author":{"gitId":"-"},"content":""},{"lineNumber":470,"author":{"gitId":"-"},"content":" public static void setIsShallowCloningPerformedToRepoConfigs(List\u003cRepoConfiguration\u003e configs,"},{"lineNumber":471,"author":{"gitId":"-"},"content":" boolean isShallowCloningPerformed) {"},{"lineNumber":472,"author":{"gitId":"-"},"content":" if (isShallowCloningPerformed) {"},{"lineNumber":473,"author":{"gitId":"-"},"content":" configs.stream().forEach(config -\u003e config.setIsShallowCloningPerformed(true));"},{"lineNumber":474,"author":{"gitId":"-"},"content":" }"},{"lineNumber":475,"author":{"gitId":"-"},"content":" }"},{"lineNumber":476,"author":{"gitId":"-"},"content":""},{"lineNumber":477,"author":{"gitId":"-"},"content":" public static void setIsFindingPreviousAuthorsPerformedToRepoConfigs(List\u003cRepoConfiguration\u003e configs,"},{"lineNumber":478,"author":{"gitId":"-"},"content":" boolean isFindingPreviousAuthorsPerformed) {"},{"lineNumber":479,"author":{"gitId":"-"},"content":" if (isFindingPreviousAuthorsPerformed) {"},{"lineNumber":480,"author":{"gitId":"-"},"content":" configs.stream().forEach(config -\u003e config.setIsFindingPreviousAuthorsPerformed(true));"},{"lineNumber":481,"author":{"gitId":"-"},"content":" }"},{"lineNumber":482,"author":{"gitId":"-"},"content":" }"},{"lineNumber":483,"author":{"gitId":"-"},"content":""},{"lineNumber":484,"author":{"gitId":"-"},"content":" public static void setHasAuthorConfigFileToRepoConfigs(List\u003cRepoConfiguration\u003e configs,"},{"lineNumber":485,"author":{"gitId":"-"},"content":" boolean setHasAuthorConfigFile) {"},{"lineNumber":486,"author":{"gitId":"-"},"content":" configs.stream().forEach(config -\u003e config.setHasAuthorConfigFile(setHasAuthorConfigFile));"},{"lineNumber":487,"author":{"gitId":"-"},"content":" }"},{"lineNumber":488,"author":{"gitId":"-"},"content":""},{"lineNumber":489,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":490,"author":{"gitId":"-"},"content":" * Merges a {@link RepoConfiguration} from {@code repoConfigs} with an {@link AuthorConfiguration} from"},{"lineNumber":491,"author":{"gitId":"-"},"content":" * {@code authorConfigs} if their {@link RepoLocation} and branch matches."},{"lineNumber":492,"author":{"gitId":"-"},"content":" */"},{"lineNumber":493,"author":{"gitId":"-"},"content":" public static void merge(List\u003cRepoConfiguration\u003e repoConfigs, List\u003cAuthorConfiguration\u003e authorConfigs) {"},{"lineNumber":494,"author":{"gitId":"-"},"content":" for (AuthorConfiguration authorConfig : authorConfigs) {"},{"lineNumber":495,"author":{"gitId":"-"},"content":" if (authorConfig.getLocation().isEmpty()) {"},{"lineNumber":496,"author":{"gitId":"-"},"content":" for (RepoConfiguration repoConfig : repoConfigs) {"},{"lineNumber":497,"author":{"gitId":"-"},"content":" repoConfig.addAuthors(authorConfig.getAuthorList());"},{"lineNumber":498,"author":{"gitId":"-"},"content":" }"},{"lineNumber":499,"author":{"gitId":"-"},"content":" continue;"},{"lineNumber":500,"author":{"gitId":"-"},"content":" }"},{"lineNumber":501,"author":{"gitId":"-"},"content":""},{"lineNumber":502,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e locationMatchingRepoConfigs \u003d"},{"lineNumber":503,"author":{"gitId":"-"},"content":" getMatchingRepoConfigsByLocation(repoConfigs, authorConfig.getLocation());"},{"lineNumber":504,"author":{"gitId":"-"},"content":""},{"lineNumber":505,"author":{"gitId":"-"},"content":" if (locationMatchingRepoConfigs.isEmpty()) {"},{"lineNumber":506,"author":{"gitId":"-"},"content":" logger.warning(String.format("},{"lineNumber":507,"author":{"gitId":"-"},"content":" \"Repository %s is not found in repo-config.csv.\","},{"lineNumber":508,"author":{"gitId":"-"},"content":" authorConfig.getLocation()));"},{"lineNumber":509,"author":{"gitId":"-"},"content":" continue;"},{"lineNumber":510,"author":{"gitId":"-"},"content":" }"},{"lineNumber":511,"author":{"gitId":"-"},"content":" if (authorConfig.isDefaultBranch()) {"},{"lineNumber":512,"author":{"gitId":"-"},"content":" locationMatchingRepoConfigs.forEach(matchingRepoConfig -\u003e {"},{"lineNumber":513,"author":{"gitId":"-"},"content":" matchingRepoConfig.addAuthors(authorConfig.getAuthorList());"},{"lineNumber":514,"author":{"gitId":"-"},"content":" });"},{"lineNumber":515,"author":{"gitId":"-"},"content":" continue;"},{"lineNumber":516,"author":{"gitId":"-"},"content":" }"},{"lineNumber":517,"author":{"gitId":"-"},"content":""},{"lineNumber":518,"author":{"gitId":"-"},"content":" RepoConfiguration branchMatchingRepoConfig \u003d getMatchingRepoConfig(repoConfigs, authorConfig);"},{"lineNumber":519,"author":{"gitId":"-"},"content":""},{"lineNumber":520,"author":{"gitId":"-"},"content":" if (branchMatchingRepoConfig \u003d\u003d null) {"},{"lineNumber":521,"author":{"gitId":"-"},"content":" if (!authorConfig.isDefaultBranch()) {"},{"lineNumber":522,"author":{"gitId":"-"},"content":" logger.warning(String.format("},{"lineNumber":523,"author":{"gitId":"-"},"content":" \"Repository %s (branch %s) is not found in repo-config.csv.\","},{"lineNumber":524,"author":{"gitId":"-"},"content":" authorConfig.getLocation(), authorConfig.getBranch()));"},{"lineNumber":525,"author":{"gitId":"-"},"content":" }"},{"lineNumber":526,"author":{"gitId":"-"},"content":" continue;"},{"lineNumber":527,"author":{"gitId":"-"},"content":" }"},{"lineNumber":528,"author":{"gitId":"-"},"content":""},{"lineNumber":529,"author":{"gitId":"-"},"content":" branchMatchingRepoConfig.addAuthors(authorConfig.getAuthorList());"},{"lineNumber":530,"author":{"gitId":"-"},"content":" }"},{"lineNumber":531,"author":{"gitId":"-"},"content":" }"},{"lineNumber":532,"author":{"gitId":"-"},"content":""},{"lineNumber":533,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":534,"author":{"gitId":"-"},"content":" * Sets the list of groups in {@code groupConfigs} to the respective {@code repoConfigs}."},{"lineNumber":535,"author":{"gitId":"-"},"content":" */"},{"lineNumber":536,"author":{"gitId":"-"},"content":" public static void setGroupConfigsToRepos(List\u003cRepoConfiguration\u003e repoConfigs,"},{"lineNumber":537,"author":{"gitId":"-"},"content":" List\u003cGroupConfiguration\u003e groupConfigs) {"},{"lineNumber":538,"author":{"gitId":"-"},"content":" for (GroupConfiguration groupConfig : groupConfigs) {"},{"lineNumber":539,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e matchingRepoConfigs;"},{"lineNumber":540,"author":{"gitId":"-"},"content":" if (groupConfig.getLocation().isEmpty()) {"},{"lineNumber":541,"author":{"gitId":"-"},"content":" matchingRepoConfigs \u003d repoConfigs;"},{"lineNumber":542,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":543,"author":{"gitId":"-"},"content":" matchingRepoConfigs \u003d getMatchingRepoConfigsByLocation(repoConfigs,"},{"lineNumber":544,"author":{"gitId":"-"},"content":" groupConfig.getLocation());"},{"lineNumber":545,"author":{"gitId":"-"},"content":" }"},{"lineNumber":546,"author":{"gitId":"-"},"content":" if (matchingRepoConfigs.isEmpty()) {"},{"lineNumber":547,"author":{"gitId":"-"},"content":" logger.warning(String.format("},{"lineNumber":548,"author":{"gitId":"-"},"content":" \"Repository %s is not found in repo-config.csv.\", groupConfig.getLocation()));"},{"lineNumber":549,"author":{"gitId":"-"},"content":" continue;"},{"lineNumber":550,"author":{"gitId":"-"},"content":" }"},{"lineNumber":551,"author":{"gitId":"-"},"content":" matchingRepoConfigs.forEach(matchingRepoConfig -\u003e {"},{"lineNumber":552,"author":{"gitId":"-"},"content":" matchingRepoConfig.addGroups(groupConfig.getGroupsList());"},{"lineNumber":553,"author":{"gitId":"-"},"content":" });"},{"lineNumber":554,"author":{"gitId":"-"},"content":" }"},{"lineNumber":555,"author":{"gitId":"-"},"content":" }"},{"lineNumber":556,"author":{"gitId":"-"},"content":""},{"lineNumber":557,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":558,"author":{"gitId":"-"},"content":" * Iterates through {@code repoConfigs} to find a {@link RepoConfiguration} with {@link RepoLocation} and branch"},{"lineNumber":559,"author":{"gitId":"-"},"content":" * that matches {@code authorConfig}. Returns {@code null} if no match is found."},{"lineNumber":560,"author":{"gitId":"-"},"content":" */"},{"lineNumber":561,"author":{"gitId":"-"},"content":" private static RepoConfiguration getMatchingRepoConfig(List\u003cRepoConfiguration\u003e repoConfigs,"},{"lineNumber":562,"author":{"gitId":"-"},"content":" AuthorConfiguration authorConfig) {"},{"lineNumber":563,"author":{"gitId":"-"},"content":" if (authorConfig.isDefaultBranch()) {"},{"lineNumber":564,"author":{"gitId":"-"},"content":" return null;"},{"lineNumber":565,"author":{"gitId":"-"},"content":" }"},{"lineNumber":566,"author":{"gitId":"-"},"content":" for (RepoConfiguration repoConfig : repoConfigs) {"},{"lineNumber":567,"author":{"gitId":"-"},"content":" if (repoConfig.getLocation().equals(authorConfig.getLocation())"},{"lineNumber":568,"author":{"gitId":"-"},"content":" \u0026\u0026 repoConfig.getBranch().equals(authorConfig.getBranch())) {"},{"lineNumber":569,"author":{"gitId":"-"},"content":" return repoConfig;"},{"lineNumber":570,"author":{"gitId":"-"},"content":" }"},{"lineNumber":571,"author":{"gitId":"-"},"content":" }"},{"lineNumber":572,"author":{"gitId":"-"},"content":" return null;"},{"lineNumber":573,"author":{"gitId":"-"},"content":" }"},{"lineNumber":574,"author":{"gitId":"-"},"content":""},{"lineNumber":575,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":576,"author":{"gitId":"-"},"content":" * Returns a list of {@link RepoConfiguration} where the {@link RepoLocation} of a {@link RepoConfiguration}"},{"lineNumber":577,"author":{"gitId":"-"},"content":" * in the list of {@code configs} matches {@code targetRepoLocation}."},{"lineNumber":578,"author":{"gitId":"-"},"content":" */"},{"lineNumber":579,"author":{"gitId":"-"},"content":" private static List\u003cRepoConfiguration\u003e getMatchingRepoConfigsByLocation(List\u003cRepoConfiguration\u003e configs,"},{"lineNumber":580,"author":{"gitId":"-"},"content":" RepoLocation targetRepoLocation) {"},{"lineNumber":581,"author":{"gitId":"-"},"content":" return configs.stream().filter(config -\u003e config.getLocation().equals(targetRepoLocation))"},{"lineNumber":582,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());"},{"lineNumber":583,"author":{"gitId":"-"},"content":" }"},{"lineNumber":584,"author":{"gitId":"-"},"content":""},{"lineNumber":585,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":586,"author":{"gitId":"-"},"content":" * Sets {@code formats} to {@link RepoConfiguration} in {@code configs} if its format list is empty."},{"lineNumber":587,"author":{"gitId":"-"},"content":" */"},{"lineNumber":588,"author":{"gitId":"-"},"content":" public static void setFormatsToRepoConfigs(List\u003cRepoConfiguration\u003e configs, List\u003cFileType\u003e formats) {"},{"lineNumber":589,"author":{"gitId":"-"},"content":" for (RepoConfiguration config : configs) {"},{"lineNumber":590,"author":{"gitId":"-"},"content":" if (!config.fileTypeManager.hasSpecifiedFormats()) {"},{"lineNumber":591,"author":{"gitId":"-"},"content":" config.fileTypeManager.setFormats(formats);"},{"lineNumber":592,"author":{"gitId":"-"},"content":" }"},{"lineNumber":593,"author":{"gitId":"-"},"content":" }"},{"lineNumber":594,"author":{"gitId":"-"},"content":" }"},{"lineNumber":595,"author":{"gitId":"-"},"content":""},{"lineNumber":596,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":597,"author":{"gitId":"-"},"content":" * Sets each {@link RepoConfiguration} in {@code configs} to ignore its standalone config, if"},{"lineNumber":598,"author":{"gitId":"-"},"content":" * {@code ignoreAllStandaloneConfigs} is true."},{"lineNumber":599,"author":{"gitId":"-"},"content":" */"},{"lineNumber":600,"author":{"gitId":"-"},"content":" public static void setStandaloneConfigIgnoredToRepoConfigs(List\u003cRepoConfiguration\u003e configs,"},{"lineNumber":601,"author":{"gitId":"-"},"content":" boolean ignoreAllStandaloneConfigs) {"},{"lineNumber":602,"author":{"gitId":"-"},"content":" if (ignoreAllStandaloneConfigs) {"},{"lineNumber":603,"author":{"gitId":"-"},"content":" configs.forEach(config -\u003e config.setStandaloneConfigIgnored(true));"},{"lineNumber":604,"author":{"gitId":"-"},"content":" }"},{"lineNumber":605,"author":{"gitId":"-"},"content":" }"},{"lineNumber":606,"author":{"gitId":"-"},"content":""},{"lineNumber":607,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":608,"author":{"gitId":"-"},"content":" * Sets each {@link RepoConfiguration} in {@code configs} to ignore its filesize limit, if"},{"lineNumber":609,"author":{"gitId":"-"},"content":" * {@code ignoreFilesizeLimit} is true."},{"lineNumber":610,"author":{"gitId":"-"},"content":" */"},{"lineNumber":611,"author":{"gitId":"-"},"content":" public static void setFileSizeLimitIgnoredToRepoConfigs(List\u003cRepoConfiguration\u003e configs,"},{"lineNumber":612,"author":{"gitId":"-"},"content":" boolean ignoreFileSizeLimit) {"},{"lineNumber":613,"author":{"gitId":"-"},"content":" if (ignoreFileSizeLimit) {"},{"lineNumber":614,"author":{"gitId":"-"},"content":" configs.forEach(config -\u003e config.setFileSizeLimitIgnored(true));"},{"lineNumber":615,"author":{"gitId":"-"},"content":" }"},{"lineNumber":616,"author":{"gitId":"-"},"content":" }"},{"lineNumber":617,"author":{"gitId":"-"},"content":""},{"lineNumber":618,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":619,"author":{"gitId":"-"},"content":" * Checks if any of the {@code configs} is finding previous authors for commit analysis."},{"lineNumber":620,"author":{"gitId":"-"},"content":" */"},{"lineNumber":621,"author":{"gitId":"-"},"content":" public static boolean isAnyRepoFindingPreviousAuthors(List\u003cRepoConfiguration\u003e configs) {"},{"lineNumber":622,"author":{"gitId":"-"},"content":" return configs.stream().anyMatch(RepoConfiguration::isFindingPreviousAuthorsPerformed);"},{"lineNumber":623,"author":{"gitId":"-"},"content":" }"},{"lineNumber":624,"author":{"gitId":"-"},"content":""},{"lineNumber":625,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":626,"author":{"gitId":"-"},"content":" * Clears existing information related to this repository and its authors, and replaces it with information from"},{"lineNumber":627,"author":{"gitId":"-"},"content":" * {@code standaloneConfig}."},{"lineNumber":628,"author":{"gitId":"-"},"content":" */"},{"lineNumber":629,"author":{"gitId":"-"},"content":" public void update(StandaloneConfig standaloneConfig) {"},{"lineNumber":630,"author":{"gitId":"-"},"content":" // only assign the new values when all the fields in {@code standaloneConfig} pass the validations."},{"lineNumber":631,"author":{"gitId":"-"},"content":" List\u003cFileType\u003e replacementFileTypes \u003d FileType.convertFormatStringsToFileTypes(standaloneConfig.getFormats());"},{"lineNumber":632,"author":{"gitId":"-"},"content":" CommitHash.validateCommits(standaloneConfig.getIgnoreCommitList());"},{"lineNumber":633,"author":{"gitId":"-"},"content":""},{"lineNumber":634,"author":{"gitId":"-"},"content":" if (!isIgnoreGlobListOverriding) {"},{"lineNumber":635,"author":{"gitId":"-"},"content":" ignoreGlobList \u003d standaloneConfig.getIgnoreGlobList();"},{"lineNumber":636,"author":{"gitId":"-"},"content":" }"},{"lineNumber":637,"author":{"gitId":"-"},"content":" if (!isFormatsOverriding) {"},{"lineNumber":638,"author":{"gitId":"-"},"content":" fileTypeManager.setFormats(replacementFileTypes);"},{"lineNumber":639,"author":{"gitId":"-"},"content":" }"},{"lineNumber":640,"author":{"gitId":"-"},"content":" if (!isIgnoreCommitListOverriding) {"},{"lineNumber":641,"author":{"gitId":"-"},"content":" ignoreCommitList \u003d CommitHash.convertStringsToCommits(standaloneConfig.getIgnoreCommitList());"},{"lineNumber":642,"author":{"gitId":"-"},"content":" }"},{"lineNumber":643,"author":{"gitId":"-"},"content":" if (!isIgnoredAuthorsListOverriding) {"},{"lineNumber":644,"author":{"gitId":"-"},"content":" ignoredAuthorsList \u003d standaloneConfig.getIgnoreAuthorList();"},{"lineNumber":645,"author":{"gitId":"-"},"content":" }"},{"lineNumber":646,"author":{"gitId":"-"},"content":" if (!isFileSizeLimitOverriding) {"},{"lineNumber":647,"author":{"gitId":"-"},"content":" fileSizeLimit \u003d standaloneConfig.getFileSizeLimit();"},{"lineNumber":648,"author":{"gitId":"-"},"content":" }"},{"lineNumber":649,"author":{"gitId":"-"},"content":" authorConfig.update(standaloneConfig, ignoreGlobList);"},{"lineNumber":650,"author":{"gitId":"-"},"content":" }"},{"lineNumber":651,"author":{"gitId":"-"},"content":""},{"lineNumber":652,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":653,"author":{"gitId":"-"},"content":" * Returns the matching {@link Author} given a {@code name} and an {@code email}."},{"lineNumber":654,"author":{"gitId":"-"},"content":" * If no matching {@link Author} is found, {@link Author#UNKNOWN_AUTHOR} is returned."},{"lineNumber":655,"author":{"gitId":"-"},"content":" */"},{"lineNumber":656,"author":{"gitId":"-"},"content":" public Author getAuthor(String name, String email) {"},{"lineNumber":657,"author":{"gitId":"-"},"content":" return authorConfig.getAuthor(name, email);"},{"lineNumber":658,"author":{"gitId":"-"},"content":" }"},{"lineNumber":659,"author":{"gitId":"-"},"content":""},{"lineNumber":660,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":661,"author":{"gitId":"-"},"content":" * Updates branch with {@code currentBranch} if default branch is specified."},{"lineNumber":662,"author":{"gitId":"-"},"content":" */"},{"lineNumber":663,"author":{"gitId":"-"},"content":" public void updateBranch(String currentBranch) {"},{"lineNumber":664,"author":{"gitId":"-"},"content":" if (branch.equals(DEFAULT_BRANCH)) {"},{"lineNumber":665,"author":{"gitId":"-"},"content":" setBranch(currentBranch);"},{"lineNumber":666,"author":{"gitId":"-"},"content":" }"},{"lineNumber":667,"author":{"gitId":"-"},"content":" }"},{"lineNumber":668,"author":{"gitId":"-"},"content":""},{"lineNumber":669,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":670,"author":{"gitId":"-"},"content":" * Gets the current branch and updates branch with current branch if default branch is specified."},{"lineNumber":671,"author":{"gitId":"-"},"content":" *"},{"lineNumber":672,"author":{"gitId":"-"},"content":" * @throws GitBranchException if current branch cannot be retrieved."},{"lineNumber":673,"author":{"gitId":"-"},"content":" */"},{"lineNumber":674,"author":{"gitId":"-"},"content":" public void updateBranch() throws GitBranchException {"},{"lineNumber":675,"author":{"gitId":"-"},"content":" if (branch.equals(DEFAULT_BRANCH)) {"},{"lineNumber":676,"author":{"gitId":"-"},"content":" String currentBranch \u003d GitBranch.getCurrentBranch(getRepoRoot());"},{"lineNumber":677,"author":{"gitId":"-"},"content":" setBranch(currentBranch);"},{"lineNumber":678,"author":{"gitId":"-"},"content":" }"},{"lineNumber":679,"author":{"gitId":"-"},"content":" }"},{"lineNumber":680,"author":{"gitId":"-"},"content":""},{"lineNumber":681,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":682,"author":{"gitId":"-"},"content":" * Gets the path to the root folder of the repository."},{"lineNumber":683,"author":{"gitId":"-"},"content":" */"},{"lineNumber":684,"author":{"gitId":"-"},"content":" public String getRepoRoot() {"},{"lineNumber":685,"author":{"gitId":"-"},"content":" String path \u003d FileUtil.REPOS_ADDRESS + File.separator + getRepoFolderName() + File.separator;"},{"lineNumber":686,"author":{"gitId":"-"},"content":""},{"lineNumber":687,"author":{"gitId":"-"},"content":" if (!getRepoName().isEmpty()) {"},{"lineNumber":688,"author":{"gitId":"-"},"content":" if (!extraOutputFolderName.isEmpty()) {"},{"lineNumber":689,"author":{"gitId":"-"},"content":" path +\u003d extraOutputFolderName + File.separator;"},{"lineNumber":690,"author":{"gitId":"-"},"content":" }"},{"lineNumber":691,"author":{"gitId":"-"},"content":""},{"lineNumber":692,"author":{"gitId":"-"},"content":" path +\u003d getRepoName() + File.separator;"},{"lineNumber":693,"author":{"gitId":"-"},"content":" }"},{"lineNumber":694,"author":{"gitId":"-"},"content":""},{"lineNumber":695,"author":{"gitId":"-"},"content":" return path;"},{"lineNumber":696,"author":{"gitId":"-"},"content":" }"},{"lineNumber":697,"author":{"gitId":"-"},"content":""},{"lineNumber":698,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":699,"author":{"gitId":"-"},"content":" * Gets the name of the folder containing the cloned repository; the parent directory of the repo\u0027s root folder."},{"lineNumber":700,"author":{"gitId":"-"},"content":" */"},{"lineNumber":701,"author":{"gitId":"-"},"content":" public String getRepoFolderName() {"},{"lineNumber":702,"author":{"gitId":"-"},"content":" return repoFolderName;"},{"lineNumber":703,"author":{"gitId":"-"},"content":" }"},{"lineNumber":704,"author":{"gitId":"-"},"content":""},{"lineNumber":705,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":706,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {"},{"lineNumber":707,"author":{"gitId":"-"},"content":""},{"lineNumber":708,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {"},{"lineNumber":709,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":710,"author":{"gitId":"-"},"content":" }"},{"lineNumber":711,"author":{"gitId":"-"},"content":""},{"lineNumber":712,"author":{"gitId":"-"},"content":" if (!(other instanceof RepoConfiguration)) {"},{"lineNumber":713,"author":{"gitId":"-"},"content":" return false;"},{"lineNumber":714,"author":{"gitId":"-"},"content":" }"},{"lineNumber":715,"author":{"gitId":"-"},"content":""},{"lineNumber":716,"author":{"gitId":"-"},"content":" RepoConfiguration otherRepoConfig \u003d (RepoConfiguration) other;"},{"lineNumber":717,"author":{"gitId":"-"},"content":""},{"lineNumber":718,"author":{"gitId":"-"},"content":" return location.equals(otherRepoConfig.location)"},{"lineNumber":719,"author":{"gitId":"-"},"content":" \u0026\u0026 branch.equals(otherRepoConfig.branch)"},{"lineNumber":720,"author":{"gitId":"-"},"content":" \u0026\u0026 authorConfig.equals(otherRepoConfig.authorConfig)"},{"lineNumber":721,"author":{"gitId":"-"},"content":" \u0026\u0026 ignoreGlobList.equals(otherRepoConfig.ignoreGlobList)"},{"lineNumber":722,"author":{"gitId":"-"},"content":" \u0026\u0026 ignoredAuthorsList.equals(otherRepoConfig.ignoredAuthorsList)"},{"lineNumber":723,"author":{"gitId":"-"},"content":" \u0026\u0026 fileSizeLimit \u003d\u003d otherRepoConfig.fileSizeLimit"},{"lineNumber":724,"author":{"gitId":"-"},"content":" \u0026\u0026 isStandaloneConfigIgnored \u003d\u003d otherRepoConfig.isStandaloneConfigIgnored"},{"lineNumber":725,"author":{"gitId":"-"},"content":" \u0026\u0026 fileTypeManager.equals(otherRepoConfig.fileTypeManager)"},{"lineNumber":726,"author":{"gitId":"-"},"content":" \u0026\u0026 isLastModifiedDateIncluded \u003d\u003d otherRepoConfig.isLastModifiedDateIncluded"},{"lineNumber":727,"author":{"gitId":"-"},"content":" \u0026\u0026 isFormatsOverriding \u003d\u003d otherRepoConfig.isFormatsOverriding"},{"lineNumber":728,"author":{"gitId":"-"},"content":" \u0026\u0026 isShallowCloningPerformed \u003d\u003d otherRepoConfig.isShallowCloningPerformed"},{"lineNumber":729,"author":{"gitId":"-"},"content":" \u0026\u0026 isIgnoreGlobListOverriding \u003d\u003d otherRepoConfig.isIgnoreGlobListOverriding"},{"lineNumber":730,"author":{"gitId":"-"},"content":" \u0026\u0026 isIgnoreCommitListOverriding \u003d\u003d otherRepoConfig.isIgnoreCommitListOverriding"},{"lineNumber":731,"author":{"gitId":"-"},"content":" \u0026\u0026 isIgnoredAuthorsListOverriding \u003d\u003d otherRepoConfig.isIgnoredAuthorsListOverriding"},{"lineNumber":732,"author":{"gitId":"-"},"content":" \u0026\u0026 isFileSizeLimitOverriding \u003d\u003d otherRepoConfig.isFileSizeLimitOverriding"},{"lineNumber":733,"author":{"gitId":"-"},"content":" \u0026\u0026 isFileSizeLimitIgnored \u003d\u003d otherRepoConfig.isFileSizeLimitIgnored"},{"lineNumber":734,"author":{"gitId":"-"},"content":" \u0026\u0026 isIgnoredFileAnalysisSkipped \u003d\u003d otherRepoConfig.isIgnoredFileAnalysisSkipped;"},{"lineNumber":735,"author":{"gitId":"-"},"content":" }"},{"lineNumber":736,"author":{"gitId":"-"},"content":""},{"lineNumber":737,"author":{"gitId":"-"},"content":" public Map\u003cAuthor, String\u003e getAuthorDisplayNameMap() {"},{"lineNumber":738,"author":{"gitId":"-"},"content":" return authorConfig.getAuthorDisplayNameMap();"},{"lineNumber":739,"author":{"gitId":"-"},"content":" }"},{"lineNumber":740,"author":{"gitId":"-"},"content":""},{"lineNumber":741,"author":{"gitId":"-"},"content":" public void setAuthorDisplayNameMap(Map\u003cAuthor, String\u003e authorDisplayNameMap) {"},{"lineNumber":742,"author":{"gitId":"-"},"content":" authorConfig.setAuthorDisplayNameMap(authorDisplayNameMap);"},{"lineNumber":743,"author":{"gitId":"-"},"content":" }"},{"lineNumber":744,"author":{"gitId":"-"},"content":""},{"lineNumber":745,"author":{"gitId":"-"},"content":" public String getBranch() {"},{"lineNumber":746,"author":{"gitId":"-"},"content":" return branch;"},{"lineNumber":747,"author":{"gitId":"-"},"content":" }"},{"lineNumber":748,"author":{"gitId":"-"},"content":""},{"lineNumber":749,"author":{"gitId":"-"},"content":" public void setBranch(String branch) {"},{"lineNumber":750,"author":{"gitId":"-"},"content":" updateDisplayName(branch);"},{"lineNumber":751,"author":{"gitId":"-"},"content":" updateOutputFolderName(branch);"},{"lineNumber":752,"author":{"gitId":"-"},"content":" this.branch \u003d branch;"},{"lineNumber":753,"author":{"gitId":"-"},"content":" authorConfig.setBranch(branch);"},{"lineNumber":754,"author":{"gitId":"-"},"content":" }"},{"lineNumber":755,"author":{"gitId":"-"},"content":""},{"lineNumber":756,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":757,"author":{"gitId":"-"},"content":" * Updates the branch in the {@code displayName} to the current {@code branch}."},{"lineNumber":758,"author":{"gitId":"-"},"content":" */"},{"lineNumber":759,"author":{"gitId":"-"},"content":" public void updateDisplayName(String branch) {"},{"lineNumber":760,"author":{"gitId":"-"},"content":" this.displayName \u003d displayName.substring(0, displayName.lastIndexOf(\u0027[\u0027) + 1) + branch + \"]\";"},{"lineNumber":761,"author":{"gitId":"-"},"content":" }"},{"lineNumber":762,"author":{"gitId":"-"},"content":""},{"lineNumber":763,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":764,"author":{"gitId":"-"},"content":" * Updates the branch in the {@code outputFolderName} to the current {@code branch}."},{"lineNumber":765,"author":{"gitId":"-"},"content":" */"},{"lineNumber":766,"author":{"gitId":"-"},"content":" public void updateOutputFolderName(String branch) {"},{"lineNumber":767,"author":{"gitId":"-"},"content":" this.outputFolderName \u003d outputFolderName.substring(0, outputFolderName.lastIndexOf(\u0027_\u0027) + 1) + branch;"},{"lineNumber":768,"author":{"gitId":"-"},"content":" }"},{"lineNumber":769,"author":{"gitId":"-"},"content":""},{"lineNumber":770,"author":{"gitId":"-"},"content":" public List\u003cString\u003e getIgnoreGlobList() {"},{"lineNumber":771,"author":{"gitId":"-"},"content":" return ignoreGlobList;"},{"lineNumber":772,"author":{"gitId":"-"},"content":" }"},{"lineNumber":773,"author":{"gitId":"-"},"content":""},{"lineNumber":774,"author":{"gitId":"-"},"content":" public void setIgnoreGlobList(List\u003cString\u003e ignoreGlobList) {"},{"lineNumber":775,"author":{"gitId":"-"},"content":" this.ignoreGlobList \u003d ignoreGlobList;"},{"lineNumber":776,"author":{"gitId":"-"},"content":" }"},{"lineNumber":777,"author":{"gitId":"-"},"content":""},{"lineNumber":778,"author":{"gitId":"-"},"content":" public List\u003cCommitHash\u003e getIgnoreCommitList() {"},{"lineNumber":779,"author":{"gitId":"-"},"content":" return ignoreCommitList;"},{"lineNumber":780,"author":{"gitId":"-"},"content":" }"},{"lineNumber":781,"author":{"gitId":"-"},"content":""},{"lineNumber":782,"author":{"gitId":"-"},"content":" public long getFileSizeLimit() {"},{"lineNumber":783,"author":{"gitId":"-"},"content":" return fileSizeLimit;"},{"lineNumber":784,"author":{"gitId":"-"},"content":" }"},{"lineNumber":785,"author":{"gitId":"-"},"content":""},{"lineNumber":786,"author":{"gitId":"-"},"content":" public void setIgnoreCommitList(List\u003cCommitHash\u003e ignoreCommitList) {"},{"lineNumber":787,"author":{"gitId":"-"},"content":" this.ignoreCommitList \u003d ignoreCommitList;"},{"lineNumber":788,"author":{"gitId":"-"},"content":" }"},{"lineNumber":789,"author":{"gitId":"-"},"content":""},{"lineNumber":790,"author":{"gitId":"-"},"content":" public List\u003cString\u003e getIgnoredAuthorsList() {"},{"lineNumber":791,"author":{"gitId":"-"},"content":" return this.ignoredAuthorsList;"},{"lineNumber":792,"author":{"gitId":"-"},"content":" }"},{"lineNumber":793,"author":{"gitId":"-"},"content":""},{"lineNumber":794,"author":{"gitId":"-"},"content":" public void setIgnoredAuthorsList(List\u003cString\u003e ignoredAuthorsList) {"},{"lineNumber":795,"author":{"gitId":"-"},"content":" this.ignoredAuthorsList \u003d ignoredAuthorsList;"},{"lineNumber":796,"author":{"gitId":"-"},"content":" }"},{"lineNumber":797,"author":{"gitId":"-"},"content":""},{"lineNumber":798,"author":{"gitId":"-"},"content":" public boolean isIgnoredAuthorsListOverriding() {"},{"lineNumber":799,"author":{"gitId":"-"},"content":" return this.isIgnoredAuthorsListOverriding;"},{"lineNumber":800,"author":{"gitId":"-"},"content":" }"},{"lineNumber":801,"author":{"gitId":"-"},"content":""},{"lineNumber":802,"author":{"gitId":"-"},"content":" public void setIsLastModifiedDateIncluded(boolean lastModifiedDateIncluded) {"},{"lineNumber":803,"author":{"gitId":"-"},"content":" this.isLastModifiedDateIncluded \u003d lastModifiedDateIncluded;"},{"lineNumber":804,"author":{"gitId":"-"},"content":" }"},{"lineNumber":805,"author":{"gitId":"-"},"content":""},{"lineNumber":806,"author":{"gitId":"-"},"content":" public void setIsShallowCloningPerformed(boolean isShallowCloningPerformed) {"},{"lineNumber":807,"author":{"gitId":"-"},"content":" this.isShallowCloningPerformed \u003d isShallowCloningPerformed;"},{"lineNumber":808,"author":{"gitId":"-"},"content":" }"},{"lineNumber":809,"author":{"gitId":"-"},"content":""},{"lineNumber":810,"author":{"gitId":"-"},"content":" public void setIsFindingPreviousAuthorsPerformed(boolean isFindingPreviousAuthorsPerformed) {"},{"lineNumber":811,"author":{"gitId":"-"},"content":" this.isFindingPreviousAuthorsPerformed \u003d isFindingPreviousAuthorsPerformed;"},{"lineNumber":812,"author":{"gitId":"-"},"content":" }"},{"lineNumber":813,"author":{"gitId":"-"},"content":""},{"lineNumber":814,"author":{"gitId":"-"},"content":" public boolean isLastModifiedDateIncluded() {"},{"lineNumber":815,"author":{"gitId":"-"},"content":" return this.isLastModifiedDateIncluded;"},{"lineNumber":816,"author":{"gitId":"-"},"content":" }"},{"lineNumber":817,"author":{"gitId":"-"},"content":""},{"lineNumber":818,"author":{"gitId":"-"},"content":" public boolean isShallowCloningPerformed() {"},{"lineNumber":819,"author":{"gitId":"-"},"content":" return this.isShallowCloningPerformed;"},{"lineNumber":820,"author":{"gitId":"-"},"content":" }"},{"lineNumber":821,"author":{"gitId":"-"},"content":""},{"lineNumber":822,"author":{"gitId":"-"},"content":" public void setIsIgnoredAuthorsListOverriding(boolean isIgnoredAuthorsListOverriding) {"},{"lineNumber":823,"author":{"gitId":"-"},"content":" this.isIgnoredAuthorsListOverriding \u003d isIgnoredAuthorsListOverriding;"},{"lineNumber":824,"author":{"gitId":"-"},"content":" }"},{"lineNumber":825,"author":{"gitId":"-"},"content":""},{"lineNumber":826,"author":{"gitId":"-"},"content":" public void removeIgnoredAuthors() {"},{"lineNumber":827,"author":{"gitId":"-"},"content":" authorConfig.removeIgnoredAuthors(ignoredAuthorsList);"},{"lineNumber":828,"author":{"gitId":"-"},"content":" }"},{"lineNumber":829,"author":{"gitId":"-"},"content":""},{"lineNumber":830,"author":{"gitId":"-"},"content":" public List\u003cAuthor\u003e getAuthorList() {"},{"lineNumber":831,"author":{"gitId":"-"},"content":" return authorConfig.getAuthorList();"},{"lineNumber":832,"author":{"gitId":"-"},"content":" }"},{"lineNumber":833,"author":{"gitId":"-"},"content":""},{"lineNumber":834,"author":{"gitId":"-"},"content":" public void addAuthor(Author author) {"},{"lineNumber":835,"author":{"gitId":"-"},"content":" authorConfig.addAuthor(author, this.getIgnoreGlobList());"},{"lineNumber":836,"author":{"gitId":"-"},"content":" }"},{"lineNumber":837,"author":{"gitId":"-"},"content":""},{"lineNumber":838,"author":{"gitId":"-"},"content":" public void addAuthors(List\u003cAuthor\u003e authorList) {"},{"lineNumber":839,"author":{"gitId":"-"},"content":" authorConfig.addAuthors(authorList, this.getIgnoreGlobList());"},{"lineNumber":840,"author":{"gitId":"-"},"content":" }"},{"lineNumber":841,"author":{"gitId":"-"},"content":""},{"lineNumber":842,"author":{"gitId":"-"},"content":" public void setAuthorConfiguration(AuthorConfiguration authorConfig) {"},{"lineNumber":843,"author":{"gitId":"-"},"content":" this.authorConfig \u003d authorConfig;"},{"lineNumber":844,"author":{"gitId":"-"},"content":" for (Author author : authorConfig.getAuthorList()) {"},{"lineNumber":845,"author":{"gitId":"-"},"content":" AuthorConfiguration.propagateIgnoreGlobList(author, ignoreGlobList);"},{"lineNumber":846,"author":{"gitId":"-"},"content":" }"},{"lineNumber":847,"author":{"gitId":"-"},"content":" }"},{"lineNumber":848,"author":{"gitId":"-"},"content":""},{"lineNumber":849,"author":{"gitId":"-"},"content":" public boolean containsAuthor(Author author) {"},{"lineNumber":850,"author":{"gitId":"-"},"content":" return authorConfig.containsAuthor(author);"},{"lineNumber":851,"author":{"gitId":"-"},"content":" }"},{"lineNumber":852,"author":{"gitId":"-"},"content":""},{"lineNumber":853,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":854,"author":{"gitId":"-"},"content":" * Clears authors information and sets the {@code authorList} to {@link RepoConfiguration}."},{"lineNumber":855,"author":{"gitId":"-"},"content":" */"},{"lineNumber":856,"author":{"gitId":"-"},"content":" public void setAuthorList(List\u003cAuthor\u003e authorList) {"},{"lineNumber":857,"author":{"gitId":"-"},"content":" authorConfig.clear();"},{"lineNumber":858,"author":{"gitId":"-"},"content":" authorConfig.setAuthorList(authorList);"},{"lineNumber":859,"author":{"gitId":"-"},"content":" authorConfig.buildFromAuthorList();"},{"lineNumber":860,"author":{"gitId":"-"},"content":" authorList.forEach(author -\u003e AuthorConfiguration.propagateIgnoreGlobList(author, this.getIgnoreGlobList()));"},{"lineNumber":861,"author":{"gitId":"-"},"content":" }"},{"lineNumber":862,"author":{"gitId":"-"},"content":""},{"lineNumber":863,"author":{"gitId":"-"},"content":" public void setHasAuthorConfigFile(boolean hasAuthorConfigFile) {"},{"lineNumber":864,"author":{"gitId":"-"},"content":" authorConfig.setHasAuthorConfigFile(hasAuthorConfigFile);"},{"lineNumber":865,"author":{"gitId":"-"},"content":" }"},{"lineNumber":866,"author":{"gitId":"-"},"content":""},{"lineNumber":867,"author":{"gitId":"-"},"content":" public Map\u003cString, Author\u003e getAuthorNamesToAuthorMap() {"},{"lineNumber":868,"author":{"gitId":"-"},"content":" return authorConfig.getAuthorNamesToAuthorMap();"},{"lineNumber":869,"author":{"gitId":"-"},"content":" }"},{"lineNumber":870,"author":{"gitId":"-"},"content":""},{"lineNumber":871,"author":{"gitId":"-"},"content":" public void setAuthorNamesToAuthorMap(Map\u003cString, Author\u003e authorNamesToAuthorMap) {"},{"lineNumber":872,"author":{"gitId":"-"},"content":" authorConfig.setAuthorNamesToAuthorMap(authorNamesToAuthorMap);"},{"lineNumber":873,"author":{"gitId":"-"},"content":" }"},{"lineNumber":874,"author":{"gitId":"-"},"content":""},{"lineNumber":875,"author":{"gitId":"-"},"content":" public Map\u003cString, Author\u003e getAuthorEmailsToAuthorMap() {"},{"lineNumber":876,"author":{"gitId":"-"},"content":" return authorConfig.getAuthorEmailsToAuthorMap();"},{"lineNumber":877,"author":{"gitId":"-"},"content":" }"},{"lineNumber":878,"author":{"gitId":"-"},"content":""},{"lineNumber":879,"author":{"gitId":"-"},"content":" public void setAuthorEmailsToAuthorMap(Map\u003cString, Author\u003e authorEmailsToAuthorMap) {"},{"lineNumber":880,"author":{"gitId":"-"},"content":" authorConfig.setAuthorEmailsToAuthorMap(authorEmailsToAuthorMap);"},{"lineNumber":881,"author":{"gitId":"-"},"content":" }"},{"lineNumber":882,"author":{"gitId":"-"},"content":""},{"lineNumber":883,"author":{"gitId":"-"},"content":" public void clearAuthorDetailsToAuthorMap() {"},{"lineNumber":884,"author":{"gitId":"-"},"content":" authorConfig.clearAuthorDetailsToAuthorMap();"},{"lineNumber":885,"author":{"gitId":"-"},"content":" }"},{"lineNumber":886,"author":{"gitId":"-"},"content":""},{"lineNumber":887,"author":{"gitId":"-"},"content":" public void setFormats(List\u003cFileType\u003e formats) {"},{"lineNumber":888,"author":{"gitId":"-"},"content":" fileTypeManager.setFormats(formats);"},{"lineNumber":889,"author":{"gitId":"-"},"content":" }"},{"lineNumber":890,"author":{"gitId":"-"},"content":""},{"lineNumber":891,"author":{"gitId":"-"},"content":" private void setGroups(List\u003cFileType\u003e groups) {"},{"lineNumber":892,"author":{"gitId":"-"},"content":" fileTypeManager.setGroups(groups);"},{"lineNumber":893,"author":{"gitId":"-"},"content":" }"},{"lineNumber":894,"author":{"gitId":"-"},"content":""},{"lineNumber":895,"author":{"gitId":"-"},"content":" public void addGroups(List\u003cFileType\u003e groups) {"},{"lineNumber":896,"author":{"gitId":"-"},"content":" fileTypeManager.addGroups(groups);"},{"lineNumber":897,"author":{"gitId":"-"},"content":" }"},{"lineNumber":898,"author":{"gitId":"-"},"content":""},{"lineNumber":899,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":900,"author":{"gitId":"-"},"content":" * Returns all format or group types (depending on whether the user has specified a custom grouping)."},{"lineNumber":901,"author":{"gitId":"-"},"content":" */"},{"lineNumber":902,"author":{"gitId":"-"},"content":" public List\u003cFileType\u003e getAllFileTypes() {"},{"lineNumber":903,"author":{"gitId":"-"},"content":" return fileTypeManager.getAllFileTypes();"},{"lineNumber":904,"author":{"gitId":"-"},"content":" }"},{"lineNumber":905,"author":{"gitId":"-"},"content":""},{"lineNumber":906,"author":{"gitId":"-"},"content":" public FileType getFileType(String fileName) {"},{"lineNumber":907,"author":{"gitId":"-"},"content":" return fileTypeManager.getFileType(fileName);"},{"lineNumber":908,"author":{"gitId":"-"},"content":" }"},{"lineNumber":909,"author":{"gitId":"-"},"content":""},{"lineNumber":910,"author":{"gitId":"-"},"content":" public FileTypeManager getFileTypeManager() {"},{"lineNumber":911,"author":{"gitId":"-"},"content":" return fileTypeManager;"},{"lineNumber":912,"author":{"gitId":"-"},"content":" }"},{"lineNumber":913,"author":{"gitId":"-"},"content":""},{"lineNumber":914,"author":{"gitId":"-"},"content":" public LocalDateTime getSinceDate() {"},{"lineNumber":915,"author":{"gitId":"-"},"content":" return sinceDate;"},{"lineNumber":916,"author":{"gitId":"-"},"content":" }"},{"lineNumber":917,"author":{"gitId":"-"},"content":""},{"lineNumber":918,"author":{"gitId":"-"},"content":" public void setSinceDate(LocalDateTime sinceDate) {"},{"lineNumber":919,"author":{"gitId":"-"},"content":" this.sinceDate \u003d sinceDate;"},{"lineNumber":920,"author":{"gitId":"-"},"content":" }"},{"lineNumber":921,"author":{"gitId":"-"},"content":""},{"lineNumber":922,"author":{"gitId":"-"},"content":" public LocalDateTime getUntilDate() {"},{"lineNumber":923,"author":{"gitId":"-"},"content":" return untilDate;"},{"lineNumber":924,"author":{"gitId":"-"},"content":" }"},{"lineNumber":925,"author":{"gitId":"-"},"content":""},{"lineNumber":926,"author":{"gitId":"-"},"content":" public void setUntilDate(LocalDateTime untilDate) {"},{"lineNumber":927,"author":{"gitId":"-"},"content":" this.untilDate \u003d untilDate;"},{"lineNumber":928,"author":{"gitId":"-"},"content":" }"},{"lineNumber":929,"author":{"gitId":"-"},"content":""},{"lineNumber":930,"author":{"gitId":"-"},"content":" public ZoneId getZoneId() {"},{"lineNumber":931,"author":{"gitId":"-"},"content":" return zoneId;"},{"lineNumber":932,"author":{"gitId":"-"},"content":" }"},{"lineNumber":933,"author":{"gitId":"-"},"content":""},{"lineNumber":934,"author":{"gitId":"-"},"content":" public void setZoneId(ZoneId zoneId) {"},{"lineNumber":935,"author":{"gitId":"-"},"content":" this.zoneId \u003d zoneId;"},{"lineNumber":936,"author":{"gitId":"-"},"content":" }"},{"lineNumber":937,"author":{"gitId":"-"},"content":""},{"lineNumber":938,"author":{"gitId":"-"},"content":" public void setAuthorDisplayName(Author author, String displayName) {"},{"lineNumber":939,"author":{"gitId":"-"},"content":" authorConfig.setAuthorDisplayName(author, displayName);"},{"lineNumber":940,"author":{"gitId":"-"},"content":" }"},{"lineNumber":941,"author":{"gitId":"-"},"content":""},{"lineNumber":942,"author":{"gitId":"-"},"content":" public void addAuthorNamesToAuthorMapEntry(Author author, String name) {"},{"lineNumber":943,"author":{"gitId":"-"},"content":" authorConfig.addAuthorNamesToAuthorMapEntry(author, name);"},{"lineNumber":944,"author":{"gitId":"-"},"content":" }"},{"lineNumber":945,"author":{"gitId":"-"},"content":""},{"lineNumber":946,"author":{"gitId":"-"},"content":" public void addAuthorNamesToAuthorMapEntry(Author author, List\u003cString\u003e names) {"},{"lineNumber":947,"author":{"gitId":"-"},"content":" authorConfig.addAuthorNamesToAuthorMapEntry(author, names);"},{"lineNumber":948,"author":{"gitId":"-"},"content":" }"},{"lineNumber":949,"author":{"gitId":"-"},"content":""},{"lineNumber":950,"author":{"gitId":"-"},"content":" public void addAuthorEmailsToAuthorMapEntry(Author author, List\u003cString\u003e emails) {"},{"lineNumber":951,"author":{"gitId":"-"},"content":" authorConfig.addAuthorEmailsToAuthorMapEntry(author, emails);"},{"lineNumber":952,"author":{"gitId":"-"},"content":" }"},{"lineNumber":953,"author":{"gitId":"-"},"content":""},{"lineNumber":954,"author":{"gitId":"-"},"content":" public String getDisplayName() {"},{"lineNumber":955,"author":{"gitId":"-"},"content":" return displayName;"},{"lineNumber":956,"author":{"gitId":"-"},"content":" }"},{"lineNumber":957,"author":{"gitId":"-"},"content":""},{"lineNumber":958,"author":{"gitId":"-"},"content":" public String getRepoName() {"},{"lineNumber":959,"author":{"gitId":"-"},"content":" return location.getRepoName();"},{"lineNumber":960,"author":{"gitId":"-"},"content":" }"},{"lineNumber":961,"author":{"gitId":"-"},"content":""},{"lineNumber":962,"author":{"gitId":"-"},"content":" public String getOutputFolderName() {"},{"lineNumber":963,"author":{"gitId":"-"},"content":" return outputFolderName;"},{"lineNumber":964,"author":{"gitId":"-"},"content":" }"},{"lineNumber":965,"author":{"gitId":"-"},"content":""},{"lineNumber":966,"author":{"gitId":"-"},"content":" public void setStandaloneConfigIgnored(boolean isStandaloneConfigIgnored) {"},{"lineNumber":967,"author":{"gitId":"-"},"content":" this.isStandaloneConfigIgnored \u003d isStandaloneConfigIgnored;"},{"lineNumber":968,"author":{"gitId":"-"},"content":" }"},{"lineNumber":969,"author":{"gitId":"-"},"content":""},{"lineNumber":970,"author":{"gitId":"-"},"content":" public void setFileSizeLimitIgnored(boolean isFileSizeLimitIgnored) {"},{"lineNumber":971,"author":{"gitId":"-"},"content":" this.isFileSizeLimitIgnored \u003d isFileSizeLimitIgnored;"},{"lineNumber":972,"author":{"gitId":"-"},"content":" }"},{"lineNumber":973,"author":{"gitId":"-"},"content":""},{"lineNumber":974,"author":{"gitId":"-"},"content":" public RepoLocation getLocation() {"},{"lineNumber":975,"author":{"gitId":"-"},"content":" return location;"},{"lineNumber":976,"author":{"gitId":"-"},"content":" }"},{"lineNumber":977,"author":{"gitId":"-"},"content":""},{"lineNumber":978,"author":{"gitId":"-"},"content":" public String getOrganization() {"},{"lineNumber":979,"author":{"gitId":"-"},"content":" return location.getOrganization();"},{"lineNumber":980,"author":{"gitId":"-"},"content":" }"},{"lineNumber":981,"author":{"gitId":"-"},"content":""},{"lineNumber":982,"author":{"gitId":"-"},"content":" public boolean isStandaloneConfigIgnored() {"},{"lineNumber":983,"author":{"gitId":"-"},"content":" return isStandaloneConfigIgnored;"},{"lineNumber":984,"author":{"gitId":"-"},"content":" }"},{"lineNumber":985,"author":{"gitId":"-"},"content":""},{"lineNumber":986,"author":{"gitId":"-"},"content":" public boolean isFileSizeLimitIgnored() {"},{"lineNumber":987,"author":{"gitId":"-"},"content":" return isFileSizeLimitIgnored;"},{"lineNumber":988,"author":{"gitId":"-"},"content":" }"},{"lineNumber":989,"author":{"gitId":"-"},"content":""},{"lineNumber":990,"author":{"gitId":"-"},"content":" public boolean isIgnoredFileAnalysisSkipped() {"},{"lineNumber":991,"author":{"gitId":"-"},"content":" return isIgnoredFileAnalysisSkipped;"},{"lineNumber":992,"author":{"gitId":"-"},"content":" }"},{"lineNumber":993,"author":{"gitId":"-"},"content":""},{"lineNumber":994,"author":{"gitId":"-"},"content":" public boolean isFormatsOverriding() {"},{"lineNumber":995,"author":{"gitId":"-"},"content":" return isFormatsOverriding;"},{"lineNumber":996,"author":{"gitId":"-"},"content":" }"},{"lineNumber":997,"author":{"gitId":"-"},"content":""},{"lineNumber":998,"author":{"gitId":"-"},"content":" public boolean isIgnoreGlobListOverriding() {"},{"lineNumber":999,"author":{"gitId":"-"},"content":" return isIgnoreGlobListOverriding;"},{"lineNumber":1000,"author":{"gitId":"-"},"content":" }"},{"lineNumber":1001,"author":{"gitId":"-"},"content":""},{"lineNumber":1002,"author":{"gitId":"-"},"content":" public boolean isIgnoreCommitListOverriding() {"},{"lineNumber":1003,"author":{"gitId":"-"},"content":" return isIgnoreCommitListOverriding;"},{"lineNumber":1004,"author":{"gitId":"-"},"content":" }"},{"lineNumber":1005,"author":{"gitId":"-"},"content":""},{"lineNumber":1006,"author":{"gitId":"-"},"content":" public boolean isFileSizeLimitOverriding() {"},{"lineNumber":1007,"author":{"gitId":"-"},"content":" return isFileSizeLimitOverriding;"},{"lineNumber":1008,"author":{"gitId":"-"},"content":" }"},{"lineNumber":1009,"author":{"gitId":"-"},"content":""},{"lineNumber":1010,"author":{"gitId":"-"},"content":" public boolean isFindingPreviousAuthorsPerformed() {"},{"lineNumber":1011,"author":{"gitId":"-"},"content":" return isFindingPreviousAuthorsPerformed;"},{"lineNumber":1012,"author":{"gitId":"-"},"content":" }"},{"lineNumber":1013,"author":{"gitId":"-"},"content":""},{"lineNumber":1014,"author":{"gitId":"-"},"content":" public AuthorConfiguration getAuthorConfig() {"},{"lineNumber":1015,"author":{"gitId":"-"},"content":" return authorConfig;"},{"lineNumber":1016,"author":{"gitId":"-"},"content":" }"},{"lineNumber":1017,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":400,"-":617}},{"path":"src/main/java/reposense/model/RepoLocation.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.model;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static reposense.util.FileUtil.isValidPath;"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.net.URI;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.net.URISyntaxException;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.FileSystems;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Map;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Optional;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.regex.Matcher;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.regex.Pattern;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"import reposense.git.GitRemote;"},{"lineNumber":15,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidLocationException;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import reposense.report.ErrorSummary;"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import reposense.util.StringsUtil;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import reposense.util.SystemUtil;"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Represents a repository location."},{"lineNumber":22,"author":{"gitId":"-"},"content":" */"},{"lineNumber":23,"author":{"gitId":"-"},"content":"public class RepoLocation {"},{"lineNumber":24,"author":{"gitId":"-"},"content":" protected static final String UNSUPPORTED_DOMAIN_NAME \u003d \"NOT_RECOGNIZED\";"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final String MESSAGE_INVALID_LOCATION \u003d \"%s is an invalid location.\";"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final String MESSAGE_INVALID_REMOTE_URL \u003d \"%s is an invalid remote URL.\";"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" private static final String REPO_NAME_REGEX \u003d \"(?\u003crepoName\u003e[^/]+?)(/?\\\\.git)?/?\";"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String PATH_TO_REPO_REGEX \u003d \"(?\u003cpath\u003e.*?)/?\" + REPO_NAME_REGEX;"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final Pattern GIT_REPOSITORY_LOCATION_PATTERN \u003d"},{"lineNumber":32,"author":{"gitId":"-"},"content":" Pattern.compile(\"^(ssh|git|https?|ftps?)://(?\u003cdomain\u003e[^/]*?)/\" + PATH_TO_REPO_REGEX + \"$\");"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final Pattern SCP_LIKE_SSH_REPOSITORY_LOCATION_PATTERN \u003d"},{"lineNumber":34,"author":{"gitId":"-"},"content":" Pattern.compile(\"^(.*@)?(?\u003cdomain\u003e.*?):(?\u003cpath\u003e[^/].*?)??/??\" + REPO_NAME_REGEX + \"$\");"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private static final Pattern LOCAL_REPOSITORY_NON_WINDOWS_LOCATION_PATTERN \u003d"},{"lineNumber":36,"author":{"gitId":"-"},"content":" Pattern.compile(\"^(file://)?\" + PATH_TO_REPO_REGEX + \"$\");"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private static final Pattern LOCAL_REPOSITORY_WINDOWS_LOCATION_PATTERN \u003d"},{"lineNumber":38,"author":{"gitId":"-"},"content":" Pattern.compile(\"^\" + PATH_TO_REPO_REGEX.replaceAll(\"/\", \"\\\\\\\\\\\\\\\\\") + \"$\");"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private static final Pattern DOMAIN_NAME_PATTERN \u003d Pattern.compile(\"^(ww.\\\\.)?+(.*@)?(?\u003cdomainName\u003e[^.]+)\\\\..+$\");"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" private static final String GROUP_REPO_NAME \u003d \"repoName\";"},{"lineNumber":42,"author":{"gitId":"-"},"content":" private static final String GROUP_PATH \u003d \"path\";"},{"lineNumber":43,"author":{"gitId":"-"},"content":" private static final String GROUP_DOMAIN_NAME \u003d \"domainName\";"},{"lineNumber":44,"author":{"gitId":"-"},"content":" private static final String GROUP_DOMAIN \u003d \"domain\";"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":" private static final String PATH_SEPARATOR_REPLACEMENT \u003d \"-\";"},{"lineNumber":47,"author":{"gitId":"-"},"content":""},{"lineNumber":48,"author":{"gitId":"-"},"content":" // Used for remote link generation (serialized)"},{"lineNumber":49,"author":{"gitId":"-"},"content":" private final String location;"},{"lineNumber":50,"author":{"gitId":"-"},"content":" private final String repoName;"},{"lineNumber":51,"author":{"gitId":"-"},"content":" private final String organization;"},{"lineNumber":52,"author":{"gitId":"-"},"content":" private final String domainName;"},{"lineNumber":53,"author":{"gitId":"-"},"content":""},{"lineNumber":54,"author":{"gitId":"-"},"content":" // Used for generation of local repository report output directory"},{"lineNumber":55,"author":{"gitId":"-"},"content":" private final transient String outputFolderRepoName;"},{"lineNumber":56,"author":{"gitId":"-"},"content":" private final transient String outputFolderOrganization;"},{"lineNumber":57,"author":{"gitId":"-"},"content":""},{"lineNumber":58,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * Creates {@link RepoLocation} based on the {@code location}, which is represented by a {@code URL}"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * or {@link Path}."},{"lineNumber":61,"author":{"gitId":"-"},"content":" *"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * @throws InvalidLocationException if {@code location} cannot be represented by a {@code URL} or {@link Path}."},{"lineNumber":63,"author":{"gitId":"-"},"content":" */"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public RepoLocation(String location) throws InvalidLocationException {"},{"lineNumber":65,"author":{"gitId":"-"},"content":" if (SystemUtil.isWindows()) {"},{"lineNumber":66,"author":{"gitId":"-"},"content":" location \u003d StringsUtil.removeTrailingBackslash(location);"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }"},{"lineNumber":68,"author":{"gitId":"-"},"content":""},{"lineNumber":69,"author":{"gitId":"-"},"content":" this.location \u003d location;"},{"lineNumber":70,"author":{"gitId":"-"},"content":" String[] remoteRepoNameAndOrg;"},{"lineNumber":71,"author":{"gitId":"-"},"content":" String[] outputFolderRepoNameAndOrg;"},{"lineNumber":72,"author":{"gitId":"-"},"content":" if (location.isEmpty()) {"},{"lineNumber":73,"author":{"gitId":"-"},"content":" remoteRepoNameAndOrg \u003d new String[] {\"\", \"\", UNSUPPORTED_DOMAIN_NAME};"},{"lineNumber":74,"author":{"gitId":"-"},"content":" outputFolderRepoNameAndOrg \u003d remoteRepoNameAndOrg;"},{"lineNumber":75,"author":{"gitId":"-"},"content":" } else if (isLocalRepo(location)) {"},{"lineNumber":76,"author":{"gitId":"-"},"content":" outputFolderRepoNameAndOrg \u003d getLocalRepoNameAndOrg(location);"},{"lineNumber":77,"author":{"gitId":"-"},"content":""},{"lineNumber":78,"author":{"gitId":"-"},"content":" Map\u003cString, String\u003e remotes \u003d GitRemote.getRemotes(location);"},{"lineNumber":79,"author":{"gitId":"-"},"content":" String newLocation \u003d GitRemote.getAvailableRemoteLocation(remotes).orElse(location);"},{"lineNumber":80,"author":{"gitId":"-"},"content":""},{"lineNumber":81,"author":{"gitId":"-"},"content":" remoteRepoNameAndOrg \u003d remotes.size() \u003d\u003d 0"},{"lineNumber":82,"author":{"gitId":"-"},"content":" ? outputFolderRepoNameAndOrg"},{"lineNumber":83,"author":{"gitId":"-"},"content":" : getRemoteRepoNameAndOrg(newLocation);"},{"lineNumber":84,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":85,"author":{"gitId":"-"},"content":" remoteRepoNameAndOrg \u003d getRemoteRepoNameAndOrg(location);"},{"lineNumber":86,"author":{"gitId":"-"},"content":" outputFolderRepoNameAndOrg \u003d remoteRepoNameAndOrg;"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }"},{"lineNumber":88,"author":{"gitId":"-"},"content":""},{"lineNumber":89,"author":{"gitId":"-"},"content":" this.repoName \u003d remoteRepoNameAndOrg[0];"},{"lineNumber":90,"author":{"gitId":"-"},"content":" this.organization \u003d remoteRepoNameAndOrg[1];"},{"lineNumber":91,"author":{"gitId":"-"},"content":" this.domainName \u003d remoteRepoNameAndOrg[2];"},{"lineNumber":92,"author":{"gitId":"-"},"content":""},{"lineNumber":93,"author":{"gitId":"-"},"content":" this.outputFolderRepoName \u003d outputFolderRepoNameAndOrg[0];"},{"lineNumber":94,"author":{"gitId":"-"},"content":" this.outputFolderOrganization \u003d outputFolderRepoNameAndOrg[1];"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }"},{"lineNumber":96,"author":{"gitId":"-"},"content":""},{"lineNumber":97,"author":{"gitId":"-"},"content":" public boolean isEmpty() {"},{"lineNumber":98,"author":{"gitId":"-"},"content":" return location.isEmpty();"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }"},{"lineNumber":100,"author":{"gitId":"-"},"content":""},{"lineNumber":101,"author":{"gitId":"-"},"content":" public String getRepoName() {"},{"lineNumber":102,"author":{"gitId":"-"},"content":" return outputFolderRepoName;"},{"lineNumber":103,"author":{"gitId":"-"},"content":" }"},{"lineNumber":104,"author":{"gitId":"-"},"content":""},{"lineNumber":105,"author":{"gitId":"-"},"content":" public String getOrganization() {"},{"lineNumber":106,"author":{"gitId":"-"},"content":" return outputFolderOrganization;"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }"},{"lineNumber":108,"author":{"gitId":"-"},"content":""},{"lineNumber":109,"author":{"gitId":"-"},"content":" public String getDomainName() {"},{"lineNumber":110,"author":{"gitId":"-"},"content":" return domainName;"},{"lineNumber":111,"author":{"gitId":"-"},"content":" }"},{"lineNumber":112,"author":{"gitId":"-"},"content":""},{"lineNumber":113,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":114,"author":{"gitId":"-"},"content":" * Returns true if {@code repoArgument} is a valid local repository argument."},{"lineNumber":115,"author":{"gitId":"-"},"content":" * This implementation follows directly from the {@code git clone}"},{"lineNumber":116,"author":{"gitId":"-"},"content":" * \u003ca href\u003d\"https://git-scm.com/docs/git-clone#_git_urls\"\u003especification\u003c/a\u003e."},{"lineNumber":117,"author":{"gitId":"-"},"content":" */"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public static boolean isLocalRepo(String repoArgument) {"},{"lineNumber":119,"author":{"gitId":"-"},"content":" if (!repoArgument.contains(\":\")) {"},{"lineNumber":120,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }"},{"lineNumber":122,"author":{"gitId":"-"},"content":""},{"lineNumber":123,"author":{"gitId":"-"},"content":" boolean hasSlashBeforeFirstColon \u003d repoArgument.split(\":\", 2)[0].contains(\"/\");"},{"lineNumber":124,"author":{"gitId":"-"},"content":" if (hasSlashBeforeFirstColon) {"},{"lineNumber":125,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }"},{"lineNumber":127,"author":{"gitId":"-"},"content":""},{"lineNumber":128,"author":{"gitId":"-"},"content":" // checks if it is a URL file protocol"},{"lineNumber":129,"author":{"gitId":"-"},"content":" String urlProtocol \u003d repoArgument.split(\"://\", 2)[0];"},{"lineNumber":130,"author":{"gitId":"-"},"content":" if (urlProtocol.equals(\"file\")) {"},{"lineNumber":131,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }"},{"lineNumber":133,"author":{"gitId":"-"},"content":""},{"lineNumber":134,"author":{"gitId":"-"},"content":" // catch disk drive arguments such as C:\\"},{"lineNumber":135,"author":{"gitId":"-"},"content":" if (SystemUtil.isWindows() \u0026\u0026 isValidPath(repoArgument)) {"},{"lineNumber":136,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }"},{"lineNumber":138,"author":{"gitId":"-"},"content":""},{"lineNumber":139,"author":{"gitId":"-"},"content":" return false;"},{"lineNumber":140,"author":{"gitId":"-"},"content":" }"},{"lineNumber":141,"author":{"gitId":"-"},"content":""},{"lineNumber":142,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":143,"author":{"gitId":"-"},"content":" * Returns a best-guess repo name and organization from the given local repo {@code location}."},{"lineNumber":144,"author":{"gitId":"-"},"content":" * The return is a length-3 string array with the repo name at index 0, organization at index 1"},{"lineNumber":145,"author":{"gitId":"-"},"content":" * and domain name (unsupported domain) at index 2."},{"lineNumber":146,"author":{"gitId":"-"},"content":" *"},{"lineNumber":147,"author":{"gitId":"-"},"content":" * @throws InvalidLocationException if the location specified is not a proper local repository."},{"lineNumber":148,"author":{"gitId":"-"},"content":" */"},{"lineNumber":149,"author":{"gitId":"-"},"content":" private String[] getLocalRepoNameAndOrg(String location) throws InvalidLocationException {"},{"lineNumber":150,"author":{"gitId":"-"},"content":" boolean isWindows \u003d SystemUtil.isWindows();"},{"lineNumber":151,"author":{"gitId":"-"},"content":" if (isWindows) {"},{"lineNumber":152,"author":{"gitId":"-"},"content":" location \u003d location.replaceAll(\"file://\", \"\");"},{"lineNumber":153,"author":{"gitId":"-"},"content":" location \u003d location.replaceAll(\"/\", \"\\\\\\\\\");"},{"lineNumber":154,"author":{"gitId":"-"},"content":" location \u003d location.replaceAll(\"[|:]\", \"-\");"},{"lineNumber":155,"author":{"gitId":"-"},"content":" }"},{"lineNumber":156,"author":{"gitId":"-"},"content":" Pattern localRepoPattern \u003d isWindows"},{"lineNumber":157,"author":{"gitId":"-"},"content":" ? LOCAL_REPOSITORY_WINDOWS_LOCATION_PATTERN"},{"lineNumber":158,"author":{"gitId":"-"},"content":" : LOCAL_REPOSITORY_NON_WINDOWS_LOCATION_PATTERN;"},{"lineNumber":159,"author":{"gitId":"-"},"content":" Matcher localRepoMatcher \u003d localRepoPattern.matcher(location);"},{"lineNumber":160,"author":{"gitId":"-"},"content":""},{"lineNumber":161,"author":{"gitId":"-"},"content":" if (!localRepoMatcher.matches()) {"},{"lineNumber":162,"author":{"gitId":"-"},"content":" ErrorSummary.getInstance().addErrorMessage(location,"},{"lineNumber":163,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_LOCATION, location));"},{"lineNumber":164,"author":{"gitId":"-"},"content":" throw new InvalidLocationException(String.format(MESSAGE_INVALID_LOCATION, location));"},{"lineNumber":165,"author":{"gitId":"-"},"content":" }"},{"lineNumber":166,"author":{"gitId":"-"},"content":""},{"lineNumber":167,"author":{"gitId":"-"},"content":" String tempRepoName \u003d localRepoMatcher.group(GROUP_REPO_NAME);"},{"lineNumber":168,"author":{"gitId":"-"},"content":" String tempOrganization \u003d getOrganizationFromMatcher(localRepoMatcher);"},{"lineNumber":169,"author":{"gitId":"-"},"content":" return new String[] {tempRepoName, tempOrganization, UNSUPPORTED_DOMAIN_NAME};"},{"lineNumber":170,"author":{"gitId":"-"},"content":" }"},{"lineNumber":171,"author":{"gitId":"-"},"content":""},{"lineNumber":172,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":173,"author":{"gitId":"-"},"content":" * Returns a best-guess repo name, organization and domain name from the given remote repo"},{"lineNumber":174,"author":{"gitId":"-"},"content":" * {@code location}. The return is a length-3 string array with the repo name at index 0,"},{"lineNumber":175,"author":{"gitId":"-"},"content":" * organization at index 1 and domain name at index 2."},{"lineNumber":176,"author":{"gitId":"-"},"content":" *"},{"lineNumber":177,"author":{"gitId":"-"},"content":" * @throws InvalidLocationException if the location specified is not a proper remote repository."},{"lineNumber":178,"author":{"gitId":"-"},"content":" */"},{"lineNumber":179,"author":{"gitId":"-"},"content":" private String[] getRemoteRepoNameAndOrg(String location) throws InvalidLocationException {"},{"lineNumber":180,"author":{"gitId":"-"},"content":" Matcher remoteRepoMatcher \u003d GIT_REPOSITORY_LOCATION_PATTERN.matcher(location);"},{"lineNumber":181,"author":{"gitId":"-"},"content":" Matcher sshRepoMatcher \u003d SCP_LIKE_SSH_REPOSITORY_LOCATION_PATTERN.matcher(location);"},{"lineNumber":182,"author":{"gitId":"-"},"content":""},{"lineNumber":183,"author":{"gitId":"-"},"content":" boolean isNormalUrl \u003d remoteRepoMatcher.matches();"},{"lineNumber":184,"author":{"gitId":"-"},"content":" if (isNormalUrl) {"},{"lineNumber":185,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":186,"author":{"gitId":"-"},"content":" new URI(location);"},{"lineNumber":187,"author":{"gitId":"-"},"content":" } catch (URISyntaxException e) {"},{"lineNumber":188,"author":{"gitId":"-"},"content":" ErrorSummary.getInstance().addErrorMessage(location,"},{"lineNumber":189,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_REMOTE_URL, location));"},{"lineNumber":190,"author":{"gitId":"-"},"content":" throw new InvalidLocationException(String.format(MESSAGE_INVALID_REMOTE_URL, location));"},{"lineNumber":191,"author":{"gitId":"-"},"content":" }"},{"lineNumber":192,"author":{"gitId":"-"},"content":" }"},{"lineNumber":193,"author":{"gitId":"-"},"content":" boolean isValidRemoteRepoUrl \u003d remoteRepoMatcher.matches() || sshRepoMatcher.matches();"},{"lineNumber":194,"author":{"gitId":"-"},"content":" if (!isValidRemoteRepoUrl) {"},{"lineNumber":195,"author":{"gitId":"-"},"content":" ErrorSummary.getInstance().addErrorMessage(location,"},{"lineNumber":196,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_REMOTE_URL, location));"},{"lineNumber":197,"author":{"gitId":"-"},"content":" throw new InvalidLocationException(String.format(MESSAGE_INVALID_REMOTE_URL, location));"},{"lineNumber":198,"author":{"gitId":"-"},"content":" }"},{"lineNumber":199,"author":{"gitId":"-"},"content":""},{"lineNumber":200,"author":{"gitId":"-"},"content":" // priority for standard URL matches over SSH as SSH matcher will normally also match standard URL"},{"lineNumber":201,"author":{"gitId":"-"},"content":" Matcher actualMatcher \u003d remoteRepoMatcher.matches() ? remoteRepoMatcher : sshRepoMatcher;"},{"lineNumber":202,"author":{"gitId":"-"},"content":" String tempRepoName \u003d actualMatcher.group(GROUP_REPO_NAME);"},{"lineNumber":203,"author":{"gitId":"-"},"content":" String tempOrganization \u003d getOrganizationFromMatcher(actualMatcher);"},{"lineNumber":204,"author":{"gitId":"-"},"content":""},{"lineNumber":205,"author":{"gitId":"-"},"content":" return new String[] {tempRepoName, tempOrganization,"},{"lineNumber":206,"author":{"gitId":"-"},"content":" getDomainNameFromDomain(actualMatcher.group(GROUP_DOMAIN))};"},{"lineNumber":207,"author":{"gitId":"-"},"content":" }"},{"lineNumber":208,"author":{"gitId":"-"},"content":""},{"lineNumber":209,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":210,"author":{"gitId":"-"},"content":" * Returns the organization string from the {@code matcher} if one exists."},{"lineNumber":211,"author":{"gitId":"-"},"content":" * If no match was found for it, returns an empty string instead."},{"lineNumber":212,"author":{"gitId":"-"},"content":" */"},{"lineNumber":213,"author":{"gitId":"-"},"content":" private static String getOrganizationFromMatcher(Matcher matcher) {"},{"lineNumber":214,"author":{"gitId":"-"},"content":" return Optional.ofNullable(matcher.group(GROUP_PATH))"},{"lineNumber":215,"author":{"gitId":"-"},"content":" .map(s -\u003e Paths.get(s).normalize().toString())"},{"lineNumber":216,"author":{"gitId":"-"},"content":" .map(s -\u003e s.replaceAll(Pattern.quote(FileSystems.getDefault().getSeparator()),"},{"lineNumber":217,"author":{"gitId":"-"},"content":" PATH_SEPARATOR_REPLACEMENT))"},{"lineNumber":218,"author":{"gitId":"-"},"content":" .orElse(\"\");"},{"lineNumber":219,"author":{"gitId":"-"},"content":" }"},{"lineNumber":220,"author":{"gitId":"-"},"content":""},{"lineNumber":221,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":222,"author":{"gitId":"-"},"content":" * Returns the domain name of the URL from the {@code matcher} if it is one of the recognised ones."},{"lineNumber":223,"author":{"gitId":"-"},"content":" * Returns {@code UNRECOGNISED_DOMAIN_NAME} if it is a local repo or not recognised."},{"lineNumber":224,"author":{"gitId":"-"},"content":" *"},{"lineNumber":225,"author":{"gitId":"-"},"content":" * @throws InvalidLocationException if the domain specified is not a proper domain name."},{"lineNumber":226,"author":{"gitId":"-"},"content":" */"},{"lineNumber":227,"author":{"gitId":"-"},"content":" public static String getDomainNameFromDomain(String domain) throws InvalidLocationException {"},{"lineNumber":228,"author":{"gitId":"-"},"content":" Matcher domainNameMatcher \u003d DOMAIN_NAME_PATTERN.matcher(domain);"},{"lineNumber":229,"author":{"gitId":"-"},"content":" if (!domainNameMatcher.matches()) {"},{"lineNumber":230,"author":{"gitId":"-"},"content":" throw new InvalidLocationException(MESSAGE_INVALID_REMOTE_URL);"},{"lineNumber":231,"author":{"gitId":"-"},"content":" }"},{"lineNumber":232,"author":{"gitId":"-"},"content":" String domainName \u003d domainNameMatcher.group(GROUP_DOMAIN_NAME);"},{"lineNumber":233,"author":{"gitId":"-"},"content":" return isSupportedDomainName(domainName)"},{"lineNumber":234,"author":{"gitId":"-"},"content":" ? domainName"},{"lineNumber":235,"author":{"gitId":"-"},"content":" : UNSUPPORTED_DOMAIN_NAME;"},{"lineNumber":236,"author":{"gitId":"-"},"content":" }"},{"lineNumber":237,"author":{"gitId":"-"},"content":""},{"lineNumber":238,"author":{"gitId":"-"},"content":" private static boolean isSupportedDomainName(String domainName) {"},{"lineNumber":239,"author":{"gitId":"-"},"content":" return SupportedDomainUrlMap.isSupportedDomainName(domainName);"},{"lineNumber":240,"author":{"gitId":"-"},"content":" }"},{"lineNumber":241,"author":{"gitId":"-"},"content":""},{"lineNumber":242,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":243,"author":{"gitId":"-"},"content":" public String toString() {"},{"lineNumber":244,"author":{"gitId":"-"},"content":" return location;"},{"lineNumber":245,"author":{"gitId":"-"},"content":" }"},{"lineNumber":246,"author":{"gitId":"-"},"content":""},{"lineNumber":247,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":248,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {"},{"lineNumber":249,"author":{"gitId":"-"},"content":" // short circuit if same object"},{"lineNumber":250,"author":{"gitId":"-"},"content":" if (this \u003d\u003d other) {"},{"lineNumber":251,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":252,"author":{"gitId":"-"},"content":" }"},{"lineNumber":253,"author":{"gitId":"-"},"content":""},{"lineNumber":254,"author":{"gitId":"-"},"content":" // instanceof handles null"},{"lineNumber":255,"author":{"gitId":"-"},"content":" if (!(other instanceof RepoLocation)) {"},{"lineNumber":256,"author":{"gitId":"-"},"content":" return false;"},{"lineNumber":257,"author":{"gitId":"-"},"content":" }"},{"lineNumber":258,"author":{"gitId":"-"},"content":""},{"lineNumber":259,"author":{"gitId":"-"},"content":" RepoLocation otherLocation \u003d (RepoLocation) other;"},{"lineNumber":260,"author":{"gitId":"-"},"content":" return this.location.equals(otherLocation.location)"},{"lineNumber":261,"author":{"gitId":"-"},"content":" \u0026\u0026 this.repoName.equals(otherLocation.repoName)"},{"lineNumber":262,"author":{"gitId":"-"},"content":" \u0026\u0026 this.organization.equals(otherLocation.organization)"},{"lineNumber":263,"author":{"gitId":"-"},"content":" \u0026\u0026 this.domainName.equals(otherLocation.domainName)"},{"lineNumber":264,"author":{"gitId":"-"},"content":" \u0026\u0026 this.outputFolderRepoName.equals(otherLocation.outputFolderRepoName)"},{"lineNumber":265,"author":{"gitId":"-"},"content":" \u0026\u0026 this.outputFolderOrganization.equals(otherLocation.outputFolderOrganization);"},{"lineNumber":266,"author":{"gitId":"-"},"content":" }"},{"lineNumber":267,"author":{"gitId":"-"},"content":""},{"lineNumber":268,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":269,"author":{"gitId":"-"},"content":" public int hashCode() {"},{"lineNumber":270,"author":{"gitId":"-"},"content":" return location.hashCode();"},{"lineNumber":271,"author":{"gitId":"-"},"content":" }"},{"lineNumber":272,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":271}},{"path":"src/main/java/reposense/model/RunConfiguration.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.model;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidCsvException;"},{"lineNumber":7,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidHeaderException;"},{"lineNumber":8,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.ParseException;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Interface to get configurations for current RepoSense run."},{"lineNumber":12,"author":{"gitId":"-"},"content":" */"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public interface RunConfiguration {"},{"lineNumber":14,"author":{"gitId":"-"},"content":""},{"lineNumber":15,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e getRepoConfigurations()"},{"lineNumber":16,"author":{"gitId":"-"},"content":" throws ParseException, IOException, InvalidCsvException, InvalidHeaderException;"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":3,"-":15}},{"path":"src/main/java/reposense/parser/ArgsParser.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.parser;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.File;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.io.IOException;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.time.LocalDateTime;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.time.ZoneId;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Collections;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Optional;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"import com.google.gson.JsonSyntaxException;"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.ArgumentParsers;"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.helper.HelpScreenException;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.impl.Arguments;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.impl.action.HelpArgumentAction;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.impl.action.VersionArgumentAction;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentGroup;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParser;"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParserException;"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.FeatureControl;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.MutuallyExclusiveGroup;"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.Namespace;"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import reposense.RepoSense;"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import reposense.model.CliArguments;"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import reposense.model.FileType;"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import reposense.model.ReportConfiguration;"},{"lineNumber":31,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.ParseException;"},{"lineNumber":32,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.AlphanumericArgumentType;"},{"lineNumber":33,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.AnalysisThreadsArgumentType;"},{"lineNumber":34,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.AssetsFolderArgumentType;"},{"lineNumber":35,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.CloningThreadsArgumentType;"},{"lineNumber":36,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.ConfigFolderArgumentType;"},{"lineNumber":37,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.OutputFolderArgumentType;"},{"lineNumber":38,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.PeriodArgumentType;"},{"lineNumber":39,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.ReportFolderArgumentType;"},{"lineNumber":40,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.SinceDateArgumentType;"},{"lineNumber":41,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.UntilDateArgumentType;"},{"lineNumber":42,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.ZoneIdArgumentType;"},{"lineNumber":43,"author":{"gitId":"-"},"content":"import reposense.system.LogsManager;"},{"lineNumber":44,"author":{"gitId":"-"},"content":"import reposense.util.TimeUtil;"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Verifies and parses a string-formatted date to a {@link CliArguments} object."},{"lineNumber":48,"author":{"gitId":"-"},"content":" */"},{"lineNumber":49,"author":{"gitId":"-"},"content":"public class ArgsParser {"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public static final String DEFAULT_REPORT_NAME \u003d \"reposense-report\";"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public static final int DEFAULT_NUM_CLONING_THREADS \u003d 4;"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public static final int DEFAULT_NUM_ANALYSIS_THREADS \u003d Runtime.getRuntime().availableProcessors();"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public static final boolean DEFAULT_IS_TEST_MODE \u003d false;"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public static final boolean DEFAULT_SHOULD_FRESH_CLONE \u003d false;"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":" public static final String[] HELP_FLAGS \u003d new String[] {\"--help\", \"-h\"};"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public static final String[] CONFIG_FLAGS \u003d new String[] {\"--config\", \"-c\"};"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public static final String[] REPO_FLAGS \u003d new String[] {\"--repo\", \"--repos\", \"-r\"};"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public static final String[] VIEW_FLAGS \u003d new String[] {\"--view\", \"-v\"};"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public static final String[] OUTPUT_FLAGS \u003d new String[] {\"--output\", \"-o\"};"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public static final String[] ASSETS_FLAGS \u003d new String[] {\"--assets\", \"-a\"};"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public static final String[] SINCE_FLAGS \u003d new String[] {\"--since\", \"-s\"};"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public static final String[] UNTIL_FLAGS \u003d new String[] {\"--until\", \"-u\"};"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public static final String[] PERIOD_FLAGS \u003d new String[] {\"--period\", \"-p\"};"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public static final String[] SHALLOW_CLONING_FLAGS \u003d new String[] {\"--shallow-cloning\", \"-S\"};"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public static final String[] FORMAT_FLAGS \u003d new String[] {\"--formats\", \"-f\"};"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public static final String[] IGNORE_CONFIG_FLAGS \u003d new String[] {\"--ignore-standalone-config\", \"-i\"};"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public static final String[] IGNORE_SIZELIMIT_FLAGS \u003d new String[] {\"--ignore-filesize-limit\", \"-I\"};"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public static final String[] TIMEZONE_FLAGS \u003d new String[] {\"--timezone\", \"-t\"};"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public static final String[] VERSION_FLAGS \u003d new String[] {\"--version\", \"-V\"};"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public static final String[] LAST_MODIFIED_DATE_FLAGS \u003d new String[] {\"--last-modified-date\", \"-l\"};"},{"lineNumber":72,"author":{"gitId":"-"},"content":" public static final String[] FIND_PREVIOUS_AUTHORS_FLAGS \u003d new String[] {\"--find-previous-authors\", \"-F\"};"},{"lineNumber":73,"author":{"gitId":"-"},"content":""},{"lineNumber":74,"author":{"gitId":"-"},"content":" public static final String[] CLONING_THREADS_FLAG \u003d new String[] {\"--cloning-threads\"};"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public static final String[] ANALYSIS_THREADS_FLAG \u003d new String[] {\"--analysis-threads\"};"},{"lineNumber":76,"author":{"gitId":"-"},"content":""},{"lineNumber":77,"author":{"gitId":"-"},"content":" public static final String[] TEST_MODE_FLAG \u003d new String[] {\"--test-mode\"};"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public static final String[] FRESH_CLONING_FLAG \u003d new String[] {\"--fresh-cloning\"};"},{"lineNumber":79,"author":{"gitId":"-"},"content":""},{"lineNumber":80,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsManager.getLogger(ArgsParser.class);"},{"lineNumber":81,"author":{"gitId":"-"},"content":""},{"lineNumber":82,"author":{"gitId":"-"},"content":" private static final String PROGRAM_USAGE \u003d \"java -jar RepoSense.jar\";"},{"lineNumber":83,"author":{"gitId":"-"},"content":" private static final String PROGRAM_DESCRIPTION \u003d"},{"lineNumber":84,"author":{"gitId":"-"},"content":" \"RepoSense is a contribution analysis tool for Git repositories.\";"},{"lineNumber":85,"author":{"gitId":"-"},"content":" private static final String MESSAGE_HEADER_MUTEX \u003d \"mutual exclusive arguments\";"},{"lineNumber":86,"author":{"gitId":"-"},"content":" private static final String MESSAGE_HEADER_TESTING \u003d \"test mode arguments\";"},{"lineNumber":87,"author":{"gitId":"-"},"content":" private static final String MESSAGE_HAVE_SINCE_DATE_UNTIL_DATE_AND_PERIOD \u003d"},{"lineNumber":88,"author":{"gitId":"-"},"content":" \"\\\"Since Date\\\", \\\"Until Date\\\", and \\\"Period\\\" cannot be applied together.\";"},{"lineNumber":89,"author":{"gitId":"-"},"content":" private static final String MESSAGE_USING_DEFAULT_CONFIG_PATH \u003d"},{"lineNumber":90,"author":{"gitId":"-"},"content":" \"Config path not provided, using the config folder as default.\";"},{"lineNumber":91,"author":{"gitId":"-"},"content":" private static final String MESSAGE_INVALID_CONFIG_PATH \u003d \"%s is malformed.\";"},{"lineNumber":92,"author":{"gitId":"-"},"content":" private static final String MESSAGE_INVALID_CONFIG_JSON \u003d \"%s Ignoring the report config provided.\";"},{"lineNumber":93,"author":{"gitId":"-"},"content":" private static final String MESSAGE_SINCE_D1_WITH_PERIOD \u003d \"You may be using --since d1 with the --period flag. \""},{"lineNumber":94,"author":{"gitId":"-"},"content":" + \"This may result in an incorrect date range being analysed.\";"},{"lineNumber":95,"author":{"gitId":"-"},"content":" private static final String MESSAGE_SINCE_DATE_LATER_THAN_UNTIL_DATE \u003d"},{"lineNumber":96,"author":{"gitId":"-"},"content":" \"\\\"Since Date\\\" cannot be later than \\\"Until Date\\\".\";"},{"lineNumber":97,"author":{"gitId":"-"},"content":" private static final String MESSAGE_SINCE_DATE_LATER_THAN_TODAY_DATE \u003d"},{"lineNumber":98,"author":{"gitId":"-"},"content":" \"\\\"Since Date\\\" must not be later than today\u0027s date.\";"},{"lineNumber":99,"author":{"gitId":"-"},"content":" private static final Path EMPTY_PATH \u003d Paths.get(\"\");"},{"lineNumber":100,"author":{"gitId":"-"},"content":" private static final Path DEFAULT_CONFIG_PATH \u003d Paths.get(System.getProperty(\"user.dir\")"},{"lineNumber":101,"author":{"gitId":"-"},"content":" + File.separator + \"config\" + File.separator);"},{"lineNumber":102,"author":{"gitId":"-"},"content":" private static final Path DEFAULT_ASSETS_PATH \u003d Paths.get(System.getProperty(\"user.dir\")"},{"lineNumber":103,"author":{"gitId":"-"},"content":" + File.separator + \"assets\" + File.separator);"},{"lineNumber":104,"author":{"gitId":"-"},"content":""},{"lineNumber":105,"author":{"gitId":"-"},"content":" private static ArgumentParser getArgumentParser() {"},{"lineNumber":106,"author":{"gitId":"-"},"content":" ArgumentParser parser \u003d ArgumentParsers"},{"lineNumber":107,"author":{"gitId":"-"},"content":" .newFor(PROGRAM_USAGE)"},{"lineNumber":108,"author":{"gitId":"-"},"content":" .addHelp(false)"},{"lineNumber":109,"author":{"gitId":"-"},"content":" .build()"},{"lineNumber":110,"author":{"gitId":"-"},"content":" .description(PROGRAM_DESCRIPTION);"},{"lineNumber":111,"author":{"gitId":"-"},"content":""},{"lineNumber":112,"author":{"gitId":"-"},"content":" MutuallyExclusiveGroup mutexParser \u003d parser"},{"lineNumber":113,"author":{"gitId":"-"},"content":" .addMutuallyExclusiveGroup(MESSAGE_HEADER_MUTEX)"},{"lineNumber":114,"author":{"gitId":"-"},"content":" .required(false);"},{"lineNumber":115,"author":{"gitId":"-"},"content":""},{"lineNumber":116,"author":{"gitId":"-"},"content":" MutuallyExclusiveGroup mutexParser2 \u003d parser"},{"lineNumber":117,"author":{"gitId":"-"},"content":" .addMutuallyExclusiveGroup(MESSAGE_HEADER_MUTEX)"},{"lineNumber":118,"author":{"gitId":"-"},"content":" .required(false);"},{"lineNumber":119,"author":{"gitId":"-"},"content":""},{"lineNumber":120,"author":{"gitId":"-"},"content":" ArgumentGroup argumentGroup \u003d parser"},{"lineNumber":121,"author":{"gitId":"-"},"content":" .addArgumentGroup(MESSAGE_HEADER_TESTING);"},{"lineNumber":122,"author":{"gitId":"-"},"content":""},{"lineNumber":123,"author":{"gitId":"-"},"content":" // Boolean flags"},{"lineNumber":124,"author":{"gitId":"-"},"content":" parser.addArgument(HELP_FLAGS)"},{"lineNumber":125,"author":{"gitId":"-"},"content":" .help(\"Show help message.\")"},{"lineNumber":126,"author":{"gitId":"-"},"content":" .action(new HelpArgumentAction());"},{"lineNumber":127,"author":{"gitId":"-"},"content":""},{"lineNumber":128,"author":{"gitId":"-"},"content":" parser.version(\"RepoSense \" + RepoSense.getVersion());"},{"lineNumber":129,"author":{"gitId":"-"},"content":" parser.addArgument(VERSION_FLAGS)"},{"lineNumber":130,"author":{"gitId":"-"},"content":" .help(\"Show the version of RepoSense.\")"},{"lineNumber":131,"author":{"gitId":"-"},"content":" .action(new VersionArgumentAction());"},{"lineNumber":132,"author":{"gitId":"-"},"content":""},{"lineNumber":133,"author":{"gitId":"-"},"content":" parser.addArgument(IGNORE_CONFIG_FLAGS)"},{"lineNumber":134,"author":{"gitId":"-"},"content":" .dest(IGNORE_CONFIG_FLAGS[0])"},{"lineNumber":135,"author":{"gitId":"-"},"content":" .action(Arguments.storeTrue())"},{"lineNumber":136,"author":{"gitId":"-"},"content":" .help(\"A flag to ignore the standalone config file in the repo.\");"},{"lineNumber":137,"author":{"gitId":"-"},"content":""},{"lineNumber":138,"author":{"gitId":"-"},"content":" parser.addArgument(IGNORE_SIZELIMIT_FLAGS)"},{"lineNumber":139,"author":{"gitId":"-"},"content":" .dest(IGNORE_SIZELIMIT_FLAGS[0])"},{"lineNumber":140,"author":{"gitId":"-"},"content":" .action(Arguments.storeTrue())"},{"lineNumber":141,"author":{"gitId":"-"},"content":" .help(\"A flag to ignore the filesize limit for analyzed files.\");"},{"lineNumber":142,"author":{"gitId":"-"},"content":""},{"lineNumber":143,"author":{"gitId":"-"},"content":" parser.addArgument(VIEW_FLAGS)"},{"lineNumber":144,"author":{"gitId":"-"},"content":" .dest(VIEW_FLAGS[0])"},{"lineNumber":145,"author":{"gitId":"-"},"content":" .nargs(\"?\")"},{"lineNumber":146,"author":{"gitId":"-"},"content":" .metavar(\"PATH\")"},{"lineNumber":147,"author":{"gitId":"-"},"content":" .type(new ReportFolderArgumentType())"},{"lineNumber":148,"author":{"gitId":"-"},"content":" .setConst(EMPTY_PATH)"},{"lineNumber":149,"author":{"gitId":"-"},"content":" .help(\"Starts a server to display the report in the provided directory. \""},{"lineNumber":150,"author":{"gitId":"-"},"content":" + \"If used as a flag (with no argument), \""},{"lineNumber":151,"author":{"gitId":"-"},"content":" + \"generates a report and automatically displays the report.\");"},{"lineNumber":152,"author":{"gitId":"-"},"content":""},{"lineNumber":153,"author":{"gitId":"-"},"content":" parser.addArgument(OUTPUT_FLAGS)"},{"lineNumber":154,"author":{"gitId":"-"},"content":" .dest(OUTPUT_FLAGS[0])"},{"lineNumber":155,"author":{"gitId":"-"},"content":" .metavar(\"PATH\")"},{"lineNumber":156,"author":{"gitId":"-"},"content":" .type(new OutputFolderArgumentType())"},{"lineNumber":157,"author":{"gitId":"-"},"content":" .setDefault(Paths.get(ArgsParser.DEFAULT_REPORT_NAME))"},{"lineNumber":158,"author":{"gitId":"-"},"content":" .help(\"The directory to output the report folder, reposense-report. \""},{"lineNumber":159,"author":{"gitId":"-"},"content":" + \"If not provided, the report folder will be created in the current working directory.\");"},{"lineNumber":160,"author":{"gitId":"-"},"content":""},{"lineNumber":161,"author":{"gitId":"-"},"content":" parser.addArgument(ASSETS_FLAGS)"},{"lineNumber":162,"author":{"gitId":"-"},"content":" .dest(ASSETS_FLAGS[0])"},{"lineNumber":163,"author":{"gitId":"-"},"content":" .metavar(\"PATH\")"},{"lineNumber":164,"author":{"gitId":"-"},"content":" .type(new AssetsFolderArgumentType())"},{"lineNumber":165,"author":{"gitId":"-"},"content":" .setDefault(DEFAULT_ASSETS_PATH)"},{"lineNumber":166,"author":{"gitId":"-"},"content":" .help(\"The directory to place assets files to customize report generation. \""},{"lineNumber":167,"author":{"gitId":"-"},"content":" + \"If not provided, the assets folder in the current working directory will be used.\");"},{"lineNumber":168,"author":{"gitId":"-"},"content":""},{"lineNumber":169,"author":{"gitId":"-"},"content":" parser.addArgument(SINCE_FLAGS)"},{"lineNumber":170,"author":{"gitId":"-"},"content":" .dest(SINCE_FLAGS[0])"},{"lineNumber":171,"author":{"gitId":"-"},"content":" .metavar(\"dd/MM/yyyy\")"},{"lineNumber":172,"author":{"gitId":"-"},"content":" .type(new SinceDateArgumentType())"},{"lineNumber":173,"author":{"gitId":"-"},"content":" .setDefault(Optional.empty())"},{"lineNumber":174,"author":{"gitId":"-"},"content":" .help(\"The date to start filtering.\");"},{"lineNumber":175,"author":{"gitId":"-"},"content":""},{"lineNumber":176,"author":{"gitId":"-"},"content":" parser.addArgument(UNTIL_FLAGS)"},{"lineNumber":177,"author":{"gitId":"-"},"content":" .dest(UNTIL_FLAGS[0])"},{"lineNumber":178,"author":{"gitId":"-"},"content":" .metavar(\"dd/MM/yyyy\")"},{"lineNumber":179,"author":{"gitId":"-"},"content":" .type(new UntilDateArgumentType())"},{"lineNumber":180,"author":{"gitId":"-"},"content":" .setDefault(Optional.empty())"},{"lineNumber":181,"author":{"gitId":"-"},"content":" .help(\"The date to stop filtering.\");"},{"lineNumber":182,"author":{"gitId":"-"},"content":""},{"lineNumber":183,"author":{"gitId":"-"},"content":" parser.addArgument(PERIOD_FLAGS)"},{"lineNumber":184,"author":{"gitId":"-"},"content":" .dest(PERIOD_FLAGS[0])"},{"lineNumber":185,"author":{"gitId":"-"},"content":" .metavar(\"PERIOD\")"},{"lineNumber":186,"author":{"gitId":"-"},"content":" .type(new PeriodArgumentType())"},{"lineNumber":187,"author":{"gitId":"-"},"content":" .setDefault(Optional.empty())"},{"lineNumber":188,"author":{"gitId":"-"},"content":" .help(\"The number of days of the filtering window.\");"},{"lineNumber":189,"author":{"gitId":"-"},"content":""},{"lineNumber":190,"author":{"gitId":"-"},"content":" parser.addArgument(FORMAT_FLAGS)"},{"lineNumber":191,"author":{"gitId":"-"},"content":" .dest(FORMAT_FLAGS[0])"},{"lineNumber":192,"author":{"gitId":"-"},"content":" .nargs(\"*\")"},{"lineNumber":193,"author":{"gitId":"-"},"content":" .metavar(\"FORMAT\")"},{"lineNumber":194,"author":{"gitId":"-"},"content":" .type(new AlphanumericArgumentType())"},{"lineNumber":195,"author":{"gitId":"-"},"content":" .setDefault(Collections.emptyList())"},{"lineNumber":196,"author":{"gitId":"-"},"content":" .help(\"The alphanumeric file formats to process.\\n\""},{"lineNumber":197,"author":{"gitId":"-"},"content":" + \"If not provided, default file formats will be used.\\n\""},{"lineNumber":198,"author":{"gitId":"-"},"content":" + \"Please refer to userguide for more information.\");"},{"lineNumber":199,"author":{"gitId":"-"},"content":""},{"lineNumber":200,"author":{"gitId":"-"},"content":" parser.addArgument(TIMEZONE_FLAGS)"},{"lineNumber":201,"author":{"gitId":"-"},"content":" .dest(TIMEZONE_FLAGS[0])"},{"lineNumber":202,"author":{"gitId":"-"},"content":" .metavar(\"ZONE_ID[±hh[mm]]\")"},{"lineNumber":203,"author":{"gitId":"-"},"content":" .type(new ZoneIdArgumentType())"},{"lineNumber":204,"author":{"gitId":"-"},"content":" .setDefault(ZoneId.systemDefault())"},{"lineNumber":205,"author":{"gitId":"-"},"content":" .help(\"The timezone to use for the generated report. \""},{"lineNumber":206,"author":{"gitId":"-"},"content":" + \"One kind of valid timezones is relative to UTC. E.g. UTC, UTC+08, UTC-1030. \\n\""},{"lineNumber":207,"author":{"gitId":"-"},"content":" + \"If not provided, system default timezone will be used.\");"},{"lineNumber":208,"author":{"gitId":"-"},"content":""},{"lineNumber":209,"author":{"gitId":"-"},"content":" parser.addArgument(FIND_PREVIOUS_AUTHORS_FLAGS)"},{"lineNumber":210,"author":{"gitId":"-"},"content":" .dest(FIND_PREVIOUS_AUTHORS_FLAGS[0])"},{"lineNumber":211,"author":{"gitId":"-"},"content":" .action(Arguments.storeTrue())"},{"lineNumber":212,"author":{"gitId":"-"},"content":" .help(\"A flag to make RepoSense utilize Git blame\u0027s ignore revisions functionality, RepoSense \""},{"lineNumber":213,"author":{"gitId":"-"},"content":" + \"will attempt to blame the line changes caused by commits in the ignore commit list to the \""},{"lineNumber":214,"author":{"gitId":"-"},"content":" + \"previous authors who altered those lines (if available)\");"},{"lineNumber":215,"author":{"gitId":"-"},"content":""},{"lineNumber":216,"author":{"gitId":"-"},"content":" // Mutex flags - these will always be the last parameters in help message."},{"lineNumber":217,"author":{"gitId":"-"},"content":" mutexParser.addArgument(CONFIG_FLAGS)"},{"lineNumber":218,"author":{"gitId":"-"},"content":" .dest(CONFIG_FLAGS[0])"},{"lineNumber":219,"author":{"gitId":"-"},"content":" .type(new ConfigFolderArgumentType())"},{"lineNumber":220,"author":{"gitId":"-"},"content":" .metavar(\"PATH\")"},{"lineNumber":221,"author":{"gitId":"-"},"content":" .setDefault(DEFAULT_CONFIG_PATH)"},{"lineNumber":222,"author":{"gitId":"-"},"content":" .help(\"The directory containing the config files.\""},{"lineNumber":223,"author":{"gitId":"-"},"content":" + \"If not provided, the config files will be obtained from the config folder.\");"},{"lineNumber":224,"author":{"gitId":"-"},"content":""},{"lineNumber":225,"author":{"gitId":"-"},"content":" mutexParser.addArgument(REPO_FLAGS)"},{"lineNumber":226,"author":{"gitId":"-"},"content":" .nargs(\"+\")"},{"lineNumber":227,"author":{"gitId":"-"},"content":" .dest(REPO_FLAGS[0])"},{"lineNumber":228,"author":{"gitId":"-"},"content":" .metavar(\"LOCATION\")"},{"lineNumber":229,"author":{"gitId":"-"},"content":" .help(\"The remote Git host URLs or local directories to clone the repositories from.\");"},{"lineNumber":230,"author":{"gitId":"-"},"content":""},{"lineNumber":231,"author":{"gitId":"-"},"content":" mutexParser2.addArgument(LAST_MODIFIED_DATE_FLAGS)"},{"lineNumber":232,"author":{"gitId":"-"},"content":" .dest(LAST_MODIFIED_DATE_FLAGS[0])"},{"lineNumber":233,"author":{"gitId":"-"},"content":" .action(Arguments.storeTrue())"},{"lineNumber":234,"author":{"gitId":"-"},"content":" .help(\"A flag to keep track of the last modified date of each line of code.\");"},{"lineNumber":235,"author":{"gitId":"-"},"content":""},{"lineNumber":236,"author":{"gitId":"-"},"content":" mutexParser2.addArgument(SHALLOW_CLONING_FLAGS)"},{"lineNumber":237,"author":{"gitId":"-"},"content":" .dest(SHALLOW_CLONING_FLAGS[0])"},{"lineNumber":238,"author":{"gitId":"-"},"content":" .action(Arguments.storeTrue())"},{"lineNumber":239,"author":{"gitId":"-"},"content":" .help(\"A flag to make RepoSense employ Git\u0027s shallow cloning functionality, which can significantly \""},{"lineNumber":240,"author":{"gitId":"-"},"content":" + \"reduce the time taken to clone large repositories. This flag should not be used for \""},{"lineNumber":241,"author":{"gitId":"-"},"content":" + \"smaller repositories, where the .git file is smaller than 500 MB.\");"},{"lineNumber":242,"author":{"gitId":"-"},"content":""},{"lineNumber":243,"author":{"gitId":"-"},"content":" parser.addArgument(CLONING_THREADS_FLAG)"},{"lineNumber":244,"author":{"gitId":"-"},"content":" .dest(CLONING_THREADS_FLAG[0])"},{"lineNumber":245,"author":{"gitId":"-"},"content":" .type(new CloningThreadsArgumentType())"},{"lineNumber":246,"author":{"gitId":"-"},"content":" .setDefault(DEFAULT_NUM_CLONING_THREADS)"},{"lineNumber":247,"author":{"gitId":"-"},"content":" .help(FeatureControl.SUPPRESS);"},{"lineNumber":248,"author":{"gitId":"-"},"content":""},{"lineNumber":249,"author":{"gitId":"-"},"content":" parser.addArgument(ANALYSIS_THREADS_FLAG)"},{"lineNumber":250,"author":{"gitId":"-"},"content":" .dest(ANALYSIS_THREADS_FLAG[0])"},{"lineNumber":251,"author":{"gitId":"-"},"content":" .type(new AnalysisThreadsArgumentType())"},{"lineNumber":252,"author":{"gitId":"-"},"content":" .setDefault(DEFAULT_NUM_ANALYSIS_THREADS)"},{"lineNumber":253,"author":{"gitId":"-"},"content":" .help(FeatureControl.SUPPRESS);"},{"lineNumber":254,"author":{"gitId":"-"},"content":""},{"lineNumber":255,"author":{"gitId":"-"},"content":" // Testing flags"},{"lineNumber":256,"author":{"gitId":"-"},"content":" argumentGroup.addArgument(TEST_MODE_FLAG)"},{"lineNumber":257,"author":{"gitId":"-"},"content":" .dest(TEST_MODE_FLAG[0])"},{"lineNumber":258,"author":{"gitId":"-"},"content":" .action(Arguments.storeTrue())"},{"lineNumber":259,"author":{"gitId":"-"},"content":" .help(\"Enables testing mode.\");"},{"lineNumber":260,"author":{"gitId":"-"},"content":""},{"lineNumber":261,"author":{"gitId":"-"},"content":" argumentGroup.addArgument(FRESH_CLONING_FLAG)"},{"lineNumber":262,"author":{"gitId":"-"},"content":" .dest(FRESH_CLONING_FLAG[0])"},{"lineNumber":263,"author":{"gitId":"-"},"content":" .action(Arguments.storeTrue())"},{"lineNumber":264,"author":{"gitId":"-"},"content":" .help(\"Enables fresh cloning. Requires testing mode to be enabled.\");"},{"lineNumber":265,"author":{"gitId":"-"},"content":""},{"lineNumber":266,"author":{"gitId":"-"},"content":" return parser;"},{"lineNumber":267,"author":{"gitId":"-"},"content":" }"},{"lineNumber":268,"author":{"gitId":"-"},"content":""},{"lineNumber":269,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":270,"author":{"gitId":"-"},"content":" * Parses the given string {@code args} to a {@link CliArguments} object."},{"lineNumber":271,"author":{"gitId":"-"},"content":" *"},{"lineNumber":272,"author":{"gitId":"-"},"content":" * @throws HelpScreenException if given args contain the --help flag. Help message will be printed out"},{"lineNumber":273,"author":{"gitId":"-"},"content":" * by the {@link ArgumentParser} hence this is to signal to the caller that the program is safe to exit."},{"lineNumber":274,"author":{"gitId":"-"},"content":" * @throws ParseException if the given string arguments fails to parse to a {@link CliArguments} object."},{"lineNumber":275,"author":{"gitId":"-"},"content":" */"},{"lineNumber":276,"author":{"gitId":"-"},"content":" public static CliArguments parse(String[] args) throws HelpScreenException, ParseException {"},{"lineNumber":277,"author":{"gitId":"-"},"content":" ArgumentParser parser \u003d getArgumentParser();"},{"lineNumber":278,"author":{"gitId":"-"},"content":" Namespace results;"},{"lineNumber":279,"author":{"gitId":"-"},"content":""},{"lineNumber":280,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":281,"author":{"gitId":"-"},"content":" results \u003d parser.parseArgs(args);"},{"lineNumber":282,"author":{"gitId":"-"},"content":" } catch (HelpScreenException hse) {"},{"lineNumber":283,"author":{"gitId":"-"},"content":" throw hse;"},{"lineNumber":284,"author":{"gitId":"-"},"content":" } catch (ArgumentParserException ape) {"},{"lineNumber":285,"author":{"gitId":"-"},"content":" throw new ParseException(getArgumentParser().formatUsage() + ape.getMessage() + \"\\n\");"},{"lineNumber":286,"author":{"gitId":"-"},"content":" }"},{"lineNumber":287,"author":{"gitId":"-"},"content":""},{"lineNumber":288,"author":{"gitId":"-"},"content":" Path configFolderPath \u003d results.get(CONFIG_FLAGS[0]);"},{"lineNumber":289,"author":{"gitId":"-"},"content":" Path reportFolderPath \u003d results.get(VIEW_FLAGS[0]);"},{"lineNumber":290,"author":{"gitId":"-"},"content":" Path outputFolderPath \u003d results.get(OUTPUT_FLAGS[0]);"},{"lineNumber":291,"author":{"gitId":"-"},"content":" ZoneId zoneId \u003d results.get(TIMEZONE_FLAGS[0]);"},{"lineNumber":292,"author":{"gitId":"-"},"content":" Path assetsFolderPath \u003d results.get(ASSETS_FLAGS[0]);"},{"lineNumber":293,"author":{"gitId":"-"},"content":" List\u003cString\u003e locations \u003d results.get(REPO_FLAGS[0]);"},{"lineNumber":294,"author":{"gitId":"-"},"content":" List\u003cFileType\u003e formats \u003d FileType.convertFormatStringsToFileTypes(results.get(FORMAT_FLAGS[0]));"},{"lineNumber":295,"author":{"gitId":"-"},"content":" boolean isStandaloneConfigIgnored \u003d results.get(IGNORE_CONFIG_FLAGS[0]);"},{"lineNumber":296,"author":{"gitId":"-"},"content":" boolean isFileSizeLimitIgnored \u003d results.get(IGNORE_SIZELIMIT_FLAGS[0]);"},{"lineNumber":297,"author":{"gitId":"-"},"content":" boolean shouldIncludeLastModifiedDate \u003d results.get(LAST_MODIFIED_DATE_FLAGS[0]);"},{"lineNumber":298,"author":{"gitId":"-"},"content":" boolean shouldPerformShallowCloning \u003d results.get(SHALLOW_CLONING_FLAGS[0]);"},{"lineNumber":299,"author":{"gitId":"-"},"content":" boolean shouldFindPreviousAuthors \u003d results.get(FIND_PREVIOUS_AUTHORS_FLAGS[0]);"},{"lineNumber":300,"author":{"gitId":"-"},"content":" boolean isTestMode \u003d results.get(TEST_MODE_FLAG[0]);"},{"lineNumber":301,"author":{"gitId":"-"},"content":" int numCloningThreads \u003d results.get(CLONING_THREADS_FLAG[0]);"},{"lineNumber":302,"author":{"gitId":"-"},"content":" int numAnalysisThreads \u003d results.get(ANALYSIS_THREADS_FLAG[0]);"},{"lineNumber":303,"author":{"gitId":"-"},"content":""},{"lineNumber":304,"author":{"gitId":"-"},"content":" CliArguments.Builder cliArgumentsBuilder \u003d new CliArguments.Builder()"},{"lineNumber":305,"author":{"gitId":"-"},"content":" .configFolderPath(configFolderPath)"},{"lineNumber":306,"author":{"gitId":"-"},"content":" .reportDirectoryPath(reportFolderPath)"},{"lineNumber":307,"author":{"gitId":"-"},"content":" .outputFilePath(outputFolderPath)"},{"lineNumber":308,"author":{"gitId":"-"},"content":" .zoneId(zoneId)"},{"lineNumber":309,"author":{"gitId":"-"},"content":" .assetsFilePath(assetsFolderPath)"},{"lineNumber":310,"author":{"gitId":"-"},"content":" .locations(locations)"},{"lineNumber":311,"author":{"gitId":"-"},"content":" .formats(formats)"},{"lineNumber":312,"author":{"gitId":"-"},"content":" .isStandaloneConfigIgnored(isStandaloneConfigIgnored)"},{"lineNumber":313,"author":{"gitId":"-"},"content":" .isFileSizeLimitIgnored(isFileSizeLimitIgnored)"},{"lineNumber":314,"author":{"gitId":"-"},"content":" .isLastModifiedDateIncluded(shouldIncludeLastModifiedDate)"},{"lineNumber":315,"author":{"gitId":"-"},"content":" .isShallowCloningPerformed(shouldPerformShallowCloning)"},{"lineNumber":316,"author":{"gitId":"-"},"content":" .isFindingPreviousAuthorsPerformed(shouldFindPreviousAuthors)"},{"lineNumber":317,"author":{"gitId":"-"},"content":" .numCloningThreads(numCloningThreads)"},{"lineNumber":318,"author":{"gitId":"-"},"content":" .numAnalysisThreads(numAnalysisThreads)"},{"lineNumber":319,"author":{"gitId":"-"},"content":" .isTestMode(isTestMode);"},{"lineNumber":320,"author":{"gitId":"-"},"content":""},{"lineNumber":321,"author":{"gitId":"-"},"content":" LogsManager.setLogFolderLocation(outputFolderPath);"},{"lineNumber":322,"author":{"gitId":"-"},"content":""},{"lineNumber":323,"author":{"gitId":"-"},"content":" if (locations \u003d\u003d null \u0026\u0026 configFolderPath.equals(DEFAULT_CONFIG_PATH)) {"},{"lineNumber":324,"author":{"gitId":"-"},"content":" logger.info(MESSAGE_USING_DEFAULT_CONFIG_PATH);"},{"lineNumber":325,"author":{"gitId":"-"},"content":" }"},{"lineNumber":326,"author":{"gitId":"-"},"content":""},{"lineNumber":327,"author":{"gitId":"-"},"content":" addReportConfigToBuilder(cliArgumentsBuilder, results);"},{"lineNumber":328,"author":{"gitId":"-"},"content":" addAnalysisDatesToBuilder(cliArgumentsBuilder, results);"},{"lineNumber":329,"author":{"gitId":"-"},"content":""},{"lineNumber":330,"author":{"gitId":"-"},"content":" boolean isViewModeOnly \u003d reportFolderPath !\u003d null"},{"lineNumber":331,"author":{"gitId":"-"},"content":" \u0026\u0026 !reportFolderPath.equals(EMPTY_PATH)"},{"lineNumber":332,"author":{"gitId":"-"},"content":" \u0026\u0026 configFolderPath.equals(DEFAULT_CONFIG_PATH)"},{"lineNumber":333,"author":{"gitId":"-"},"content":" \u0026\u0026 locations \u003d\u003d null;"},{"lineNumber":334,"author":{"gitId":"-"},"content":" cliArgumentsBuilder.isViewModeOnly(isViewModeOnly);"},{"lineNumber":335,"author":{"gitId":"-"},"content":""},{"lineNumber":336,"author":{"gitId":"-"},"content":" boolean isAutomaticallyLaunching \u003d reportFolderPath !\u003d null;"},{"lineNumber":337,"author":{"gitId":"-"},"content":" if (isAutomaticallyLaunching \u0026\u0026 !reportFolderPath.equals(EMPTY_PATH) \u0026\u0026 !isViewModeOnly) {"},{"lineNumber":338,"author":{"gitId":"-"},"content":" logger.info(String.format(\"Ignoring argument \u0027%s\u0027 for --view.\", reportFolderPath.toString()));"},{"lineNumber":339,"author":{"gitId":"-"},"content":" }"},{"lineNumber":340,"author":{"gitId":"-"},"content":" cliArgumentsBuilder.isAutomaticallyLaunching(isAutomaticallyLaunching);"},{"lineNumber":341,"author":{"gitId":"-"},"content":""},{"lineNumber":342,"author":{"gitId":"-"},"content":""},{"lineNumber":343,"author":{"gitId":"-"},"content":" boolean shouldPerformFreshCloning \u003d isTestMode"},{"lineNumber":344,"author":{"gitId":"-"},"content":" ? results.get(FRESH_CLONING_FLAG[0])"},{"lineNumber":345,"author":{"gitId":"-"},"content":" : DEFAULT_SHOULD_FRESH_CLONE;"},{"lineNumber":346,"author":{"gitId":"-"},"content":" cliArgumentsBuilder.isFreshClonePerformed(shouldPerformFreshCloning);"},{"lineNumber":347,"author":{"gitId":"-"},"content":""},{"lineNumber":348,"author":{"gitId":"-"},"content":" return cliArgumentsBuilder.build();"},{"lineNumber":349,"author":{"gitId":"-"},"content":" }"},{"lineNumber":350,"author":{"gitId":"-"},"content":""},{"lineNumber":351,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":352,"author":{"gitId":"-"},"content":" * Adds the reportConfig field to the given {@code builder}."},{"lineNumber":353,"author":{"gitId":"-"},"content":" *"},{"lineNumber":354,"author":{"gitId":"-"},"content":" * @param builder Builder to be supplied with the reportConfig field."},{"lineNumber":355,"author":{"gitId":"-"},"content":" * @param results Parsed results of the user-supplied CLI arguments."},{"lineNumber":356,"author":{"gitId":"-"},"content":" */"},{"lineNumber":357,"author":{"gitId":"-"},"content":" private static void addReportConfigToBuilder(CliArguments.Builder builder, Namespace results) {"},{"lineNumber":358,"author":{"gitId":"-"},"content":" ReportConfiguration reportConfig \u003d new ReportConfiguration();"},{"lineNumber":359,"author":{"gitId":"-"},"content":" List\u003cString\u003e locations \u003d results.get(REPO_FLAGS[0]);"},{"lineNumber":360,"author":{"gitId":"-"},"content":" Path configFolderPath \u003d results.get(CONFIG_FLAGS[0]);"},{"lineNumber":361,"author":{"gitId":"-"},"content":""},{"lineNumber":362,"author":{"gitId":"-"},"content":" // Report config is ignored if --repos is provided"},{"lineNumber":363,"author":{"gitId":"-"},"content":" if (locations \u003d\u003d null) {"},{"lineNumber":364,"author":{"gitId":"-"},"content":" Path reportConfigFilePath \u003d configFolderPath.resolve(ReportConfigJsonParser.REPORT_CONFIG_FILENAME);"},{"lineNumber":365,"author":{"gitId":"-"},"content":""},{"lineNumber":366,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":367,"author":{"gitId":"-"},"content":" reportConfig \u003d new ReportConfigJsonParser().parse(reportConfigFilePath);"},{"lineNumber":368,"author":{"gitId":"-"},"content":" } catch (JsonSyntaxException jse) {"},{"lineNumber":369,"author":{"gitId":"-"},"content":" logger.warning(String.format(MESSAGE_INVALID_CONFIG_PATH, reportConfigFilePath));"},{"lineNumber":370,"author":{"gitId":"-"},"content":" } catch (IllegalArgumentException iae) {"},{"lineNumber":371,"author":{"gitId":"-"},"content":" logger.warning(String.format(MESSAGE_INVALID_CONFIG_JSON, iae.getMessage()));"},{"lineNumber":372,"author":{"gitId":"-"},"content":" } catch (IOException ioe) {"},{"lineNumber":373,"author":{"gitId":"-"},"content":" // IOException thrown as report-config.json is not found."},{"lineNumber":374,"author":{"gitId":"-"},"content":" // Ignore exception as the file is optional."},{"lineNumber":375,"author":{"gitId":"-"},"content":" }"},{"lineNumber":376,"author":{"gitId":"-"},"content":" }"},{"lineNumber":377,"author":{"gitId":"-"},"content":" builder.reportConfiguration(reportConfig);"},{"lineNumber":378,"author":{"gitId":"-"},"content":" }"},{"lineNumber":379,"author":{"gitId":"-"},"content":""},{"lineNumber":380,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":381,"author":{"gitId":"-"},"content":" * Adds the sinceDate and untilDate fields for analysis to the given {@code builder}."},{"lineNumber":382,"author":{"gitId":"-"},"content":" *"},{"lineNumber":383,"author":{"gitId":"-"},"content":" * @param builder Builder to be supplied with the sinceDate and untilDate fields"},{"lineNumber":384,"author":{"gitId":"-"},"content":" * @param results Parsed results of the user-supplied CLI arguments."},{"lineNumber":385,"author":{"gitId":"-"},"content":" * @throws ParseException if all of sinceDate, untilDate and (analysis) period is provided"},{"lineNumber":386,"author":{"gitId":"-"},"content":" * or if the sinceDate is invalid."},{"lineNumber":387,"author":{"gitId":"-"},"content":" */"},{"lineNumber":388,"author":{"gitId":"-"},"content":" private static void addAnalysisDatesToBuilder(CliArguments.Builder builder, Namespace results)"},{"lineNumber":389,"author":{"gitId":"-"},"content":" throws ParseException {"},{"lineNumber":390,"author":{"gitId":"-"},"content":" ZoneId zoneId \u003d results.get(TIMEZONE_FLAGS[0]);"},{"lineNumber":391,"author":{"gitId":"-"},"content":" Optional\u003cLocalDateTime\u003e cliSinceDate \u003d results.get(SINCE_FLAGS[0]);"},{"lineNumber":392,"author":{"gitId":"-"},"content":" Optional\u003cLocalDateTime\u003e cliUntilDate \u003d results.get(UNTIL_FLAGS[0]);"},{"lineNumber":393,"author":{"gitId":"-"},"content":" Optional\u003cInteger\u003e cliPeriod \u003d results.get(PERIOD_FLAGS[0]);"},{"lineNumber":394,"author":{"gitId":"-"},"content":""},{"lineNumber":395,"author":{"gitId":"-"},"content":" boolean isSinceDateProvided \u003d cliSinceDate.isPresent();"},{"lineNumber":396,"author":{"gitId":"-"},"content":" boolean isUntilDateProvided \u003d cliUntilDate.isPresent();"},{"lineNumber":397,"author":{"gitId":"-"},"content":" boolean isPeriodProvided \u003d cliPeriod.isPresent();"},{"lineNumber":398,"author":{"gitId":"-"},"content":" if (isSinceDateProvided \u0026\u0026 isUntilDateProvided \u0026\u0026 isPeriodProvided) {"},{"lineNumber":399,"author":{"gitId":"-"},"content":" throw new ParseException(MESSAGE_HAVE_SINCE_DATE_UNTIL_DATE_AND_PERIOD);"},{"lineNumber":400,"author":{"gitId":"-"},"content":" }"},{"lineNumber":401,"author":{"gitId":"-"},"content":""},{"lineNumber":402,"author":{"gitId":"-"},"content":" LocalDateTime sinceDate;"},{"lineNumber":403,"author":{"gitId":"-"},"content":" LocalDateTime untilDate;"},{"lineNumber":404,"author":{"gitId":"-"},"content":" boolean isUsingArbitraryDate \u003d false;"},{"lineNumber":405,"author":{"gitId":"-"},"content":""},{"lineNumber":406,"author":{"gitId":"-"},"content":" LocalDateTime currentDate \u003d TimeUtil.getCurrentDate(zoneId);"},{"lineNumber":407,"author":{"gitId":"-"},"content":""},{"lineNumber":408,"author":{"gitId":"-"},"content":" if (isSinceDateProvided) {"},{"lineNumber":409,"author":{"gitId":"-"},"content":" sinceDate \u003d TimeUtil.getSinceDate(cliSinceDate.get());"},{"lineNumber":410,"author":{"gitId":"-"},"content":" // For --since d1, need to adjust the arbitrary date based on timezone"},{"lineNumber":411,"author":{"gitId":"-"},"content":" if (TimeUtil.isEqualToArbitraryFirstDateUtc(sinceDate)) {"},{"lineNumber":412,"author":{"gitId":"-"},"content":" isUsingArbitraryDate \u003d true;"},{"lineNumber":413,"author":{"gitId":"-"},"content":" sinceDate \u003d TimeUtil.getArbitraryFirstCommitDateConverted(zoneId);"},{"lineNumber":414,"author":{"gitId":"-"},"content":" }"},{"lineNumber":415,"author":{"gitId":"-"},"content":" } else if (isUntilDateProvided) {"},{"lineNumber":416,"author":{"gitId":"-"},"content":" sinceDate \u003d isPeriodProvided"},{"lineNumber":417,"author":{"gitId":"-"},"content":" ? TimeUtil.getDateMinusNDays(cliUntilDate.get(), cliPeriod.get())"},{"lineNumber":418,"author":{"gitId":"-"},"content":" : TimeUtil.getDateMinusAMonth(cliUntilDate.get());"},{"lineNumber":419,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":420,"author":{"gitId":"-"},"content":" sinceDate \u003d isPeriodProvided"},{"lineNumber":421,"author":{"gitId":"-"},"content":" ? TimeUtil.getDateMinusNDays(currentDate, cliPeriod.get())"},{"lineNumber":422,"author":{"gitId":"-"},"content":" : TimeUtil.getDateMinusAMonth(currentDate);"},{"lineNumber":423,"author":{"gitId":"-"},"content":" }"},{"lineNumber":424,"author":{"gitId":"-"},"content":""},{"lineNumber":425,"author":{"gitId":"-"},"content":" if (isPeriodProvided \u0026\u0026 isUsingArbitraryDate) {"},{"lineNumber":426,"author":{"gitId":"-"},"content":" logger.warning(MESSAGE_SINCE_D1_WITH_PERIOD);"},{"lineNumber":427,"author":{"gitId":"-"},"content":" }"},{"lineNumber":428,"author":{"gitId":"-"},"content":""},{"lineNumber":429,"author":{"gitId":"-"},"content":" if (isUntilDateProvided) {"},{"lineNumber":430,"author":{"gitId":"-"},"content":" untilDate \u003d TimeUtil.getUntilDate(cliUntilDate.get());"},{"lineNumber":431,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":432,"author":{"gitId":"-"},"content":" untilDate \u003d (isSinceDateProvided \u0026\u0026 isPeriodProvided)"},{"lineNumber":433,"author":{"gitId":"-"},"content":" ? TimeUtil.getDatePlusNDays(cliSinceDate.get(), cliPeriod.get())"},{"lineNumber":434,"author":{"gitId":"-"},"content":" : currentDate;"},{"lineNumber":435,"author":{"gitId":"-"},"content":" }"},{"lineNumber":436,"author":{"gitId":"-"},"content":""},{"lineNumber":437,"author":{"gitId":"-"},"content":" untilDate \u003d untilDate.compareTo(currentDate) \u003c 0"},{"lineNumber":438,"author":{"gitId":"-"},"content":" ? untilDate"},{"lineNumber":439,"author":{"gitId":"-"},"content":" : currentDate;"},{"lineNumber":440,"author":{"gitId":"-"},"content":""},{"lineNumber":441,"author":{"gitId":"-"},"content":" if (sinceDate.compareTo(currentDate) \u003e 0) {"},{"lineNumber":442,"author":{"gitId":"-"},"content":" throw new ParseException(MESSAGE_SINCE_DATE_LATER_THAN_TODAY_DATE);"},{"lineNumber":443,"author":{"gitId":"-"},"content":" }"},{"lineNumber":444,"author":{"gitId":"-"},"content":""},{"lineNumber":445,"author":{"gitId":"-"},"content":" if (sinceDate.compareTo(untilDate) \u003e 0) {"},{"lineNumber":446,"author":{"gitId":"-"},"content":" throw new ParseException(MESSAGE_SINCE_DATE_LATER_THAN_UNTIL_DATE);"},{"lineNumber":447,"author":{"gitId":"-"},"content":" }"},{"lineNumber":448,"author":{"gitId":"-"},"content":""},{"lineNumber":449,"author":{"gitId":"-"},"content":" builder.sinceDate(sinceDate)"},{"lineNumber":450,"author":{"gitId":"-"},"content":" .isSinceDateProvided(isSinceDateProvided)"},{"lineNumber":451,"author":{"gitId":"-"},"content":" .untilDate(untilDate)"},{"lineNumber":452,"author":{"gitId":"-"},"content":" .isUntilDateProvided(isUntilDateProvided);"},{"lineNumber":453,"author":{"gitId":"-"},"content":" }"},{"lineNumber":454,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":12,"-":442}},{"path":"src/main/java/reposense/parser/AuthorConfigCsvParser.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.parser;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.FileNotFoundException;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.ArrayList;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.apache.commons.csv.CSVRecord;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"import reposense.model.Author;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import reposense.model.AuthorConfiguration;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import reposense.model.RepoLocation;"},{"lineNumber":13,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidLocationException;"},{"lineNumber":14,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.ParseException;"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Container for the values parsed from {@code author-config.csv} file."},{"lineNumber":18,"author":{"gitId":"-"},"content":" */"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class AuthorConfigCsvParser extends CsvParser\u003cAuthorConfiguration\u003e {"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public static final String AUTHOR_CONFIG_FILENAME \u003d \"author-config.csv\";"},{"lineNumber":21,"author":{"gitId":"-"},"content":""},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Positions of the elements of a line in author-config.csv config file."},{"lineNumber":24,"author":{"gitId":"-"},"content":" */"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String[] LOCATION_HEADER \u003d {\"Repository\u0027s Location\"};"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final String[] BRANCH_HEADER \u003d {\"Branch\"};"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final String[] GIT_ID_HEADERS \u003d {\"Author\u0027s Git Host ID\", \"Author\u0027s GitHub ID\"};"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private static final String[] EMAIL_HEADER \u003d {\"Author\u0027s Emails\"};"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private static final String[] DISPLAY_NAME_HEADER \u003d {\"Author\u0027s Display Name\"};"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String[] ALIAS_HEADER \u003d {\"Author\u0027s Git Author Name\"};"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final String[] IGNORE_GLOB_LIST_HEADER \u003d {\"Ignore Glob List\"};"},{"lineNumber":32,"author":{"gitId":"-"},"content":""},{"lineNumber":33,"author":{"gitId":"-"},"content":" public AuthorConfigCsvParser(Path csvFilePath) throws FileNotFoundException {"},{"lineNumber":34,"author":{"gitId":"-"},"content":" super(csvFilePath);"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }"},{"lineNumber":36,"author":{"gitId":"-"},"content":""},{"lineNumber":37,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Gets the list of headers that are mandatory for verification."},{"lineNumber":39,"author":{"gitId":"-"},"content":" */"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":41,"author":{"gitId":"-"},"content":" protected String[][] mandatoryHeaders() {"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return new String[][] {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" GIT_ID_HEADERS,"},{"lineNumber":44,"author":{"gitId":"-"},"content":" };"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * Gets the list of optional headers that can be parsed."},{"lineNumber":49,"author":{"gitId":"-"},"content":" */"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":51,"author":{"gitId":"-"},"content":" protected String[][] optionalHeaders() {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" return new String[][] {"},{"lineNumber":53,"author":{"gitId":"-"},"content":" LOCATION_HEADER, BRANCH_HEADER, EMAIL_HEADER, DISPLAY_NAME_HEADER, ALIAS_HEADER,"},{"lineNumber":54,"author":{"gitId":"-"},"content":" IGNORE_GLOB_LIST_HEADER,"},{"lineNumber":55,"author":{"gitId":"-"},"content":" };"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }"},{"lineNumber":57,"author":{"gitId":"-"},"content":""},{"lineNumber":58,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * Processes the csv {@code record} line by line and add created {@link AuthorConfiguration} into {@code results}"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * but skips {@code author} already exists in a {@link AuthorConfiguration} that has same {@code location}"},{"lineNumber":61,"author":{"gitId":"-"},"content":" * and {@code branch}."},{"lineNumber":62,"author":{"gitId":"-"},"content":" */"},{"lineNumber":63,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":64,"author":{"gitId":"-"},"content":" protected void processLine(List\u003cAuthorConfiguration\u003e results, CSVRecord record) throws ParseException {"},{"lineNumber":65,"author":{"gitId":"-"},"content":" List\u003cString\u003e locationsWithBranches \u003d getAsListOrDefault(record, LOCATION_HEADER);"},{"lineNumber":66,"author":{"gitId":"-"},"content":" String branch \u003d getOrDefault(record, BRANCH_HEADER, AuthorConfiguration.DEFAULT_BRANCH);"},{"lineNumber":67,"author":{"gitId":"-"},"content":" String gitId \u003d get(record, GIT_ID_HEADERS);"},{"lineNumber":68,"author":{"gitId":"-"},"content":" List\u003cString\u003e emails \u003d getAsList(record, EMAIL_HEADER);"},{"lineNumber":69,"author":{"gitId":"-"},"content":" String displayName \u003d get(record, DISPLAY_NAME_HEADER);"},{"lineNumber":70,"author":{"gitId":"-"},"content":" List\u003cString\u003e aliases \u003d getAsList(record, ALIAS_HEADER);"},{"lineNumber":71,"author":{"gitId":"-"},"content":" List\u003cString\u003e ignoreGlobList \u003d getAsList(record, IGNORE_GLOB_LIST_HEADER);"},{"lineNumber":72,"author":{"gitId":"-"},"content":""},{"lineNumber":73,"author":{"gitId":"-"},"content":" for (String locationWithBranches : locationsWithBranches) {"},{"lineNumber":74,"author":{"gitId":"-"},"content":" List\u003cString\u003e parsedLocationWithBranches \u003d AuthorConfigLocationParser"},{"lineNumber":75,"author":{"gitId":"-"},"content":" .parseLocation(locationWithBranches, branch);"},{"lineNumber":76,"author":{"gitId":"-"},"content":""},{"lineNumber":77,"author":{"gitId":"-"},"content":" String currLocation \u003d parsedLocationWithBranches.get(0);"},{"lineNumber":78,"author":{"gitId":"-"},"content":" for (int i \u003d 1; i \u003c parsedLocationWithBranches.size(); i++) {"},{"lineNumber":79,"author":{"gitId":"-"},"content":" String currBranch \u003d parsedLocationWithBranches.get(i);"},{"lineNumber":80,"author":{"gitId":"-"},"content":" registerLocationAndBranch(results, gitId, emails, displayName, aliases,"},{"lineNumber":81,"author":{"gitId":"-"},"content":" ignoreGlobList, currLocation, currBranch);"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }"},{"lineNumber":85,"author":{"gitId":"-"},"content":""},{"lineNumber":86,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * Registers an author for a single location and branch with the information"},{"lineNumber":88,"author":{"gitId":"-"},"content":" * provided by each line."},{"lineNumber":89,"author":{"gitId":"-"},"content":" *"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * @throws InvalidLocationException if {@code location} is invalid."},{"lineNumber":91,"author":{"gitId":"-"},"content":" */"},{"lineNumber":92,"author":{"gitId":"-"},"content":" private void registerLocationAndBranch(List\u003cAuthorConfiguration\u003e results, String gitId,"},{"lineNumber":93,"author":{"gitId":"-"},"content":" List\u003cString\u003e emails, String displayName,"},{"lineNumber":94,"author":{"gitId":"-"},"content":" List\u003cString\u003e aliases, List\u003cString\u003e ignoreGlobList,"},{"lineNumber":95,"author":{"gitId":"-"},"content":" String currLocation, String currBranch) throws InvalidLocationException {"},{"lineNumber":96,"author":{"gitId":"-"},"content":" AuthorConfiguration config \u003d findMatchingAuthorConfiguration(results, currLocation, currBranch);"},{"lineNumber":97,"author":{"gitId":"-"},"content":""},{"lineNumber":98,"author":{"gitId":"-"},"content":" Author author \u003d new Author(gitId);"},{"lineNumber":99,"author":{"gitId":"-"},"content":""},{"lineNumber":100,"author":{"gitId":"-"},"content":" if (config.containsAuthor(author)) {"},{"lineNumber":101,"author":{"gitId":"-"},"content":" logger.warning(String.format("},{"lineNumber":102,"author":{"gitId":"-"},"content":" \"Skipping author as %s already in repository %s %s\","},{"lineNumber":103,"author":{"gitId":"-"},"content":" author.getGitId(), config.getLocation(), config.getBranch()));"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }"},{"lineNumber":105,"author":{"gitId":"-"},"content":""},{"lineNumber":106,"author":{"gitId":"-"},"content":" author.setEmails(new ArrayList\u003c\u003e(emails));"},{"lineNumber":107,"author":{"gitId":"-"},"content":" author.setDisplayName(!displayName.isEmpty() ? displayName : author.getGitId());"},{"lineNumber":108,"author":{"gitId":"-"},"content":" if (!aliases.isEmpty()) {"},{"lineNumber":109,"author":{"gitId":"-"},"content":" author.setAuthorAliases(aliases);"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }"},{"lineNumber":111,"author":{"gitId":"-"},"content":" if (!ignoreGlobList.isEmpty()) {"},{"lineNumber":112,"author":{"gitId":"-"},"content":" author.setIgnoreGlobList(ignoreGlobList);"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }"},{"lineNumber":114,"author":{"gitId":"-"},"content":""},{"lineNumber":115,"author":{"gitId":"-"},"content":" config.addAuthor(author);"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }"},{"lineNumber":117,"author":{"gitId":"-"},"content":""},{"lineNumber":118,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":119,"author":{"gitId":"-"},"content":" * Gets an existing {@link AuthorConfiguration} from {@code results} if {@code location} and {@code branch} matches."},{"lineNumber":120,"author":{"gitId":"-"},"content":" * Otherwise, adds a newly created {@link AuthorConfiguration} into {@code results} and returns it."},{"lineNumber":121,"author":{"gitId":"-"},"content":" *"},{"lineNumber":122,"author":{"gitId":"-"},"content":" * @throws InvalidLocationException if {@code location} is invalid."},{"lineNumber":123,"author":{"gitId":"-"},"content":" */"},{"lineNumber":124,"author":{"gitId":"-"},"content":" private static AuthorConfiguration findMatchingAuthorConfiguration(List\u003cAuthorConfiguration\u003e results,"},{"lineNumber":125,"author":{"gitId":"-"},"content":" String location, String branch) throws InvalidLocationException {"},{"lineNumber":126,"author":{"gitId":"-"},"content":" AuthorConfiguration config \u003d new AuthorConfiguration(new RepoLocation(location), branch);"},{"lineNumber":127,"author":{"gitId":"-"},"content":""},{"lineNumber":128,"author":{"gitId":"-"},"content":" for (AuthorConfiguration authorConfig : results) {"},{"lineNumber":129,"author":{"gitId":"-"},"content":" if (authorConfig.getLocation().equals(config.getLocation())"},{"lineNumber":130,"author":{"gitId":"-"},"content":" \u0026\u0026 authorConfig.getBranch().equals(config.getBranch())) {"},{"lineNumber":131,"author":{"gitId":"-"},"content":" return authorConfig;"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }"},{"lineNumber":134,"author":{"gitId":"-"},"content":""},{"lineNumber":135,"author":{"gitId":"-"},"content":" results.add(config);"},{"lineNumber":136,"author":{"gitId":"-"},"content":" return config;"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }"},{"lineNumber":138,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":2,"-":136}},{"path":"src/main/java/reposense/parser/ConfigurationBuildException.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser;"},{"lineNumber":2,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":3,"author":{"gitId":"asdfghjkxd"},"content":"/**"},{"lineNumber":4,"author":{"gitId":"asdfghjkxd"},"content":" * Signals that there was an issue building a Configuration (missing parameters, etc.)."},{"lineNumber":5,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":6,"author":{"gitId":"asdfghjkxd"},"content":"public class ConfigurationBuildException extends RuntimeException {"},{"lineNumber":7,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":8,"author":{"gitId":"asdfghjkxd"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":8}},{"path":"src/main/java/reposense/parser/CsvParser.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.parser;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.BufferedReader;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.io.FileNotFoundException;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.io.FileReader;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.io.IOException;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.Files;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.ArrayList;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Arrays;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Collections;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.HashMap;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.HashSet;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.Map;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import java.util.Optional;"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import java.util.Set;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import java.util.StringJoiner;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import java.util.logging.Level;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;"},{"lineNumber":23,"author":{"gitId":"-"},"content":""},{"lineNumber":24,"author":{"gitId":"-"},"content":"import org.apache.commons.csv.CSVFormat;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import org.apache.commons.csv.CSVRecord;"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidCsvException;"},{"lineNumber":28,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidHeaderException;"},{"lineNumber":29,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.ParseException;"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import reposense.system.LogsManager;"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Contains CSV parsing related functionalities."},{"lineNumber":34,"author":{"gitId":"-"},"content":" */"},{"lineNumber":35,"author":{"gitId":"-"},"content":"public abstract class CsvParser\u003cT\u003e {"},{"lineNumber":36,"author":{"gitId":"-"},"content":" protected static final String COLUMN_VALUES_SEPARATOR \u003d \";\";"},{"lineNumber":37,"author":{"gitId":"-"},"content":" protected static final Logger logger \u003d LogsManager.getLogger(CsvParser.class);"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"-"},"content":" private static final String EMPTY_STRING \u003d \"\";"},{"lineNumber":40,"author":{"gitId":"-"},"content":" private static final String OVERRIDE_KEYWORD \u003d \"override:\";"},{"lineNumber":41,"author":{"gitId":"-"},"content":" private static final String MESSAGE_EMPTY_LINE \u003d \"[EMPTY LINE]\";"},{"lineNumber":42,"author":{"gitId":"-"},"content":" private static final String MESSAGE_UNABLE_TO_READ_CSV_FILE \u003d \"Unable to read the supplied CSV file.\";"},{"lineNumber":43,"author":{"gitId":"-"},"content":" private static final String MESSAGE_MALFORMED_LINE_FORMAT \u003d \"Line %d in CSV file, %s, is malformed.\\n\""},{"lineNumber":44,"author":{"gitId":"-"},"content":" + \"Content: %s\";"},{"lineNumber":45,"author":{"gitId":"-"},"content":" private static final String MESSAGE_LINE_PARSE_EXCEPTION_FORMAT \u003d \"Error parsing line %d in CSV file, %s.\\n\""},{"lineNumber":46,"author":{"gitId":"-"},"content":" + \"Content: %s\\n\""},{"lineNumber":47,"author":{"gitId":"-"},"content":" + \"Error: %s\";"},{"lineNumber":48,"author":{"gitId":"-"},"content":" private static final String MESSAGE_EMPTY_CSV_FORMAT \u003d \"The CSV file, %s, is empty.\";"},{"lineNumber":49,"author":{"gitId":"-"},"content":" private static final String MESSAGE_MANDATORY_HEADER_MISSING \u003d \"Required column header, %s, not found in \""},{"lineNumber":50,"author":{"gitId":"-"},"content":" + \"CSV file, %s\";"},{"lineNumber":51,"author":{"gitId":"-"},"content":" private static final String MESSAGE_DUPLICATE_COLUMN_HEADER \u003d \"Duplicate columns are present in CSV file, %s.\";"},{"lineNumber":52,"author":{"gitId":"-"},"content":" private static final String MESSAGE_COLUMNS_RECOGNIZED \u003d \"Parsed header of CSV file, %s, and recognized columns: \""},{"lineNumber":53,"author":{"gitId":"-"},"content":" + \"%s\";"},{"lineNumber":54,"author":{"gitId":"-"},"content":" private static final String MESSAGE_ZERO_VALID_CONFIGS \u003d \"No valid configurations in the %s.\";"},{"lineNumber":55,"author":{"gitId":"-"},"content":" private static final String MESSAGE_UNKNOWN_COLUMN \u003d \"Unknown column(s) found: %s (%s)\";"},{"lineNumber":56,"author":{"gitId":"-"},"content":""},{"lineNumber":57,"author":{"gitId":"-"},"content":" private Path csvFilePath;"},{"lineNumber":58,"author":{"gitId":"-"},"content":" private Map\u003cString, Integer\u003e headerMap \u003d new HashMap\u003c\u003e();"},{"lineNumber":59,"author":{"gitId":"-"},"content":" private int numOfLinesBeforeFirstRecord \u003d 0;"},{"lineNumber":60,"author":{"gitId":"-"},"content":""},{"lineNumber":61,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * Creates {@link CsvParser} with given {@code csvFilepath}."},{"lineNumber":63,"author":{"gitId":"-"},"content":" *"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * @throws FileNotFoundException if the csv file cannot be found in the provided {@code csvFilePath}."},{"lineNumber":65,"author":{"gitId":"-"},"content":" */"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public CsvParser(Path csvFilePath) throws FileNotFoundException {"},{"lineNumber":67,"author":{"gitId":"-"},"content":" if (csvFilePath \u003d\u003d null || !Files.exists(csvFilePath)) {"},{"lineNumber":68,"author":{"gitId":"-"},"content":" throw new FileNotFoundException(\"Csv file does not exist at the given path.\\n\""},{"lineNumber":69,"author":{"gitId":"-"},"content":" + \"Use \u0027-help\u0027 to list all the available subcommands and some concept guides.\");"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }"},{"lineNumber":71,"author":{"gitId":"-"},"content":""},{"lineNumber":72,"author":{"gitId":"-"},"content":" this.csvFilePath \u003d csvFilePath;"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }"},{"lineNumber":74,"author":{"gitId":"-"},"content":""},{"lineNumber":75,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * Parses the csv file associated with this instance of the {@link CsvParser} and returns a {@link List}"},{"lineNumber":77,"author":{"gitId":"-"},"content":" * containing the records in this file."},{"lineNumber":78,"author":{"gitId":"-"},"content":" *"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * @throws IOException if there are errors accessing the given csv file."},{"lineNumber":80,"author":{"gitId":"-"},"content":" * @throws InvalidCsvException if the csv is malformed."},{"lineNumber":81,"author":{"gitId":"-"},"content":" * @throws InvalidHeaderException if header of csv file cannot be read."},{"lineNumber":82,"author":{"gitId":"-"},"content":" */"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public List\u003cT\u003e parse() throws IOException, InvalidCsvException, InvalidHeaderException {"},{"lineNumber":84,"author":{"gitId":"-"},"content":" List\u003cT\u003e results \u003d new ArrayList\u003c\u003e();"},{"lineNumber":85,"author":{"gitId":"-"},"content":" Iterable\u003cCSVRecord\u003e records;"},{"lineNumber":86,"author":{"gitId":"-"},"content":""},{"lineNumber":87,"author":{"gitId":"-"},"content":" try (BufferedReader csvReader \u003d new BufferedReader(new FileReader(csvFilePath.toFile()))) {"},{"lineNumber":88,"author":{"gitId":"-"},"content":" String[] header \u003d getHeader(csvReader);"},{"lineNumber":89,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":90,"author":{"gitId":"-"},"content":" records \u003d CSVFormat.Builder.create(CSVFormat.DEFAULT).setIgnoreEmptyLines(false).setHeader(header)"},{"lineNumber":91,"author":{"gitId":"-"},"content":" .setTrim(true).setIgnoreHeaderCase(true).build().parse(csvReader);"},{"lineNumber":92,"author":{"gitId":"-"},"content":" } catch (IllegalArgumentException iae) {"},{"lineNumber":93,"author":{"gitId":"-"},"content":" throw new InvalidCsvException("},{"lineNumber":94,"author":{"gitId":"-"},"content":" String.format(MESSAGE_DUPLICATE_COLUMN_HEADER, csvFilePath.getFileName()));"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }"},{"lineNumber":96,"author":{"gitId":"-"},"content":""},{"lineNumber":97,"author":{"gitId":"-"},"content":" for (CSVRecord record : records) {"},{"lineNumber":98,"author":{"gitId":"-"},"content":" if (isLineMalformed(record)) {"},{"lineNumber":99,"author":{"gitId":"-"},"content":" continue;"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }"},{"lineNumber":101,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":102,"author":{"gitId":"-"},"content":" processLine(results, record);"},{"lineNumber":103,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {"},{"lineNumber":104,"author":{"gitId":"-"},"content":" logger.warning(String.format(MESSAGE_LINE_PARSE_EXCEPTION_FORMAT, getLineNumber(record),"},{"lineNumber":105,"author":{"gitId":"-"},"content":" csvFilePath.getFileName(), getRowContentAsRawString(record), pe.getMessage()));"},{"lineNumber":106,"author":{"gitId":"-"},"content":" } catch (IllegalArgumentException iae) {"},{"lineNumber":107,"author":{"gitId":"-"},"content":" logger.log(Level.WARNING, iae.getMessage(), iae);"},{"lineNumber":108,"author":{"gitId":"-"},"content":" }"},{"lineNumber":109,"author":{"gitId":"-"},"content":" }"},{"lineNumber":110,"author":{"gitId":"-"},"content":" } catch (IOException ioe) {"},{"lineNumber":111,"author":{"gitId":"-"},"content":" throw new IOException(MESSAGE_UNABLE_TO_READ_CSV_FILE, ioe);"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }"},{"lineNumber":113,"author":{"gitId":"-"},"content":""},{"lineNumber":114,"author":{"gitId":"-"},"content":" if (results.isEmpty()) {"},{"lineNumber":115,"author":{"gitId":"-"},"content":" throw new InvalidCsvException(String.format(MESSAGE_ZERO_VALID_CONFIGS, csvFilePath.getFileName()));"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }"},{"lineNumber":117,"author":{"gitId":"-"},"content":" return results;"},{"lineNumber":118,"author":{"gitId":"-"},"content":" }"},{"lineNumber":119,"author":{"gitId":"-"},"content":""},{"lineNumber":120,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":121,"author":{"gitId":"-"},"content":" * Returns the header of a CSV file, which is assumed to be the first non-empty / non-whitespace line in the file"},{"lineNumber":122,"author":{"gitId":"-"},"content":" * read by {@code reader}."},{"lineNumber":123,"author":{"gitId":"-"},"content":" * The line is split into an array of {@code String}s, using the comma symbol as delimiter."},{"lineNumber":124,"author":{"gitId":"-"},"content":" *"},{"lineNumber":125,"author":{"gitId":"-"},"content":" * @throws IOException if there is an error accessing the file."},{"lineNumber":126,"author":{"gitId":"-"},"content":" * @throws InvalidCsvException if the file has only empty or blank lines."},{"lineNumber":127,"author":{"gitId":"-"},"content":" * @throws InvalidHeaderException if header of csv file cannot be read."},{"lineNumber":128,"author":{"gitId":"-"},"content":" */"},{"lineNumber":129,"author":{"gitId":"-"},"content":" private String[] getHeader(BufferedReader reader) throws IOException, InvalidCsvException, InvalidHeaderException {"},{"lineNumber":130,"author":{"gitId":"-"},"content":" String currentLine \u003d \"\";"},{"lineNumber":131,"author":{"gitId":"-"},"content":""},{"lineNumber":132,"author":{"gitId":"-"},"content":" // read from file until we encounter a line that is neither blank nor empty"},{"lineNumber":133,"author":{"gitId":"-"},"content":" while (currentLine.isEmpty()) {"},{"lineNumber":134,"author":{"gitId":"-"},"content":" currentLine \u003d Optional.ofNullable(reader.readLine())"},{"lineNumber":135,"author":{"gitId":"-"},"content":" .map(String::trim)"},{"lineNumber":136,"author":{"gitId":"-"},"content":" .orElseThrow(() -\u003e new InvalidCsvException(String.format("},{"lineNumber":137,"author":{"gitId":"-"},"content":" MESSAGE_EMPTY_CSV_FORMAT, csvFilePath.getFileName())));"},{"lineNumber":138,"author":{"gitId":"-"},"content":""},{"lineNumber":139,"author":{"gitId":"-"},"content":" numOfLinesBeforeFirstRecord++;"},{"lineNumber":140,"author":{"gitId":"-"},"content":" }"},{"lineNumber":141,"author":{"gitId":"-"},"content":" String[] header \u003d currentLine.split(\",\");"},{"lineNumber":142,"author":{"gitId":"-"},"content":" validateHeader(header);"},{"lineNumber":143,"author":{"gitId":"-"},"content":" return header;"},{"lineNumber":144,"author":{"gitId":"-"},"content":" }"},{"lineNumber":145,"author":{"gitId":"-"},"content":""},{"lineNumber":146,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":147,"author":{"gitId":"-"},"content":" * Returns true if {@code record} does not contain the same number of columns as the header or contains missing"},{"lineNumber":148,"author":{"gitId":"-"},"content":" * values at the mandatory columns in CSV format."},{"lineNumber":149,"author":{"gitId":"-"},"content":" */"},{"lineNumber":150,"author":{"gitId":"-"},"content":" private boolean isLineMalformed(CSVRecord record) {"},{"lineNumber":151,"author":{"gitId":"-"},"content":" if (!record.isConsistent()) {"},{"lineNumber":152,"author":{"gitId":"-"},"content":" logger.warning(String.format(MESSAGE_MALFORMED_LINE_FORMAT, getLineNumber(record),"},{"lineNumber":153,"author":{"gitId":"-"},"content":" csvFilePath.getFileName(), getRowContentAsRawString(record)));"},{"lineNumber":154,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":155,"author":{"gitId":"-"},"content":" }"},{"lineNumber":156,"author":{"gitId":"-"},"content":""},{"lineNumber":157,"author":{"gitId":"-"},"content":" for (String[] equivalentHeaders : mandatoryHeaders()) {"},{"lineNumber":158,"author":{"gitId":"-"},"content":" boolean isLineFormatMalformed \u003d"},{"lineNumber":159,"author":{"gitId":"-"},"content":" Arrays.stream(equivalentHeaders).allMatch(header -\u003e get(record, header).isEmpty());"},{"lineNumber":160,"author":{"gitId":"-"},"content":" if (isLineFormatMalformed) {"},{"lineNumber":161,"author":{"gitId":"-"},"content":" logger.warning(String.format(MESSAGE_MALFORMED_LINE_FORMAT, getLineNumber(record),"},{"lineNumber":162,"author":{"gitId":"-"},"content":" csvFilePath.getFileName(), getRowContentAsRawString(record)));"},{"lineNumber":163,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":164,"author":{"gitId":"-"},"content":" }"},{"lineNumber":165,"author":{"gitId":"-"},"content":" }"},{"lineNumber":166,"author":{"gitId":"-"},"content":""},{"lineNumber":167,"author":{"gitId":"-"},"content":" return false;"},{"lineNumber":168,"author":{"gitId":"-"},"content":" }"},{"lineNumber":169,"author":{"gitId":"-"},"content":""},{"lineNumber":170,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":171,"author":{"gitId":"-"},"content":" * Returns the value of {@code record} at the column with the header {@code header}."},{"lineNumber":172,"author":{"gitId":"-"},"content":" */"},{"lineNumber":173,"author":{"gitId":"-"},"content":" protected String get(final CSVRecord record, String header) {"},{"lineNumber":174,"author":{"gitId":"-"},"content":" return headerMap.containsKey(header) ? record.get(headerMap.get(header)).trim() : EMPTY_STRING;"},{"lineNumber":175,"author":{"gitId":"-"},"content":" }"},{"lineNumber":176,"author":{"gitId":"-"},"content":""},{"lineNumber":177,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":178,"author":{"gitId":"-"},"content":" * Returns the value of {@code record} at the column that match any of the equivalent headers in"},{"lineNumber":179,"author":{"gitId":"-"},"content":" * {@code equivalentHeaders}."},{"lineNumber":180,"author":{"gitId":"-"},"content":" */"},{"lineNumber":181,"author":{"gitId":"-"},"content":" protected String get(final CSVRecord record, String[] equivalentHeaders) {"},{"lineNumber":182,"author":{"gitId":"-"},"content":" for (String header : equivalentHeaders) {"},{"lineNumber":183,"author":{"gitId":"-"},"content":" if (headerMap.containsKey(header)) {"},{"lineNumber":184,"author":{"gitId":"-"},"content":" return record.get(headerMap.get(header)).trim();"},{"lineNumber":185,"author":{"gitId":"-"},"content":" }"},{"lineNumber":186,"author":{"gitId":"-"},"content":" }"},{"lineNumber":187,"author":{"gitId":"-"},"content":""},{"lineNumber":188,"author":{"gitId":"-"},"content":" return EMPTY_STRING;"},{"lineNumber":189,"author":{"gitId":"-"},"content":" }"},{"lineNumber":190,"author":{"gitId":"-"},"content":""},{"lineNumber":191,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":192,"author":{"gitId":"-"},"content":" * Returns the value of {@code record} at the column that match any of the equivalent headers in"},{"lineNumber":193,"author":{"gitId":"-"},"content":" * {@code equivalentHeaders} if present, or returns {@code defaultValue} otherwise."},{"lineNumber":194,"author":{"gitId":"-"},"content":" */"},{"lineNumber":195,"author":{"gitId":"-"},"content":" protected String getOrDefault(final CSVRecord record, String[] equivalentHeaders, String defaultValue) {"},{"lineNumber":196,"author":{"gitId":"-"},"content":" String value \u003d get(record, equivalentHeaders);"},{"lineNumber":197,"author":{"gitId":"-"},"content":" return value.isEmpty() ? defaultValue : value;"},{"lineNumber":198,"author":{"gitId":"-"},"content":" }"},{"lineNumber":199,"author":{"gitId":"-"},"content":""},{"lineNumber":200,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":201,"author":{"gitId":"-"},"content":" * Returns the value of {@code record} at the column that match any of the equivalent headers in"},{"lineNumber":202,"author":{"gitId":"-"},"content":" * {@code equivalentHeaders} as a {@link List} if it is in {@code record} and not empty."},{"lineNumber":203,"author":{"gitId":"-"},"content":" * The column is delimited by {@code COLUMN_VALUES_SEPARATOR}."},{"lineNumber":204,"author":{"gitId":"-"},"content":" * Returns an empty {@link List} otherwise."},{"lineNumber":205,"author":{"gitId":"-"},"content":" */"},{"lineNumber":206,"author":{"gitId":"-"},"content":" protected List\u003cString\u003e getAsList(final CSVRecord record, String[] equivalentHeaders) {"},{"lineNumber":207,"author":{"gitId":"-"},"content":" String value \u003d get(record, equivalentHeaders);"},{"lineNumber":208,"author":{"gitId":"-"},"content":" if (value.isEmpty()) {"},{"lineNumber":209,"author":{"gitId":"-"},"content":" return Collections.emptyList();"},{"lineNumber":210,"author":{"gitId":"-"},"content":" }"},{"lineNumber":211,"author":{"gitId":"-"},"content":""},{"lineNumber":212,"author":{"gitId":"-"},"content":" return Arrays.stream(value.split(COLUMN_VALUES_SEPARATOR))"},{"lineNumber":213,"author":{"gitId":"-"},"content":" .map(String::trim)"},{"lineNumber":214,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());"},{"lineNumber":215,"author":{"gitId":"-"},"content":" }"},{"lineNumber":216,"author":{"gitId":"-"},"content":""},{"lineNumber":217,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":218,"author":{"gitId":"-"},"content":" * Returns the value of {@code record} at {@code colNum} as a {@code List},"},{"lineNumber":219,"author":{"gitId":"-"},"content":" * delimited by {@code COLUMN_VALUES_SEPARATOR} if it is in {@code record} and not empty, or"},{"lineNumber":220,"author":{"gitId":"-"},"content":" * returns a single element List containing the empty string otherwise."},{"lineNumber":221,"author":{"gitId":"-"},"content":" */"},{"lineNumber":222,"author":{"gitId":"-"},"content":" protected List\u003cString\u003e getAsListOrDefault(final CSVRecord record, String[] equivalentHeaders) {"},{"lineNumber":223,"author":{"gitId":"-"},"content":" List\u003cString\u003e list \u003d getAsList(record, equivalentHeaders);"},{"lineNumber":224,"author":{"gitId":"-"},"content":" return list.isEmpty() ? Collections.singletonList(\"\") : list;"},{"lineNumber":225,"author":{"gitId":"-"},"content":" }"},{"lineNumber":226,"author":{"gitId":"-"},"content":""},{"lineNumber":227,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":228,"author":{"gitId":"-"},"content":" * Returns the values in {@code record} as a list with the {@link CsvParser#OVERRIDE_KEYWORD} prefix removed."},{"lineNumber":229,"author":{"gitId":"-"},"content":" * Returns an empty list if {@code record} at the column that match any of the equivalent headers in"},{"lineNumber":230,"author":{"gitId":"-"},"content":" * {@code equivalentHeaders} is empty."},{"lineNumber":231,"author":{"gitId":"-"},"content":" */"},{"lineNumber":232,"author":{"gitId":"-"},"content":" protected List\u003cString\u003e getAsListWithoutOverridePrefix(final CSVRecord record, String[] equivalentHeaders) {"},{"lineNumber":233,"author":{"gitId":"-"},"content":" List\u003cString\u003e data \u003d getAsList(record, equivalentHeaders);"},{"lineNumber":234,"author":{"gitId":"-"},"content":" if (isElementOverridingStandaloneConfig(record, equivalentHeaders)) {"},{"lineNumber":235,"author":{"gitId":"-"},"content":" data.set(0, data.get(0).replaceFirst(OVERRIDE_KEYWORD, \"\"));"},{"lineNumber":236,"author":{"gitId":"-"},"content":" data.removeIf(String::isEmpty);"},{"lineNumber":237,"author":{"gitId":"-"},"content":" }"},{"lineNumber":238,"author":{"gitId":"-"},"content":""},{"lineNumber":239,"author":{"gitId":"-"},"content":" return data;"},{"lineNumber":240,"author":{"gitId":"-"},"content":" }"},{"lineNumber":241,"author":{"gitId":"-"},"content":""},{"lineNumber":242,"author":{"gitId":"-"},"content":" private long getLineNumber(final CSVRecord record) {"},{"lineNumber":243,"author":{"gitId":"-"},"content":" return record.getRecordNumber() + numOfLinesBeforeFirstRecord;"},{"lineNumber":244,"author":{"gitId":"-"},"content":" }"},{"lineNumber":245,"author":{"gitId":"-"},"content":""},{"lineNumber":246,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":247,"author":{"gitId":"-"},"content":" * Returns true if the {@code record} at the column that match any of the equivalent headers in"},{"lineNumber":248,"author":{"gitId":"-"},"content":" * {@code equivalentHeaders} is prefixed with the override keyword."},{"lineNumber":249,"author":{"gitId":"-"},"content":" */"},{"lineNumber":250,"author":{"gitId":"-"},"content":" protected boolean isElementOverridingStandaloneConfig(final CSVRecord record, String[] equivalentHeaders) {"},{"lineNumber":251,"author":{"gitId":"-"},"content":" return get(record, equivalentHeaders).startsWith(OVERRIDE_KEYWORD);"},{"lineNumber":252,"author":{"gitId":"-"},"content":" }"},{"lineNumber":253,"author":{"gitId":"-"},"content":""},{"lineNumber":254,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":255,"author":{"gitId":"-"},"content":" * Returns the contents of {@code record} as a raw string."},{"lineNumber":256,"author":{"gitId":"-"},"content":" */"},{"lineNumber":257,"author":{"gitId":"-"},"content":" private String getRowContentAsRawString(final CSVRecord record) {"},{"lineNumber":258,"author":{"gitId":"-"},"content":" StringJoiner inputRowString \u003d new StringJoiner(\",\");"},{"lineNumber":259,"author":{"gitId":"-"},"content":" for (String value : record) {"},{"lineNumber":260,"author":{"gitId":"-"},"content":" inputRowString.add(value);"},{"lineNumber":261,"author":{"gitId":"-"},"content":" }"},{"lineNumber":262,"author":{"gitId":"-"},"content":" String contentAsString \u003d inputRowString.toString();"},{"lineNumber":263,"author":{"gitId":"-"},"content":" return (contentAsString.trim().isEmpty()) ? MESSAGE_EMPTY_LINE : contentAsString;"},{"lineNumber":264,"author":{"gitId":"-"},"content":" }"},{"lineNumber":265,"author":{"gitId":"-"},"content":""},{"lineNumber":266,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":267,"author":{"gitId":"-"},"content":" * Generates map of column header to position number for input {@code possibleHeader}."},{"lineNumber":268,"author":{"gitId":"-"},"content":" *"},{"lineNumber":269,"author":{"gitId":"-"},"content":" * @throws InvalidCsvException if {@code possibleHeader} does not contain all the mandatory headers."},{"lineNumber":270,"author":{"gitId":"-"},"content":" * @throws InvalidHeaderException if a column in {@code possibleHeader} cannot be parsed."},{"lineNumber":271,"author":{"gitId":"-"},"content":" */"},{"lineNumber":272,"author":{"gitId":"-"},"content":" private void validateHeader(String[] possibleHeader) throws InvalidCsvException, InvalidHeaderException {"},{"lineNumber":273,"author":{"gitId":"-"},"content":" int headerSize \u003d possibleHeader.length;"},{"lineNumber":274,"author":{"gitId":"-"},"content":" Set\u003cString\u003e knownColumns \u003d new HashSet\u003c\u003e();"},{"lineNumber":275,"author":{"gitId":"-"},"content":" ArrayList\u003cString\u003e unknownColumns \u003d new ArrayList\u003c\u003e();"},{"lineNumber":276,"author":{"gitId":"-"},"content":" List\u003cString\u003e parsedHeaders \u003d mandatoryAndOptionalHeaders();"},{"lineNumber":277,"author":{"gitId":"-"},"content":""},{"lineNumber":278,"author":{"gitId":"-"},"content":" for (int i \u003d 0; i \u003c headerSize; i++) {"},{"lineNumber":279,"author":{"gitId":"-"},"content":" String possible \u003d possibleHeader[i].trim();"},{"lineNumber":280,"author":{"gitId":"-"},"content":" for (String parsedHeader : parsedHeaders) {"},{"lineNumber":281,"author":{"gitId":"-"},"content":" if (possible.equalsIgnoreCase(parsedHeader)) {"},{"lineNumber":282,"author":{"gitId":"-"},"content":" headerMap.put(parsedHeader, i);"},{"lineNumber":283,"author":{"gitId":"-"},"content":" knownColumns.add(possible);"},{"lineNumber":284,"author":{"gitId":"-"},"content":" break;"},{"lineNumber":285,"author":{"gitId":"-"},"content":" }"},{"lineNumber":286,"author":{"gitId":"-"},"content":" }"},{"lineNumber":287,"author":{"gitId":"-"},"content":""},{"lineNumber":288,"author":{"gitId":"-"},"content":" if (!knownColumns.contains(possible)) {"},{"lineNumber":289,"author":{"gitId":"-"},"content":" unknownColumns.add(possible);"},{"lineNumber":290,"author":{"gitId":"-"},"content":" }"},{"lineNumber":291,"author":{"gitId":"-"},"content":" }"},{"lineNumber":292,"author":{"gitId":"-"},"content":""},{"lineNumber":293,"author":{"gitId":"-"},"content":" if (unknownColumns.size() \u003e 0) {"},{"lineNumber":294,"author":{"gitId":"-"},"content":" String errorMessage \u003d String.join(\", \", unknownColumns);"},{"lineNumber":295,"author":{"gitId":"-"},"content":" throw new InvalidHeaderException("},{"lineNumber":296,"author":{"gitId":"-"},"content":" String.format(MESSAGE_UNKNOWN_COLUMN, errorMessage, csvFilePath.toString()));"},{"lineNumber":297,"author":{"gitId":"-"},"content":" }"},{"lineNumber":298,"author":{"gitId":"-"},"content":""},{"lineNumber":299,"author":{"gitId":"-"},"content":" for (String[] equivalentHeaders : mandatoryHeaders()) {"},{"lineNumber":300,"author":{"gitId":"-"},"content":" boolean isAnyEquivalentHeaderPresent \u003d"},{"lineNumber":301,"author":{"gitId":"-"},"content":" Arrays.stream(equivalentHeaders).anyMatch(header -\u003e headerMap.containsKey(header));"},{"lineNumber":302,"author":{"gitId":"-"},"content":""},{"lineNumber":303,"author":{"gitId":"-"},"content":" if (!isAnyEquivalentHeaderPresent) {"},{"lineNumber":304,"author":{"gitId":"-"},"content":" throw new InvalidCsvException(String.format("},{"lineNumber":305,"author":{"gitId":"-"},"content":" MESSAGE_MANDATORY_HEADER_MISSING, Arrays.toString(equivalentHeaders),"},{"lineNumber":306,"author":{"gitId":"-"},"content":" csvFilePath.getFileName()));"},{"lineNumber":307,"author":{"gitId":"-"},"content":" }"},{"lineNumber":308,"author":{"gitId":"-"},"content":" }"},{"lineNumber":309,"author":{"gitId":"-"},"content":""},{"lineNumber":310,"author":{"gitId":"-"},"content":" logger.info(String.format(MESSAGE_COLUMNS_RECOGNIZED, csvFilePath.getFileName(),"},{"lineNumber":311,"author":{"gitId":"-"},"content":" String.join(\", \", headerMap.keySet())));"},{"lineNumber":312,"author":{"gitId":"-"},"content":" }"},{"lineNumber":313,"author":{"gitId":"-"},"content":""},{"lineNumber":314,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":315,"author":{"gitId":"-"},"content":" * Gets the list of headers that are mandatory for verification."},{"lineNumber":316,"author":{"gitId":"-"},"content":" */"},{"lineNumber":317,"author":{"gitId":"-"},"content":" protected abstract String[][] mandatoryHeaders();"},{"lineNumber":318,"author":{"gitId":"-"},"content":""},{"lineNumber":319,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":320,"author":{"gitId":"-"},"content":" * Gets the list of optional headers that can be parsed."},{"lineNumber":321,"author":{"gitId":"-"},"content":" */"},{"lineNumber":322,"author":{"gitId":"-"},"content":" protected abstract String[][] optionalHeaders();"},{"lineNumber":323,"author":{"gitId":"-"},"content":""},{"lineNumber":324,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":325,"author":{"gitId":"-"},"content":" * Gets the list of all mandatory and optional headers that can be parsed."},{"lineNumber":326,"author":{"gitId":"-"},"content":" */"},{"lineNumber":327,"author":{"gitId":"-"},"content":" protected List\u003cString\u003e mandatoryAndOptionalHeaders() {"},{"lineNumber":328,"author":{"gitId":"-"},"content":" return Stream.concat(Arrays.stream(mandatoryHeaders()), Arrays.stream(optionalHeaders()))"},{"lineNumber":329,"author":{"gitId":"-"},"content":" .flatMap(Stream::of)"},{"lineNumber":330,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());"},{"lineNumber":331,"author":{"gitId":"-"},"content":" }"},{"lineNumber":332,"author":{"gitId":"-"},"content":""},{"lineNumber":333,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":334,"author":{"gitId":"-"},"content":" * Processes the csv file line by line."},{"lineNumber":335,"author":{"gitId":"-"},"content":" * All {@link CsvParser}s must use {@link CsvParser#get}, {@link CsvParser#getOrDefault},"},{"lineNumber":336,"author":{"gitId":"-"},"content":" * {@link CsvParser#getAsList} or {@link CsvParser#getAsListWithoutOverridePrefix} to read contents in"},{"lineNumber":337,"author":{"gitId":"-"},"content":" * {@code record} and add created objects into {@code results}."},{"lineNumber":338,"author":{"gitId":"-"},"content":" *"},{"lineNumber":339,"author":{"gitId":"-"},"content":" * @throws ParseException if any line does not get read successfully."},{"lineNumber":340,"author":{"gitId":"-"},"content":" */"},{"lineNumber":341,"author":{"gitId":"-"},"content":" protected abstract void processLine(List\u003cT\u003e results, final CSVRecord record) throws ParseException;"},{"lineNumber":342,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":3,"-":339}},{"path":"src/main/java/reposense/parser/GroupConfigCsvParser.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.parser;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.FileNotFoundException;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.apache.commons.csv.CSVRecord;"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"import reposense.model.FileType;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import reposense.model.GroupConfiguration;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import reposense.model.RepoLocation;"},{"lineNumber":12,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidLocationException;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Container for the values parsed from {@code group-config.csv} file."},{"lineNumber":16,"author":{"gitId":"-"},"content":" */"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class GroupConfigCsvParser extends CsvParser\u003cGroupConfiguration\u003e {"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String GROUP_CONFIG_FILENAME \u003d \"group-config.csv\";"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Positions of the elements of a line in group-config.csv config file"},{"lineNumber":22,"author":{"gitId":"-"},"content":" */"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final String[] LOCATION_HEADER \u003d {\"Repository\u0027s Location\"};"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final String[] GROUP_NAME_HEADER \u003d {\"Group Name\"};"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String[] FILES_GLOB_HEADER \u003d {\"Globs\"};"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"-"},"content":" public GroupConfigCsvParser(Path csvFilePath) throws FileNotFoundException {"},{"lineNumber":28,"author":{"gitId":"-"},"content":" super(csvFilePath);"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Gets the list of headers that are mandatory for verification."},{"lineNumber":33,"author":{"gitId":"-"},"content":" */"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":35,"author":{"gitId":"-"},"content":" protected String[][] mandatoryHeaders() {"},{"lineNumber":36,"author":{"gitId":"-"},"content":" return new String[][] {"},{"lineNumber":37,"author":{"gitId":"-"},"content":" GROUP_NAME_HEADER, FILES_GLOB_HEADER,"},{"lineNumber":38,"author":{"gitId":"-"},"content":" };"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * Gets the list of optional headers that can be parsed."},{"lineNumber":43,"author":{"gitId":"-"},"content":" */"},{"lineNumber":44,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":45,"author":{"gitId":"-"},"content":" protected String[][] optionalHeaders() {"},{"lineNumber":46,"author":{"gitId":"-"},"content":" return new String[][] {"},{"lineNumber":47,"author":{"gitId":"-"},"content":" LOCATION_HEADER,"},{"lineNumber":48,"author":{"gitId":"-"},"content":" };"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * Processes the csv {@code record} line by line and adds created {@link GroupConfiguration} into {@code results}."},{"lineNumber":53,"author":{"gitId":"-"},"content":" */"},{"lineNumber":54,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":55,"author":{"gitId":"-"},"content":" protected void processLine(List\u003cGroupConfiguration\u003e results, CSVRecord record) throws InvalidLocationException {"},{"lineNumber":56,"author":{"gitId":"-"},"content":" String location \u003d get(record, LOCATION_HEADER);"},{"lineNumber":57,"author":{"gitId":"-"},"content":" String groupName \u003d get(record, GROUP_NAME_HEADER);"},{"lineNumber":58,"author":{"gitId":"-"},"content":" List\u003cString\u003e globList \u003d getAsList(record, FILES_GLOB_HEADER);"},{"lineNumber":59,"author":{"gitId":"-"},"content":""},{"lineNumber":60,"author":{"gitId":"-"},"content":" GroupConfiguration groupConfig \u003d null;"},{"lineNumber":61,"author":{"gitId":"-"},"content":" groupConfig \u003d findMatchingGroupConfiguration(results, location);"},{"lineNumber":62,"author":{"gitId":"-"},"content":""},{"lineNumber":63,"author":{"gitId":"-"},"content":" FileType group \u003d new FileType(groupName, globList);"},{"lineNumber":64,"author":{"gitId":"-"},"content":" if (groupConfig.containsGroup(group)) {"},{"lineNumber":65,"author":{"gitId":"-"},"content":" logger.warning(String.format("},{"lineNumber":66,"author":{"gitId":"-"},"content":" \"Skipping group as %s has already been specified for the repository %s\","},{"lineNumber":67,"author":{"gitId":"-"},"content":" group.toString(), groupConfig.getLocation()));"},{"lineNumber":68,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }"},{"lineNumber":70,"author":{"gitId":"-"},"content":""},{"lineNumber":71,"author":{"gitId":"-"},"content":" groupConfig.addGroup(group);"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }"},{"lineNumber":73,"author":{"gitId":"-"},"content":""},{"lineNumber":74,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":75,"author":{"gitId":"-"},"content":" * Gets an existing {@link GroupConfiguration} from {@code results} if {@code location} matches."},{"lineNumber":76,"author":{"gitId":"-"},"content":" * Otherwise, adds a newly created {@link GroupConfiguration} into {@code results} and returns it."},{"lineNumber":77,"author":{"gitId":"-"},"content":" *"},{"lineNumber":78,"author":{"gitId":"-"},"content":" * @throws InvalidLocationException if {@code location} is invalid."},{"lineNumber":79,"author":{"gitId":"-"},"content":" */"},{"lineNumber":80,"author":{"gitId":"-"},"content":" private static GroupConfiguration findMatchingGroupConfiguration(List\u003cGroupConfiguration\u003e results,"},{"lineNumber":81,"author":{"gitId":"-"},"content":" String location) throws InvalidLocationException {"},{"lineNumber":82,"author":{"gitId":"-"},"content":" GroupConfiguration config \u003d new GroupConfiguration(new RepoLocation(location));"},{"lineNumber":83,"author":{"gitId":"-"},"content":""},{"lineNumber":84,"author":{"gitId":"-"},"content":" for (GroupConfiguration groupConfig : results) {"},{"lineNumber":85,"author":{"gitId":"-"},"content":" if (groupConfig.getLocation().equals(config.getLocation())) {"},{"lineNumber":86,"author":{"gitId":"-"},"content":" return groupConfig;"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }"},{"lineNumber":89,"author":{"gitId":"-"},"content":""},{"lineNumber":90,"author":{"gitId":"-"},"content":" results.add(config);"},{"lineNumber":91,"author":{"gitId":"-"},"content":" return config;"},{"lineNumber":92,"author":{"gitId":"-"},"content":" }"},{"lineNumber":93,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":92}},{"path":"src/main/java/reposense/parser/RepoConfigCsvParser.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.parser;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.FileNotFoundException;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.apache.commons.csv.CSVRecord;"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"import reposense.model.CommitHash;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import reposense.model.FileType;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import reposense.model.RepoConfiguration;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import reposense.model.RepoLocation;"},{"lineNumber":13,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidLocationException;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import reposense.util.FileUtil;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import reposense.util.StringsUtil;"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Container for the values parsed from {@code repo-config.csv} file."},{"lineNumber":19,"author":{"gitId":"-"},"content":" */"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class RepoConfigCsvParser extends CsvParser\u003cRepoConfiguration\u003e {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static final String REPO_CONFIG_FILENAME \u003d \"repo-config.csv\";"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final String IGNORE_STANDALONE_CONFIG_KEYWORD \u003d \"yes\";"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final String IGNORE_FILESIZE_LIMIT_KEYWORD \u003d \"yes\";"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final String SKIP_IGNORED_FILE_ANALYSIS_KEYWORD \u003d \"yes\";"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String SHALLOW_CLONING_CONFIG_KEYWORD \u003d \"yes\";"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final String FIND_PREVIOUS_AUTHORS_KEYWORD \u003d \"yes\";"},{"lineNumber":27,"author":{"gitId":"-"},"content":""},{"lineNumber":28,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * Positions of the elements of a line in repo-config.csv config file"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final String[] LOCATION_HEADER \u003d {\"Repository\u0027s Location\"};"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final String[] BRANCH_HEADER \u003d {\"Branch\"};"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final String[] FILE_FORMATS_HEADER \u003d {\"File formats\"};"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final String[] IGNORE_GLOB_LIST_HEADER \u003d {\"Ignore Glob List\"};"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private static final String[] IGNORE_STANDALONE_CONFIG_HEADER \u003d {\"Ignore Standalone Config\"};"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private static final String[] IGNORE_FILESIZE_LIMIT_HEADER \u003d {\"Ignore File Size Limit\"};"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private static final String[] IGNORE_COMMIT_LIST_CONFIG_HEADER \u003d {\"Ignore Commits List\"};"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private static final String[] IGNORE_AUTHOR_LIST_CONFIG_HEADER \u003d {\"Ignore Authors List\"};"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private static final String[] SKIP_IGNORED_FILE_ANALYSIS_HEADER \u003d {\"Skip Ignored File Analysis\"};"},{"lineNumber":40,"author":{"gitId":"-"},"content":" private static final String[] SHALLOW_CLONING_CONFIG_HEADER \u003d {\"Shallow Cloning\"};"},{"lineNumber":41,"author":{"gitId":"-"},"content":" private static final String[] FIND_PREVIOUS_AUTHORS_CONFIG_HEADER \u003d {\"Find Previous Authors\"};"},{"lineNumber":42,"author":{"gitId":"-"},"content":" private static final String[] FILESIZE_LIMIT_HEADER \u003d {\"File Size Limit\"};"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":" public RepoConfigCsvParser(Path csvFilePath) throws FileNotFoundException {"},{"lineNumber":45,"author":{"gitId":"-"},"content":" super(csvFilePath);"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }"},{"lineNumber":47,"author":{"gitId":"-"},"content":""},{"lineNumber":48,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":49,"author":{"gitId":"-"},"content":" * Gets the list of headers that are mandatory for verification."},{"lineNumber":50,"author":{"gitId":"-"},"content":" */"},{"lineNumber":51,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":52,"author":{"gitId":"-"},"content":" protected String[][] mandatoryHeaders() {"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return new String[][] {"},{"lineNumber":54,"author":{"gitId":"-"},"content":" LOCATION_HEADER,"},{"lineNumber":55,"author":{"gitId":"-"},"content":" };"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }"},{"lineNumber":57,"author":{"gitId":"-"},"content":""},{"lineNumber":58,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * Gets the list of optional headers that can be parsed."},{"lineNumber":60,"author":{"gitId":"-"},"content":" */"},{"lineNumber":61,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":62,"author":{"gitId":"-"},"content":" protected String[][] optionalHeaders() {"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return new String[][] {"},{"lineNumber":64,"author":{"gitId":"-"},"content":" BRANCH_HEADER, FILE_FORMATS_HEADER, IGNORE_GLOB_LIST_HEADER, IGNORE_STANDALONE_CONFIG_HEADER,"},{"lineNumber":65,"author":{"gitId":"-"},"content":" IGNORE_FILESIZE_LIMIT_HEADER, IGNORE_COMMIT_LIST_CONFIG_HEADER, IGNORE_AUTHOR_LIST_CONFIG_HEADER,"},{"lineNumber":66,"author":{"gitId":"-"},"content":" SHALLOW_CLONING_CONFIG_HEADER, FIND_PREVIOUS_AUTHORS_CONFIG_HEADER, FILESIZE_LIMIT_HEADER,"},{"lineNumber":67,"author":{"gitId":"-"},"content":" SKIP_IGNORED_FILE_ANALYSIS_HEADER"},{"lineNumber":68,"author":{"gitId":"-"},"content":" };"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }"},{"lineNumber":70,"author":{"gitId":"-"},"content":""},{"lineNumber":71,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * Processes the csv {@code record} line by line and add created {@link RepoConfiguration} into {@code results} but"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * ignores duplicated {@link RepoConfiguration} if there exists one that has same {@code location} and"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * {@code branch}."},{"lineNumber":75,"author":{"gitId":"-"},"content":" *"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * @throws InvalidLocationException if the location represented in {@code record} is invalid."},{"lineNumber":77,"author":{"gitId":"-"},"content":" */"},{"lineNumber":78,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":79,"author":{"gitId":"-"},"content":" protected void processLine(List\u003cRepoConfiguration\u003e results, CSVRecord record) throws InvalidLocationException {"},{"lineNumber":80,"author":{"gitId":"-"},"content":" // The variable expansion is performed to simulate running the same location from command line."},{"lineNumber":81,"author":{"gitId":"-"},"content":" // This helps to support things like tilde expansion and other Bash/CMD features."},{"lineNumber":82,"author":{"gitId":"-"},"content":" RepoLocation location \u003d new RepoLocation(FileUtil.getVariableExpandedFilePath(get(record, LOCATION_HEADER)));"},{"lineNumber":83,"author":{"gitId":"-"},"content":" String branch \u003d getOrDefault(record, BRANCH_HEADER, RepoConfiguration.DEFAULT_BRANCH);"},{"lineNumber":84,"author":{"gitId":"-"},"content":""},{"lineNumber":85,"author":{"gitId":"-"},"content":" boolean isFormatsOverriding \u003d isElementOverridingStandaloneConfig(record, FILE_FORMATS_HEADER);"},{"lineNumber":86,"author":{"gitId":"-"},"content":" List\u003cFileType\u003e formats \u003d FileType.convertFormatStringsToFileTypes("},{"lineNumber":87,"author":{"gitId":"-"},"content":" getAsListWithoutOverridePrefix(record, FILE_FORMATS_HEADER));"},{"lineNumber":88,"author":{"gitId":"-"},"content":""},{"lineNumber":89,"author":{"gitId":"-"},"content":" boolean isIgnoreGlobListOverriding \u003d isElementOverridingStandaloneConfig(record, IGNORE_GLOB_LIST_HEADER);"},{"lineNumber":90,"author":{"gitId":"-"},"content":" List\u003cString\u003e ignoreGlobList \u003d getAsListWithoutOverridePrefix(record, IGNORE_GLOB_LIST_HEADER);"},{"lineNumber":91,"author":{"gitId":"-"},"content":""},{"lineNumber":92,"author":{"gitId":"-"},"content":" boolean isIgnoreCommitListOverriding \u003d"},{"lineNumber":93,"author":{"gitId":"-"},"content":" isElementOverridingStandaloneConfig(record, IGNORE_COMMIT_LIST_CONFIG_HEADER);"},{"lineNumber":94,"author":{"gitId":"-"},"content":" List\u003cCommitHash\u003e ignoreCommitList \u003d CommitHash.convertStringsToCommits("},{"lineNumber":95,"author":{"gitId":"-"},"content":" getAsListWithoutOverridePrefix(record, IGNORE_COMMIT_LIST_CONFIG_HEADER));"},{"lineNumber":96,"author":{"gitId":"-"},"content":""},{"lineNumber":97,"author":{"gitId":"-"},"content":" boolean isIgnoredAuthorsListOverriding \u003d"},{"lineNumber":98,"author":{"gitId":"-"},"content":" isElementOverridingStandaloneConfig(record, IGNORE_AUTHOR_LIST_CONFIG_HEADER);"},{"lineNumber":99,"author":{"gitId":"-"},"content":" List\u003cString\u003e ignoredAuthorsList \u003d getAsListWithoutOverridePrefix(record, IGNORE_AUTHOR_LIST_CONFIG_HEADER);"},{"lineNumber":100,"author":{"gitId":"-"},"content":""},{"lineNumber":101,"author":{"gitId":"-"},"content":" boolean isFileSizeLimitIgnored \u003d matchValueAndKeyword(record, IGNORE_FILESIZE_LIMIT_HEADER,"},{"lineNumber":102,"author":{"gitId":"-"},"content":" IGNORE_FILESIZE_LIMIT_KEYWORD);"},{"lineNumber":103,"author":{"gitId":"-"},"content":""},{"lineNumber":104,"author":{"gitId":"-"},"content":" boolean isIgnoredFileAnalysisSkipped \u003d matchValueAndKeyword(record, SKIP_IGNORED_FILE_ANALYSIS_HEADER,"},{"lineNumber":105,"author":{"gitId":"-"},"content":" SKIP_IGNORED_FILE_ANALYSIS_KEYWORD);"},{"lineNumber":106,"author":{"gitId":"-"},"content":""},{"lineNumber":107,"author":{"gitId":"-"},"content":" if (isFileSizeLimitIgnored \u0026\u0026 isIgnoredFileAnalysisSkipped) {"},{"lineNumber":108,"author":{"gitId":"-"},"content":" logger.warning(\"Ignoring skip ignored file analysis column since file size limit is ignored\");"},{"lineNumber":109,"author":{"gitId":"-"},"content":" isIgnoredFileAnalysisSkipped \u003d false;"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }"},{"lineNumber":111,"author":{"gitId":"-"},"content":""},{"lineNumber":112,"author":{"gitId":"-"},"content":" boolean isFileSizeLimitOverriding \u003d isElementOverridingStandaloneConfig(record, FILESIZE_LIMIT_HEADER);"},{"lineNumber":113,"author":{"gitId":"-"},"content":" List\u003cString\u003e fileSizeLimitStringList \u003d getAsListWithoutOverridePrefix(record, FILESIZE_LIMIT_HEADER);"},{"lineNumber":114,"author":{"gitId":"-"},"content":" long fileSizeLimit \u003d RepoConfiguration.DEFAULT_FILE_SIZE_LIMIT;"},{"lineNumber":115,"author":{"gitId":"-"},"content":""},{"lineNumber":116,"author":{"gitId":"-"},"content":" // If file diff limit is specified"},{"lineNumber":117,"author":{"gitId":"-"},"content":" if (fileSizeLimitStringList.size() \u003e 0) {"},{"lineNumber":118,"author":{"gitId":"asdfghjkxd"},"content":" String fileSizeLimitString \u003d fileSizeLimitStringList.get(0).trim();"},{"lineNumber":119,"author":{"gitId":"asdfghjkxd"},"content":" int parseValue;"},{"lineNumber":120,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":121,"author":{"gitId":"-"},"content":" if (isFileSizeLimitIgnored) {"},{"lineNumber":122,"author":{"gitId":"-"},"content":" logger.warning(\"Ignoring file size limit column since file size limit is ignored\");"},{"lineNumber":123,"author":{"gitId":"-"},"content":" isFileSizeLimitOverriding \u003d false;"},{"lineNumber":124,"author":{"gitId":"asdfghjkxd"},"content":" } else if (!StringsUtil.isNumeric(fileSizeLimitString)"},{"lineNumber":125,"author":{"gitId":"-"},"content":" || (parseValue \u003d Integer.parseInt(fileSizeLimitString)) \u003c\u003d 0) {"},{"lineNumber":126,"author":{"gitId":"-"},"content":" logger.warning(String.format(\"Values in \\\"%s\\\" column should be positive integers.\","},{"lineNumber":127,"author":{"gitId":"-"},"content":" FILESIZE_LIMIT_HEADER[0]));"},{"lineNumber":128,"author":{"gitId":"-"},"content":" isFileSizeLimitOverriding \u003d false;"},{"lineNumber":129,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":130,"author":{"gitId":"-"},"content":" fileSizeLimit \u003d parseValue;"},{"lineNumber":131,"author":{"gitId":"-"},"content":" }"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }"},{"lineNumber":133,"author":{"gitId":"-"},"content":""},{"lineNumber":134,"author":{"gitId":"-"},"content":" boolean isStandaloneConfigIgnored \u003d matchValueAndKeyword(record, IGNORE_STANDALONE_CONFIG_HEADER,"},{"lineNumber":135,"author":{"gitId":"-"},"content":" IGNORE_STANDALONE_CONFIG_KEYWORD);"},{"lineNumber":136,"author":{"gitId":"-"},"content":""},{"lineNumber":137,"author":{"gitId":"-"},"content":" boolean isShallowCloningPerformed \u003d matchValueAndKeyword(record, SHALLOW_CLONING_CONFIG_HEADER,"},{"lineNumber":138,"author":{"gitId":"-"},"content":" SHALLOW_CLONING_CONFIG_KEYWORD);"},{"lineNumber":139,"author":{"gitId":"-"},"content":""},{"lineNumber":140,"author":{"gitId":"-"},"content":" boolean isFindingPreviousAuthorsPerformed \u003d matchValueAndKeyword(record, FIND_PREVIOUS_AUTHORS_CONFIG_HEADER,"},{"lineNumber":141,"author":{"gitId":"-"},"content":" FIND_PREVIOUS_AUTHORS_KEYWORD);"},{"lineNumber":142,"author":{"gitId":"-"},"content":""},{"lineNumber":143,"author":{"gitId":"-"},"content":" addConfig(results, location, branch, isFormatsOverriding, formats, isIgnoreGlobListOverriding, ignoreGlobList,"},{"lineNumber":144,"author":{"gitId":"-"},"content":" isIgnoreCommitListOverriding, ignoreCommitList, isIgnoredAuthorsListOverriding, ignoredAuthorsList,"},{"lineNumber":145,"author":{"gitId":"-"},"content":" isFileSizeLimitIgnored, isIgnoredFileAnalysisSkipped, isFileSizeLimitOverriding, fileSizeLimit,"},{"lineNumber":146,"author":{"gitId":"-"},"content":" isStandaloneConfigIgnored, isShallowCloningPerformed, isFindingPreviousAuthorsPerformed);"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }"},{"lineNumber":148,"author":{"gitId":"-"},"content":""},{"lineNumber":149,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":150,"author":{"gitId":"-"},"content":" * Returns true if value from {@code record}, that matches any of the equivalent headers in"},{"lineNumber":151,"author":{"gitId":"-"},"content":" * {@code equivalentHeaders}, is the same as the given {@code keyword}, else false."},{"lineNumber":152,"author":{"gitId":"-"},"content":" */"},{"lineNumber":153,"author":{"gitId":"-"},"content":" private boolean matchValueAndKeyword(CSVRecord record, String[] equivalentHeaders, String keyword) {"},{"lineNumber":154,"author":{"gitId":"-"},"content":" String value \u003d get(record, equivalentHeaders);"},{"lineNumber":155,"author":{"gitId":"-"},"content":" boolean isIgnored \u003d value.equalsIgnoreCase(keyword);"},{"lineNumber":156,"author":{"gitId":"-"},"content":""},{"lineNumber":157,"author":{"gitId":"-"},"content":" if (!isIgnored \u0026\u0026 !value.isEmpty()) {"},{"lineNumber":158,"author":{"gitId":"-"},"content":" logger.warning(String.format(\"Ignoring unknown value %s in %s column.\", value, keyword.toLowerCase()));"},{"lineNumber":159,"author":{"gitId":"-"},"content":" }"},{"lineNumber":160,"author":{"gitId":"-"},"content":""},{"lineNumber":161,"author":{"gitId":"-"},"content":" return isIgnored;"},{"lineNumber":162,"author":{"gitId":"-"},"content":" }"},{"lineNumber":163,"author":{"gitId":"-"},"content":""},{"lineNumber":164,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":165,"author":{"gitId":"-"},"content":" * Creates a new {@link RepoConfiguration} with the supplied inputs and attempts to add it to {@code results}."},{"lineNumber":166,"author":{"gitId":"-"},"content":" * Does nothing if the repo already exists in {@code results}."},{"lineNumber":167,"author":{"gitId":"-"},"content":" */"},{"lineNumber":168,"author":{"gitId":"-"},"content":" private void addConfig(List\u003cRepoConfiguration\u003e results, RepoLocation location, String branch,"},{"lineNumber":169,"author":{"gitId":"-"},"content":" boolean isFormatsOverriding, List\u003cFileType\u003e formats, boolean isIgnoreGlobListOverriding,"},{"lineNumber":170,"author":{"gitId":"-"},"content":" List\u003cString\u003e ignoreGlobList, boolean isIgnoreCommitListOverriding, List\u003cCommitHash\u003e ignoreCommitList,"},{"lineNumber":171,"author":{"gitId":"-"},"content":" boolean isIgnoredAuthorsListOverriding, List\u003cString\u003e ignoredAuthorsList, boolean isFileSizeLimitIgnored,"},{"lineNumber":172,"author":{"gitId":"-"},"content":" boolean isIgnoredFileAnalysisSkipped, boolean isFileSizeLimitOverriding, long fileSizeLimit,"},{"lineNumber":173,"author":{"gitId":"-"},"content":" boolean isStandaloneConfigIgnored, boolean isShallowCloningPerformed,"},{"lineNumber":174,"author":{"gitId":"-"},"content":" boolean isFindingPreviousAuthorsPerformed) {"},{"lineNumber":175,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration config \u003d new RepoConfiguration.Builder()"},{"lineNumber":176,"author":{"gitId":"asdfghjkxd"},"content":" .location(location)"},{"lineNumber":177,"author":{"gitId":"asdfghjkxd"},"content":" .branch(branch)"},{"lineNumber":178,"author":{"gitId":"asdfghjkxd"},"content":" .fileTypeManager(formats)"},{"lineNumber":179,"author":{"gitId":"asdfghjkxd"},"content":" .ignoreGlobList(ignoreGlobList)"},{"lineNumber":180,"author":{"gitId":"asdfghjkxd"},"content":" .fileSizeLimit(fileSizeLimit)"},{"lineNumber":181,"author":{"gitId":"asdfghjkxd"},"content":" .isStandaloneConfigIgnored(isStandaloneConfigIgnored)"},{"lineNumber":182,"author":{"gitId":"asdfghjkxd"},"content":" .isFileSizeLimitIgnored(isFileSizeLimitIgnored)"},{"lineNumber":183,"author":{"gitId":"asdfghjkxd"},"content":" .ignoreCommitList(ignoreCommitList)"},{"lineNumber":184,"author":{"gitId":"asdfghjkxd"},"content":" .isFormatsOverriding(isFormatsOverriding)"},{"lineNumber":185,"author":{"gitId":"asdfghjkxd"},"content":" .isIgnoreGlobListOverriding(isIgnoreGlobListOverriding)"},{"lineNumber":186,"author":{"gitId":"asdfghjkxd"},"content":" .isIgnoreCommitListOverriding(isIgnoreCommitListOverriding)"},{"lineNumber":187,"author":{"gitId":"asdfghjkxd"},"content":" .isFileSizeLimitOverriding(isFileSizeLimitOverriding)"},{"lineNumber":188,"author":{"gitId":"asdfghjkxd"},"content":" .isShallowCloningPerformed(isShallowCloningPerformed)"},{"lineNumber":189,"author":{"gitId":"asdfghjkxd"},"content":" .isFindingPreviousAuthorsPerformed(isFindingPreviousAuthorsPerformed)"},{"lineNumber":190,"author":{"gitId":"asdfghjkxd"},"content":" .isIgnoredFileAnalysisSkipped(isIgnoredFileAnalysisSkipped)"},{"lineNumber":191,"author":{"gitId":"asdfghjkxd"},"content":" .ignoredAuthorsList(ignoredAuthorsList)"},{"lineNumber":192,"author":{"gitId":"asdfghjkxd"},"content":" .isIgnoredAuthorsListOverriding(isIgnoredAuthorsListOverriding)"},{"lineNumber":193,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":194,"author":{"gitId":"-"},"content":""},{"lineNumber":195,"author":{"gitId":"-"},"content":" if (results.contains(config)) {"},{"lineNumber":196,"author":{"gitId":"-"},"content":" logger.warning(\"Ignoring duplicated repository \" + location + \" \" + branch);"},{"lineNumber":197,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":198,"author":{"gitId":"-"},"content":" }"},{"lineNumber":199,"author":{"gitId":"-"},"content":""},{"lineNumber":200,"author":{"gitId":"-"},"content":" results.add(config);"},{"lineNumber":201,"author":{"gitId":"-"},"content":" }"},{"lineNumber":202,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":24,"-":178}},{"path":"src/main/java/reposense/parser/exceptions/InvalidCsvException.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.exceptions;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Signals that there is a major error in a CSV file (e.g. wrong number of columns, zero valid records)."},{"lineNumber":5,"author":{"gitId":"-"},"content":" */"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class InvalidCsvException extends Exception {"},{"lineNumber":7,"author":{"gitId":"-"},"content":" public InvalidCsvException(String message) {"},{"lineNumber":8,"author":{"gitId":"-"},"content":" super(message);"},{"lineNumber":9,"author":{"gitId":"-"},"content":" }"},{"lineNumber":10,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":9}},{"path":"src/main/java/reposense/parser/exceptions/InvalidHeaderException.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.exceptions;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Signals that there is a problem in the header of csv config file."},{"lineNumber":5,"author":{"gitId":"-"},"content":" */"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class InvalidHeaderException extends Exception {"},{"lineNumber":7,"author":{"gitId":"-"},"content":" public InvalidHeaderException(String message) {"},{"lineNumber":8,"author":{"gitId":"-"},"content":" super(message);"},{"lineNumber":9,"author":{"gitId":"-"},"content":" }"},{"lineNumber":10,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":9}},{"path":"src/main/java/reposense/parser/exceptions/InvalidLocationException.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.exceptions;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Signals that location cannot be represented by {@code URL} or {@code Path}."},{"lineNumber":5,"author":{"gitId":"-"},"content":" */"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class InvalidLocationException extends ParseException {"},{"lineNumber":7,"author":{"gitId":"-"},"content":" public InvalidLocationException(String message) {"},{"lineNumber":8,"author":{"gitId":"-"},"content":" super(message);"},{"lineNumber":9,"author":{"gitId":"-"},"content":" }"},{"lineNumber":10,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":9}},{"path":"src/main/java/reposense/parser/exceptions/ParseException.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.exceptions;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Signals that there is an exception when parsing a string."},{"lineNumber":5,"author":{"gitId":"-"},"content":" */"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class ParseException extends Exception {"},{"lineNumber":7,"author":{"gitId":"-"},"content":" public ParseException(String message) {"},{"lineNumber":8,"author":{"gitId":"-"},"content":" super(message);"},{"lineNumber":9,"author":{"gitId":"-"},"content":" }"},{"lineNumber":10,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":9}},{"path":"src/main/java/reposense/parser/types/AlphanumericArgumentType.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.types;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.regex.Pattern;"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.Argument;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParser;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParserException;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentType;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Represents an alphanumeric type {@code String} argument."},{"lineNumber":12,"author":{"gitId":"-"},"content":" */"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class AlphanumericArgumentType implements ArgumentType\u003cString\u003e {"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private static final String PARSE_EXCEPTION_MESSAGE_NOT_IN_ALPLANUMERIC \u003d"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \"Invalid format. It must be in alphanumeric.\";"},{"lineNumber":16,"author":{"gitId":"-"},"content":" private static final Pattern ALPHANUMERIC_PATTERN \u003d Pattern.compile(\"[A-Za-z0-9]+\");"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public String convert(ArgumentParser parser, Argument arg, String value) throws ArgumentParserException {"},{"lineNumber":20,"author":{"gitId":"-"},"content":" if (!ALPHANUMERIC_PATTERN.matcher(value).matches()) {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" throw new ArgumentParserException("},{"lineNumber":22,"author":{"gitId":"-"},"content":" String.format(PARSE_EXCEPTION_MESSAGE_NOT_IN_ALPLANUMERIC, value), parser);"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":" return value;"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }"},{"lineNumber":27,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":26}},{"path":"src/main/java/reposense/parser/types/AnalysisThreadsArgumentType.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.types;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.Argument;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParser;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParserException;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentType;"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Verifies and parses a string-formatted integer to an {@link Integer} object."},{"lineNumber":10,"author":{"gitId":"-"},"content":" */"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class AnalysisThreadsArgumentType implements ArgumentType\u003cInteger\u003e {"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public Integer convert(ArgumentParser parser, Argument arg, String value) throws ArgumentParserException {"},{"lineNumber":13,"author":{"gitId":"-"},"content":" return Integer.parseInt(value);"},{"lineNumber":14,"author":{"gitId":"-"},"content":" }"},{"lineNumber":15,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":14}},{"path":"src/main/java/reposense/parser/types/AssetsFolderArgumentType.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.types;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.impl.Arguments;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.Argument;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParser;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParserException;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentType;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * Checks the argument of {@code --assets} flag."},{"lineNumber":14,"author":{"gitId":"-"},"content":" */"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class AssetsFolderArgumentType implements ArgumentType\u003cPath\u003e {"},{"lineNumber":16,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public Path convert(ArgumentParser parser, Argument arg, String value) throws ArgumentParserException {"},{"lineNumber":18,"author":{"gitId":"-"},"content":" // Piggyback on library methods to do file existence checks"},{"lineNumber":19,"author":{"gitId":"-"},"content":" Arguments.fileType().verifyExists().verifyIsDirectory().verifyCanRead().convert(parser, arg, value);"},{"lineNumber":20,"author":{"gitId":"-"},"content":" return Paths.get(value);"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }"},{"lineNumber":22,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":21}},{"path":"src/main/java/reposense/parser/types/CloningThreadsArgumentType.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.types;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.Argument;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParser;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParserException;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentType;"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Verifies and parses a string-formatted integer to an {@link Integer} object."},{"lineNumber":10,"author":{"gitId":"-"},"content":" */"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class CloningThreadsArgumentType implements ArgumentType\u003cInteger\u003e {"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public Integer convert(ArgumentParser parser, Argument arg, String value) throws ArgumentParserException {"},{"lineNumber":13,"author":{"gitId":"-"},"content":" return Integer.parseInt(value);"},{"lineNumber":14,"author":{"gitId":"-"},"content":" }"},{"lineNumber":15,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":14}},{"path":"src/main/java/reposense/parser/types/ConfigFolderArgumentType.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.types;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Files;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.impl.Arguments;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.Argument;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParser;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParserException;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentType;"},{"lineNumber":12,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.RepoConfigCsvParser;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Checks the argument of {@code --config} flag."},{"lineNumber":16,"author":{"gitId":"-"},"content":" */"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class ConfigFolderArgumentType implements ArgumentType\u003cPath\u003e {"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private static final String PARSE_EXCEPTION_MESSAGE_MISSING_REQUIRED_CONFIG_FILES \u003d"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \"The required config file %s is not found in the specified folder.\";"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public Path convert(ArgumentParser parser, Argument arg, String value) throws ArgumentParserException {"},{"lineNumber":23,"author":{"gitId":"-"},"content":" // Piggyback on library methods to do file existence checks"},{"lineNumber":24,"author":{"gitId":"-"},"content":" Arguments.fileType().verifyExists().verifyIsDirectory().verifyCanRead().convert(parser, arg, value);"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":" if (Files.exists(Paths.get(value).resolve(RepoConfigCsvParser.REPO_CONFIG_FILENAME))) {"},{"lineNumber":27,"author":{"gitId":"-"},"content":" return Paths.get(value);"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"-"},"content":" throw new ArgumentParserException(String.format(PARSE_EXCEPTION_MESSAGE_MISSING_REQUIRED_CONFIG_FILES,"},{"lineNumber":31,"author":{"gitId":"-"},"content":" RepoConfigCsvParser.REPO_CONFIG_FILENAME), parser);"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }"},{"lineNumber":33,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":2,"-":31}},{"path":"src/main/java/reposense/parser/types/DateArgumentType.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.types;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.time.LocalDateTime;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Optional;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.Argument;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParser;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParserException;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentType;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import reposense.util.TimeUtil;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * Verifies and parses a string-formatted date to a {@link LocalDateTime} object."},{"lineNumber":14,"author":{"gitId":"-"},"content":" */"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class DateArgumentType implements ArgumentType\u003cOptional\u003cLocalDateTime\u003e\u003e {"},{"lineNumber":16,"author":{"gitId":"-"},"content":" private static final String PARSE_EXCEPTION_MESSAGE_INVALID_DATE_STRING_FORMAT \u003d \"Invalid Date: %s\";"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public Optional\u003cLocalDateTime\u003e convert(ArgumentParser parser, Argument arg, String value)"},{"lineNumber":20,"author":{"gitId":"-"},"content":" throws ArgumentParserException {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":22,"author":{"gitId":"-"},"content":" return Optional.of(TimeUtil.parseDate(value));"},{"lineNumber":23,"author":{"gitId":"-"},"content":" } catch (java.text.ParseException pe) {"},{"lineNumber":24,"author":{"gitId":"-"},"content":" throw new ArgumentParserException("},{"lineNumber":25,"author":{"gitId":"-"},"content":" String.format(PARSE_EXCEPTION_MESSAGE_INVALID_DATE_STRING_FORMAT, value), parser);"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }"},{"lineNumber":28,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":27}},{"path":"src/main/java/reposense/parser/types/OutputFolderArgumentType.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.types;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.impl.Arguments;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.Argument;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParser;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParserException;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentType;"},{"lineNumber":11,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.ArgsParser;"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Checks the argument of {@code --output} flag."},{"lineNumber":15,"author":{"gitId":"-"},"content":" */"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class OutputFolderArgumentType implements ArgumentType\u003cPath\u003e {"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public Path convert(ArgumentParser parser, Argument arg, String value) throws ArgumentParserException {"},{"lineNumber":19,"author":{"gitId":"-"},"content":" // Piggyback on library methods to do file existence checks"},{"lineNumber":20,"author":{"gitId":"-"},"content":" Arguments.fileType().verifyExists().verifyIsDirectory().verifyCanWrite()"},{"lineNumber":21,"author":{"gitId":"-"},"content":" .or()"},{"lineNumber":22,"author":{"gitId":"-"},"content":" .verifyNotExists().convert(parser, arg, value);"},{"lineNumber":23,"author":{"gitId":"-"},"content":" return Paths.get(value).resolve(ArgsParser.DEFAULT_REPORT_NAME);"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }"},{"lineNumber":25,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":2,"-":23}},{"path":"src/main/java/reposense/parser/types/PeriodArgumentType.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.types;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Optional;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.regex.Pattern;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.Argument;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParser;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParserException;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentType;"},{"lineNumber":10,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.ParseException;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * Verifies and parses a string-formatted period to an integer."},{"lineNumber":14,"author":{"gitId":"-"},"content":" */"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class PeriodArgumentType implements ArgumentType\u003cOptional\u003cInteger\u003e\u003e {"},{"lineNumber":16,"author":{"gitId":"-"},"content":" private static final String PARSE_EXCEPTION_MESSAGE_NOT_IN_NUMERIC \u003d"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \"Invalid format. Period must be in the format of nd (n days) or nw (n weeks), \""},{"lineNumber":18,"author":{"gitId":"-"},"content":" + \"where n is a number greater than 0.\";"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private static final String PARSE_EXCEPTION_MESSAGE_SMALLER_THAN_ZERO \u003d"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \"Invalid format. Period must be greater than 0.\";"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final String PARSE_EXCEPTION_MESSAGE_NUMBER_TOO_LARGE \u003d"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \"Invalid format. Input number may be too large.\";"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final Pattern PERIOD_PATTERN \u003d Pattern.compile(\"[0-9]+[dw]\");"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public Optional\u003cInteger\u003e convert(ArgumentParser parser, Argument arg, String value) throws ArgumentParserException {"},{"lineNumber":27,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":28,"author":{"gitId":"-"},"content":" return parse(value);"},{"lineNumber":29,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {"},{"lineNumber":30,"author":{"gitId":"-"},"content":" throw new ArgumentParserException(pe.getMessage(), parser);"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }"},{"lineNumber":33,"author":{"gitId":"-"},"content":""},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Parses a {@code period} String and returns an {@link Integer} representing the number of days."},{"lineNumber":36,"author":{"gitId":"-"},"content":" *"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * @throws ParseException if period format or number is invalid."},{"lineNumber":38,"author":{"gitId":"-"},"content":" */"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public static Optional\u003cInteger\u003e parse(String period) throws ParseException {"},{"lineNumber":40,"author":{"gitId":"-"},"content":" if (!PERIOD_PATTERN.matcher(period).matches()) {"},{"lineNumber":41,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(PARSE_EXCEPTION_MESSAGE_NOT_IN_NUMERIC, period));"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":" int multiplier \u003d period.substring(period.length() - 1).equals(\"d\") ? 1 : 7;"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":47,"author":{"gitId":"-"},"content":" int convertedValue \u003d Integer.parseInt(period.substring(0, period.length() - 1)) * multiplier;"},{"lineNumber":48,"author":{"gitId":"-"},"content":" if (convertedValue \u003c\u003d 0) {"},{"lineNumber":49,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(PARSE_EXCEPTION_MESSAGE_SMALLER_THAN_ZERO, period));"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }"},{"lineNumber":51,"author":{"gitId":"-"},"content":""},{"lineNumber":52,"author":{"gitId":"-"},"content":" return Optional.of(convertedValue);"},{"lineNumber":53,"author":{"gitId":"-"},"content":" } catch (NumberFormatException e) {"},{"lineNumber":54,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(PARSE_EXCEPTION_MESSAGE_NUMBER_TOO_LARGE, period));"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }"},{"lineNumber":57,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":2,"-":55}},{"path":"src/main/java/reposense/parser/types/ReportFolderArgumentType.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.types;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.impl.Arguments;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.Argument;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParser;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParserException;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentType;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * Checks the argument of {@code --view} flag."},{"lineNumber":14,"author":{"gitId":"-"},"content":" */"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class ReportFolderArgumentType implements ArgumentType\u003cPath\u003e {"},{"lineNumber":16,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public Path convert(ArgumentParser parser, Argument arg, String value) throws ArgumentParserException {"},{"lineNumber":18,"author":{"gitId":"-"},"content":" // Piggyback on library methods to do file existence checks"},{"lineNumber":19,"author":{"gitId":"-"},"content":" Arguments.fileType().verifyExists().verifyIsDirectory().verifyCanRead().convert(parser, arg, value);"},{"lineNumber":20,"author":{"gitId":"-"},"content":" return Paths.get(value);"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }"},{"lineNumber":22,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":21}},{"path":"src/main/java/reposense/parser/types/SinceDateArgumentType.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.types;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.time.Instant;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.time.LocalDateTime;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.time.ZoneId;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.time.ZonedDateTime;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Optional;"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.Argument;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParser;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParserException;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import reposense.util.TimeUtil;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Verifies and parses a string-formatted since date to a {@link LocalDateTime} object."},{"lineNumber":16,"author":{"gitId":"-"},"content":" */"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class SinceDateArgumentType extends DateArgumentType {"},{"lineNumber":18,"author":{"gitId":"-"},"content":" /*"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * When user specifies \"d1\", arbitrary first commit date will be returned."},{"lineNumber":20,"author":{"gitId":"-"},"content":" * This date is equivalent to 1970-01-01 00:00:00 in UTC time."},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Then, ReportGenerator will replace the arbitrary since date with the earliest commit date."},{"lineNumber":22,"author":{"gitId":"-"},"content":" */"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public static final String FIRST_COMMIT_DATE_SHORTHAND \u003d \"d1\";"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final ZonedDateTime ARBITRARY_FIRST_COMMIT_DATE_UTC \u003d ZonedDateTime.ofInstant("},{"lineNumber":25,"author":{"gitId":"-"},"content":" Instant.ofEpochMilli(0), ZoneId.of(\"Z\"));"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final LocalDateTime ARBITRARY_FIRST_COMMIT_DATE_LOCAL \u003d ARBITRARY_FIRST_COMMIT_DATE_UTC"},{"lineNumber":27,"author":{"gitId":"-"},"content":" .toLocalDateTime();"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * Returns an arbitrary year {@link SinceDateArgumentType#ARBITRARY_FIRST_COMMIT_DATE_LOCAL} if user specifies"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * {@link SinceDateArgumentType#FIRST_COMMIT_DATE_SHORTHAND} in {@code value}, or attempts to return the"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * desired date otherwise."},{"lineNumber":33,"author":{"gitId":"-"},"content":" *"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * @throws ArgumentParserException if the given date cannot be parsed."},{"lineNumber":35,"author":{"gitId":"-"},"content":" */"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public Optional\u003cLocalDateTime\u003e convert(ArgumentParser parser, Argument arg, String value)"},{"lineNumber":38,"author":{"gitId":"-"},"content":" throws ArgumentParserException {"},{"lineNumber":39,"author":{"gitId":"-"},"content":" if (FIRST_COMMIT_DATE_SHORTHAND.equals(value)) {"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return Optional.of(ARBITRARY_FIRST_COMMIT_DATE_LOCAL);"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }"},{"lineNumber":42,"author":{"gitId":"-"},"content":" String sinceDate \u003d TimeUtil.extractDate(value);"},{"lineNumber":43,"author":{"gitId":"-"},"content":" return super.convert(parser, arg, sinceDate + \" 00:00:00\");"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Returns the {@link SinceDateArgumentType#ARBITRARY_FIRST_COMMIT_DATE_LOCAL}, which is the"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * {@link LocalDateTime} of {@link SinceDateArgumentType#ARBITRARY_FIRST_COMMIT_DATE_UTC}."},{"lineNumber":49,"author":{"gitId":"-"},"content":" */"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public static LocalDateTime getArbitraryFirstCommitDateLocal() {"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return ARBITRARY_FIRST_COMMIT_DATE_LOCAL;"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }"},{"lineNumber":53,"author":{"gitId":"-"},"content":""},{"lineNumber":54,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * Returns the {@link SinceDateArgumentType#ARBITRARY_FIRST_COMMIT_DATE_UTC} adjusted for the time zone based on"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * {@code toZoneId} and converted to a {@link LocalDateTime} object."},{"lineNumber":57,"author":{"gitId":"-"},"content":" */"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public static LocalDateTime getArbitraryFirstCommitDateConverted(ZoneId toZoneId) {"},{"lineNumber":59,"author":{"gitId":"-"},"content":" return ARBITRARY_FIRST_COMMIT_DATE_UTC.withZoneSameInstant(toZoneId).toLocalDateTime();"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }"},{"lineNumber":61,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":60}},{"path":"src/main/java/reposense/parser/types/UntilDateArgumentType.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.types;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.time.LocalDateTime;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Optional;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.Argument;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParser;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParserException;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import reposense.util.TimeUtil;"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Verifies and parses a string-formatted until date to a {@link LocalDateTime} object."},{"lineNumber":13,"author":{"gitId":"-"},"content":" */"},{"lineNumber":14,"author":{"gitId":"-"},"content":""},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class UntilDateArgumentType extends DateArgumentType {"},{"lineNumber":16,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public Optional\u003cLocalDateTime\u003e convert(ArgumentParser parser, Argument arg, String value)"},{"lineNumber":18,"author":{"gitId":"-"},"content":" throws ArgumentParserException {"},{"lineNumber":19,"author":{"gitId":"-"},"content":" String untilDate \u003d TimeUtil.extractDate(value);"},{"lineNumber":20,"author":{"gitId":"-"},"content":" return super.convert(parser, arg, untilDate + \" 23:59:59\");"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }"},{"lineNumber":22,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":21}},{"path":"src/main/java/reposense/parser/types/ZoneIdArgumentType.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.types;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.time.DateTimeException;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.time.ZoneId;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.Argument;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParser;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParserException;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentType;"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Verifies and parses a string-formatted zone id to a {@link ZoneId} object."},{"lineNumber":13,"author":{"gitId":"-"},"content":" */"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public class ZoneIdArgumentType implements ArgumentType\u003cZoneId\u003e {"},{"lineNumber":15,"author":{"gitId":"-"},"content":" private static final String MESSAGE_TIMEZONE_INVALID \u003d"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \"The timezone provided is invalid, please use a more widely accepted format. E.g. UTC[±hh[mm]]\";"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public ZoneId convert(ArgumentParser parser, Argument arg, String value) throws ArgumentParserException {"},{"lineNumber":20,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" return ZoneId.of(value);"},{"lineNumber":22,"author":{"gitId":"-"},"content":" } catch (DateTimeException dte) {"},{"lineNumber":23,"author":{"gitId":"-"},"content":" throw new ArgumentParserException(MESSAGE_TIMEZONE_INVALID, parser);"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }"},{"lineNumber":25,"author":{"gitId":"-"},"content":" }"},{"lineNumber":26,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":25}},{"path":"src/main/java/reposense/util/StringsUtil.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.util;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.regex.Pattern;"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Contains strings related utilities."},{"lineNumber":7,"author":{"gitId":"-"},"content":" */"},{"lineNumber":8,"author":{"gitId":"-"},"content":"public class StringsUtil {"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":" private static final Pattern SPECIAL_SYMBOLS \u003d Pattern.compile(\"[@;:\u0026/\\\\\\\\!\u003c\u003e{}%#\\\"\\\\-\u003d\u0027()\\\\[\\\\].+*?^$|]\");"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * Filters the {@code text}, returning only the lines that matches the given {@code regex}."},{"lineNumber":14,"author":{"gitId":"-"},"content":" */"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static String filterText(String text, String regex) {"},{"lineNumber":16,"author":{"gitId":"-"},"content":" String[] split \u003d text.split(\"\\n\");"},{"lineNumber":17,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();"},{"lineNumber":18,"author":{"gitId":"asdfghjkxd"},"content":" Pattern regexPattern \u003d Pattern.compile(regex);"},{"lineNumber":19,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":" for (String line: split) {"},{"lineNumber":21,"author":{"gitId":"asdfghjkxd"},"content":" if (regexPattern.matcher(line).matches()) {"},{"lineNumber":22,"author":{"gitId":"asdfghjkxd"},"content":" sb.append(line).append(\"\\n\");"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":" return sb.toString();"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * Converts all special symbol characters inside {@code regexString} to the {@code replacementCharacter}."},{"lineNumber":31,"author":{"gitId":"-"},"content":" */"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static String replaceSpecialSymbols(String regexString, String replacementCharacter) {"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return SPECIAL_SYMBOLS.matcher(regexString).replaceAll(replacementCharacter);"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Adds quotes to the string."},{"lineNumber":38,"author":{"gitId":"-"},"content":" */"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public static String addQuotes(String original) {"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return \"\\\"\" + original + \"\\\"\";"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }"},{"lineNumber":42,"author":{"gitId":"-"},"content":""},{"lineNumber":43,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Adds the appropriate quotation marks for a file path depending on the OS."},{"lineNumber":45,"author":{"gitId":"-"},"content":" */"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public static String addQuotesForFilePath(String filePath) {"},{"lineNumber":47,"author":{"gitId":"-"},"content":" if (SystemUtil.isWindows()) {"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return \"\\\"\" + filePath + \"\\\"\";"},{"lineNumber":49,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":50,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();"},{"lineNumber":51,"author":{"gitId":"-"},"content":" for (int i \u003d 0; i \u003c filePath.length(); i++) {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" char c \u003d filePath.charAt(i);"},{"lineNumber":53,"author":{"gitId":"-"},"content":" if (c \u003d\u003d \u0027\\\u0027\u0027) {"},{"lineNumber":54,"author":{"gitId":"-"},"content":" sb.append(\"\u0027\\\"\u0027\\\"\u0027\");"},{"lineNumber":55,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":56,"author":{"gitId":"-"},"content":" sb.append(c);"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }"},{"lineNumber":59,"author":{"gitId":"-"},"content":" return \u0027\\\u0027\u0027 + sb.toString() + \u0027\\\u0027\u0027;"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }"},{"lineNumber":62,"author":{"gitId":"-"},"content":""},{"lineNumber":63,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * Removes quotes at the start and end of {@code original}, if exists."},{"lineNumber":65,"author":{"gitId":"-"},"content":" */"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public static String removeQuote(String original) {"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return (original.startsWith(\"\\\"\") \u0026\u0026 original.endsWith(\"\\\"\"))"},{"lineNumber":68,"author":{"gitId":"-"},"content":" ? original.substring(1, original.length() - 1)"},{"lineNumber":69,"author":{"gitId":"-"},"content":" : original;"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }"},{"lineNumber":71,"author":{"gitId":"-"},"content":""},{"lineNumber":72,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * Removes trailing backslashes from a {@code string}, if it exists."},{"lineNumber":74,"author":{"gitId":"-"},"content":" */"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public static String removeTrailingBackslash(String string) {"},{"lineNumber":76,"author":{"gitId":"-"},"content":" if (string.isEmpty()) {"},{"lineNumber":77,"author":{"gitId":"-"},"content":" return string;"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }"},{"lineNumber":79,"author":{"gitId":"-"},"content":" int lastCharIndex \u003d string.length() - 1;"},{"lineNumber":80,"author":{"gitId":"-"},"content":" String editedString \u003d string;"},{"lineNumber":81,"author":{"gitId":"-"},"content":" boolean isLastCharBackslash \u003d string.charAt(lastCharIndex) \u003d\u003d \u0027\\\\\u0027;"},{"lineNumber":82,"author":{"gitId":"-"},"content":" while (isLastCharBackslash) {"},{"lineNumber":83,"author":{"gitId":"-"},"content":" editedString \u003d editedString.substring(0, lastCharIndex--);"},{"lineNumber":84,"author":{"gitId":"-"},"content":" boolean isStringEmpty \u003d editedString.length() \u003d\u003d 0;"},{"lineNumber":85,"author":{"gitId":"-"},"content":" isLastCharBackslash \u003d !isStringEmpty \u0026\u0026 editedString.charAt(lastCharIndex) \u003d\u003d \u0027\\\\\u0027;"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }"},{"lineNumber":87,"author":{"gitId":"-"},"content":" return editedString;"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }"},{"lineNumber":89,"author":{"gitId":"-"},"content":""},{"lineNumber":90,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * Returns true iff {@code string} is purely numeric."},{"lineNumber":92,"author":{"gitId":"-"},"content":" */"},{"lineNumber":93,"author":{"gitId":"-"},"content":" public static boolean isNumeric(String string) {"},{"lineNumber":94,"author":{"gitId":"-"},"content":" return Pattern.compile(\"^\\\\d+$\").matcher(string).matches();"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }"},{"lineNumber":96,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":4,"-":92}},{"path":"src/main/java/reposense/util/TimeUtil.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.util;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.time.LocalDateTime;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.time.ZoneId;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.time.format.DateTimeFormatter;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.time.format.DateTimeParseException;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.time.format.ResolverStyle;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.regex.Matcher;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.regex.Pattern;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.SinceDateArgumentType;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import reposense.system.LogsManager;"},{"lineNumber":14,"author":{"gitId":"-"},"content":""},{"lineNumber":15,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Contains time related functionalities."},{"lineNumber":17,"author":{"gitId":"-"},"content":" */"},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class TimeUtil {"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private static Long startTime;"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private static final String DATE_FORMAT_REGEX \u003d"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \"^((0?[1-9]|[12][0-9]|3[01])\\\\/(0?[1-9]|1[012])\\\\/(19|2[0-9])[0-9]{2})\";"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":" // \"uuuu\" is used for year since \"yyyy\" does not work with ResolverStyle.STRICT"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final DateTimeFormatter CLI_ARGS_DATE_FORMAT \u003d DateTimeFormatter.ofPattern(\"d/M/uuuu HH:mm:ss\");"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final String EARLIEST_VALID_DATE \u003d \"1970-01-01T00:00:00\";"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final String LATEST_VALID_DATE \u003d \"2099-12-31T23:59:59\";"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private static final String MESSAGE_SINCE_DATE_EARLIER_THAN_EARLIEST_VALID_DATE \u003d"},{"lineNumber":29,"author":{"gitId":"-"},"content":" \"Date of %s must not be earlier than \""},{"lineNumber":30,"author":{"gitId":"-"},"content":" + String.format(\"%s, resetting it to earliest valid date\", EARLIEST_VALID_DATE);"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final String MESSAGE_UNTIL_DATE_LATER_THAN_LATEST_VALID_DATE \u003d"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \"Date of %s must not be later than \""},{"lineNumber":33,"author":{"gitId":"-"},"content":" + String.format(\"%s, resetting it to latest valid date\", LATEST_VALID_DATE);"},{"lineNumber":34,"author":{"gitId":"-"},"content":""},{"lineNumber":35,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsManager.getLogger(TimeUtil.class);"},{"lineNumber":36,"author":{"gitId":"-"},"content":""},{"lineNumber":37,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Sets the {@code startTime} to be the current time."},{"lineNumber":39,"author":{"gitId":"-"},"content":" */"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public static void startTimer() {"},{"lineNumber":41,"author":{"gitId":"-"},"content":" startTime \u003d System.nanoTime();"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * Returns the formatted elapsed time from {@code startTime} until current time."},{"lineNumber":46,"author":{"gitId":"-"},"content":" */"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public static String getElapsedTime() {"},{"lineNumber":48,"author":{"gitId":"-"},"content":" long endTime \u003d System.nanoTime();"},{"lineNumber":49,"author":{"gitId":"-"},"content":" double elapsedTime \u003d (double) (endTime - startTime) / 1_000_000_000.0;"},{"lineNumber":50,"author":{"gitId":"-"},"content":" int elapsedHours \u003d (int) elapsedTime / 3600;"},{"lineNumber":51,"author":{"gitId":"-"},"content":" int elapsedMinutes \u003d (int) (elapsedTime % 3600) / 60;"},{"lineNumber":52,"author":{"gitId":"-"},"content":" double elapsedSeconds \u003d elapsedTime % 60;"},{"lineNumber":53,"author":{"gitId":"-"},"content":" String formattedElapsedTime \u003d \"\";"},{"lineNumber":54,"author":{"gitId":"-"},"content":""},{"lineNumber":55,"author":{"gitId":"-"},"content":" if (elapsedHours \u003e 0) {"},{"lineNumber":56,"author":{"gitId":"-"},"content":" formattedElapsedTime +\u003d String.format(\" %d hour(s)\", elapsedHours);"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }"},{"lineNumber":58,"author":{"gitId":"-"},"content":""},{"lineNumber":59,"author":{"gitId":"-"},"content":" if (elapsedMinutes \u003e 0) {"},{"lineNumber":60,"author":{"gitId":"-"},"content":" formattedElapsedTime +\u003d String.format(\" %d minute(s)\", elapsedMinutes);"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }"},{"lineNumber":62,"author":{"gitId":"-"},"content":""},{"lineNumber":63,"author":{"gitId":"-"},"content":" formattedElapsedTime +\u003d String.format(\" %.2f second(s)\", elapsedSeconds);"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return formattedElapsedTime;"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }"},{"lineNumber":66,"author":{"gitId":"-"},"content":""},{"lineNumber":67,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":68,"author":{"gitId":"-"},"content":" * Returns the formatted elapsed time from {@code startTime} until current time,"},{"lineNumber":69,"author":{"gitId":"-"},"content":" * with an additional explanatory string."},{"lineNumber":70,"author":{"gitId":"-"},"content":" */"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public static String getElapsedTimeMessage() {"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return \"Elapsed processing time:\" + getElapsedTime();"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }"},{"lineNumber":74,"author":{"gitId":"-"},"content":""},{"lineNumber":75,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * Returns a valid {@link LocalDateTime} that is set to midnight for the given {@code sinceDate}."},{"lineNumber":77,"author":{"gitId":"-"},"content":" */"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public static LocalDateTime getSinceDate(LocalDateTime sinceDate) {"},{"lineNumber":79,"author":{"gitId":"-"},"content":" return getValidDate(sinceDate).withHour(0).withMinute(0).withSecond(0);"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }"},{"lineNumber":81,"author":{"gitId":"-"},"content":""},{"lineNumber":82,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":83,"author":{"gitId":"-"},"content":" * Returns a valid {@link LocalDateTime} that is set to 23:59:59 for the given {@code untilDate}."},{"lineNumber":84,"author":{"gitId":"-"},"content":" */"},{"lineNumber":85,"author":{"gitId":"-"},"content":" public static LocalDateTime getUntilDate(LocalDateTime untilDate) {"},{"lineNumber":86,"author":{"gitId":"-"},"content":" return getValidDate(untilDate).withHour(23).withMinute(59).withSecond(59);"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }"},{"lineNumber":88,"author":{"gitId":"-"},"content":""},{"lineNumber":89,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * Returns a valid {@link LocalDateTime} that is within {@value EARLIEST_VALID_DATE} and {@value LATEST_VALID_DATE}."},{"lineNumber":91,"author":{"gitId":"-"},"content":" * Resets {@code date} passed the closest valid date if it exceeds the date range."},{"lineNumber":92,"author":{"gitId":"-"},"content":" */"},{"lineNumber":93,"author":{"gitId":"-"},"content":" public static LocalDateTime getValidDate(LocalDateTime date) {"},{"lineNumber":94,"author":{"gitId":"-"},"content":" if (date.isBefore(LocalDateTime.parse(EARLIEST_VALID_DATE))) {"},{"lineNumber":95,"author":{"gitId":"-"},"content":" logger.warning(String.format(MESSAGE_SINCE_DATE_EARLIER_THAN_EARLIEST_VALID_DATE, date));"},{"lineNumber":96,"author":{"gitId":"-"},"content":" return LocalDateTime.parse(EARLIEST_VALID_DATE);"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }"},{"lineNumber":98,"author":{"gitId":"-"},"content":""},{"lineNumber":99,"author":{"gitId":"-"},"content":" if (date.isAfter(LocalDateTime.parse(LATEST_VALID_DATE))) {"},{"lineNumber":100,"author":{"gitId":"-"},"content":" logger.warning(String.format(MESSAGE_UNTIL_DATE_LATER_THAN_LATEST_VALID_DATE, date));"},{"lineNumber":101,"author":{"gitId":"-"},"content":" return LocalDateTime.parse(LATEST_VALID_DATE);"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }"},{"lineNumber":103,"author":{"gitId":"-"},"content":" return date;"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }"},{"lineNumber":105,"author":{"gitId":"-"},"content":""},{"lineNumber":106,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":107,"author":{"gitId":"-"},"content":" * Returns a {@link LocalDateTime} that is one month before {@code cliUntilDate} (if present) or one month"},{"lineNumber":108,"author":{"gitId":"-"},"content":" * before report generation date otherwise."},{"lineNumber":109,"author":{"gitId":"-"},"content":" */"},{"lineNumber":110,"author":{"gitId":"-"},"content":" public static LocalDateTime getDateMinusAMonth(LocalDateTime cliUntilDate) {"},{"lineNumber":111,"author":{"gitId":"-"},"content":" return getSinceDate(cliUntilDate.minusMonths(1));"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }"},{"lineNumber":113,"author":{"gitId":"-"},"content":""},{"lineNumber":114,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":115,"author":{"gitId":"-"},"content":" * Returns a {@link LocalDateTime} that is {@code numOfDays} before {@code cliUntilDate} (if present) or one month"},{"lineNumber":116,"author":{"gitId":"-"},"content":" * before report generation date otherwise."},{"lineNumber":117,"author":{"gitId":"-"},"content":" */"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public static LocalDateTime getDateMinusNDays(LocalDateTime cliUntilDate, int numOfDays) {"},{"lineNumber":119,"author":{"gitId":"-"},"content":" return getSinceDate(cliUntilDate.minusDays(numOfDays));"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }"},{"lineNumber":121,"author":{"gitId":"-"},"content":""},{"lineNumber":122,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":123,"author":{"gitId":"-"},"content":" * Returns a {@link LocalDateTime} that is {@code numOfDays} after {@code cliSinceDate} (if present)."},{"lineNumber":124,"author":{"gitId":"-"},"content":" */"},{"lineNumber":125,"author":{"gitId":"-"},"content":" public static LocalDateTime getDatePlusNDays(LocalDateTime cliSinceDate, int numOfDays) {"},{"lineNumber":126,"author":{"gitId":"-"},"content":" return getUntilDate(cliSinceDate.plusDays(numOfDays));"},{"lineNumber":127,"author":{"gitId":"-"},"content":" }"},{"lineNumber":128,"author":{"gitId":"-"},"content":""},{"lineNumber":129,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":130,"author":{"gitId":"-"},"content":" * Returns current date with time set to 23:59:59. The time zone is adjusted to the given {@code zoneId}."},{"lineNumber":131,"author":{"gitId":"-"},"content":" */"},{"lineNumber":132,"author":{"gitId":"-"},"content":" public static LocalDateTime getCurrentDate(ZoneId zoneId) {"},{"lineNumber":133,"author":{"gitId":"-"},"content":" return LocalDateTime.now(zoneId).withHour(23).withMinute(59).withSecond(59).withNano(0);"},{"lineNumber":134,"author":{"gitId":"-"},"content":" }"},{"lineNumber":135,"author":{"gitId":"-"},"content":""},{"lineNumber":136,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":137,"author":{"gitId":"-"},"content":" * Returns the {@link LocalDateTime} of {@code ARBITRARY_FIRST_COMMIT_DATE} in the UTC time zone."},{"lineNumber":138,"author":{"gitId":"-"},"content":" */"},{"lineNumber":139,"author":{"gitId":"-"},"content":" public static LocalDateTime getArbitraryFirstCommitDateLocal() {"},{"lineNumber":140,"author":{"gitId":"-"},"content":" return SinceDateArgumentType.getArbitraryFirstCommitDateLocal();"},{"lineNumber":141,"author":{"gitId":"-"},"content":" }"},{"lineNumber":142,"author":{"gitId":"-"},"content":""},{"lineNumber":143,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":144,"author":{"gitId":"-"},"content":" * Returns the {@link LocalDateTime} of {@code ARBITRARY_FIRST_COMMIT_DATE} adjusted for the time zone based on"},{"lineNumber":145,"author":{"gitId":"-"},"content":" * {@code toZoneId}."},{"lineNumber":146,"author":{"gitId":"-"},"content":" */"},{"lineNumber":147,"author":{"gitId":"-"},"content":" public static LocalDateTime getArbitraryFirstCommitDateConverted(ZoneId toZoneId) {"},{"lineNumber":148,"author":{"gitId":"-"},"content":" return SinceDateArgumentType.getArbitraryFirstCommitDateConverted(toZoneId);"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }"},{"lineNumber":150,"author":{"gitId":"-"},"content":""},{"lineNumber":151,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":152,"author":{"gitId":"-"},"content":" * Checks whether the given {@code dateTime} is the {@code ARBITRARY_FIRST_COMMIT_DATE} in UTC time."},{"lineNumber":153,"author":{"gitId":"-"},"content":" */"},{"lineNumber":154,"author":{"gitId":"-"},"content":" public static boolean isEqualToArbitraryFirstDateUtc(LocalDateTime dateTime) {"},{"lineNumber":155,"author":{"gitId":"-"},"content":" return dateTime.equals(getArbitraryFirstCommitDateLocal());"},{"lineNumber":156,"author":{"gitId":"-"},"content":" }"},{"lineNumber":157,"author":{"gitId":"-"},"content":""},{"lineNumber":158,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":159,"author":{"gitId":"-"},"content":" * Checks whether the given {@code dateTime} is the {@code ARBITRARY_FIRST_COMMIT_DATE} in the time zone given by"},{"lineNumber":160,"author":{"gitId":"-"},"content":" * {@code zoneId}."},{"lineNumber":161,"author":{"gitId":"-"},"content":" */"},{"lineNumber":162,"author":{"gitId":"-"},"content":" public static boolean isEqualToArbitraryFirstDateConverted(LocalDateTime dateTime, ZoneId zoneId) {"},{"lineNumber":163,"author":{"gitId":"-"},"content":" return dateTime.equals(getArbitraryFirstCommitDateConverted(zoneId));"},{"lineNumber":164,"author":{"gitId":"-"},"content":" }"},{"lineNumber":165,"author":{"gitId":"-"},"content":""},{"lineNumber":166,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":167,"author":{"gitId":"-"},"content":" * Extracts the first substring of {@code date} string that matches the {@code DATE_FORMAT_REGEX}."},{"lineNumber":168,"author":{"gitId":"-"},"content":" */"},{"lineNumber":169,"author":{"gitId":"-"},"content":" public static String extractDate(String date) {"},{"lineNumber":170,"author":{"gitId":"-"},"content":" Matcher matcher \u003d Pattern.compile(DATE_FORMAT_REGEX).matcher(date);"},{"lineNumber":171,"author":{"gitId":"-"},"content":" String extractedDate \u003d date;"},{"lineNumber":172,"author":{"gitId":"-"},"content":" if (matcher.find()) {"},{"lineNumber":173,"author":{"gitId":"-"},"content":" extractedDate \u003d matcher.group(1);"},{"lineNumber":174,"author":{"gitId":"-"},"content":" }"},{"lineNumber":175,"author":{"gitId":"-"},"content":" return extractedDate;"},{"lineNumber":176,"author":{"gitId":"-"},"content":" }"},{"lineNumber":177,"author":{"gitId":"-"},"content":""},{"lineNumber":178,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":179,"author":{"gitId":"-"},"content":" * Parses the given {@code date} string as a {@link LocalDateTime} based on the {@code CLI_ARGS_DATE_FORMAT}."},{"lineNumber":180,"author":{"gitId":"-"},"content":" * Uses {@link ResolverStyle#STRICT} to avoid unexpected dates like 31/02/2020."},{"lineNumber":181,"author":{"gitId":"-"},"content":" *"},{"lineNumber":182,"author":{"gitId":"-"},"content":" * @throws java.text.ParseException if date cannot be parsed by the required format."},{"lineNumber":183,"author":{"gitId":"-"},"content":" */"},{"lineNumber":184,"author":{"gitId":"-"},"content":" public static LocalDateTime parseDate(String date) throws java.text.ParseException {"},{"lineNumber":185,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":186,"author":{"gitId":"-"},"content":" return LocalDateTime.parse(date, CLI_ARGS_DATE_FORMAT.withResolverStyle(ResolverStyle.STRICT));"},{"lineNumber":187,"author":{"gitId":"-"},"content":" } catch (DateTimeParseException e) {"},{"lineNumber":188,"author":{"gitId":"-"},"content":" throw new java.text.ParseException(String.format("},{"lineNumber":189,"author":{"gitId":"-"},"content":" \"Exception message: %s\\n\", e.getMessage()), e.getErrorIndex());"},{"lineNumber":190,"author":{"gitId":"-"},"content":" }"},{"lineNumber":191,"author":{"gitId":"-"},"content":" }"},{"lineNumber":192,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":191}},{"path":"src/systemtest/java/reposense/ConfigSystemTest.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.apache.tools.ant.types.Commandline.translateCommandline;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static reposense.util.TestUtil.loadResource;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Arrays;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.AfterEach;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.parallel.Execution;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.parallel.ExecutionMode;"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":"import reposense.model.SupportedDomainUrlMap;"},{"lineNumber":18,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.SinceDateArgumentType;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import reposense.report.ErrorSummary;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import reposense.util.FileUtil;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import reposense.util.InputBuilder;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import reposense.util.SystemTestUtil;"},{"lineNumber":23,"author":{"gitId":"-"},"content":""},{"lineNumber":24,"author":{"gitId":"-"},"content":"@Execution(ExecutionMode.SAME_THREAD)"},{"lineNumber":25,"author":{"gitId":"-"},"content":"public class ConfigSystemTest {"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e TESTING_FILE_FORMATS \u003d Arrays.asList(\"java\", \"adoc\");"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final String TEST_TIME_ZONE \u003d \"Asia/Singapore\";"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" private static final String OUTPUT_DIRECTORY \u003d \"ft_temp\";"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final Path REPORT_DIRECTORY_PATH \u003d Paths.get(OUTPUT_DIRECTORY, \"reposense-report\");"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static boolean didNotCloneRepoNormally \u003d true;"},{"lineNumber":33,"author":{"gitId":"-"},"content":""},{"lineNumber":34,"author":{"gitId":"-"},"content":" @BeforeEach"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public void setUp() throws Exception {"},{"lineNumber":36,"author":{"gitId":"-"},"content":" SupportedDomainUrlMap.clearAccessedSet();"},{"lineNumber":37,"author":{"gitId":"-"},"content":" FileUtil.deleteDirectory(OUTPUT_DIRECTORY);"},{"lineNumber":38,"author":{"gitId":"-"},"content":" ErrorSummary.getInstance().clearErrorSet();"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" @AfterEach"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public void tearDown() throws Exception {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" FileUtil.deleteDirectory(OUTPUT_DIRECTORY);"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * System test with a specified until date and a {@link SinceDateArgumentType#FIRST_COMMIT_DATE_SHORTHAND}"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * since date to capture from the first commit."},{"lineNumber":49,"author":{"gitId":"-"},"content":" */"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public void testSinceBeginningDateRange() {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" InputBuilder inputBuilder \u003d initInputBuilder()"},{"lineNumber":53,"author":{"gitId":"-"},"content":" .addSinceDate(SinceDateArgumentType.FIRST_COMMIT_DATE_SHORTHAND)"},{"lineNumber":54,"author":{"gitId":"-"},"content":" .addUntilDate(\"2/3/2019\");"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":" runTest(inputBuilder, false,"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \"ConfigSystemTest/sinceBeginningDateRange/expected\");"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }"},{"lineNumber":59,"author":{"gitId":"-"},"content":""},{"lineNumber":60,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public void test30DaysFromUntilDate() {"},{"lineNumber":62,"author":{"gitId":"-"},"content":" InputBuilder inputBuilder \u003d initInputBuilder().addUntilDate(\"1/11/2017\");"},{"lineNumber":63,"author":{"gitId":"-"},"content":""},{"lineNumber":64,"author":{"gitId":"-"},"content":" runTest(inputBuilder, false,"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \"ConfigSystemTest/30daysFromUntilDate/expected\");"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }"},{"lineNumber":67,"author":{"gitId":"-"},"content":""},{"lineNumber":68,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":69,"author":{"gitId":"-"},"content":" * System test with a specified since date and until date, with the last modified date time in each"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * line of code."},{"lineNumber":71,"author":{"gitId":"-"},"content":" */"},{"lineNumber":72,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":73,"author":{"gitId":"-"},"content":" public void testDateRangeWithModifiedDateTimeInLines() {"},{"lineNumber":74,"author":{"gitId":"-"},"content":" InputBuilder inputBuilder \u003d initInputBuilder()"},{"lineNumber":75,"author":{"gitId":"-"},"content":" .addSinceDate(\"1/9/2017\")"},{"lineNumber":76,"author":{"gitId":"-"},"content":" .addUntilDate(\"30/10/2017\")"},{"lineNumber":77,"author":{"gitId":"-"},"content":" .addLastModifiedDateFlags();"},{"lineNumber":78,"author":{"gitId":"-"},"content":""},{"lineNumber":79,"author":{"gitId":"-"},"content":" runTest(inputBuilder, false,"},{"lineNumber":80,"author":{"gitId":"-"},"content":" \"ConfigSystemTest/dateRangeWithModifiedDateTimeInLines/expected\");"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }"},{"lineNumber":82,"author":{"gitId":"-"},"content":""},{"lineNumber":83,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * System test with a specified until date and a {@link SinceDateArgumentType#FIRST_COMMIT_DATE_SHORTHAND}"},{"lineNumber":85,"author":{"gitId":"-"},"content":" * since date to capture from the first commit, using shallow cloning."},{"lineNumber":86,"author":{"gitId":"-"},"content":" */"},{"lineNumber":87,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":88,"author":{"gitId":"-"},"content":" public void testSinceBeginningDateRangeWithShallowCloning() {"},{"lineNumber":89,"author":{"gitId":"-"},"content":" InputBuilder inputBuilder \u003d initInputBuilder()"},{"lineNumber":90,"author":{"gitId":"-"},"content":" .addSinceDate(SinceDateArgumentType.FIRST_COMMIT_DATE_SHORTHAND)"},{"lineNumber":91,"author":{"gitId":"-"},"content":" .addUntilDate(\"2/3/2019\")"},{"lineNumber":92,"author":{"gitId":"-"},"content":" .addShallowCloning();"},{"lineNumber":93,"author":{"gitId":"-"},"content":""},{"lineNumber":94,"author":{"gitId":"-"},"content":" runTest(inputBuilder, true,"},{"lineNumber":95,"author":{"gitId":"-"},"content":" \"ConfigSystemTest/sinceBeginningDateRangeWithShallowCloning/expected\");"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }"},{"lineNumber":97,"author":{"gitId":"-"},"content":""},{"lineNumber":98,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":99,"author":{"gitId":"-"},"content":" public void test30DaysFromUntilDateWithShallowCloning() {"},{"lineNumber":100,"author":{"gitId":"-"},"content":" InputBuilder inputBuilder \u003d initInputBuilder()"},{"lineNumber":101,"author":{"gitId":"-"},"content":" .addUntilDate(\"1/11/2017\")"},{"lineNumber":102,"author":{"gitId":"-"},"content":" .addShallowCloning();"},{"lineNumber":103,"author":{"gitId":"-"},"content":""},{"lineNumber":104,"author":{"gitId":"-"},"content":" runTest(inputBuilder, true,"},{"lineNumber":105,"author":{"gitId":"-"},"content":" \"ConfigSystemTest/30daysFromUntilDateWithShallowCloning/expected\");"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }"},{"lineNumber":107,"author":{"gitId":"-"},"content":""},{"lineNumber":108,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":109,"author":{"gitId":"-"},"content":" * System test with a specified until date and a {@link SinceDateArgumentType#FIRST_COMMIT_DATE_SHORTHAND}"},{"lineNumber":110,"author":{"gitId":"-"},"content":" * since date to capture from the first commit, using find previous authors."},{"lineNumber":111,"author":{"gitId":"-"},"content":" */"},{"lineNumber":112,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":113,"author":{"gitId":"-"},"content":" public void testSinceBeginningDateRangeWithFindPreviousAuthors() {"},{"lineNumber":114,"author":{"gitId":"-"},"content":" InputBuilder inputBuilder \u003d initInputBuilder()"},{"lineNumber":115,"author":{"gitId":"-"},"content":" .addSinceDate(SinceDateArgumentType.FIRST_COMMIT_DATE_SHORTHAND)"},{"lineNumber":116,"author":{"gitId":"-"},"content":" .addUntilDate(\"2/3/2019\")"},{"lineNumber":117,"author":{"gitId":"-"},"content":" .addFindPreviousAuthors();"},{"lineNumber":118,"author":{"gitId":"-"},"content":""},{"lineNumber":119,"author":{"gitId":"-"},"content":" runTest(inputBuilder, true,"},{"lineNumber":120,"author":{"gitId":"-"},"content":" \"ConfigSystemTest/sinceBeginningDateRangeFindPreviousAuthors/expected\");"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }"},{"lineNumber":122,"author":{"gitId":"-"},"content":""},{"lineNumber":123,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":124,"author":{"gitId":"-"},"content":" public void test30DaysFromUntilDateWithFindPreviousAuthors() {"},{"lineNumber":125,"author":{"gitId":"-"},"content":" InputBuilder inputBuilder \u003d initInputBuilder()"},{"lineNumber":126,"author":{"gitId":"-"},"content":" .addUntilDate(\"1/11/2017\")"},{"lineNumber":127,"author":{"gitId":"-"},"content":" .addFindPreviousAuthors();"},{"lineNumber":128,"author":{"gitId":"-"},"content":""},{"lineNumber":129,"author":{"gitId":"-"},"content":" runTest(inputBuilder, true,"},{"lineNumber":130,"author":{"gitId":"-"},"content":" \"ConfigSystemTest/30daysFromUntilDateFindPreviousAuthors/expected\");"},{"lineNumber":131,"author":{"gitId":"-"},"content":" }"},{"lineNumber":132,"author":{"gitId":"-"},"content":""},{"lineNumber":133,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":134,"author":{"gitId":"-"},"content":" * Returns a {@link InputBuilder} that is initialized with some default values."},{"lineNumber":135,"author":{"gitId":"-"},"content":" * \u003cbr\u003eConfig Folder Path: {@code ConfigSystemTest}"},{"lineNumber":136,"author":{"gitId":"-"},"content":" * \u003cbr\u003eFormats: {@link ConfigSystemTest#TESTING_FILE_FORMATS TESTING_FILE_FORMATS}"},{"lineNumber":137,"author":{"gitId":"-"},"content":" * \u003cbr\u003eTimezone: {@link ConfigSystemTest#TEST_TIME_ZONE TEST_TIME_ZONE}"},{"lineNumber":138,"author":{"gitId":"-"},"content":" * \u003cbr\u003eOutput Folder Path: {@link ConfigSystemTest#OUTPUT_DIRECTORY OUTPUT_DIRECTORY}"},{"lineNumber":139,"author":{"gitId":"-"},"content":" * \u003cbr\u003eTest Mode: {@code Enabled}"},{"lineNumber":140,"author":{"gitId":"-"},"content":" */"},{"lineNumber":141,"author":{"gitId":"-"},"content":" private InputBuilder initInputBuilder() {"},{"lineNumber":142,"author":{"gitId":"-"},"content":" Path configFolder \u003d loadResource(getClass(), \"ConfigSystemTest\");"},{"lineNumber":143,"author":{"gitId":"-"},"content":" String formats \u003d String.join(\" \", TESTING_FILE_FORMATS);"},{"lineNumber":144,"author":{"gitId":"-"},"content":""},{"lineNumber":145,"author":{"gitId":"-"},"content":" return new InputBuilder().addConfig(configFolder)"},{"lineNumber":146,"author":{"gitId":"-"},"content":" .addFormats(formats)"},{"lineNumber":147,"author":{"gitId":"-"},"content":" .addTimezone(TEST_TIME_ZONE)"},{"lineNumber":148,"author":{"gitId":"-"},"content":" .addTestMode()"},{"lineNumber":149,"author":{"gitId":"-"},"content":" .addOutput(OUTPUT_DIRECTORY);"},{"lineNumber":150,"author":{"gitId":"-"},"content":" }"},{"lineNumber":151,"author":{"gitId":"-"},"content":""},{"lineNumber":152,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":153,"author":{"gitId":"-"},"content":" * Generates the testing report and compares it with the expected report."},{"lineNumber":154,"author":{"gitId":"-"},"content":" * Re-generates a normal report after the testing finished if the first report is shallow-cloned."},{"lineNumber":155,"author":{"gitId":"-"},"content":" *"},{"lineNumber":156,"author":{"gitId":"-"},"content":" * @param inputBuilder The input builder that contains the command line input specified by user."},{"lineNumber":157,"author":{"gitId":"-"},"content":" * @param shouldFreshClone Boolean for whether to clone repo again if it has been cloned before."},{"lineNumber":158,"author":{"gitId":"-"},"content":" * @param pathToResource The location at which files generated during the test are stored."},{"lineNumber":159,"author":{"gitId":"-"},"content":" */"},{"lineNumber":160,"author":{"gitId":"-"},"content":" private void runTest(InputBuilder inputBuilder, boolean shouldFreshClone, String pathToResource) {"},{"lineNumber":161,"author":{"gitId":"-"},"content":" if (shouldFreshClone || didNotCloneRepoNormally) {"},{"lineNumber":162,"author":{"gitId":"-"},"content":" inputBuilder \u003d inputBuilder.addFreshCloning();"},{"lineNumber":163,"author":{"gitId":"-"},"content":" }"},{"lineNumber":164,"author":{"gitId":"-"},"content":""},{"lineNumber":165,"author":{"gitId":"-"},"content":" RepoSense.main(translateCommandline(inputBuilder.build()));"},{"lineNumber":166,"author":{"gitId":"-"},"content":""},{"lineNumber":167,"author":{"gitId":"-"},"content":" Path actualFiles \u003d loadResource(getClass(), pathToResource);"},{"lineNumber":168,"author":{"gitId":"-"},"content":" SystemTestUtil.verifyReportJsonFiles(actualFiles, REPORT_DIRECTORY_PATH);"},{"lineNumber":169,"author":{"gitId":"-"},"content":""},{"lineNumber":170,"author":{"gitId":"-"},"content":" didNotCloneRepoNormally \u003d inputBuilder.isShallowCloning();"},{"lineNumber":171,"author":{"gitId":"-"},"content":" }"},{"lineNumber":172,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":171}},{"path":"src/systemtest/java/reposense/LocalRepoSystemTest.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.apache.tools.ant.types.Commandline.translateCommandline;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static reposense.util.TestUtil.loadResource;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.AfterAll;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.AfterEach;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeAll;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.parallel.Execution;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.parallel.ExecutionMode;"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":"import reposense.model.RepoConfiguration;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import reposense.model.RepoLocation;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import reposense.model.SupportedDomainUrlMap;"},{"lineNumber":20,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.SinceDateArgumentType;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import reposense.report.ErrorSummary;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import reposense.util.FileUtil;"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import reposense.util.InputBuilder;"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import reposense.util.SystemTestUtil;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import reposense.util.TestRepoCloner;"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"-"},"content":"@Execution(ExecutionMode.SAME_THREAD)"},{"lineNumber":28,"author":{"gitId":"-"},"content":"public class LocalRepoSystemTest {"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private static final String LOCAL_DIRECTORY_ONE_PARENT \u003d \"parent1\";"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String LOCAL_DIRECTORY_TWO_PARENT \u003d \"parent2\";"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final String LOCAL_DIRECTORY_ONE \u003d \"parent1/test-repo\";"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final String LOCAL_DIRECTORY_TWO \u003d \"parent2/test-repo\";"},{"lineNumber":33,"author":{"gitId":"-"},"content":""},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final String LAST_COMMIT_DATE \u003d \"31/01/2023\";"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":" private static final String OUTPUT_DIRECTORY \u003d \"local-test\";"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private static final String TIME_ZONE \u003d \"UTC+08\";"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private static final Path REPORT_DIRECTORY_PATH \u003d Paths.get(OUTPUT_DIRECTORY, \"reposense-report\");"},{"lineNumber":39,"author":{"gitId":"-"},"content":""},{"lineNumber":40,"author":{"gitId":"-"},"content":" @BeforeAll"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public static void setupLocalRepos() throws Exception {"},{"lineNumber":42,"author":{"gitId":"asdfghjkxd"},"content":" TestRepoCloner.clone("},{"lineNumber":43,"author":{"gitId":"asdfghjkxd"},"content":" new RepoConfiguration.Builder()"},{"lineNumber":44,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(\"https://github.com/reposense/testrepo-Alpha\"))"},{"lineNumber":45,"author":{"gitId":"asdfghjkxd"},"content":" .build(),"},{"lineNumber":46,"author":{"gitId":"asdfghjkxd"},"content":" Paths.get(\".\"), LOCAL_DIRECTORY_ONE"},{"lineNumber":47,"author":{"gitId":"asdfghjkxd"},"content":" );"},{"lineNumber":48,"author":{"gitId":"asdfghjkxd"},"content":" TestRepoCloner.clone("},{"lineNumber":49,"author":{"gitId":"asdfghjkxd"},"content":" new RepoConfiguration.Builder()"},{"lineNumber":50,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(\"https://github.com/reposense/testrepo-Alpha\"))"},{"lineNumber":51,"author":{"gitId":"asdfghjkxd"},"content":" .build(),"},{"lineNumber":52,"author":{"gitId":"asdfghjkxd"},"content":" Paths.get(\".\"), LOCAL_DIRECTORY_TWO"},{"lineNumber":53,"author":{"gitId":"asdfghjkxd"},"content":" );"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":" @BeforeEach"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void setupLocalTest() throws Exception {"},{"lineNumber":58,"author":{"gitId":"-"},"content":" SupportedDomainUrlMap.clearAccessedSet();"},{"lineNumber":59,"author":{"gitId":"-"},"content":" FileUtil.deleteDirectory(OUTPUT_DIRECTORY);"},{"lineNumber":60,"author":{"gitId":"-"},"content":" ErrorSummary.getInstance().clearErrorSet();"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }"},{"lineNumber":62,"author":{"gitId":"-"},"content":""},{"lineNumber":63,"author":{"gitId":"-"},"content":" @AfterEach"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public void deleteReportDirectory() throws Exception {"},{"lineNumber":65,"author":{"gitId":"-"},"content":" FileUtil.deleteDirectory(OUTPUT_DIRECTORY);"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }"},{"lineNumber":67,"author":{"gitId":"-"},"content":""},{"lineNumber":68,"author":{"gitId":"-"},"content":" @AfterAll"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public static void deleteClonedLocalRepos() throws Exception {"},{"lineNumber":70,"author":{"gitId":"-"},"content":" FileUtil.deleteDirectory(LOCAL_DIRECTORY_ONE_PARENT);"},{"lineNumber":71,"author":{"gitId":"-"},"content":" FileUtil.deleteDirectory(LOCAL_DIRECTORY_TWO_PARENT);"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }"},{"lineNumber":73,"author":{"gitId":"-"},"content":""},{"lineNumber":74,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public void testSameFinalDirectory() {"},{"lineNumber":76,"author":{"gitId":"-"},"content":" InputBuilder inputBuilder \u003d new InputBuilder()"},{"lineNumber":77,"author":{"gitId":"-"},"content":" .addRepos(LOCAL_DIRECTORY_ONE, LOCAL_DIRECTORY_TWO)"},{"lineNumber":78,"author":{"gitId":"-"},"content":" .addSinceDate(SinceDateArgumentType.FIRST_COMMIT_DATE_SHORTHAND)"},{"lineNumber":79,"author":{"gitId":"-"},"content":" .addUntilDate(LAST_COMMIT_DATE)"},{"lineNumber":80,"author":{"gitId":"-"},"content":" .addOutput(Paths.get(OUTPUT_DIRECTORY))"},{"lineNumber":81,"author":{"gitId":"-"},"content":" .addTimezone(TIME_ZONE);"},{"lineNumber":82,"author":{"gitId":"-"},"content":" runTest(inputBuilder, \"LocalRepoSystemTest/testSameFinalDirectory\");"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }"},{"lineNumber":84,"author":{"gitId":"-"},"content":""},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void testRelativePathing() {"},{"lineNumber":87,"author":{"gitId":"-"},"content":" String relativePathForTesting \u003d \"parent1/../parent1/./test-repo\";"},{"lineNumber":88,"author":{"gitId":"-"},"content":""},{"lineNumber":89,"author":{"gitId":"-"},"content":" InputBuilder inputBuilder \u003d new InputBuilder()"},{"lineNumber":90,"author":{"gitId":"-"},"content":" .addRepos(relativePathForTesting)"},{"lineNumber":91,"author":{"gitId":"-"},"content":" .addSinceDate(SinceDateArgumentType.FIRST_COMMIT_DATE_SHORTHAND)"},{"lineNumber":92,"author":{"gitId":"-"},"content":" .addUntilDate(LAST_COMMIT_DATE)"},{"lineNumber":93,"author":{"gitId":"-"},"content":" .addOutput(Paths.get(OUTPUT_DIRECTORY))"},{"lineNumber":94,"author":{"gitId":"-"},"content":" .addTimezone(TIME_ZONE);"},{"lineNumber":95,"author":{"gitId":"-"},"content":""},{"lineNumber":96,"author":{"gitId":"-"},"content":" runTest(inputBuilder, \"LocalRepoSystemTest/testRelativePathing\");"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }"},{"lineNumber":98,"author":{"gitId":"-"},"content":""},{"lineNumber":99,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":100,"author":{"gitId":"-"},"content":" * Runs RepoSense with {@code inputBuilder} and tests it against the expected"},{"lineNumber":101,"author":{"gitId":"-"},"content":" * files in {@code expectedFilesPathString}."},{"lineNumber":102,"author":{"gitId":"-"},"content":" */"},{"lineNumber":103,"author":{"gitId":"-"},"content":" private void runTest(InputBuilder inputBuilder, String expectedFilesPathString) {"},{"lineNumber":104,"author":{"gitId":"-"},"content":" RepoSense.main(translateCommandline(inputBuilder.build()));"},{"lineNumber":105,"author":{"gitId":"-"},"content":" Path expectedFilesPath \u003d loadResource(getClass(), expectedFilesPathString);"},{"lineNumber":106,"author":{"gitId":"-"},"content":" SystemTestUtil.verifyReportJsonFiles(expectedFilesPath, REPORT_DIRECTORY_PATH);"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }"},{"lineNumber":108,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":13,"-":95}},{"path":"src/systemtest/java/reposense/util/SystemTestUtil.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.util;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.FileReader;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.io.IOException;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.Files;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assertions;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"asdfghjkxd"},"content":"import com.google.gson.JsonElement;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import com.google.gson.JsonObject;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import com.google.gson.JsonParser;"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Contains utility methods for system tests."},{"lineNumber":18,"author":{"gitId":"-"},"content":" */"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class SystemTestUtil {"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final String[] JSON_FIELDS_TO_IGNORE \u003d new String[]"},{"lineNumber":22,"author":{"gitId":"-"},"content":" {\"repoSenseVersion\", \"reportGeneratedTime\", \"reportGenerationTime\"};"},{"lineNumber":23,"author":{"gitId":"-"},"content":""},{"lineNumber":24,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * Verifies that all JSON files in the {@code actualDirectory} matches those at the {@code expectedDirectory}."},{"lineNumber":26,"author":{"gitId":"-"},"content":" */"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public static void verifyReportJsonFiles(Path expectedDirectory, Path actualDirectory) {"},{"lineNumber":28,"author":{"gitId":"-"},"content":" try (Stream\u003cPath\u003e pathStream \u003d Files.list(expectedDirectory)) {"},{"lineNumber":29,"author":{"gitId":"-"},"content":" for (Path file : pathStream.collect(Collectors.toList())) {"},{"lineNumber":30,"author":{"gitId":"-"},"content":" Path expectedFilePath \u003d expectedDirectory.resolve(file.getFileName());"},{"lineNumber":31,"author":{"gitId":"-"},"content":" Path actualFilePath \u003d actualDirectory.resolve(file.getFileName());"},{"lineNumber":32,"author":{"gitId":"-"},"content":" if (Files.isDirectory(file)) {"},{"lineNumber":33,"author":{"gitId":"-"},"content":" verifyReportJsonFiles(expectedFilePath, actualFilePath);"},{"lineNumber":34,"author":{"gitId":"-"},"content":" } else if (file.toString().endsWith(\".json\")) {"},{"lineNumber":35,"author":{"gitId":"-"},"content":" if (file.getFileName().toString().equals(\"summary.json\")) {"},{"lineNumber":36,"author":{"gitId":"-"},"content":" assertSummaryJson(expectedFilePath, actualFilePath);"},{"lineNumber":37,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertJson(expectedFilePath, actualFilePath);"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }"},{"lineNumber":42,"author":{"gitId":"-"},"content":" } catch (IOException ioe) {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" ioe.printStackTrace();"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":" public static void assertSummaryJson(Path expectedSummaryJsonPath, Path actualSummaryJsonPath)"},{"lineNumber":48,"author":{"gitId":"-"},"content":" throws IOException {"},{"lineNumber":49,"author":{"gitId":"-"},"content":" try (FileReader fileReaderExpected \u003d new FileReader(expectedSummaryJsonPath.toFile());"},{"lineNumber":50,"author":{"gitId":"-"},"content":" FileReader fileReaderActual \u003d new FileReader(actualSummaryJsonPath.toFile())) {"},{"lineNumber":51,"author":{"gitId":"-"},"content":" JsonObject jsonExpected \u003d JsonParser.parseReader(fileReaderExpected).getAsJsonObject();"},{"lineNumber":52,"author":{"gitId":"-"},"content":" JsonObject jsonActual \u003d JsonParser.parseReader(fileReaderActual).getAsJsonObject();"},{"lineNumber":53,"author":{"gitId":"-"},"content":" for (String ignoredKey : JSON_FIELDS_TO_IGNORE) {"},{"lineNumber":54,"author":{"gitId":"-"},"content":" jsonExpected.remove(ignoredKey);"},{"lineNumber":55,"author":{"gitId":"-"},"content":" jsonActual.remove(ignoredKey);"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }"},{"lineNumber":57,"author":{"gitId":"-"},"content":" Assertions.assertEquals(jsonExpected, jsonActual);"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }"},{"lineNumber":60,"author":{"gitId":"-"},"content":""},{"lineNumber":61,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * Asserts that the contents in the given JSON file at {@code actualJsonPath} is the same as the JSON file"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * at {@code expectedJsonPath}."},{"lineNumber":64,"author":{"gitId":"-"},"content":" */"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public static void assertJson(Path expectedJsonPath, Path actualJsonPath) {"},{"lineNumber":66,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.exists(actualJsonPath));"},{"lineNumber":67,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":68,"author":{"gitId":"asdfghjkxd"},"content":" try (FileReader fileReaderExpected \u003d new FileReader(expectedJsonPath.toFile());"},{"lineNumber":69,"author":{"gitId":"asdfghjkxd"},"content":" FileReader fileReaderActual \u003d new FileReader(actualJsonPath.toFile())) {"},{"lineNumber":70,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":71,"author":{"gitId":"asdfghjkxd"},"content":" JsonElement jsonExpected \u003d JsonParser.parseReader(fileReaderExpected);"},{"lineNumber":72,"author":{"gitId":"asdfghjkxd"},"content":" JsonElement jsonActual \u003d JsonParser.parseReader(fileReaderActual);"},{"lineNumber":73,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":74,"author":{"gitId":"asdfghjkxd"},"content":" Assertions.assertEquals(jsonExpected, jsonActual);"},{"lineNumber":75,"author":{"gitId":"asdfghjkxd"},"content":" } catch (IOException ex) {"},{"lineNumber":76,"author":{"gitId":"asdfghjkxd"},"content":" Assertions.fail(ex.getMessage());"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }"},{"lineNumber":79,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":11,"-":68}},{"path":"src/test/java/reposense/git/GitBranchTest.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.git;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assertions;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"import reposense.model.FileTypeTest;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import reposense.model.RepoConfiguration;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import reposense.model.RepoLocation;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import reposense.template.GitTestTemplate;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import reposense.util.TestRepoCloner;"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"public class GitBranchTest extends GitTestTemplate {"},{"lineNumber":15,"author":{"gitId":"-"},"content":" protected static final String TEST_REPO_UNCOMMON_DEFAULT_GIT_LOCATION \u003d"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \"https://github.com/reposense/testrepo-UncommonDefaultBranch.git\";"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":" private RepoConfiguration config;"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":" @BeforeEach"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public void before() throws Exception {"},{"lineNumber":22,"author":{"gitId":"-"},"content":" super.before();"},{"lineNumber":23,"author":{"gitId":"-"},"content":" config \u003d configs.get();"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public void getCurrentBranch_masterBranch_success() throws Exception {"},{"lineNumber":28,"author":{"gitId":"-"},"content":" String currentBranch \u003d GitBranch.getCurrentBranch(config.getRepoRoot());"},{"lineNumber":29,"author":{"gitId":"-"},"content":" Assertions.assertEquals(\"master\", currentBranch);"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public void getCurrentBranch_uncommonDefaultBranch_success() throws Exception {"},{"lineNumber":34,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration uncommonDefaultConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":35,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_UNCOMMON_DEFAULT_GIT_LOCATION))"},{"lineNumber":36,"author":{"gitId":"asdfghjkxd"},"content":" .branch(RepoConfiguration.DEFAULT_BRANCH)"},{"lineNumber":37,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":38,"author":{"gitId":"-"},"content":" uncommonDefaultConfig.setFormats(FileTypeTest.DEFAULT_TEST_FORMATS);"},{"lineNumber":39,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(uncommonDefaultConfig);"},{"lineNumber":40,"author":{"gitId":"-"},"content":" String currentBranch \u003d GitBranch.getCurrentBranch(uncommonDefaultConfig.getRepoRoot());"},{"lineNumber":41,"author":{"gitId":"-"},"content":" Assertions.assertEquals(\"uncommon\", currentBranch);"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }"},{"lineNumber":43,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":4,"-":39}},{"path":"src/test/java/reposense/model/RepoConfigurationTest.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.model;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.apache.tools.ant.types.Commandline.translateCommandline;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static reposense.util.TestUtil.loadResource;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.lang.reflect.Method;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":8,"author":{"gitId":"asdfghjkxd"},"content":"import java.time.LocalDateTime;"},{"lineNumber":9,"author":{"gitId":"asdfghjkxd"},"content":"import java.time.ZoneId;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.ArrayList;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Arrays;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Collections;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":14,"author":{"gitId":"-"},"content":""},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assertions;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeAll;"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;"},{"lineNumber":18,"author":{"gitId":"-"},"content":""},{"lineNumber":19,"author":{"gitId":"-"},"content":"import reposense.parser.ArgsParser;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import reposense.parser.AuthorConfigCsvParser;"},{"lineNumber":21,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.ConfigurationBuildException;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import reposense.parser.GroupConfigCsvParser;"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import reposense.parser.RepoConfigCsvParser;"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import reposense.report.ReportGenerator;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import reposense.util.InputBuilder;"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import reposense.util.TestRepoCloner;"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import reposense.util.TestUtil;"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":"public class RepoConfigurationTest {"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final Path IGNORE_STANDALONE_TEST_CONFIG_FILES \u003d"},{"lineNumber":31,"author":{"gitId":"-"},"content":" loadResource(RepoConfigurationTest.class, \"RepoConfigurationTest/repoconfig_ignoreStandAlone_test\");"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final Path IGNORE_STANDALONE_KEYWORD_TEST_CONFIG_FILES \u003d"},{"lineNumber":33,"author":{"gitId":"-"},"content":" loadResource(RepoConfigurationTest.class, \"RepoConfigurationTest/repoconfig_ignoreStandAloneKeyword_test\");"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final Path FORMATS_TEST_CONFIG_FILES \u003d loadResource(RepoConfigurationTest.class,"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \"RepoConfigurationTest/repoconfig_formats_test\");"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private static final Path WITHOUT_FORMATS_TEST_CONFIG_FILES \u003d loadResource(RepoConfigurationTest.class,"},{"lineNumber":37,"author":{"gitId":"-"},"content":" \"RepoConfigurationTest/repoconfig_withoutformats_test\");"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private static final Path GROUPS_TEST_CONFIG_FILES \u003d loadResource(RepoConfigurationTest.class,"},{"lineNumber":39,"author":{"gitId":"-"},"content":" \"RepoConfigurationTest/repoconfig_groups_test\");"},{"lineNumber":40,"author":{"gitId":"-"},"content":" private static final Path OVERRIDE_STANDALONE_TEST_CONFIG_FILE \u003d loadResource(RepoConfigurationTest.class,"},{"lineNumber":41,"author":{"gitId":"-"},"content":" \"RepoConfigurationTest/repoconfig_overrideStandAlone_test\");"},{"lineNumber":42,"author":{"gitId":"-"},"content":" private static final Path IGNORE_AUTHORS_TEST_CONFIG_FILE \u003d loadResource(RepoConfigurationTest.class,"},{"lineNumber":43,"author":{"gitId":"-"},"content":" \"RepoConfigurationTest/repoconfig_ignoreAuthors_test\");"},{"lineNumber":44,"author":{"gitId":"-"},"content":" private static final Path IGNORE_STANDALONE_FLAG_OVERRIDE_CSV_TEST \u003d loadResource(RepoConfigurationTest.class,"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \"RepoConfigurationTest/repoconfig_ignoreStandaloneOverrideCsv_test\");"},{"lineNumber":46,"author":{"gitId":"-"},"content":" private static final Path IGNORE_FILESIZE_LIMIT_TEST_CONFIG_FILES \u003d loadResource(RepoConfigurationTest.class,"},{"lineNumber":47,"author":{"gitId":"-"},"content":" \"RepoConfigurationTest/repoconfig_ignoreFileSizeLimit_test\");"},{"lineNumber":48,"author":{"gitId":"-"},"content":" private static final Path IGNORE_FILESIZE_LIMIT_OVERRIDE_CSV_TEST_CONFIG_FILES \u003d"},{"lineNumber":49,"author":{"gitId":"-"},"content":" loadResource(RepoConfigurationTest.class,"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \"RepoConfigurationTest/repoconfig_ignoreFileSizeLimitOverrideCsv_test\");"},{"lineNumber":51,"author":{"gitId":"-"},"content":" private static final Path SHALLOW_CLONING_TEST_CONFIG_FILES \u003d"},{"lineNumber":52,"author":{"gitId":"-"},"content":" loadResource(RepoConfigurationTest.class, \"RepoConfigurationTest/repoconfig_shallowCloning_test\");"},{"lineNumber":53,"author":{"gitId":"-"},"content":" private static final Path SHALLOW_CLONING_FLAG_OVERRIDE_TEST_CONFIG_FILES \u003d"},{"lineNumber":54,"author":{"gitId":"-"},"content":" loadResource(RepoConfigurationTest.class,"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \"RepoConfigurationTest/repoconfig_shallowCloningOverrideCsv_test\");"},{"lineNumber":56,"author":{"gitId":"-"},"content":" private static final Path FIND_PREVIOUS_AUTHORS_TEST_CONFIG_FILES \u003d"},{"lineNumber":57,"author":{"gitId":"-"},"content":" loadResource(RepoConfigurationTest.class,"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \"RepoConfigurationTest/repoconfig_findPreviousAuthors_test\");"},{"lineNumber":59,"author":{"gitId":"-"},"content":" private static final Path FIND_PREVIOUS_AUTHORS_FLAG_OVERRIDE_TEST_CONFIG_FILES \u003d"},{"lineNumber":60,"author":{"gitId":"-"},"content":" loadResource(RepoConfigurationTest.class,"},{"lineNumber":61,"author":{"gitId":"-"},"content":" \"RepoConfigurationTest/repoconfig_findPreviousAuthorsOverrideCsv_test\");"},{"lineNumber":62,"author":{"gitId":"-"},"content":""},{"lineNumber":63,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_BETA \u003d \"https://github.com/reposense/testrepo-Beta.git\";"},{"lineNumber":64,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_DELTA \u003d \"https://github.com/reposense/testrepo-Delta.git\";"},{"lineNumber":65,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_MINIMAL_STANDALONE_CONFIG \u003d"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \"https://github.com/reposense/testrepo-minimalstandaloneconfig.git\";"},{"lineNumber":67,"author":{"gitId":"-"},"content":""},{"lineNumber":68,"author":{"gitId":"-"},"content":" private static final Author FIRST_AUTHOR \u003d new Author(\"lithiumlkid\");"},{"lineNumber":69,"author":{"gitId":"-"},"content":" private static final Author SECOND_AUTHOR \u003d new Author(\"codeeong\");"},{"lineNumber":70,"author":{"gitId":"-"},"content":" private static final Author THIRD_AUTHOR \u003d new Author(\"jordancjq\");"},{"lineNumber":71,"author":{"gitId":"-"},"content":" private static final Author FOURTH_AUTHOR \u003d new Author(\"lohtianwei\");"},{"lineNumber":72,"author":{"gitId":"-"},"content":""},{"lineNumber":73,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e FIRST_AUTHOR_ALIASES \u003d Collections.singletonList(\"Ahmad Syafiq\");"},{"lineNumber":74,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e SECOND_AUTHOR_ALIASES \u003d Collections.emptyList();"},{"lineNumber":75,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e THIRD_AUTHOR_ALIASES \u003d Collections.singletonList(\"Jordan Chong\");"},{"lineNumber":76,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e FOURTH_AUTHOR_ALIASES \u003d Collections.singletonList(\"Tianwei\");"},{"lineNumber":77,"author":{"gitId":"-"},"content":""},{"lineNumber":78,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e REPO_LEVEL_GLOB_LIST \u003d Collections.singletonList(\"collated**\");"},{"lineNumber":79,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e FIRST_AUTHOR_GLOB_LIST \u003d"},{"lineNumber":80,"author":{"gitId":"-"},"content":" Arrays.asList(\"*.aa1\", \"**.aa2\", \"**.java\", \"collated**\");"},{"lineNumber":81,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e SECOND_AUTHOR_GLOB_LIST \u003d Arrays.asList(\"\", \"collated**\");"},{"lineNumber":82,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e THIRD_AUTHOR_GLOB_LIST \u003d Arrays.asList(\"**[!(.md)]\", \"collated**\");"},{"lineNumber":83,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e FOURTH_AUTHOR_GLOB_LIST \u003d Collections.singletonList(\"collated**\");"},{"lineNumber":84,"author":{"gitId":"-"},"content":""},{"lineNumber":85,"author":{"gitId":"-"},"content":" private static final List\u003cFileType\u003e CONFIG_FORMATS \u003d FileType.convertFormatStringsToFileTypes(Arrays.asList("},{"lineNumber":86,"author":{"gitId":"-"},"content":" \"java\", \"adoc\", \"md\"));"},{"lineNumber":87,"author":{"gitId":"-"},"content":" private static final List\u003cFileType\u003e FIRST_CONFIG_GROUPS \u003d Arrays.asList("},{"lineNumber":88,"author":{"gitId":"-"},"content":" new FileType(\"test\", Collections.singletonList(\"src/test**\")),"},{"lineNumber":89,"author":{"gitId":"-"},"content":" new FileType(\"code\", Collections.singletonList(\"**.java\")),"},{"lineNumber":90,"author":{"gitId":"-"},"content":" new FileType(\"docs\", Collections.singletonList(\"docs**\")));"},{"lineNumber":91,"author":{"gitId":"-"},"content":" private static final List\u003cFileType\u003e SECOND_CONFIG_GROUPS \u003d Arrays.asList("},{"lineNumber":92,"author":{"gitId":"-"},"content":" new FileType(\"docs\", Collections.singletonList(\"docs**\")));"},{"lineNumber":93,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e CLI_FORMATS \u003d Arrays.asList(\"css\", \"html\");"},{"lineNumber":94,"author":{"gitId":"-"},"content":""},{"lineNumber":95,"author":{"gitId":"-"},"content":" private static RepoConfiguration repoDeltaStandaloneConfig;"},{"lineNumber":96,"author":{"gitId":"-"},"content":" private ReportGenerator reportGenerator \u003d new ReportGenerator();"},{"lineNumber":97,"author":{"gitId":"-"},"content":""},{"lineNumber":98,"author":{"gitId":"-"},"content":" @BeforeAll"},{"lineNumber":99,"author":{"gitId":"-"},"content":" public static void setUp() throws Exception {"},{"lineNumber":100,"author":{"gitId":"-"},"content":" FIRST_AUTHOR.setAuthorAliases(FIRST_AUTHOR_ALIASES);"},{"lineNumber":101,"author":{"gitId":"-"},"content":" SECOND_AUTHOR.setAuthorAliases(SECOND_AUTHOR_ALIASES);"},{"lineNumber":102,"author":{"gitId":"-"},"content":" THIRD_AUTHOR.setAuthorAliases(THIRD_AUTHOR_ALIASES);"},{"lineNumber":103,"author":{"gitId":"-"},"content":" FOURTH_AUTHOR.setAuthorAliases(FOURTH_AUTHOR_ALIASES);"},{"lineNumber":104,"author":{"gitId":"-"},"content":""},{"lineNumber":105,"author":{"gitId":"-"},"content":" FIRST_AUTHOR.setIgnoreGlobList(FIRST_AUTHOR_GLOB_LIST);"},{"lineNumber":106,"author":{"gitId":"-"},"content":" SECOND_AUTHOR.setIgnoreGlobList(SECOND_AUTHOR_GLOB_LIST);"},{"lineNumber":107,"author":{"gitId":"-"},"content":" THIRD_AUTHOR.setIgnoreGlobList(THIRD_AUTHOR_GLOB_LIST);"},{"lineNumber":108,"author":{"gitId":"-"},"content":" FOURTH_AUTHOR.setIgnoreGlobList(FOURTH_AUTHOR_GLOB_LIST);"},{"lineNumber":109,"author":{"gitId":"-"},"content":""},{"lineNumber":110,"author":{"gitId":"-"},"content":" List\u003cAuthor\u003e expectedAuthors \u003d new ArrayList\u003c\u003e();"},{"lineNumber":111,"author":{"gitId":"-"},"content":" expectedAuthors.add(FIRST_AUTHOR);"},{"lineNumber":112,"author":{"gitId":"-"},"content":" expectedAuthors.add(SECOND_AUTHOR);"},{"lineNumber":113,"author":{"gitId":"-"},"content":" expectedAuthors.add(THIRD_AUTHOR);"},{"lineNumber":114,"author":{"gitId":"-"},"content":" expectedAuthors.add(FOURTH_AUTHOR);"},{"lineNumber":115,"author":{"gitId":"-"},"content":""},{"lineNumber":116,"author":{"gitId":"asdfghjkxd"},"content":" repoDeltaStandaloneConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":117,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":118,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":119,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":120,"author":{"gitId":"-"},"content":" repoDeltaStandaloneConfig.setAuthorList(expectedAuthors);"},{"lineNumber":121,"author":{"gitId":"-"},"content":" repoDeltaStandaloneConfig.addAuthorNamesToAuthorMapEntry(FIRST_AUTHOR, FIRST_AUTHOR_ALIASES);"},{"lineNumber":122,"author":{"gitId":"-"},"content":" repoDeltaStandaloneConfig.addAuthorNamesToAuthorMapEntry(FOURTH_AUTHOR, FOURTH_AUTHOR_ALIASES);"},{"lineNumber":123,"author":{"gitId":"-"},"content":" repoDeltaStandaloneConfig.setAuthorDisplayName(FIRST_AUTHOR, \"Ahm\");"},{"lineNumber":124,"author":{"gitId":"-"},"content":" repoDeltaStandaloneConfig.setAuthorDisplayName(SECOND_AUTHOR, \"Cod\");"},{"lineNumber":125,"author":{"gitId":"-"},"content":" repoDeltaStandaloneConfig.setAuthorDisplayName(THIRD_AUTHOR, \"Jor\");"},{"lineNumber":126,"author":{"gitId":"-"},"content":" repoDeltaStandaloneConfig.setAuthorDisplayName(FOURTH_AUTHOR, \"Loh\");"},{"lineNumber":127,"author":{"gitId":"-"},"content":""},{"lineNumber":128,"author":{"gitId":"-"},"content":" SECOND_AUTHOR.setEmails(Arrays.asList(\"codeeong@gmail.com\", \"33129797+codeeong@users.noreply.github.com\"));"},{"lineNumber":129,"author":{"gitId":"-"},"content":" for (Author author : expectedAuthors) {"},{"lineNumber":130,"author":{"gitId":"-"},"content":" repoDeltaStandaloneConfig.addAuthorEmailsToAuthorMapEntry(author, author.getEmails());"},{"lineNumber":131,"author":{"gitId":"-"},"content":" }"},{"lineNumber":132,"author":{"gitId":"-"},"content":""},{"lineNumber":133,"author":{"gitId":"-"},"content":" repoDeltaStandaloneConfig.setIgnoreGlobList(REPO_LEVEL_GLOB_LIST);"},{"lineNumber":134,"author":{"gitId":"-"},"content":" repoDeltaStandaloneConfig.setFormats(CONFIG_FORMATS);"},{"lineNumber":135,"author":{"gitId":"-"},"content":" }"},{"lineNumber":136,"author":{"gitId":"-"},"content":""},{"lineNumber":137,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":138,"author":{"gitId":"-"},"content":" public void repoConfig_usesStandaloneConfig_success() throws Exception {"},{"lineNumber":139,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration actualConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":140,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":141,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":142,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":143,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(actualConfig);"},{"lineNumber":144,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(actualConfig);"},{"lineNumber":145,"author":{"gitId":"-"},"content":""},{"lineNumber":146,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoDeltaStandaloneConfig, actualConfig);"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }"},{"lineNumber":148,"author":{"gitId":"-"},"content":""},{"lineNumber":149,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":150,"author":{"gitId":"-"},"content":" public void repoConfig_ignoresStandaloneConfig_success() throws Exception {"},{"lineNumber":151,"author":{"gitId":"-"},"content":" List\u003cAuthor\u003e expectedAuthors \u003d new ArrayList\u003c\u003e();"},{"lineNumber":152,"author":{"gitId":"-"},"content":" Author author \u003d new Author(FIRST_AUTHOR);"},{"lineNumber":153,"author":{"gitId":"-"},"content":" author.setIgnoreGlobList(REPO_LEVEL_GLOB_LIST);"},{"lineNumber":154,"author":{"gitId":"-"},"content":" expectedAuthors.add(author);"},{"lineNumber":155,"author":{"gitId":"-"},"content":""},{"lineNumber":156,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration expectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":157,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":158,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":159,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":160,"author":{"gitId":"-"},"content":" expectedConfig.setAuthorList(expectedAuthors);"},{"lineNumber":161,"author":{"gitId":"-"},"content":" expectedConfig.addAuthorNamesToAuthorMapEntry(author, FIRST_AUTHOR_ALIASES);"},{"lineNumber":162,"author":{"gitId":"-"},"content":" expectedConfig.setAuthorDisplayName(author, \"Ahm\");"},{"lineNumber":163,"author":{"gitId":"-"},"content":""},{"lineNumber":164,"author":{"gitId":"-"},"content":" expectedConfig.setIgnoreGlobList(REPO_LEVEL_GLOB_LIST);"},{"lineNumber":165,"author":{"gitId":"-"},"content":" expectedConfig.setFormats(CONFIG_FORMATS);"},{"lineNumber":166,"author":{"gitId":"-"},"content":" expectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":167,"author":{"gitId":"-"},"content":""},{"lineNumber":168,"author":{"gitId":"-"},"content":" String formats \u003d String.join(\" \", CLI_FORMATS);"},{"lineNumber":169,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(IGNORE_STANDALONE_TEST_CONFIG_FILES)"},{"lineNumber":170,"author":{"gitId":"-"},"content":" .addFormats(formats)"},{"lineNumber":171,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":172,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":173,"author":{"gitId":"-"},"content":""},{"lineNumber":174,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":175,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":176,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e authorConfigs \u003d"},{"lineNumber":177,"author":{"gitId":"-"},"content":" new AuthorConfigCsvParser(cliArguments.getAuthorConfigFilePath()).parse();"},{"lineNumber":178,"author":{"gitId":"-"},"content":" RepoConfiguration.merge(actualConfigs, authorConfigs);"},{"lineNumber":179,"author":{"gitId":"-"},"content":""},{"lineNumber":180,"author":{"gitId":"-"},"content":" RepoConfiguration actualConfig \u003d actualConfigs.get(0);"},{"lineNumber":181,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(actualConfig);"},{"lineNumber":182,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(actualConfig);"},{"lineNumber":183,"author":{"gitId":"-"},"content":""},{"lineNumber":184,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(expectedConfig, actualConfig);"},{"lineNumber":185,"author":{"gitId":"-"},"content":" }"},{"lineNumber":186,"author":{"gitId":"-"},"content":""},{"lineNumber":187,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":188,"author":{"gitId":"-"},"content":" public void repoConfig_ignoresStandaloneConfigInCli_success() throws Exception {"},{"lineNumber":189,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration expectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":190,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":191,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":192,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":193,"author":{"gitId":"-"},"content":" expectedConfig.setFormats(FileType.convertFormatStringsToFileTypes(CLI_FORMATS));"},{"lineNumber":194,"author":{"gitId":"-"},"content":" expectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":195,"author":{"gitId":"-"},"content":""},{"lineNumber":196,"author":{"gitId":"-"},"content":" String formats \u003d String.join(\" \", CLI_FORMATS);"},{"lineNumber":197,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addRepos(TEST_REPO_DELTA)"},{"lineNumber":198,"author":{"gitId":"-"},"content":" .addFormats(formats)"},{"lineNumber":199,"author":{"gitId":"-"},"content":" .addIgnoreStandaloneConfig()"},{"lineNumber":200,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":201,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":202,"author":{"gitId":"-"},"content":""},{"lineNumber":203,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d RunConfigurationDecider"},{"lineNumber":204,"author":{"gitId":"-"},"content":" .getRunConfiguration(cliArguments)"},{"lineNumber":205,"author":{"gitId":"-"},"content":" .getRepoConfigurations();"},{"lineNumber":206,"author":{"gitId":"-"},"content":" RepoConfiguration.setFormatsToRepoConfigs(actualConfigs, cliArguments.getFormats());"},{"lineNumber":207,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs,"},{"lineNumber":208,"author":{"gitId":"-"},"content":" cliArguments.isStandaloneConfigIgnored());"},{"lineNumber":209,"author":{"gitId":"-"},"content":" RepoConfiguration actualConfig \u003d actualConfigs.get(0);"},{"lineNumber":210,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(actualConfig);"},{"lineNumber":211,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(actualConfig);"},{"lineNumber":212,"author":{"gitId":"-"},"content":""},{"lineNumber":213,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(expectedConfig, actualConfig);"},{"lineNumber":214,"author":{"gitId":"-"},"content":" }"},{"lineNumber":215,"author":{"gitId":"-"},"content":""},{"lineNumber":216,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":217,"author":{"gitId":"-"},"content":" public void repoConfig_ignoreStandaloneConfigInCli_overrideCsv() throws Exception {"},{"lineNumber":218,"author":{"gitId":"-"},"content":""},{"lineNumber":219,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoBetaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":220,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_BETA))"},{"lineNumber":221,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":222,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":223,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setFormats(FileType.convertFormatStringsToFileTypes(CLI_FORMATS));"},{"lineNumber":224,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":225,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoDeltaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":226,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":227,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":228,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":229,"author":{"gitId":"-"},"content":" repoDeltaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":230,"author":{"gitId":"-"},"content":""},{"lineNumber":231,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(IGNORE_STANDALONE_FLAG_OVERRIDE_CSV_TEST)"},{"lineNumber":232,"author":{"gitId":"-"},"content":" .addIgnoreStandaloneConfig()"},{"lineNumber":233,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":234,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":235,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":236,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":237,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs,"},{"lineNumber":238,"author":{"gitId":"-"},"content":" cliArguments.isStandaloneConfigIgnored());"},{"lineNumber":239,"author":{"gitId":"-"},"content":""},{"lineNumber":240,"author":{"gitId":"-"},"content":" RepoConfiguration repoBetaActualConfig \u003d actualConfigs.get(0);"},{"lineNumber":241,"author":{"gitId":"-"},"content":" RepoConfiguration repoDeltaActualConfig \u003d actualConfigs.get(1);"},{"lineNumber":242,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoBetaActualConfig);"},{"lineNumber":243,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoDeltaActualConfig);"},{"lineNumber":244,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoBetaActualConfig);"},{"lineNumber":245,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoDeltaActualConfig);"},{"lineNumber":246,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoBetaExpectedConfig, repoBetaActualConfig);"},{"lineNumber":247,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoDeltaExpectedConfig, repoDeltaActualConfig);"},{"lineNumber":248,"author":{"gitId":"-"},"content":" }"},{"lineNumber":249,"author":{"gitId":"-"},"content":""},{"lineNumber":250,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":251,"author":{"gitId":"-"},"content":" public void repoConfig_ignoreFileSizeLimit_success() throws Exception {"},{"lineNumber":252,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration expectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":253,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":254,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":255,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":256,"author":{"gitId":"-"},"content":" expectedConfig.setIgnoreGlobList(REPO_LEVEL_GLOB_LIST);"},{"lineNumber":257,"author":{"gitId":"-"},"content":" expectedConfig.setFormats(CONFIG_FORMATS);"},{"lineNumber":258,"author":{"gitId":"-"},"content":" expectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":259,"author":{"gitId":"-"},"content":" expectedConfig.setFileSizeLimitIgnored(true);"},{"lineNumber":260,"author":{"gitId":"-"},"content":""},{"lineNumber":261,"author":{"gitId":"-"},"content":" String formats \u003d String.join(\" \", CLI_FORMATS);"},{"lineNumber":262,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(IGNORE_FILESIZE_LIMIT_TEST_CONFIG_FILES)"},{"lineNumber":263,"author":{"gitId":"-"},"content":" .addFormats(formats)"},{"lineNumber":264,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":265,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":266,"author":{"gitId":"-"},"content":""},{"lineNumber":267,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":268,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":269,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs, true);"},{"lineNumber":270,"author":{"gitId":"-"},"content":""},{"lineNumber":271,"author":{"gitId":"-"},"content":" RepoConfiguration actualConfig \u003d actualConfigs.get(0);"},{"lineNumber":272,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(actualConfig);"},{"lineNumber":273,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(actualConfig);"},{"lineNumber":274,"author":{"gitId":"-"},"content":""},{"lineNumber":275,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(expectedConfig, actualConfig);"},{"lineNumber":276,"author":{"gitId":"-"},"content":" }"},{"lineNumber":277,"author":{"gitId":"-"},"content":""},{"lineNumber":278,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":279,"author":{"gitId":"-"},"content":" public void repoConfig_ignoreFileSizeLimitInCli_overrideCsv() throws Exception {"},{"lineNumber":280,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoBetaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":281,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_BETA))"},{"lineNumber":282,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":283,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":284,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setFormats(FileType.convertFormatStringsToFileTypes(CLI_FORMATS));"},{"lineNumber":285,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":286,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setFileSizeLimitIgnored(true);"},{"lineNumber":287,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoDeltaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":288,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":289,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":290,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":291,"author":{"gitId":"-"},"content":" repoDeltaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":292,"author":{"gitId":"-"},"content":" repoDeltaExpectedConfig.setFileSizeLimitIgnored(true);"},{"lineNumber":293,"author":{"gitId":"-"},"content":""},{"lineNumber":294,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(IGNORE_FILESIZE_LIMIT_OVERRIDE_CSV_TEST_CONFIG_FILES)"},{"lineNumber":295,"author":{"gitId":"-"},"content":" .addIgnoreFilesizeLimit()"},{"lineNumber":296,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":297,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":298,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":299,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":300,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs, true);"},{"lineNumber":301,"author":{"gitId":"-"},"content":" RepoConfiguration.setFileSizeLimitIgnoredToRepoConfigs(actualConfigs,"},{"lineNumber":302,"author":{"gitId":"-"},"content":" cliArguments.isFileSizeLimitIgnored());"},{"lineNumber":303,"author":{"gitId":"-"},"content":""},{"lineNumber":304,"author":{"gitId":"-"},"content":" RepoConfiguration repoBetaActualConfig \u003d actualConfigs.get(0);"},{"lineNumber":305,"author":{"gitId":"-"},"content":" RepoConfiguration repoDeltaActualConfig \u003d actualConfigs.get(1);"},{"lineNumber":306,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoBetaActualConfig);"},{"lineNumber":307,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoDeltaActualConfig);"},{"lineNumber":308,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoBetaActualConfig);"},{"lineNumber":309,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoDeltaActualConfig);"},{"lineNumber":310,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoBetaExpectedConfig, repoBetaActualConfig);"},{"lineNumber":311,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoDeltaExpectedConfig, repoDeltaActualConfig);"},{"lineNumber":312,"author":{"gitId":"-"},"content":" }"},{"lineNumber":313,"author":{"gitId":"-"},"content":""},{"lineNumber":314,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":315,"author":{"gitId":"-"},"content":" public void repoConfig_withoutIgnoreStandaloneConfigInCli_useCsv() throws Exception {"},{"lineNumber":316,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoBetaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":317,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_BETA))"},{"lineNumber":318,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":319,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":320,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setFormats(FileType.convertFormatStringsToFileTypes(CLI_FORMATS));"},{"lineNumber":321,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":322,"author":{"gitId":"-"},"content":""},{"lineNumber":323,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(IGNORE_STANDALONE_FLAG_OVERRIDE_CSV_TEST).build();"},{"lineNumber":324,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":325,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":326,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":327,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs,"},{"lineNumber":328,"author":{"gitId":"-"},"content":" cliArguments.isStandaloneConfigIgnored());"},{"lineNumber":329,"author":{"gitId":"-"},"content":""},{"lineNumber":330,"author":{"gitId":"-"},"content":" RepoConfiguration repoBetaActualConfig \u003d actualConfigs.get(0);"},{"lineNumber":331,"author":{"gitId":"-"},"content":" RepoConfiguration repoDeltaActualConfig \u003d actualConfigs.get(1);"},{"lineNumber":332,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoBetaActualConfig);"},{"lineNumber":333,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoDeltaActualConfig);"},{"lineNumber":334,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoBetaActualConfig);"},{"lineNumber":335,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoDeltaActualConfig);"},{"lineNumber":336,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoBetaExpectedConfig, repoBetaActualConfig);"},{"lineNumber":337,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoDeltaStandaloneConfig, repoDeltaActualConfig);"},{"lineNumber":338,"author":{"gitId":"-"},"content":" }"},{"lineNumber":339,"author":{"gitId":"-"},"content":""},{"lineNumber":340,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":341,"author":{"gitId":"-"},"content":" public void repoConfig_wrongKeywordUseStandaloneConfig_success() throws Exception {"},{"lineNumber":342,"author":{"gitId":"-"},"content":" String formats \u003d String.join(\" \", CLI_FORMATS);"},{"lineNumber":343,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(IGNORE_STANDALONE_KEYWORD_TEST_CONFIG_FILES)"},{"lineNumber":344,"author":{"gitId":"-"},"content":" .addFormats(formats)"},{"lineNumber":345,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":346,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":347,"author":{"gitId":"-"},"content":""},{"lineNumber":348,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":349,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":350,"author":{"gitId":"-"},"content":""},{"lineNumber":351,"author":{"gitId":"-"},"content":" RepoConfiguration actualConfig \u003d actualConfigs.get(0);"},{"lineNumber":352,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(actualConfig);"},{"lineNumber":353,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(actualConfig);"},{"lineNumber":354,"author":{"gitId":"-"},"content":""},{"lineNumber":355,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoDeltaStandaloneConfig, actualConfig);"},{"lineNumber":356,"author":{"gitId":"-"},"content":" }"},{"lineNumber":357,"author":{"gitId":"-"},"content":""},{"lineNumber":358,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":359,"author":{"gitId":"-"},"content":" public void repoConfig_shallowCloning_success() throws Exception {"},{"lineNumber":360,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration expectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":361,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":362,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":363,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":364,"author":{"gitId":"-"},"content":" expectedConfig.setIgnoreGlobList(REPO_LEVEL_GLOB_LIST);"},{"lineNumber":365,"author":{"gitId":"-"},"content":" expectedConfig.setFormats(CONFIG_FORMATS);"},{"lineNumber":366,"author":{"gitId":"-"},"content":" expectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":367,"author":{"gitId":"-"},"content":" expectedConfig.setIsShallowCloningPerformed(true);"},{"lineNumber":368,"author":{"gitId":"-"},"content":""},{"lineNumber":369,"author":{"gitId":"-"},"content":" String formats \u003d String.join(\" \", CLI_FORMATS);"},{"lineNumber":370,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(SHALLOW_CLONING_TEST_CONFIG_FILES)"},{"lineNumber":371,"author":{"gitId":"-"},"content":" .addFormats(formats)"},{"lineNumber":372,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":373,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":374,"author":{"gitId":"-"},"content":""},{"lineNumber":375,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":376,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":377,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs, true);"},{"lineNumber":378,"author":{"gitId":"-"},"content":""},{"lineNumber":379,"author":{"gitId":"-"},"content":" RepoConfiguration actualConfig \u003d actualConfigs.get(0);"},{"lineNumber":380,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(actualConfig);"},{"lineNumber":381,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(actualConfig);"},{"lineNumber":382,"author":{"gitId":"-"},"content":""},{"lineNumber":383,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(expectedConfig, actualConfig);"},{"lineNumber":384,"author":{"gitId":"-"},"content":" }"},{"lineNumber":385,"author":{"gitId":"-"},"content":""},{"lineNumber":386,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":387,"author":{"gitId":"-"},"content":" public void repoConfig_shallowCloningInCli_success() throws Exception {"},{"lineNumber":388,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration expectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":389,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":390,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":391,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":392,"author":{"gitId":"-"},"content":" expectedConfig.setFormats(FileType.convertFormatStringsToFileTypes(CLI_FORMATS));"},{"lineNumber":393,"author":{"gitId":"-"},"content":" expectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":394,"author":{"gitId":"-"},"content":" expectedConfig.setIsShallowCloningPerformed(true);"},{"lineNumber":395,"author":{"gitId":"-"},"content":""},{"lineNumber":396,"author":{"gitId":"-"},"content":" String formats \u003d String.join(\" \", CLI_FORMATS);"},{"lineNumber":397,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addRepos(TEST_REPO_DELTA)"},{"lineNumber":398,"author":{"gitId":"-"},"content":" .addFormats(formats)"},{"lineNumber":399,"author":{"gitId":"-"},"content":" .addShallowCloning()"},{"lineNumber":400,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":401,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":402,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d RunConfigurationDecider"},{"lineNumber":403,"author":{"gitId":"-"},"content":" .getRunConfiguration(cliArguments)"},{"lineNumber":404,"author":{"gitId":"-"},"content":" .getRepoConfigurations();"},{"lineNumber":405,"author":{"gitId":"-"},"content":" RepoConfiguration.setFormatsToRepoConfigs(actualConfigs, cliArguments.getFormats());"},{"lineNumber":406,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs, true);"},{"lineNumber":407,"author":{"gitId":"-"},"content":" RepoConfiguration.setIsShallowCloningPerformedToRepoConfigs(actualConfigs,"},{"lineNumber":408,"author":{"gitId":"-"},"content":" cliArguments.isShallowCloningPerformed());"},{"lineNumber":409,"author":{"gitId":"-"},"content":""},{"lineNumber":410,"author":{"gitId":"-"},"content":" RepoConfiguration actualConfig \u003d actualConfigs.get(0);"},{"lineNumber":411,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(actualConfig);"},{"lineNumber":412,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(actualConfig);"},{"lineNumber":413,"author":{"gitId":"-"},"content":""},{"lineNumber":414,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(expectedConfig, actualConfig);"},{"lineNumber":415,"author":{"gitId":"-"},"content":" }"},{"lineNumber":416,"author":{"gitId":"-"},"content":""},{"lineNumber":417,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":418,"author":{"gitId":"-"},"content":" public void repoConfig_shallowCloningInCli_overrideCsv() throws Exception {"},{"lineNumber":419,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoBetaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":420,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_BETA))"},{"lineNumber":421,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":422,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":423,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setFormats(FileType.convertFormatStringsToFileTypes(CLI_FORMATS));"},{"lineNumber":424,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":425,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setIsShallowCloningPerformed(true);"},{"lineNumber":426,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoDeltaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":427,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":428,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":429,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":430,"author":{"gitId":"-"},"content":" repoDeltaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":431,"author":{"gitId":"-"},"content":" repoDeltaExpectedConfig.setIsShallowCloningPerformed(true);"},{"lineNumber":432,"author":{"gitId":"-"},"content":""},{"lineNumber":433,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(SHALLOW_CLONING_FLAG_OVERRIDE_TEST_CONFIG_FILES)"},{"lineNumber":434,"author":{"gitId":"-"},"content":" .addShallowCloning()"},{"lineNumber":435,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":436,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":437,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":438,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":439,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs, true);"},{"lineNumber":440,"author":{"gitId":"-"},"content":" RepoConfiguration.setIsShallowCloningPerformedToRepoConfigs(actualConfigs,"},{"lineNumber":441,"author":{"gitId":"-"},"content":" cliArguments.isShallowCloningPerformed());"},{"lineNumber":442,"author":{"gitId":"-"},"content":""},{"lineNumber":443,"author":{"gitId":"-"},"content":" RepoConfiguration repoBetaActualConfig \u003d actualConfigs.get(0);"},{"lineNumber":444,"author":{"gitId":"-"},"content":" RepoConfiguration repoDeltaActualConfig \u003d actualConfigs.get(1);"},{"lineNumber":445,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoBetaActualConfig);"},{"lineNumber":446,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoDeltaActualConfig);"},{"lineNumber":447,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoBetaActualConfig);"},{"lineNumber":448,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoDeltaActualConfig);"},{"lineNumber":449,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoBetaExpectedConfig, repoBetaActualConfig);"},{"lineNumber":450,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoDeltaExpectedConfig, repoDeltaActualConfig);"},{"lineNumber":451,"author":{"gitId":"-"},"content":" }"},{"lineNumber":452,"author":{"gitId":"-"},"content":""},{"lineNumber":453,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":454,"author":{"gitId":"-"},"content":" public void repoConfig_withoutShallowCloningInInCli_useCsv() throws Exception {"},{"lineNumber":455,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoBetaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":456,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_BETA))"},{"lineNumber":457,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":458,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":459,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setFormats(FileType.convertFormatStringsToFileTypes(CLI_FORMATS));"},{"lineNumber":460,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":461,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setIsShallowCloningPerformed(true);"},{"lineNumber":462,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoDeltaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":463,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":464,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":465,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":466,"author":{"gitId":"-"},"content":" repoDeltaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":467,"author":{"gitId":"-"},"content":""},{"lineNumber":468,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(SHALLOW_CLONING_FLAG_OVERRIDE_TEST_CONFIG_FILES).build();"},{"lineNumber":469,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":470,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":471,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":472,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs, true);"},{"lineNumber":473,"author":{"gitId":"-"},"content":" RepoConfiguration.setIsShallowCloningPerformedToRepoConfigs(actualConfigs,"},{"lineNumber":474,"author":{"gitId":"-"},"content":" cliArguments.isShallowCloningPerformed());"},{"lineNumber":475,"author":{"gitId":"-"},"content":""},{"lineNumber":476,"author":{"gitId":"-"},"content":" RepoConfiguration repoBetaActualConfig \u003d actualConfigs.get(0);"},{"lineNumber":477,"author":{"gitId":"-"},"content":" RepoConfiguration repoDeltaActualConfig \u003d actualConfigs.get(1);"},{"lineNumber":478,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoBetaActualConfig);"},{"lineNumber":479,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoDeltaActualConfig);"},{"lineNumber":480,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoBetaActualConfig);"},{"lineNumber":481,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoDeltaActualConfig);"},{"lineNumber":482,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoBetaExpectedConfig, repoBetaActualConfig);"},{"lineNumber":483,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoDeltaExpectedConfig, repoDeltaActualConfig);"},{"lineNumber":484,"author":{"gitId":"-"},"content":" }"},{"lineNumber":485,"author":{"gitId":"-"},"content":""},{"lineNumber":486,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":487,"author":{"gitId":"-"},"content":" public void repoConfig_findPreviousAuthors_success() throws Exception {"},{"lineNumber":488,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration expectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":489,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":490,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":491,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":492,"author":{"gitId":"-"},"content":" expectedConfig.setIgnoreGlobList(REPO_LEVEL_GLOB_LIST);"},{"lineNumber":493,"author":{"gitId":"-"},"content":" expectedConfig.setFormats(CONFIG_FORMATS);"},{"lineNumber":494,"author":{"gitId":"-"},"content":" expectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":495,"author":{"gitId":"-"},"content":" expectedConfig.setIsFindingPreviousAuthorsPerformed(true);"},{"lineNumber":496,"author":{"gitId":"-"},"content":""},{"lineNumber":497,"author":{"gitId":"-"},"content":" String formats \u003d String.join(\" \", CLI_FORMATS);"},{"lineNumber":498,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(FIND_PREVIOUS_AUTHORS_TEST_CONFIG_FILES)"},{"lineNumber":499,"author":{"gitId":"-"},"content":" .addFormats(formats)"},{"lineNumber":500,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":501,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":502,"author":{"gitId":"-"},"content":""},{"lineNumber":503,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":504,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":505,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs, true);"},{"lineNumber":506,"author":{"gitId":"-"},"content":""},{"lineNumber":507,"author":{"gitId":"-"},"content":" RepoConfiguration actualConfig \u003d actualConfigs.get(0);"},{"lineNumber":508,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(actualConfig);"},{"lineNumber":509,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(actualConfig);"},{"lineNumber":510,"author":{"gitId":"-"},"content":""},{"lineNumber":511,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(expectedConfig, actualConfig);"},{"lineNumber":512,"author":{"gitId":"-"},"content":" }"},{"lineNumber":513,"author":{"gitId":"-"},"content":""},{"lineNumber":514,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":515,"author":{"gitId":"-"},"content":" public void repoConfig_findPreviousAuthorsInCli_success() throws Exception {"},{"lineNumber":516,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration expectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":517,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":518,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":519,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":520,"author":{"gitId":"-"},"content":" expectedConfig.setFormats(FileType.convertFormatStringsToFileTypes(CLI_FORMATS));"},{"lineNumber":521,"author":{"gitId":"-"},"content":" expectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":522,"author":{"gitId":"-"},"content":" expectedConfig.setIsFindingPreviousAuthorsPerformed(true);"},{"lineNumber":523,"author":{"gitId":"-"},"content":""},{"lineNumber":524,"author":{"gitId":"-"},"content":" String formats \u003d String.join(\" \", CLI_FORMATS);"},{"lineNumber":525,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addRepos(TEST_REPO_DELTA)"},{"lineNumber":526,"author":{"gitId":"-"},"content":" .addFormats(formats)"},{"lineNumber":527,"author":{"gitId":"-"},"content":" .addFindPreviousAuthors()"},{"lineNumber":528,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":529,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":530,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d RunConfigurationDecider"},{"lineNumber":531,"author":{"gitId":"-"},"content":" .getRunConfiguration(cliArguments)"},{"lineNumber":532,"author":{"gitId":"-"},"content":" .getRepoConfigurations();"},{"lineNumber":533,"author":{"gitId":"-"},"content":" RepoConfiguration.setFormatsToRepoConfigs(actualConfigs, cliArguments.getFormats());"},{"lineNumber":534,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs, true);"},{"lineNumber":535,"author":{"gitId":"-"},"content":" RepoConfiguration.setIsFindingPreviousAuthorsPerformedToRepoConfigs(actualConfigs,"},{"lineNumber":536,"author":{"gitId":"-"},"content":" cliArguments.isFindingPreviousAuthorsPerformed());"},{"lineNumber":537,"author":{"gitId":"-"},"content":""},{"lineNumber":538,"author":{"gitId":"-"},"content":" RepoConfiguration actualConfig \u003d actualConfigs.get(0);"},{"lineNumber":539,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(actualConfig);"},{"lineNumber":540,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(actualConfig);"},{"lineNumber":541,"author":{"gitId":"-"},"content":""},{"lineNumber":542,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(expectedConfig, actualConfig);"},{"lineNumber":543,"author":{"gitId":"-"},"content":" }"},{"lineNumber":544,"author":{"gitId":"-"},"content":""},{"lineNumber":545,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":546,"author":{"gitId":"-"},"content":" public void repoConfig_findPreviousAuthorsInCli_overrideCsv() throws Exception {"},{"lineNumber":547,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoBetaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":548,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_BETA))"},{"lineNumber":549,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":550,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":551,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setFormats(FileType.convertFormatStringsToFileTypes(CLI_FORMATS));"},{"lineNumber":552,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":553,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setIsFindingPreviousAuthorsPerformed(true);"},{"lineNumber":554,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoDeltaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":555,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":556,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":557,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":558,"author":{"gitId":"-"},"content":" repoDeltaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":559,"author":{"gitId":"-"},"content":" repoDeltaExpectedConfig.setIsFindingPreviousAuthorsPerformed(true);"},{"lineNumber":560,"author":{"gitId":"-"},"content":""},{"lineNumber":561,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(FIND_PREVIOUS_AUTHORS_FLAG_OVERRIDE_TEST_CONFIG_FILES)"},{"lineNumber":562,"author":{"gitId":"-"},"content":" .addShallowCloning()"},{"lineNumber":563,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":564,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":565,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":566,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":567,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs, true);"},{"lineNumber":568,"author":{"gitId":"-"},"content":" RepoConfiguration.setIsFindingPreviousAuthorsPerformedToRepoConfigs(actualConfigs,"},{"lineNumber":569,"author":{"gitId":"-"},"content":" cliArguments.isFindingPreviousAuthorsPerformed());"},{"lineNumber":570,"author":{"gitId":"-"},"content":""},{"lineNumber":571,"author":{"gitId":"-"},"content":" RepoConfiguration repoBetaActualConfig \u003d actualConfigs.get(0);"},{"lineNumber":572,"author":{"gitId":"-"},"content":" RepoConfiguration repoDeltaActualConfig \u003d actualConfigs.get(1);"},{"lineNumber":573,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoBetaActualConfig);"},{"lineNumber":574,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoDeltaActualConfig);"},{"lineNumber":575,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoBetaActualConfig);"},{"lineNumber":576,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoDeltaActualConfig);"},{"lineNumber":577,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoBetaExpectedConfig, repoBetaActualConfig);"},{"lineNumber":578,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoDeltaExpectedConfig, repoDeltaActualConfig);"},{"lineNumber":579,"author":{"gitId":"-"},"content":" }"},{"lineNumber":580,"author":{"gitId":"-"},"content":""},{"lineNumber":581,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":582,"author":{"gitId":"-"},"content":" public void repoConfig_withoutFindPreviousAuthorsInCli_useCsv() throws Exception {"},{"lineNumber":583,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoBetaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":584,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_BETA))"},{"lineNumber":585,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":586,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":587,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setFormats(FileType.convertFormatStringsToFileTypes(CLI_FORMATS));"},{"lineNumber":588,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":589,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setIsFindingPreviousAuthorsPerformed(true);"},{"lineNumber":590,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoDeltaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":591,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":592,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":593,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":594,"author":{"gitId":"-"},"content":" repoDeltaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":595,"author":{"gitId":"-"},"content":""},{"lineNumber":596,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(FIND_PREVIOUS_AUTHORS_FLAG_OVERRIDE_TEST_CONFIG_FILES).build();"},{"lineNumber":597,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":598,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":599,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":600,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs, true);"},{"lineNumber":601,"author":{"gitId":"-"},"content":" RepoConfiguration.setIsFindingPreviousAuthorsPerformedToRepoConfigs(actualConfigs,"},{"lineNumber":602,"author":{"gitId":"-"},"content":" cliArguments.isFindingPreviousAuthorsPerformed());"},{"lineNumber":603,"author":{"gitId":"-"},"content":""},{"lineNumber":604,"author":{"gitId":"-"},"content":" RepoConfiguration repoBetaActualConfig \u003d actualConfigs.get(0);"},{"lineNumber":605,"author":{"gitId":"-"},"content":" RepoConfiguration repoDeltaActualConfig \u003d actualConfigs.get(1);"},{"lineNumber":606,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoBetaActualConfig);"},{"lineNumber":607,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoDeltaActualConfig);"},{"lineNumber":608,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoBetaActualConfig);"},{"lineNumber":609,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoDeltaActualConfig);"},{"lineNumber":610,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoBetaExpectedConfig, repoBetaActualConfig);"},{"lineNumber":611,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoDeltaExpectedConfig, repoDeltaActualConfig);"},{"lineNumber":612,"author":{"gitId":"-"},"content":" }"},{"lineNumber":613,"author":{"gitId":"-"},"content":""},{"lineNumber":614,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":615,"author":{"gitId":"-"},"content":" public void repoConfig_userEnvironmentCannotRunFindPreviousAuthors_setFindPreviousAuthorsToFalseInAllRepoConfigs()"},{"lineNumber":616,"author":{"gitId":"-"},"content":" throws Exception {"},{"lineNumber":617,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoBetaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":618,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_BETA))"},{"lineNumber":619,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":620,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":621,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setFormats(FileType.convertFormatStringsToFileTypes(CLI_FORMATS));"},{"lineNumber":622,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":623,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoDeltaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":624,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":625,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":626,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":627,"author":{"gitId":"-"},"content":" repoDeltaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":628,"author":{"gitId":"-"},"content":""},{"lineNumber":629,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(FIND_PREVIOUS_AUTHORS_FLAG_OVERRIDE_TEST_CONFIG_FILES).build();"},{"lineNumber":630,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":631,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":632,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":633,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs, true);"},{"lineNumber":634,"author":{"gitId":"-"},"content":" RepoConfiguration.setIsFindingPreviousAuthorsPerformedToRepoConfigs(actualConfigs,"},{"lineNumber":635,"author":{"gitId":"-"},"content":" cliArguments.isFindingPreviousAuthorsPerformed());"},{"lineNumber":636,"author":{"gitId":"-"},"content":""},{"lineNumber":637,"author":{"gitId":"-"},"content":" RepoConfiguration repoBetaActualConfig \u003d actualConfigs.get(0);"},{"lineNumber":638,"author":{"gitId":"-"},"content":" RepoConfiguration repoDeltaActualConfig \u003d actualConfigs.get(1);"},{"lineNumber":639,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoBetaActualConfig);"},{"lineNumber":640,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoDeltaActualConfig);"},{"lineNumber":641,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoBetaActualConfig);"},{"lineNumber":642,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoDeltaActualConfig);"},{"lineNumber":643,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoBetaExpectedConfig, repoBetaActualConfig);"},{"lineNumber":644,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoDeltaExpectedConfig, repoDeltaActualConfig);"},{"lineNumber":645,"author":{"gitId":"-"},"content":" }"},{"lineNumber":646,"author":{"gitId":"-"},"content":""},{"lineNumber":647,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":648,"author":{"gitId":"-"},"content":" public void repoConfig_withFormats_ignoreCliFormats() throws Exception {"},{"lineNumber":649,"author":{"gitId":"-"},"content":" String formats \u003d String.join(\" \", CLI_FORMATS);"},{"lineNumber":650,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(FORMATS_TEST_CONFIG_FILES)"},{"lineNumber":651,"author":{"gitId":"-"},"content":" .addFormats(formats)"},{"lineNumber":652,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":653,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":654,"author":{"gitId":"-"},"content":""},{"lineNumber":655,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":656,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":657,"author":{"gitId":"-"},"content":" RepoConfiguration.setFormatsToRepoConfigs(actualConfigs, cliArguments.getFormats());"},{"lineNumber":658,"author":{"gitId":"-"},"content":""},{"lineNumber":659,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, actualConfigs.size());"},{"lineNumber":660,"author":{"gitId":"-"},"content":" Assertions.assertEquals(CONFIG_FORMATS, actualConfigs.get(0).getFileTypeManager().getFormats());"},{"lineNumber":661,"author":{"gitId":"-"},"content":" }"},{"lineNumber":662,"author":{"gitId":"-"},"content":""},{"lineNumber":663,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":664,"author":{"gitId":"-"},"content":" public void repoConfig_withoutFormats_useCliFormats() throws Exception {"},{"lineNumber":665,"author":{"gitId":"-"},"content":" String formats \u003d String.join(\" \", CLI_FORMATS);"},{"lineNumber":666,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(WITHOUT_FORMATS_TEST_CONFIG_FILES)"},{"lineNumber":667,"author":{"gitId":"-"},"content":" .addFormats(formats)"},{"lineNumber":668,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":669,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":670,"author":{"gitId":"-"},"content":""},{"lineNumber":671,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":672,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":673,"author":{"gitId":"-"},"content":" RepoConfiguration.setFormatsToRepoConfigs(actualConfigs, cliArguments.getFormats());"},{"lineNumber":674,"author":{"gitId":"-"},"content":""},{"lineNumber":675,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, actualConfigs.size());"},{"lineNumber":676,"author":{"gitId":"-"},"content":""},{"lineNumber":677,"author":{"gitId":"-"},"content":" List\u003cFileType\u003e actualFormats \u003d actualConfigs.get(0).getFileTypeManager().getFormats();"},{"lineNumber":678,"author":{"gitId":"-"},"content":" Assertions.assertEquals(FileType.convertFormatStringsToFileTypes(CLI_FORMATS), actualFormats);"},{"lineNumber":679,"author":{"gitId":"-"},"content":" }"},{"lineNumber":680,"author":{"gitId":"-"},"content":""},{"lineNumber":681,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":682,"author":{"gitId":"-"},"content":" public void repoConfig_withCustomGroups_useCustomGroups() throws Exception {"},{"lineNumber":683,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(GROUPS_TEST_CONFIG_FILES).build();"},{"lineNumber":684,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":685,"author":{"gitId":"-"},"content":""},{"lineNumber":686,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":687,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":688,"author":{"gitId":"-"},"content":" List\u003cGroupConfiguration\u003e groupConfigs \u003d"},{"lineNumber":689,"author":{"gitId":"-"},"content":" new GroupConfigCsvParser(cliArguments.getGroupConfigFilePath()).parse();"},{"lineNumber":690,"author":{"gitId":"-"},"content":""},{"lineNumber":691,"author":{"gitId":"-"},"content":" RepoConfiguration.setGroupConfigsToRepos(actualConfigs, groupConfigs);"},{"lineNumber":692,"author":{"gitId":"-"},"content":""},{"lineNumber":693,"author":{"gitId":"-"},"content":" Assertions.assertEquals(2, actualConfigs.size());"},{"lineNumber":694,"author":{"gitId":"-"},"content":" Assertions.assertEquals(FIRST_CONFIG_GROUPS, actualConfigs.get(0).getFileTypeManager().getGroups());"},{"lineNumber":695,"author":{"gitId":"-"},"content":" Assertions.assertEquals(SECOND_CONFIG_GROUPS, actualConfigs.get(1).getFileTypeManager().getGroups());"},{"lineNumber":696,"author":{"gitId":"-"},"content":" }"},{"lineNumber":697,"author":{"gitId":"-"},"content":""},{"lineNumber":698,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":699,"author":{"gitId":"-"},"content":" public void repoConfig_withoutFormatsAndCliFormats_useAllFormats() throws Exception {"},{"lineNumber":700,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(WITHOUT_FORMATS_TEST_CONFIG_FILES).build();"},{"lineNumber":701,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":702,"author":{"gitId":"-"},"content":""},{"lineNumber":703,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":704,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":705,"author":{"gitId":"-"},"content":" RepoConfiguration.setFormatsToRepoConfigs(actualConfigs, cliArguments.getFormats());"},{"lineNumber":706,"author":{"gitId":"-"},"content":""},{"lineNumber":707,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, actualConfigs.size());"},{"lineNumber":708,"author":{"gitId":"-"},"content":" Assertions.assertEquals(FileTypeTest.NO_SPECIFIED_FORMATS, actualConfigs.get(0).getFileTypeManager()"},{"lineNumber":709,"author":{"gitId":"-"},"content":" .getFormats());"},{"lineNumber":710,"author":{"gitId":"-"},"content":" }"},{"lineNumber":711,"author":{"gitId":"-"},"content":""},{"lineNumber":712,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":713,"author":{"gitId":"-"},"content":" public void repoConfig_emptyLocationDifferentBranch_equal() throws Exception {"},{"lineNumber":714,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration emptyLocationEmptyBranchRepoConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":715,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(\"\"))"},{"lineNumber":716,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"\")"},{"lineNumber":717,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":718,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration emptyLocationDefaultBranchRepoConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":719,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(\"\")).build();"},{"lineNumber":720,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration emptyLocationWithBranchRepoConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":721,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(\"\"))"},{"lineNumber":722,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":723,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":724,"author":{"gitId":"-"},"content":""},{"lineNumber":725,"author":{"gitId":"-"},"content":" Assertions.assertEquals(emptyLocationDefaultBranchRepoConfig, emptyLocationEmptyBranchRepoConfig);"},{"lineNumber":726,"author":{"gitId":"-"},"content":" Assertions.assertEquals(emptyLocationWithBranchRepoConfig, emptyLocationEmptyBranchRepoConfig);"},{"lineNumber":727,"author":{"gitId":"-"},"content":" }"},{"lineNumber":728,"author":{"gitId":"-"},"content":""},{"lineNumber":729,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":730,"author":{"gitId":"-"},"content":" public void repoConfig_sameLocationDifferentBranch_notEqual() throws Exception {"},{"lineNumber":731,"author":{"gitId":"-"},"content":" RepoConfiguration validLocationValidBranchRepoConfig \u003d"},{"lineNumber":732,"author":{"gitId":"asdfghjkxd"},"content":" new RepoConfiguration.Builder()"},{"lineNumber":733,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":734,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":735,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":736,"author":{"gitId":"-"},"content":" RepoConfiguration validLocationDefaultBranchRepoConfig \u003d"},{"lineNumber":737,"author":{"gitId":"asdfghjkxd"},"content":" new RepoConfiguration.Builder().location(new RepoLocation(TEST_REPO_DELTA)).build();"},{"lineNumber":738,"author":{"gitId":"-"},"content":""},{"lineNumber":739,"author":{"gitId":"-"},"content":" Assertions.assertNotEquals(validLocationDefaultBranchRepoConfig, validLocationValidBranchRepoConfig);"},{"lineNumber":740,"author":{"gitId":"-"},"content":" }"},{"lineNumber":741,"author":{"gitId":"-"},"content":""},{"lineNumber":742,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":743,"author":{"gitId":"-"},"content":" public void repoConfig_overrideStandaloneConfig_success() throws Exception {"},{"lineNumber":744,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration expectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":745,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":746,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":747,"author":{"gitId":"asdfghjkxd"},"content":" .fileTypeManager(Collections.emptyList())"},{"lineNumber":748,"author":{"gitId":"asdfghjkxd"},"content":" .ignoreGlobList(Collections.emptyList())"},{"lineNumber":749,"author":{"gitId":"asdfghjkxd"},"content":" .fileSizeLimit(RepoConfiguration.DEFAULT_FILE_SIZE_LIMIT)"},{"lineNumber":750,"author":{"gitId":"asdfghjkxd"},"content":" .isStandaloneConfigIgnored(false)"},{"lineNumber":751,"author":{"gitId":"asdfghjkxd"},"content":" .isFileSizeLimitIgnored(false)"},{"lineNumber":752,"author":{"gitId":"asdfghjkxd"},"content":" .ignoreCommitList(Collections.emptyList())"},{"lineNumber":753,"author":{"gitId":"asdfghjkxd"},"content":" .isFormatsOverriding(true)"},{"lineNumber":754,"author":{"gitId":"asdfghjkxd"},"content":" .isIgnoreGlobListOverriding(true)"},{"lineNumber":755,"author":{"gitId":"asdfghjkxd"},"content":" .isIgnoreCommitListOverriding(true)"},{"lineNumber":756,"author":{"gitId":"asdfghjkxd"},"content":" .isFileSizeLimitOverriding(false)"},{"lineNumber":757,"author":{"gitId":"asdfghjkxd"},"content":" .isShallowCloningPerformed(false)"},{"lineNumber":758,"author":{"gitId":"asdfghjkxd"},"content":" .isFindingPreviousAuthorsPerformed(false)"},{"lineNumber":759,"author":{"gitId":"asdfghjkxd"},"content":" .isIgnoredFileAnalysisSkipped(false)"},{"lineNumber":760,"author":{"gitId":"asdfghjkxd"},"content":" .ignoredAuthorsList(Arrays.asList(\"lithiumlkid\"))"},{"lineNumber":761,"author":{"gitId":"asdfghjkxd"},"content":" .isIgnoredAuthorsListOverriding(true)"},{"lineNumber":762,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":763,"author":{"gitId":"-"},"content":""},{"lineNumber":764,"author":{"gitId":"-"},"content":" List\u003cAuthor\u003e expectedAuthorList \u003d new ArrayList\u003c\u003e();"},{"lineNumber":765,"author":{"gitId":"-"},"content":" Author[] authors \u003d new Author[]{FIRST_AUTHOR, SECOND_AUTHOR, THIRD_AUTHOR, FOURTH_AUTHOR};"},{"lineNumber":766,"author":{"gitId":"-"},"content":" for (Author author : authors) {"},{"lineNumber":767,"author":{"gitId":"-"},"content":" Author expectedAuthor \u003d new Author(author);"},{"lineNumber":768,"author":{"gitId":"-"},"content":" List\u003cString\u003e expectedAuthorIgnoreGlobList \u003d new ArrayList\u003c\u003e();"},{"lineNumber":769,"author":{"gitId":"-"},"content":" expectedAuthorIgnoreGlobList.addAll(author.getIgnoreGlobList());"},{"lineNumber":770,"author":{"gitId":"-"},"content":""},{"lineNumber":771,"author":{"gitId":"-"},"content":" // Authors\u0027 original ignoreGlobList contains values from StandaloneConfig repo level, thus need to remove"},{"lineNumber":772,"author":{"gitId":"-"},"content":" expectedAuthorIgnoreGlobList.removeAll(REPO_LEVEL_GLOB_LIST);"},{"lineNumber":773,"author":{"gitId":"-"},"content":" expectedAuthor.setIgnoreGlobList(expectedAuthorIgnoreGlobList);"},{"lineNumber":774,"author":{"gitId":"-"},"content":" expectedAuthorList.add(expectedAuthor);"},{"lineNumber":775,"author":{"gitId":"-"},"content":" }"},{"lineNumber":776,"author":{"gitId":"-"},"content":" expectedConfig.setAuthorList(expectedAuthorList);"},{"lineNumber":777,"author":{"gitId":"-"},"content":" expectedConfig.setAuthorDisplayNameMap(repoDeltaStandaloneConfig.getAuthorDisplayNameMap());"},{"lineNumber":778,"author":{"gitId":"-"},"content":" expectedConfig.setAuthorNamesToAuthorMap(repoDeltaStandaloneConfig.getAuthorNamesToAuthorMap());"},{"lineNumber":779,"author":{"gitId":"-"},"content":" expectedConfig.setAuthorEmailsToAuthorMap(repoDeltaStandaloneConfig.getAuthorEmailsToAuthorMap());"},{"lineNumber":780,"author":{"gitId":"-"},"content":""},{"lineNumber":781,"author":{"gitId":"-"},"content":" String formats \u003d String.join(\" \", CLI_FORMATS);"},{"lineNumber":782,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(OVERRIDE_STANDALONE_TEST_CONFIG_FILE)"},{"lineNumber":783,"author":{"gitId":"-"},"content":" .addFormats(formats)"},{"lineNumber":784,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":785,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":786,"author":{"gitId":"-"},"content":""},{"lineNumber":787,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":788,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":789,"author":{"gitId":"-"},"content":""},{"lineNumber":790,"author":{"gitId":"-"},"content":" RepoConfiguration actualConfig \u003d actualConfigs.get(0);"},{"lineNumber":791,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(actualConfig);"},{"lineNumber":792,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(actualConfig);"},{"lineNumber":793,"author":{"gitId":"-"},"content":""},{"lineNumber":794,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(expectedConfig, actualConfig);"},{"lineNumber":795,"author":{"gitId":"-"},"content":" }"},{"lineNumber":796,"author":{"gitId":"-"},"content":""},{"lineNumber":797,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":798,"author":{"gitId":"-"},"content":" public void repoConfig_minimalStandaloneConfig_fieldsAssignedDefaultValues() throws Exception {"},{"lineNumber":799,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration expectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":800,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_MINIMAL_STANDALONE_CONFIG))"},{"lineNumber":801,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":802,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":803,"author":{"gitId":"-"},"content":""},{"lineNumber":804,"author":{"gitId":"-"},"content":" Author firstAuthor \u003d new Author(\"bluein-green\");"},{"lineNumber":805,"author":{"gitId":"-"},"content":" Author secondAuthor \u003d new Author(\"jylee-git\");"},{"lineNumber":806,"author":{"gitId":"-"},"content":" List\u003cAuthor\u003e expectedAuthors \u003d Arrays.asList(firstAuthor, secondAuthor);"},{"lineNumber":807,"author":{"gitId":"-"},"content":" expectedConfig.setAuthorList(expectedAuthors);"},{"lineNumber":808,"author":{"gitId":"-"},"content":""},{"lineNumber":809,"author":{"gitId":"-"},"content":" expectedConfig.setIgnoreGlobList(Collections.emptyList());"},{"lineNumber":810,"author":{"gitId":"-"},"content":" expectedConfig.setFormats(Collections.emptyList());"},{"lineNumber":811,"author":{"gitId":"-"},"content":" expectedConfig.setIgnoreCommitList(Collections.emptyList());"},{"lineNumber":812,"author":{"gitId":"-"},"content":""},{"lineNumber":813,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration actualConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":814,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_MINIMAL_STANDALONE_CONFIG))"},{"lineNumber":815,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":816,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":817,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(actualConfig);"},{"lineNumber":818,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(actualConfig);"},{"lineNumber":819,"author":{"gitId":"-"},"content":""},{"lineNumber":820,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(expectedConfig, actualConfig);"},{"lineNumber":821,"author":{"gitId":"-"},"content":" }"},{"lineNumber":822,"author":{"gitId":"-"},"content":""},{"lineNumber":823,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":824,"author":{"gitId":"-"},"content":" public void repoConfig_removeIgnoredAuthors_success() throws Exception {"},{"lineNumber":825,"author":{"gitId":"-"},"content":" List\u003cAuthor\u003e expectedAuthors \u003d new ArrayList\u003c\u003e();"},{"lineNumber":826,"author":{"gitId":"-"},"content":" Author author \u003d new Author(FIRST_AUTHOR);"},{"lineNumber":827,"author":{"gitId":"-"},"content":" author.setIgnoreGlobList(REPO_LEVEL_GLOB_LIST);"},{"lineNumber":828,"author":{"gitId":"-"},"content":" expectedAuthors.add(author);"},{"lineNumber":829,"author":{"gitId":"-"},"content":""},{"lineNumber":830,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration expectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":831,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":832,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":833,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":834,"author":{"gitId":"-"},"content":" expectedConfig.setAuthorList(expectedAuthors);"},{"lineNumber":835,"author":{"gitId":"-"},"content":" expectedConfig.addAuthorNamesToAuthorMapEntry(author, FIRST_AUTHOR_ALIASES);"},{"lineNumber":836,"author":{"gitId":"-"},"content":" expectedConfig.setAuthorDisplayName(author, \"Ahm\");"},{"lineNumber":837,"author":{"gitId":"-"},"content":""},{"lineNumber":838,"author":{"gitId":"-"},"content":" expectedConfig.setIgnoreGlobList(REPO_LEVEL_GLOB_LIST);"},{"lineNumber":839,"author":{"gitId":"-"},"content":" expectedConfig.setFormats(CONFIG_FORMATS);"},{"lineNumber":840,"author":{"gitId":"-"},"content":" expectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":841,"author":{"gitId":"-"},"content":" expectedConfig.setIgnoredAuthorsList(Arrays.asList(\"jordancjq\", \"Eugene Peh\"));"},{"lineNumber":842,"author":{"gitId":"-"},"content":""},{"lineNumber":843,"author":{"gitId":"-"},"content":" String formats \u003d String.join(\" \", CLI_FORMATS);"},{"lineNumber":844,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(IGNORE_AUTHORS_TEST_CONFIG_FILE)"},{"lineNumber":845,"author":{"gitId":"-"},"content":" .addFormats(formats)"},{"lineNumber":846,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":847,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":848,"author":{"gitId":"-"},"content":""},{"lineNumber":849,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":850,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":851,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e authorConfigs \u003d"},{"lineNumber":852,"author":{"gitId":"-"},"content":" new AuthorConfigCsvParser(cliArguments.getAuthorConfigFilePath()).parse();"},{"lineNumber":853,"author":{"gitId":"-"},"content":" RepoConfiguration.merge(actualConfigs, authorConfigs);"},{"lineNumber":854,"author":{"gitId":"-"},"content":""},{"lineNumber":855,"author":{"gitId":"-"},"content":" RepoConfiguration actualConfig \u003d actualConfigs.get(0);"},{"lineNumber":856,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(actualConfig);"},{"lineNumber":857,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(actualConfig);"},{"lineNumber":858,"author":{"gitId":"-"},"content":" Method updateAuthorList \u003d ReportGenerator.class.getDeclaredMethod(\"updateAuthorList\", RepoConfiguration.class);"},{"lineNumber":859,"author":{"gitId":"-"},"content":" updateAuthorList.setAccessible(true);"},{"lineNumber":860,"author":{"gitId":"-"},"content":" updateAuthorList.invoke(reportGenerator, actualConfig);"},{"lineNumber":861,"author":{"gitId":"-"},"content":""},{"lineNumber":862,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(expectedConfig, actualConfig);"},{"lineNumber":863,"author":{"gitId":"-"},"content":" }"},{"lineNumber":864,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":865,"author":{"gitId":"asdfghjkxd"},"content":" @Test"},{"lineNumber":866,"author":{"gitId":"asdfghjkxd"},"content":" public void repoBuilder_displayName_success() throws Exception {"},{"lineNumber":867,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration actualConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":868,"author":{"gitId":"asdfghjkxd"},"content":" .displayName(\"CS3281\")"},{"lineNumber":869,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_MINIMAL_STANDALONE_CONFIG))"},{"lineNumber":870,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":871,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":872,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":873,"author":{"gitId":"asdfghjkxd"},"content":" Assertions.assertEquals(actualConfig.getDisplayName(), \"CS3281\");"},{"lineNumber":874,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":875,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":876,"author":{"gitId":"asdfghjkxd"},"content":" @Test"},{"lineNumber":877,"author":{"gitId":"asdfghjkxd"},"content":" public void repoBuilder_outputFolderName_success() throws Exception {"},{"lineNumber":878,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration actualConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":879,"author":{"gitId":"asdfghjkxd"},"content":" .outputFolderName(\"CS3281 Folder\")"},{"lineNumber":880,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_MINIMAL_STANDALONE_CONFIG))"},{"lineNumber":881,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":882,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":883,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":884,"author":{"gitId":"asdfghjkxd"},"content":" Assertions.assertEquals(actualConfig.getOutputFolderName(), \"CS3281 Folder\");"},{"lineNumber":885,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":886,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":887,"author":{"gitId":"asdfghjkxd"},"content":" @Test"},{"lineNumber":888,"author":{"gitId":"asdfghjkxd"},"content":" public void repoBuilder_repoFolderName_success() throws Exception {"},{"lineNumber":889,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration actualConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":890,"author":{"gitId":"asdfghjkxd"},"content":" .repoFolderName(\"CS3281 Folder\")"},{"lineNumber":891,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_MINIMAL_STANDALONE_CONFIG))"},{"lineNumber":892,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":893,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":894,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":895,"author":{"gitId":"asdfghjkxd"},"content":" Assertions.assertEquals(actualConfig.getRepoFolderName(), \"CS3281 Folder\");"},{"lineNumber":896,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":897,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":898,"author":{"gitId":"asdfghjkxd"},"content":" @Test"},{"lineNumber":899,"author":{"gitId":"asdfghjkxd"},"content":" public void repoBuilder_zoneID_success() throws Exception {"},{"lineNumber":900,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration actualConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":901,"author":{"gitId":"asdfghjkxd"},"content":" .zoneId(ZoneId.systemDefault())"},{"lineNumber":902,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_MINIMAL_STANDALONE_CONFIG))"},{"lineNumber":903,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":904,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":905,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":906,"author":{"gitId":"asdfghjkxd"},"content":" Assertions.assertEquals(actualConfig.getZoneId(), ZoneId.systemDefault());"},{"lineNumber":907,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":908,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":909,"author":{"gitId":"asdfghjkxd"},"content":" @Test"},{"lineNumber":910,"author":{"gitId":"asdfghjkxd"},"content":" public void repoBuilder_sinceDate_success() throws Exception {"},{"lineNumber":911,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration actualConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":912,"author":{"gitId":"asdfghjkxd"},"content":" .sinceDate(LocalDateTime.of(2024, 1, 1, 12, 0, 0))"},{"lineNumber":913,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_MINIMAL_STANDALONE_CONFIG))"},{"lineNumber":914,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":915,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":916,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":917,"author":{"gitId":"asdfghjkxd"},"content":" Assertions.assertEquals(actualConfig.getSinceDate(),"},{"lineNumber":918,"author":{"gitId":"asdfghjkxd"},"content":" LocalDateTime.of(2024, 1, 1, 12, 0, 0));"},{"lineNumber":919,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":920,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":921,"author":{"gitId":"asdfghjkxd"},"content":" @Test"},{"lineNumber":922,"author":{"gitId":"asdfghjkxd"},"content":" public void repoBuilder_untilDate_success() throws Exception {"},{"lineNumber":923,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration actualConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":924,"author":{"gitId":"asdfghjkxd"},"content":" .untilDate(LocalDateTime.of(2024, 1, 1, 12, 0, 0))"},{"lineNumber":925,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_MINIMAL_STANDALONE_CONFIG))"},{"lineNumber":926,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":927,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":928,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":929,"author":{"gitId":"asdfghjkxd"},"content":" Assertions.assertEquals(actualConfig.getUntilDate(),"},{"lineNumber":930,"author":{"gitId":"asdfghjkxd"},"content":" LocalDateTime.of(2024, 1, 1, 12, 0, 0));"},{"lineNumber":931,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":932,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":933,"author":{"gitId":"asdfghjkxd"},"content":" @Test"},{"lineNumber":934,"author":{"gitId":"asdfghjkxd"},"content":" public void repoBuilder_authorConfig_success() throws Exception {"},{"lineNumber":935,"author":{"gitId":"asdfghjkxd"},"content":" RepoLocation loc \u003d new RepoLocation(TEST_REPO_MINIMAL_STANDALONE_CONFIG);"},{"lineNumber":936,"author":{"gitId":"asdfghjkxd"},"content":" String branch \u003d \"master\";"},{"lineNumber":937,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":938,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration actualConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":939,"author":{"gitId":"asdfghjkxd"},"content":" .authorConfig(new AuthorConfiguration(loc, branch))"},{"lineNumber":940,"author":{"gitId":"asdfghjkxd"},"content":" .location(loc)"},{"lineNumber":941,"author":{"gitId":"asdfghjkxd"},"content":" .branch(branch)"},{"lineNumber":942,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":943,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":944,"author":{"gitId":"asdfghjkxd"},"content":" Assertions.assertEquals(actualConfig.getAuthorConfig(),"},{"lineNumber":945,"author":{"gitId":"asdfghjkxd"},"content":" new AuthorConfiguration(loc, branch));"},{"lineNumber":946,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":947,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":948,"author":{"gitId":"asdfghjkxd"},"content":" @Test"},{"lineNumber":949,"author":{"gitId":"asdfghjkxd"},"content":" public void repoBuilder_isLastModifiedDateIncluded_success() throws Exception {"},{"lineNumber":950,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration actualConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":951,"author":{"gitId":"asdfghjkxd"},"content":" .isLastModifiedDateIncluded(true)"},{"lineNumber":952,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_MINIMAL_STANDALONE_CONFIG))"},{"lineNumber":953,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":954,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":955,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":956,"author":{"gitId":"asdfghjkxd"},"content":" Assertions.assertTrue(actualConfig.isLastModifiedDateIncluded());"},{"lineNumber":957,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":958,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":959,"author":{"gitId":"asdfghjkxd"},"content":" @Test"},{"lineNumber":960,"author":{"gitId":"asdfghjkxd"},"content":" public void repoBuilder_buildWithInvalid_failure() {"},{"lineNumber":961,"author":{"gitId":"asdfghjkxd"},"content":" Assertions.assertThrows(ConfigurationBuildException.class, () -\u003e new RepoConfiguration.Builder().build());"},{"lineNumber":962,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":963,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":244,"-":719}},{"path":"src/test/java/reposense/model/RepoLocationTest.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.model;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static reposense.model.RepoLocation.UNSUPPORTED_DOMAIN_NAME;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static reposense.model.RepoLocation.getDomainNameFromDomain;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static reposense.model.RepoLocation.isLocalRepo;"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assertions;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assumptions;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidLocationException;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import reposense.util.AssertUtil;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import reposense.util.SystemUtil;"},{"lineNumber":14,"author":{"gitId":"-"},"content":""},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class RepoLocationTest {"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_VALID_WITHOUT_DOT_GIT_ONE \u003d \"repo\";"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_VALID_WITHOUT_DOT_GIT_TWO \u003d \"../path/to/repo\";"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_VALID_WITHOUT_DOT_GIT_THREE \u003d \"/path/to/repo\";"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_VALID_WITH_DOT_GIT_ONE \u003d \"path/to/repo/.git\";"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_VALID_WITH_DOT_GIT_TWO \u003d \"file://path/to/repo.git\";"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_FILE_URL_ONE \u003d \"file://path/to/repo\";"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_FILE_URL_TWO \u003d \"file:///path/to/repo\";"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_WINDOWS_VALID_WITHOUT_DOT_GIT_ONE \u003d \"path\\\\to\\\\repo\\\\\";"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_WINDOWS_VALID_WITHOUT_DOT_GIT_TWO \u003d \"..\\\\path\\\\to\\\\repo\";"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_WINDOWS_VALID_WITH_DOT_GIT_ONE \u003d \"path\\\\to\\\\repo\\\\.git\";"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_WINDOWS_DISK_DRIVE \u003d \"C:\\\\path\\\\to\\\\repo.git\";"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_WINDOWS_VALID_MIXED_ONE \u003d \"..\\\\path/to\\\\repo\";"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_WINDOWS_VALID_MIXED_TWO \u003d \"file://path\\\\to\\\\repo.git\";"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_WINDOWS_DISK_DRIVE_MIXED \u003d \"C:\\\\path/to/repo.git\";"},{"lineNumber":33,"author":{"gitId":"-"},"content":""},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final String EXPECTED_REPO_NAME \u003d \"repo\";"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private static final String EXPECTED_ORGANIZATION \u003d \"path-to\";"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private static final String EXPECTED_DOMAIN_NAME \u003d \"github\";"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private static final String EXPECTED_UNRECOGNISED_DOMAIN_NAME \u003d UNSUPPORTED_DOMAIN_NAME;"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public void repoLocation_parseEmptyString_success() throws Exception {"},{"lineNumber":41,"author":{"gitId":"-"},"content":" RepoLocation repoLocation \u003d new RepoLocation(\"\");"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public void isLocalRepo_validLocalRepos_success() throws Exception {"},{"lineNumber":46,"author":{"gitId":"-"},"content":" Assertions.assertTrue(isLocalRepo(LOCAL_REPO_VALID_WITH_DOT_GIT_ONE));"},{"lineNumber":47,"author":{"gitId":"-"},"content":" Assertions.assertTrue(isLocalRepo(LOCAL_REPO_WINDOWS_VALID_MIXED_ONE));"},{"lineNumber":48,"author":{"gitId":"-"},"content":" Assertions.assertTrue(isLocalRepo(\"./abc:def\"));"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public void isLocalRepo_remoteRepos_returnsFalse() throws Exception {"},{"lineNumber":53,"author":{"gitId":"-"},"content":" Assertions.assertFalse(isLocalRepo(\"https://github.com/reposense/RepoSense.git/\"));"},{"lineNumber":54,"author":{"gitId":"-"},"content":" Assertions.assertFalse(isLocalRepo(\"git@github.com:reposense/RepoSense.git/\"));"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }"},{"lineNumber":56,"author":{"gitId":"-"},"content":""},{"lineNumber":57,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public void repoLocation_parseLocalRepoLocation_success() throws Exception {"},{"lineNumber":59,"author":{"gitId":"-"},"content":" // local paths not containing \".git\" should be valid"},{"lineNumber":60,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_VALID_WITHOUT_DOT_GIT_ONE,"},{"lineNumber":61,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, \"\", EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":62,"author":{"gitId":"-"},"content":" // relative pathing should be considered part of the \u0027organization\u0027 for differentiation"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_VALID_WITHOUT_DOT_GIT_TWO,"},{"lineNumber":64,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, \"..-\" + EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":65,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_VALID_WITHOUT_DOT_GIT_THREE,"},{"lineNumber":66,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, \"-\" + EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":67,"author":{"gitId":"-"},"content":""},{"lineNumber":68,"author":{"gitId":"-"},"content":" // local paths containing \".git\" should also be valid"},{"lineNumber":69,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_VALID_WITH_DOT_GIT_ONE,"},{"lineNumber":70,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":71,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_VALID_WITH_DOT_GIT_TWO,"},{"lineNumber":72,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":73,"author":{"gitId":"-"},"content":""},{"lineNumber":74,"author":{"gitId":"-"},"content":" // file-type url protocol (file://) is accepted by git clone"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_FILE_URL_ONE,"},{"lineNumber":76,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":77,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_FILE_URL_TWO,"},{"lineNumber":78,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, \"-\" + EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }"},{"lineNumber":80,"author":{"gitId":"-"},"content":""},{"lineNumber":81,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":82,"author":{"gitId":"-"},"content":" public void repoLocation_parseWindowsLocalRepoLocation_success() throws Exception {"},{"lineNumber":83,"author":{"gitId":"-"},"content":" Assumptions.assumeTrue(SystemUtil.isWindows());"},{"lineNumber":84,"author":{"gitId":"-"},"content":" // repeated tests but with windows file separators"},{"lineNumber":85,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_WINDOWS_VALID_WITHOUT_DOT_GIT_ONE,"},{"lineNumber":86,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_WINDOWS_VALID_WITHOUT_DOT_GIT_TWO,"},{"lineNumber":88,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, \"..-\" + EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_WINDOWS_VALID_WITH_DOT_GIT_ONE,"},{"lineNumber":90,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":91,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_WINDOWS_DISK_DRIVE,"},{"lineNumber":92,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, \"C--\" + EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":93,"author":{"gitId":"-"},"content":""},{"lineNumber":94,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_WINDOWS_VALID_MIXED_ONE,"},{"lineNumber":95,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, \"..-\" + EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":96,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_WINDOWS_VALID_MIXED_TWO,"},{"lineNumber":97,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":98,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_WINDOWS_DISK_DRIVE_MIXED,"},{"lineNumber":99,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, \"C--\" + EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":100,"author":{"gitId":"-"},"content":""},{"lineNumber":101,"author":{"gitId":"-"},"content":" }"},{"lineNumber":102,"author":{"gitId":"-"},"content":""},{"lineNumber":103,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":104,"author":{"gitId":"-"},"content":" public void repoLocation_parseValidRemoteRepoUrl_success() throws Exception {"},{"lineNumber":105,"author":{"gitId":"-"},"content":" // valid url without specifying branch"},{"lineNumber":106,"author":{"gitId":"-"},"content":" assertParsableLocation(\"https://github.com/reposense/testrepo-Beta.git\","},{"lineNumber":107,"author":{"gitId":"-"},"content":" \"testrepo-Beta\", \"reposense\", EXPECTED_DOMAIN_NAME);"},{"lineNumber":108,"author":{"gitId":"-"},"content":" assertParsableLocation(\"https://github.com/reposense/testrepo-Delta.git\","},{"lineNumber":109,"author":{"gitId":"-"},"content":" \"testrepo-Delta\", \"reposense\", EXPECTED_DOMAIN_NAME);"},{"lineNumber":110,"author":{"gitId":"-"},"content":" assertParsableLocation(\"https://gitlab.com/reposense/RepoSense.git\","},{"lineNumber":111,"author":{"gitId":"-"},"content":" \"RepoSense\", \"reposense\", \"gitlab\");"},{"lineNumber":112,"author":{"gitId":"-"},"content":" assertParsableLocation(\"https://github.com/reposense.git\","},{"lineNumber":113,"author":{"gitId":"-"},"content":" \"reposense\", \"\", EXPECTED_DOMAIN_NAME);"},{"lineNumber":114,"author":{"gitId":"-"},"content":" // valid url to parse for obtaining repo and organization, just not a valid git clone target"},{"lineNumber":115,"author":{"gitId":"-"},"content":" assertParsableLocation(\"https://github.com/reposense/.git\","},{"lineNumber":116,"author":{"gitId":"-"},"content":" \"reposense\", \"\", EXPECTED_DOMAIN_NAME);"},{"lineNumber":117,"author":{"gitId":"-"},"content":""},{"lineNumber":118,"author":{"gitId":"-"},"content":" // valid url from other domains"},{"lineNumber":119,"author":{"gitId":"-"},"content":" assertParsableLocation(\"https://bitbucket.org/reposense/RepoSense.git\","},{"lineNumber":120,"author":{"gitId":"-"},"content":" \"RepoSense\", \"reposense\", \"bitbucket\");"},{"lineNumber":121,"author":{"gitId":"-"},"content":" // valid url from unsupported domain with longer path to git directory than the standard organization/reponame"},{"lineNumber":122,"author":{"gitId":"-"},"content":" assertParsableLocation(\"https://opensource.ncsa.illinois.edu/bitbucket/scm/u3d/3dutilities.git\","},{"lineNumber":123,"author":{"gitId":"-"},"content":" \"3dutilities\", \"bitbucket-scm-u3d\", EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":124,"author":{"gitId":"-"},"content":""},{"lineNumber":125,"author":{"gitId":"-"},"content":" // treated as valid but will be caught when git clone fails"},{"lineNumber":126,"author":{"gitId":"-"},"content":" assertParsableLocation(\"https://github.com/reposense/testrepo-Beta/tree/add-config-json\","},{"lineNumber":127,"author":{"gitId":"-"},"content":" \"add-config-json\", \"reposense-testrepo-Beta-tree\", EXPECTED_DOMAIN_NAME);"},{"lineNumber":128,"author":{"gitId":"-"},"content":" assertParsableLocation(\"https://github.com/reposense/testrepo-Beta.git/tree/add-config-json\","},{"lineNumber":129,"author":{"gitId":"-"},"content":" \"add-config-json\", \"reposense-testrepo-Beta.git-tree\", EXPECTED_DOMAIN_NAME);"},{"lineNumber":130,"author":{"gitId":"-"},"content":""},{"lineNumber":131,"author":{"gitId":"-"},"content":" // URLs without \".git\" should be accepted as git clone works even without it"},{"lineNumber":132,"author":{"gitId":"-"},"content":" assertParsableLocation(\"https://github.com/reposense\","},{"lineNumber":133,"author":{"gitId":"-"},"content":" \"reposense\", \"\", EXPECTED_DOMAIN_NAME);"},{"lineNumber":134,"author":{"gitId":"-"},"content":" assertParsableLocation(\"https://github.com/reposense/RepoSense\","},{"lineNumber":135,"author":{"gitId":"-"},"content":" \"RepoSense\", \"reposense\", EXPECTED_DOMAIN_NAME);"},{"lineNumber":136,"author":{"gitId":"-"},"content":""},{"lineNumber":137,"author":{"gitId":"-"},"content":" // Test against other types of URL protocols that are valid for git clone"},{"lineNumber":138,"author":{"gitId":"-"},"content":" assertParsableLocation(\"ssh://git@github.com/path/to/repo.git/\","},{"lineNumber":139,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, EXPECTED_ORGANIZATION, EXPECTED_DOMAIN_NAME);"},{"lineNumber":140,"author":{"gitId":"-"},"content":" assertParsableLocation(\"git://github.com/path/to/repo.git\","},{"lineNumber":141,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, EXPECTED_ORGANIZATION, EXPECTED_DOMAIN_NAME);"},{"lineNumber":142,"author":{"gitId":"-"},"content":" assertParsableLocation(\"https://host.xz:9000/path/to/repo.git\","},{"lineNumber":143,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":144,"author":{"gitId":"-"},"content":""},{"lineNumber":145,"author":{"gitId":"-"},"content":" // Test against the conventional ssh protocol used for GitHub, e.g. git@github.com:reposense/RepoSense.git"},{"lineNumber":146,"author":{"gitId":"-"},"content":" assertParsableLocation(\"repo@organization.com:path/to/repo.git/\","},{"lineNumber":147,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":148,"author":{"gitId":"-"},"content":" assertParsableLocation(\"git@github.com:reposense/RepoSense.git\","},{"lineNumber":149,"author":{"gitId":"-"},"content":" \"RepoSense\", \"reposense\", EXPECTED_DOMAIN_NAME);"},{"lineNumber":150,"author":{"gitId":"-"},"content":" }"},{"lineNumber":151,"author":{"gitId":"-"},"content":""},{"lineNumber":152,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":153,"author":{"gitId":"-"},"content":" public void repoLocation_parseNormalizableRepoLocations_success() throws Exception {"},{"lineNumber":154,"author":{"gitId":"-"},"content":" assertParsableLocation(\"https://github.com/reposense/redundant/directories/../../RepoSense.git\","},{"lineNumber":155,"author":{"gitId":"-"},"content":" \"RepoSense\", \"reposense\", EXPECTED_DOMAIN_NAME);"},{"lineNumber":156,"author":{"gitId":"-"},"content":" assertParsableLocation(\"/path/with/redundant/directories/../.././../to/repo\","},{"lineNumber":157,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, \"-\" + EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":158,"author":{"gitId":"-"},"content":""},{"lineNumber":159,"author":{"gitId":"-"},"content":" // Tests if there is an additional \u0027../\u0027 it is not consumed by accident"},{"lineNumber":160,"author":{"gitId":"-"},"content":" assertParsableLocation(\"path/with/redundant/directories/../../../../../to/repo\","},{"lineNumber":161,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, \"..-to\", EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":162,"author":{"gitId":"-"},"content":" }"},{"lineNumber":163,"author":{"gitId":"-"},"content":""},{"lineNumber":164,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":165,"author":{"gitId":"-"},"content":" public void repoLocation_parseInvalidRemoteRepo_throwsInvalidLocationException() throws Exception {"},{"lineNumber":166,"author":{"gitId":"-"},"content":" // Invalid URL protocol"},{"lineNumber":167,"author":{"gitId":"-"},"content":" assertUnparsableLocation(\"ttp://github.com/reposense.RepoSense.git\");"},{"lineNumber":168,"author":{"gitId":"-"},"content":" assertUnparsableLocation(\"not-valid-protocol://abc.com/reposense/RepoSense.git\");"},{"lineNumber":169,"author":{"gitId":"-"},"content":" // URL contains illegal characters"},{"lineNumber":170,"author":{"gitId":"-"},"content":" assertUnparsableLocation(\"https://github.com/contains-illegal-chars/^\\\\/\");"},{"lineNumber":171,"author":{"gitId":"-"},"content":" }"},{"lineNumber":172,"author":{"gitId":"-"},"content":""},{"lineNumber":173,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":174,"author":{"gitId":"-"},"content":" public void getDomainNameFromMatcher_parseValidDomain_success() throws Exception {"},{"lineNumber":175,"author":{"gitId":"-"},"content":" Assertions.assertEquals(\"github\", getDomainNameFromDomain(\"www.github.com\"));"},{"lineNumber":176,"author":{"gitId":"-"},"content":" Assertions.assertEquals(\"github\", getDomainNameFromDomain(\"github.com\"));"},{"lineNumber":177,"author":{"gitId":"-"},"content":" Assertions.assertEquals(\"gitlab\", getDomainNameFromDomain(\"www.gitlab.org\"));"},{"lineNumber":178,"author":{"gitId":"-"},"content":" Assertions.assertEquals(\"bitbucket\", getDomainNameFromDomain(\"ww2.bitbucket.com\"));"},{"lineNumber":179,"author":{"gitId":"-"},"content":""},{"lineNumber":180,"author":{"gitId":"-"},"content":" // valid but unsupported"},{"lineNumber":181,"author":{"gitId":"-"},"content":" Assertions.assertEquals(UNSUPPORTED_DOMAIN_NAME, getDomainNameFromDomain(\"opensource.ncsa.illinois.edu\"));"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }"},{"lineNumber":183,"author":{"gitId":"-"},"content":""},{"lineNumber":184,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":185,"author":{"gitId":"-"},"content":" public void getDomainNameFromMatcher_parseInvalidDomain_throwsInvalidLocationException() throws Exception {"},{"lineNumber":186,"author":{"gitId":"-"},"content":" // no top level domain specified"},{"lineNumber":187,"author":{"gitId":"-"},"content":" AssertUtil.assertThrows(InvalidLocationException.class, () -\u003e getDomainNameFromDomain(\"www.github\"));"},{"lineNumber":188,"author":{"gitId":"-"},"content":" AssertUtil.assertThrows(InvalidLocationException.class, () -\u003e getDomainNameFromDomain(\"github\"));"},{"lineNumber":189,"author":{"gitId":"-"},"content":" // has a dot but still no top level domain specified"},{"lineNumber":190,"author":{"gitId":"-"},"content":" AssertUtil.assertThrows(InvalidLocationException.class, () -\u003e getDomainNameFromDomain(\"github.\"));"},{"lineNumber":191,"author":{"gitId":"-"},"content":" }"},{"lineNumber":192,"author":{"gitId":"-"},"content":""},{"lineNumber":193,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":194,"author":{"gitId":"-"},"content":" * Compares the information of {@code rawLocation} parsed by the RepoLocation model with {@code expectedRepoName}"},{"lineNumber":195,"author":{"gitId":"-"},"content":" * and {@code expectedOrganization}."},{"lineNumber":196,"author":{"gitId":"-"},"content":" */"},{"lineNumber":197,"author":{"gitId":"-"},"content":" public void assertParsableLocation(String rawLocation, String expectedRepoName,"},{"lineNumber":198,"author":{"gitId":"-"},"content":" String expectedOrganization, String expectedDomainName) throws Exception {"},{"lineNumber":199,"author":{"gitId":"-"},"content":" RepoLocation repoLocation \u003d new RepoLocation(rawLocation);"},{"lineNumber":200,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedRepoName, repoLocation.getRepoName());"},{"lineNumber":201,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedOrganization, repoLocation.getOrganization());"},{"lineNumber":202,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedDomainName, repoLocation.getDomainName());"},{"lineNumber":203,"author":{"gitId":"-"},"content":" }"},{"lineNumber":204,"author":{"gitId":"-"},"content":""},{"lineNumber":205,"author":{"gitId":"-"},"content":" private void assertUnparsableLocation(String rawLocation) {"},{"lineNumber":206,"author":{"gitId":"-"},"content":" AssertUtil.assertThrows(InvalidLocationException.class, () -\u003e new RepoLocation(rawLocation));"},{"lineNumber":207,"author":{"gitId":"-"},"content":" }"},{"lineNumber":208,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":207}},{"path":"src/test/java/reposense/parser/ArgsParserTest.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.parser;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.apache.tools.ant.types.Commandline.translateCommandline;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static reposense.util.TestUtil.loadResource;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.io.File;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.io.IOException;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.nio.file.Files;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.time.LocalDateTime;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.time.Month;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.time.ZoneId;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.time.format.DateTimeFormatter;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.Arrays;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.AfterEach;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assertions;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.helper.HelpScreenException;"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import reposense.model.CliArguments;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import reposense.model.FileType;"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import reposense.model.FileTypeTest;"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import reposense.model.RepoConfiguration;"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import reposense.model.RunConfigurationDecider;"},{"lineNumber":29,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.ParseException;"},{"lineNumber":30,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.SinceDateArgumentType;"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import reposense.util.FileUtil;"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import reposense.util.InputBuilder;"},{"lineNumber":33,"author":{"gitId":"-"},"content":"import reposense.util.TestUtil;"},{"lineNumber":34,"author":{"gitId":"-"},"content":"import reposense.util.TimeUtil;"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":"public class ArgsParserTest {"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":" private static final Path PROJECT_DIRECTORY \u003d Paths.get(System.getProperty(\"user.dir\"));"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private static final Path CONFIG_DIRECTORY \u003d Paths.get(System.getProperty(\"user.dir\")"},{"lineNumber":40,"author":{"gitId":"-"},"content":" + File.separator + \"config\" + File.separator);"},{"lineNumber":41,"author":{"gitId":"-"},"content":" private static final Path CONFIG_FOLDER_ABSOLUTE \u003d loadResource(ArgsParserTest.class, \"cli_location_test\");"},{"lineNumber":42,"author":{"gitId":"-"},"content":" private static final Path OUTPUT_DIRECTORY_ABSOLUTE \u003d loadResource(ArgsParserTest.class, \"output\");"},{"lineNumber":43,"author":{"gitId":"-"},"content":" private static final Path CONFIG_FOLDER_RELATIVE \u003d PROJECT_DIRECTORY.relativize(CONFIG_FOLDER_ABSOLUTE);"},{"lineNumber":44,"author":{"gitId":"-"},"content":" private static final Path OUTPUT_DIRECTORY_RELATIVE \u003d PROJECT_DIRECTORY.relativize(OUTPUT_DIRECTORY_ABSOLUTE);"},{"lineNumber":45,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_CSV_FILE \u003d"},{"lineNumber":46,"author":{"gitId":"-"},"content":" CONFIG_FOLDER_ABSOLUTE.resolve(RepoConfigCsvParser.REPO_CONFIG_FILENAME);"},{"lineNumber":47,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_CSV_FILE \u003d"},{"lineNumber":48,"author":{"gitId":"-"},"content":" CONFIG_FOLDER_ABSOLUTE.resolve(AuthorConfigCsvParser.AUTHOR_CONFIG_FILENAME);"},{"lineNumber":49,"author":{"gitId":"-"},"content":" private static final String NONEXISTENT_DIRECTORY \u003d \"some_non_existent_dir/\";"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"-"},"content":" private static final InputBuilder DEFAULT_INPUT_BUILDER \u003d new InputBuilder();"},{"lineNumber":52,"author":{"gitId":"-"},"content":""},{"lineNumber":53,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_REPOSENSE \u003d \"https://github.com/reposense/RepoSense.git\";"},{"lineNumber":54,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_BETA \u003d \"https://github.com/reposense/testrepo-Beta.git\";"},{"lineNumber":55,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_CHARLIE \u003d \"https://github.com/reposense/testrepo-Charlie.git\";"},{"lineNumber":56,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_DELTA \u003d \"https://github.com/reposense/testrepo-Delta.git\";"},{"lineNumber":57,"author":{"gitId":"-"},"content":""},{"lineNumber":58,"author":{"gitId":"-"},"content":" private static final String DEFAULT_TIME_ZONE_STRING \u003d \"Asia/Singapore\";"},{"lineNumber":59,"author":{"gitId":"-"},"content":" private static final ZoneId DEFAULT_TIME_ZONE_ID \u003d TestUtil.getZoneId(DEFAULT_TIME_ZONE_STRING);"},{"lineNumber":60,"author":{"gitId":"-"},"content":""},{"lineNumber":61,"author":{"gitId":"-"},"content":" @BeforeEach"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public void before() {"},{"lineNumber":63,"author":{"gitId":"-"},"content":" DEFAULT_INPUT_BUILDER.reset().addConfig(CONFIG_FOLDER_ABSOLUTE);"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }"},{"lineNumber":65,"author":{"gitId":"-"},"content":""},{"lineNumber":66,"author":{"gitId":"-"},"content":" @AfterEach"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public void after() {"},{"lineNumber":68,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":69,"author":{"gitId":"-"},"content":" FileUtil.deleteDirectory(PROJECT_DIRECTORY.resolve(NONEXISTENT_DIRECTORY).toString());"},{"lineNumber":70,"author":{"gitId":"-"},"content":" } catch (IOException e) {"},{"lineNumber":71,"author":{"gitId":"-"},"content":" System.err.println(e.getMessage());"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }"},{"lineNumber":74,"author":{"gitId":"-"},"content":""},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public void parse_d1CorrectTimeZone_success() throws Exception {"},{"lineNumber":77,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(CONFIG_FOLDER_ABSOLUTE)"},{"lineNumber":78,"author":{"gitId":"-"},"content":" .addSinceDate(SinceDateArgumentType.FIRST_COMMIT_DATE_SHORTHAND)"},{"lineNumber":79,"author":{"gitId":"-"},"content":" .addUntilDate(\"30/11/2017\")"},{"lineNumber":80,"author":{"gitId":"-"},"content":" .addTimezone(DEFAULT_TIME_ZONE_STRING)"},{"lineNumber":81,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":82,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":83,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":84,"author":{"gitId":"-"},"content":" REPO_CONFIG_CSV_FILE, cliArguments.getRepoConfigFilePath()));"},{"lineNumber":85,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":86,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_CSV_FILE, cliArguments.getAuthorConfigFilePath()));"},{"lineNumber":87,"author":{"gitId":"-"},"content":""},{"lineNumber":88,"author":{"gitId":"-"},"content":" LocalDateTime expectedSinceDate \u003d TimeUtil.getArbitraryFirstCommitDateConverted(DEFAULT_TIME_ZONE_ID);"},{"lineNumber":89,"author":{"gitId":"-"},"content":" LocalDateTime expectedUntilDate \u003d TestUtil.getUntilDate(2017, Month.NOVEMBER.getValue(), 30);"},{"lineNumber":90,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedSinceDate, cliArguments.getSinceDate());"},{"lineNumber":91,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedUntilDate, cliArguments.getUntilDate());"},{"lineNumber":92,"author":{"gitId":"-"},"content":""},{"lineNumber":93,"author":{"gitId":"-"},"content":" Assertions.assertEquals(DEFAULT_TIME_ZONE_ID, cliArguments.getZoneId());"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }"},{"lineNumber":95,"author":{"gitId":"-"},"content":""},{"lineNumber":96,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":97,"author":{"gitId":"-"},"content":" public void parse_allCorrectInputs_success() throws Exception {"},{"lineNumber":98,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(CONFIG_FOLDER_ABSOLUTE)"},{"lineNumber":99,"author":{"gitId":"-"},"content":" .addOutput(OUTPUT_DIRECTORY_ABSOLUTE)"},{"lineNumber":100,"author":{"gitId":"-"},"content":" .addSinceDate(\"01/07/2017\")"},{"lineNumber":101,"author":{"gitId":"-"},"content":" .addUntilDate(\"30/11/2017\")"},{"lineNumber":102,"author":{"gitId":"-"},"content":" .addFormats(\"java adoc html css js\")"},{"lineNumber":103,"author":{"gitId":"-"},"content":" .addIgnoreStandaloneConfig()"},{"lineNumber":104,"author":{"gitId":"-"},"content":" .addIgnoreFilesizeLimit()"},{"lineNumber":105,"author":{"gitId":"-"},"content":" .addView()"},{"lineNumber":106,"author":{"gitId":"-"},"content":" .addTimezone(DEFAULT_TIME_ZONE_STRING)"},{"lineNumber":107,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":108,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":109,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":110,"author":{"gitId":"-"},"content":" REPO_CONFIG_CSV_FILE, cliArguments.getRepoConfigFilePath()));"},{"lineNumber":111,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":112,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_CSV_FILE, cliArguments.getAuthorConfigFilePath()));"},{"lineNumber":113,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":114,"author":{"gitId":"-"},"content":" OUTPUT_DIRECTORY_ABSOLUTE.resolve(ArgsParser.DEFAULT_REPORT_NAME), cliArguments.getOutputFilePath()));"},{"lineNumber":115,"author":{"gitId":"-"},"content":""},{"lineNumber":116,"author":{"gitId":"-"},"content":" LocalDateTime expectedSinceDate \u003d TestUtil.getSinceDate(2017, Month.JULY.getValue(), 1);"},{"lineNumber":117,"author":{"gitId":"-"},"content":" LocalDateTime expectedUntilDate \u003d TestUtil.getUntilDate(2017, Month.NOVEMBER.getValue(), 30);"},{"lineNumber":118,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedSinceDate, cliArguments.getSinceDate());"},{"lineNumber":119,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedUntilDate, cliArguments.getUntilDate());"},{"lineNumber":120,"author":{"gitId":"-"},"content":""},{"lineNumber":121,"author":{"gitId":"-"},"content":" List\u003cFileType\u003e expectedFormats \u003d FileType.convertFormatStringsToFileTypes("},{"lineNumber":122,"author":{"gitId":"-"},"content":" Arrays.asList(\"java\", \"adoc\", \"html\", \"css\", \"js\"));"},{"lineNumber":123,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedFormats, cliArguments.getFormats());"},{"lineNumber":124,"author":{"gitId":"-"},"content":""},{"lineNumber":125,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.isAutomaticallyLaunching());"},{"lineNumber":126,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.isFileSizeLimitIgnored());"},{"lineNumber":127,"author":{"gitId":"-"},"content":""},{"lineNumber":128,"author":{"gitId":"-"},"content":" Assertions.assertEquals(DEFAULT_TIME_ZONE_ID, cliArguments.getZoneId());"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }"},{"lineNumber":130,"author":{"gitId":"-"},"content":""},{"lineNumber":131,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":132,"author":{"gitId":"-"},"content":" public void parse_help_throwsHelpScreenException() {"},{"lineNumber":133,"author":{"gitId":"-"},"content":" String input \u003d \"--help\";"},{"lineNumber":134,"author":{"gitId":"-"},"content":" Assertions.assertThrows(HelpScreenException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":135,"author":{"gitId":"-"},"content":" }"},{"lineNumber":136,"author":{"gitId":"-"},"content":""},{"lineNumber":137,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":138,"author":{"gitId":"-"},"content":" public void parse_allCorrectInputsAlias_success() throws Exception {"},{"lineNumber":139,"author":{"gitId":"-"},"content":" String input \u003d String.format("},{"lineNumber":140,"author":{"gitId":"-"},"content":" \"-c \\\"%s\\\" -o \\\"%s\\\" -s 01/07/2017 -u 30/11/2017 -f java adoc html css js -i -I -v -t %s\","},{"lineNumber":141,"author":{"gitId":"-"},"content":" CONFIG_FOLDER_ABSOLUTE, OUTPUT_DIRECTORY_ABSOLUTE, DEFAULT_TIME_ZONE_STRING);"},{"lineNumber":142,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":143,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":144,"author":{"gitId":"-"},"content":" REPO_CONFIG_CSV_FILE, cliArguments.getRepoConfigFilePath()));"},{"lineNumber":145,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":146,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_CSV_FILE, cliArguments.getAuthorConfigFilePath()));"},{"lineNumber":147,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":148,"author":{"gitId":"-"},"content":" OUTPUT_DIRECTORY_ABSOLUTE.resolve(ArgsParser.DEFAULT_REPORT_NAME), cliArguments.getOutputFilePath()));"},{"lineNumber":149,"author":{"gitId":"-"},"content":""},{"lineNumber":150,"author":{"gitId":"-"},"content":" LocalDateTime expectedSinceDate \u003d TestUtil.getSinceDate(2017, Month.JULY.getValue(), 1);"},{"lineNumber":151,"author":{"gitId":"-"},"content":" LocalDateTime expectedUntilDate \u003d TestUtil.getUntilDate(2017, Month.NOVEMBER.getValue(), 30);"},{"lineNumber":152,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedSinceDate, cliArguments.getSinceDate());"},{"lineNumber":153,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedUntilDate, cliArguments.getUntilDate());"},{"lineNumber":154,"author":{"gitId":"-"},"content":""},{"lineNumber":155,"author":{"gitId":"-"},"content":" List\u003cFileType\u003e expectedFormats \u003d FileType.convertFormatStringsToFileTypes("},{"lineNumber":156,"author":{"gitId":"-"},"content":" Arrays.asList(\"java\", \"adoc\", \"html\", \"css\", \"js\"));"},{"lineNumber":157,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedFormats, cliArguments.getFormats());"},{"lineNumber":158,"author":{"gitId":"-"},"content":""},{"lineNumber":159,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.isAutomaticallyLaunching());"},{"lineNumber":160,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.isFileSizeLimitIgnored());"},{"lineNumber":161,"author":{"gitId":"-"},"content":""},{"lineNumber":162,"author":{"gitId":"-"},"content":" Assertions.assertEquals(DEFAULT_TIME_ZONE_ID, cliArguments.getZoneId());"},{"lineNumber":163,"author":{"gitId":"-"},"content":" }"},{"lineNumber":164,"author":{"gitId":"-"},"content":""},{"lineNumber":165,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":166,"author":{"gitId":"-"},"content":" public void parse_withExtraWhitespaces_success() throws Exception {"},{"lineNumber":167,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(CONFIG_FOLDER_ABSOLUTE).addWhiteSpace(5)"},{"lineNumber":168,"author":{"gitId":"-"},"content":" .addOutput(OUTPUT_DIRECTORY_ABSOLUTE).addWhiteSpace(4)"},{"lineNumber":169,"author":{"gitId":"-"},"content":" .addSinceDate(\"01/07/2017\").addWhiteSpace(3)"},{"lineNumber":170,"author":{"gitId":"-"},"content":" .addUntilDate(\"30/11/2017\").addWhiteSpace(6)"},{"lineNumber":171,"author":{"gitId":"-"},"content":" .addFormats(\"java adoc html css js \")"},{"lineNumber":172,"author":{"gitId":"-"},"content":" .addIgnoreStandaloneConfig().addWhiteSpace(1)"},{"lineNumber":173,"author":{"gitId":"-"},"content":" .addIgnoreFilesizeLimit().addWhiteSpace(2)"},{"lineNumber":174,"author":{"gitId":"-"},"content":" .addView().addWhiteSpace(4)"},{"lineNumber":175,"author":{"gitId":"-"},"content":" .addTimezone(DEFAULT_TIME_ZONE_STRING).addWhiteSpace(5)"},{"lineNumber":176,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":177,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":178,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":179,"author":{"gitId":"-"},"content":" REPO_CONFIG_CSV_FILE, cliArguments.getRepoConfigFilePath()));"},{"lineNumber":180,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":181,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_CSV_FILE, cliArguments.getAuthorConfigFilePath()));"},{"lineNumber":182,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":183,"author":{"gitId":"-"},"content":" OUTPUT_DIRECTORY_ABSOLUTE.resolve(ArgsParser.DEFAULT_REPORT_NAME), cliArguments.getOutputFilePath()));"},{"lineNumber":184,"author":{"gitId":"-"},"content":""},{"lineNumber":185,"author":{"gitId":"-"},"content":" LocalDateTime expectedSinceDate \u003d TestUtil.getSinceDate(2017, Month.JULY.getValue(), 1);"},{"lineNumber":186,"author":{"gitId":"-"},"content":" LocalDateTime expectedUntilDate \u003d TestUtil.getUntilDate(2017, Month.NOVEMBER.getValue(), 30);"},{"lineNumber":187,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedSinceDate, cliArguments.getSinceDate());"},{"lineNumber":188,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedUntilDate, cliArguments.getUntilDate());"},{"lineNumber":189,"author":{"gitId":"-"},"content":""},{"lineNumber":190,"author":{"gitId":"-"},"content":" List\u003cFileType\u003e expectedFormats \u003d FileType.convertFormatStringsToFileTypes(Arrays.asList("},{"lineNumber":191,"author":{"gitId":"-"},"content":" \"java\", \"adoc\", \"html\", \"css\", \"js\"));"},{"lineNumber":192,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedFormats, cliArguments.getFormats());"},{"lineNumber":193,"author":{"gitId":"-"},"content":""},{"lineNumber":194,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.isAutomaticallyLaunching());"},{"lineNumber":195,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.isFileSizeLimitIgnored());"},{"lineNumber":196,"author":{"gitId":"-"},"content":""},{"lineNumber":197,"author":{"gitId":"-"},"content":" Assertions.assertEquals(DEFAULT_TIME_ZONE_ID, cliArguments.getZoneId());"},{"lineNumber":198,"author":{"gitId":"-"},"content":" }"},{"lineNumber":199,"author":{"gitId":"-"},"content":""},{"lineNumber":200,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":201,"author":{"gitId":"-"},"content":" public void parse_configFolderOnly_success() throws Exception {"},{"lineNumber":202,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(CONFIG_FOLDER_ABSOLUTE).build();"},{"lineNumber":203,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":204,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":205,"author":{"gitId":"-"},"content":" REPO_CONFIG_CSV_FILE, cliArguments.getRepoConfigFilePath()));"},{"lineNumber":206,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":207,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_CSV_FILE, cliArguments.getAuthorConfigFilePath()));"},{"lineNumber":208,"author":{"gitId":"-"},"content":" // Optional arguments have default values"},{"lineNumber":209,"author":{"gitId":"-"},"content":" assertDateDiffOneMonth(cliArguments.getSinceDate(), cliArguments.getUntilDate());"},{"lineNumber":210,"author":{"gitId":"-"},"content":" assertDateDiffEndOfDay(cliArguments.getUntilDate());"},{"lineNumber":211,"author":{"gitId":"-"},"content":" Assertions.assertEquals(ArgsParser.DEFAULT_REPORT_NAME,"},{"lineNumber":212,"author":{"gitId":"-"},"content":" cliArguments.getOutputFilePath().getFileName().toString());"},{"lineNumber":213,"author":{"gitId":"-"},"content":" Assertions.assertEquals(FileTypeTest.NO_SPECIFIED_FORMATS, cliArguments.getFormats());"},{"lineNumber":214,"author":{"gitId":"-"},"content":" Assertions.assertFalse(cliArguments.isAutomaticallyLaunching());"},{"lineNumber":215,"author":{"gitId":"-"},"content":""},{"lineNumber":216,"author":{"gitId":"-"},"content":" input \u003d new InputBuilder().addConfig(CONFIG_FOLDER_RELATIVE).build();"},{"lineNumber":217,"author":{"gitId":"-"},"content":" cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":218,"author":{"gitId":"-"},"content":""},{"lineNumber":219,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":220,"author":{"gitId":"-"},"content":" REPO_CONFIG_CSV_FILE, cliArguments.getRepoConfigFilePath()));"},{"lineNumber":221,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":222,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_CSV_FILE, cliArguments.getAuthorConfigFilePath()));"},{"lineNumber":223,"author":{"gitId":"-"},"content":" // Optional arguments have default values"},{"lineNumber":224,"author":{"gitId":"-"},"content":" assertDateDiffOneMonth(cliArguments.getSinceDate(), cliArguments.getUntilDate());"},{"lineNumber":225,"author":{"gitId":"-"},"content":" assertDateDiffEndOfDay(cliArguments.getUntilDate());"},{"lineNumber":226,"author":{"gitId":"-"},"content":" Assertions.assertEquals(ArgsParser.DEFAULT_REPORT_NAME,"},{"lineNumber":227,"author":{"gitId":"-"},"content":" cliArguments.getOutputFilePath().getFileName().toString());"},{"lineNumber":228,"author":{"gitId":"-"},"content":" Assertions.assertEquals(FileTypeTest.NO_SPECIFIED_FORMATS, cliArguments.getFormats());"},{"lineNumber":229,"author":{"gitId":"-"},"content":" Assertions.assertFalse(cliArguments.isAutomaticallyLaunching());"},{"lineNumber":230,"author":{"gitId":"-"},"content":" Assertions.assertEquals(ZoneId.systemDefault(), cliArguments.getZoneId());"},{"lineNumber":231,"author":{"gitId":"-"},"content":" }"},{"lineNumber":232,"author":{"gitId":"-"},"content":""},{"lineNumber":233,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":234,"author":{"gitId":"-"},"content":" public void parse_viewOnly_success() throws Exception {"},{"lineNumber":235,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addView(OUTPUT_DIRECTORY_ABSOLUTE).build();"},{"lineNumber":236,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":237,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":238,"author":{"gitId":"-"},"content":" OUTPUT_DIRECTORY_ABSOLUTE, cliArguments.getReportDirectoryPath()));"},{"lineNumber":239,"author":{"gitId":"-"},"content":" }"},{"lineNumber":240,"author":{"gitId":"-"},"content":""},{"lineNumber":241,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":242,"author":{"gitId":"-"},"content":" public void parse_withIgnore_success() throws Exception {"},{"lineNumber":243,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addRepos(TEST_REPO_REPOSENSE, TEST_REPO_DELTA)"},{"lineNumber":244,"author":{"gitId":"-"},"content":" .addIgnoreStandaloneConfig()"},{"lineNumber":245,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":246,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":247,"author":{"gitId":"-"},"content":""},{"lineNumber":248,"author":{"gitId":"-"},"content":" String inputWithAlias \u003d new InputBuilder().addRepos(TEST_REPO_REPOSENSE, TEST_REPO_DELTA)"},{"lineNumber":249,"author":{"gitId":"-"},"content":" .add(\"-i\")"},{"lineNumber":250,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":251,"author":{"gitId":"-"},"content":" CliArguments cliArgumentsWithAlias \u003d ArgsParser.parse(translateCommandline(inputWithAlias));"},{"lineNumber":252,"author":{"gitId":"-"},"content":""},{"lineNumber":253,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.isStandaloneConfigIgnored());"},{"lineNumber":254,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArgumentsWithAlias.isStandaloneConfigIgnored());"},{"lineNumber":255,"author":{"gitId":"-"},"content":""},{"lineNumber":256,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.equals(cliArgumentsWithAlias));"},{"lineNumber":257,"author":{"gitId":"-"},"content":""},{"lineNumber":258,"author":{"gitId":"-"},"content":" Assertions.assertEquals(cliArguments, cliArgumentsWithAlias);"},{"lineNumber":259,"author":{"gitId":"-"},"content":" }"},{"lineNumber":260,"author":{"gitId":"-"},"content":""},{"lineNumber":261,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":262,"author":{"gitId":"-"},"content":" public void parse_withoutIgnore_success() throws Exception {"},{"lineNumber":263,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addRepos(TEST_REPO_REPOSENSE, TEST_REPO_DELTA).build();"},{"lineNumber":264,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":265,"author":{"gitId":"-"},"content":""},{"lineNumber":266,"author":{"gitId":"-"},"content":" Assertions.assertFalse(cliArguments.isStandaloneConfigIgnored());"},{"lineNumber":267,"author":{"gitId":"-"},"content":" }"},{"lineNumber":268,"author":{"gitId":"-"},"content":""},{"lineNumber":269,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":270,"author":{"gitId":"-"},"content":" public void parse_viewOnlyWithoutArgs_returnsConfigCliArguments() throws Exception {"},{"lineNumber":271,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addView().build();"},{"lineNumber":272,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":273,"author":{"gitId":"-"},"content":""},{"lineNumber":274,"author":{"gitId":"-"},"content":" Assertions.assertEquals(CONFIG_DIRECTORY.toString(), ("},{"lineNumber":275,"author":{"gitId":"-"},"content":" cliArguments).getConfigFolderPath().toString());"},{"lineNumber":276,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.isAutomaticallyLaunching());"},{"lineNumber":277,"author":{"gitId":"-"},"content":" }"},{"lineNumber":278,"author":{"gitId":"-"},"content":""},{"lineNumber":279,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":280,"author":{"gitId":"-"},"content":" public void parse_configFolderAndOutputDirectory_success() throws Exception {"},{"lineNumber":281,"author":{"gitId":"-"},"content":" Path expectedRelativeOutputDirectoryPath \u003d OUTPUT_DIRECTORY_RELATIVE.resolve(ArgsParser.DEFAULT_REPORT_NAME);"},{"lineNumber":282,"author":{"gitId":"-"},"content":" Path expectedAbsoluteOutputDirectoryPath \u003d OUTPUT_DIRECTORY_ABSOLUTE.resolve(ArgsParser.DEFAULT_REPORT_NAME);"},{"lineNumber":283,"author":{"gitId":"-"},"content":""},{"lineNumber":284,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(CONFIG_FOLDER_ABSOLUTE)"},{"lineNumber":285,"author":{"gitId":"-"},"content":" .addOutput(OUTPUT_DIRECTORY_RELATIVE)"},{"lineNumber":286,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":287,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":288,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":289,"author":{"gitId":"-"},"content":" REPO_CONFIG_CSV_FILE, cliArguments.getRepoConfigFilePath()));"},{"lineNumber":290,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":291,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_CSV_FILE, cliArguments.getAuthorConfigFilePath()));"},{"lineNumber":292,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile(expectedRelativeOutputDirectoryPath, cliArguments.getOutputFilePath()));"},{"lineNumber":293,"author":{"gitId":"-"},"content":""},{"lineNumber":294,"author":{"gitId":"-"},"content":" input \u003d new InputBuilder().addConfig(CONFIG_FOLDER_RELATIVE)"},{"lineNumber":295,"author":{"gitId":"-"},"content":" .addOutput(OUTPUT_DIRECTORY_ABSOLUTE)"},{"lineNumber":296,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":297,"author":{"gitId":"-"},"content":" cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":298,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":299,"author":{"gitId":"-"},"content":" REPO_CONFIG_CSV_FILE, cliArguments.getRepoConfigFilePath()));"},{"lineNumber":300,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":301,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_CSV_FILE, cliArguments.getAuthorConfigFilePath()));"},{"lineNumber":302,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile(expectedAbsoluteOutputDirectoryPath, cliArguments.getOutputFilePath()));"},{"lineNumber":303,"author":{"gitId":"-"},"content":" }"},{"lineNumber":304,"author":{"gitId":"-"},"content":""},{"lineNumber":305,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":306,"author":{"gitId":"-"},"content":" public void parse_configFolderAndViewWithouthArgs_returnsConfigCliArguments() throws Exception {"},{"lineNumber":307,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(CONFIG_FOLDER_ABSOLUTE)"},{"lineNumber":308,"author":{"gitId":"-"},"content":" .addView()"},{"lineNumber":309,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":310,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":311,"author":{"gitId":"-"},"content":""},{"lineNumber":312,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":313,"author":{"gitId":"-"},"content":" REPO_CONFIG_CSV_FILE, cliArguments.getRepoConfigFilePath()));"},{"lineNumber":314,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":315,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_CSV_FILE, cliArguments.getAuthorConfigFilePath()));"},{"lineNumber":316,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.isAutomaticallyLaunching());"},{"lineNumber":317,"author":{"gitId":"-"},"content":""},{"lineNumber":318,"author":{"gitId":"-"},"content":" input \u003d new InputBuilder().addConfig(CONFIG_FOLDER_RELATIVE)"},{"lineNumber":319,"author":{"gitId":"-"},"content":" .addView()"},{"lineNumber":320,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":321,"author":{"gitId":"-"},"content":" cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":322,"author":{"gitId":"-"},"content":""},{"lineNumber":323,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":324,"author":{"gitId":"-"},"content":" REPO_CONFIG_CSV_FILE, cliArguments.getRepoConfigFilePath()));"},{"lineNumber":325,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":326,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_CSV_FILE, cliArguments.getAuthorConfigFilePath()));"},{"lineNumber":327,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.isAutomaticallyLaunching());"},{"lineNumber":328,"author":{"gitId":"-"},"content":" }"},{"lineNumber":329,"author":{"gitId":"-"},"content":""},{"lineNumber":330,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":331,"author":{"gitId":"-"},"content":" public void parse_configFolderAndViewWithArgs_returnsConfigCliArguments() throws Exception {"},{"lineNumber":332,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(CONFIG_FOLDER_ABSOLUTE)"},{"lineNumber":333,"author":{"gitId":"-"},"content":" .addView(OUTPUT_DIRECTORY_ABSOLUTE)"},{"lineNumber":334,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":335,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":336,"author":{"gitId":"-"},"content":""},{"lineNumber":337,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":338,"author":{"gitId":"-"},"content":" REPO_CONFIG_CSV_FILE, cliArguments.getRepoConfigFilePath()));"},{"lineNumber":339,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":340,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_CSV_FILE, cliArguments.getAuthorConfigFilePath()));"},{"lineNumber":341,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.isAutomaticallyLaunching());"},{"lineNumber":342,"author":{"gitId":"-"},"content":" }"},{"lineNumber":343,"author":{"gitId":"-"},"content":""},{"lineNumber":344,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":345,"author":{"gitId":"-"},"content":" public void sinceDate_correctFormat_success() throws Exception {"},{"lineNumber":346,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER"},{"lineNumber":347,"author":{"gitId":"-"},"content":" .addSinceDate(\"01/07/2017\")"},{"lineNumber":348,"author":{"gitId":"-"},"content":" .addTimezone(DEFAULT_TIME_ZONE_STRING)"},{"lineNumber":349,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":350,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":351,"author":{"gitId":"-"},"content":""},{"lineNumber":352,"author":{"gitId":"-"},"content":" LocalDateTime expectedSinceDate \u003d TestUtil.getSinceDate(2017, Month.JULY.getValue(), 1);"},{"lineNumber":353,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedSinceDate, cliArguments.getSinceDate());"},{"lineNumber":354,"author":{"gitId":"-"},"content":" }"},{"lineNumber":355,"author":{"gitId":"-"},"content":""},{"lineNumber":356,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":357,"author":{"gitId":"-"},"content":" public void untilDate_correctFormat_success() throws Exception {"},{"lineNumber":358,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER"},{"lineNumber":359,"author":{"gitId":"-"},"content":" .addUntilDate(\"30/11/2017\")"},{"lineNumber":360,"author":{"gitId":"-"},"content":" .addTimezone(DEFAULT_TIME_ZONE_STRING)"},{"lineNumber":361,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":362,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":363,"author":{"gitId":"-"},"content":""},{"lineNumber":364,"author":{"gitId":"-"},"content":" LocalDateTime expectedUntilDate \u003d TestUtil.getUntilDate(2017, Month.NOVEMBER.getValue(), 30);"},{"lineNumber":365,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedUntilDate, cliArguments.getUntilDate());"},{"lineNumber":366,"author":{"gitId":"-"},"content":" }"},{"lineNumber":367,"author":{"gitId":"-"},"content":""},{"lineNumber":368,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":369,"author":{"gitId":"-"},"content":" public void sinceDate_withExtraDate_success() throws Exception {"},{"lineNumber":370,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER"},{"lineNumber":371,"author":{"gitId":"-"},"content":" .addSinceDate(\"\\\"01/07/2017 01/07/2018\\\"\")"},{"lineNumber":372,"author":{"gitId":"-"},"content":" .addTimezone(DEFAULT_TIME_ZONE_STRING)"},{"lineNumber":373,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":374,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":375,"author":{"gitId":"-"},"content":""},{"lineNumber":376,"author":{"gitId":"-"},"content":" LocalDateTime expectedSinceDate \u003d TestUtil.getSinceDate(2017, Month.JULY.getValue(), 1);"},{"lineNumber":377,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedSinceDate, cliArguments.getSinceDate());"},{"lineNumber":378,"author":{"gitId":"-"},"content":" }"},{"lineNumber":379,"author":{"gitId":"-"},"content":""},{"lineNumber":380,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":381,"author":{"gitId":"-"},"content":" public void untilDate_withExtraTime_success() throws Exception {"},{"lineNumber":382,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER"},{"lineNumber":383,"author":{"gitId":"-"},"content":" .addUntilDate(\"\\\"30/11/2017 10:10:10\\\"\")"},{"lineNumber":384,"author":{"gitId":"-"},"content":" .addTimezone(DEFAULT_TIME_ZONE_STRING)"},{"lineNumber":385,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":386,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":387,"author":{"gitId":"-"},"content":""},{"lineNumber":388,"author":{"gitId":"-"},"content":" LocalDateTime expectedUntilDate \u003d TestUtil.getUntilDate(2017, Month.NOVEMBER.getValue(), 30);"},{"lineNumber":389,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedUntilDate, cliArguments.getUntilDate());"},{"lineNumber":390,"author":{"gitId":"-"},"content":" }"},{"lineNumber":391,"author":{"gitId":"-"},"content":""},{"lineNumber":392,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":393,"author":{"gitId":"-"},"content":" public void period_inDaysWithSinceDate_success() throws Exception {"},{"lineNumber":394,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER"},{"lineNumber":395,"author":{"gitId":"-"},"content":" .addSinceDate(\"01/07/2017\")"},{"lineNumber":396,"author":{"gitId":"-"},"content":" .addPeriod(\"2d\")"},{"lineNumber":397,"author":{"gitId":"-"},"content":" .addTimezone(DEFAULT_TIME_ZONE_STRING)"},{"lineNumber":398,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":399,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":400,"author":{"gitId":"-"},"content":""},{"lineNumber":401,"author":{"gitId":"-"},"content":" LocalDateTime expectedUntilDate \u003d TestUtil.getUntilDate(2017, Month.JULY.getValue(), 3);"},{"lineNumber":402,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedUntilDate, cliArguments.getUntilDate());"},{"lineNumber":403,"author":{"gitId":"-"},"content":" }"},{"lineNumber":404,"author":{"gitId":"-"},"content":""},{"lineNumber":405,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":406,"author":{"gitId":"-"},"content":" public void period_inWeeksWithUntilDate_success() throws Exception {"},{"lineNumber":407,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER"},{"lineNumber":408,"author":{"gitId":"-"},"content":" .addUntilDate(\"14/07/2017\")"},{"lineNumber":409,"author":{"gitId":"-"},"content":" .addTimezone(DEFAULT_TIME_ZONE_STRING)"},{"lineNumber":410,"author":{"gitId":"-"},"content":" .addPeriod(\"2w\")"},{"lineNumber":411,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":412,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":413,"author":{"gitId":"-"},"content":""},{"lineNumber":414,"author":{"gitId":"-"},"content":" LocalDateTime expectedSinceDate \u003d TestUtil.getSinceDate(2017, Month.JUNE.getValue(), 30);"},{"lineNumber":415,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedSinceDate, cliArguments.getSinceDate());"},{"lineNumber":416,"author":{"gitId":"-"},"content":" }"},{"lineNumber":417,"author":{"gitId":"-"},"content":""},{"lineNumber":418,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":419,"author":{"gitId":"-"},"content":" public void formats_inAlphanumeric_success() throws Exception {"},{"lineNumber":420,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addFormats(\"java js css 7z\").build();"},{"lineNumber":421,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":422,"author":{"gitId":"-"},"content":""},{"lineNumber":423,"author":{"gitId":"-"},"content":" List\u003cFileType\u003e expectedFormats \u003d FileType.convertFormatStringsToFileTypes("},{"lineNumber":424,"author":{"gitId":"-"},"content":" Arrays.asList(\"java\", \"js\", \"css\", \"7z\"));"},{"lineNumber":425,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedFormats, cliArguments.getFormats());"},{"lineNumber":426,"author":{"gitId":"-"},"content":" }"},{"lineNumber":427,"author":{"gitId":"-"},"content":""},{"lineNumber":428,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":429,"author":{"gitId":"-"},"content":" public void numCloningThreads_default_success() throws Exception {"},{"lineNumber":430,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.build();"},{"lineNumber":431,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":432,"author":{"gitId":"-"},"content":""},{"lineNumber":433,"author":{"gitId":"-"},"content":" int expectedNumThreads \u003d ArgsParser.DEFAULT_NUM_CLONING_THREADS;"},{"lineNumber":434,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedNumThreads, cliArguments.getNumCloningThreads());"},{"lineNumber":435,"author":{"gitId":"-"},"content":" }"},{"lineNumber":436,"author":{"gitId":"-"},"content":""},{"lineNumber":437,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":438,"author":{"gitId":"-"},"content":" public void numCloningThreads_isNumeric_success() throws Exception {"},{"lineNumber":439,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER"},{"lineNumber":440,"author":{"gitId":"-"},"content":" .addNumCloningThreads(2)"},{"lineNumber":441,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":442,"author":{"gitId":"-"},"content":" System.out.println(input);"},{"lineNumber":443,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":444,"author":{"gitId":"-"},"content":""},{"lineNumber":445,"author":{"gitId":"-"},"content":" int expectedNumThreads \u003d 2;"},{"lineNumber":446,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedNumThreads, cliArguments.getNumCloningThreads());"},{"lineNumber":447,"author":{"gitId":"-"},"content":" }"},{"lineNumber":448,"author":{"gitId":"-"},"content":""},{"lineNumber":449,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":450,"author":{"gitId":"-"},"content":" public void numAnalysisThreads_default_success() throws Exception {"},{"lineNumber":451,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.build();"},{"lineNumber":452,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":453,"author":{"gitId":"-"},"content":""},{"lineNumber":454,"author":{"gitId":"-"},"content":" int expectedNumThreads \u003d ArgsParser.DEFAULT_NUM_ANALYSIS_THREADS;"},{"lineNumber":455,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedNumThreads, cliArguments.getNumAnalysisThreads());"},{"lineNumber":456,"author":{"gitId":"-"},"content":" }"},{"lineNumber":457,"author":{"gitId":"-"},"content":""},{"lineNumber":458,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":459,"author":{"gitId":"-"},"content":" public void numAnalysisThreads_isNumeric_success() throws Exception {"},{"lineNumber":460,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER"},{"lineNumber":461,"author":{"gitId":"-"},"content":" .addNumAnalysisThreads(2)"},{"lineNumber":462,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":463,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":464,"author":{"gitId":"-"},"content":""},{"lineNumber":465,"author":{"gitId":"-"},"content":" int expectedNumThreads \u003d 2;"},{"lineNumber":466,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedNumThreads, cliArguments.getNumAnalysisThreads());"},{"lineNumber":467,"author":{"gitId":"-"},"content":" }"},{"lineNumber":468,"author":{"gitId":"-"},"content":""},{"lineNumber":469,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":470,"author":{"gitId":"-"},"content":" public void parse_validGitRepoLocations_repoConfigurationListCorrectSize() throws Exception {"},{"lineNumber":471,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addRepos(TEST_REPO_REPOSENSE, TEST_REPO_DELTA).build();"},{"lineNumber":472,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":473,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e repoConfigs \u003d RunConfigurationDecider"},{"lineNumber":474,"author":{"gitId":"-"},"content":" .getRunConfiguration(cliArguments)"},{"lineNumber":475,"author":{"gitId":"-"},"content":" .getRepoConfigurations();"},{"lineNumber":476,"author":{"gitId":"-"},"content":" Assertions.assertEquals(2, repoConfigs.size());"},{"lineNumber":477,"author":{"gitId":"-"},"content":" }"},{"lineNumber":478,"author":{"gitId":"-"},"content":""},{"lineNumber":479,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":480,"author":{"gitId":"-"},"content":" public void parse_repoLocationsAndView_returnsLocationCliArguments() throws Exception {"},{"lineNumber":481,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addRepos(TEST_REPO_REPOSENSE, TEST_REPO_DELTA)"},{"lineNumber":482,"author":{"gitId":"-"},"content":" .addView()"},{"lineNumber":483,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":484,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":485,"author":{"gitId":"-"},"content":""},{"lineNumber":486,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.isAutomaticallyLaunching());"},{"lineNumber":487,"author":{"gitId":"-"},"content":" List\u003cString\u003e expectedLocations \u003d Arrays.asList(TEST_REPO_REPOSENSE, TEST_REPO_DELTA);"},{"lineNumber":488,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedLocations, cliArguments.getLocations());"},{"lineNumber":489,"author":{"gitId":"-"},"content":" }"},{"lineNumber":490,"author":{"gitId":"-"},"content":""},{"lineNumber":491,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":492,"author":{"gitId":"-"},"content":" public void parse_repoLocationsOnly_success() throws Exception {"},{"lineNumber":493,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addRepos(TEST_REPO_REPOSENSE, TEST_REPO_DELTA).build();"},{"lineNumber":494,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":495,"author":{"gitId":"-"},"content":""},{"lineNumber":496,"author":{"gitId":"-"},"content":" Assertions.assertFalse(cliArguments.isAutomaticallyLaunching());"},{"lineNumber":497,"author":{"gitId":"-"},"content":" List\u003cString\u003e expectedLocations \u003d Arrays.asList(TEST_REPO_REPOSENSE, TEST_REPO_DELTA);"},{"lineNumber":498,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedLocations, cliArguments.getLocations());"},{"lineNumber":499,"author":{"gitId":"-"},"content":" }"},{"lineNumber":500,"author":{"gitId":"-"},"content":""},{"lineNumber":501,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":502,"author":{"gitId":"-"},"content":" public void parse_repoLocationsAndViewWithArgs_returnsLocationsCliArguments() throws Exception {"},{"lineNumber":503,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addRepos(TEST_REPO_REPOSENSE, TEST_REPO_DELTA)"},{"lineNumber":504,"author":{"gitId":"-"},"content":" .addView(OUTPUT_DIRECTORY_ABSOLUTE)"},{"lineNumber":505,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":506,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":507,"author":{"gitId":"-"},"content":""},{"lineNumber":508,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.isAutomaticallyLaunching());"},{"lineNumber":509,"author":{"gitId":"-"},"content":" List\u003cString\u003e expectedLocations \u003d Arrays.asList(TEST_REPO_REPOSENSE, TEST_REPO_DELTA);"},{"lineNumber":510,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedLocations, cliArguments.getLocations());"},{"lineNumber":511,"author":{"gitId":"-"},"content":" }"},{"lineNumber":512,"author":{"gitId":"-"},"content":""},{"lineNumber":513,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":514,"author":{"gitId":"-"},"content":" public void parse_configOrLocationsSimilar_success() throws Exception {"},{"lineNumber":515,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(CONFIG_FOLDER_ABSOLUTE).build();"},{"lineNumber":516,"author":{"gitId":"-"},"content":" CliArguments configCliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":517,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualRepoConfigs \u003d RunConfigurationDecider"},{"lineNumber":518,"author":{"gitId":"-"},"content":" .getRunConfiguration(configCliArguments)"},{"lineNumber":519,"author":{"gitId":"-"},"content":" .getRepoConfigurations();"},{"lineNumber":520,"author":{"gitId":"-"},"content":""},{"lineNumber":521,"author":{"gitId":"-"},"content":" input \u003d new InputBuilder().addRepos(TEST_REPO_BETA, TEST_REPO_CHARLIE, TEST_REPO_DELTA).build();"},{"lineNumber":522,"author":{"gitId":"-"},"content":" CliArguments locationCliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":523,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e expectedRepoConfigs \u003d RunConfigurationDecider"},{"lineNumber":524,"author":{"gitId":"-"},"content":" .getRunConfiguration(locationCliArguments)"},{"lineNumber":525,"author":{"gitId":"-"},"content":" .getRepoConfigurations();"},{"lineNumber":526,"author":{"gitId":"-"},"content":""},{"lineNumber":527,"author":{"gitId":"-"},"content":" Assertions.assertEquals(actualRepoConfigs, expectedRepoConfigs);"},{"lineNumber":528,"author":{"gitId":"-"},"content":" }"},{"lineNumber":529,"author":{"gitId":"-"},"content":""},{"lineNumber":530,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":531,"author":{"gitId":"-"},"content":" public void emptyArgs_defaultConfigFolderPath() throws Exception {"},{"lineNumber":532,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(new String[]{});"},{"lineNumber":533,"author":{"gitId":"-"},"content":""},{"lineNumber":534,"author":{"gitId":"-"},"content":" Assertions.assertEquals(CONFIG_DIRECTORY.toString(), cliArguments.getConfigFolderPath().toString());"},{"lineNumber":535,"author":{"gitId":"-"},"content":" }"},{"lineNumber":536,"author":{"gitId":"-"},"content":""},{"lineNumber":537,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":538,"author":{"gitId":"-"},"content":" public void parse_repoAliases_sameResult() throws Exception {"},{"lineNumber":539,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addRepos(TEST_REPO_BETA).build();"},{"lineNumber":540,"author":{"gitId":"-"},"content":" CliArguments repoAliasCliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":541,"author":{"gitId":"-"},"content":""},{"lineNumber":542,"author":{"gitId":"-"},"content":" input \u003d new InputBuilder().add(String.format(\"--repos %s\", TEST_REPO_BETA)).build();"},{"lineNumber":543,"author":{"gitId":"-"},"content":" CliArguments reposAliasCliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":544,"author":{"gitId":"-"},"content":""},{"lineNumber":545,"author":{"gitId":"-"},"content":" Assertions.assertEquals(repoAliasCliArguments, reposAliasCliArguments);"},{"lineNumber":546,"author":{"gitId":"-"},"content":" }"},{"lineNumber":547,"author":{"gitId":"-"},"content":""},{"lineNumber":548,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":549,"author":{"gitId":"-"},"content":" public void absoluteConfigFolder_withoutRequiredConfigFiles_throwsParseException() {"},{"lineNumber":550,"author":{"gitId":"-"},"content":" Path absDirectory \u003d PROJECT_DIRECTORY.getParent().toAbsolutePath();"},{"lineNumber":551,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(absDirectory).build();"},{"lineNumber":552,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":553,"author":{"gitId":"-"},"content":" }"},{"lineNumber":554,"author":{"gitId":"-"},"content":""},{"lineNumber":555,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":556,"author":{"gitId":"-"},"content":" public void relativeConfigFolder_withoutRequiredConfigFiles_throwsParseException() {"},{"lineNumber":557,"author":{"gitId":"-"},"content":" Path relDirectory \u003d PROJECT_DIRECTORY.getParent();"},{"lineNumber":558,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(relDirectory).build();"},{"lineNumber":559,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":560,"author":{"gitId":"-"},"content":" }"},{"lineNumber":561,"author":{"gitId":"-"},"content":""},{"lineNumber":562,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":563,"author":{"gitId":"-"},"content":" public void parse_notExistsConfigFolder_throwsParseException() {"},{"lineNumber":564,"author":{"gitId":"-"},"content":" Path absConfigFolder \u003d PROJECT_DIRECTORY.resolve(\"non_existing_random_folder\");"},{"lineNumber":565,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(absConfigFolder).build();"},{"lineNumber":566,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":567,"author":{"gitId":"-"},"content":" }"},{"lineNumber":568,"author":{"gitId":"-"},"content":""},{"lineNumber":569,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":570,"author":{"gitId":"-"},"content":" public void parse_configCsvFileAsConfigFolder_throwsParseException() {"},{"lineNumber":571,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(REPO_CONFIG_CSV_FILE).build();"},{"lineNumber":572,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":573,"author":{"gitId":"-"},"content":" }"},{"lineNumber":574,"author":{"gitId":"-"},"content":""},{"lineNumber":575,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":576,"author":{"gitId":"-"},"content":" public void parse_missingConfigValue_throwsParseException() {"},{"lineNumber":577,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(new File(\"\").toPath()).build();"},{"lineNumber":578,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":579,"author":{"gitId":"-"},"content":" }"},{"lineNumber":580,"author":{"gitId":"-"},"content":""},{"lineNumber":581,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":582,"author":{"gitId":"-"},"content":" public void outputPath_nonExistentDirectory_success() throws Exception {"},{"lineNumber":583,"author":{"gitId":"-"},"content":" Path nonExistentDirectory \u003d PROJECT_DIRECTORY.resolve(NONEXISTENT_DIRECTORY);"},{"lineNumber":584,"author":{"gitId":"-"},"content":" Path expectedRelativeOutputDirectoryPath \u003d nonExistentDirectory.resolve(ArgsParser.DEFAULT_REPORT_NAME);"},{"lineNumber":585,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addOutput(nonExistentDirectory).build();"},{"lineNumber":586,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":587,"author":{"gitId":"-"},"content":""},{"lineNumber":588,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":589,"author":{"gitId":"-"},"content":" expectedRelativeOutputDirectoryPath, cliArguments.getOutputFilePath()));"},{"lineNumber":590,"author":{"gitId":"-"},"content":" }"},{"lineNumber":591,"author":{"gitId":"-"},"content":""},{"lineNumber":592,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":593,"author":{"gitId":"-"},"content":" public void sinceDate_unsupportedFormats_throwsParseException() {"},{"lineNumber":594,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addSinceDate(\"01 July 17\").build();"},{"lineNumber":595,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":596,"author":{"gitId":"-"},"content":" }"},{"lineNumber":597,"author":{"gitId":"-"},"content":""},{"lineNumber":598,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":599,"author":{"gitId":"-"},"content":" public void untilDate_unsupportedFormats_throwsParseException() {"},{"lineNumber":600,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addUntilDate(\"11/31/2017\").build();"},{"lineNumber":601,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":602,"author":{"gitId":"-"},"content":" }"},{"lineNumber":603,"author":{"gitId":"-"},"content":""},{"lineNumber":604,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":605,"author":{"gitId":"-"},"content":" public void sinceDate_laterThanUntilDate_throwsParseException() {"},{"lineNumber":606,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addSinceDate(\"01/12/2017\")"},{"lineNumber":607,"author":{"gitId":"-"},"content":" .addUntilDate(\"30/11/2017\")"},{"lineNumber":608,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":609,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":610,"author":{"gitId":"-"},"content":" }"},{"lineNumber":611,"author":{"gitId":"-"},"content":""},{"lineNumber":612,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":613,"author":{"gitId":"-"},"content":" public void sinceDate_laterThanCurrentDate_throwsParseException() {"},{"lineNumber":614,"author":{"gitId":"-"},"content":" LocalDateTime tomorrowDateTime \u003d LocalDateTime.now()"},{"lineNumber":615,"author":{"gitId":"-"},"content":" .plusDays(1L);"},{"lineNumber":616,"author":{"gitId":"-"},"content":" DateTimeFormatter formatter \u003d DateTimeFormatter.ofPattern(\"dd/MM/yyyy\");"},{"lineNumber":617,"author":{"gitId":"-"},"content":" String tomorrow \u003d tomorrowDateTime.format(formatter);"},{"lineNumber":618,"author":{"gitId":"-"},"content":""},{"lineNumber":619,"author":{"gitId":"-"},"content":""},{"lineNumber":620,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addSinceDate(tomorrow)"},{"lineNumber":621,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":622,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":623,"author":{"gitId":"-"},"content":" }"},{"lineNumber":624,"author":{"gitId":"-"},"content":""},{"lineNumber":625,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":626,"author":{"gitId":"-"},"content":" public void sinceDate_beforeUntilDateAndLaterThanCurrentDate_throwsParseException() {"},{"lineNumber":627,"author":{"gitId":"-"},"content":" LocalDateTime tomorrowDateTime \u003d LocalDateTime.now()"},{"lineNumber":628,"author":{"gitId":"-"},"content":" .plusDays(1L);"},{"lineNumber":629,"author":{"gitId":"-"},"content":" LocalDateTime dayAfterDateTime \u003d LocalDateTime.now()"},{"lineNumber":630,"author":{"gitId":"-"},"content":" .plusDays(2L);"},{"lineNumber":631,"author":{"gitId":"-"},"content":""},{"lineNumber":632,"author":{"gitId":"-"},"content":" DateTimeFormatter formatter \u003d DateTimeFormatter.ofPattern(\"dd/MM/yyyy\");"},{"lineNumber":633,"author":{"gitId":"-"},"content":" String tomorrow \u003d tomorrowDateTime.format(formatter);"},{"lineNumber":634,"author":{"gitId":"-"},"content":" String dayAfter \u003d dayAfterDateTime.format(formatter);"},{"lineNumber":635,"author":{"gitId":"-"},"content":""},{"lineNumber":636,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addSinceDate(tomorrow)"},{"lineNumber":637,"author":{"gitId":"-"},"content":" .addUntilDate(dayAfter)"},{"lineNumber":638,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":639,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":640,"author":{"gitId":"-"},"content":" }"},{"lineNumber":641,"author":{"gitId":"-"},"content":""},{"lineNumber":642,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":643,"author":{"gitId":"-"},"content":" public void period_withBothSinceDateAndUntilDate_throwsParseException() {"},{"lineNumber":644,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addPeriod(\"18d\")"},{"lineNumber":645,"author":{"gitId":"-"},"content":" .addSinceDate(\"30/11/2017\")"},{"lineNumber":646,"author":{"gitId":"-"},"content":" .addUntilDate(\"01/12/2017\")"},{"lineNumber":647,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":648,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":649,"author":{"gitId":"-"},"content":" }"},{"lineNumber":650,"author":{"gitId":"-"},"content":""},{"lineNumber":651,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":652,"author":{"gitId":"-"},"content":" public void period_notNumeric_throwsParseExcpetion() {"},{"lineNumber":653,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addPeriod(\"abcd\").build();"},{"lineNumber":654,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":655,"author":{"gitId":"-"},"content":" }"},{"lineNumber":656,"author":{"gitId":"-"},"content":""},{"lineNumber":657,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":658,"author":{"gitId":"-"},"content":" public void period_isZero_throwsParseExcpetion() {"},{"lineNumber":659,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addPeriod(\"0w\").build();"},{"lineNumber":660,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":661,"author":{"gitId":"-"},"content":" }"},{"lineNumber":662,"author":{"gitId":"-"},"content":""},{"lineNumber":663,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":664,"author":{"gitId":"-"},"content":" public void formats_notInAlphanumeric_throwsParseException() {"},{"lineNumber":665,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addFormats(\".java\").build();"},{"lineNumber":666,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":667,"author":{"gitId":"-"},"content":" }"},{"lineNumber":668,"author":{"gitId":"-"},"content":""},{"lineNumber":669,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":670,"author":{"gitId":"-"},"content":" public void parse_mutuallyExclusiveArgumentsConfigAndReposTogether_throwsParseException() {"},{"lineNumber":671,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(CONFIG_FOLDER_ABSOLUTE)"},{"lineNumber":672,"author":{"gitId":"-"},"content":" .addRepos(TEST_REPO_REPOSENSE)"},{"lineNumber":673,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":674,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":675,"author":{"gitId":"-"},"content":" }"},{"lineNumber":676,"author":{"gitId":"-"},"content":""},{"lineNumber":677,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":678,"author":{"gitId":"-"},"content":" public void parse_extraArgumentForIgnore_throwsParseException() {"},{"lineNumber":679,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addIgnoreStandaloneConfig().add(\"true\").build();"},{"lineNumber":680,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":681,"author":{"gitId":"-"},"content":" }"},{"lineNumber":682,"author":{"gitId":"-"},"content":""},{"lineNumber":683,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":684,"author":{"gitId":"-"},"content":" public void parse_withTimezone_success() throws Exception {"},{"lineNumber":685,"author":{"gitId":"-"},"content":" String zoneId \u003d \"UTC+11\";"},{"lineNumber":686,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addTimezone(zoneId).build();"},{"lineNumber":687,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":688,"author":{"gitId":"-"},"content":""},{"lineNumber":689,"author":{"gitId":"-"},"content":" Assertions.assertEquals(ZoneId.of(zoneId), cliArguments.getZoneId());"},{"lineNumber":690,"author":{"gitId":"-"},"content":""},{"lineNumber":691,"author":{"gitId":"-"},"content":" zoneId \u003d \"UTC-1030\";"},{"lineNumber":692,"author":{"gitId":"-"},"content":" input \u003d DEFAULT_INPUT_BUILDER.addTimezone(zoneId).build();"},{"lineNumber":693,"author":{"gitId":"-"},"content":" cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":694,"author":{"gitId":"-"},"content":""},{"lineNumber":695,"author":{"gitId":"-"},"content":" Assertions.assertEquals(ZoneId.of(zoneId), cliArguments.getZoneId());"},{"lineNumber":696,"author":{"gitId":"-"},"content":""},{"lineNumber":697,"author":{"gitId":"-"},"content":" zoneId \u003d \"UTC\";"},{"lineNumber":698,"author":{"gitId":"-"},"content":" input \u003d DEFAULT_INPUT_BUILDER.addTimezone(zoneId).build();"},{"lineNumber":699,"author":{"gitId":"-"},"content":" cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":700,"author":{"gitId":"-"},"content":""},{"lineNumber":701,"author":{"gitId":"-"},"content":" Assertions.assertEquals(ZoneId.of(zoneId), cliArguments.getZoneId());"},{"lineNumber":702,"author":{"gitId":"-"},"content":" }"},{"lineNumber":703,"author":{"gitId":"-"},"content":""},{"lineNumber":704,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":705,"author":{"gitId":"-"},"content":" public void parse_incorrectTimezone_throwsParseException() {"},{"lineNumber":706,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addTimezone(\"UTC+\").build();"},{"lineNumber":707,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));;"},{"lineNumber":708,"author":{"gitId":"-"},"content":" }"},{"lineNumber":709,"author":{"gitId":"-"},"content":""},{"lineNumber":710,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":711,"author":{"gitId":"-"},"content":" public void parse_timezoneWithoutArgument_throwsParseException() {"},{"lineNumber":712,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addTimezone(\"\").build();"},{"lineNumber":713,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":714,"author":{"gitId":"-"},"content":" }"},{"lineNumber":715,"author":{"gitId":"-"},"content":""},{"lineNumber":716,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":717,"author":{"gitId":"-"},"content":" public void parse_shallowCloning_success() throws Exception {"},{"lineNumber":718,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(CONFIG_FOLDER_ABSOLUTE)"},{"lineNumber":719,"author":{"gitId":"-"},"content":" .addOutput(OUTPUT_DIRECTORY_ABSOLUTE)"},{"lineNumber":720,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":721,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":722,"author":{"gitId":"-"},"content":" Assertions.assertEquals(false, cliArguments.isShallowCloningPerformed());"},{"lineNumber":723,"author":{"gitId":"-"},"content":""},{"lineNumber":724,"author":{"gitId":"-"},"content":" String inputShallow \u003d new InputBuilder().addConfig(CONFIG_FOLDER_ABSOLUTE)"},{"lineNumber":725,"author":{"gitId":"-"},"content":" .addOutput(OUTPUT_DIRECTORY_ABSOLUTE)"},{"lineNumber":726,"author":{"gitId":"-"},"content":" .addShallowCloning()"},{"lineNumber":727,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":728,"author":{"gitId":"-"},"content":" CliArguments cliArgumentsShallow \u003d ArgsParser.parse(translateCommandline(inputShallow));"},{"lineNumber":729,"author":{"gitId":"-"},"content":" Assertions.assertEquals(true, cliArgumentsShallow.isShallowCloningPerformed());"},{"lineNumber":730,"author":{"gitId":"-"},"content":" }"},{"lineNumber":731,"author":{"gitId":"-"},"content":""},{"lineNumber":732,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":733,"author":{"gitId":"-"},"content":" * Ensures that {@code actualSinceDate} is exactly one month before {@code untilDate}."},{"lineNumber":734,"author":{"gitId":"-"},"content":" *"},{"lineNumber":735,"author":{"gitId":"-"},"content":" * @throws AssertionError if {@code actualSinceDate} is not one month before {@code untilDate}."},{"lineNumber":736,"author":{"gitId":"-"},"content":" */"},{"lineNumber":737,"author":{"gitId":"-"},"content":" private void assertDateDiffOneMonth(LocalDateTime actualSinceDate, LocalDateTime untilDate) {"},{"lineNumber":738,"author":{"gitId":"-"},"content":" LocalDateTime oneMonthBeforeUntilDate \u003d untilDate.withHour(0).withMinute(0).withSecond(0).minusMonths(1);"},{"lineNumber":739,"author":{"gitId":"-"},"content":" Assertions.assertTrue(actualSinceDate.equals(oneMonthBeforeUntilDate));"},{"lineNumber":740,"author":{"gitId":"-"},"content":" }"},{"lineNumber":741,"author":{"gitId":"-"},"content":""},{"lineNumber":742,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":743,"author":{"gitId":"-"},"content":" * Ensures that {@code actualUntilDate} falls on the date of report generation with time at 23:59:59."},{"lineNumber":744,"author":{"gitId":"-"},"content":" *"},{"lineNumber":745,"author":{"gitId":"-"},"content":" * @throws AssertionError if {@code actualUntilDate} does not fall on the date of report generation"},{"lineNumber":746,"author":{"gitId":"-"},"content":" * with time at 23:59:59."},{"lineNumber":747,"author":{"gitId":"-"},"content":" */"},{"lineNumber":748,"author":{"gitId":"-"},"content":" private void assertDateDiffEndOfDay(LocalDateTime actualUntilDate) {"},{"lineNumber":749,"author":{"gitId":"-"},"content":""},{"lineNumber":750,"author":{"gitId":"-"},"content":" LocalDateTime currentDate \u003d LocalDateTime.now().withHour(23).withMinute(59).withSecond(59).withNano(0);"},{"lineNumber":751,"author":{"gitId":"-"},"content":" Assertions.assertTrue(actualUntilDate.equals(currentDate));"},{"lineNumber":752,"author":{"gitId":"-"},"content":" }"},{"lineNumber":753,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":2,"-":751}},{"path":"src/test/java/reposense/parser/AuthorConfigParserTest.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.parser;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static reposense.util.TestUtil.loadResource;"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.AbstractMap.SimpleEntry;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Arrays;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Collections;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Map;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assertions;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":"import reposense.model.Author;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import reposense.model.AuthorConfiguration;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import reposense.model.RepoLocation;"},{"lineNumber":20,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidCsvException;"},{"lineNumber":21,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidHeaderException;"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":"public class AuthorConfigParserTest {"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_EMPTY_LOCATION_FILE \u003d loadResource(AuthorConfigParserTest.class,"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_emptyLocation_test.csv\");"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_EMPTY_CONFIG_FILE \u003d loadResource(AuthorConfigParserTest.class,"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/require_trailing_whitespaces/authorconfig_emptyConfig_test.csv\");"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_NO_SPECIAL_CHARACTER_FILE \u003d loadResource(AuthorConfigParserTest.class,"},{"lineNumber":29,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_noSpecialCharacter_test.csv\");"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_SPECIAL_CHARACTER_FILE \u003d loadResource(AuthorConfigParserTest.class,"},{"lineNumber":31,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_specialCharacter_test.csv\");"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_COMMAS_AND_DOUBLEQUOTES_FILE \u003d loadResource(AuthorConfigParserTest.class,"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_commasAndDoubleQuotes_test.csv\");"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_MULTIPLE_EMAILS_FILE \u003d loadResource(AuthorConfigParserTest.class,"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_multipleEmails_test.csv\");"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_DIFFERENT_COLUMN_ORDER \u003d loadResource(AuthorConfigParserTest.class,"},{"lineNumber":37,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_differentColumnOrder_test.csv\");"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_MISSING_OPTIONAL_HEADER \u003d loadResource(AuthorConfigParserTest.class,"},{"lineNumber":39,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_missingOptionalHeader_test.csv\");"},{"lineNumber":40,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_MISSING_MANDATORY_HEADER \u003d loadResource(AuthorConfigParserTest.class,"},{"lineNumber":41,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_missingMandatoryHeader_test.csv\");"},{"lineNumber":42,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_UNKNOWN_HEADER \u003d loadResource(AuthorConfigParserTest.class,"},{"lineNumber":43,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_unknownHeaders_test.csv\");"},{"lineNumber":44,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_GITHUB_ID_HEADER \u003d loadResource(AuthorConfigParserTest.class,"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_gitHubIdHeader_test.csv\");"},{"lineNumber":46,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_GIT_HOST_ID_HEADER \u003d loadResource(AuthorConfigParserTest.class,"},{"lineNumber":47,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_gitHostIdHeader_test.csv\");"},{"lineNumber":48,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_MULTIPLE_REPO_IN_ROW_FILE \u003d loadResource(AuthorConfigParserTest.class,"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_multipleReposInRow_test.csv\");"},{"lineNumber":50,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_MULTIPLE_REPO_IN_ROW_SINGLE_BRANCH_PER_REPO_FILE \u003d loadResource("},{"lineNumber":51,"author":{"gitId":"-"},"content":" AuthorConfigParserTest.class,"},{"lineNumber":52,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_multipleReposInRowSingleBranchPerRepo_test.csv\");"},{"lineNumber":53,"author":{"gitId":"-"},"content":""},{"lineNumber":54,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_MULTIPLE_REPO_IN_ROW_MULTIPLE_BRANCH_PER_REPO_FILE \u003d loadResource("},{"lineNumber":55,"author":{"gitId":"-"},"content":" AuthorConfigParserTest.class,"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_multipleReposInRowMultipleBranchPerRepo_test.csv\");"},{"lineNumber":57,"author":{"gitId":"-"},"content":""},{"lineNumber":58,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_BETA_LOCATION \u003d \"https://github.com/reposense/testrepo-Beta.git\";"},{"lineNumber":59,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_BETA_MASTER_BRANCH \u003d \"master\";"},{"lineNumber":60,"author":{"gitId":"-"},"content":""},{"lineNumber":61,"author":{"gitId":"-"},"content":" private static final Author FIRST_AUTHOR \u003d new Author(\"nbriannl\");"},{"lineNumber":62,"author":{"gitId":"-"},"content":" private static final Author SECOND_AUTHOR \u003d new Author(\"zacharytang\");"},{"lineNumber":63,"author":{"gitId":"-"},"content":" private static final List\u003cAuthor\u003e AUTHOR_CONFIG_NO_SPECIAL_CHARACTER_AUTHORS \u003d"},{"lineNumber":64,"author":{"gitId":"-"},"content":" Arrays.asList(FIRST_AUTHOR, SECOND_AUTHOR);"},{"lineNumber":65,"author":{"gitId":"-"},"content":""},{"lineNumber":66,"author":{"gitId":"-"},"content":" private static final Author FIRST_SPECIAL_CHARACTER_AUTHOR \u003d new Author(\"‘Processed�‘Cooked�\");"},{"lineNumber":67,"author":{"gitId":"-"},"content":" private static final Author SECOND_SPECIAL_CHARACTER_AUTHOR \u003d new Author(\"(codeeong)\");"},{"lineNumber":68,"author":{"gitId":"-"},"content":" private static final Author THIRD_SPECIAL_CHARACTER_AUTHOR \u003d new Author(\"^:jordancjq;$\");"},{"lineNumber":69,"author":{"gitId":"-"},"content":" private static final List\u003cAuthor\u003e AUTHOR_CONFIG_SPECIAL_CHARACTER_AUTHORS \u003d Arrays.asList("},{"lineNumber":70,"author":{"gitId":"-"},"content":" FIRST_SPECIAL_CHARACTER_AUTHOR, SECOND_SPECIAL_CHARACTER_AUTHOR, THIRD_SPECIAL_CHARACTER_AUTHOR);"},{"lineNumber":71,"author":{"gitId":"-"},"content":""},{"lineNumber":72,"author":{"gitId":"-"},"content":" private static final Author FIRST_COMMAS_AND_DOUBLEQUOTES_AUTHOR \u003d new Author(\"ProcessedCooked\");"},{"lineNumber":73,"author":{"gitId":"-"},"content":" private static final Author SECOND_COMMAS_AND_DOUBLEQUOTES_AUTHOR \u003d new Author(\"codeeong\");"},{"lineNumber":74,"author":{"gitId":"-"},"content":" private static final Author THIRD_COMMAS_AND_DOUBLEQUOTES_AUTHOR \u003d new Author(\"jordancjq\");"},{"lineNumber":75,"author":{"gitId":"-"},"content":" private static final String FIRST_COMMAS_AND_DOUBLEQUOTES_DISPLAY_NAME \u003d \"Tay Fan Gao, Douya\";"},{"lineNumber":76,"author":{"gitId":"-"},"content":" private static final String SECOND_COMMAS_AND_DOUBLEQUOTES_DISPLAY_NAME \u003d \"\\\"\\\"Tora, S/O,\\\" Doyua, T.\\\"\";"},{"lineNumber":77,"author":{"gitId":"-"},"content":" private static final String THIRD_COMMAS_AND_DOUBLEQUOTES_DISPLAY_NAME \u003d \"jordancjq\";"},{"lineNumber":78,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e FIRST_COMMAS_AND_DOUBLEQUOTES_ALIAS \u003d"},{"lineNumber":79,"author":{"gitId":"-"},"content":" Collections.singletonList(\"Tay Fan Gao, Douya \\\"SOC, Y2S1\\\"\");"},{"lineNumber":80,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e SECOND_COMMAS_AND_DOUBLEQUOTES_ALIAS \u003d Collections.emptyList();"},{"lineNumber":81,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e THIRD_COMMAS_AND_DOUBLEQUOTES_ALIAS \u003d"},{"lineNumber":82,"author":{"gitId":"-"},"content":" Arrays.asList(\"Borex T\\\"ony Tong\");"},{"lineNumber":83,"author":{"gitId":"-"},"content":" private static final Map\u003cAuthor, List\u003cString\u003e\u003e AUTHOR_ALIAS_COMMAS_AND_DOUBLE_QUOTES_MAP \u003d"},{"lineNumber":84,"author":{"gitId":"-"},"content":" Stream.of(new SimpleEntry\u003c\u003e(FIRST_COMMAS_AND_DOUBLEQUOTES_AUTHOR, FIRST_COMMAS_AND_DOUBLEQUOTES_ALIAS),"},{"lineNumber":85,"author":{"gitId":"-"},"content":" new SimpleEntry\u003c\u003e(SECOND_COMMAS_AND_DOUBLEQUOTES_AUTHOR, SECOND_COMMAS_AND_DOUBLEQUOTES_ALIAS),"},{"lineNumber":86,"author":{"gitId":"-"},"content":" new SimpleEntry\u003c\u003e(THIRD_COMMAS_AND_DOUBLEQUOTES_AUTHOR, THIRD_COMMAS_AND_DOUBLEQUOTES_ALIAS))"},{"lineNumber":87,"author":{"gitId":"-"},"content":" .collect(Collectors.toMap(entry -\u003e entry.getKey(), entry -\u003e entry.getValue()));"},{"lineNumber":88,"author":{"gitId":"-"},"content":" private static final Map\u003cAuthor, String\u003e AUTHOR_DISPLAY_NAME_COMMAS_AND_DOUBLE_QUOTES_MAP \u003d"},{"lineNumber":89,"author":{"gitId":"-"},"content":" Stream.of(new SimpleEntry\u003c\u003e(FIRST_COMMAS_AND_DOUBLEQUOTES_AUTHOR,"},{"lineNumber":90,"author":{"gitId":"-"},"content":" FIRST_COMMAS_AND_DOUBLEQUOTES_DISPLAY_NAME),"},{"lineNumber":91,"author":{"gitId":"-"},"content":" new SimpleEntry\u003c\u003e(SECOND_COMMAS_AND_DOUBLEQUOTES_AUTHOR,"},{"lineNumber":92,"author":{"gitId":"-"},"content":" SECOND_COMMAS_AND_DOUBLEQUOTES_DISPLAY_NAME),"},{"lineNumber":93,"author":{"gitId":"-"},"content":" new SimpleEntry\u003c\u003e(THIRD_COMMAS_AND_DOUBLEQUOTES_AUTHOR, THIRD_COMMAS_AND_DOUBLEQUOTES_DISPLAY_NAME))"},{"lineNumber":94,"author":{"gitId":"-"},"content":" .collect(Collectors.toMap(entry -\u003e entry.getKey(), entry -\u003e entry.getValue()));"},{"lineNumber":95,"author":{"gitId":"-"},"content":""},{"lineNumber":96,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e FIRST_AUTHOR_EMAIL_LIST \u003d"},{"lineNumber":97,"author":{"gitId":"-"},"content":" Arrays.asList(\"nbr@example.com\", \"nbriannl@test.net\", \"nbriannl@users.noreply.github.com\","},{"lineNumber":98,"author":{"gitId":"-"},"content":" \"nbriannl@users.noreply.gitlab.com\");"},{"lineNumber":99,"author":{"gitId":"-"},"content":""},{"lineNumber":100,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":101,"author":{"gitId":"-"},"content":" public void authorConfig_noSpecialCharacter_success() throws Exception {"},{"lineNumber":102,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser \u003d"},{"lineNumber":103,"author":{"gitId":"-"},"content":" new AuthorConfigCsvParser(AUTHOR_CONFIG_NO_SPECIAL_CHARACTER_FILE);"},{"lineNumber":104,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e configs \u003d authorConfigCsvParser.parse();"},{"lineNumber":105,"author":{"gitId":"-"},"content":""},{"lineNumber":106,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, configs.size());"},{"lineNumber":107,"author":{"gitId":"-"},"content":""},{"lineNumber":108,"author":{"gitId":"-"},"content":" AuthorConfiguration config \u003d configs.get(0);"},{"lineNumber":109,"author":{"gitId":"-"},"content":""},{"lineNumber":110,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_BETA_LOCATION), config.getLocation());"},{"lineNumber":111,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_MASTER_BRANCH, config.getBranch());"},{"lineNumber":112,"author":{"gitId":"-"},"content":""},{"lineNumber":113,"author":{"gitId":"-"},"content":" Assertions.assertEquals(AUTHOR_CONFIG_NO_SPECIAL_CHARACTER_AUTHORS, config.getAuthorList());"},{"lineNumber":114,"author":{"gitId":"-"},"content":" }"},{"lineNumber":115,"author":{"gitId":"-"},"content":""},{"lineNumber":116,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":117,"author":{"gitId":"-"},"content":" public void authorConfig_emptyLocation_success() throws Exception {"},{"lineNumber":118,"author":{"gitId":"-"},"content":" AuthorConfiguration expectedConfig \u003d new AuthorConfiguration(new RepoLocation(\"\"));"},{"lineNumber":119,"author":{"gitId":"-"},"content":""},{"lineNumber":120,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser \u003d new AuthorConfigCsvParser(AUTHOR_CONFIG_EMPTY_LOCATION_FILE);"},{"lineNumber":121,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e authorConfigs \u003d authorConfigCsvParser.parse();"},{"lineNumber":122,"author":{"gitId":"-"},"content":" AuthorConfiguration authorConfig \u003d authorConfigs.get(0);"},{"lineNumber":123,"author":{"gitId":"-"},"content":""},{"lineNumber":124,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, authorConfigs.size());"},{"lineNumber":125,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedConfig.getLocation(), authorConfig.getLocation());"},{"lineNumber":126,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedConfig.getBranch(), authorConfig.getBranch());"},{"lineNumber":127,"author":{"gitId":"-"},"content":" Assertions.assertEquals(AUTHOR_CONFIG_NO_SPECIAL_CHARACTER_AUTHORS, authorConfig.getAuthorList());"},{"lineNumber":128,"author":{"gitId":"-"},"content":" }"},{"lineNumber":129,"author":{"gitId":"-"},"content":""},{"lineNumber":130,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":131,"author":{"gitId":"-"},"content":" public void authorConfig_emptyConfig_throwsInvalidCsvException() throws Exception {"},{"lineNumber":132,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser \u003d new AuthorConfigCsvParser(AUTHOR_CONFIG_EMPTY_CONFIG_FILE);"},{"lineNumber":133,"author":{"gitId":"-"},"content":" Assertions.assertThrows(InvalidCsvException.class, () -\u003e authorConfigCsvParser.parse());"},{"lineNumber":134,"author":{"gitId":"-"},"content":" }"},{"lineNumber":135,"author":{"gitId":"-"},"content":""},{"lineNumber":136,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":137,"author":{"gitId":"-"},"content":" public void authorConfig_specialCharacter_success() throws Exception {"},{"lineNumber":138,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser \u003d new AuthorConfigCsvParser(AUTHOR_CONFIG_SPECIAL_CHARACTER_FILE);"},{"lineNumber":139,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e configs \u003d authorConfigCsvParser.parse();"},{"lineNumber":140,"author":{"gitId":"-"},"content":""},{"lineNumber":141,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, configs.size());"},{"lineNumber":142,"author":{"gitId":"-"},"content":""},{"lineNumber":143,"author":{"gitId":"-"},"content":" AuthorConfiguration config \u003d configs.get(0);"},{"lineNumber":144,"author":{"gitId":"-"},"content":""},{"lineNumber":145,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_BETA_LOCATION), config.getLocation());"},{"lineNumber":146,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_MASTER_BRANCH, config.getBranch());"},{"lineNumber":147,"author":{"gitId":"-"},"content":""},{"lineNumber":148,"author":{"gitId":"-"},"content":" Assertions.assertEquals(AUTHOR_CONFIG_SPECIAL_CHARACTER_AUTHORS, config.getAuthorList());"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }"},{"lineNumber":150,"author":{"gitId":"-"},"content":""},{"lineNumber":151,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":152,"author":{"gitId":"-"},"content":" public void authorConfig_multipleEmails_success() throws Exception {"},{"lineNumber":153,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser \u003d new AuthorConfigCsvParser(AUTHOR_CONFIG_MULTIPLE_EMAILS_FILE);"},{"lineNumber":154,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e configs \u003d authorConfigCsvParser.parse();"},{"lineNumber":155,"author":{"gitId":"-"},"content":""},{"lineNumber":156,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, configs.size());"},{"lineNumber":157,"author":{"gitId":"-"},"content":""},{"lineNumber":158,"author":{"gitId":"-"},"content":" AuthorConfiguration config \u003d configs.get(0);"},{"lineNumber":159,"author":{"gitId":"-"},"content":""},{"lineNumber":160,"author":{"gitId":"-"},"content":" Author actualAuthor \u003d config.getAuthorList().get(0);"},{"lineNumber":161,"author":{"gitId":"-"},"content":" Assertions.assertEquals(FIRST_AUTHOR_EMAIL_LIST.size(), actualAuthor.getEmails().size());"},{"lineNumber":162,"author":{"gitId":"-"},"content":" Assertions.assertTrue(actualAuthor.getEmails().containsAll(FIRST_AUTHOR_EMAIL_LIST));"},{"lineNumber":163,"author":{"gitId":"-"},"content":" }"},{"lineNumber":164,"author":{"gitId":"-"},"content":""},{"lineNumber":165,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":166,"author":{"gitId":"-"},"content":" public void authorConfig_differentColumnOrder_success() throws Exception {"},{"lineNumber":167,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser \u003d"},{"lineNumber":168,"author":{"gitId":"-"},"content":" new AuthorConfigCsvParser(AUTHOR_CONFIG_DIFFERENT_COLUMN_ORDER);"},{"lineNumber":169,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e configs \u003d authorConfigCsvParser.parse();"},{"lineNumber":170,"author":{"gitId":"-"},"content":""},{"lineNumber":171,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, configs.size());"},{"lineNumber":172,"author":{"gitId":"-"},"content":""},{"lineNumber":173,"author":{"gitId":"-"},"content":" AuthorConfiguration config \u003d configs.get(0);"},{"lineNumber":174,"author":{"gitId":"-"},"content":""},{"lineNumber":175,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_BETA_LOCATION), config.getLocation());"},{"lineNumber":176,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_MASTER_BRANCH, config.getBranch());"},{"lineNumber":177,"author":{"gitId":"-"},"content":""},{"lineNumber":178,"author":{"gitId":"-"},"content":" Assertions.assertEquals(AUTHOR_CONFIG_NO_SPECIAL_CHARACTER_AUTHORS, config.getAuthorList());"},{"lineNumber":179,"author":{"gitId":"-"},"content":" }"},{"lineNumber":180,"author":{"gitId":"-"},"content":""},{"lineNumber":181,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":182,"author":{"gitId":"-"},"content":" public void authorConfig_missingOptionalHeader_success() throws Exception {"},{"lineNumber":183,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser \u003d new AuthorConfigCsvParser(AUTHOR_CONFIG_MISSING_OPTIONAL_HEADER);"},{"lineNumber":184,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e configs \u003d authorConfigCsvParser.parse();"},{"lineNumber":185,"author":{"gitId":"-"},"content":""},{"lineNumber":186,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, configs.size());"},{"lineNumber":187,"author":{"gitId":"-"},"content":""},{"lineNumber":188,"author":{"gitId":"-"},"content":" AuthorConfiguration config \u003d configs.get(0);"},{"lineNumber":189,"author":{"gitId":"-"},"content":""},{"lineNumber":190,"author":{"gitId":"-"},"content":" Assertions.assertEquals(4, config.getAuthorList().size());"},{"lineNumber":191,"author":{"gitId":"-"},"content":" }"},{"lineNumber":192,"author":{"gitId":"-"},"content":""},{"lineNumber":193,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":194,"author":{"gitId":"-"},"content":" public void authorConfig_newGitHostIdHeader_success() throws Exception {"},{"lineNumber":195,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser;"},{"lineNumber":196,"author":{"gitId":"-"},"content":""},{"lineNumber":197,"author":{"gitId":"-"},"content":" authorConfigCsvParser \u003d new AuthorConfigCsvParser(AUTHOR_CONFIG_GIT_HOST_ID_HEADER);"},{"lineNumber":198,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e configsWithGitHostIdHeader \u003d authorConfigCsvParser.parse();"},{"lineNumber":199,"author":{"gitId":"-"},"content":""},{"lineNumber":200,"author":{"gitId":"-"},"content":" authorConfigCsvParser \u003d new AuthorConfigCsvParser(AUTHOR_CONFIG_GITHUB_ID_HEADER);"},{"lineNumber":201,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e configsWithGitHubIdHeader \u003d authorConfigCsvParser.parse();"},{"lineNumber":202,"author":{"gitId":"-"},"content":""},{"lineNumber":203,"author":{"gitId":"-"},"content":" Assertions.assertEquals(configsWithGitHubIdHeader, configsWithGitHostIdHeader);"},{"lineNumber":204,"author":{"gitId":"-"},"content":" }"},{"lineNumber":205,"author":{"gitId":"-"},"content":""},{"lineNumber":206,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":207,"author":{"gitId":"-"},"content":" public void authorConfig_missingMandatoryHeader_throwsInvalidCsvException() throws Exception {"},{"lineNumber":208,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser \u003d new AuthorConfigCsvParser(AUTHOR_CONFIG_MISSING_MANDATORY_HEADER);"},{"lineNumber":209,"author":{"gitId":"-"},"content":" Assertions.assertThrows(InvalidCsvException.class, () -\u003e authorConfigCsvParser.parse());"},{"lineNumber":210,"author":{"gitId":"-"},"content":" }"},{"lineNumber":211,"author":{"gitId":"-"},"content":""},{"lineNumber":212,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":213,"author":{"gitId":"-"},"content":" public void authorConfig_unknownHeaders_throwsInvalidHeaderException() throws Exception {"},{"lineNumber":214,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser \u003d new AuthorConfigCsvParser(AUTHOR_CONFIG_UNKNOWN_HEADER);"},{"lineNumber":215,"author":{"gitId":"-"},"content":" Assertions.assertThrows(InvalidHeaderException.class, () -\u003e authorConfigCsvParser.parse());"},{"lineNumber":216,"author":{"gitId":"-"},"content":" }"},{"lineNumber":217,"author":{"gitId":"-"},"content":""},{"lineNumber":218,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":219,"author":{"gitId":"-"},"content":" public void parse_multipleColumnsWithCommasAndDoubleQuotes_success() throws Exception {"},{"lineNumber":220,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser \u003d"},{"lineNumber":221,"author":{"gitId":"-"},"content":" new AuthorConfigCsvParser(AUTHOR_CONFIG_COMMAS_AND_DOUBLEQUOTES_FILE);"},{"lineNumber":222,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e configs \u003d authorConfigCsvParser.parse();"},{"lineNumber":223,"author":{"gitId":"-"},"content":""},{"lineNumber":224,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, configs.size());"},{"lineNumber":225,"author":{"gitId":"-"},"content":""},{"lineNumber":226,"author":{"gitId":"-"},"content":" AuthorConfiguration config \u003d configs.get(0);"},{"lineNumber":227,"author":{"gitId":"-"},"content":""},{"lineNumber":228,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_BETA_LOCATION), config.getLocation());"},{"lineNumber":229,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_MASTER_BRANCH, config.getBranch());"},{"lineNumber":230,"author":{"gitId":"-"},"content":" Assertions.assertEquals(AUTHOR_DISPLAY_NAME_COMMAS_AND_DOUBLE_QUOTES_MAP, config.getAuthorDisplayNameMap());"},{"lineNumber":231,"author":{"gitId":"-"},"content":""},{"lineNumber":232,"author":{"gitId":"-"},"content":" Assertions.assertEquals(AUTHOR_ALIAS_COMMAS_AND_DOUBLE_QUOTES_MAP.size(), config.getAuthorList().size());"},{"lineNumber":233,"author":{"gitId":"-"},"content":" config.getAuthorList().forEach(author -\u003e {"},{"lineNumber":234,"author":{"gitId":"-"},"content":" Assertions.assertEquals(AUTHOR_ALIAS_COMMAS_AND_DOUBLE_QUOTES_MAP.get(author), author.getAuthorAliases());"},{"lineNumber":235,"author":{"gitId":"-"},"content":" });"},{"lineNumber":236,"author":{"gitId":"-"},"content":" }"},{"lineNumber":237,"author":{"gitId":"-"},"content":""},{"lineNumber":238,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":239,"author":{"gitId":"-"},"content":" public void authorConfig_multipleReposInRow_success() throws Exception {"},{"lineNumber":240,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser \u003d new AuthorConfigCsvParser("},{"lineNumber":241,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_MULTIPLE_REPO_IN_ROW_FILE);"},{"lineNumber":242,"author":{"gitId":"-"},"content":" String defaultSpecifiedBranch \u003d \"master\";"},{"lineNumber":243,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e configs \u003d authorConfigCsvParser.parse();"},{"lineNumber":244,"author":{"gitId":"-"},"content":""},{"lineNumber":245,"author":{"gitId":"-"},"content":" Assertions.assertEquals(4, configs.size());"},{"lineNumber":246,"author":{"gitId":"-"},"content":""},{"lineNumber":247,"author":{"gitId":"-"},"content":" AuthorConfiguration config \u003d configs.get(0);"},{"lineNumber":248,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(\"https://github.com/reposense/reposense.git\"), config.getLocation());"},{"lineNumber":249,"author":{"gitId":"-"},"content":" Assertions.assertEquals(defaultSpecifiedBranch, config.getBranch());"},{"lineNumber":250,"author":{"gitId":"-"},"content":""},{"lineNumber":251,"author":{"gitId":"-"},"content":" config \u003d configs.get(1);"},{"lineNumber":252,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(\"https://github.com/markbind/markbind.git\"), config.getLocation());"},{"lineNumber":253,"author":{"gitId":"-"},"content":" Assertions.assertEquals(defaultSpecifiedBranch, config.getBranch());"},{"lineNumber":254,"author":{"gitId":"-"},"content":""},{"lineNumber":255,"author":{"gitId":"-"},"content":" config \u003d configs.get(2);"},{"lineNumber":256,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(\"https://github.com/TEAMMATES/teammates.git\"), config.getLocation());"},{"lineNumber":257,"author":{"gitId":"-"},"content":" Assertions.assertEquals(defaultSpecifiedBranch, config.getBranch());"},{"lineNumber":258,"author":{"gitId":"-"},"content":""},{"lineNumber":259,"author":{"gitId":"-"},"content":" config \u003d configs.get(3);"},{"lineNumber":260,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(\"https://github.com/CATcher-org/CATcher.git\"), config.getLocation());"},{"lineNumber":261,"author":{"gitId":"-"},"content":" Assertions.assertEquals(defaultSpecifiedBranch, config.getBranch());"},{"lineNumber":262,"author":{"gitId":"-"},"content":" }"},{"lineNumber":263,"author":{"gitId":"-"},"content":""},{"lineNumber":264,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":265,"author":{"gitId":"-"},"content":" public void authorConfig_multipleReposInRowSingleBranchPerRepo_success() throws Exception {"},{"lineNumber":266,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser \u003d new AuthorConfigCsvParser("},{"lineNumber":267,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_MULTIPLE_REPO_IN_ROW_SINGLE_BRANCH_PER_REPO_FILE);"},{"lineNumber":268,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e configs \u003d authorConfigCsvParser.parse();"},{"lineNumber":269,"author":{"gitId":"-"},"content":""},{"lineNumber":270,"author":{"gitId":"-"},"content":" Assertions.assertEquals(4, configs.size());"},{"lineNumber":271,"author":{"gitId":"-"},"content":""},{"lineNumber":272,"author":{"gitId":"-"},"content":" AuthorConfiguration config \u003d configs.get(0);"},{"lineNumber":273,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_BETA_LOCATION), config.getLocation());"},{"lineNumber":274,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_MASTER_BRANCH, config.getBranch());"},{"lineNumber":275,"author":{"gitId":"-"},"content":""},{"lineNumber":276,"author":{"gitId":"-"},"content":" config \u003d configs.get(1);"},{"lineNumber":277,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_BETA_LOCATION), config.getLocation());"},{"lineNumber":278,"author":{"gitId":"-"},"content":" Assertions.assertEquals(\"add-config-json\", config.getBranch());"},{"lineNumber":279,"author":{"gitId":"-"},"content":""},{"lineNumber":280,"author":{"gitId":"-"},"content":" config \u003d configs.get(2);"},{"lineNumber":281,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(\"https://github.com/reposense/RepoSense.git\"), config.getLocation());"},{"lineNumber":282,"author":{"gitId":"-"},"content":" Assertions.assertEquals(\"release\", config.getBranch());"},{"lineNumber":283,"author":{"gitId":"-"},"content":""},{"lineNumber":284,"author":{"gitId":"-"},"content":" config \u003d configs.get(3);"},{"lineNumber":285,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(\"/Users/sikai/RepoSense\"), config.getLocation());"},{"lineNumber":286,"author":{"gitId":"-"},"content":" Assertions.assertEquals(\"master\", config.getBranch());"},{"lineNumber":287,"author":{"gitId":"-"},"content":" }"},{"lineNumber":288,"author":{"gitId":"-"},"content":""},{"lineNumber":289,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":290,"author":{"gitId":"-"},"content":" public void authorConfig_multipleReposInRowMultipleBranchPerRepo_success() throws Exception {"},{"lineNumber":291,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser \u003d new AuthorConfigCsvParser("},{"lineNumber":292,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_MULTIPLE_REPO_IN_ROW_MULTIPLE_BRANCH_PER_REPO_FILE);"},{"lineNumber":293,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e configs \u003d authorConfigCsvParser.parse();"},{"lineNumber":294,"author":{"gitId":"-"},"content":""},{"lineNumber":295,"author":{"gitId":"-"},"content":" Assertions.assertEquals(5, configs.size());"},{"lineNumber":296,"author":{"gitId":"-"},"content":""},{"lineNumber":297,"author":{"gitId":"-"},"content":" AuthorConfiguration config \u003d configs.get(0);"},{"lineNumber":298,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_BETA_LOCATION), config.getLocation());"},{"lineNumber":299,"author":{"gitId":"-"},"content":" Assertions.assertEquals(\"add-config-json\", config.getBranch());"},{"lineNumber":300,"author":{"gitId":"-"},"content":""},{"lineNumber":301,"author":{"gitId":"-"},"content":" config \u003d configs.get(1);"},{"lineNumber":302,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_BETA_LOCATION), config.getLocation());"},{"lineNumber":303,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_MASTER_BRANCH, config.getBranch());"},{"lineNumber":304,"author":{"gitId":"-"},"content":""},{"lineNumber":305,"author":{"gitId":"-"},"content":" config \u003d configs.get(2);"},{"lineNumber":306,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(\"/Users/sikai/RepoSense\"), config.getLocation());"},{"lineNumber":307,"author":{"gitId":"-"},"content":" Assertions.assertEquals(\"master\", config.getBranch());"},{"lineNumber":308,"author":{"gitId":"-"},"content":""},{"lineNumber":309,"author":{"gitId":"-"},"content":" config \u003d configs.get(3);"},{"lineNumber":310,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(\"/Users/sikai/RepoSense\"), config.getLocation());"},{"lineNumber":311,"author":{"gitId":"-"},"content":" Assertions.assertEquals(\"release\", config.getBranch());"},{"lineNumber":312,"author":{"gitId":"-"},"content":""},{"lineNumber":313,"author":{"gitId":"-"},"content":" config \u003d configs.get(4);"},{"lineNumber":314,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(\"/Users/sikai/RepoSense\"), config.getLocation());"},{"lineNumber":315,"author":{"gitId":"-"},"content":" Assertions.assertEquals(\"gh-pages\", config.getBranch());"},{"lineNumber":316,"author":{"gitId":"-"},"content":" }"},{"lineNumber":317,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":2,"-":315}},{"path":"src/test/java/reposense/parser/GroupConfigParserTest.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.parser;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static reposense.util.TestUtil.loadResource;"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Arrays;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Collections;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assertions;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"-"},"content":"import reposense.model.FileType;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import reposense.model.GroupConfiguration;"},{"lineNumber":15,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidCsvException;"},{"lineNumber":16,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidHeaderException;"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class GroupConfigParserTest {"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private static final Path GROUP_CONFIG_MULTI_LOCATION_FILE \u003d loadResource(GroupConfigParserTest.class,"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \"GroupConfigParserTest/groupconfig_multipleLocation_test.csv\");"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final Path GROUP_CONFIG_EMPTY_LOCATION_FILE \u003d loadResource(GroupConfigParserTest.class,"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \"GroupConfigParserTest/groupconfig_emptyLocation_test.csv\");"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final Path GROUP_CONFIG_DIFFERENT_COLUMN_ORDER_FILE \u003d loadResource(GroupConfigParserTest.class,"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \"GroupConfigParserTest/groupconfig_differentColumnOrder_test.csv\");"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final Path GROUP_CONFIG_MISSING_OPTIONAL_HEADER_FILE \u003d loadResource(GroupConfigParserTest.class,"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \"GroupConfigParserTest/groupconfig_missingOptionalHeader_test.csv\");"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final Path GROUP_CONFIG_MISSING_MANDATORY_HEADER_FILE \u003d loadResource(GroupConfigParserTest.class,"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \"GroupConfigParserTest/groupconfig_missingMandatoryHeader_test.csv\");"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private static final Path GROUP_CONFIG_UNKNOWN_HEADER_FILE \u003d loadResource(GroupConfigParserTest.class,"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \"GroupConfigParserTest/groupconfig_unknownHeader_test.csv\");"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_BETA_LOCATION \u003d \"https://github.com/reposense/testrepo-Beta.git\";"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final List\u003cFileType\u003e TEST_REPO_BETA_GROUPS \u003d Arrays.asList("},{"lineNumber":34,"author":{"gitId":"-"},"content":" new FileType(\"Code\", Arrays.asList(\"**/*.java\", \"**/*.py\")),"},{"lineNumber":35,"author":{"gitId":"-"},"content":" new FileType(\"Docs\", Collections.singletonList(\"docs/**\")));"},{"lineNumber":36,"author":{"gitId":"-"},"content":""},{"lineNumber":37,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_DELTA_LOCATION \u003d \"https://github.com/reposense/testrepo-Delta.git\";"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private static final List\u003cFileType\u003e TEST_REPO_DELTA_GROUPS \u003d Arrays.asList("},{"lineNumber":39,"author":{"gitId":"-"},"content":" new FileType(\"Main\", Collections.singletonList(\"src/main/**\")),"},{"lineNumber":40,"author":{"gitId":"-"},"content":" new FileType(\"Test\", Arrays.asList(\"src/test/**\", \"src/systest/**\")));"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void groupConfig_emptyLocation_success() throws Exception {"},{"lineNumber":44,"author":{"gitId":"-"},"content":" GroupConfigCsvParser groupConfigCsvParser \u003d new GroupConfigCsvParser(GROUP_CONFIG_EMPTY_LOCATION_FILE);"},{"lineNumber":45,"author":{"gitId":"-"},"content":" List\u003cGroupConfiguration\u003e groupConfigs \u003d groupConfigCsvParser.parse();"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":" Assertions.assertEquals(2, groupConfigs.size());"},{"lineNumber":48,"author":{"gitId":"-"},"content":""},{"lineNumber":49,"author":{"gitId":"-"},"content":" GroupConfiguration actualReposenseConfig \u003d groupConfigs.get(0);"},{"lineNumber":50,"author":{"gitId":"-"},"content":" Assertions.assertEquals(2, actualReposenseConfig.getGroupsList().size());"},{"lineNumber":51,"author":{"gitId":"-"},"content":""},{"lineNumber":52,"author":{"gitId":"-"},"content":" GroupConfiguration actualEmptyLocationConfig \u003d groupConfigs.get(1);"},{"lineNumber":53,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, actualEmptyLocationConfig.getGroupsList().size());"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void groupConfig_multipleLocations_success() throws Exception {"},{"lineNumber":58,"author":{"gitId":"-"},"content":" GroupConfigCsvParser groupConfigCsvParser \u003d new GroupConfigCsvParser(GROUP_CONFIG_MULTI_LOCATION_FILE);"},{"lineNumber":59,"author":{"gitId":"-"},"content":" List\u003cGroupConfiguration\u003e groupConfigs \u003d groupConfigCsvParser.parse();"},{"lineNumber":60,"author":{"gitId":"-"},"content":""},{"lineNumber":61,"author":{"gitId":"-"},"content":" Assertions.assertEquals(2, groupConfigs.size());"},{"lineNumber":62,"author":{"gitId":"-"},"content":""},{"lineNumber":63,"author":{"gitId":"-"},"content":" GroupConfiguration actualBetaConfig \u003d groupConfigs.get(0);"},{"lineNumber":64,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_LOCATION, actualBetaConfig.getLocation().toString());"},{"lineNumber":65,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_GROUPS, actualBetaConfig.getGroupsList());"},{"lineNumber":66,"author":{"gitId":"-"},"content":""},{"lineNumber":67,"author":{"gitId":"-"},"content":" GroupConfiguration actualDeltaConfig \u003d groupConfigs.get(1);"},{"lineNumber":68,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_DELTA_LOCATION, actualDeltaConfig.getLocation().toString());"},{"lineNumber":69,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_DELTA_GROUPS, actualDeltaConfig.getGroupsList());"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }"},{"lineNumber":71,"author":{"gitId":"-"},"content":""},{"lineNumber":72,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":73,"author":{"gitId":"-"},"content":" public void groupConfig_differentColumnOrder_success() throws Exception {"},{"lineNumber":74,"author":{"gitId":"-"},"content":" GroupConfigCsvParser groupConfigCsvParser \u003d new GroupConfigCsvParser(GROUP_CONFIG_DIFFERENT_COLUMN_ORDER_FILE);"},{"lineNumber":75,"author":{"gitId":"-"},"content":" List\u003cGroupConfiguration\u003e groupConfigs \u003d groupConfigCsvParser.parse();"},{"lineNumber":76,"author":{"gitId":"-"},"content":""},{"lineNumber":77,"author":{"gitId":"-"},"content":" Assertions.assertEquals(2, groupConfigs.size());"},{"lineNumber":78,"author":{"gitId":"-"},"content":""},{"lineNumber":79,"author":{"gitId":"-"},"content":" GroupConfiguration actualBetaConfig \u003d groupConfigs.get(0);"},{"lineNumber":80,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_LOCATION, actualBetaConfig.getLocation().toString());"},{"lineNumber":81,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_GROUPS, actualBetaConfig.getGroupsList());"},{"lineNumber":82,"author":{"gitId":"-"},"content":""},{"lineNumber":83,"author":{"gitId":"-"},"content":" GroupConfiguration actualDeltaConfig \u003d groupConfigs.get(1);"},{"lineNumber":84,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_DELTA_LOCATION, actualDeltaConfig.getLocation().toString());"},{"lineNumber":85,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_DELTA_GROUPS, actualDeltaConfig.getGroupsList());"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }"},{"lineNumber":87,"author":{"gitId":"-"},"content":""},{"lineNumber":88,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":89,"author":{"gitId":"-"},"content":" public void groupConfig_missingOptionalHeader_success() throws Exception {"},{"lineNumber":90,"author":{"gitId":"-"},"content":" GroupConfigCsvParser groupConfigCsvParser \u003d new GroupConfigCsvParser(GROUP_CONFIG_MISSING_OPTIONAL_HEADER_FILE);"},{"lineNumber":91,"author":{"gitId":"-"},"content":" List\u003cGroupConfiguration\u003e groupConfigs \u003d groupConfigCsvParser.parse();"},{"lineNumber":92,"author":{"gitId":"-"},"content":""},{"lineNumber":93,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, groupConfigs.size());"},{"lineNumber":94,"author":{"gitId":"-"},"content":""},{"lineNumber":95,"author":{"gitId":"-"},"content":" Assertions.assertEquals(3, groupConfigs.get(0).getGroupsList().size());"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }"},{"lineNumber":97,"author":{"gitId":"-"},"content":""},{"lineNumber":98,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":99,"author":{"gitId":"-"},"content":" public void groupConfig_missingMandatoryHeader_throwsInvalidCsvException() throws Exception {"},{"lineNumber":100,"author":{"gitId":"-"},"content":" GroupConfigCsvParser groupConfigCsvParser \u003d new GroupConfigCsvParser("},{"lineNumber":101,"author":{"gitId":"-"},"content":" GROUP_CONFIG_MISSING_MANDATORY_HEADER_FILE);"},{"lineNumber":102,"author":{"gitId":"-"},"content":" Assertions.assertThrows(InvalidCsvException.class, () -\u003e groupConfigCsvParser.parse());"},{"lineNumber":103,"author":{"gitId":"-"},"content":" }"},{"lineNumber":104,"author":{"gitId":"-"},"content":""},{"lineNumber":105,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":106,"author":{"gitId":"-"},"content":" public void groupConfig_unknownHeader_throwsInvalidHeaderException() throws Exception {"},{"lineNumber":107,"author":{"gitId":"-"},"content":" GroupConfigCsvParser groupConfigCsvParser \u003d new GroupConfigCsvParser("},{"lineNumber":108,"author":{"gitId":"-"},"content":" GROUP_CONFIG_UNKNOWN_HEADER_FILE);"},{"lineNumber":109,"author":{"gitId":"-"},"content":" Assertions.assertThrows(InvalidHeaderException.class, () -\u003e groupConfigCsvParser.parse());"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }"},{"lineNumber":111,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":2,"-":109}},{"path":"src/test/java/reposense/parser/RepoConfigParserTest.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.parser;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.apache.tools.ant.types.Commandline.translateCommandline;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static reposense.model.RepoConfiguration.DEFAULT_FILE_SIZE_LIMIT;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static reposense.util.TestUtil.loadResource;"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.ArrayList;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Arrays;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assertions;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;"},{"lineNumber":14,"author":{"gitId":"-"},"content":""},{"lineNumber":15,"author":{"gitId":"-"},"content":"import reposense.model.Author;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import reposense.model.AuthorConfiguration;"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import reposense.model.CliArguments;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import reposense.model.CommitHash;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import reposense.model.FileType;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import reposense.model.RepoConfiguration;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import reposense.model.RepoLocation;"},{"lineNumber":22,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidCsvException;"},{"lineNumber":23,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidHeaderException;"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import reposense.util.InputBuilder;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import reposense.util.TestUtil;"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"-"},"content":"public class RepoConfigParserTest {"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private static final Path TEST_CONFIG_FOLDER \u003d loadResource(RepoConfigParserTest.class, \"repoconfig_merge_test\");"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private static final Path TEST_EMPTY_BRANCH_CONFIG_FOLDER \u003d loadResource(RepoConfigParserTest.class,"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \"repoconfig_empty_branch_test\");"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_NO_SPECIAL_CHARACTER_FILE \u003d loadResource(RepoConfigParserTest.class,"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \"RepoConfigParserTest/repoconfig_noSpecialCharacter_test.csv\");"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_OVERRIDE_KEYWORD_FILE \u003d loadResource(RepoConfigParserTest.class,"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \"RepoConfigParserTest/repoconfig_overrideKeyword_test.csv\");"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_REDUNDANT_LINES_FILE \u003d loadResource(RepoConfigParserTest.class,"},{"lineNumber":36,"author":{"gitId":"-"},"content":" \"RepoConfigParserTest/require_trailing_whitespaces/repoconfig_redundantLines_test.csv\");"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_UNRECOGNIZED_VALUES_FOR_YES_KEYWORD_HEADERS_FILE \u003d"},{"lineNumber":38,"author":{"gitId":"-"},"content":" loadResource(RepoConfigParserTest.class,"},{"lineNumber":39,"author":{"gitId":"-"},"content":" \"RepoConfigParserTest/repoconfig_unrecognizedValuesForYesKeywordHeaders_test.csv\");"},{"lineNumber":40,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_DUPLICATE_HEADERS_CASE_SENSITIVE_FILE \u003d"},{"lineNumber":41,"author":{"gitId":"-"},"content":" loadResource(RepoConfigParserTest.class,"},{"lineNumber":42,"author":{"gitId":"-"},"content":" \"RepoConfigParserTest/repoconfig_duplicateHeadersCaseSensitive_test.csv\");"},{"lineNumber":43,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_DUPLICATE_HEADERS_CASE_INSENSITIVE_FILE \u003d"},{"lineNumber":44,"author":{"gitId":"-"},"content":" loadResource(RepoConfigParserTest.class,"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \"RepoConfigParserTest/repoconfig_duplicateHeadersCaseInsensitive_test.csv\");"},{"lineNumber":46,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_DIFFERENT_COLUMN_ORDER_FILE \u003d loadResource(RepoConfigParserTest.class,"},{"lineNumber":47,"author":{"gitId":"-"},"content":" \"RepoConfigParserTest/repoconfig_differentColumnOrder_test.csv\");"},{"lineNumber":48,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_OPTIONAL_HEADER_MISSING_FILE \u003d loadResource(RepoConfigParserTest.class,"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \"RepoConfigParserTest/repoconfig_missingOptionalHeader_test.csv\");"},{"lineNumber":50,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_MANDATORY_HEADER_MISSING_FILE \u003d loadResource(RepoConfigParserTest.class,"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \"RepoConfigParserTest/repoconfig_missingMandatoryHeader_test.csv\");"},{"lineNumber":52,"author":{"gitId":"-"},"content":" private static final Path MERGE_EMPTY_LOCATION_FOLDER \u003d loadResource(RepoConfigParserTest.class,"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \"RepoConfigParserTest/repoconfig_merge_empty_location_test\");"},{"lineNumber":54,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_UNKNOWN_HEADER_FILE \u003d loadResource(RepoConfigParserTest.class,"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \"RepoConfigParserTest/repoconfig_unknownHeaders_test.csv\");"},{"lineNumber":56,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_INVALID_FILE_SIZE_LIMIT \u003d loadResource(RepoConfigParserTest.class,"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \"RepoConfigParserTest/repoconfig_invalidFileSizeLimit_test.csv\");"},{"lineNumber":58,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_IGNORE_FILE_SIZE_LIMIT \u003d loadResource(RepoConfigParserTest.class,"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \"RepoConfigParserTest/repoconfig_ignoreFileSizeLimit_test.csv\");"},{"lineNumber":60,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_ZERO_VALID_RECORDS \u003d loadResource(RepoConfigParserTest.class,"},{"lineNumber":61,"author":{"gitId":"-"},"content":" \"CsvParserTest/repoconfig_zeroValidRecords_test.csv\");"},{"lineNumber":62,"author":{"gitId":"-"},"content":""},{"lineNumber":63,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_BETA_LOCATION \u003d \"https://github.com/reposense/testrepo-Beta.git\";"},{"lineNumber":64,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_BETA_MASTER_BRANCH \u003d \"master\";"},{"lineNumber":65,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_BETA_ADD_CONFIG_JSON_BRANCH \u003d \"add-config-json\";"},{"lineNumber":66,"author":{"gitId":"-"},"content":""},{"lineNumber":67,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_DELTA_LOCATION \u003d \"https://github.com/reposense/testrepo-Delta.git\";"},{"lineNumber":68,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_DELTA_BRANCH \u003d \"HEAD\";"},{"lineNumber":69,"author":{"gitId":"-"},"content":" private static final List\u003cFileType\u003e TEST_REPO_DELTA_FORMATS \u003d"},{"lineNumber":70,"author":{"gitId":"-"},"content":" FileType.convertFormatStringsToFileTypes(Arrays.asList(\"java\", \"fxml\"));"},{"lineNumber":71,"author":{"gitId":"-"},"content":""},{"lineNumber":72,"author":{"gitId":"-"},"content":" private static final List\u003cFileType\u003e TEST_REPO_BETA_CONFIG_FORMATS \u003d"},{"lineNumber":73,"author":{"gitId":"-"},"content":" FileType.convertFormatStringsToFileTypes(Arrays.asList(\"java\", \"adoc\", \"md\"));"},{"lineNumber":74,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e TEST_REPO_BETA_CONFIG_IGNORED_COMMITS \u003d"},{"lineNumber":75,"author":{"gitId":"-"},"content":" Arrays.asList(\"abcde12345\", \"67890fdecba\");"},{"lineNumber":76,"author":{"gitId":"-"},"content":""},{"lineNumber":77,"author":{"gitId":"-"},"content":" private static final int FILE_SIZE_LIMIT_VALUE \u003d 100000;"},{"lineNumber":78,"author":{"gitId":"-"},"content":""},{"lineNumber":79,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_CHARLIE_LOCATION \u003d \"https://github.com/reposense/testrepo-Charlie.git\";"},{"lineNumber":80,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_CHARLIE_BRANCH \u003d \"HEAD\";"},{"lineNumber":81,"author":{"gitId":"-"},"content":""},{"lineNumber":82,"author":{"gitId":"-"},"content":" private static final Author FIRST_AUTHOR \u003d new Author(\"nbriannl\");"},{"lineNumber":83,"author":{"gitId":"-"},"content":" private static final Author SECOND_AUTHOR \u003d new Author(\"zacharytang\");"},{"lineNumber":84,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e SECOND_AUTHOR_ALIASES \u003d Arrays.asList(\"Zachary Tang\");"},{"lineNumber":85,"author":{"gitId":"-"},"content":""},{"lineNumber":86,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e REPO_LEVEL_GLOB_LIST \u003d Arrays.asList(\"collated**\");"},{"lineNumber":87,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e FIRST_AUTHOR_GLOB_LIST \u003d Arrays.asList(\"**.java\", \"collated**\");"},{"lineNumber":88,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e SECOND_AUTHOR_GLOB_LIST \u003d Arrays.asList(\"**.doc\", \"collated**\");"},{"lineNumber":89,"author":{"gitId":"-"},"content":""},{"lineNumber":90,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":91,"author":{"gitId":"-"},"content":" public void repoConfig_noSpecialCharacter_success() throws Exception {"},{"lineNumber":92,"author":{"gitId":"-"},"content":" RepoConfigCsvParser repoConfigCsvParser \u003d new RepoConfigCsvParser(REPO_CONFIG_NO_SPECIAL_CHARACTER_FILE);"},{"lineNumber":93,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e configs \u003d repoConfigCsvParser.parse();"},{"lineNumber":94,"author":{"gitId":"-"},"content":""},{"lineNumber":95,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, configs.size());"},{"lineNumber":96,"author":{"gitId":"-"},"content":""},{"lineNumber":97,"author":{"gitId":"-"},"content":" RepoConfiguration config \u003d configs.get(0);"},{"lineNumber":98,"author":{"gitId":"-"},"content":""},{"lineNumber":99,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_BETA_LOCATION), config.getLocation());"},{"lineNumber":100,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_MASTER_BRANCH, config.getBranch());"},{"lineNumber":101,"author":{"gitId":"-"},"content":""},{"lineNumber":102,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_CONFIG_FORMATS, config.getFileTypeManager().getFormats());"},{"lineNumber":103,"author":{"gitId":"-"},"content":""},{"lineNumber":104,"author":{"gitId":"-"},"content":" Assertions.assertTrue(config.isStandaloneConfigIgnored());"},{"lineNumber":105,"author":{"gitId":"-"},"content":""},{"lineNumber":106,"author":{"gitId":"-"},"content":" Assertions.assertEquals(config.getIgnoreCommitList(),"},{"lineNumber":107,"author":{"gitId":"-"},"content":" CommitHash.convertStringsToCommits(TEST_REPO_BETA_CONFIG_IGNORED_COMMITS));"},{"lineNumber":108,"author":{"gitId":"-"},"content":" Assertions.assertEquals(config.getFileSizeLimit(), FILE_SIZE_LIMIT_VALUE);"},{"lineNumber":109,"author":{"gitId":"-"},"content":""},{"lineNumber":110,"author":{"gitId":"-"},"content":" Assertions.assertTrue(config.isShallowCloningPerformed());"},{"lineNumber":111,"author":{"gitId":"-"},"content":""},{"lineNumber":112,"author":{"gitId":"-"},"content":" Assertions.assertFalse(config.isFormatsOverriding());"},{"lineNumber":113,"author":{"gitId":"-"},"content":" Assertions.assertFalse(config.isIgnoreGlobListOverriding());"},{"lineNumber":114,"author":{"gitId":"-"},"content":" Assertions.assertFalse(config.isIgnoreCommitListOverriding());"},{"lineNumber":115,"author":{"gitId":"-"},"content":" Assertions.assertFalse(config.isFileSizeLimitOverriding());"},{"lineNumber":116,"author":{"gitId":"-"},"content":" Assertions.assertFalse(config.isFileSizeLimitIgnored());"},{"lineNumber":117,"author":{"gitId":"-"},"content":" Assertions.assertTrue(config.isIgnoredFileAnalysisSkipped());"},{"lineNumber":118,"author":{"gitId":"-"},"content":" }"},{"lineNumber":119,"author":{"gitId":"-"},"content":""},{"lineNumber":120,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":121,"author":{"gitId":"-"},"content":" public void merge_twoRepoConfigs_success() throws Exception {"},{"lineNumber":122,"author":{"gitId":"-"},"content":" FIRST_AUTHOR.setIgnoreGlobList(FIRST_AUTHOR_GLOB_LIST);"},{"lineNumber":123,"author":{"gitId":"-"},"content":" SECOND_AUTHOR.setIgnoreGlobList(SECOND_AUTHOR_GLOB_LIST);"},{"lineNumber":124,"author":{"gitId":"-"},"content":" SECOND_AUTHOR.setAuthorAliases(SECOND_AUTHOR_ALIASES);"},{"lineNumber":125,"author":{"gitId":"-"},"content":""},{"lineNumber":126,"author":{"gitId":"-"},"content":" List\u003cAuthor\u003e expectedAuthors \u003d new ArrayList\u003c\u003e();"},{"lineNumber":127,"author":{"gitId":"-"},"content":" expectedAuthors.add(FIRST_AUTHOR);"},{"lineNumber":128,"author":{"gitId":"-"},"content":" expectedAuthors.add(SECOND_AUTHOR);"},{"lineNumber":129,"author":{"gitId":"-"},"content":""},{"lineNumber":130,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration firstRepo \u003d new RepoConfiguration.Builder()"},{"lineNumber":131,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_BETA_LOCATION))"},{"lineNumber":132,"author":{"gitId":"asdfghjkxd"},"content":" .branch(TEST_REPO_BETA_MASTER_BRANCH)"},{"lineNumber":133,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":134,"author":{"gitId":"-"},"content":" firstRepo.setAuthorList(expectedAuthors);"},{"lineNumber":135,"author":{"gitId":"-"},"content":" firstRepo.setAuthorDisplayName(FIRST_AUTHOR, \"Nbr\");"},{"lineNumber":136,"author":{"gitId":"-"},"content":" firstRepo.setAuthorDisplayName(SECOND_AUTHOR, \"Zac\");"},{"lineNumber":137,"author":{"gitId":"-"},"content":" firstRepo.addAuthorNamesToAuthorMapEntry(SECOND_AUTHOR, Arrays.asList(\"Zachary Tang\"));"},{"lineNumber":138,"author":{"gitId":"-"},"content":" firstRepo.setIgnoreGlobList(REPO_LEVEL_GLOB_LIST);"},{"lineNumber":139,"author":{"gitId":"-"},"content":""},{"lineNumber":140,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration secondRepo \u003d new RepoConfiguration.Builder()"},{"lineNumber":141,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_BETA_LOCATION))"},{"lineNumber":142,"author":{"gitId":"asdfghjkxd"},"content":" .branch(TEST_REPO_BETA_ADD_CONFIG_JSON_BRANCH)"},{"lineNumber":143,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":144,"author":{"gitId":"-"},"content":" secondRepo.setAuthorList(Arrays.asList(SECOND_AUTHOR));"},{"lineNumber":145,"author":{"gitId":"-"},"content":" secondRepo.setAuthorDisplayName(SECOND_AUTHOR, \"Zac\");"},{"lineNumber":146,"author":{"gitId":"-"},"content":" secondRepo.addAuthorNamesToAuthorMapEntry(SECOND_AUTHOR, Arrays.asList(\"Zachary Tang\"));"},{"lineNumber":147,"author":{"gitId":"-"},"content":" secondRepo.setIgnoreGlobList(REPO_LEVEL_GLOB_LIST);"},{"lineNumber":148,"author":{"gitId":"-"},"content":""},{"lineNumber":149,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(TEST_CONFIG_FOLDER).build();"},{"lineNumber":150,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":151,"author":{"gitId":"-"},"content":""},{"lineNumber":152,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":153,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":154,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e authorConfigs \u003d"},{"lineNumber":155,"author":{"gitId":"-"},"content":" new AuthorConfigCsvParser(cliArguments.getAuthorConfigFilePath()).parse();"},{"lineNumber":156,"author":{"gitId":"-"},"content":" RepoConfiguration.merge(actualConfigs, authorConfigs);"},{"lineNumber":157,"author":{"gitId":"-"},"content":""},{"lineNumber":158,"author":{"gitId":"-"},"content":" Assertions.assertEquals(2, actualConfigs.size());"},{"lineNumber":159,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(firstRepo, actualConfigs.get(0));"},{"lineNumber":160,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(secondRepo, actualConfigs.get(1));"},{"lineNumber":161,"author":{"gitId":"-"},"content":" }"},{"lineNumber":162,"author":{"gitId":"-"},"content":""},{"lineNumber":163,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":164,"author":{"gitId":"-"},"content":" public void merge_emptyLocation_success() throws Exception {"},{"lineNumber":165,"author":{"gitId":"-"},"content":" FIRST_AUTHOR.setIgnoreGlobList(FIRST_AUTHOR_GLOB_LIST);"},{"lineNumber":166,"author":{"gitId":"-"},"content":" SECOND_AUTHOR.setIgnoreGlobList(REPO_LEVEL_GLOB_LIST);"},{"lineNumber":167,"author":{"gitId":"-"},"content":" SECOND_AUTHOR.setAuthorAliases(SECOND_AUTHOR_ALIASES);"},{"lineNumber":168,"author":{"gitId":"-"},"content":""},{"lineNumber":169,"author":{"gitId":"-"},"content":" List\u003cAuthor\u003e expectedBetaAuthors \u003d new ArrayList\u003c\u003e();"},{"lineNumber":170,"author":{"gitId":"-"},"content":" expectedBetaAuthors.add(FIRST_AUTHOR);"},{"lineNumber":171,"author":{"gitId":"-"},"content":" expectedBetaAuthors.add(SECOND_AUTHOR);"},{"lineNumber":172,"author":{"gitId":"-"},"content":""},{"lineNumber":173,"author":{"gitId":"-"},"content":" List\u003cAuthor\u003e expectedDeltaAuthors \u003d new ArrayList\u003c\u003e();"},{"lineNumber":174,"author":{"gitId":"-"},"content":" expectedDeltaAuthors.add(FIRST_AUTHOR);"},{"lineNumber":175,"author":{"gitId":"-"},"content":""},{"lineNumber":176,"author":{"gitId":"-"},"content":" RepoConfiguration expectedBetaConfig \u003d"},{"lineNumber":177,"author":{"gitId":"asdfghjkxd"},"content":" new RepoConfiguration.Builder()"},{"lineNumber":178,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_BETA_LOCATION))"},{"lineNumber":179,"author":{"gitId":"asdfghjkxd"},"content":" .branch(TEST_REPO_BETA_MASTER_BRANCH)"},{"lineNumber":180,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":181,"author":{"gitId":"-"},"content":" expectedBetaConfig.setAuthorList(expectedBetaAuthors);"},{"lineNumber":182,"author":{"gitId":"-"},"content":" expectedBetaConfig.setAuthorDisplayName(FIRST_AUTHOR, \"Nbr\");"},{"lineNumber":183,"author":{"gitId":"-"},"content":" expectedBetaConfig.setAuthorDisplayName(SECOND_AUTHOR, \"Zac\");"},{"lineNumber":184,"author":{"gitId":"-"},"content":" expectedBetaConfig.addAuthorNamesToAuthorMapEntry(SECOND_AUTHOR, Arrays.asList(\"Zachary Tang\"));"},{"lineNumber":185,"author":{"gitId":"-"},"content":" expectedBetaConfig.setIgnoreGlobList(REPO_LEVEL_GLOB_LIST);"},{"lineNumber":186,"author":{"gitId":"-"},"content":" expectedBetaConfig.setIsShallowCloningPerformed(true);"},{"lineNumber":187,"author":{"gitId":"-"},"content":""},{"lineNumber":188,"author":{"gitId":"-"},"content":" RepoConfiguration expectedDeltaConfig \u003d"},{"lineNumber":189,"author":{"gitId":"asdfghjkxd"},"content":" new RepoConfiguration.Builder()"},{"lineNumber":190,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA_LOCATION))"},{"lineNumber":191,"author":{"gitId":"asdfghjkxd"},"content":" .branch(TEST_REPO_DELTA_BRANCH)"},{"lineNumber":192,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":193,"author":{"gitId":"-"},"content":" expectedDeltaConfig.setAuthorList(expectedDeltaAuthors);"},{"lineNumber":194,"author":{"gitId":"-"},"content":" expectedDeltaConfig.setAuthorDisplayName(FIRST_AUTHOR, \"Nbr\");"},{"lineNumber":195,"author":{"gitId":"-"},"content":" expectedDeltaConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":196,"author":{"gitId":"-"},"content":" expectedDeltaConfig.setFormats(TEST_REPO_DELTA_FORMATS);"},{"lineNumber":197,"author":{"gitId":"-"},"content":""},{"lineNumber":198,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e expectedConfigs \u003d new ArrayList\u003c\u003e();"},{"lineNumber":199,"author":{"gitId":"-"},"content":" expectedConfigs.add(expectedBetaConfig);"},{"lineNumber":200,"author":{"gitId":"-"},"content":" expectedConfigs.add(expectedDeltaConfig);"},{"lineNumber":201,"author":{"gitId":"-"},"content":""},{"lineNumber":202,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(MERGE_EMPTY_LOCATION_FOLDER).build();"},{"lineNumber":203,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":204,"author":{"gitId":"-"},"content":""},{"lineNumber":205,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":206,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":207,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e authorConfigs \u003d"},{"lineNumber":208,"author":{"gitId":"-"},"content":" new AuthorConfigCsvParser(cliArguments.getAuthorConfigFilePath()).parse();"},{"lineNumber":209,"author":{"gitId":"-"},"content":" RepoConfiguration.merge(actualConfigs, authorConfigs);"},{"lineNumber":210,"author":{"gitId":"-"},"content":""},{"lineNumber":211,"author":{"gitId":"-"},"content":" Assertions.assertEquals(2, actualConfigs.size());"},{"lineNumber":212,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedConfigs, actualConfigs);"},{"lineNumber":213,"author":{"gitId":"-"},"content":""},{"lineNumber":214,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(expectedConfigs.get(0), actualConfigs.get(0));"},{"lineNumber":215,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(expectedConfigs.get(1), actualConfigs.get(1));"},{"lineNumber":216,"author":{"gitId":"-"},"content":" }"},{"lineNumber":217,"author":{"gitId":"-"},"content":""},{"lineNumber":218,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":219,"author":{"gitId":"-"},"content":" public void repoConfig_defaultBranch_success() throws Exception {"},{"lineNumber":220,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration expectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":221,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_BETA_LOCATION))"},{"lineNumber":222,"author":{"gitId":"asdfghjkxd"},"content":" .branch(RepoConfiguration.DEFAULT_BRANCH)"},{"lineNumber":223,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":224,"author":{"gitId":"-"},"content":""},{"lineNumber":225,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(TEST_EMPTY_BRANCH_CONFIG_FOLDER).build();"},{"lineNumber":226,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":227,"author":{"gitId":"-"},"content":""},{"lineNumber":228,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":229,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":230,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e authorConfigs \u003d"},{"lineNumber":231,"author":{"gitId":"-"},"content":" new AuthorConfigCsvParser(cliArguments.getAuthorConfigFilePath()).parse();"},{"lineNumber":232,"author":{"gitId":"-"},"content":" RepoConfiguration.merge(actualConfigs, authorConfigs);"},{"lineNumber":233,"author":{"gitId":"-"},"content":""},{"lineNumber":234,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, actualConfigs.size());"},{"lineNumber":235,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedConfig.getBranch(), actualConfigs.get(0).getBranch());"},{"lineNumber":236,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedConfig.getBranch(), authorConfigs.get(0).getBranch());"},{"lineNumber":237,"author":{"gitId":"-"},"content":" }"},{"lineNumber":238,"author":{"gitId":"-"},"content":""},{"lineNumber":239,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":240,"author":{"gitId":"-"},"content":" public void repoConfig_overrideKeyword_success() throws Exception {"},{"lineNumber":241,"author":{"gitId":"-"},"content":" RepoConfigCsvParser repoConfigCsvParser \u003d new RepoConfigCsvParser(REPO_CONFIG_OVERRIDE_KEYWORD_FILE);"},{"lineNumber":242,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e configs \u003d repoConfigCsvParser.parse();"},{"lineNumber":243,"author":{"gitId":"-"},"content":" RepoConfiguration config \u003d configs.get(0);"},{"lineNumber":244,"author":{"gitId":"-"},"content":""},{"lineNumber":245,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, configs.size());"},{"lineNumber":246,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_BETA_LOCATION), config.getLocation());"},{"lineNumber":247,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_MASTER_BRANCH, config.getBranch());"},{"lineNumber":248,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_CONFIG_FORMATS, config.getFileTypeManager().getFormats());"},{"lineNumber":249,"author":{"gitId":"-"},"content":" Assertions.assertFalse(config.isStandaloneConfigIgnored());"},{"lineNumber":250,"author":{"gitId":"-"},"content":" Assertions.assertEquals(CommitHash.convertStringsToCommits(TEST_REPO_BETA_CONFIG_IGNORED_COMMITS),"},{"lineNumber":251,"author":{"gitId":"-"},"content":" config.getIgnoreCommitList());"},{"lineNumber":252,"author":{"gitId":"-"},"content":" Assertions.assertEquals(FILE_SIZE_LIMIT_VALUE, config.getFileSizeLimit());"},{"lineNumber":253,"author":{"gitId":"-"},"content":""},{"lineNumber":254,"author":{"gitId":"-"},"content":" Assertions.assertTrue(config.isFormatsOverriding());"},{"lineNumber":255,"author":{"gitId":"-"},"content":" Assertions.assertTrue(config.isIgnoreGlobListOverriding());"},{"lineNumber":256,"author":{"gitId":"-"},"content":" Assertions.assertTrue(config.isIgnoreCommitListOverriding());"},{"lineNumber":257,"author":{"gitId":"-"},"content":" Assertions.assertTrue(config.isFileSizeLimitOverriding());"},{"lineNumber":258,"author":{"gitId":"-"},"content":" }"},{"lineNumber":259,"author":{"gitId":"-"},"content":""},{"lineNumber":260,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":261,"author":{"gitId":"-"},"content":" public void repoConfig_redundantLines_success() throws Exception {"},{"lineNumber":262,"author":{"gitId":"-"},"content":" RepoConfigCsvParser repoConfigCsvParser \u003d new RepoConfigCsvParser(REPO_CONFIG_REDUNDANT_LINES_FILE);"},{"lineNumber":263,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e configs \u003d repoConfigCsvParser.parse();"},{"lineNumber":264,"author":{"gitId":"-"},"content":""},{"lineNumber":265,"author":{"gitId":"-"},"content":" Assertions.assertEquals(3, configs.size());"},{"lineNumber":266,"author":{"gitId":"-"},"content":" RepoConfiguration betaConfig \u003d configs.get(0);"},{"lineNumber":267,"author":{"gitId":"-"},"content":" RepoConfiguration charlieConfig \u003d configs.get(1);"},{"lineNumber":268,"author":{"gitId":"-"},"content":" RepoConfiguration deltaConfig \u003d configs.get(2);"},{"lineNumber":269,"author":{"gitId":"-"},"content":""},{"lineNumber":270,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_BETA_LOCATION), betaConfig.getLocation());"},{"lineNumber":271,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_MASTER_BRANCH, betaConfig.getBranch());"},{"lineNumber":272,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_CHARLIE_LOCATION), charlieConfig.getLocation());"},{"lineNumber":273,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_CHARLIE_BRANCH, charlieConfig.getBranch());"},{"lineNumber":274,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_DELTA_LOCATION), deltaConfig.getLocation());"},{"lineNumber":275,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_DELTA_BRANCH, deltaConfig.getBranch());"},{"lineNumber":276,"author":{"gitId":"-"},"content":" Assertions.assertTrue(deltaConfig.isStandaloneConfigIgnored());"},{"lineNumber":277,"author":{"gitId":"-"},"content":" }"},{"lineNumber":278,"author":{"gitId":"-"},"content":""},{"lineNumber":279,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":280,"author":{"gitId":"-"},"content":" public void repoConfig_differentColumnOrder_success() throws Exception {"},{"lineNumber":281,"author":{"gitId":"-"},"content":" RepoConfigCsvParser repoConfigCsvParser \u003d new RepoConfigCsvParser(REPO_CONFIG_DIFFERENT_COLUMN_ORDER_FILE);"},{"lineNumber":282,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e configs \u003d repoConfigCsvParser.parse();"},{"lineNumber":283,"author":{"gitId":"-"},"content":""},{"lineNumber":284,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, configs.size());"},{"lineNumber":285,"author":{"gitId":"-"},"content":""},{"lineNumber":286,"author":{"gitId":"-"},"content":" RepoConfiguration config \u003d configs.get(0);"},{"lineNumber":287,"author":{"gitId":"-"},"content":""},{"lineNumber":288,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_BETA_LOCATION), config.getLocation());"},{"lineNumber":289,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_MASTER_BRANCH, config.getBranch());"},{"lineNumber":290,"author":{"gitId":"-"},"content":""},{"lineNumber":291,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_CONFIG_FORMATS, config.getFileTypeManager().getFormats());"},{"lineNumber":292,"author":{"gitId":"-"},"content":""},{"lineNumber":293,"author":{"gitId":"-"},"content":" Assertions.assertTrue(config.isStandaloneConfigIgnored());"},{"lineNumber":294,"author":{"gitId":"-"},"content":""},{"lineNumber":295,"author":{"gitId":"-"},"content":" Assertions.assertEquals(config.getIgnoreCommitList(),"},{"lineNumber":296,"author":{"gitId":"-"},"content":" CommitHash.convertStringsToCommits(TEST_REPO_BETA_CONFIG_IGNORED_COMMITS));"},{"lineNumber":297,"author":{"gitId":"-"},"content":""},{"lineNumber":298,"author":{"gitId":"-"},"content":" Assertions.assertFalse(config.isFormatsOverriding());"},{"lineNumber":299,"author":{"gitId":"-"},"content":" Assertions.assertFalse(config.isIgnoreGlobListOverriding());"},{"lineNumber":300,"author":{"gitId":"-"},"content":" Assertions.assertFalse(config.isIgnoreCommitListOverriding());"},{"lineNumber":301,"author":{"gitId":"-"},"content":" }"},{"lineNumber":302,"author":{"gitId":"-"},"content":""},{"lineNumber":303,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":304,"author":{"gitId":"-"},"content":" public void repoConfig_missingOptionalHeader_success() throws Exception {"},{"lineNumber":305,"author":{"gitId":"-"},"content":" RepoConfigCsvParser repoConfigCsvParser \u003d new RepoConfigCsvParser(REPO_CONFIG_OPTIONAL_HEADER_MISSING_FILE);"},{"lineNumber":306,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e configs \u003d repoConfigCsvParser.parse();"},{"lineNumber":307,"author":{"gitId":"-"},"content":""},{"lineNumber":308,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, configs.size());"},{"lineNumber":309,"author":{"gitId":"-"},"content":""},{"lineNumber":310,"author":{"gitId":"-"},"content":" RepoConfiguration config \u003d configs.get(0);"},{"lineNumber":311,"author":{"gitId":"-"},"content":""},{"lineNumber":312,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_BETA_LOCATION), config.getLocation());"},{"lineNumber":313,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_MASTER_BRANCH, config.getBranch());"},{"lineNumber":314,"author":{"gitId":"-"},"content":""},{"lineNumber":315,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_CONFIG_FORMATS, config.getFileTypeManager().getFormats());"},{"lineNumber":316,"author":{"gitId":"-"},"content":" Assertions.assertEquals(DEFAULT_FILE_SIZE_LIMIT, config.getFileSizeLimit());"},{"lineNumber":317,"author":{"gitId":"-"},"content":""},{"lineNumber":318,"author":{"gitId":"-"},"content":" Assertions.assertTrue(config.isStandaloneConfigIgnored());"},{"lineNumber":319,"author":{"gitId":"-"},"content":""},{"lineNumber":320,"author":{"gitId":"-"},"content":" Assertions.assertFalse(config.isFormatsOverriding());"},{"lineNumber":321,"author":{"gitId":"-"},"content":" Assertions.assertFalse(config.isIgnoreGlobListOverriding());"},{"lineNumber":322,"author":{"gitId":"-"},"content":" Assertions.assertFalse(config.isIgnoreCommitListOverriding());"},{"lineNumber":323,"author":{"gitId":"-"},"content":" Assertions.assertFalse(config.isFileSizeLimitOverriding());"},{"lineNumber":324,"author":{"gitId":"-"},"content":" }"},{"lineNumber":325,"author":{"gitId":"-"},"content":""},{"lineNumber":326,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":327,"author":{"gitId":"-"},"content":" public void repoConfig_withUnrecognizedValuesForYesKeywordHeaders_valuesIgnored() throws Exception {"},{"lineNumber":328,"author":{"gitId":"-"},"content":" RepoConfigCsvParser repoConfigCsvParser \u003d"},{"lineNumber":329,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(REPO_CONFIG_UNRECOGNIZED_VALUES_FOR_YES_KEYWORD_HEADERS_FILE);"},{"lineNumber":330,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e configs \u003d repoConfigCsvParser.parse();"},{"lineNumber":331,"author":{"gitId":"-"},"content":""},{"lineNumber":332,"author":{"gitId":"-"},"content":" Assertions.assertFalse(configs.get(0).isStandaloneConfigIgnored());"},{"lineNumber":333,"author":{"gitId":"-"},"content":" Assertions.assertFalse(configs.get(0).isShallowCloningPerformed());"},{"lineNumber":334,"author":{"gitId":"-"},"content":" Assertions.assertFalse(configs.get(0).isFindingPreviousAuthorsPerformed());"},{"lineNumber":335,"author":{"gitId":"-"},"content":" Assertions.assertFalse(configs.get(0).isFileSizeLimitIgnored());"},{"lineNumber":336,"author":{"gitId":"-"},"content":" Assertions.assertFalse(configs.get(0).isIgnoredFileAnalysisSkipped());"},{"lineNumber":337,"author":{"gitId":"-"},"content":" }"},{"lineNumber":338,"author":{"gitId":"-"},"content":""},{"lineNumber":339,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":340,"author":{"gitId":"-"},"content":" public void repoConfig_invalidFileSizeLimit_valueIgnored() throws Exception {"},{"lineNumber":341,"author":{"gitId":"-"},"content":" RepoConfigCsvParser repoConfigCsvParser \u003d"},{"lineNumber":342,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(REPO_CONFIG_INVALID_FILE_SIZE_LIMIT);"},{"lineNumber":343,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e configs \u003d repoConfigCsvParser.parse();"},{"lineNumber":344,"author":{"gitId":"-"},"content":""},{"lineNumber":345,"author":{"gitId":"-"},"content":" Assertions.assertEquals(configs.get(0).getFileSizeLimit(), DEFAULT_FILE_SIZE_LIMIT);"},{"lineNumber":346,"author":{"gitId":"-"},"content":" Assertions.assertFalse(configs.get(0).isFileSizeLimitOverriding());"},{"lineNumber":347,"author":{"gitId":"-"},"content":" }"},{"lineNumber":348,"author":{"gitId":"-"},"content":""},{"lineNumber":349,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":350,"author":{"gitId":"-"},"content":" public void repoConfig_ignoreFileSizeLimit_ignoreFileSizeColumns() throws Exception {"},{"lineNumber":351,"author":{"gitId":"-"},"content":" RepoConfigCsvParser repoConfigCsvParser \u003d"},{"lineNumber":352,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(REPO_CONFIG_IGNORE_FILE_SIZE_LIMIT);"},{"lineNumber":353,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e configs \u003d repoConfigCsvParser.parse();"},{"lineNumber":354,"author":{"gitId":"-"},"content":""},{"lineNumber":355,"author":{"gitId":"-"},"content":" Assertions.assertTrue(configs.get(0).isFileSizeLimitIgnored());"},{"lineNumber":356,"author":{"gitId":"-"},"content":" Assertions.assertFalse(configs.get(0).isFileSizeLimitOverriding());"},{"lineNumber":357,"author":{"gitId":"-"},"content":" Assertions.assertFalse(configs.get(0).isIgnoredFileAnalysisSkipped());"},{"lineNumber":358,"author":{"gitId":"-"},"content":" }"},{"lineNumber":359,"author":{"gitId":"-"},"content":""},{"lineNumber":360,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":361,"author":{"gitId":"-"},"content":" public void repoConfig_mandatoryHeaderMissing_throwsInvalidCsvException() throws Exception {"},{"lineNumber":362,"author":{"gitId":"-"},"content":" RepoConfigCsvParser repoConfigCsvParser \u003d new RepoConfigCsvParser(REPO_CONFIG_MANDATORY_HEADER_MISSING_FILE);"},{"lineNumber":363,"author":{"gitId":"-"},"content":" Assertions.assertThrows(InvalidCsvException.class, () -\u003e repoConfigCsvParser.parse());"},{"lineNumber":364,"author":{"gitId":"-"},"content":" }"},{"lineNumber":365,"author":{"gitId":"-"},"content":""},{"lineNumber":366,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":367,"author":{"gitId":"-"},"content":" public void repoConfig_zeroValidRecords_throwsInvalidCsvException() throws Exception {"},{"lineNumber":368,"author":{"gitId":"-"},"content":" RepoConfigCsvParser repoConfigCsvParser \u003d new RepoConfigCsvParser(REPO_CONFIG_ZERO_VALID_RECORDS);"},{"lineNumber":369,"author":{"gitId":"-"},"content":" Assertions.assertThrows(InvalidCsvException.class, () -\u003e repoConfigCsvParser.parse());"},{"lineNumber":370,"author":{"gitId":"-"},"content":" }"},{"lineNumber":371,"author":{"gitId":"-"},"content":""},{"lineNumber":372,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":373,"author":{"gitId":"-"},"content":" public void repoConfig_duplicateHeadersCaseSensitive_throwsInvalidCsvException() throws Exception {"},{"lineNumber":374,"author":{"gitId":"-"},"content":" RepoConfigCsvParser repoConfigCsvParser \u003d"},{"lineNumber":375,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(REPO_CONFIG_DUPLICATE_HEADERS_CASE_SENSITIVE_FILE);"},{"lineNumber":376,"author":{"gitId":"-"},"content":" Assertions.assertThrows(InvalidCsvException.class, () -\u003e repoConfigCsvParser.parse());"},{"lineNumber":377,"author":{"gitId":"-"},"content":" }"},{"lineNumber":378,"author":{"gitId":"-"},"content":""},{"lineNumber":379,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":380,"author":{"gitId":"-"},"content":" public void repoConfig_duplicateHeadersCaseInsensitive_throwsInvalidCsvException() throws Exception {"},{"lineNumber":381,"author":{"gitId":"-"},"content":" RepoConfigCsvParser repoConfigCsvParser \u003d"},{"lineNumber":382,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(REPO_CONFIG_DUPLICATE_HEADERS_CASE_INSENSITIVE_FILE);"},{"lineNumber":383,"author":{"gitId":"-"},"content":" Assertions.assertThrows(InvalidCsvException.class, () -\u003e repoConfigCsvParser.parse());"},{"lineNumber":384,"author":{"gitId":"-"},"content":" }"},{"lineNumber":385,"author":{"gitId":"-"},"content":""},{"lineNumber":386,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":387,"author":{"gitId":"-"},"content":" public void repoConfig_unknownHeaders_throwsInvalidHeaderException() throws Exception {"},{"lineNumber":388,"author":{"gitId":"-"},"content":" RepoConfigCsvParser repoConfigCsvParser \u003d"},{"lineNumber":389,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(REPO_CONFIG_UNKNOWN_HEADER_FILE);"},{"lineNumber":390,"author":{"gitId":"-"},"content":" Assertions.assertThrows(InvalidHeaderException.class, () -\u003e repoConfigCsvParser.parse());"},{"lineNumber":391,"author":{"gitId":"-"},"content":" }"},{"lineNumber":392,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":22,"-":370}},{"path":"src/test/java/reposense/parser/StandaloneConfigJsonParserTest.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.parser;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static reposense.util.TestUtil.loadResource;"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Arrays;"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assertions;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeAll;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"import com.google.gson.JsonSyntaxException;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"import reposense.model.Author;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import reposense.model.CommitHash;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import reposense.model.FileType;"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import reposense.model.FileTypeTest;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import reposense.model.RepoConfiguration;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import reposense.model.RepoLocation;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import reposense.model.StandaloneConfig;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import reposense.util.TestUtil;"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":"public class StandaloneConfigJsonParserTest {"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final Path STANDALONE_MALFORMED_CONFIG \u003d loadResource("},{"lineNumber":26,"author":{"gitId":"-"},"content":" StandaloneConfigJsonParserTest.class, \"StandaloneConfigJsonParserTest/standaloneConfig_malformedJson.json\");"},{"lineNumber":27,"author":{"gitId":"-"},"content":""},{"lineNumber":28,"author":{"gitId":"-"},"content":" private static final Path STANDALONE_UNKNOWN_PROPERTY_CONFIG \u003d loadResource("},{"lineNumber":29,"author":{"gitId":"-"},"content":" StandaloneConfigJsonParserTest.class,"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \"StandaloneConfigJsonParserTest/standaloneConfig_unknownPropertyInJson.json\");"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final Path STANDALONE_CONFIG_FULL \u003d loadResource("},{"lineNumber":33,"author":{"gitId":"-"},"content":" StandaloneConfigJsonParserTest.class,"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \"StandaloneConfigJsonParserTest/standaloneConfig_full.json\");"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":" private static final Path STANDALONE_CONFIG_EMPTY_TEXT_FILE \u003d loadResource("},{"lineNumber":37,"author":{"gitId":"-"},"content":" StandaloneConfigJsonParserTest.class,"},{"lineNumber":38,"author":{"gitId":"-"},"content":" \"StandaloneConfigJsonParserTest/standaloneConfig_emptyText.json\");"},{"lineNumber":39,"author":{"gitId":"-"},"content":""},{"lineNumber":40,"author":{"gitId":"-"},"content":" private static final Path STANDALONE_CONFIG_EMPTY_JSON_FILE \u003d loadResource("},{"lineNumber":41,"author":{"gitId":"-"},"content":" StandaloneConfigJsonParserTest.class,"},{"lineNumber":42,"author":{"gitId":"-"},"content":" \"StandaloneConfigJsonParserTest/standaloneConfig_emptyJson.json\");"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":" private static final Path STANDALONE_CONFIG_GITHUBID_ONLY \u003d loadResource("},{"lineNumber":45,"author":{"gitId":"-"},"content":" StandaloneConfigJsonParserTest.class,"},{"lineNumber":46,"author":{"gitId":"-"},"content":" \"StandaloneConfigJsonParserTest/standaloneConfig_githubId_only.json\");"},{"lineNumber":47,"author":{"gitId":"-"},"content":""},{"lineNumber":48,"author":{"gitId":"-"},"content":" private static final String TEST_DUMMY_LOCATION \u003d \"https://github.com/reposense/RepoSense.git\";"},{"lineNumber":49,"author":{"gitId":"-"},"content":""},{"lineNumber":50,"author":{"gitId":"-"},"content":" private static RepoConfiguration expectedGithubIdOnlyRepoconfig;"},{"lineNumber":51,"author":{"gitId":"-"},"content":" private static RepoConfiguration expectedFullRepoConfig;"},{"lineNumber":52,"author":{"gitId":"-"},"content":""},{"lineNumber":53,"author":{"gitId":"-"},"content":" @BeforeAll"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public static void setUp() throws Exception {"},{"lineNumber":55,"author":{"gitId":"-"},"content":" Author author \u003d new Author(\"yong24s\");"},{"lineNumber":56,"author":{"gitId":"-"},"content":" author.setAuthorAliases(Arrays.asList(\"Yong Hao TENG\"));"},{"lineNumber":57,"author":{"gitId":"-"},"content":" author.setIgnoreGlobList(Arrays.asList(\"**.css\", \"**.html\", \"**.jade\", \"**.js\"));"},{"lineNumber":58,"author":{"gitId":"-"},"content":""},{"lineNumber":59,"author":{"gitId":"asdfghjkxd"},"content":" expectedGithubIdOnlyRepoconfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":60,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_DUMMY_LOCATION)).build();"},{"lineNumber":61,"author":{"gitId":"-"},"content":" expectedGithubIdOnlyRepoconfig.setFormats(FileTypeTest.NO_SPECIFIED_FORMATS);"},{"lineNumber":62,"author":{"gitId":"-"},"content":" expectedGithubIdOnlyRepoconfig.setAuthorList(Arrays.asList(new Author(\"yong24s\")));"},{"lineNumber":63,"author":{"gitId":"-"},"content":" expectedGithubIdOnlyRepoconfig.addAuthorEmailsToAuthorMapEntry(author, author.getEmails());"},{"lineNumber":64,"author":{"gitId":"-"},"content":""},{"lineNumber":65,"author":{"gitId":"asdfghjkxd"},"content":" expectedFullRepoConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":66,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_DUMMY_LOCATION)).build();"},{"lineNumber":67,"author":{"gitId":"-"},"content":" expectedFullRepoConfig.setFormats(FileType.convertFormatStringsToFileTypes("},{"lineNumber":68,"author":{"gitId":"-"},"content":" Arrays.asList(\"gradle\", \"jade\", \"java\", \"js\", \"md\", \"scss\", \"yml\")));"},{"lineNumber":69,"author":{"gitId":"-"},"content":" expectedFullRepoConfig.setIgnoreCommitList(Arrays.asList(new CommitHash("},{"lineNumber":70,"author":{"gitId":"-"},"content":" \"7b96c563eb2d3612aa5275364333664a18f01491\")));"},{"lineNumber":71,"author":{"gitId":"-"},"content":" expectedFullRepoConfig.setIgnoreGlobList(Arrays.asList(\"**.adoc\", \"collate**\"));"},{"lineNumber":72,"author":{"gitId":"-"},"content":" expectedFullRepoConfig.setIgnoredAuthorsList(Arrays.asList(\"yong24s\"));"},{"lineNumber":73,"author":{"gitId":"-"},"content":" expectedFullRepoConfig.setAuthorList(Arrays.asList(author));"},{"lineNumber":74,"author":{"gitId":"-"},"content":" expectedFullRepoConfig.setAuthorDisplayName(author, \"Yong Hao\");"},{"lineNumber":75,"author":{"gitId":"-"},"content":" expectedFullRepoConfig.addAuthorNamesToAuthorMapEntry(author, Arrays.asList(author.getGitId()));"},{"lineNumber":76,"author":{"gitId":"-"},"content":" expectedFullRepoConfig.addAuthorNamesToAuthorMapEntry(author, author.getAuthorAliases());"},{"lineNumber":77,"author":{"gitId":"-"},"content":" expectedFullRepoConfig.addAuthorEmailsToAuthorMapEntry(author, author.getEmails());"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }"},{"lineNumber":79,"author":{"gitId":"-"},"content":""},{"lineNumber":80,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public void standaloneConfig_parseEmptyTextFile_success() throws Exception {"},{"lineNumber":82,"author":{"gitId":"-"},"content":" new StandaloneConfigJsonParser().parse(STANDALONE_CONFIG_EMPTY_TEXT_FILE);"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }"},{"lineNumber":84,"author":{"gitId":"-"},"content":""},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void standaloneConfig_parseEmptyJsonFile_success() throws Exception {"},{"lineNumber":87,"author":{"gitId":"-"},"content":" new StandaloneConfigJsonParser().parse(STANDALONE_CONFIG_EMPTY_JSON_FILE);"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }"},{"lineNumber":89,"author":{"gitId":"-"},"content":""},{"lineNumber":90,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":91,"author":{"gitId":"-"},"content":" public void standaloneConfig_ignoresUnknownProperty_success() throws Exception {"},{"lineNumber":92,"author":{"gitId":"-"},"content":" new StandaloneConfigJsonParser().parse(STANDALONE_UNKNOWN_PROPERTY_CONFIG);"},{"lineNumber":93,"author":{"gitId":"-"},"content":" }"},{"lineNumber":94,"author":{"gitId":"-"},"content":""},{"lineNumber":95,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":96,"author":{"gitId":"-"},"content":" public void standaloneConfig_correctConfig_success() throws Exception {"},{"lineNumber":97,"author":{"gitId":"-"},"content":" StandaloneConfig config \u003d new StandaloneConfigJsonParser().parse(STANDALONE_CONFIG_FULL);"},{"lineNumber":98,"author":{"gitId":"-"},"content":" assertSameConfig(expectedFullRepoConfig, config);"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }"},{"lineNumber":100,"author":{"gitId":"-"},"content":""},{"lineNumber":101,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":102,"author":{"gitId":"-"},"content":" public void standaloneConfig_githubIdOnlyConfig_success() throws Exception {"},{"lineNumber":103,"author":{"gitId":"-"},"content":" StandaloneConfig config \u003d new StandaloneConfigJsonParser().parse(STANDALONE_CONFIG_GITHUBID_ONLY);"},{"lineNumber":104,"author":{"gitId":"-"},"content":" assertSameConfig(expectedGithubIdOnlyRepoconfig, config);"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }"},{"lineNumber":106,"author":{"gitId":"-"},"content":""},{"lineNumber":107,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":108,"author":{"gitId":"-"},"content":" public void standaloneConfig_malformedJsonFile_throwsJsonSyntaxException() {"},{"lineNumber":109,"author":{"gitId":"-"},"content":" Assertions.assertThrows(JsonSyntaxException.class, () -\u003e new StandaloneConfigJsonParser()"},{"lineNumber":110,"author":{"gitId":"-"},"content":" .parse(STANDALONE_MALFORMED_CONFIG));"},{"lineNumber":111,"author":{"gitId":"-"},"content":" }"},{"lineNumber":112,"author":{"gitId":"-"},"content":""},{"lineNumber":113,"author":{"gitId":"-"},"content":" private void assertSameConfig(RepoConfiguration expectedRepoConfig, StandaloneConfig actualStandaloneConfig)"},{"lineNumber":114,"author":{"gitId":"-"},"content":" throws Exception {"},{"lineNumber":115,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration actualRepoConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":116,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_DUMMY_LOCATION)).build();"},{"lineNumber":117,"author":{"gitId":"-"},"content":" actualRepoConfig.update(actualStandaloneConfig);"},{"lineNumber":118,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(expectedRepoConfig, actualRepoConfig);"},{"lineNumber":119,"author":{"gitId":"-"},"content":" }"},{"lineNumber":120,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":6,"-":114}},{"path":"src/test/java/reposense/report/ErrorSummaryTest.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.report;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assertions;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"import reposense.model.RepoLocation;"},{"lineNumber":7,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidLocationException;"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"public class ErrorSummaryTest {"},{"lineNumber":10,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":11,"author":{"gitId":"-"},"content":" public void errorSummary_addRepeatedErrorMessage_containsNoDuplicates() {"},{"lineNumber":12,"author":{"gitId":"-"},"content":" String invalidLocation1 \u003d \"ttp://github.com/reposense.RepoSense.git\";"},{"lineNumber":13,"author":{"gitId":"-"},"content":" String invalidLocation2 \u003d \"https://github.com/contains-illegal-chars/^\\\\/\";"},{"lineNumber":14,"author":{"gitId":"-"},"content":" String invalidLocation3 \u003d \"not-valid-protocol://abc.com/reposense/RepoSense.git\";"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":" ErrorSummary errorSummaryInstance \u003d ErrorSummary.getInstance();"},{"lineNumber":17,"author":{"gitId":"-"},"content":" errorSummaryInstance.clearErrorSet();"},{"lineNumber":18,"author":{"gitId":"-"},"content":""},{"lineNumber":19,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":20,"author":{"gitId":"-"},"content":" new RepoLocation(invalidLocation1);"},{"lineNumber":21,"author":{"gitId":"-"},"content":" } catch (InvalidLocationException e) {"},{"lineNumber":22,"author":{"gitId":"-"},"content":" // not relevant to the test"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }"},{"lineNumber":24,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, errorSummaryInstance.getErrorSet().size());"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":27,"author":{"gitId":"-"},"content":" new RepoLocation(invalidLocation1);"},{"lineNumber":28,"author":{"gitId":"-"},"content":" } catch (InvalidLocationException e) {"},{"lineNumber":29,"author":{"gitId":"-"},"content":" // not relevant to the test"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }"},{"lineNumber":31,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, errorSummaryInstance.getErrorSet().size());"},{"lineNumber":32,"author":{"gitId":"-"},"content":""},{"lineNumber":33,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":34,"author":{"gitId":"-"},"content":" new RepoLocation(invalidLocation2);"},{"lineNumber":35,"author":{"gitId":"-"},"content":" } catch (InvalidLocationException e) {"},{"lineNumber":36,"author":{"gitId":"-"},"content":" // not relevant to the test"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }"},{"lineNumber":38,"author":{"gitId":"-"},"content":" Assertions.assertEquals(2, errorSummaryInstance.getErrorSet().size());"},{"lineNumber":39,"author":{"gitId":"-"},"content":""},{"lineNumber":40,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":41,"author":{"gitId":"-"},"content":" new RepoLocation(invalidLocation1);"},{"lineNumber":42,"author":{"gitId":"-"},"content":" } catch (InvalidLocationException e) {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // not relevant to the test"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }"},{"lineNumber":45,"author":{"gitId":"-"},"content":" Assertions.assertEquals(2, errorSummaryInstance.getErrorSet().size());"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":48,"author":{"gitId":"-"},"content":" new RepoLocation(invalidLocation3);"},{"lineNumber":49,"author":{"gitId":"-"},"content":" } catch (InvalidLocationException e) {"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // not relevant to the test"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }"},{"lineNumber":52,"author":{"gitId":"-"},"content":" Assertions.assertEquals(3, errorSummaryInstance.getErrorSet().size());"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }"},{"lineNumber":54,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":53}},{"path":"src/test/java/reposense/report/RepoClonerTest.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.report;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Files;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assertions;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"import reposense.model.RepoConfiguration;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import reposense.model.RepoLocation;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import reposense.util.FileUtil;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import reposense.util.TestRepoCloner;"},{"lineNumber":14,"author":{"gitId":"-"},"content":""},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class RepoClonerTest {"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_EMPTY_GIT_LOCATION \u003d \"https://github.com/reposense/testrepo-Empty.git\";"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_GIT_LOCATION \u003d \"https://github.com/reposense/testrepo-Alpha.git\";"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private static final Path REPOCLONE_LOCAL_TEST_PATH \u003d"},{"lineNumber":20,"author":{"gitId":"-"},"content":" Paths.get(FileUtil.REPOS_ADDRESS, \"repoclone test/dummy-repo\");"},{"lineNumber":21,"author":{"gitId":"-"},"content":""},{"lineNumber":22,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public void repoCloner_emptyRepo_failsGracefully() throws Exception {"},{"lineNumber":24,"author":{"gitId":"-"},"content":" RepoConfiguration emptyRepositoryRepoConfig \u003d"},{"lineNumber":25,"author":{"gitId":"asdfghjkxd"},"content":" new RepoConfiguration.Builder()"},{"lineNumber":26,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_EMPTY_GIT_LOCATION)).build();"},{"lineNumber":27,"author":{"gitId":"-"},"content":""},{"lineNumber":28,"author":{"gitId":"-"},"content":" RepoCloner repoCloner \u003d new RepoCloner();"},{"lineNumber":29,"author":{"gitId":"-"},"content":" repoCloner.cloneBare(emptyRepositoryRepoConfig);"},{"lineNumber":30,"author":{"gitId":"-"},"content":" RepoLocation clonedRepoLocation \u003d repoCloner.getClonedRepoLocation();"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":" Assertions.assertNull(clonedRepoLocation);"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }"},{"lineNumber":34,"author":{"gitId":"-"},"content":""},{"lineNumber":35,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public void repoCloner_validRepoLocationWithRelativePathingAndSpaces_success() throws Exception {"},{"lineNumber":37,"author":{"gitId":"-"},"content":" // Clones a test repository into the test directory for testing of relative pathing"},{"lineNumber":38,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration tempRemoteConfiguration \u003d new RepoConfiguration.Builder()"},{"lineNumber":39,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_GIT_LOCATION)).build();"},{"lineNumber":40,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneBare(tempRemoteConfiguration, Paths.get(\".\"), REPOCLONE_LOCAL_TEST_PATH.toString());"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":" RepoConfiguration repoWithRelativePathingAndSpacesAndEndingBackslash \u003d"},{"lineNumber":43,"author":{"gitId":"asdfghjkxd"},"content":" new RepoConfiguration.Builder()"},{"lineNumber":44,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(REPOCLONE_LOCAL_TEST_PATH.toString())).build();"},{"lineNumber":45,"author":{"gitId":"-"},"content":" RepoCloner repoCloner \u003d new RepoCloner();"},{"lineNumber":46,"author":{"gitId":"-"},"content":" repoCloner.cloneBare(repoWithRelativePathingAndSpacesAndEndingBackslash);"},{"lineNumber":47,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.exists(REPOCLONE_LOCAL_TEST_PATH));"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }"},{"lineNumber":49,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":6,"-":43}},{"path":"src/test/java/reposense/template/GitTestTemplate.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.template;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.io.File;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.time.ZoneId;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Arrays;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Collections;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Iterator;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.function.Supplier;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.AfterEach;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeAll;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":"import reposense.authorship.FileInfoAnalyzer;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import reposense.authorship.FileInfoExtractor;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import reposense.authorship.model.FileInfo;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import reposense.authorship.model.FileResult;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import reposense.authorship.model.LineInfo;"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import reposense.git.GitCheckout;"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import reposense.git.GitShow;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import reposense.git.exception.CommitNotFoundException;"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import reposense.model.Author;"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import reposense.model.CommitHash;"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import reposense.model.FileTypeTest;"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import reposense.model.RepoConfiguration;"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import reposense.model.RepoLocation;"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import reposense.util.FileUtil;"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import reposense.util.TestRepoCloner;"},{"lineNumber":33,"author":{"gitId":"-"},"content":""},{"lineNumber":34,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Contains templates for git testing."},{"lineNumber":36,"author":{"gitId":"-"},"content":" */"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":"public class GitTestTemplate {"},{"lineNumber":39,"author":{"gitId":"-"},"content":" protected static final String TEST_REPO_GIT_LOCATION \u003d \"https://github.com/reposense/testrepo-Alpha.git\";"},{"lineNumber":40,"author":{"gitId":"-"},"content":" protected static final String IGNORE_REVS_FILE_NAME \u003d \".git-blame-ignore-revs\";"},{"lineNumber":41,"author":{"gitId":"-"},"content":" protected static final String TEST_REPO_BLAME_WITH_PREVIOUS_AUTHORS_BRANCH \u003d \"1565-find-previous-authors\";"},{"lineNumber":42,"author":{"gitId":"-"},"content":" protected static final String FIRST_COMMIT_HASH \u003d \"7d7584f\";"},{"lineNumber":43,"author":{"gitId":"-"},"content":" protected static final String ROOT_COMMIT_HASH \u003d \"fd425072e12004b71d733a58d819d845509f8db3\";"},{"lineNumber":44,"author":{"gitId":"-"},"content":" protected static final String TEST_COMMIT_HASH \u003d \"2fb6b9b\";"},{"lineNumber":45,"author":{"gitId":"-"},"content":" protected static final String TEST_COMMIT_HASH_LONG \u003d \"2fb6b9b2dd9fa40bf0f9815da2cb0ae8731436c7\";"},{"lineNumber":46,"author":{"gitId":"-"},"content":" protected static final String TEST_COMMIT_HASH_PARENT \u003d \"c5a6dc774e22099cd9ddeb0faff1e75f9cf4f151\";"},{"lineNumber":47,"author":{"gitId":"-"},"content":" protected static final String MAIN_AUTHOR_NAME \u003d \"harryggg\";"},{"lineNumber":48,"author":{"gitId":"-"},"content":" protected static final String FAKE_AUTHOR_NAME \u003d \"fakeAuthor\";"},{"lineNumber":49,"author":{"gitId":"-"},"content":" protected static final String UNCONVENTIONAL_AUTHOR_NAME \u003d \"-unconventional_author-\";"},{"lineNumber":50,"author":{"gitId":"-"},"content":" protected static final String WHITESPACE_AUTHOR_NAME \u003d \"whitespace author\";"},{"lineNumber":51,"author":{"gitId":"-"},"content":" protected static final String IGNORED_AUTHOR_NAME \u003d \"FH-30\";"},{"lineNumber":52,"author":{"gitId":"-"},"content":" protected static final String EUGENE_AUTHOR_NAME \u003d \"eugenepeh\";"},{"lineNumber":53,"author":{"gitId":"-"},"content":" protected static final String YONG_AUTHOR_NAME \u003d \"Yong Hao TENG\";"},{"lineNumber":54,"author":{"gitId":"-"},"content":" protected static final String MINGYI_AUTHOR_NAME \u003d \"myteo\";"},{"lineNumber":55,"author":{"gitId":"-"},"content":" protected static final String JAMES_AUTHOR_NAME \u003d \"jamessspanggg\";"},{"lineNumber":56,"author":{"gitId":"-"},"content":" protected static final String JAMES_ALTERNATIVE_AUTHOR_NAME \u003d \"James Pang\";"},{"lineNumber":57,"author":{"gitId":"-"},"content":" protected static final String JINYAO_AUTHOR_NAME \u003d \"jylee-git\";"},{"lineNumber":58,"author":{"gitId":"-"},"content":" protected static final String CHENGYU_AUTHOR_NAME \u003d \"HCY123902\";"},{"lineNumber":59,"author":{"gitId":"-"},"content":" protected static final String LATEST_COMMIT_HASH \u003d \"abbd5888d5cd4e411c6a8e58e661b0eafdae1335\";"},{"lineNumber":60,"author":{"gitId":"-"},"content":" protected static final String LATEST_COMMIT_HASH_PARENT \u003d \"f768b9b1d9d1478f8ac8cf3b4c7f868479edc07a\";"},{"lineNumber":61,"author":{"gitId":"-"},"content":" protected static final String EMPTY_TREE_HASH \u003d \"4b825dc642cb6eb9a060e54bf8d69288fbee4904\";"},{"lineNumber":62,"author":{"gitId":"-"},"content":" protected static final String EUGENE_AUTHOR_README_FILE_COMMIT_07052018_STRING \u003d"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \"2d87a431fcbb8f73a731b6df0fcbee962c85c250\";"},{"lineNumber":64,"author":{"gitId":"-"},"content":" protected static final CommitHash EUGENE_AUTHOR_README_FILE_COMMIT_07052018 \u003d"},{"lineNumber":65,"author":{"gitId":"-"},"content":" new CommitHash(EUGENE_AUTHOR_README_FILE_COMMIT_07052018_STRING);"},{"lineNumber":66,"author":{"gitId":"-"},"content":" protected static final String FAKE_AUTHOR_BLAME_TEST_FILE_COMMIT_08022018_STRING \u003d"},{"lineNumber":67,"author":{"gitId":"-"},"content":" \"768015345e70f06add2a8b7d1f901dc07bf70582\";"},{"lineNumber":68,"author":{"gitId":"-"},"content":" protected static final CommitHash FAKE_AUTHOR_BLAME_TEST_FILE_COMMIT_08022018 \u003d"},{"lineNumber":69,"author":{"gitId":"-"},"content":" new CommitHash(FAKE_AUTHOR_BLAME_TEST_FILE_COMMIT_08022018_STRING);"},{"lineNumber":70,"author":{"gitId":"-"},"content":" protected static final String MAIN_AUTHOR_BLAME_TEST_FILE_COMMIT_06022018_STRING \u003d"},{"lineNumber":71,"author":{"gitId":"-"},"content":" \"8d0ac2ee20f04dce8df0591caed460bffacb65a4\";"},{"lineNumber":72,"author":{"gitId":"-"},"content":" protected static final CommitHash MAIN_AUTHOR_BLAME_TEST_FILE_COMMIT_06022018 \u003d"},{"lineNumber":73,"author":{"gitId":"-"},"content":" new CommitHash(MAIN_AUTHOR_BLAME_TEST_FILE_COMMIT_06022018_STRING);"},{"lineNumber":74,"author":{"gitId":"-"},"content":" protected static final String AUTHOR_TO_IGNORE_BLAME_TEST_FILE_COMMIT_07082021_STRING \u003d"},{"lineNumber":75,"author":{"gitId":"-"},"content":" \"1d29339e7d16eb5b2bc8fb542e08acedd3d4b0eb\";"},{"lineNumber":76,"author":{"gitId":"-"},"content":" protected static final CommitHash AUTHOR_TO_IGNORE_BLAME_TEST_FILE_COMMIT_07082021 \u003d"},{"lineNumber":77,"author":{"gitId":"-"},"content":" new CommitHash(AUTHOR_TO_IGNORE_BLAME_TEST_FILE_COMMIT_07082021_STRING);"},{"lineNumber":78,"author":{"gitId":"-"},"content":" protected static final String FAKE_AUTHOR_BLAME_RANGED_COMMIT_ONE_06022018_STRING \u003d"},{"lineNumber":79,"author":{"gitId":"-"},"content":" \"7d7584fc204922cc5ff3bd5ca073cad6bed2c46a\";"},{"lineNumber":80,"author":{"gitId":"-"},"content":" protected static final String FAKE_AUTHOR_BLAME_RANGED_COMMIT_TWO_06022018_STRING \u003d"},{"lineNumber":81,"author":{"gitId":"-"},"content":" \"8d0ac2ee20f04dce8df0591caed460bffacb65a4\";"},{"lineNumber":82,"author":{"gitId":"-"},"content":" protected static final String FAKE_AUTHOR_BLAME_RANGED_COMMIT_THREE_07022018_STRING \u003d"},{"lineNumber":83,"author":{"gitId":"-"},"content":" \"8e4ca1da5d413e9ab84a1e8d1474918afa97f7a1\";"},{"lineNumber":84,"author":{"gitId":"-"},"content":" protected static final String FAKE_AUTHOR_BLAME_RANGED_COMMIT_FOUR_08022018_STRING \u003d"},{"lineNumber":85,"author":{"gitId":"-"},"content":" \"768015345e70f06add2a8b7d1f901dc07bf70582\";"},{"lineNumber":86,"author":{"gitId":"-"},"content":" protected static final List\u003cCommitHash\u003e FAKE_AUTHOR_BLAME_RANGED_COMMIT_LIST_09022018 \u003d Arrays.asList("},{"lineNumber":87,"author":{"gitId":"-"},"content":" new CommitHash(FAKE_AUTHOR_BLAME_RANGED_COMMIT_ONE_06022018_STRING),"},{"lineNumber":88,"author":{"gitId":"-"},"content":" new CommitHash(FAKE_AUTHOR_BLAME_RANGED_COMMIT_TWO_06022018_STRING),"},{"lineNumber":89,"author":{"gitId":"-"},"content":" new CommitHash(FAKE_AUTHOR_BLAME_RANGED_COMMIT_THREE_07022018_STRING),"},{"lineNumber":90,"author":{"gitId":"-"},"content":" new CommitHash(FAKE_AUTHOR_BLAME_RANGED_COMMIT_FOUR_08022018_STRING));"},{"lineNumber":91,"author":{"gitId":"-"},"content":" protected static final List\u003cCommitHash\u003e AUTHOR_TO_IGNORE_BLAME_COMMIT_LIST_07082021 \u003d Collections.singletonList("},{"lineNumber":92,"author":{"gitId":"-"},"content":" new CommitHash(AUTHOR_TO_IGNORE_BLAME_TEST_FILE_COMMIT_07082021_STRING)"},{"lineNumber":93,"author":{"gitId":"-"},"content":" );"},{"lineNumber":94,"author":{"gitId":"-"},"content":" protected static final String NONEXISTENT_COMMIT_HASH \u003d \"nonExistentCommitHash\";"},{"lineNumber":95,"author":{"gitId":"-"},"content":" protected static final ZoneId TIME_ZONE_ID \u003d ZoneId.of(\"Asia/Singapore\");"},{"lineNumber":96,"author":{"gitId":"-"},"content":""},{"lineNumber":97,"author":{"gitId":"-"},"content":" protected static final Author MAIN_AUTHOR \u003d new Author(MAIN_AUTHOR_NAME);"},{"lineNumber":98,"author":{"gitId":"-"},"content":" protected static final Author FAKE_AUTHOR \u003d new Author(FAKE_AUTHOR_NAME);"},{"lineNumber":99,"author":{"gitId":"-"},"content":" protected static final Author UNCONVENTIONAL_AUTHOR \u003d new Author(UNCONVENTIONAL_AUTHOR_NAME);"},{"lineNumber":100,"author":{"gitId":"-"},"content":" protected static final Author WHITESPACE_AUTHOR \u003d new Author(WHITESPACE_AUTHOR_NAME);"},{"lineNumber":101,"author":{"gitId":"-"},"content":""},{"lineNumber":102,"author":{"gitId":"-"},"content":" protected static ThreadLocal\u003cRepoConfiguration\u003e configs \u003d ThreadLocal.withInitial(() -\u003e {"},{"lineNumber":103,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":104,"author":{"gitId":"-"},"content":" return newRepoConfiguration();"},{"lineNumber":105,"author":{"gitId":"-"},"content":" } catch (Exception e) {"},{"lineNumber":106,"author":{"gitId":"-"},"content":" throw new RuntimeException(e);"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }"},{"lineNumber":108,"author":{"gitId":"-"},"content":" });"},{"lineNumber":109,"author":{"gitId":"-"},"content":""},{"lineNumber":110,"author":{"gitId":"-"},"content":" private static final Supplier\u003cString\u003e EXTRA_OUTPUT_FOLDER_NAME_SUPPLIER \u003d () -\u003e"},{"lineNumber":111,"author":{"gitId":"-"},"content":" String.valueOf(Thread.currentThread().getId());"},{"lineNumber":112,"author":{"gitId":"-"},"content":" private FileInfoExtractor fileInfoExtractor \u003d new FileInfoExtractor();"},{"lineNumber":113,"author":{"gitId":"-"},"content":" private FileInfoAnalyzer fileInfoAnalyzer \u003d new FileInfoAnalyzer();"},{"lineNumber":114,"author":{"gitId":"-"},"content":""},{"lineNumber":115,"author":{"gitId":"-"},"content":" @BeforeEach"},{"lineNumber":116,"author":{"gitId":"-"},"content":" public void before() throws Exception {"},{"lineNumber":117,"author":{"gitId":"-"},"content":" RepoConfiguration config \u003d newRepoConfiguration();"},{"lineNumber":118,"author":{"gitId":"-"},"content":" config.setAuthorList(Collections.singletonList(getAlphaAllAliasAuthor()));"},{"lineNumber":119,"author":{"gitId":"-"},"content":" config.setFormats(FileTypeTest.DEFAULT_TEST_FORMATS);"},{"lineNumber":120,"author":{"gitId":"-"},"content":" config.setZoneId(TIME_ZONE_ID);"},{"lineNumber":121,"author":{"gitId":"-"},"content":" config.setIsLastModifiedDateIncluded(false);"},{"lineNumber":122,"author":{"gitId":"-"},"content":""},{"lineNumber":123,"author":{"gitId":"-"},"content":" configs.set(config);"},{"lineNumber":124,"author":{"gitId":"-"},"content":" }"},{"lineNumber":125,"author":{"gitId":"-"},"content":""},{"lineNumber":126,"author":{"gitId":"-"},"content":" @BeforeAll"},{"lineNumber":127,"author":{"gitId":"-"},"content":" public static void beforeClass() throws Exception {"},{"lineNumber":128,"author":{"gitId":"-"},"content":" RepoConfiguration config \u003d newRepoConfiguration();"},{"lineNumber":129,"author":{"gitId":"-"},"content":" config.setZoneId(TIME_ZONE_ID);"},{"lineNumber":130,"author":{"gitId":"-"},"content":" configs.set(config);"},{"lineNumber":131,"author":{"gitId":"-"},"content":""},{"lineNumber":132,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(config, EXTRA_OUTPUT_FOLDER_NAME_SUPPLIER.get());"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }"},{"lineNumber":134,"author":{"gitId":"-"},"content":""},{"lineNumber":135,"author":{"gitId":"-"},"content":" @AfterEach"},{"lineNumber":136,"author":{"gitId":"-"},"content":" public void after() {"},{"lineNumber":137,"author":{"gitId":"-"},"content":" GitCheckout.checkout(configs.get().getRepoRoot(), \"master\");"},{"lineNumber":138,"author":{"gitId":"-"},"content":" }"},{"lineNumber":139,"author":{"gitId":"-"},"content":""},{"lineNumber":140,"author":{"gitId":"-"},"content":" private static RepoConfiguration newRepoConfiguration() throws Exception {"},{"lineNumber":141,"author":{"gitId":"asdfghjkxd"},"content":" return new RepoConfiguration.Builder()"},{"lineNumber":142,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_GIT_LOCATION))"},{"lineNumber":143,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":144,"author":{"gitId":"asdfghjkxd"},"content":" .extraOutputFolderName(EXTRA_OUTPUT_FOLDER_NAME_SUPPLIER.get())"},{"lineNumber":145,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":146,"author":{"gitId":"-"},"content":" }"},{"lineNumber":147,"author":{"gitId":"-"},"content":""},{"lineNumber":148,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":149,"author":{"gitId":"-"},"content":" * Generates the .git-blame-ignore-revs file containing {@link CommitHash}es"},{"lineNumber":150,"author":{"gitId":"-"},"content":" * from {@code toIgnore} for the test repo."},{"lineNumber":151,"author":{"gitId":"-"},"content":" */"},{"lineNumber":152,"author":{"gitId":"-"},"content":" public List\u003cCommitHash\u003e createTestIgnoreRevsFile(List\u003cCommitHash\u003e toIgnore) {"},{"lineNumber":153,"author":{"gitId":"-"},"content":" String repoRoot \u003d configs.get().getRepoRoot();"},{"lineNumber":154,"author":{"gitId":"-"},"content":" List\u003cCommitHash\u003e expandedIgnoreCommitList \u003d toIgnore.stream()"},{"lineNumber":155,"author":{"gitId":"-"},"content":" .map(CommitHash::toString)"},{"lineNumber":156,"author":{"gitId":"-"},"content":" .map(commitHash -\u003e {"},{"lineNumber":157,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":158,"author":{"gitId":"-"},"content":" return GitShow.getExpandedCommitHash(repoRoot, commitHash);"},{"lineNumber":159,"author":{"gitId":"-"},"content":" } catch (CommitNotFoundException e) {"},{"lineNumber":160,"author":{"gitId":"-"},"content":" return new CommitHash(commitHash);"},{"lineNumber":161,"author":{"gitId":"-"},"content":" }"},{"lineNumber":162,"author":{"gitId":"-"},"content":" })"},{"lineNumber":163,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());"},{"lineNumber":164,"author":{"gitId":"-"},"content":""},{"lineNumber":165,"author":{"gitId":"-"},"content":" String fileLocation \u003d repoRoot + IGNORE_REVS_FILE_NAME;"},{"lineNumber":166,"author":{"gitId":"-"},"content":" FileUtil.writeIgnoreRevsFile(fileLocation, expandedIgnoreCommitList);"},{"lineNumber":167,"author":{"gitId":"-"},"content":" return expandedIgnoreCommitList;"},{"lineNumber":168,"author":{"gitId":"-"},"content":" }"},{"lineNumber":169,"author":{"gitId":"-"},"content":""},{"lineNumber":170,"author":{"gitId":"-"},"content":" public void removeTestIgnoreRevsFile() {"},{"lineNumber":171,"author":{"gitId":"-"},"content":" String fileLocation \u003d configs.get().getRepoRoot() + IGNORE_REVS_FILE_NAME;"},{"lineNumber":172,"author":{"gitId":"-"},"content":" new File(fileLocation).delete();"},{"lineNumber":173,"author":{"gitId":"-"},"content":" }"},{"lineNumber":174,"author":{"gitId":"-"},"content":""},{"lineNumber":175,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":176,"author":{"gitId":"-"},"content":" * For each line in {@link FileResult}, assert that it is attributed to the expected author provided by"},{"lineNumber":177,"author":{"gitId":"-"},"content":" * {@code expectedLineAuthors}."},{"lineNumber":178,"author":{"gitId":"-"},"content":" */"},{"lineNumber":179,"author":{"gitId":"-"},"content":" public void assertFileAnalysisCorrectness(FileResult fileResult, List\u003cAuthor\u003e expectedLineAuthors) {"},{"lineNumber":180,"author":{"gitId":"-"},"content":" List\u003cLineInfo\u003e lines \u003d fileResult.getLines();"},{"lineNumber":181,"author":{"gitId":"-"},"content":" assertEquals(expectedLineAuthors.size(), lines.size());"},{"lineNumber":182,"author":{"gitId":"-"},"content":""},{"lineNumber":183,"author":{"gitId":"-"},"content":" Iterator\u003cAuthor\u003e lineAuthorsItr \u003d expectedLineAuthors.iterator();"},{"lineNumber":184,"author":{"gitId":"-"},"content":" Iterator\u003cLineInfo\u003e linesItr \u003d lines.iterator();"},{"lineNumber":185,"author":{"gitId":"-"},"content":""},{"lineNumber":186,"author":{"gitId":"-"},"content":" while (linesItr.hasNext() \u0026\u0026 lineAuthorsItr.hasNext()) {"},{"lineNumber":187,"author":{"gitId":"-"},"content":" assertEquals(lineAuthorsItr.next(), linesItr.next().getAuthor());"},{"lineNumber":188,"author":{"gitId":"-"},"content":" }"},{"lineNumber":189,"author":{"gitId":"-"},"content":" }"},{"lineNumber":190,"author":{"gitId":"-"},"content":""},{"lineNumber":191,"author":{"gitId":"-"},"content":" public FileResult getFileResult(String relativePath) {"},{"lineNumber":192,"author":{"gitId":"-"},"content":" FileInfo fileInfo \u003d fileInfoExtractor.generateFileInfo(configs.get(), relativePath);"},{"lineNumber":193,"author":{"gitId":"-"},"content":" return fileInfoAnalyzer.analyzeTextFile(configs.get(), fileInfo);"},{"lineNumber":194,"author":{"gitId":"-"},"content":" }"},{"lineNumber":195,"author":{"gitId":"-"},"content":""},{"lineNumber":196,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":197,"author":{"gitId":"-"},"content":" * Returns a {@link Author} that has git id and aliases of all authors in testrepo-Alpha, so that no commits"},{"lineNumber":198,"author":{"gitId":"-"},"content":" * will be filtered out in the `git log` command."},{"lineNumber":199,"author":{"gitId":"-"},"content":" */"},{"lineNumber":200,"author":{"gitId":"-"},"content":" protected Author getAlphaAllAliasAuthor() {"},{"lineNumber":201,"author":{"gitId":"-"},"content":" Author author \u003d new Author(MAIN_AUTHOR_NAME);"},{"lineNumber":202,"author":{"gitId":"-"},"content":" author.setAuthorAliases(Arrays.asList(FAKE_AUTHOR_NAME, EUGENE_AUTHOR_NAME, YONG_AUTHOR_NAME));"},{"lineNumber":203,"author":{"gitId":"-"},"content":" return author;"},{"lineNumber":204,"author":{"gitId":"-"},"content":" }"},{"lineNumber":205,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":5,"-":200}}] +[{"path":"docs/dg/learningBasics.md","fileType":"md","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"{% set title \u003d \"Learning the Basics\" %}"},{"lineNumber":2,"author":{"gitId":"-"},"content":"\u003cfrontmatter\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"{{ title | safe }}\""},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003c/frontmatter\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"{% from \u0027scripts/macros.njk\u0027 import embed, step with context %}"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003ch1 class\u003d\"display-4\"\u003e\u003cmd\u003e{{ title }}\u003c/md\u003e\u003c/h1\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003cdiv class\u003d\"lead\"\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"-"},"content":"This is a learning guide for developers who are new to RepoSense."},{"lineNumber":14,"author":{"gitId":"-"},"content":"\u003c/div\u003e"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":"Depending on what you know already and what you would like to work on (i.e., backend or frontend), you may find certain sections irrelevant to you and you can skip them accordingly."},{"lineNumber":19,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":"\u003c!-- \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d --\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":"## Backend"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"-"},"content":"This section is for developers who want to contribute to the backend of RepoSense. You may skip this section if you want to contribute as a pure frontend developer. Before you get started, you should have set up the project on your computer according to [the _Setting up_ page](settingUp.html)."},{"lineNumber":28,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"-"},"content":"The backend implementation of RepoSense is located in `src/main`."},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":"{{ step(1) }} **Know Java**"},{"lineNumber":33,"author":{"gitId":"-"},"content":""},{"lineNumber":34,"author":{"gitId":"-"},"content":"The RepoSense backend is mostly written in `Java 8`."},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":"1. You need to have a basic knowledge of Java before getting started, including its syntax, [API](https://docs.oracle.com/javase/8/docs/api/), and certain frameworks such as [JUnit](https://se-education.org/learningresources/contents/java/JUnit.html)."},{"lineNumber":37,"author":{"gitId":"-"},"content":"1. Once you are familiar with the basic syntax, you may wish to learn more advanced topics such as [concurrency](https://se-education.org/learningresources/contents/java/JavaConcurrency.html), [synchronization](https://se-education.org/learningresources/contents/java/JavaSynchronization.html), and [streams](https://se-education.org/learningresources/contents/java/streams-an-introduction.html). These topics can help you to understand certain part of the backend implementation (concurrent cloning and analysis of multiple repositories, etc.). They are optional but you may find them useful when working on certain issues."},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"-"},"content":"{{ step(2) }} **Learn the RepoSense backend architecture**"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":"You may want to refer to the [backend architecture](architecture.html) to understand the RepoSense backend implementation logic."},{"lineNumber":42,"author":{"gitId":"-"},"content":""},{"lineNumber":43,"author":{"gitId":"-"},"content":"To gain a more concrete idea of how the backend works, you can use the IDE Debugger and run RepoSense under the debugging mode to trace through the steps of how arguments from command line and CSV files are parsed, how repositories are cloned and analyzed, and how the JSON files are generated."},{"lineNumber":44,"author":{"gitId":"-"},"content":""},{"lineNumber":45,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":"The information below is for **Intellij**. If you are using a different IDE, you may need to check the documentation of how to use the debugger separately."},{"lineNumber":48,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":49,"author":{"gitId":"-"},"content":""},{"lineNumber":50,"author":{"gitId":"-"},"content":"* Check the [debugging guide](https://www.jetbrains.com/help/idea/debugging-your-first-java-application.html) if you are not familiar with debugging in **Intelij**."},{"lineNumber":51,"author":{"gitId":"-"},"content":"* In `RepoSense.java`, the main class, set appropriate break points. Here are some relevant method calls in the `main` method at which you can set the breakpoints:"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * `ArgsParser.parse(args)`: RepoSense parses the CLI arguments from the command given by the user."},{"lineNumber":53,"author":{"gitId":"-"},"content":" * `getRepoConfigurations(cliArguments)`: RepoSense gets the configuration for each repository by parsing the CSV files."},{"lineNumber":54,"author":{"gitId":"-"},"content":" * `getReportConfigurations(cliArguments)`: RepoSense gets the report configuration (report title) by parsing the JSON files."},{"lineNumber":55,"author":{"gitId":"-"},"content":" * `ReportGenerator.generateReposReport(...)` This is where the bulk of the work is conducted, including cloning repositories, analyzing repositories, and generating the JSON files to be used by the report."},{"lineNumber":56,"author":{"gitId":"-"},"content":"* To supply debugging arguments, right-click on the run button of `RepoSense.main`, click `Modify Run Configuration`, and add [CLI flags](https://reposense.org/ug/customizingReports.html#customize-using-cli-flags) in `Program arguments`. Examples: `--since 16/12/2021 --until 18/12/2022`; `-s 16/12/2021 -u 18/12/2022`."},{"lineNumber":57,"author":{"gitId":"-"},"content":""},{"lineNumber":58,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":59,"author":{"gitId":"-"},"content":""},{"lineNumber":60,"author":{"gitId":"-"},"content":"When tracing through the program execution, you can cross reference the architecture diagram and Javadoc of the class and method to check your understanding of the procedure."},{"lineNumber":61,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":62,"author":{"gitId":"-"},"content":""},{"lineNumber":63,"author":{"gitId":"-"},"content":"{{ step(3) }} **Gain some hands-on experience**"},{"lineNumber":64,"author":{"gitId":"-"},"content":""},{"lineNumber":65,"author":{"gitId":"-"},"content":"Here are some small tasks for you to gain some basic knowledge of the code related to the RepoSense backend. You can do each in a separate branch in your local copy of the code."},{"lineNumber":66,"author":{"gitId":"-"},"content":""},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003cpanel header\u003d\"**Task 1: Add a flag to pretty-print the JSON file**\" type\u003d\"primary\"\u003e"},{"lineNumber":68,"author":{"gitId":"-"},"content":""},{"lineNumber":69,"author":{"gitId":"-"},"content":" **Task 1: Add a flag to pretty-print the JSON file**"},{"lineNumber":70,"author":{"gitId":"-"},"content":""},{"lineNumber":71,"author":{"gitId":"-"},"content":" 1. [Generate a report locally](../ug/generatingReports.html#generating-reports-locally)."},{"lineNumber":72,"author":{"gitId":"-"},"content":" 2. Open a generated JSON file. For example, you can open `summary.json` of the generated report."},{"lineNumber":73,"author":{"gitId":"-"},"content":" 3. You should see that the content in the JSON is compactly organized in 1 single line. This may affect readability for developer who wants to investigate the content in the JSON file."},{"lineNumber":74,"author":{"gitId":"-"},"content":""},{"lineNumber":75,"author":{"gitId":"-"},"content":" **Your Task**"},{"lineNumber":76,"author":{"gitId":"-"},"content":""},{"lineNumber":77,"author":{"gitId":"-"},"content":" Add a new CLI argument `--use-json-pretty-printing`, such that when a user runs the command `java -jar RepoSense.jar --repos LIST_OF_REPO_URLS --view --use-json-pretty-printing`, the JSON files `summary.json`, `authorship.json`, and `commits.json` will be printed in a more readable way."},{"lineNumber":78,"author":{"gitId":"-"},"content":""},{"lineNumber":79,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 1\"\u003e"},{"lineNumber":80,"author":{"gitId":"-"},"content":""},{"lineNumber":81,"author":{"gitId":"-"},"content":" Try to understand the parsing process of the Command Line Arguments, which starts from `ArgsParser.parse(args)` in `RepoSense.java` and uses `ArgumentParser` to capture the arguments in the command string."},{"lineNumber":82,"author":{"gitId":"-"},"content":""},{"lineNumber":83,"author":{"gitId":"-"},"content":" Therefore, the first step you can take is to add the following to `ArgsParser`."},{"lineNumber":84,"author":{"gitId":"-"},"content":""},{"lineNumber":85,"author":{"gitId":"asdfghjkxd"},"content":" ```java"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public static final String[] JSON_PRINT_MODE_FLAGS \u003d new String[]{\"--use-json-pretty-printing\", \"-j\"};"},{"lineNumber":87,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":88,"author":{"gitId":"-"},"content":""},{"lineNumber":89,"author":{"gitId":"-"},"content":" In `getArgumentParser` method, add the following content to make `ArgumentParser` capture the new argument."},{"lineNumber":90,"author":{"gitId":"-"},"content":""},{"lineNumber":91,"author":{"gitId":"asdfghjkxd"},"content":" ```java"},{"lineNumber":92,"author":{"gitId":"-"},"content":" parser.addArgument(JSON_PRINT_MODE_FLAGS)"},{"lineNumber":93,"author":{"gitId":"-"},"content":" .dest(JSON_PRINT_MODE_FLAGS[0])"},{"lineNumber":94,"author":{"gitId":"-"},"content":" .action(Arguments.storeTrue())"},{"lineNumber":95,"author":{"gitId":"-"},"content":" .help(\"A flag to use json pretty printing when generating the json files.\");"},{"lineNumber":96,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":97,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":98,"author":{"gitId":"-"},"content":""},{"lineNumber":99,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 2\"\u003e"},{"lineNumber":100,"author":{"gitId":"-"},"content":""},{"lineNumber":101,"author":{"gitId":"-"},"content":" After the step in hint 1, the argument is captured by `ArgumentParser`. Now make corresponding changes to `CliArguments.java`, `ConfigCliArguments.java`, and the `parse` method in `ArgsParser.java` to make the return result of `parse` include the new argument."},{"lineNumber":102,"author":{"gitId":"-"},"content":""},{"lineNumber":103,"author":{"gitId":"-"},"content":" 1. Add the following content to `CliArguments` to include `isPrettyPrintingUsed` as a new attribute to the class."},{"lineNumber":104,"author":{"gitId":"-"},"content":""},{"lineNumber":105,"author":{"gitId":"asdfghjkxd"},"content":" ```java"},{"lineNumber":106,"author":{"gitId":"-"},"content":" protected boolean isPrettyPrintingUsed;"},{"lineNumber":107,"author":{"gitId":"-"},"content":""},{"lineNumber":108,"author":{"gitId":"-"},"content":" public boolean isPrettyPrintingUsed() {"},{"lineNumber":109,"author":{"gitId":"-"},"content":" return isPrettyPrintingUsed;"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }"},{"lineNumber":111,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":112,"author":{"gitId":"-"},"content":""},{"lineNumber":113,"author":{"gitId":"-"},"content":" 2. In the constructor of `ConfigCliArguments`, add `isPrettyPrintingUsed` as a new parameter of the method, and add the following instruction to the method body."},{"lineNumber":114,"author":{"gitId":"-"},"content":""},{"lineNumber":115,"author":{"gitId":"asdfghjkxd"},"content":" ```java"},{"lineNumber":116,"author":{"gitId":"-"},"content":" this.isPrettyPrintingUsed \u003d isPrettyPrintingUsed;"},{"lineNumber":117,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":118,"author":{"gitId":"-"},"content":""},{"lineNumber":119,"author":{"gitId":"-"},"content":" 3. In the `parse` method of `ArgsParser`, add the following instruction to get `isJsonPrettyPrintingUsed` from `ArgmentParser`."},{"lineNumber":120,"author":{"gitId":"-"},"content":""},{"lineNumber":121,"author":{"gitId":"asdfghjkxd"},"content":" ```java"},{"lineNumber":122,"author":{"gitId":"-"},"content":" boolean isJsonPrettyPrintingUsed \u003d results.get(JSON_PRINT_MODE_FLAGS[0]);"},{"lineNumber":123,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":124,"author":{"gitId":"-"},"content":""},{"lineNumber":125,"author":{"gitId":"-"},"content":" 4. Additionally, change the return statement of the `parse` method so that the `ConfigCliArguments` object returned will now include `isJsonPrettyPrintingUsed`."},{"lineNumber":126,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":127,"author":{"gitId":"-"},"content":""},{"lineNumber":128,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 3\"\u003e"},{"lineNumber":129,"author":{"gitId":"-"},"content":""},{"lineNumber":130,"author":{"gitId":"-"},"content":" After the steps in hint 1 and hint 2, the result returned from `ArgsParser.parse(args)` in `RepoSense.java` should be able to capture the new argument when it is specified in the command."},{"lineNumber":131,"author":{"gitId":"-"},"content":""},{"lineNumber":132,"author":{"gitId":"-"},"content":" The next step is to extract the argument from the `CliArguments` object, and pass it to JSON file writer to notify it of the specified printing mode."},{"lineNumber":133,"author":{"gitId":"-"},"content":""},{"lineNumber":134,"author":{"gitId":"-"},"content":" Note that the creation and writing of JSON file is invoked in `ReportGenerator.generateReposReport`, which calls `FileUtil.writeJsonFile` directly to write the `summary.json` file or indirectly (Check `generateIndividualRepoReport` and `generateEmptyRepoReport`) to write the `commits.json` or `authorship.json` files of individual repositories."},{"lineNumber":135,"author":{"gitId":"-"},"content":""},{"lineNumber":136,"author":{"gitId":"-"},"content":" Therefore, the task now is to make `FileUtil.writeJsonFile` switch between different printing mode."},{"lineNumber":137,"author":{"gitId":"-"},"content":""},{"lineNumber":138,"author":{"gitId":"-"},"content":" 1. You can find out what [`Gson.setPrettyPrinting`](https://www.javadoc.io/doc/com.google.code.gson/gson/2.8.5/com/google/gson/GsonBuilder.html#setPrettyPrinting--) does and how it can be used in the `writeJsonFile` method of [`FileUtil.java`](https://github.com/reposense/RepoSense/blob/master/src/main/java/reposense/util/FileUtil.java)."},{"lineNumber":139,"author":{"gitId":"-"},"content":""},{"lineNumber":140,"author":{"gitId":"-"},"content":" 2. Add the following content to `FileUtil`."},{"lineNumber":141,"author":{"gitId":"-"},"content":""},{"lineNumber":142,"author":{"gitId":"asdfghjkxd"},"content":" ```java"},{"lineNumber":143,"author":{"gitId":"-"},"content":" private static boolean isPrettyPrintingUsed \u003d false;"},{"lineNumber":144,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":145,"author":{"gitId":"-"},"content":""},{"lineNumber":146,"author":{"gitId":"-"},"content":" 3. In the `writeJsonFile` method, Replace the creation of the `Gson` object with the following instructions."},{"lineNumber":147,"author":{"gitId":"-"},"content":""},{"lineNumber":148,"author":{"gitId":"asdfghjkxd"},"content":" ```java"},{"lineNumber":149,"author":{"gitId":"-"},"content":" GsonBuilder gsonBuilder \u003d new GsonBuilder()"},{"lineNumber":150,"author":{"gitId":"-"},"content":" .registerTypeAdapter(LocalDateTime.class, (JsonSerializer\u003cLocalDateTime\u003e) (date, typeOfSrc, context)"},{"lineNumber":151,"author":{"gitId":"-"},"content":" -\u003e new JsonPrimitive(date.format(DateTimeFormatter.ofPattern(GITHUB_API_DATE_FORMAT))))"},{"lineNumber":152,"author":{"gitId":"-"},"content":" .registerTypeAdapter(FileType.class, new FileType.FileTypeSerializer());"},{"lineNumber":153,"author":{"gitId":"-"},"content":" Gson gson;"},{"lineNumber":154,"author":{"gitId":"-"},"content":" if (isPrettyPrintingUsed) {"},{"lineNumber":155,"author":{"gitId":"-"},"content":" gson \u003d gsonBuilder.setPrettyPrinting().create();"},{"lineNumber":156,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":157,"author":{"gitId":"-"},"content":" gson \u003d gsonBuilder.create();"},{"lineNumber":158,"author":{"gitId":"-"},"content":" }"},{"lineNumber":159,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":160,"author":{"gitId":"-"},"content":""},{"lineNumber":161,"author":{"gitId":"-"},"content":" 4. To notify `FileUtil` of the switch between different printing mode, add the following method to `FileUtil`."},{"lineNumber":162,"author":{"gitId":"-"},"content":""},{"lineNumber":163,"author":{"gitId":"asdfghjkxd"},"content":" ```java"},{"lineNumber":164,"author":{"gitId":"-"},"content":" public static void setPrettyPrintingMode(boolean isPrettyPrintingAdopted) {"},{"lineNumber":165,"author":{"gitId":"-"},"content":" isPrettyPrintingUsed \u003d isPrettyPrintingAdopted;"},{"lineNumber":166,"author":{"gitId":"-"},"content":" }"},{"lineNumber":167,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":168,"author":{"gitId":"-"},"content":""},{"lineNumber":169,"author":{"gitId":"-"},"content":" 5. It is now possible to notify `FileUtil` of the printing mode switch by extracting the argument from the `CliArguments` object in the `main` method of `RepoSense.java` and passing it to the corresponding method in `FileUtil`."},{"lineNumber":170,"author":{"gitId":"-"},"content":""},{"lineNumber":171,"author":{"gitId":"asdfghjkxd"},"content":" ```java"},{"lineNumber":172,"author":{"gitId":"-"},"content":" FileUtil.setPrettyPrintingMode(cliArguments.isPrettyPrintingUsed());"},{"lineNumber":173,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":174,"author":{"gitId":"-"},"content":""},{"lineNumber":175,"author":{"gitId":"-"},"content":" Now the parsing of argument and changing of printing mode should have been completed."},{"lineNumber":176,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":177,"author":{"gitId":"-"},"content":""},{"lineNumber":178,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Suggested solution\"\u003e"},{"lineNumber":179,"author":{"gitId":"-"},"content":""},{"lineNumber":180,"author":{"gitId":"-"},"content":" There is more than 1 way to achieve this. By combining the changes in hint 1, hint 2, and hint 3, you should be able to get a possible solution."},{"lineNumber":181,"author":{"gitId":"-"},"content":""},{"lineNumber":182,"author":{"gitId":"-"},"content":" Try the command `java -jar RepoSense.jar --repos https://github.com/reposense/RepoSense.git --view --use-json-pretty-printing` and check the generated JSON files to see if it works."},{"lineNumber":183,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":184,"author":{"gitId":"-"},"content":""},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003c/panel\u003e"},{"lineNumber":186,"author":{"gitId":"-"},"content":""},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cpanel header\u003d\"**Task 2: Add exception message during repository cloning to the summary view**\" type\u003d\"primary\"\u003e"},{"lineNumber":188,"author":{"gitId":"-"},"content":""},{"lineNumber":189,"author":{"gitId":"-"},"content":" **Task 2: Add exception message during repository cloning to the summary view**"},{"lineNumber":190,"author":{"gitId":"-"},"content":""},{"lineNumber":191,"author":{"gitId":"-"},"content":" 1. Open a [report](https://dashboard-1507-pr-reposense-reposense.surge.sh/)."},{"lineNumber":192,"author":{"gitId":"-"},"content":" 2. You should see that there is a red panel in the summary view containing the following message, indicating that there is an issue in the cloning process of the repository `reposense/testrepo-Empty`."},{"lineNumber":193,"author":{"gitId":"-"},"content":""},{"lineNumber":194,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":195,"author":{"gitId":"-"},"content":" reposense/testrepo-Empty[master]"},{"lineNumber":196,"author":{"gitId":"-"},"content":" Failed to clone from https://github.com/reposense/testrepo-Empty.git"},{"lineNumber":197,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":198,"author":{"gitId":"-"},"content":""},{"lineNumber":199,"author":{"gitId":"-"},"content":" **Your task**"},{"lineNumber":200,"author":{"gitId":"-"},"content":""},{"lineNumber":201,"author":{"gitId":"-"},"content":" For the repository with the message `Failed to clone from ...`, find out what exception causes this cloning error, and add that exception message to the panel as well."},{"lineNumber":202,"author":{"gitId":"-"},"content":""},{"lineNumber":203,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 1\"\u003e"},{"lineNumber":204,"author":{"gitId":"-"},"content":""},{"lineNumber":205,"author":{"gitId":"-"},"content":" You can find out what [`ErrorSummary.java`](https://github.com/reposense/RepoSense/blob/master/src/main/java/reposense/report/ErrorSummary.java) and [`RepoCloner.java`](https://github.com/reposense/RepoSense/blob/master/src/main/java/reposense/report/RepoCloner.java) do, and where they are used."},{"lineNumber":206,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":207,"author":{"gitId":"-"},"content":""},{"lineNumber":208,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 2\"\u003e"},{"lineNumber":209,"author":{"gitId":"-"},"content":""},{"lineNumber":210,"author":{"gitId":"-"},"content":" Try to understand the cloning process."},{"lineNumber":211,"author":{"gitId":"-"},"content":""},{"lineNumber":212,"author":{"gitId":"-"},"content":" * The cloning process is invoked by [`RepoGenerator.java`](https://github.com/reposense/RepoSense/blob/master/src/main/java/reposense/report/ReportGenerator.java) in the `cloneAndAnalyzeRepos` method, which subsequently calls `cloneBare` in `RepoCloner.java` to start the cloning."},{"lineNumber":213,"author":{"gitId":"-"},"content":" * The `cloneAndAnalyzeRepos` method will then call `getRepoLocation` in `RepoCloner.java` to try to get the repository location."},{"lineNumber":214,"author":{"gitId":"-"},"content":" * Beneath the surface, `RepoCloner` will first execute `spawnCloneProcess` and then execute `waitForCloneProcess` when it is invoked by `RepoGenerator` for the first and second time respectively."},{"lineNumber":215,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":216,"author":{"gitId":"-"},"content":""},{"lineNumber":217,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 3\"\u003e"},{"lineNumber":218,"author":{"gitId":"-"},"content":""},{"lineNumber":219,"author":{"gitId":"-"},"content":" In `RepoCloner`, the potential exceptions in `spawnCloneProcess` and `waitForCloneProcess` are caught but not recorded by `ErrorSummary`."},{"lineNumber":220,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":221,"author":{"gitId":"-"},"content":""},{"lineNumber":222,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Suggested solution\"\u003e"},{"lineNumber":223,"author":{"gitId":"-"},"content":""},{"lineNumber":224,"author":{"gitId":"-"},"content":" There is more than 1 way to achieve this. One solution is shown as the following:"},{"lineNumber":225,"author":{"gitId":"-"},"content":""},{"lineNumber":226,"author":{"gitId":"-"},"content":" Add this to the catch block of `spawnCloneProcess` and `waitForCloneProcess`, so that the message will be captured in `summary.json`."},{"lineNumber":227,"author":{"gitId":"-"},"content":""},{"lineNumber":228,"author":{"gitId":"asdfghjkxd"},"content":" ```java"},{"lineNumber":229,"author":{"gitId":"-"},"content":" ErrorSummary.getInstance().addErrorMessage(config.getDisplayName(), e.getMessage());"},{"lineNumber":230,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":231,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":232,"author":{"gitId":"-"},"content":""},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003c/panel\u003e"},{"lineNumber":234,"author":{"gitId":"-"},"content":""},{"lineNumber":235,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":236,"author":{"gitId":"-"},"content":""},{"lineNumber":237,"author":{"gitId":"-"},"content":"This is only for your practice. There is no need for you to commit this change and submit it in a pull request."},{"lineNumber":238,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":239,"author":{"gitId":"-"},"content":""},{"lineNumber":240,"author":{"gitId":"-"},"content":"{{ step(4) }} **Next Step**"},{"lineNumber":241,"author":{"gitId":"-"},"content":""},{"lineNumber":242,"author":{"gitId":"-"},"content":"You can now proceed to learn the [contributing workflow](workflow.html)."},{"lineNumber":243,"author":{"gitId":"-"},"content":""},{"lineNumber":244,"author":{"gitId":"-"},"content":"\u003c!-- \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d --\u003e"},{"lineNumber":245,"author":{"gitId":"-"},"content":""},{"lineNumber":246,"author":{"gitId":"-"},"content":"## Frontend"},{"lineNumber":247,"author":{"gitId":"-"},"content":""},{"lineNumber":248,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":249,"author":{"gitId":"-"},"content":""},{"lineNumber":250,"author":{"gitId":"-"},"content":"This section is for developers who want to contribute to the frontend of RepoSense. You may skip this section if you want to contribute as a pure backend developer."},{"lineNumber":251,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":252,"author":{"gitId":"-"},"content":""},{"lineNumber":253,"author":{"gitId":"-"},"content":"The frontend implementation of RepoSense is located in `frontend/src`."},{"lineNumber":254,"author":{"gitId":"-"},"content":""},{"lineNumber":255,"author":{"gitId":"-"},"content":"{{ step(1) }} **Learn the necessary tools**"},{"lineNumber":256,"author":{"gitId":"-"},"content":""},{"lineNumber":257,"author":{"gitId":"-"},"content":"It is necessary for you to learn the basics of Vue.js, Pug, and SCSS before working on the project."},{"lineNumber":258,"author":{"gitId":"-"},"content":""},{"lineNumber":259,"author":{"gitId":"-"},"content":"\u003c!-- ------------------------------------------------------------------------------------------------------ --\u003e"},{"lineNumber":260,"author":{"gitId":"-"},"content":""},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Vue.js"},{"lineNumber":262,"author":{"gitId":"-"},"content":""},{"lineNumber":263,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":264,"author":{"gitId":"-"},"content":""},{"lineNumber":265,"author":{"gitId":"-"},"content":"Vue.js uses JavaScript as its programming language. Before learning **Vue.js**, you may need to first get yourself familiar with JavaScript syntax first."},{"lineNumber":266,"author":{"gitId":"-"},"content":"You can refer to the [Javascript documentation](https://devdocs.io/javascript/) to learn the basic syntax. There are plenty of other resources available and please feel free to find the resource most suitable for you."},{"lineNumber":267,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":268,"author":{"gitId":"-"},"content":""},{"lineNumber":269,"author":{"gitId":"-"},"content":"RepoSense uses **Vue.js** (Vue3) in its front-end implementation. In particular, major user interface components, such as [summary view](report.html#summary-view-v-summary-js), [authorship view](report.html#authorship-view-v-authorship-js), and [zoom view](report.html#zoom-view-v-zoom-js), are implemented as Vue components. The corresponding source files are in `frontend/src`."},{"lineNumber":270,"author":{"gitId":"-"},"content":""},{"lineNumber":271,"author":{"gitId":"-"},"content":"* If you are new to Vue.js, you may want to start learning by looking at [the beginner tutorial](https://www.vuemastery.com/courses/intro-to-vue-js/)."},{"lineNumber":272,"author":{"gitId":"-"},"content":"* You can dive deeper later by checking the [Vue.js documentation](https://vuejs.org/guide/introduction.html) to learn about essential concepts such as component life cycle hooks, and component properties."},{"lineNumber":273,"author":{"gitId":"-"},"content":"* It is recommended if you can work on some small projects first to gain more solid understanding of Vue.js."},{"lineNumber":274,"author":{"gitId":"-"},"content":""},{"lineNumber":275,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e"},{"lineNumber":276,"author":{"gitId":"-"},"content":""},{"lineNumber":277,"author":{"gitId":"-"},"content":"The guide above uses HTML as the component template, which is not the case with RepoSense. You may wish to learn more about [Pug](#pug) and its connection with HTML."},{"lineNumber":278,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":279,"author":{"gitId":"-"},"content":""},{"lineNumber":280,"author":{"gitId":"-"},"content":"#### Vuex"},{"lineNumber":281,"author":{"gitId":"-"},"content":""},{"lineNumber":282,"author":{"gitId":"-"},"content":"RepoSense uses **Vuex** for the state management of the Vue components."},{"lineNumber":283,"author":{"gitId":"-"},"content":""},{"lineNumber":284,"author":{"gitId":"-"},"content":"* You can check the [Vuex guide](https://vuex.vuejs.org/guide/#the-simplest-store) to find out how Vuex can be used in a Vue project."},{"lineNumber":285,"author":{"gitId":"-"},"content":"* There is also a [course](https://vueschool.io/courses/vuex-for-everyone) available that will walk you through an example of creating Vue application with Vuex."},{"lineNumber":286,"author":{"gitId":"-"},"content":""},{"lineNumber":287,"author":{"gitId":"-"},"content":"\u003c!-- ------------------------------------------------------------------------------------------------------ --\u003e"},{"lineNumber":288,"author":{"gitId":"-"},"content":""},{"lineNumber":289,"author":{"gitId":"-"},"content":"### Pug"},{"lineNumber":290,"author":{"gitId":"-"},"content":""},{"lineNumber":291,"author":{"gitId":"-"},"content":"RepoSense uses Pug files as the template of each Vue component. The corresponding HTML templates will later be generated from the Pug files by [spuild](https://github.com/ongspxm/spuild2) when generating the report."},{"lineNumber":292,"author":{"gitId":"-"},"content":""},{"lineNumber":293,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":294,"author":{"gitId":"-"},"content":""},{"lineNumber":295,"author":{"gitId":"-"},"content":"Since Pug is used to generate the HTML template, it is recommended that you have a basic knowledge of HTML before starting to learn Pug. Once you understand how HTML works, you can proceed to focus on how Pug is translated into HTML."},{"lineNumber":296,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":297,"author":{"gitId":"-"},"content":""},{"lineNumber":298,"author":{"gitId":"-"},"content":"* You can refer to the [official documentation](https://pugjs.org/api/getting-started.html) or [this tutorial](https://www.youtube.com/watch?v\u003dkt3cEjjkCZA) to learn about the syntax of pug and how it is translated into HTML."},{"lineNumber":299,"author":{"gitId":"-"},"content":"* To get a hands-on experience, here is a [Pug to HTML converter](https://pughtml.com/). Feel free to try out a couple of examples on your own."},{"lineNumber":300,"author":{"gitId":"-"},"content":""},{"lineNumber":301,"author":{"gitId":"-"},"content":"\u003c!-- ------------------------------------------------------------------------------------------------------ --\u003e"},{"lineNumber":302,"author":{"gitId":"-"},"content":""},{"lineNumber":303,"author":{"gitId":"-"},"content":"### Scss"},{"lineNumber":304,"author":{"gitId":"-"},"content":""},{"lineNumber":305,"author":{"gitId":"-"},"content":"SCSS is used for styling the Pug template. The corresponding CSS will later be generated from the SCSS files by [spuild](https://github.com/ongspxm/spuild2) when generating the report. The corresponding source files are in `frontend/src/styles`."},{"lineNumber":306,"author":{"gitId":"-"},"content":""},{"lineNumber":307,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":308,"author":{"gitId":"-"},"content":""},{"lineNumber":309,"author":{"gitId":"-"},"content":"It is recommended that you have a basic knowledge of CSS before starting to learn SCSS. Once you understand how CSS works, you can proceed to focus on how SCSS is translated into CSS."},{"lineNumber":310,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":311,"author":{"gitId":"-"},"content":""},{"lineNumber":312,"author":{"gitId":"-"},"content":"* You can refer to the [style rules](https://sass-lang.com/documentation/style-rules) to learn about the similarities and differences between SCSS and CSS."},{"lineNumber":313,"author":{"gitId":"-"},"content":""},{"lineNumber":314,"author":{"gitId":"-"},"content":"{{ step(2) }} **Learn the RepoSense frontend architecture**"},{"lineNumber":315,"author":{"gitId":"-"},"content":""},{"lineNumber":316,"author":{"gitId":"-"},"content":"* You may want to refer to the [frontend architecture](report.html#report-architecture) to understand the implementation."},{"lineNumber":317,"author":{"gitId":"-"},"content":"* Another way for you to understand the frontend is to use **Vue.js devtools** to learn how the various Vue Components interact with each other. You can refer to the [frontend debugging guide](workflow.html#debugging-front-end) for more information."},{"lineNumber":318,"author":{"gitId":"-"},"content":""},{"lineNumber":319,"author":{"gitId":"-"},"content":"{{ step(3) }} **Gain some hands-on experience**"},{"lineNumber":320,"author":{"gitId":"-"},"content":""},{"lineNumber":321,"author":{"gitId":"-"},"content":"Here are some small tasks for you to gain some basic knowledge of the code related to the RepoSense frontend. You can do each in a separate branch in your local copy of the code."},{"lineNumber":322,"author":{"gitId":"-"},"content":""},{"lineNumber":323,"author":{"gitId":"-"},"content":"\u003cpanel header\u003d\"**Task 1: Highlight the selected author name in the summary view**\" type\u003d\"primary\"\u003e"},{"lineNumber":324,"author":{"gitId":"-"},"content":""},{"lineNumber":325,"author":{"gitId":"-"},"content":" **Task 1: Highlight the selected author name in the summary view**"},{"lineNumber":326,"author":{"gitId":"-"},"content":""},{"lineNumber":327,"author":{"gitId":"-"},"content":" 1. Open a [report](https://dashboard-1507-pr-reposense-reposense.surge.sh/)."},{"lineNumber":328,"author":{"gitId":"-"},"content":" 2. Randomly open the authorship contribution panel of an author (The icon is `\u003c/\u003e`)."},{"lineNumber":329,"author":{"gitId":"-"},"content":" 3. You should see that, after you open the panel, the author title background on the chart panel becomes yellow, and the background of the `\u003c/\u003e` icon you clicked becomes green."},{"lineNumber":330,"author":{"gitId":"-"},"content":""},{"lineNumber":331,"author":{"gitId":"-"},"content":" **Your Task**"},{"lineNumber":332,"author":{"gitId":"-"},"content":""},{"lineNumber":333,"author":{"gitId":"-"},"content":" Make corresponding changes to `summary charts` so that in step 3, after opening the panel, the font colour of the author title (in the form of `authorDisplayName(authorName)`) on the chart panel also becomes green."},{"lineNumber":334,"author":{"gitId":"-"},"content":""},{"lineNumber":335,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 1\"\u003e"},{"lineNumber":336,"author":{"gitId":"-"},"content":""},{"lineNumber":337,"author":{"gitId":"-"},"content":" Try to locate where the author title is in [`c-summary-charts.vue`](https://github.com/reposense/RepoSense/blob/master/frontend/src/components/c-summary-charts.vue)."},{"lineNumber":338,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":339,"author":{"gitId":"-"},"content":""},{"lineNumber":340,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 2\"\u003e"},{"lineNumber":341,"author":{"gitId":"-"},"content":""},{"lineNumber":342,"author":{"gitId":"-"},"content":" You can check what `activeUser` and `activeRepo` do in [`c-summary-charts.vue`](https://github.com/reposense/RepoSense/blob/master/frontend/src/components/c-summary-charts.vue)."},{"lineNumber":343,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":344,"author":{"gitId":"-"},"content":""},{"lineNumber":345,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 3\"\u003e"},{"lineNumber":346,"author":{"gitId":"-"},"content":""},{"lineNumber":347,"author":{"gitId":"-"},"content":" Refer to how changes are made to the title background and icon background in [`c-summary-charts.vue`](https://github.com/reposense/RepoSense/blob/master/frontend/src/components/c-summary-charts.vue)."},{"lineNumber":348,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":349,"author":{"gitId":"-"},"content":""},{"lineNumber":350,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 4\"\u003e"},{"lineNumber":351,"author":{"gitId":"-"},"content":""},{"lineNumber":352,"author":{"gitId":"-"},"content":" Some of the CSS styling for `c-summary-charts.vue` is in [`style.scss`](https://github.com/reposense/RepoSense/blob/master/frontend/src/styles/style.scss). You can add corresponding class selector if necessary."},{"lineNumber":353,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":354,"author":{"gitId":"-"},"content":""},{"lineNumber":355,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Suggested solution\"\u003e"},{"lineNumber":356,"author":{"gitId":"-"},"content":""},{"lineNumber":357,"author":{"gitId":"-"},"content":" There is more than 1 way to achieve this. One solution is shown as the following:"},{"lineNumber":358,"author":{"gitId":"-"},"content":""},{"lineNumber":359,"author":{"gitId":"-"},"content":" Add this to `c_summary.scss`."},{"lineNumber":360,"author":{"gitId":"-"},"content":""},{"lineNumber":361,"author":{"gitId":"asdfghjkxd"},"content":" ```css"},{"lineNumber":362,"author":{"gitId":"-"},"content":" .active-text {"},{"lineNumber":363,"author":{"gitId":"-"},"content":" color: mui-color(\u0027green\u0027);"},{"lineNumber":364,"author":{"gitId":"-"},"content":" }"},{"lineNumber":365,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":366,"author":{"gitId":"-"},"content":""},{"lineNumber":367,"author":{"gitId":"-"},"content":" In `c-summary-charts.vue`, locate `summary-chart__title--name`, and add the following to its `v-bind:class` attribute map."},{"lineNumber":368,"author":{"gitId":"-"},"content":""},{"lineNumber":369,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":370,"author":{"gitId":"-"},"content":" \u0027active-text\u0027: user.name \u003d\u003d\u003d activeUser \u0026\u0026 user.repoName \u003d\u003d\u003d activeRepo"},{"lineNumber":371,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":372,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":373,"author":{"gitId":"-"},"content":""},{"lineNumber":374,"author":{"gitId":"-"},"content":"\u003c/panel\u003e"},{"lineNumber":375,"author":{"gitId":"-"},"content":""},{"lineNumber":376,"author":{"gitId":"-"},"content":"\u003cpanel header\u003d\"**Task 2: Add tooltip for file path in authorship panel**\" type\u003d\"primary\"\u003e"},{"lineNumber":377,"author":{"gitId":"-"},"content":""},{"lineNumber":378,"author":{"gitId":"-"},"content":" **Task 2: Add tooltip for file path in authorship panel**"},{"lineNumber":379,"author":{"gitId":"-"},"content":""},{"lineNumber":380,"author":{"gitId":"-"},"content":" 1. Open a [report](https://dashboard-1507-pr-reposense-reposense.surge.sh/)."},{"lineNumber":381,"author":{"gitId":"-"},"content":" 2. Randomly open the authorship contribution panel of an author (The icon is `\u003c/\u003e`)."},{"lineNumber":382,"author":{"gitId":"-"},"content":" 3. Select a random file in the authorship contribution panel, and hover your mouse on an icon on the file title, a corresponding tooltip will show up, suggesting what the purpose of the icon is. However, when you hover the mouse over the file path on the file title, there is no tool tip shown, even if clicking the path itself will also trigger some event."},{"lineNumber":383,"author":{"gitId":"-"},"content":""},{"lineNumber":384,"author":{"gitId":"-"},"content":" \u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":385,"author":{"gitId":"-"},"content":""},{"lineNumber":386,"author":{"gitId":"-"},"content":" For example, if you open the authorship contribution panel of an author in `reposense/RepoSense[master]` and hover the mouse over the triangular icon beside the file path `src/main/java/reposense/model/Author.java`, you should see a tooltip saying `Click to hide file details` above the icon. However, when you hover the mouse over the file path `src/main/java/reposense/model/Author.java`, there is no corresponding tooltip shown."},{"lineNumber":387,"author":{"gitId":"-"},"content":" \u003c/box\u003e"},{"lineNumber":388,"author":{"gitId":"-"},"content":""},{"lineNumber":389,"author":{"gitId":"-"},"content":" **Your Task**"},{"lineNumber":390,"author":{"gitId":"-"},"content":""},{"lineNumber":391,"author":{"gitId":"-"},"content":" Make corresponding `authorship contribution panel` so that in step 3, when hovering your mouse over the file path:"},{"lineNumber":392,"author":{"gitId":"-"},"content":" * A tip saying `This is the file path. Click to hide file details` will show up when the file details are shown"},{"lineNumber":393,"author":{"gitId":"-"},"content":" * A tip saying `This is the file path. Click to show file details` will show up when the file details are not shown."},{"lineNumber":394,"author":{"gitId":"-"},"content":""},{"lineNumber":395,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 1\"\u003e"},{"lineNumber":396,"author":{"gitId":"-"},"content":""},{"lineNumber":397,"author":{"gitId":"-"},"content":" Try to locate where the file title and the file path are in [`c-authorship.vue`](https://github.com/reposense/RepoSense/blob/master/frontend/src/views/c-authorship.vue)."},{"lineNumber":398,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":399,"author":{"gitId":"-"},"content":""},{"lineNumber":400,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 2\"\u003e"},{"lineNumber":401,"author":{"gitId":"-"},"content":""},{"lineNumber":402,"author":{"gitId":"-"},"content":" You can check how tooltip is added for the triangular icon in the file title in [`c-authorship.vue`](https://github.com/reposense/RepoSense/blob/master/frontend/src/views/c-authorship.vue)."},{"lineNumber":403,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":404,"author":{"gitId":"-"},"content":""},{"lineNumber":405,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 3\"\u003e"},{"lineNumber":406,"author":{"gitId":"-"},"content":""},{"lineNumber":407,"author":{"gitId":"-"},"content":" You can check what `file.active` does and how it is used to switch between different tooltip messages when hovering the mouse on the corresponding icon."},{"lineNumber":408,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":409,"author":{"gitId":"-"},"content":""},{"lineNumber":410,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Suggested solution\"\u003e"},{"lineNumber":411,"author":{"gitId":"-"},"content":""},{"lineNumber":412,"author":{"gitId":"-"},"content":" There is more than 1 way to achieve this. One solution is shown as the following:"},{"lineNumber":413,"author":{"gitId":"-"},"content":""},{"lineNumber":414,"author":{"gitId":"-"},"content":" 1. In `c-authorship.vue`, locate the section that iterates through each file in `selectedFiles`."},{"lineNumber":415,"author":{"gitId":"-"},"content":" 2. There is a specific portion of the section that renders the toggle icon, the file index, and the file path of the file title."},{"lineNumber":416,"author":{"gitId":"-"},"content":" 3. Try to locate the `span` tag that renders `file.path`, and wraps it inside a new `tooptip`."},{"lineNumber":417,"author":{"gitId":"-"},"content":" 4. In the `tooltip`, use the following instructions to handle the switch of tooltip message."},{"lineNumber":418,"author":{"gitId":"-"},"content":""},{"lineNumber":419,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":420,"author":{"gitId":"-"},"content":" span.tooltip-text(v-show\u003d\"file.active\") This is the file path. Click to hide file details"},{"lineNumber":421,"author":{"gitId":"-"},"content":" span.tooltip-text(v-show\u003d\"!file.active\") This is the file path. Click to show file details"},{"lineNumber":422,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":423,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":424,"author":{"gitId":"-"},"content":""},{"lineNumber":425,"author":{"gitId":"-"},"content":"\u003c/panel\u003e"},{"lineNumber":426,"author":{"gitId":"-"},"content":""},{"lineNumber":427,"author":{"gitId":"-"},"content":"\u003cpanel header\u003d\"**Task 3: Add tooltip for commit message title in zoom panel**\" type\u003d\"primary\"\u003e"},{"lineNumber":428,"author":{"gitId":"-"},"content":""},{"lineNumber":429,"author":{"gitId":"-"},"content":" **Task 3: Add tooltip for commit message title in zoom panel**"},{"lineNumber":430,"author":{"gitId":"-"},"content":""},{"lineNumber":431,"author":{"gitId":"-"},"content":" 1. Open a [report](https://dashboard-1507-pr-reposense-reposense.surge.sh/)."},{"lineNumber":432,"author":{"gitId":"-"},"content":" 2. Randomly open the commits panel of an author."},{"lineNumber":433,"author":{"gitId":"-"},"content":" 3. Select a random commit in the commits panel, and hover your mouse on the icons on the commit title, there is no tooltip shown saying that it will redirect you to a different site."},{"lineNumber":434,"author":{"gitId":"-"},"content":""},{"lineNumber":435,"author":{"gitId":"-"},"content":" \u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":436,"author":{"gitId":"-"},"content":""},{"lineNumber":437,"author":{"gitId":"-"},"content":" For example, given the [report](https://dashboard-1507-pr-reposense-reposense.surge.sh/?search\u003d\u0026sort\u003dgroupTitle\u0026sortWithin\u003dtitle\u0026since\u003d\u0026timeframe\u003dcommit\u0026mergegroup\u003d\u0026groupSelect\u003dgroupByRepos\u0026breakdown\u003dfalse\u0026tabOpen\u003dtrue\u0026tabType\u003dzoom\u0026zA\u003deugenepeh\u0026zR\u003dreposense%2FRepoSense%5Bmaster%5D\u0026zACS\u003d99.28792569659443\u0026zS\u003d2017-10-09\u0026zFS\u003d\u0026zU\u003d2021-04-04\u0026zMG\u003dundefined\u0026zFTF\u003dcommit\u0026zFGS\u003dgroupByRepos\u0026zFR\u003dfalse), if you hover the mouse over the commit title `README: add acknowledgements section (#978)`, there is no corresponding tooltip shown, but when you click on the commit title, you will be redirected to a different site to see the commit details."},{"lineNumber":438,"author":{"gitId":"-"},"content":" \u003c/box\u003e"},{"lineNumber":439,"author":{"gitId":"-"},"content":""},{"lineNumber":440,"author":{"gitId":"-"},"content":" **Your Task**"},{"lineNumber":441,"author":{"gitId":"-"},"content":""},{"lineNumber":442,"author":{"gitId":"-"},"content":" Make corresponding changes to `zoom panel` so that in step 3, when hovering your mouse over the commit title, a tooltip saying `Click to view the detailed file changes in the commit` will show up on the commit title."},{"lineNumber":443,"author":{"gitId":"-"},"content":""},{"lineNumber":444,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 1\"\u003e"},{"lineNumber":445,"author":{"gitId":"-"},"content":""},{"lineNumber":446,"author":{"gitId":"-"},"content":" Try to locate where the commit title is in [`c-zoom.vue`](https://github.com/reposense/RepoSense/blob/master/frontend/src/views/c-zoom.vue)."},{"lineNumber":447,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":448,"author":{"gitId":"-"},"content":""},{"lineNumber":449,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 2\"\u003e"},{"lineNumber":450,"author":{"gitId":"-"},"content":""},{"lineNumber":451,"author":{"gitId":"-"},"content":" You can check how tooltip is added for other icons in [`c-zoom.vue`](https://github.com/reposense/RepoSense/blob/master/frontend/src/views/c-zoom.vue)."},{"lineNumber":452,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":453,"author":{"gitId":"-"},"content":""},{"lineNumber":454,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Hint 3\"\u003e"},{"lineNumber":455,"author":{"gitId":"-"},"content":""},{"lineNumber":456,"author":{"gitId":"-"},"content":" Check what `selectedCommits` does and how the link and commit title of each commit is retrieved."},{"lineNumber":457,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":458,"author":{"gitId":"-"},"content":""},{"lineNumber":459,"author":{"gitId":"-"},"content":" \u003cpanel header\u003d\"Suggested solution\"\u003e"},{"lineNumber":460,"author":{"gitId":"-"},"content":""},{"lineNumber":461,"author":{"gitId":"-"},"content":" There is more than 1 way to achieve this. One solution is shown as the following:"},{"lineNumber":462,"author":{"gitId":"-"},"content":""},{"lineNumber":463,"author":{"gitId":"-"},"content":" 1. In `c-zoom.vue`, locate the section that iterates through each `day` in `selectedCommits`."},{"lineNumber":464,"author":{"gitId":"-"},"content":" 2. The component that helps render the commit message title should be an `a` tag which uses the `getSliceLink` method to set the link to the commit details and uses `slice.messageTitle` to show the commit message title."},{"lineNumber":465,"author":{"gitId":"-"},"content":" 3. Wrap the `a` tag in a new `tooltip`."},{"lineNumber":466,"author":{"gitId":"-"},"content":" 4. In the `tooltip`, add the following content to show the tooltip message."},{"lineNumber":467,"author":{"gitId":"-"},"content":""},{"lineNumber":468,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":469,"author":{"gitId":"-"},"content":" span.tooltip-text Click to view the detailed file changes in the commit"},{"lineNumber":470,"author":{"gitId":"-"},"content":" ```"},{"lineNumber":471,"author":{"gitId":"-"},"content":" \u003c/panel\u003e"},{"lineNumber":472,"author":{"gitId":"-"},"content":""},{"lineNumber":473,"author":{"gitId":"-"},"content":"\u003c/panel\u003e"},{"lineNumber":474,"author":{"gitId":"-"},"content":""},{"lineNumber":475,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":476,"author":{"gitId":"-"},"content":""},{"lineNumber":477,"author":{"gitId":"-"},"content":"This is only for your practice. There is no need for you to commit this change and submit it in a pull request."},{"lineNumber":478,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":479,"author":{"gitId":"-"},"content":""},{"lineNumber":480,"author":{"gitId":"-"},"content":"{{ step(4) }} **Next Step**"},{"lineNumber":481,"author":{"gitId":"-"},"content":""},{"lineNumber":482,"author":{"gitId":"-"},"content":"You can now proceed to learn the [contributing workflow](workflow.html)."},{"lineNumber":483,"author":{"gitId":"-"},"content":""},{"lineNumber":484,"author":{"gitId":"-"},"content":"\u003c!-- \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d --\u003e"},{"lineNumber":485,"author":{"gitId":"-"},"content":""},{"lineNumber":486,"author":{"gitId":"-"},"content":"## DevOps"},{"lineNumber":487,"author":{"gitId":"-"},"content":""},{"lineNumber":488,"author":{"gitId":"supermii2"},"content":"If you want to understand and contribute to the DevOps aspect of RepoSense, you can refer to the [DevOps guide](devOpsGuide.html) for more information."}],"authorContributionMap":{"asdfghjkxd":11,"supermii2":1,"-":476}},{"path":"docs/dg/settingUp.md","fileType":"md","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"{% set title \u003d \"Setting up\" %}"},{"lineNumber":2,"author":{"gitId":"-"},"content":"\u003cfrontmatter\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"{{ title | safe }}\""},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003c/frontmatter\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"{% from \u0027scripts/macros.njk\u0027 import embed with context %}"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003ch1 class\u003d\"display-4\"\u003e\u003cmd\u003e{{ title }}\u003c/md\u003e\u003c/h1\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"**Prerequisites:**"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* **JDK `1.8.0_60`** up to **`17`** ([download :fas-download:](https://www.oracle.com/technetwork/java/javase/downloads/index.html))."},{"lineNumber":13,"author":{"gitId":"-"},"content":"* **Node.js** `16.19.1` to the latest minor version for `18` ([download :fas-download:](https://www.npmjs.com/get-npm))."},{"lineNumber":14,"author":{"gitId":"-"},"content":"* **git `2.23`** or later ([download :fas-download:](https://git-scm.com/downloads))."},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"supermii2"},"content":" Type `java -version`, `node -v` and `git --version` respectively on your OS terminal and ensure that you have the correct version of each prerequisite installed."},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003c/box\u003e"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":"\u003c!-- \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d --\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":"## Getting the code"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":"1. **Fork** the [reposense/reposense](https://github.com/reposense/RepoSense) repo."},{"lineNumber":26,"author":{"gitId":"-"},"content":"1. **Clone** the fork to your computer."},{"lineNumber":27,"author":{"gitId":"-"},"content":""},{"lineNumber":28,"author":{"gitId":"-"},"content":"## Setting up the IDE"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":"The recommended IDE is **Intellij IDEA**. While it is not compulsory to use it, note that we will not be able to help you troubleshoot IDE problems if you use any other IDE."},{"lineNumber":33,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":34,"author":{"gitId":"-"},"content":""},{"lineNumber":35,"author":{"gitId":"-"},"content":"1. **Ensure you have configured IDEA for the correct JDK**, as explained in [this tutorial](https://se-education.org/guides/tutorials/intellijJdk.html)."},{"lineNumber":36,"author":{"gitId":"-"},"content":"1. **Import the project as a Gradle project**, as explained in [this tutorial](https://se-education.org/guides/tutorials/intellijImportGradleProject.html)."},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":"\u003c!-- \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d --\u003e"},{"lineNumber":39,"author":{"gitId":"-"},"content":""},{"lineNumber":40,"author":{"gitId":"-"},"content":"## Verifying the setup"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":"This project is already configured to use Gradle for build automation. If you are new to Gradle, see [this tutorial](https://se-education.org/guides/tutorials/gradle.html) to learn how to use it."},{"lineNumber":45,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":"1. Open a command prompt and navigate to the project root."},{"lineNumber":48,"author":{"gitId":"-"},"content":"1. Run `gradlew clean build` (`./gradlew clean build` if you on a Unix-like OS), and ensure that it finishes with a `BUILD SUCCESSFUL` message."},{"lineNumber":49,"author":{"gitId":"-"},"content":"1. Run the tests using the `gradlew test systemtest` command and ensure it succeeds too."},{"lineNumber":50,"author":{"gitId":"-"},"content":"1. You can also try running the app using code, as given in the panel below."},{"lineNumber":51,"author":{"gitId":"-"},"content":""},{"lineNumber":52,"author":{"gitId":"-"},"content":"{{ embed(\u0027Developer guide → **Workflow → Running the app from code**\u0027, \u0027workflow.md#section-running-from-code\u0027, level\u003d2) }}"},{"lineNumber":53,"author":{"gitId":"-"},"content":""},{"lineNumber":54,"author":{"gitId":"-"},"content":"## Before you start coding"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":"... read the [Workflow](workflow.html) section."}],"authorContributionMap":{"supermii2":1,"-":55}},{"path":"docs/dg/styleGuides.md","fileType":"md","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"{% set title \u003d \"Appendix: Style guides\" %}"},{"lineNumber":2,"author":{"gitId":"-"},"content":"\u003cfrontmatter\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"{{ title | safe }}\""},{"lineNumber":4,"author":{"gitId":"-"},"content":"\u003c/frontmatter\u003e"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"\u003ch1 class\u003d\"display-4\"\u003e\u003cmd\u003e{{ title }}\u003c/md\u003e\u003c/h1\u003e"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":"\u003cdiv class\u003d\"lead\"\u003e"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"Our coding standards are mostly based on those at [se-education.org/guides](https://se-education.org/guides)."},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003c/div\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"-"},"content":"* [**CSS** coding standard](https://se-education.org/guides/conventions/css.html)"},{"lineNumber":14,"author":{"gitId":"-"},"content":"* [**Files/folders** naming conventions](https://se-education.org/guides/conventions/files.html)"},{"lineNumber":15,"author":{"gitId":"-"},"content":"* [**HTML** coding standard](https://se-education.org/guides/conventions/html.html)"},{"lineNumber":16,"author":{"gitId":"-"},"content":"* [**Markdown/MarkBind** coding standard](https://se-education.org/guides/conventions/markdown.html)"},{"lineNumber":17,"author":{"gitId":"-"},"content":"* [**Java** coding standard](https://se-education.org/guides/conventions/java/index.html)"},{"lineNumber":18,"author":{"gitId":"-"},"content":"* [**JavaScript** coding standard](https://se-education.org/guides/conventions/javascript.html)"},{"lineNumber":19,"author":{"gitId":"-"},"content":"* **TypeScript**: In addition to the JavaScript coding standard, follow the [**recommended ESLint rules**](https://typescript-eslint.io/rules/) and the formatting rules [described below](#typescript-specific-formatting)."},{"lineNumber":20,"author":{"gitId":"-"},"content":"* **Vue Components**: Follow the [**Vue style guide**](https://vuejs.org/style-guide/), up to the **Recommended** section."},{"lineNumber":21,"author":{"gitId":"-"},"content":"* **Documentation**: Follow the [**Google developer documentation style guide**](https://developers.google.com/style)."},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":"## Note on Ternary Operators:"},{"lineNumber":24,"author":{"gitId":"-"},"content":"Ternary operators can be used to shorten if-else blocks such as this:"},{"lineNumber":25,"author":{"gitId":"asdfghjkxd"},"content":"```java"},{"lineNumber":26,"author":{"gitId":"-"},"content":"LocalDateTime min \u003d ARBITRARY_FIRST_COMMIT_DATE_UTC.withZoneSameInstant(zoneId).toLocalDateTime();"},{"lineNumber":27,"author":{"gitId":"-"},"content":"if (!commitInfos.isEmpty()) {"},{"lineNumber":28,"author":{"gitId":"-"},"content":" min \u003d commitInfos.get(0).getTime();"},{"lineNumber":29,"author":{"gitId":"-"},"content":"}"},{"lineNumber":30,"author":{"gitId":"-"},"content":"return min;"},{"lineNumber":31,"author":{"gitId":"-"},"content":"```"},{"lineNumber":32,"author":{"gitId":"-"},"content":""},{"lineNumber":33,"author":{"gitId":"-"},"content":"The result would look something like this:"},{"lineNumber":34,"author":{"gitId":"asdfghjkxd"},"content":"```java"},{"lineNumber":35,"author":{"gitId":"-"},"content":"return (commitInfos.isEmpty())"},{"lineNumber":36,"author":{"gitId":"-"},"content":" ? ARBITRARY_FIRST_COMMIT_DATE_UTC.withZoneSameInstant(zoneId).toLocalDateTime()"},{"lineNumber":37,"author":{"gitId":"-"},"content":" : commitInfos.get(0).getTime();"},{"lineNumber":38,"author":{"gitId":"-"},"content":"```"},{"lineNumber":39,"author":{"gitId":"-"},"content":""},{"lineNumber":40,"author":{"gitId":"-"},"content":"To preserve readability, it is recommended that if-else blocks should only be"},{"lineNumber":41,"author":{"gitId":"-"},"content":"converted to ternary operators if the resultant code can be kept at most 3 lines long"},{"lineNumber":42,"author":{"gitId":"-"},"content":"(in accordance to the coding standard)."},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":"## Additional Javadoc requirements:"},{"lineNumber":45,"author":{"gitId":"-"},"content":"In addition to what has been mentioned in the [**Java** coding standard (SE-EDU)](https://se-education.org/guides/conventions/java/index.html) and [**Google Java Style Guide**](https://google.github.io/styleguide/javaguide.html), we also stipulate the following standards for Javadoc:"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* If Javadoc is written for a method, all input parameters should be described in the Javadoc, either in the description with `@code tags` or through `@param` block tags."},{"lineNumber":47,"author":{"gitId":"-"},"content":" * If `@param` block tags are used, they must be used for all parameters."},{"lineNumber":48,"author":{"gitId":"-"},"content":" * This is not necessary (although still recommended) for methods with `@Override` annotations if Javadoc is used. However, if the method that is being overriden is part of your code and has Javadoc, all parameters must be described."},{"lineNumber":49,"author":{"gitId":"-"},"content":""},{"lineNumber":50,"author":{"gitId":"-"},"content":"Negative Examples:"},{"lineNumber":51,"author":{"gitId":"asdfghjkxd"},"content":"```java"},{"lineNumber":52,"author":{"gitId":"asdfghjkxd"},"content":"// Not okay (Only mentions zoneId parameter):"},{"lineNumber":53,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * Returns a {@link LocalDateTime} object adjusted for timezone given by {@code zoneId}."},{"lineNumber":55,"author":{"gitId":"-"},"content":" */"},{"lineNumber":56,"author":{"gitId":"-"},"content":"public LocalDateTime adjustTimeZone(LocalDateTime sinceDate, ZoneId zoneId) {"},{"lineNumber":57,"author":{"gitId":"-"},"content":" //Code here"},{"lineNumber":58,"author":{"gitId":"-"},"content":"}"},{"lineNumber":59,"author":{"gitId":"-"},"content":""},{"lineNumber":60,"author":{"gitId":"asdfghjkxd"},"content":"// Not okay (@param tag used only for zoneId)"},{"lineNumber":61,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * Returns a {@link LocalDateTime} object by adjusting {@code sinceDate}"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * to the timezone given by {@code zoneId}."},{"lineNumber":64,"author":{"gitId":"-"},"content":" *"},{"lineNumber":65,"author":{"gitId":"-"},"content":" * @param zoneId The timezone ID to adjust the sinceDate to."},{"lineNumber":66,"author":{"gitId":"-"},"content":" */"},{"lineNumber":67,"author":{"gitId":"-"},"content":"public LocalDateTime adjustTimeZone(LocalDateTime sinceDate, ZoneId zoneId) {"},{"lineNumber":68,"author":{"gitId":"-"},"content":" //Code here"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}"},{"lineNumber":70,"author":{"gitId":"-"},"content":"```"},{"lineNumber":71,"author":{"gitId":"-"},"content":"Positive Example #1:"},{"lineNumber":72,"author":{"gitId":"asdfghjkxd"},"content":"```java"},{"lineNumber":73,"author":{"gitId":"asdfghjkxd"},"content":"// Okay (No @param tags):"},{"lineNumber":74,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":75,"author":{"gitId":"-"},"content":" * Returns a {@link LocalDateTime} object by adjusting {@code sinceDate}"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * to the timezone given by {@code zoneId}."},{"lineNumber":77,"author":{"gitId":"-"},"content":" */"},{"lineNumber":78,"author":{"gitId":"-"},"content":"public LocalDateTime adjustTimeZone(LocalDateTime sinceDate, ZoneId zoneId) {"},{"lineNumber":79,"author":{"gitId":"-"},"content":" //Code here"},{"lineNumber":80,"author":{"gitId":"-"},"content":"}"},{"lineNumber":81,"author":{"gitId":"-"},"content":"```"},{"lineNumber":82,"author":{"gitId":"-"},"content":"Positive Example #2:"},{"lineNumber":83,"author":{"gitId":"asdfghjkxd"},"content":"```java"},{"lineNumber":84,"author":{"gitId":"asdfghjkxd"},"content":"// Okay (@param tags used for all inputs):"},{"lineNumber":85,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":86,"author":{"gitId":"-"},"content":" * Returns a {@link LocalDateTime} object by adjusting {@code sinceDate}"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * to the timezone given by {@code zoneId}."},{"lineNumber":88,"author":{"gitId":"-"},"content":" *"},{"lineNumber":89,"author":{"gitId":"-"},"content":" * @param sinceDate The date prior to the timezone conversion."},{"lineNumber":90,"author":{"gitId":"-"},"content":" * @param zoneId The timezone ID to adjust the sinceDate to."},{"lineNumber":91,"author":{"gitId":"-"},"content":" */"},{"lineNumber":92,"author":{"gitId":"-"},"content":"public LocalDateTime adjustTimeZone(LocalDateTime sinceDate, ZoneId zoneId) {"},{"lineNumber":93,"author":{"gitId":"-"},"content":" //Code here"},{"lineNumber":94,"author":{"gitId":"-"},"content":"}"},{"lineNumber":95,"author":{"gitId":"-"},"content":"```"},{"lineNumber":96,"author":{"gitId":"-"},"content":""},{"lineNumber":97,"author":{"gitId":"-"},"content":"* Within the main code, if an exception is thrown in a method (both header and body) for which Javadoc is written, a `@throws` tag must be used to describe how the exception is likely to arise."},{"lineNumber":98,"author":{"gitId":"-"},"content":" * This requirement does not apply to test code."},{"lineNumber":99,"author":{"gitId":"-"},"content":" * One `@throws` tag per unique exception."},{"lineNumber":100,"author":{"gitId":"-"},"content":" * The order of exceptions in the `@throws` tag block should match that of the method\u0027s `throws` statement."},{"lineNumber":101,"author":{"gitId":"asdfghjkxd"},"content":"```java"},{"lineNumber":102,"author":{"gitId":"asdfghjkxd"},"content":"// Not okay (order of exceptions in tag block and method signature do not match):"},{"lineNumber":103,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":104,"author":{"gitId":"-"},"content":" * Returns a {@link LocalDateTime} object from {@code dateString}."},{"lineNumber":105,"author":{"gitId":"-"},"content":" *"},{"lineNumber":106,"author":{"gitId":"-"},"content":" * @throws ParseException if {@code dateString} cannot be parsed."},{"lineNumber":107,"author":{"gitId":"-"},"content":" * @throws NullPointerException if {@code dateString} is null."},{"lineNumber":108,"author":{"gitId":"-"},"content":" */"},{"lineNumber":109,"author":{"gitId":"-"},"content":"public LocalDateTime parseDate(String dateString) throws NullPointerException, ParseException {"},{"lineNumber":110,"author":{"gitId":"-"},"content":" String trimmedString \u003d dateString.toUpperCase(); // NullPointerException may happen here."},{"lineNumber":111,"author":{"gitId":"-"},"content":" // Code here"},{"lineNumber":112,"author":{"gitId":"-"},"content":"}"},{"lineNumber":113,"author":{"gitId":"-"},"content":""},{"lineNumber":114,"author":{"gitId":"asdfghjkxd"},"content":"// Should be:"},{"lineNumber":115,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":116,"author":{"gitId":"-"},"content":" * Returns a {@link LocalDateTime} object from {@code dateString}."},{"lineNumber":117,"author":{"gitId":"-"},"content":" *"},{"lineNumber":118,"author":{"gitId":"-"},"content":" * @throws NullPointerException if {@code dateString} is null."},{"lineNumber":119,"author":{"gitId":"-"},"content":" * @throws ParseException if {@code dateString} cannot be parsed."},{"lineNumber":120,"author":{"gitId":"-"},"content":" */"},{"lineNumber":121,"author":{"gitId":"-"},"content":"public LocalDateTime parseDate(String dateString) throws NullPointerException, ParseException {"},{"lineNumber":122,"author":{"gitId":"-"},"content":" String trimmedString \u003d dateString.toUpperCase(); // NullPointerException may happen here."},{"lineNumber":123,"author":{"gitId":"-"},"content":" // Code here"},{"lineNumber":124,"author":{"gitId":"-"},"content":"}"},{"lineNumber":125,"author":{"gitId":"-"},"content":"```"},{"lineNumber":126,"author":{"gitId":"-"},"content":"## TypeScript specific formatting"},{"lineNumber":127,"author":{"gitId":"-"},"content":""},{"lineNumber":128,"author":{"gitId":"-"},"content":"For TypeScript specific code, such as within an `interface` or type annotations, we also stipulate the following standards:"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* Use semicolons as delimiters for TypeScript interfaces and types."},{"lineNumber":130,"author":{"gitId":"-"},"content":""},{"lineNumber":131,"author":{"gitId":"-"},"content":"Negative Examples:"},{"lineNumber":132,"author":{"gitId":"-"},"content":"```typescript"},{"lineNumber":133,"author":{"gitId":"-"},"content":"// missing semicolon delimiter"},{"lineNumber":134,"author":{"gitId":"-"},"content":"interface Foo {"},{"lineNumber":135,"author":{"gitId":"-"},"content":" name: string"},{"lineNumber":136,"author":{"gitId":"-"},"content":" greet(): string"},{"lineNumber":137,"author":{"gitId":"-"},"content":"}"},{"lineNumber":138,"author":{"gitId":"-"},"content":""},{"lineNumber":139,"author":{"gitId":"-"},"content":"// using incorrect delimiter"},{"lineNumber":140,"author":{"gitId":"-"},"content":"interface Foo {"},{"lineNumber":141,"author":{"gitId":"-"},"content":" name: string,"},{"lineNumber":142,"author":{"gitId":"-"},"content":" greet(): string,"},{"lineNumber":143,"author":{"gitId":"-"},"content":"}"},{"lineNumber":144,"author":{"gitId":"-"},"content":"```"},{"lineNumber":145,"author":{"gitId":"-"},"content":"Positive Example:"},{"lineNumber":146,"author":{"gitId":"-"},"content":"```typescript"},{"lineNumber":147,"author":{"gitId":"-"},"content":"// semicolon delimiter"},{"lineNumber":148,"author":{"gitId":"-"},"content":"interface Foo {"},{"lineNumber":149,"author":{"gitId":"-"},"content":" name: string;"},{"lineNumber":150,"author":{"gitId":"-"},"content":" greet(): string;"},{"lineNumber":151,"author":{"gitId":"-"},"content":"}"},{"lineNumber":152,"author":{"gitId":"-"},"content":"```"},{"lineNumber":153,"author":{"gitId":"-"},"content":"* For type annotations, use a space after but not before."},{"lineNumber":154,"author":{"gitId":"-"},"content":""},{"lineNumber":155,"author":{"gitId":"-"},"content":"Negative Examples:"},{"lineNumber":156,"author":{"gitId":"-"},"content":"```typescript"},{"lineNumber":157,"author":{"gitId":"-"},"content":"let foo:string \u003d \"bar\";"},{"lineNumber":158,"author":{"gitId":"-"},"content":"let foo :string \u003d \"bar\";"},{"lineNumber":159,"author":{"gitId":"-"},"content":"let foo : string \u003d \"bar\";"},{"lineNumber":160,"author":{"gitId":"-"},"content":""},{"lineNumber":161,"author":{"gitId":"-"},"content":"function foo():string {}"},{"lineNumber":162,"author":{"gitId":"-"},"content":"function foo() :string {}"},{"lineNumber":163,"author":{"gitId":"-"},"content":"function foo() : string {}"},{"lineNumber":164,"author":{"gitId":"-"},"content":""},{"lineNumber":165,"author":{"gitId":"-"},"content":"class Foo {"},{"lineNumber":166,"author":{"gitId":"-"},"content":" name:string;"},{"lineNumber":167,"author":{"gitId":"-"},"content":"}"},{"lineNumber":168,"author":{"gitId":"-"},"content":""},{"lineNumber":169,"author":{"gitId":"-"},"content":"class Foo {"},{"lineNumber":170,"author":{"gitId":"-"},"content":" name :string;"},{"lineNumber":171,"author":{"gitId":"-"},"content":"}"},{"lineNumber":172,"author":{"gitId":"-"},"content":""},{"lineNumber":173,"author":{"gitId":"-"},"content":"class Foo {"},{"lineNumber":174,"author":{"gitId":"-"},"content":" name : string;"},{"lineNumber":175,"author":{"gitId":"-"},"content":"}"},{"lineNumber":176,"author":{"gitId":"-"},"content":"```"},{"lineNumber":177,"author":{"gitId":"-"},"content":"Positive Examples:"},{"lineNumber":178,"author":{"gitId":"-"},"content":"```typescript"},{"lineNumber":179,"author":{"gitId":"-"},"content":"let foo: string \u003d \"bar\";"},{"lineNumber":180,"author":{"gitId":"-"},"content":""},{"lineNumber":181,"author":{"gitId":"-"},"content":"function foo(): string {}"},{"lineNumber":182,"author":{"gitId":"-"},"content":""},{"lineNumber":183,"author":{"gitId":"-"},"content":"class Foo {"},{"lineNumber":184,"author":{"gitId":"-"},"content":" name: string;"},{"lineNumber":185,"author":{"gitId":"-"},"content":"}"},{"lineNumber":186,"author":{"gitId":"-"},"content":"```"}],"authorContributionMap":{"asdfghjkxd":12,"-":174}},{"path":"docs/ug/cli.md","fileType":"md","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"{% set title \u003d \"Appendix: CLI syntax reference\" %}"},{"lineNumber":2,"author":{"gitId":"-"},"content":"\u003cfrontmatter\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"{{ title | safe }}\""},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003c/frontmatter\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"\u003ch1 class\u003d\"display-4\"\u003e\u003cmd\u003e{{ title }}\u003c/md\u003e\u003c/h1\u003e"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003cdiv class\u003d\"lead\"\u003e"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"The command `java -jar RepoSense.jar` takes several flags."},{"lineNumber":12,"author":{"gitId":"-"},"content":"\u003c/div\u003e"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"\u003cbox\u003e"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":"**Examples**:"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":"An example of a command using most parameters:\u003cbr\u003e"},{"lineNumber":19,"author":{"gitId":"-"},"content":"`java -jar RepoSense.jar --repos https://github.com/reposense/RepoSense.git --output ./report_folder --since 31/1/2017 --until 31/12/2018 --formats java adoc xml --view --ignore-standalone-config --last-modified-date --timezone UTC+08 --find-previous-authors`"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":"Same command as above but using most parameters in alias format:\u003cbr\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":"`java -jar RepoSense.jar -r https://github.com/reposense/RepoSense.git -o ./report_folder -s 31/1/2017 -u 31/12/2018 -f java adoc xml -v -i -l -t UTC+08 -F`"},{"lineNumber":23,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":"The section below provides explanations for each of the flags."},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c!-- --------------------------◘---------------------------------------------------------------------------- --\u003e"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":"### `--assets`, `-a`"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cdiv id\u003d\"section-assets\"\u003e"},{"lineNumber":32,"author":{"gitId":"-"},"content":""},{"lineNumber":33,"author":{"gitId":"-"},"content":"**`--assets ASSETS_DIRECTORY`**: Specifies where to place assets for report generation."},{"lineNumber":34,"author":{"gitId":"sopa301"},"content":"* Parameter: `ASSETS_DIRECTORY` The directory containing the assets files. A `favicon.ico` file can be placed here to customize the favicon of the dashboard,"},{"lineNumber":35,"author":{"gitId":"sopa301"},"content":"while a `title.md` file can be placed to customize the header of the report using [Markdown syntax](https://www.markdownguide.org/basic-syntax/)."},{"lineNumber":36,"author":{"gitId":"-"},"content":"* Alias: `-a`"},{"lineNumber":37,"author":{"gitId":"-"},"content":"* Example: `--assets ./assets` or `-a ./assets`"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":"* If `--assets` is not specified, RepoSense looks for assets in the `./assets` directory."},{"lineNumber":42,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":43,"author":{"gitId":"-"},"content":"\u003c/div\u003e"},{"lineNumber":44,"author":{"gitId":"-"},"content":""},{"lineNumber":45,"author":{"gitId":"-"},"content":"\u003c!-- --------------------------◘---------------------------------------------------------------------------- --\u003e"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":"### `--config`, `-c`"},{"lineNumber":48,"author":{"gitId":"-"},"content":""},{"lineNumber":49,"author":{"gitId":"-"},"content":"\u003cdiv id\u003d\"section-config\"\u003e"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"-"},"content":"**`--config CONFIG_DIRECTORY`**: Specifies that config files located in `CONFIG_DIRECTORY` should be used to customize the report."},{"lineNumber":52,"author":{"gitId":"-"},"content":"* Parameter: `CONFIG_DIRECTORY` The directory containing the config files. Should contain a `repo-config.csv` file. Optionally, can contain an `author-config.csv` file or/and a `group-config.csv` file or/and a `report-config.json` file."},{"lineNumber":53,"author":{"gitId":"-"},"content":"* Alias: `-c`"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* Example: `java -jar RepoSense.jar --config ./config`"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":57,"author":{"gitId":"-"},"content":""},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Cannot be used with `--repos`. The `--repos` flag will take precedence over this flag."},{"lineNumber":59,"author":{"gitId":"-"},"content":"* If both `--repos` and `--config` are not specified, RepoSense looks for config files in the `./config` directory."},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Config files must follow [this](./configFiles.html) format."},{"lineNumber":61,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":62,"author":{"gitId":"-"},"content":"\u003c/div\u003e"},{"lineNumber":63,"author":{"gitId":"-"},"content":""},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003c!-- ------------------------------------------------------------------------------------------------------ --\u003e"},{"lineNumber":65,"author":{"gitId":"-"},"content":""},{"lineNumber":66,"author":{"gitId":"-"},"content":"### `--formats`, `-f`"},{"lineNumber":67,"author":{"gitId":"-"},"content":""},{"lineNumber":68,"author":{"gitId":"-"},"content":"**`--formats LIST_OF_FORMATS`**: Specifies which file extensions to be included in the analysis."},{"lineNumber":69,"author":{"gitId":"-"},"content":"* Parameter: `LIST_OF_FORMATS` A space-separated list of file extensions that should be included in the analysis.\u003cbr\u003e"},{"lineNumber":70,"author":{"gitId":"-"},"content":" Default: all file formats"},{"lineNumber":71,"author":{"gitId":"-"},"content":"* Alias: `-f`"},{"lineNumber":72,"author":{"gitId":"-"},"content":"* Example:`--formats css fxml gradle` or `-f css fxml gradle`"},{"lineNumber":73,"author":{"gitId":"-"},"content":""},{"lineNumber":74,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":75,"author":{"gitId":"-"},"content":""},{"lineNumber":76,"author":{"gitId":"-"},"content":"Binary file formats, such as `jpg`, `png`,`exe`,`zip`, `rar`, `docx`, and `pptx`, all will be labelled as the file type `binary` in the generated report."},{"lineNumber":77,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":78,"author":{"gitId":"-"},"content":""},{"lineNumber":79,"author":{"gitId":"-"},"content":"\u003c!-- ------------------------------------------------------------------------------------------------------ --\u003e"},{"lineNumber":80,"author":{"gitId":"-"},"content":""},{"lineNumber":81,"author":{"gitId":"-"},"content":"### `--find-previous-authors`, `-F`"},{"lineNumber":82,"author":{"gitId":"-"},"content":""},{"lineNumber":83,"author":{"gitId":"-"},"content":"**`--find-previous-authors`**: Utilizes Git blame\u0027s ignore revisions functionality, RepoSense will attempt to blame the line changes caused by commits in the ignore commit list to the previous authors who altered those lines (if available)."},{"lineNumber":84,"author":{"gitId":"-"},"content":"* Default: RepoSense will assume that no authors are responsible for the code changes in the lines altered by commits in the ignore commit list."},{"lineNumber":85,"author":{"gitId":"-"},"content":"* Alias: `-F` (uppercase F)"},{"lineNumber":86,"author":{"gitId":"-"},"content":"* Example:`--find-previous-authors` or `-F`"},{"lineNumber":87,"author":{"gitId":"-"},"content":""},{"lineNumber":88,"author":{"gitId":"-"},"content":"\u003c!-- ------------------------------------------------------------------------------------------------------ --\u003e"},{"lineNumber":89,"author":{"gitId":"-"},"content":""},{"lineNumber":90,"author":{"gitId":"-"},"content":"### `--help`, `-h`"},{"lineNumber":91,"author":{"gitId":"-"},"content":""},{"lineNumber":92,"author":{"gitId":"-"},"content":"**`--help`**: Shows the help message."},{"lineNumber":93,"author":{"gitId":"-"},"content":"* Alias: `-h`"},{"lineNumber":94,"author":{"gitId":"-"},"content":""},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":96,"author":{"gitId":"-"},"content":""},{"lineNumber":97,"author":{"gitId":"-"},"content":"Cannot be used with any other flags. This flag takes precedence over all other flags."},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c!-- ------------------------------------------------------------------------------------------------------ --\u003e"},{"lineNumber":100,"author":{"gitId":"-"},"content":""},{"lineNumber":101,"author":{"gitId":"-"},"content":"### `--ignore-standalone-config`, `-i`"},{"lineNumber":102,"author":{"gitId":"-"},"content":""},{"lineNumber":103,"author":{"gitId":"-"},"content":"**`--ignore-standalone-config`**: Specifies that the standalone config file in the repo should be ignored."},{"lineNumber":104,"author":{"gitId":"-"},"content":"* Default: the standalone config file is not ignored"},{"lineNumber":105,"author":{"gitId":"-"},"content":"* Alias: `-i`"},{"lineNumber":106,"author":{"gitId":"-"},"content":"* Example:`--ignore-standalone-config` or `-i`"},{"lineNumber":107,"author":{"gitId":"-"},"content":""},{"lineNumber":108,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":109,"author":{"gitId":"-"},"content":""},{"lineNumber":110,"author":{"gitId":"-"},"content":"This flag overrides the `Ignore standalone config` field in the CSV config file."},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":112,"author":{"gitId":"-"},"content":""},{"lineNumber":113,"author":{"gitId":"-"},"content":"\u003c!-- ------------------------------------------------------------------------------------------------------ --\u003e"},{"lineNumber":114,"author":{"gitId":"-"},"content":""},{"lineNumber":115,"author":{"gitId":"-"},"content":"### `--ignore-filesize-limit`, `-I`"},{"lineNumber":116,"author":{"gitId":"-"},"content":""},{"lineNumber":117,"author":{"gitId":"-"},"content":"**`--ignore-filesize-limit`**: Specifies that the file size limit (both default and user-defined) should be ignored during the analysis."},{"lineNumber":118,"author":{"gitId":"-"},"content":"* Default: the file size limit is not ignored"},{"lineNumber":119,"author":{"gitId":"-"},"content":"* Alias: `-I`"},{"lineNumber":120,"author":{"gitId":"-"},"content":"* Example:`--ignore-filesize-limit` or `-I`"},{"lineNumber":121,"author":{"gitId":"-"},"content":""},{"lineNumber":122,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":123,"author":{"gitId":"-"},"content":""},{"lineNumber":124,"author":{"gitId":"-"},"content":"All files are subject to a default file size limit or a custom size limit set by the user. Most files should not be"},{"lineNumber":125,"author":{"gitId":"-"},"content":"affected by the default size limit. This flag can be useful for including files in your report that are affected by"},{"lineNumber":126,"author":{"gitId":"-"},"content":"the size limit. Note that this flag may result in large report sizes and/or slower report generation."},{"lineNumber":127,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":128,"author":{"gitId":"-"},"content":""},{"lineNumber":129,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":130,"author":{"gitId":"-"},"content":""},{"lineNumber":131,"author":{"gitId":"-"},"content":"This flag overrides the `Ignore file size limit` field in the CSV config file."},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":133,"author":{"gitId":"-"},"content":""},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c!-- ------------------------------------------------------------------------------------------------------ --\u003e"},{"lineNumber":135,"author":{"gitId":"-"},"content":""},{"lineNumber":136,"author":{"gitId":"-"},"content":"### `--last-modified-date`, `-l`"},{"lineNumber":137,"author":{"gitId":"-"},"content":""},{"lineNumber":138,"author":{"gitId":"-"},"content":"**`--last-modified-date`**: Specifies that the last modified date of each line of code should be added to `authorship.json`."},{"lineNumber":139,"author":{"gitId":"-"},"content":"* Default: the last modified date of each line of code will not be added to `authorship.json`"},{"lineNumber":140,"author":{"gitId":"-"},"content":"* Alias: `-l` (lowercase L)"},{"lineNumber":141,"author":{"gitId":"-"},"content":"* Example:`--last-modified-date` or `-l`"},{"lineNumber":142,"author":{"gitId":"-"},"content":""},{"lineNumber":143,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":144,"author":{"gitId":"-"},"content":""},{"lineNumber":145,"author":{"gitId":"-"},"content":"* Cannot be used with `--shallow-cloning`. This may result in an incorrect last modified date."},{"lineNumber":146,"author":{"gitId":"-"},"content":"* The last modified dates will be in the same timezone specified with the `--timezone` flag."},{"lineNumber":147,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":148,"author":{"gitId":"-"},"content":""},{"lineNumber":149,"author":{"gitId":"-"},"content":"\u003c!-- ------------------------------------------------------------------------------------------------------ --\u003e"},{"lineNumber":150,"author":{"gitId":"-"},"content":""},{"lineNumber":151,"author":{"gitId":"-"},"content":"### `--output`, `-o`"},{"lineNumber":152,"author":{"gitId":"-"},"content":""},{"lineNumber":153,"author":{"gitId":"-"},"content":"**`--output OUTPUT_DIRECTORY`**: Indicates where to save the report generated."},{"lineNumber":154,"author":{"gitId":"-"},"content":"* Parameter: `OUTPUT_DIRECTORY` The location for the generated `reposense-report` folder.\u003cbr\u003e"},{"lineNumber":155,"author":{"gitId":"-"},"content":" Default: current directory"},{"lineNumber":156,"author":{"gitId":"-"},"content":"* Alias: `-o`"},{"lineNumber":157,"author":{"gitId":"-"},"content":"* Example: `--output ./foo` or `-o ./foo` (the report will be in the `./foo/reposense-report` folder)"},{"lineNumber":158,"author":{"gitId":"-"},"content":""},{"lineNumber":159,"author":{"gitId":"-"},"content":"\u003c!-- ------------------------------------------------------------------------------------------------------ --\u003e"},{"lineNumber":160,"author":{"gitId":"-"},"content":""},{"lineNumber":161,"author":{"gitId":"-"},"content":"### `--period`, `-p`"},{"lineNumber":162,"author":{"gitId":"-"},"content":""},{"lineNumber":163,"author":{"gitId":"-"},"content":"**`--period PERIOD`**: Specifies the period of analysis window."},{"lineNumber":164,"author":{"gitId":"-"},"content":"* Parameter: `PERIOD` The period of analysis window, in the format `nd` (for n days) or `nw` (for n weeks). It is used to calculate end date if only start date is specified, or calculate end date if only start date is specified."},{"lineNumber":165,"author":{"gitId":"-"},"content":"* Alias: `-p`"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* Example: `--period 30d` or `--period 4w`"},{"lineNumber":167,"author":{"gitId":"-"},"content":""},{"lineNumber":168,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":169,"author":{"gitId":"-"},"content":""},{"lineNumber":170,"author":{"gitId":"-"},"content":"* If both start date and end date are not specified, the date of generating the report will be taken as the end date."},{"lineNumber":171,"author":{"gitId":"-"},"content":"* May analyze the incorrect date range if used with `--since d1`. The program will throw a warning."},{"lineNumber":172,"author":{"gitId":"-"},"content":"* Cannot be used with both `--since` and `--until`. The program will throw an exception."},{"lineNumber":173,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":174,"author":{"gitId":"-"},"content":"\u003c!-- ------------------------------------------------------------------------------------------------------ --\u003e"},{"lineNumber":175,"author":{"gitId":"-"},"content":""},{"lineNumber":176,"author":{"gitId":"-"},"content":"### `--repo`, `--repos`, `-r`"},{"lineNumber":177,"author":{"gitId":"-"},"content":""},{"lineNumber":178,"author":{"gitId":"-"},"content":"**`--repo REPO_LOCATION`**: Specifies which repositories to analyze."},{"lineNumber":179,"author":{"gitId":"-"},"content":"* Parameter: `REPO_LOCATION` A list of URLs or the disk location of the git repositories to analyze, separated by spaces."},{"lineNumber":180,"author":{"gitId":"-"},"content":"* Alias: `-r`"},{"lineNumber":181,"author":{"gitId":"-"},"content":"* Examples:"},{"lineNumber":182,"author":{"gitId":"-"},"content":" * `--repos https://github.com/reposense/RepoSense.git`"},{"lineNumber":183,"author":{"gitId":"-"},"content":" * `--repo https://github.com/reposense/RepoSense.git c:/myRepose/foo/bar`: analyzes the two specified repos (one remote, one local) and generates one report containing details of both."},{"lineNumber":184,"author":{"gitId":"-"},"content":""},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":186,"author":{"gitId":"-"},"content":""},{"lineNumber":187,"author":{"gitId":"-"},"content":"Cannot be used with `--config`. This flag takes precedence over `--config`."},{"lineNumber":188,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":189,"author":{"gitId":"-"},"content":"\u003c!-- ------------------------------------------------------------------------------------------------------ --\u003e"},{"lineNumber":190,"author":{"gitId":"-"},"content":""},{"lineNumber":191,"author":{"gitId":"-"},"content":"### `--shallow-cloning`, `-S`"},{"lineNumber":192,"author":{"gitId":"-"},"content":""},{"lineNumber":193,"author":{"gitId":"-"},"content":"**`--shallow-cloning`**: Clones repositories using Git\u0027s shallow cloning functionality, which can significantly reduce the time taken to clone large repositories. However, the flag should not be used for smaller repositories where the `.git` file is smaller than 500 MB, as it would create overhead."},{"lineNumber":194,"author":{"gitId":"-"},"content":"* Default: RepoSense does not clone repositories using Git\u0027s shallow cloning functionality."},{"lineNumber":195,"author":{"gitId":"-"},"content":"* Alias: `-S` (uppercase S)"},{"lineNumber":196,"author":{"gitId":"-"},"content":"* Example:`--shallow-cloning` or `-S`"},{"lineNumber":197,"author":{"gitId":"-"},"content":""},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":199,"author":{"gitId":"-"},"content":""},{"lineNumber":200,"author":{"gitId":"-"},"content":"Cannot be used with `--last-modified-date`. This may result in an incorrect last modified date."},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":202,"author":{"gitId":"-"},"content":""},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c!-- ------------------------------------------------------------------------------------------------------ --\u003e"},{"lineNumber":204,"author":{"gitId":"-"},"content":""},{"lineNumber":205,"author":{"gitId":"-"},"content":"### `--since`, `-s`"},{"lineNumber":206,"author":{"gitId":"-"},"content":""},{"lineNumber":207,"author":{"gitId":"-"},"content":"**`--since START_DATE`**: Specifies the start date for the period to be analyzed."},{"lineNumber":208,"author":{"gitId":"-"},"content":"* Parameter: `START_DATE` The first day of the period to be analyzed, in the format `DD/MM/YYYY`.\u003cbr\u003e"},{"lineNumber":209,"author":{"gitId":"-"},"content":" Default: one month before the current date"},{"lineNumber":210,"author":{"gitId":"-"},"content":"* Alias: `-s`"},{"lineNumber":211,"author":{"gitId":"-"},"content":"* Example:`--since 21/10/2017` or `-s 21/10/2017`"},{"lineNumber":212,"author":{"gitId":"-"},"content":""},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":214,"author":{"gitId":"-"},"content":""},{"lineNumber":215,"author":{"gitId":"-"},"content":"* If the start date is not specified, only commits made one month before the end date (if specified) or the date of generating the report, will be captured and analyzed."},{"lineNumber":216,"author":{"gitId":"-"},"content":"* If `d1` is specified as the start date (`--since d1` or `-s d1`), then the program will search for the earliest commit date of all repositories and use that as the start date."},{"lineNumber":217,"author":{"gitId":"-"},"content":"* If `d1` is specified together with `--period`, then the program will warn that the date range being analyzed may be incorrect."},{"lineNumber":218,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":219,"author":{"gitId":"-"},"content":"\u003c!-- ------------------------------------------------------------------------------------------------------ --\u003e"},{"lineNumber":220,"author":{"gitId":"-"},"content":""},{"lineNumber":221,"author":{"gitId":"-"},"content":"### `--timezone`, `-t`"},{"lineNumber":222,"author":{"gitId":"-"},"content":""},{"lineNumber":223,"author":{"gitId":"-"},"content":"**`--timezone ZONE_ID`**: Indicates the timezone to be used for the analysis."},{"lineNumber":224,"author":{"gitId":"-"},"content":"* Parameter: `ZONE_ID` The timezone in the format `ZONE_ID[±hh[mm]]`.\u003cbr\u003e"},{"lineNumber":225,"author":{"gitId":"-"},"content":" Default: system\u0027s default timezone"},{"lineNumber":226,"author":{"gitId":"-"},"content":"* Alias: `-t`"},{"lineNumber":227,"author":{"gitId":"-"},"content":"* Example:`--timezone UTC+08` or `-t UTC-1030`"},{"lineNumber":228,"author":{"gitId":"-"},"content":""},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003c!-- ------------------------------------------------------------------------------------------------------ --\u003e"},{"lineNumber":230,"author":{"gitId":"-"},"content":""},{"lineNumber":231,"author":{"gitId":"-"},"content":"### `--until`, `-u`"},{"lineNumber":232,"author":{"gitId":"-"},"content":""},{"lineNumber":233,"author":{"gitId":"-"},"content":"**`--until END_DATE`**: Specifies the end date of the analysis period."},{"lineNumber":234,"author":{"gitId":"-"},"content":"* Parameter: `END_DATE` The last date of the period to be analyzed, in the format `DD/MM/YYYY`.\u003cbr\u003e"},{"lineNumber":235,"author":{"gitId":"-"},"content":" Default: current date"},{"lineNumber":236,"author":{"gitId":"-"},"content":"* Alias: `-u`"},{"lineNumber":237,"author":{"gitId":"-"},"content":"* Example:`--until 21/10/2017` or `-u 21/10/2017`"},{"lineNumber":238,"author":{"gitId":"-"},"content":""},{"lineNumber":239,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":240,"author":{"gitId":"-"},"content":""},{"lineNumber":241,"author":{"gitId":"-"},"content":"Note: If the end date is not specified, the date of generating the report will be taken as the end date."},{"lineNumber":242,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":243,"author":{"gitId":"-"},"content":""},{"lineNumber":244,"author":{"gitId":"-"},"content":"\u003c!-- ------------------------------------------------------------------------------------------------------ --\u003e"},{"lineNumber":245,"author":{"gitId":"-"},"content":""},{"lineNumber":246,"author":{"gitId":"-"},"content":"### `--version`, `-V`"},{"lineNumber":247,"author":{"gitId":"-"},"content":""},{"lineNumber":248,"author":{"gitId":"-"},"content":"**`--version`**: Shows the version of RepoSense."},{"lineNumber":249,"author":{"gitId":"-"},"content":"* Alias: `-V` (upper case)"},{"lineNumber":250,"author":{"gitId":"-"},"content":""},{"lineNumber":251,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":252,"author":{"gitId":"-"},"content":""},{"lineNumber":253,"author":{"gitId":"-"},"content":"Cannot be used with any other flags. This flag takes precedence over all other flags other than `--help`."},{"lineNumber":254,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":255,"author":{"gitId":"-"},"content":"\u003c!-- ------------------------------------------------------------------------------------------------------ --\u003e"},{"lineNumber":256,"author":{"gitId":"-"},"content":""},{"lineNumber":257,"author":{"gitId":"-"},"content":"### `--view`, `-v`"},{"lineNumber":258,"author":{"gitId":"-"},"content":""},{"lineNumber":259,"author":{"gitId":"-"},"content":"**`--view [REPORT_FOLDER]`**: Specifies that the report should be opened in the default browser."},{"lineNumber":260,"author":{"gitId":"-"},"content":"* Parameter: `REPORT_FOLDER` Optional. If specified, no analysis will be performed and the report specified by the argument will be opened.\u003cbr\u003e"},{"lineNumber":261,"author":{"gitId":"-"},"content":" Default: `./reposense-report`"},{"lineNumber":262,"author":{"gitId":"-"},"content":"* Alias: `-v`"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* Example:`--view` or `-v`"}],"authorContributionMap":{"sopa301":2,"-":261}},{"path":"docs/ug/configFiles.md","fileType":"md","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"{% set title \u003d \"Appendix: Config files format\" %}"},{"lineNumber":2,"author":{"gitId":"-"},"content":"\u003cfrontmatter\u003e"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"{{ title | safe }}\""},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003c/frontmatter\u003e"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"{% set mandatory %}\u003cspan class\u003d\"badge bg-danger\"\u003emandatory\u003c/span\u003e{% endset %}"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"{% from \u0027scripts/macros.njk\u0027 import embed with context %}"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003ch1 class\u003d\"display-4\"\u003e\u003cmd\u003e{{ title }}\u003c/md\u003e\u003c/h1\u003e"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"-"},"content":"\u003cdiv class\u003d\"lead\"\u003e"},{"lineNumber":14,"author":{"gitId":"-"},"content":""},{"lineNumber":15,"author":{"gitId":"-"},"content":"Given below are the details of the various config files used by RepoSense."},{"lineNumber":16,"author":{"gitId":"-"},"content":"\u003c/div\u003e"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":"**RepoSense ignores the order of column headers in the CSV config files. However, the spelling of the column headers must match the specified headers exactly, or the column would be ignored by RepoSense.**"},{"lineNumber":21,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":"**A value in a config file is optional to provide unless it is specified as {{ mandatory }}**."},{"lineNumber":26,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c!-- \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d --\u003e"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":"## `repo-config.csv`"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":"**`repo-config.csv` file contains repo-level config data.** Each row represents a repository\u0027s configuration ([example](repo-config.csv))."},{"lineNumber":32,"author":{"gitId":"-"},"content":""},{"lineNumber":33,"author":{"gitId":"-"},"content":""},{"lineNumber":34,"author":{"gitId":"-"},"content":"| Column Name | Explanation |"},{"lineNumber":35,"author":{"gitId":"-"},"content":"|-------------|-------------|"},{"lineNumber":36,"author":{"gitId":"-"},"content":"| Repository\u0027s Location {{ mandatory }} | The `Remote Repo URL` or `Disk Path` to the git repository e.g., `https://github.com/foo/bar.git` or `C:\\Users\\user\\Desktop\\GitHub\\foo\\bar` |"},{"lineNumber":37,"author":{"gitId":"-"},"content":"| Branch | The branch to analyze in the target repository e.g., `master`. Default: the default branch of the repo |"},{"lineNumber":38,"author":{"gitId":"-"},"content":"| File formats\u003csup\u003e*+\u003c/sup\u003e | The file extensions to analyze. Binary file formats, such as `png` and `jpg`, will be automatically labelled as the file type `binary` in the generated report. Default: all file formats |"},{"lineNumber":39,"author":{"gitId":"-"},"content":"| Find Previous Authors | Enter **`yes`** to utilize Git blame\u0027s ignore revisions functionality, RepoSense will attempt to blame the line changes caused by commits in the ignore commit list to the previous authors who altered those lines (if available). |"},{"lineNumber":40,"author":{"gitId":"-"},"content":"| Ignore Glob List\u003csup\u003e*+\u003c/sup\u003e | The list of file path globs to ignore during analysis for each author e.g., `test/**;temp/**`. Refer to the [_glob format_](https://docs.oracle.com/javase/tutorial/essential/io/fileOps.html#glob) for the path glob syntax. |"},{"lineNumber":41,"author":{"gitId":"-"},"content":"| Ignore standalone config | To ignore the standalone config file (if any) in target repository, enter **`yes`**. If the cell is empty, the standalone config file in the repo (if any) will take precedence over configurations provided in the csv files. |"},{"lineNumber":42,"author":{"gitId":"-"},"content":"| Ignore Commits List\u003csup\u003e*+\u003c/sup\u003e | The list of commits to ignore during analysis. For accurate results, the commits should be provided with their full hash. Additionally, a range of commits can be specified using the `..` notation e.g. `abc123..def456` (both inclusive). |"},{"lineNumber":43,"author":{"gitId":"-"},"content":"| Ignore Authors List\u003csup\u003e*+\u003c/sup\u003e | The list of authors to ignore during analysis. Authors should be specified by their [Git Author Name](#a-note-about-git-author-name). |"},{"lineNumber":44,"author":{"gitId":"-"},"content":"| Shallow Cloning | Enter **`yes`** to clone the repository using Git\u0027s shallow cloning functionality. This option can significantly reduce the time taken to clone large repositories. However, the option should ideally be disabled for smaller repositories where the `.git` file is smaller than 500 MB, as it would create overhead. |"},{"lineNumber":45,"author":{"gitId":"-"},"content":"| File Size Limit\u003csup\u003e+\u003c/sup\u003e | Enter a file size limit for the repository in bytes as a single number without units (for a size limit of 1MB for example, enter 1000000). This file size limit will override the default file size limit (500KB). Files exceeding the file size limit will be marked as ignored and only the file name and line count will be reflected in the report. |"},{"lineNumber":46,"author":{"gitId":"-"},"content":"| Ignore File Size Limit | Enter **`yes`** to ignore both the default file size limit and the file size limit possibly set by the user in `repo-config.csv`. |"},{"lineNumber":47,"author":{"gitId":"-"},"content":"| Skip Ignored File Analysis | Enter **`yes`** to ignore analysis of files exceeding the file size limit entirely. If file analysis is skipped, all information about the file will be omitted from the generated report. This option can significantly improve report generation time. |"},{"lineNumber":48,"author":{"gitId":"-"},"content":""},{"lineNumber":49,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":50,"author":{"gitId":"-"},"content":"The Shallow Cloning option is incompatible with the \"--last-modified-date\" CLI flag."},{"lineNumber":51,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":52,"author":{"gitId":"-"},"content":""},{"lineNumber":53,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":54,"author":{"gitId":"-"},"content":"If Ignore File Size Limit is yes, the File Size Limit and Skip Ignored File Analysis columns are ignored."},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":56,"author":{"gitId":"-"},"content":""},{"lineNumber":57,"author":{"gitId":"-"},"content":"\u003csup\u003e* **Multi-value column**: multiple values can be entered in this column using a semicolon `;` as the separator.\u003c/sup\u003e\u003c/br\u003e"},{"lineNumber":58,"author":{"gitId":"-"},"content":"\u003csup\u003e+ **Overrideable column**: prepend with `override:` to use entered value(s) instead of value(s) from standalone config.\u003c/sup\u003e"},{"lineNumber":59,"author":{"gitId":"-"},"content":""},{"lineNumber":60,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e"},{"lineNumber":61,"author":{"gitId":"-"},"content":""},{"lineNumber":62,"author":{"gitId":"-"},"content":"When using [standalone config](#config-json-standalone-config-file) (if it is not ignored), it is possible to override specific values from the standalone config by prepending the entered value with `override:`."},{"lineNumber":63,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":64,"author":{"gitId":"-"},"content":""},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003c!-- \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d --\u003e"},{"lineNumber":66,"author":{"gitId":"-"},"content":""},{"lineNumber":67,"author":{"gitId":"-"},"content":"## `author-config.csv`"},{"lineNumber":68,"author":{"gitId":"-"},"content":""},{"lineNumber":69,"author":{"gitId":"-"},"content":"Optionally, you can use an `author-config.csv` (which should be in the same directory as the `repo-config.csv` file) to provide more details about the authors to analyze ([example](author-config.csv)). It should contain the following columns:"},{"lineNumber":70,"author":{"gitId":"-"},"content":""},{"lineNumber":71,"author":{"gitId":"-"},"content":"| Column Name | Explanation |"},{"lineNumber":72,"author":{"gitId":"-"},"content":"|--------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|"},{"lineNumber":73,"author":{"gitId":"-"},"content":"| Repository\u0027s Location\u003csup\u003e*\u003c/sup\u003e | Same as `repo-config.csv`. Default: all the repos in `repo-config.csv`. |"},{"lineNumber":74,"author":{"gitId":"-"},"content":"| Branch | The branch to analyze for this author, e.g., `master`. Default: the author will be bound to all the repos in `repo-config.csv` that has the same repo\u0027s location, regardless of branch. |"},{"lineNumber":75,"author":{"gitId":"-"},"content":"| Author\u0027s Git Host ID\u003csup\u003e#\u003c/sup\u003e {{ mandatory }} | Username of the target author\u0027s profile on GitHub, GitLab or Bitbucket, e.g.`JohnDoe`. |"},{"lineNumber":76,"author":{"gitId":"-"},"content":"| Author\u0027s Emails\u003csup\u003e*\u003c/sup\u003e | Associated emails of the author. For GitHub users, this can be found in your [GitHub settings](https://github.com/settings/emails). |"},{"lineNumber":77,"author":{"gitId":"-"},"content":"| Author\u0027s Display Name | The name to display for the author. Default: author\u0027s username. |"},{"lineNumber":78,"author":{"gitId":"-"},"content":"| Author\u0027s Git Author Name\u003csup\u003e*\u003c/sup\u003e | The meaning of _Git Author Name_ is explained in [_A note about git author name_](#a-note-about-git-author-name). |"},{"lineNumber":79,"author":{"gitId":"-"},"content":"| Ignore Glob List\u003csup\u003e*\u003c/sup\u003e | Files to ignore for this author, in addition to files ignored by the patterns specified in `repo-config.csv`. The path glob syntax is the same as that of Ignore Glob List in `repo-config.csv`. |"},{"lineNumber":80,"author":{"gitId":"-"},"content":""},{"lineNumber":81,"author":{"gitId":"-"},"content":"\u003csup\u003e* **Multi-value column**: multiple values can be entered in this column using a semicolon `;` as the separator.\u003c/sup\u003e"},{"lineNumber":82,"author":{"gitId":"-"},"content":"\u003c/br\u003e"},{"lineNumber":83,"author":{"gitId":"-"},"content":"\u003csup\u003e# For backward compatibility, `Author\u0027s GitHub ID` is still accepted as the header in place of `Author\u0027s Git Host ID`.\u003c/sup\u003e"},{"lineNumber":84,"author":{"gitId":"-"},"content":""},{"lineNumber":85,"author":{"gitId":"-"},"content":"If `author-config.csv` is not given and the repo has not provided author details in a standalone config file, all the authors of the repositories within the date range specified (if any) will be analyzed."},{"lineNumber":86,"author":{"gitId":"-"},"content":""},{"lineNumber":87,"author":{"gitId":"-"},"content":"`author-config.csv` has some advanced syntax that can help to reduce duplication of the author\u0027s information. The syntax guide is given below:"},{"lineNumber":88,"author":{"gitId":"-"},"content":""},{"lineNumber":89,"author":{"gitId":"-"},"content":"{{ embed(\"Appendix: `author-config.csv` advanced syntax\", \"authorConfigSyntax.md\") }}"},{"lineNumber":90,"author":{"gitId":"-"},"content":""},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003c!-- \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d --\u003e"},{"lineNumber":92,"author":{"gitId":"-"},"content":""},{"lineNumber":93,"author":{"gitId":"-"},"content":"## `group-config.csv`"},{"lineNumber":94,"author":{"gitId":"-"},"content":""},{"lineNumber":95,"author":{"gitId":"-"},"content":"Optionally, you can provide a `group-config.csv`(which should be in the same directory as `repo-config.csv` file) to provide details on any custom groupings for files in specified repositories ([example](group-config.csv)). It should contain the following columns:"},{"lineNumber":96,"author":{"gitId":"-"},"content":""},{"lineNumber":97,"author":{"gitId":"-"},"content":"| Column Name | Explanation |"},{"lineNumber":98,"author":{"gitId":"-"},"content":"|-------------|-------------|"},{"lineNumber":99,"author":{"gitId":"-"},"content":"| Repository\u0027s Location | Same as `repo-config.csv`. Default: all the repos in `repo-config.csv` |"},{"lineNumber":100,"author":{"gitId":"-"},"content":"| Group Name {{ mandatory }} | Name of the group, e.g.,`test`. |"},{"lineNumber":101,"author":{"gitId":"-"},"content":"| Globs * {{ mandatory }} | The list of file path globs to include for specified group, e.g.,`**/test/*;**.java`. |"},{"lineNumber":102,"author":{"gitId":"-"},"content":""},{"lineNumber":103,"author":{"gitId":"-"},"content":"\u003csup\u003e* **Multi-value column**: multiple values can be entered in this column using a semicolon `;` as the separator.\u003c/sup\u003e"},{"lineNumber":104,"author":{"gitId":"-"},"content":""},{"lineNumber":105,"author":{"gitId":"-"},"content":"Note that a file in a given repository should only be tagged to one group. \u003cbr\u003e"},{"lineNumber":106,"author":{"gitId":"-"},"content":"e.g.: `example.java` in `example-repo` can either be in the `test` group or the `code` group, but not in both `test` and `code` group. If multiple groups are specified for a given file, the latter group (i.e., `code` group) is set for the file."},{"lineNumber":107,"author":{"gitId":"-"},"content":""},{"lineNumber":108,"author":{"gitId":"-"},"content":"\u003c!-- \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d --\u003e"},{"lineNumber":109,"author":{"gitId":"-"},"content":""},{"lineNumber":110,"author":{"gitId":"-"},"content":"## `report-config.json`"},{"lineNumber":111,"author":{"gitId":"-"},"content":""},{"lineNumber":112,"author":{"gitId":"-"},"content":"You can optionally use `report-config.json` to customize report generation by providing the following information. ([example](report-config.json))"},{"lineNumber":113,"author":{"gitId":"-"},"content":""},{"lineNumber":114,"author":{"gitId":"-"},"content":"**Fields to provide**:"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* `title`: Title of the generated report, which is also the title of the deployed dashboard. Default: \"RepoSense Report\""},{"lineNumber":116,"author":{"gitId":"-"},"content":""},{"lineNumber":117,"author":{"gitId":"-"},"content":"\u003c!-- \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d --\u003e"},{"lineNumber":118,"author":{"gitId":"-"},"content":""},{"lineNumber":119,"author":{"gitId":"-"},"content":"\u003cdiv id\u003d\"section-standalone\"\u003e"},{"lineNumber":120,"author":{"gitId":"-"},"content":""},{"lineNumber":121,"author":{"gitId":"-"},"content":"## `config.json` (standalone config file)"},{"lineNumber":122,"author":{"gitId":"-"},"content":""},{"lineNumber":123,"author":{"gitId":"-"},"content":"Repo owners can provide the following additional information to RepoSense using a config file that we call the **_standalone config file_**:"},{"lineNumber":124,"author":{"gitId":"-"},"content":"* which files/authors/commits to analyze/omit"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* which git and git host usernames belong to which authors"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* the display of an author"},{"lineNumber":127,"author":{"gitId":"-"},"content":""},{"lineNumber":128,"author":{"gitId":"-"},"content":"To use this feature, add a `_reposense/config.json` to the root of your repo using the format in the example below ([another example](https://github.com/reposense/RepoSense/blob/master/_reposense/config.json)) and **commit it** (reason: RepoSense can see committed code only):"},{"lineNumber":129,"author":{"gitId":"-"},"content":"```json {.no-line-numbers}"},{"lineNumber":130,"author":{"gitId":"-"},"content":"{"},{"lineNumber":131,"author":{"gitId":"-"},"content":" \"ignoreGlobList\": [\"about-us/**\", \"**index.html\"],"},{"lineNumber":132,"author":{"gitId":"-"},"content":" \"formats\": [\"html\", \"css\"],"},{"lineNumber":133,"author":{"gitId":"-"},"content":" \"ignoreCommitList\": [\"90018e49f129ce7e0abdc8b18e91c9813588c601\", \"67890def\", \"abc123..def456\"],"},{"lineNumber":134,"author":{"gitId":"-"},"content":" \"ignoreAuthorList\": [\"charlie\"],"},{"lineNumber":135,"author":{"gitId":"-"},"content":" \"authors\":"},{"lineNumber":136,"author":{"gitId":"-"},"content":" ["},{"lineNumber":137,"author":{"gitId":"-"},"content":" {"},{"lineNumber":138,"author":{"gitId":"-"},"content":" \"gitId\": \"alice\","},{"lineNumber":139,"author":{"gitId":"-"},"content":" \"emails\": [\"alice@example.com\", \"alicet@example.com\"],"},{"lineNumber":140,"author":{"gitId":"-"},"content":" \"displayName\": \"Alice T.\","},{"lineNumber":141,"author":{"gitId":"-"},"content":" \"authorNames\": [\"AT\", \"A\"],"},{"lineNumber":142,"author":{"gitId":"-"},"content":" \"ignoreGlobList\": [\"**.css\"]"},{"lineNumber":143,"author":{"gitId":"-"},"content":" },"},{"lineNumber":144,"author":{"gitId":"-"},"content":" {"},{"lineNumber":145,"author":{"gitId":"-"},"content":" \"gitId\": \"bob\""},{"lineNumber":146,"author":{"gitId":"-"},"content":" }"},{"lineNumber":147,"author":{"gitId":"-"},"content":" ]"},{"lineNumber":148,"author":{"gitId":"-"},"content":"}"},{"lineNumber":149,"author":{"gitId":"-"},"content":"```"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Note: all fields are optional unless specified otherwise."},{"lineNumber":151,"author":{"gitId":"-"},"content":""},{"lineNumber":152,"author":{"gitId":"-"},"content":"**Fields to provide _repository-level_ info**:"},{"lineNumber":153,"author":{"gitId":"-"},"content":""},{"lineNumber":154,"author":{"gitId":"-"},"content":"* `ignoreGlobList`: Folders/files to ignore, specified using the [_glob format_](https://docs.oracle.com/javase/tutorial/essential/io/fileOps.html#glob)."},{"lineNumber":155,"author":{"gitId":"-"},"content":"* `formats`: File formats to analyze. Binary file formats, such as `png` and `jpg`, will be automatically labelled as the file type `binary` in the generated report. Default: all file formats"},{"lineNumber":156,"author":{"gitId":"-"},"content":"* `ignoreCommitList`: The list of commits to ignore during analysis. For accurate results, the commits should be provided with their full hash. Additionally, a range of commits can be specified using the `..` notation e.g. `abc123..def456` (both inclusive)."},{"lineNumber":157,"author":{"gitId":"-"},"content":"* `ignoreAuthorList`: The list of authors to ignore during analysis. Authors specified in `authors` field or `author-config.csv` will be also be omitted if they are in this list. Authors should be specified by their [Git Author Name](#a-note-about-git-author-name)."},{"lineNumber":158,"author":{"gitId":"-"},"content":"* `fileSizeLimit`: A file size limit for the repository in bytes as a single number without units, that will override the default file size limit. If not specified, the default file size limit will continue to be used."},{"lineNumber":159,"author":{"gitId":"-"},"content":""},{"lineNumber":160,"author":{"gitId":"-"},"content":"**Fields to provide _author-level_ info**:\u003cbr\u003e"},{"lineNumber":161,"author":{"gitId":"-"},"content":"Note: `authors` field should contain _all_ authors that should be captured in the analysis."},{"lineNumber":162,"author":{"gitId":"-"},"content":"* `gitId`: Username of the author. {{ mandatory }} field."},{"lineNumber":163,"author":{"gitId":"-"},"content":"* `emails`: Associated git emails of the author. For GitHub, this can be found in your [GitHub settings](https://github.com/settings/emails)."},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `displayName`: Name to display on the report for this author."},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `authorNames`: Git Author Name(s) used in the author\u0027s commits. By default, RepoSense assumes an author would use their remote Git Host username as the Git username too. The meaning of _Git Author Name_ is explained in [_A note about git author name_](#a-note-about-git-author-name)."},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `ignoreGlobList`: _Additional_ (i.e. on top of the repo-level `ignoreGlobList`) folders/files to ignore for a specific author. The path glob syntax is specified by the [_glob format_](https://docs.oracle.com/javase/tutorial/essential/io/fileOps.html#glob). In the example above, the actual `ignoreGlobList` for `alice` would be `[\"about-us/**\", \"**index.html\", \"**.css\"]`."},{"lineNumber":167,"author":{"gitId":"-"},"content":""},{"lineNumber":168,"author":{"gitId":"-"},"content":"To verify your standalone configuration is as intended, add the `_reposense/config.json` to your local copy of repo and run RepoSense against it as follows:\u003cbr\u003e"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* Format: `java -jar RepoSense.jar --repo LOCAL_REPO_LOCATION` \u003cbr\u003e"},{"lineNumber":170,"author":{"gitId":"-"},"content":"* Example: `java -jar RepoSense.jar --repo c:/myRepose/foo/bar`\u003cbr\u003e"},{"lineNumber":171,"author":{"gitId":"-"},"content":"After that, view the report to see if the configuration you specified in the config file is being reflected correctly in the report."},{"lineNumber":172,"author":{"gitId":"-"},"content":""},{"lineNumber":173,"author":{"gitId":"-"},"content":"## A note about git author name"},{"lineNumber":174,"author":{"gitId":"-"},"content":""},{"lineNumber":175,"author":{"gitId":"-"},"content":"`Git Author Name` refers to the customizable author\u0027s display name set in the local `.gitconfig` file. For example, in the Git Log\u0027s display:"},{"lineNumber":176,"author":{"gitId":"-"},"content":"``` {.no-line-numbers}"},{"lineNumber":177,"author":{"gitId":"-"},"content":"..."},{"lineNumber":178,"author":{"gitId":"-"},"content":"commit cd7f610e0becbdf331d5231887d8010a689f87c7"},{"lineNumber":179,"author":{"gitId":"-"},"content":"Author: ConfiguredAuthorName \u003cauthor@example.com\u003e"},{"lineNumber":180,"author":{"gitId":"-"},"content":"Date: Fri Feb 9 19:14:41 2018 +0800"},{"lineNumber":181,"author":{"gitId":"-"},"content":""},{"lineNumber":182,"author":{"gitId":"-"},"content":" Make some changes to show my new author\u0027s name"},{"lineNumber":183,"author":{"gitId":"-"},"content":""},{"lineNumber":184,"author":{"gitId":"-"},"content":"commit e3f699fd4ef128eebce98d5b4e5b3bb06a512f49"},{"lineNumber":185,"author":{"gitId":"-"},"content":"Author: ActualGitHostId \u003cauthor@example.com\u003e"},{"lineNumber":186,"author":{"gitId":"-"},"content":"Date: Fri Feb 9 19:13:13 2018 +0800"},{"lineNumber":187,"author":{"gitId":"-"},"content":""},{"lineNumber":188,"author":{"gitId":"-"},"content":" Initial commit"},{"lineNumber":189,"author":{"gitId":"-"},"content":" ..."},{"lineNumber":190,"author":{"gitId":"-"},"content":"```"},{"lineNumber":191,"author":{"gitId":"-"},"content":"`ActualGitHostId` and `ConfiguredAuthorName` are both `Git Author Name` of the same author.\u003cbr\u003e"},{"lineNumber":192,"author":{"gitId":"-"},"content":"To find the author name that you are currently using for your current git repository, run the following command within your git repository:"},{"lineNumber":193,"author":{"gitId":"asdfghjkxd"},"content":"``` shell {.no-line-numbers}"},{"lineNumber":194,"author":{"gitId":"-"},"content":"git config user.name"},{"lineNumber":195,"author":{"gitId":"-"},"content":"```"},{"lineNumber":196,"author":{"gitId":"-"},"content":"To set the author name to the value you want (e.g., to set it to your GitHub username) for your current git repository, you can use the following command ([more info](https://www.git-tower.com/learn/git/faq/change-author-name-email)):"},{"lineNumber":197,"author":{"gitId":"asdfghjkxd"},"content":"``` shell {.no-line-numbers}"},{"lineNumber":198,"author":{"gitId":"-"},"content":"git config user.name \"YOUR_AUTHOR_NAME”"},{"lineNumber":199,"author":{"gitId":"-"},"content":"```"},{"lineNumber":200,"author":{"gitId":"-"},"content":"To set the author name to use a default value you want for future git repositories, you can use the following command:"},{"lineNumber":201,"author":{"gitId":"asdfghjkxd"},"content":"``` shell {.no-line-numbers}"},{"lineNumber":202,"author":{"gitId":"-"},"content":"git config --global user.name \"YOUR_AUTHOR_NAME”"},{"lineNumber":203,"author":{"gitId":"-"},"content":"```"},{"lineNumber":204,"author":{"gitId":"-"},"content":"RepoSense expects the Git Author Name to be the same as author\u0027s username on the Git hosting platform (GitHub, GitLab, BitBucket). If an author\u0027s `Git Author Name` is different from their username on the Git hosting platform, the `Git Author Name` needs to be specified in the standalone config file. If the author has more than one `Git Author Name`, multiple values can be entered too."},{"lineNumber":205,"author":{"gitId":"-"},"content":""},{"lineNumber":206,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e"},{"lineNumber":207,"author":{"gitId":"-"},"content":""},{"lineNumber":208,"author":{"gitId":"-"},"content":"Note: Symbols such as `\"`, `!`, `/` etc. in your author name will be omitted, which may reduce the accuracy of the analysis if 2 names in the repository are approximately similar."},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003c/box\u003e"},{"lineNumber":210,"author":{"gitId":"-"},"content":""},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003c/div\u003e"}],"authorContributionMap":{"asdfghjkxd":3,"-":208}},{"path":"frontend/.eslintrc.json","fileType":"json","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"{"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \"env\": {"},{"lineNumber":3,"author":{"gitId":"-"},"content":" \"browser\": true"},{"lineNumber":4,"author":{"gitId":"-"},"content":" },"},{"lineNumber":5,"author":{"gitId":"-"},"content":" \"extends\": ["},{"lineNumber":6,"author":{"gitId":"-"},"content":" \"airbnb-base\","},{"lineNumber":7,"author":{"gitId":"-"},"content":" \"plugin:vue/recommended\","},{"lineNumber":8,"author":{"gitId":"-"},"content":" \"@vue/typescript\","},{"lineNumber":9,"author":{"gitId":"-"},"content":" \"plugin:import/typescript\""},{"lineNumber":10,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \"rules\": {"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \"vue/component-definition-name-casing\": ["},{"lineNumber":13,"author":{"gitId":"-"},"content":" \"error\","},{"lineNumber":14,"author":{"gitId":"-"},"content":" \"kebab-case\""},{"lineNumber":15,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \"vue/require-prop-types\": 0,"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \"no-param-reassign\": 0,"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \"arrow-parens\": ["},{"lineNumber":19,"author":{"gitId":"-"},"content":" \"error\","},{"lineNumber":20,"author":{"gitId":"-"},"content":" \"always\""},{"lineNumber":21,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \"indent\": ["},{"lineNumber":23,"author":{"gitId":"-"},"content":" \"error\","},{"lineNumber":24,"author":{"gitId":"-"},"content":" 2,"},{"lineNumber":25,"author":{"gitId":"-"},"content":" {"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \"ignoredNodes\": ["},{"lineNumber":27,"author":{"gitId":"-"},"content":" \"ConditionalExpression\""},{"lineNumber":28,"author":{"gitId":"-"},"content":" ]"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }"},{"lineNumber":30,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":31,"author":{"gitId":"-"},"content":" \"prefer-destructuring\": 0,"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \"func-names\": ["},{"lineNumber":33,"author":{"gitId":"-"},"content":" \"error\","},{"lineNumber":34,"author":{"gitId":"-"},"content":" \"as-needed\""},{"lineNumber":35,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":36,"author":{"gitId":"-"},"content":" \"no-alert\": 0,"},{"lineNumber":37,"author":{"gitId":"-"},"content":" \"linebreak-style\": 0,"},{"lineNumber":38,"author":{"gitId":"-"},"content":" \"max-len\": ["},{"lineNumber":39,"author":{"gitId":"-"},"content":" \"error\","},{"lineNumber":40,"author":{"gitId":"-"},"content":" {"},{"lineNumber":41,"author":{"gitId":"-"},"content":" \"code\": 120"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }"},{"lineNumber":43,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":44,"author":{"gitId":"-"},"content":" \"prefer-object-spread\": 0,"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \"function-call-argument-newline\": 0,"},{"lineNumber":46,"author":{"gitId":"-"},"content":" \"vue/no-computed-properties-in-data\": 0,"},{"lineNumber":47,"author":{"gitId":"-"},"content":" \"import/extensions\": ["},{"lineNumber":48,"author":{"gitId":"-"},"content":" \"error\","},{"lineNumber":49,"author":{"gitId":"-"},"content":" {"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \"js\": \"never\","},{"lineNumber":51,"author":{"gitId":"-"},"content":" \"ts\": \"never\""},{"lineNumber":52,"author":{"gitId":"-"},"content":" }"},{"lineNumber":53,"author":{"gitId":"-"},"content":" ]"},{"lineNumber":54,"author":{"gitId":"-"},"content":" },"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \"parserOptions\": {"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \"parser\": \"@typescript-eslint/parser\""},{"lineNumber":57,"author":{"gitId":"-"},"content":" },"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \"overrides\": ["},{"lineNumber":59,"author":{"gitId":"-"},"content":" {"},{"lineNumber":60,"author":{"gitId":"-"},"content":" \"files\": [\"*.ts\"],"},{"lineNumber":61,"author":{"gitId":"-"},"content":" \"extends\": ["},{"lineNumber":62,"author":{"gitId":"-"},"content":" \"airbnb-typescript/base\","},{"lineNumber":63,"author":{"gitId":"-"},"content":" \"plugin:@typescript-eslint/recommended\""},{"lineNumber":64,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \"parserOptions\": {"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \"project\": [\"./tsconfig.json\"]"},{"lineNumber":67,"author":{"gitId":"-"},"content":" },"},{"lineNumber":68,"author":{"gitId":"-"},"content":" \"rules\": {"},{"lineNumber":69,"author":{"gitId":"-"},"content":" \"indent\": \"off\","},{"lineNumber":70,"author":{"gitId":"-"},"content":" \"@typescript-eslint/indent\": ["},{"lineNumber":71,"author":{"gitId":"-"},"content":" \"error\","},{"lineNumber":72,"author":{"gitId":"-"},"content":" 2,"},{"lineNumber":73,"author":{"gitId":"-"},"content":" {"},{"lineNumber":74,"author":{"gitId":"-"},"content":" \"ignoredNodes\": ["},{"lineNumber":75,"author":{"gitId":"-"},"content":" \"ConditionalExpression\""},{"lineNumber":76,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":77,"author":{"gitId":"-"},"content":" \"SwitchCase\": 0"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }"},{"lineNumber":79,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":80,"author":{"gitId":"-"},"content":" \"@typescript-eslint/member-delimiter-style\": \"error\","},{"lineNumber":81,"author":{"gitId":"sopa301"},"content":" \"@typescript-eslint/type-annotation-spacing\": \"error\","},{"lineNumber":82,"author":{"gitId":"sopa301"},"content":" \"@typescript-eslint/array-type\": ["},{"lineNumber":83,"author":{"gitId":"sopa301"},"content":" \"error\","},{"lineNumber":84,"author":{"gitId":"sopa301"},"content":" {"},{"lineNumber":85,"author":{"gitId":"sopa301"},"content":" \"default\": \"array-simple\","},{"lineNumber":86,"author":{"gitId":"sopa301"},"content":" \"readonly\": \"array-simple\""},{"lineNumber":87,"author":{"gitId":"sopa301"},"content":" }"},{"lineNumber":88,"author":{"gitId":"sopa301"},"content":" ]"},{"lineNumber":89,"author":{"gitId":"sopa301"},"content":" }"},{"lineNumber":90,"author":{"gitId":"sopa301"},"content":" },"},{"lineNumber":91,"author":{"gitId":"sopa301"},"content":" {"},{"lineNumber":92,"author":{"gitId":"sopa301"},"content":" \"files\": [\"*.vue\"],"},{"lineNumber":93,"author":{"gitId":"sopa301"},"content":" \"rules\": {"},{"lineNumber":94,"author":{"gitId":"sopa301"},"content":" \"@typescript-eslint/array-type\": ["},{"lineNumber":95,"author":{"gitId":"sopa301"},"content":" \"error\","},{"lineNumber":96,"author":{"gitId":"sopa301"},"content":" {"},{"lineNumber":97,"author":{"gitId":"sopa301"},"content":" \"default\": \"generic\","},{"lineNumber":98,"author":{"gitId":"sopa301"},"content":" \"readonly\": \"generic\""},{"lineNumber":99,"author":{"gitId":"sopa301"},"content":" }"},{"lineNumber":100,"author":{"gitId":"sopa301"},"content":" ]"},{"lineNumber":101,"author":{"gitId":"-"},"content":" }"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }"},{"lineNumber":103,"author":{"gitId":"-"},"content":" ]"},{"lineNumber":104,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"sopa301":20,"-":84}},{"path":"frontend/.stylelintrc.json","fileType":"json","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"{"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \"plugins\": ["},{"lineNumber":3,"author":{"gitId":"-"},"content":" \"stylelint-order\""},{"lineNumber":4,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":5,"author":{"gitId":"-"},"content":" \"extends\": ["},{"lineNumber":6,"author":{"gitId":"-"},"content":" \"stylelint-config-recommended-scss\","},{"lineNumber":7,"author":{"gitId":"-"},"content":" \"stylelint-config-recommended-vue\""},{"lineNumber":8,"author":{"gitId":"-"},"content":" ],"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \"rules\": {"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \"color-no-invalid-hex\": true,"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \"string-no-newline\": true,"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \"unit-no-unknown\": true,"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \"property-no-unknown\": true,"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \"block-no-empty\": true,"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \"comment-no-empty\": true,"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \"no-extra-semicolons\": true,"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \"no-invalid-double-slash-comments\": true,"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \"declaration-no-important\": true,"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \"declaration-block-single-line-max-declarations\": 1,"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \"number-leading-zero\": \"never\","},{"lineNumber":21,"author":{"gitId":"-"},"content":" \"number-no-trailing-zeros\": null,"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \"string-quotes\": \"single\","},{"lineNumber":23,"author":{"gitId":"-"},"content":" \"length-zero-no-unit\": true,"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \"value-keyword-case\": \"lower\","},{"lineNumber":25,"author":{"gitId":"-"},"content":" \"property-case\": \"lower\","},{"lineNumber":26,"author":{"gitId":"-"},"content":" \"declaration-colon-space-after\": \"always\","},{"lineNumber":27,"author":{"gitId":"-"},"content":" \"selector-type-case\": \"lower\","},{"lineNumber":28,"author":{"gitId":"-"},"content":" \"selector-list-comma-newline-after\": \"always\","},{"lineNumber":29,"author":{"gitId":"-"},"content":" \"no-eol-whitespace\": true,"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \"order/properties-alphabetical-order\": true,"},{"lineNumber":31,"author":{"gitId":"-"},"content":" \"indentation\": 2,"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \"scss/at-import-partial-extension\": null,"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \"function-no-unknown\": null,"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \"scss/at-import-no-partial-leading-underscore\": null,"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \"no-descending-specificity\": null,"},{"lineNumber":36,"author":{"gitId":"-"},"content":" \"scss/no-global-function-names\": null,"},{"lineNumber":37,"author":{"gitId":"-"},"content":" \"selector-type-no-unknown\": null,"},{"lineNumber":38,"author":{"gitId":"-"},"content":" \"at-rule-no-unknown\": null,"},{"lineNumber":39,"author":{"gitId":"sopa301"},"content":" \"no-duplicate-selectors\": null,"},{"lineNumber":40,"author":{"gitId":"sopa301"},"content":" \"block-opening-brace-space-before\": \"always\","},{"lineNumber":41,"author":{"gitId":"sopa301"},"content":" \"declaration-colon-space-before\": \"never\""},{"lineNumber":42,"author":{"gitId":"-"},"content":" }"},{"lineNumber":43,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"sopa301":3,"-":40}},{"path":"frontend/cypress/support.js","fileType":"js","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"// Disable screenshots"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"// https://docs.cypress.io/api/cypress-api/screenshot-api.html#Disable-screenshots-on-run-failures"},{"lineNumber":4,"author":{"gitId":"-"},"content":"Cypress.Screenshot.defaults({"},{"lineNumber":5,"author":{"gitId":"-"},"content":" screenshotOnRunFailure: false,"},{"lineNumber":6,"author":{"gitId":"-"},"content":"});"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":"beforeEach(() \u003d\u003e {"},{"lineNumber":9,"author":{"gitId":"-"},"content":" cy.visit(\u0027/\u0027);"},{"lineNumber":10,"author":{"gitId":"sopa301"},"content":" cy.intercept({"},{"lineNumber":11,"author":{"gitId":"sopa301"},"content":" method: \u0027GET\u0027,"},{"lineNumber":12,"author":{"gitId":"sopa301"},"content":" url: \u0027/title.md\u0027,"},{"lineNumber":13,"author":{"gitId":"sopa301"},"content":" }, \u0027# RepoSense Intro\u0027).as(\u0027getTitleMd\u0027);"},{"lineNumber":14,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"sopa301":4,"-":10}},{"path":"frontend/cypress/tests/chartView/chartView_zoomFeature.cy.js","fileType":"js","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"const extractDate \u003d (str) \u003d\u003e {"},{"lineNumber":2,"author":{"gitId":"-"},"content":" const regex \u003d /\\[(.*?)\\]/g;"},{"lineNumber":3,"author":{"gitId":"-"},"content":" const matches \u003d str.match(regex);"},{"lineNumber":4,"author":{"gitId":"-"},"content":" return new Date(matches[0].slice(1, -1));"},{"lineNumber":5,"author":{"gitId":"-"},"content":"};"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"describe(\u0027zoom features in code view\u0027, () \u003d\u003e {"},{"lineNumber":8,"author":{"gitId":"-"},"content":" const zoomKey \u003d Cypress.platform \u003d\u003d\u003d \u0027darwin\u0027 ? \u0027{meta}\u0027 : \u0027{ctrl}\u0027;"},{"lineNumber":9,"author":{"gitId":"-"},"content":" it(\u0027click on view commits button\u0027, () \u003d\u003e {"},{"lineNumber":10,"author":{"gitId":"-"},"content":" cy.get(\u0027.icon-button.fa-list-ul\u0027)"},{"lineNumber":11,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":12,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":13,"author":{"gitId":"-"},"content":" .click();"},{"lineNumber":14,"author":{"gitId":"-"},"content":""},{"lineNumber":15,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom\u0027)"},{"lineNumber":16,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027);"},{"lineNumber":17,"author":{"gitId":"-"},"content":" });"},{"lineNumber":18,"author":{"gitId":"-"},"content":""},{"lineNumber":19,"author":{"gitId":"-"},"content":" it(\u0027zoom into ramp\u0027, () \u003d\u003e {"},{"lineNumber":20,"author":{"gitId":"-"},"content":" // clicking from the 10th px to the 50th px in the ramp"},{"lineNumber":21,"author":{"gitId":"-"},"content":" cy.get(\u0027body\u0027).type(zoomKey, { release: false })"},{"lineNumber":22,"author":{"gitId":"-"},"content":" .get(\u0027#summary-charts .summary-chart__ramp .ramp\u0027)"},{"lineNumber":23,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":24,"author":{"gitId":"-"},"content":" .click(10, 20)"},{"lineNumber":25,"author":{"gitId":"-"},"content":" .click(50, 20);"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom\u0027)"},{"lineNumber":28,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027);"},{"lineNumber":29,"author":{"gitId":"-"},"content":" });"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":" it(\u0027zoom into ramp when merge group\u0027, () \u003d\u003e {"},{"lineNumber":32,"author":{"gitId":"-"},"content":" cy.get(\u0027#summary label.merge-group \u003e input:visible\u0027)"},{"lineNumber":33,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":34,"author":{"gitId":"-"},"content":" .check()"},{"lineNumber":35,"author":{"gitId":"-"},"content":" .should(\u0027be.checked\u0027);"},{"lineNumber":36,"author":{"gitId":"-"},"content":""},{"lineNumber":37,"author":{"gitId":"-"},"content":" // clicking from the 10th px to the 50th px in the ramp"},{"lineNumber":38,"author":{"gitId":"-"},"content":" cy.get(\u0027body\u0027).type(zoomKey, { release: false })"},{"lineNumber":39,"author":{"gitId":"-"},"content":" .get(\u0027#summary-charts .summary-chart__ramp .ramp\u0027)"},{"lineNumber":40,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":41,"author":{"gitId":"-"},"content":" .click(10, 20)"},{"lineNumber":42,"author":{"gitId":"-"},"content":" .click(50, 20);"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom\u0027)"},{"lineNumber":45,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027);"},{"lineNumber":46,"author":{"gitId":"-"},"content":" });"},{"lineNumber":47,"author":{"gitId":"-"},"content":"});"},{"lineNumber":48,"author":{"gitId":"-"},"content":""},{"lineNumber":49,"author":{"gitId":"-"},"content":"// Assumptions: Contributer \u0027eugenepeh\u0027 is the first result."},{"lineNumber":50,"author":{"gitId":"-"},"content":"describe(\u0027date changes in chart view should reflect in zoom\u0027, () \u003d\u003e {"},{"lineNumber":51,"author":{"gitId":"-"},"content":" it(\u0027setting \\\u0027since\\\u0027 date range changes the zoom view\u0027, () \u003d\u003e {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-textfield.search_box \u003e input:visible\u0027)"},{"lineNumber":53,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":54,"author":{"gitId":"-"},"content":" .type(\u0027eugenepeh\u0027);"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":" cy.get(\u0027input[name\u003d\"since\"]:visible\u0027)"},{"lineNumber":57,"author":{"gitId":"-"},"content":" .type(\u00272018-06-11\u0027);"},{"lineNumber":58,"author":{"gitId":"-"},"content":""},{"lineNumber":59,"author":{"gitId":"-"},"content":" cy.get(\u0027.icon-button.fa-list-ul\u0027)"},{"lineNumber":60,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":61,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":62,"author":{"gitId":"-"},"content":" .click();"},{"lineNumber":63,"author":{"gitId":"-"},"content":""},{"lineNumber":64,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom\u0027)"},{"lineNumber":65,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027);"},{"lineNumber":66,"author":{"gitId":"-"},"content":""},{"lineNumber":67,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":68,"author":{"gitId":"-"},"content":" .each(($element) \u003d\u003e {"},{"lineNumber":69,"author":{"gitId":"-"},"content":" cy.wrap($element)"},{"lineNumber":70,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":71,"author":{"gitId":"-"},"content":" .then((titleStr) \u003d\u003e {"},{"lineNumber":72,"author":{"gitId":"-"},"content":" const date \u003d extractDate(titleStr);"},{"lineNumber":73,"author":{"gitId":"-"},"content":" cy.wrap(date).should(\u0027be.gte\u0027, new Date(\u00272018-06-11\u0027));"},{"lineNumber":74,"author":{"gitId":"-"},"content":" });"},{"lineNumber":75,"author":{"gitId":"-"},"content":" });"},{"lineNumber":76,"author":{"gitId":"-"},"content":" });"},{"lineNumber":77,"author":{"gitId":"-"},"content":" // Assumptions: Contributer \u0027yong24s\u0027 is the first result."},{"lineNumber":78,"author":{"gitId":"-"},"content":" it(\u0027setting \\\u0027since\\\u0027 date again results in a different zoom view\u0027, () \u003d\u003e {"},{"lineNumber":79,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-textfield.search_box \u003e input:visible\u0027)"},{"lineNumber":80,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":81,"author":{"gitId":"-"},"content":" .type(\u0027yong24s\u0027);"},{"lineNumber":82,"author":{"gitId":"-"},"content":""},{"lineNumber":83,"author":{"gitId":"-"},"content":" cy.get(\u0027input[name\u003d\"since\"]:visible\u0027)"},{"lineNumber":84,"author":{"gitId":"-"},"content":" .type(\u00272018-05-20\u0027);"},{"lineNumber":85,"author":{"gitId":"-"},"content":""},{"lineNumber":86,"author":{"gitId":"-"},"content":" cy.get(\u0027.icon-button.fa-list-ul\u0027)"},{"lineNumber":87,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":88,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":89,"author":{"gitId":"-"},"content":" .click();"},{"lineNumber":90,"author":{"gitId":"-"},"content":""},{"lineNumber":91,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom\u0027)"},{"lineNumber":92,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027);"},{"lineNumber":93,"author":{"gitId":"-"},"content":""},{"lineNumber":94,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":95,"author":{"gitId":"-"},"content":" .each(($element) \u003d\u003e {"},{"lineNumber":96,"author":{"gitId":"-"},"content":" cy.wrap($element)"},{"lineNumber":97,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":98,"author":{"gitId":"-"},"content":" .then((titleStr) \u003d\u003e {"},{"lineNumber":99,"author":{"gitId":"-"},"content":" const date \u003d extractDate(titleStr);"},{"lineNumber":100,"author":{"gitId":"-"},"content":" cy.wrap(date).should(\u0027be.gte\u0027, new Date(\u00272018-05-20\u0027));"},{"lineNumber":101,"author":{"gitId":"-"},"content":" });"},{"lineNumber":102,"author":{"gitId":"-"},"content":" });"},{"lineNumber":103,"author":{"gitId":"-"},"content":" });"},{"lineNumber":104,"author":{"gitId":"-"},"content":""},{"lineNumber":105,"author":{"gitId":"-"},"content":" // Assumptions: Contributer \u0027eugenepeh\u0027 is the first result."},{"lineNumber":106,"author":{"gitId":"-"},"content":" it(\u0027setting the \\\u0027until\\\u0027 date changes the zoom view\u0027, () \u003d\u003e {"},{"lineNumber":107,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-textfield.search_box \u003e input:visible\u0027)"},{"lineNumber":108,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":109,"author":{"gitId":"-"},"content":" .type(\u0027eugenepeh\u0027);"},{"lineNumber":110,"author":{"gitId":"-"},"content":""},{"lineNumber":111,"author":{"gitId":"-"},"content":" cy.get(\u0027input[name\u003d\"until\"]:visible\u0027)"},{"lineNumber":112,"author":{"gitId":"-"},"content":" .type(\u00272019-08-19\u0027);"},{"lineNumber":113,"author":{"gitId":"-"},"content":""},{"lineNumber":114,"author":{"gitId":"-"},"content":" cy.get(\u0027.icon-button.fa-list-ul\u0027)"},{"lineNumber":115,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":116,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":117,"author":{"gitId":"-"},"content":" .click();"},{"lineNumber":118,"author":{"gitId":"-"},"content":""},{"lineNumber":119,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom\u0027)"},{"lineNumber":120,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027);"},{"lineNumber":121,"author":{"gitId":"-"},"content":""},{"lineNumber":122,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":123,"author":{"gitId":"-"},"content":" .each(($element) \u003d\u003e {"},{"lineNumber":124,"author":{"gitId":"-"},"content":" cy.wrap($element)"},{"lineNumber":125,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":126,"author":{"gitId":"-"},"content":" .then((titleStr) \u003d\u003e {"},{"lineNumber":127,"author":{"gitId":"-"},"content":" const date \u003d extractDate(titleStr);"},{"lineNumber":128,"author":{"gitId":"-"},"content":" cy.wrap(date).should(\u0027be.lte\u0027, new Date(\u00272019-08-19\u0027));"},{"lineNumber":129,"author":{"gitId":"-"},"content":" });"},{"lineNumber":130,"author":{"gitId":"-"},"content":" });"},{"lineNumber":131,"author":{"gitId":"-"},"content":" });"},{"lineNumber":132,"author":{"gitId":"-"},"content":""},{"lineNumber":133,"author":{"gitId":"-"},"content":" // Assumptions: Contributer \u0027ongspxm\u0027 is the first result."},{"lineNumber":134,"author":{"gitId":"-"},"content":" it(\u0027setting the \\\u0027until\\\u0027 date again results in a different zoom view\u0027, () \u003d\u003e {"},{"lineNumber":135,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-textfield.search_box \u003e input:visible\u0027)"},{"lineNumber":136,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":137,"author":{"gitId":"-"},"content":" .type(\u0027ongspxm\u0027);"},{"lineNumber":138,"author":{"gitId":"-"},"content":""},{"lineNumber":139,"author":{"gitId":"-"},"content":" cy.get(\u0027input[name\u003d\"until\"]:visible\u0027)"},{"lineNumber":140,"author":{"gitId":"-"},"content":" .type(\u00272018-07-20\u0027);"},{"lineNumber":141,"author":{"gitId":"-"},"content":""},{"lineNumber":142,"author":{"gitId":"-"},"content":" cy.get(\u0027.icon-button.fa-list-ul\u0027)"},{"lineNumber":143,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":144,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":145,"author":{"gitId":"-"},"content":" .click();"},{"lineNumber":146,"author":{"gitId":"-"},"content":""},{"lineNumber":147,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom\u0027)"},{"lineNumber":148,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027);"},{"lineNumber":149,"author":{"gitId":"-"},"content":""},{"lineNumber":150,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":151,"author":{"gitId":"-"},"content":" .each(($element) \u003d\u003e {"},{"lineNumber":152,"author":{"gitId":"-"},"content":" cy.wrap($element)"},{"lineNumber":153,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":154,"author":{"gitId":"-"},"content":" .then((titleStr) \u003d\u003e {"},{"lineNumber":155,"author":{"gitId":"-"},"content":" const date \u003d extractDate(titleStr);"},{"lineNumber":156,"author":{"gitId":"-"},"content":" cy.wrap(date).should(\u0027be.lte\u0027, new Date(\u00272018-07-20\u0027));"},{"lineNumber":157,"author":{"gitId":"-"},"content":" });"},{"lineNumber":158,"author":{"gitId":"-"},"content":" });"},{"lineNumber":159,"author":{"gitId":"-"},"content":" });"},{"lineNumber":160,"author":{"gitId":"-"},"content":""},{"lineNumber":161,"author":{"gitId":"-"},"content":" // Assumptions: Contributer \u0027eugenepeh\u0027 is the first result."},{"lineNumber":162,"author":{"gitId":"-"},"content":" it(\u0027setting the \\\u0027until\\\u0027 and \\\u0027since\\\u0027 date changes the zoom view\u0027, () \u003d\u003e {"},{"lineNumber":163,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-textfield.search_box \u003e input:visible\u0027)"},{"lineNumber":164,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":165,"author":{"gitId":"-"},"content":" .type(\u0027eugenepeh\u0027);"},{"lineNumber":166,"author":{"gitId":"-"},"content":""},{"lineNumber":167,"author":{"gitId":"-"},"content":" cy.get(\u0027input[name\u003d\"since\"]:visible\u0027)"},{"lineNumber":168,"author":{"gitId":"-"},"content":" .type(\u00272018-08-27\u0027);"},{"lineNumber":169,"author":{"gitId":"-"},"content":""},{"lineNumber":170,"author":{"gitId":"-"},"content":" cy.get(\u0027input[name\u003d\"until\"]:visible\u0027)"},{"lineNumber":171,"author":{"gitId":"-"},"content":" .type(\u00272019-03-09\u0027);"},{"lineNumber":172,"author":{"gitId":"-"},"content":""},{"lineNumber":173,"author":{"gitId":"-"},"content":" cy.get(\u0027.icon-button.fa-list-ul\u0027)"},{"lineNumber":174,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":175,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":176,"author":{"gitId":"-"},"content":" .click();"},{"lineNumber":177,"author":{"gitId":"-"},"content":""},{"lineNumber":178,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom\u0027)"},{"lineNumber":179,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027);"},{"lineNumber":180,"author":{"gitId":"-"},"content":""},{"lineNumber":181,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":182,"author":{"gitId":"-"},"content":" .each(($element) \u003d\u003e {"},{"lineNumber":183,"author":{"gitId":"-"},"content":" cy.wrap($element)"},{"lineNumber":184,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":185,"author":{"gitId":"-"},"content":" .then((titleStr) \u003d\u003e {"},{"lineNumber":186,"author":{"gitId":"-"},"content":" const date \u003d extractDate(titleStr);"},{"lineNumber":187,"author":{"gitId":"-"},"content":" cy.wrap(date).should(\u0027be.lte\u0027, new Date(\u00272019-03-09\u0027));"},{"lineNumber":188,"author":{"gitId":"-"},"content":" });"},{"lineNumber":189,"author":{"gitId":"-"},"content":" });"},{"lineNumber":190,"author":{"gitId":"-"},"content":""},{"lineNumber":191,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":192,"author":{"gitId":"-"},"content":" .each(($element) \u003d\u003e {"},{"lineNumber":193,"author":{"gitId":"-"},"content":" cy.wrap($element)"},{"lineNumber":194,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":195,"author":{"gitId":"-"},"content":" .then((titleStr) \u003d\u003e {"},{"lineNumber":196,"author":{"gitId":"-"},"content":" const date \u003d extractDate(titleStr);"},{"lineNumber":197,"author":{"gitId":"-"},"content":" cy.wrap(date).should(\u0027be.gte\u0027, new Date(\u00272018-08-27\u0027));"},{"lineNumber":198,"author":{"gitId":"-"},"content":" });"},{"lineNumber":199,"author":{"gitId":"-"},"content":" });"},{"lineNumber":200,"author":{"gitId":"-"},"content":" });"},{"lineNumber":201,"author":{"gitId":"-"},"content":""},{"lineNumber":202,"author":{"gitId":"-"},"content":" // Assumptions: Contributer \u0027jamessspanggg\u0027 is the first result."},{"lineNumber":203,"author":{"gitId":"-"},"content":" it(\u0027setting the \\\u0027until\\\u0027 and \\\u0027since\\\u0027 date again results in a different zoom view\u0027, () \u003d\u003e {"},{"lineNumber":204,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-textfield.search_box \u003e input:visible\u0027)"},{"lineNumber":205,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":206,"author":{"gitId":"-"},"content":" .type(\u0027jamessspanggg\u0027);"},{"lineNumber":207,"author":{"gitId":"-"},"content":""},{"lineNumber":208,"author":{"gitId":"-"},"content":" cy.get(\u0027input[name\u003d\"since\"]:visible\u0027)"},{"lineNumber":209,"author":{"gitId":"-"},"content":" .type(\u00272019-07-22\u0027);"},{"lineNumber":210,"author":{"gitId":"-"},"content":""},{"lineNumber":211,"author":{"gitId":"-"},"content":" cy.get(\u0027input[name\u003d\"until\"]:visible\u0027)"},{"lineNumber":212,"author":{"gitId":"-"},"content":" .type(\u00272019-08-01\u0027);"},{"lineNumber":213,"author":{"gitId":"-"},"content":""},{"lineNumber":214,"author":{"gitId":"-"},"content":" cy.get(\u0027.icon-button.fa-list-ul\u0027)"},{"lineNumber":215,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":216,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":217,"author":{"gitId":"-"},"content":" .click();"},{"lineNumber":218,"author":{"gitId":"-"},"content":""},{"lineNumber":219,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom\u0027)"},{"lineNumber":220,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027);"},{"lineNumber":221,"author":{"gitId":"-"},"content":""},{"lineNumber":222,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":223,"author":{"gitId":"-"},"content":" .each(($element) \u003d\u003e {"},{"lineNumber":224,"author":{"gitId":"-"},"content":" cy.wrap($element)"},{"lineNumber":225,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":226,"author":{"gitId":"-"},"content":" .then((titleStr) \u003d\u003e {"},{"lineNumber":227,"author":{"gitId":"-"},"content":" const date \u003d extractDate(titleStr);"},{"lineNumber":228,"author":{"gitId":"-"},"content":" cy.wrap(date).should(\u0027be.lte\u0027, new Date(\u00272019-08-01\u0027));"},{"lineNumber":229,"author":{"gitId":"-"},"content":" });"},{"lineNumber":230,"author":{"gitId":"-"},"content":" });"},{"lineNumber":231,"author":{"gitId":"-"},"content":""},{"lineNumber":232,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":233,"author":{"gitId":"-"},"content":" .each(($element) \u003d\u003e {"},{"lineNumber":234,"author":{"gitId":"-"},"content":" cy.wrap($element)"},{"lineNumber":235,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":236,"author":{"gitId":"-"},"content":" .then((titleStr) \u003d\u003e {"},{"lineNumber":237,"author":{"gitId":"-"},"content":" const date \u003d extractDate(titleStr);"},{"lineNumber":238,"author":{"gitId":"-"},"content":" cy.wrap(date).should(\u0027be.gte\u0027, new Date(\u00272019-07-22\u0027));"},{"lineNumber":239,"author":{"gitId":"-"},"content":" });"},{"lineNumber":240,"author":{"gitId":"-"},"content":" });"},{"lineNumber":241,"author":{"gitId":"-"},"content":" });"},{"lineNumber":242,"author":{"gitId":"-"},"content":"});"},{"lineNumber":243,"author":{"gitId":"-"},"content":""},{"lineNumber":244,"author":{"gitId":"-"},"content":"describe(\u0027range changes in chartview should reflect in zoom\u0027, () \u003d\u003e {"},{"lineNumber":245,"author":{"gitId":"-"},"content":" const zoomKey \u003d Cypress.platform \u003d\u003d\u003d \u0027darwin\u0027 ? \u0027{meta}\u0027 : \u0027{ctrl}\u0027;"},{"lineNumber":246,"author":{"gitId":"-"},"content":""},{"lineNumber":247,"author":{"gitId":"-"},"content":" // Assumptions: Contributer \u0027jamessspanggg\u0027 is the first result,"},{"lineNumber":248,"author":{"gitId":"-"},"content":" // he does not add more commits in the future,"},{"lineNumber":249,"author":{"gitId":"-"},"content":" // and the sort feature is working as expected."},{"lineNumber":250,"author":{"gitId":"-"},"content":" it(\u0027selecting the initial righthand and lefthand boundary\u0027, () \u003d\u003e {"},{"lineNumber":251,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-textfield.search_box \u003e input:visible\u0027)"},{"lineNumber":252,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":253,"author":{"gitId":"-"},"content":" .type(\u0027jamessspanggg\u0027);"},{"lineNumber":254,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027input[name\u003d\"until\"]:visible\u0027)"},{"lineNumber":255,"author":{"gitId":"jonasongg"},"content":" .type(\u00272023-12-31\u0027);"},{"lineNumber":256,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":257,"author":{"gitId":"-"},"content":" cy.get(\u0027body\u0027).type(zoomKey, { release: false })"},{"lineNumber":258,"author":{"gitId":"-"},"content":" .get(\u0027#summary-charts .summary-chart__ramp .ramp\u0027)"},{"lineNumber":259,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":260,"author":{"gitId":"-"},"content":" .click(120, 20)"},{"lineNumber":261,"author":{"gitId":"-"},"content":" .click(250, 20);"},{"lineNumber":262,"author":{"gitId":"-"},"content":""},{"lineNumber":263,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom\u0027)"},{"lineNumber":264,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027);"},{"lineNumber":265,"author":{"gitId":"-"},"content":""},{"lineNumber":266,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":267,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":268,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":269,"author":{"gitId":"-"},"content":" .should(\u0027eq\u0027, \u0027[2021-01-04] Update `About us` page (#1393): +55 -30 lines \u0027);"},{"lineNumber":270,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":271,"author":{"gitId":"-"},"content":" .last()"},{"lineNumber":272,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":273,"author":{"gitId":"-"},"content":" .should(\u0027eq\u0027, \u0027[2019-12-20] [#46] Show total time after batch processing (#758): +43 -0 lines \u0027);"},{"lineNumber":274,"author":{"gitId":"-"},"content":" });"},{"lineNumber":275,"author":{"gitId":"-"},"content":""},{"lineNumber":276,"author":{"gitId":"-"},"content":" // Assumptions: Contributer \u0027jamessspanggg\u0027 is the first result,"},{"lineNumber":277,"author":{"gitId":"-"},"content":" // he does not add more commits in the future,"},{"lineNumber":278,"author":{"gitId":"-"},"content":" // and the sort feature is working as expected."},{"lineNumber":279,"author":{"gitId":"-"},"content":" it(\u0027changing the righthand boundary\u0027, () \u003d\u003e {"},{"lineNumber":280,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-textfield.search_box \u003e input:visible\u0027)"},{"lineNumber":281,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":282,"author":{"gitId":"-"},"content":" .type(\u0027jamessspanggg\u0027);"},{"lineNumber":283,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027input[name\u003d\"until\"]:visible\u0027)"},{"lineNumber":284,"author":{"gitId":"jonasongg"},"content":" .type(\u00272023-12-31\u0027);"},{"lineNumber":285,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":286,"author":{"gitId":"-"},"content":" cy.get(\u0027body\u0027).type(zoomKey, { release: false })"},{"lineNumber":287,"author":{"gitId":"-"},"content":" .get(\u0027#summary-charts .summary-chart__ramp .ramp\u0027)"},{"lineNumber":288,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":289,"author":{"gitId":"-"},"content":" .click(120, 20)"},{"lineNumber":290,"author":{"gitId":"-"},"content":" .click(170, 20);"},{"lineNumber":291,"author":{"gitId":"-"},"content":""},{"lineNumber":292,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom\u0027)"},{"lineNumber":293,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027);"},{"lineNumber":294,"author":{"gitId":"-"},"content":""},{"lineNumber":295,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":296,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":297,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":298,"author":{"gitId":"-"},"content":" .should(\u0027eq\u0027, \u0027[2020-05-23] [#1241] Restore checked file types (#1256): +14 -1 lines \u0027);"},{"lineNumber":299,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":300,"author":{"gitId":"-"},"content":" .last()"},{"lineNumber":301,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":302,"author":{"gitId":"-"},"content":" .should(\u0027eq\u0027, \u0027[2019-12-20] [#46] Show total time after batch processing (#758): +43 -0 lines \u0027);"},{"lineNumber":303,"author":{"gitId":"-"},"content":" });"},{"lineNumber":304,"author":{"gitId":"-"},"content":""},{"lineNumber":305,"author":{"gitId":"-"},"content":" // Assumptions: Contributer \u0027jamessspanggg\u0027 is the first result,"},{"lineNumber":306,"author":{"gitId":"-"},"content":" // he does not add more commits in the future,"},{"lineNumber":307,"author":{"gitId":"-"},"content":" // and the sort feature is working as expected."},{"lineNumber":308,"author":{"gitId":"-"},"content":" it(\u0027changing the lefthand boundary\u0027, () \u003d\u003e {"},{"lineNumber":309,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-textfield.search_box \u003e input:visible\u0027)"},{"lineNumber":310,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":311,"author":{"gitId":"-"},"content":" .type(\u0027jamessspanggg\u0027);"},{"lineNumber":312,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027input[name\u003d\"until\"]:visible\u0027)"},{"lineNumber":313,"author":{"gitId":"jonasongg"},"content":" .type(\u00272023-12-31\u0027);"},{"lineNumber":314,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":315,"author":{"gitId":"-"},"content":" cy.get(\u0027body\u0027).type(zoomKey, { release: false })"},{"lineNumber":316,"author":{"gitId":"-"},"content":" .get(\u0027#summary-charts .summary-chart__ramp .ramp\u0027)"},{"lineNumber":317,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":318,"author":{"gitId":"-"},"content":" .click(170, 20)"},{"lineNumber":319,"author":{"gitId":"-"},"content":" .click(250, 20);"},{"lineNumber":320,"author":{"gitId":"-"},"content":""},{"lineNumber":321,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom\u0027)"},{"lineNumber":322,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027);"},{"lineNumber":323,"author":{"gitId":"-"},"content":""},{"lineNumber":324,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":325,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":326,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":327,"author":{"gitId":"-"},"content":" .should(\u0027eq\u0027, \u0027[2021-01-04] Update `About us` page (#1393): +55 -30 lines \u0027);"},{"lineNumber":328,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":329,"author":{"gitId":"-"},"content":" .last()"},{"lineNumber":330,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":331,"author":{"gitId":"-"},"content":" .should(\u0027eq\u0027, \u0027[2020-09-27] Add optional check for quotes in diff file regex (#1330): +1 -1 lines \u0027);"},{"lineNumber":332,"author":{"gitId":"-"},"content":" });"},{"lineNumber":333,"author":{"gitId":"-"},"content":""},{"lineNumber":334,"author":{"gitId":"-"},"content":" // Assumptions: Contributer \u0027jamessspanggg\u0027 is the first result,"},{"lineNumber":335,"author":{"gitId":"-"},"content":" // he does not add more commits in the future,"},{"lineNumber":336,"author":{"gitId":"-"},"content":" // and the sort feature is working as expected."},{"lineNumber":337,"author":{"gitId":"-"},"content":" it(\u0027changing the righthand and lefthand boundary\u0027, () \u003d\u003e {"},{"lineNumber":338,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-textfield.search_box \u003e input:visible\u0027)"},{"lineNumber":339,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":340,"author":{"gitId":"-"},"content":" .type(\u0027jamessspanggg\u0027);"},{"lineNumber":341,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027input[name\u003d\"until\"]:visible\u0027)"},{"lineNumber":342,"author":{"gitId":"jonasongg"},"content":" .type(\u00272023-12-31\u0027);"},{"lineNumber":343,"author":{"gitId":"-"},"content":""},{"lineNumber":344,"author":{"gitId":"-"},"content":" cy.get(\u0027body\u0027).type(zoomKey, { release: false })"},{"lineNumber":345,"author":{"gitId":"-"},"content":" .get(\u0027#summary-charts .summary-chart__ramp .ramp\u0027)"},{"lineNumber":346,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":347,"author":{"gitId":"-"},"content":" .click(170, 20)"},{"lineNumber":348,"author":{"gitId":"-"},"content":" .click(225, 20);"},{"lineNumber":349,"author":{"gitId":"-"},"content":""},{"lineNumber":350,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom\u0027)"},{"lineNumber":351,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027);"},{"lineNumber":352,"author":{"gitId":"-"},"content":""},{"lineNumber":353,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":354,"author":{"gitId":"-"},"content":" .first()"},{"lineNumber":355,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":356,"author":{"gitId":"-"},"content":" .should("},{"lineNumber":357,"author":{"gitId":"-"},"content":" \u0027eq\u0027,"},{"lineNumber":358,"author":{"gitId":"-"},"content":" \u0027[2021-01-04] Update `About us` page (#1393): +55 -30 lines \u0027,"},{"lineNumber":359,"author":{"gitId":"-"},"content":" );"},{"lineNumber":360,"author":{"gitId":"-"},"content":""},{"lineNumber":361,"author":{"gitId":"-"},"content":" cy.get(\u0027#tab-zoom .ramp .ramp__slice\u0027)"},{"lineNumber":362,"author":{"gitId":"-"},"content":" .last()"},{"lineNumber":363,"author":{"gitId":"-"},"content":" .invoke(\u0027attr\u0027, \u0027title\u0027)"},{"lineNumber":364,"author":{"gitId":"-"},"content":" .should(\u0027eq\u0027, \u0027[2020-09-27] Add optional check for quotes in diff file regex (#1330): +1 -1 lines \u0027);"},{"lineNumber":365,"author":{"gitId":"-"},"content":" });"},{"lineNumber":366,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"-":355,"jonasongg":11}},{"path":"frontend/cypress/tests/codeView/codeView_renderFilterHash.cy.js","fileType":"js","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"describe(\u0027render filter hash\u0027, () \u003d\u003e {"},{"lineNumber":2,"author":{"gitId":"-"},"content":" it(\u0027search: url params should persist after change and reload\u0027, () \u003d\u003e {"},{"lineNumber":3,"author":{"gitId":"-"},"content":" /* Check initial state */"},{"lineNumber":4,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-textfield.search_box \u003e input:visible\u0027)"},{"lineNumber":5,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":6,"author":{"gitId":"-"},"content":" .invoke(\u0027val\u0027)"},{"lineNumber":7,"author":{"gitId":"-"},"content":" .should(\u0027eq\u0027, \u0027\u0027);"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":" /* Enter search and test URL before and after reload */"},{"lineNumber":10,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-textfield.search_box \u003e input:visible\u0027)"},{"lineNumber":11,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":12,"author":{"gitId":"-"},"content":" .type(\u0027eugene{enter}\u0027);"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":15,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027search\u003deugene\u0027);"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":18,"author":{"gitId":"-"},"content":""},{"lineNumber":19,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":20,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027search\u003deugene\u0027);"},{"lineNumber":21,"author":{"gitId":"-"},"content":" });"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":" it(\u0027group by: url params should persist after change and reload\u0027, () \u003d\u003e {"},{"lineNumber":24,"author":{"gitId":"-"},"content":" /* Check initial state */"},{"lineNumber":25,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.grouping \u003e select:visible\u0027)"},{"lineNumber":26,"author":{"gitId":"-"},"content":" .invoke(\u0027val\u0027)"},{"lineNumber":27,"author":{"gitId":"-"},"content":" .should(\u0027eq\u0027, \u0027groupByRepos\u0027);"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":30,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027groupSelect\u003dgroupByRepos\u0027);"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":" /* Select group by none and test URL before and after reload */"},{"lineNumber":33,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.grouping \u003e select:visible\u0027)"},{"lineNumber":34,"author":{"gitId":"-"},"content":" .select(\u0027groupByNone\u0027);"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":37,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027groupSelect\u003dgroupByNone\u0027);"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":42,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027groupSelect\u003dgroupByNone\u0027);"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":" /* Select group by authors and test URL before and after reload */"},{"lineNumber":45,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.grouping \u003e select:visible\u0027)"},{"lineNumber":46,"author":{"gitId":"-"},"content":" .select(\u0027groupByAuthors\u0027);"},{"lineNumber":47,"author":{"gitId":"-"},"content":""},{"lineNumber":48,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":49,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027groupSelect\u003dgroupByAuthors\u0027);"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":52,"author":{"gitId":"-"},"content":""},{"lineNumber":53,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":54,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027groupSelect\u003dgroupByAuthors\u0027);"},{"lineNumber":55,"author":{"gitId":"-"},"content":" });"},{"lineNumber":56,"author":{"gitId":"-"},"content":""},{"lineNumber":57,"author":{"gitId":"-"},"content":" it(\u0027sort groups by: url params should persist after change and reload\u0027, () \u003d\u003e {"},{"lineNumber":58,"author":{"gitId":"-"},"content":" /* Check initial state */"},{"lineNumber":59,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.sort-group \u003e select:visible\u0027)"},{"lineNumber":60,"author":{"gitId":"-"},"content":" .invoke(\u0027val\u0027)"},{"lineNumber":61,"author":{"gitId":"-"},"content":" .should(\u0027eq\u0027, \u0027groupTitle dsc\u0027);"},{"lineNumber":62,"author":{"gitId":"-"},"content":""},{"lineNumber":63,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":64,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sort\u003dgroupTitle%20dsc\u0027);"},{"lineNumber":65,"author":{"gitId":"-"},"content":""},{"lineNumber":66,"author":{"gitId":"-"},"content":" /* Select sort by group title ascending and test URL before and after reload */"},{"lineNumber":67,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.sort-group \u003e select:visible\u0027)"},{"lineNumber":68,"author":{"gitId":"-"},"content":" .select(\u0027groupTitle\u0027);"},{"lineNumber":69,"author":{"gitId":"-"},"content":""},{"lineNumber":70,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":71,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sort\u003dgroupTitle\u0027);"},{"lineNumber":72,"author":{"gitId":"-"},"content":""},{"lineNumber":73,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":74,"author":{"gitId":"-"},"content":""},{"lineNumber":75,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":76,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sort\u003dgroupTitle\u0027);"},{"lineNumber":77,"author":{"gitId":"-"},"content":""},{"lineNumber":78,"author":{"gitId":"-"},"content":" /* Select sort by contribution descending and test URL before and after reload */"},{"lineNumber":79,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.sort-group \u003e select:visible\u0027)"},{"lineNumber":80,"author":{"gitId":"-"},"content":" .select(\u0027totalCommits dsc\u0027);"},{"lineNumber":81,"author":{"gitId":"-"},"content":""},{"lineNumber":82,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":83,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sort\u003dtotalCommits%20dsc\u0027);"},{"lineNumber":84,"author":{"gitId":"-"},"content":""},{"lineNumber":85,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":86,"author":{"gitId":"-"},"content":""},{"lineNumber":87,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":88,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sort\u003dtotalCommits%20dsc\u0027);"},{"lineNumber":89,"author":{"gitId":"-"},"content":""},{"lineNumber":90,"author":{"gitId":"-"},"content":" /* Select sort by contribution ascending and test URL before and after reload */"},{"lineNumber":91,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.sort-group \u003e select:visible\u0027)"},{"lineNumber":92,"author":{"gitId":"-"},"content":" .select(\u0027totalCommits\u0027);"},{"lineNumber":93,"author":{"gitId":"-"},"content":""},{"lineNumber":94,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":95,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sort\u003dtotalCommits\u0027);"},{"lineNumber":96,"author":{"gitId":"-"},"content":""},{"lineNumber":97,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":98,"author":{"gitId":"-"},"content":""},{"lineNumber":99,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":100,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sort\u003dtotalCommits\u0027);"},{"lineNumber":101,"author":{"gitId":"-"},"content":""},{"lineNumber":102,"author":{"gitId":"-"},"content":" /* Select sort by variance descending and test URL before and after reload */"},{"lineNumber":103,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.sort-group \u003e select:visible\u0027)"},{"lineNumber":104,"author":{"gitId":"-"},"content":" .select(\u0027variance dsc\u0027);"},{"lineNumber":105,"author":{"gitId":"-"},"content":""},{"lineNumber":106,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":107,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sort\u003dvariance%20dsc\u0027);"},{"lineNumber":108,"author":{"gitId":"-"},"content":""},{"lineNumber":109,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":110,"author":{"gitId":"-"},"content":""},{"lineNumber":111,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":112,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sort\u003dvariance%20dsc\u0027);"},{"lineNumber":113,"author":{"gitId":"-"},"content":""},{"lineNumber":114,"author":{"gitId":"-"},"content":" /* Select sort by variance ascending and test URL before and after reload */"},{"lineNumber":115,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.sort-group \u003e select:visible\u0027)"},{"lineNumber":116,"author":{"gitId":"-"},"content":" .select(\u0027variance\u0027);"},{"lineNumber":117,"author":{"gitId":"-"},"content":""},{"lineNumber":118,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":119,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sort\u003dvariance\u0027);"},{"lineNumber":120,"author":{"gitId":"-"},"content":""},{"lineNumber":121,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":122,"author":{"gitId":"-"},"content":""},{"lineNumber":123,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":124,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sort\u003dvariance\u0027);"},{"lineNumber":125,"author":{"gitId":"-"},"content":" });"},{"lineNumber":126,"author":{"gitId":"-"},"content":""},{"lineNumber":127,"author":{"gitId":"-"},"content":" it(\u0027sort within groups by: url params should persist after change and reload\u0027, () \u003d\u003e {"},{"lineNumber":128,"author":{"gitId":"-"},"content":" /* Check initial state */"},{"lineNumber":129,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.sort-within-group \u003e select:visible\u0027)"},{"lineNumber":130,"author":{"gitId":"-"},"content":" .invoke(\u0027val\u0027)"},{"lineNumber":131,"author":{"gitId":"-"},"content":" .should(\u0027eq\u0027, \u0027title\u0027);"},{"lineNumber":132,"author":{"gitId":"-"},"content":""},{"lineNumber":133,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":134,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sortWithin\u003dtitle\u0027);"},{"lineNumber":135,"author":{"gitId":"-"},"content":""},{"lineNumber":136,"author":{"gitId":"-"},"content":" /* Select sort by group title ascending and test URL before and after reload */"},{"lineNumber":137,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.sort-within-group \u003e select:visible\u0027)"},{"lineNumber":138,"author":{"gitId":"-"},"content":" .select(\u0027title dsc\u0027);"},{"lineNumber":139,"author":{"gitId":"-"},"content":""},{"lineNumber":140,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":141,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sortWithin\u003dtitle\u0027);"},{"lineNumber":142,"author":{"gitId":"-"},"content":""},{"lineNumber":143,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":144,"author":{"gitId":"-"},"content":""},{"lineNumber":145,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":146,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sortWithin\u003dtitle\u0027);"},{"lineNumber":147,"author":{"gitId":"-"},"content":""},{"lineNumber":148,"author":{"gitId":"-"},"content":" /* Select sort by contribution descending and test URL before and after reload */"},{"lineNumber":149,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.sort-within-group \u003e select:visible\u0027)"},{"lineNumber":150,"author":{"gitId":"-"},"content":" .select(\u0027totalCommits dsc\u0027);"},{"lineNumber":151,"author":{"gitId":"-"},"content":""},{"lineNumber":152,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":153,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sortWithin\u003dtotalCommits%20dsc\u0027);"},{"lineNumber":154,"author":{"gitId":"-"},"content":""},{"lineNumber":155,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":156,"author":{"gitId":"-"},"content":""},{"lineNumber":157,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":158,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sortWithin\u003dtotalCommits%20dsc\u0027);"},{"lineNumber":159,"author":{"gitId":"-"},"content":""},{"lineNumber":160,"author":{"gitId":"-"},"content":" /* Select sort by contribution ascending and test URL before and after reload */"},{"lineNumber":161,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.sort-within-group \u003e select:visible\u0027)"},{"lineNumber":162,"author":{"gitId":"-"},"content":" .select(\u0027totalCommits\u0027);"},{"lineNumber":163,"author":{"gitId":"-"},"content":""},{"lineNumber":164,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":165,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sortWithin\u003dtotalCommits\u0027);"},{"lineNumber":166,"author":{"gitId":"-"},"content":""},{"lineNumber":167,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":168,"author":{"gitId":"-"},"content":""},{"lineNumber":169,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":170,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sortWithin\u003dtotalCommits\u0027);"},{"lineNumber":171,"author":{"gitId":"-"},"content":""},{"lineNumber":172,"author":{"gitId":"-"},"content":" /* Select sort by variance descending and test URL before and after reload */"},{"lineNumber":173,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.sort-within-group \u003e select:visible\u0027)"},{"lineNumber":174,"author":{"gitId":"-"},"content":" .select(\u0027variance dsc\u0027);"},{"lineNumber":175,"author":{"gitId":"-"},"content":""},{"lineNumber":176,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":177,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sortWithin\u003dvariance%20dsc\u0027);"},{"lineNumber":178,"author":{"gitId":"-"},"content":""},{"lineNumber":179,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":180,"author":{"gitId":"-"},"content":""},{"lineNumber":181,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":182,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sortWithin\u003dvariance%20dsc\u0027);"},{"lineNumber":183,"author":{"gitId":"-"},"content":""},{"lineNumber":184,"author":{"gitId":"-"},"content":" /* Select sort by variance ascending and test URL before and after reload */"},{"lineNumber":185,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.sort-within-group \u003e select:visible\u0027)"},{"lineNumber":186,"author":{"gitId":"-"},"content":" .select(\u0027variance\u0027);"},{"lineNumber":187,"author":{"gitId":"-"},"content":""},{"lineNumber":188,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":189,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sortWithin\u003dvariance\u0027);"},{"lineNumber":190,"author":{"gitId":"-"},"content":""},{"lineNumber":191,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":192,"author":{"gitId":"-"},"content":""},{"lineNumber":193,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":194,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027sortWithin\u003dvariance\u0027);"},{"lineNumber":195,"author":{"gitId":"-"},"content":" });"},{"lineNumber":196,"author":{"gitId":"-"},"content":""},{"lineNumber":197,"author":{"gitId":"-"},"content":" it(\u0027granularity: url params should persist after change and reload\u0027, () \u003d\u003e {"},{"lineNumber":198,"author":{"gitId":"-"},"content":" /* Check initial state */"},{"lineNumber":199,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.granularity \u003e select:visible\u0027)"},{"lineNumber":200,"author":{"gitId":"-"},"content":" .invoke(\u0027val\u0027)"},{"lineNumber":201,"author":{"gitId":"-"},"content":" .should(\u0027eq\u0027, \u0027commit\u0027);"},{"lineNumber":202,"author":{"gitId":"-"},"content":""},{"lineNumber":203,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":204,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027timeframe\u003dcommit\u0027);"},{"lineNumber":205,"author":{"gitId":"-"},"content":""},{"lineNumber":206,"author":{"gitId":"-"},"content":" /* Select timeframe as day and test URL before and after reload */"},{"lineNumber":207,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.granularity \u003e select:visible\u0027)"},{"lineNumber":208,"author":{"gitId":"-"},"content":" .select(\u0027day\u0027);"},{"lineNumber":209,"author":{"gitId":"-"},"content":""},{"lineNumber":210,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":211,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027timeframe\u003dday\u0027);"},{"lineNumber":212,"author":{"gitId":"-"},"content":""},{"lineNumber":213,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":214,"author":{"gitId":"-"},"content":""},{"lineNumber":215,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":216,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027timeframe\u003dday\u0027);"},{"lineNumber":217,"author":{"gitId":"-"},"content":""},{"lineNumber":218,"author":{"gitId":"-"},"content":" /* Select timeframe as week and test URL before and after reload */"},{"lineNumber":219,"author":{"gitId":"-"},"content":" cy.get(\u0027div.mui-select.granularity \u003e select:visible\u0027)"},{"lineNumber":220,"author":{"gitId":"-"},"content":" .select(\u0027week\u0027);"},{"lineNumber":221,"author":{"gitId":"-"},"content":""},{"lineNumber":222,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":223,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027timeframe\u003dweek\u0027);"},{"lineNumber":224,"author":{"gitId":"-"},"content":""},{"lineNumber":225,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":226,"author":{"gitId":"-"},"content":""},{"lineNumber":227,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":228,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027timeframe\u003dweek\u0027);"},{"lineNumber":229,"author":{"gitId":"-"},"content":" });"},{"lineNumber":230,"author":{"gitId":"-"},"content":""},{"lineNumber":231,"author":{"gitId":"-"},"content":" it(\u0027since: url params should persist after change and reload\u0027, () \u003d\u003e {"},{"lineNumber":232,"author":{"gitId":"-"},"content":" /* Check initial state */"},{"lineNumber":233,"author":{"gitId":"-"},"content":" cy.get(\u0027input[name\u003d\"since\"]:visible\u0027)"},{"lineNumber":234,"author":{"gitId":"-"},"content":" .invoke(\u0027val\u0027)"},{"lineNumber":235,"author":{"gitId":"-"},"content":" .should(\u0027eq\u0027, \u00272018-05-03\u0027);"},{"lineNumber":236,"author":{"gitId":"-"},"content":""},{"lineNumber":237,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":238,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027since\u003d2018-05-03\u0027);"},{"lineNumber":239,"author":{"gitId":"-"},"content":""},{"lineNumber":240,"author":{"gitId":"-"},"content":" /* Modify since date and test URL before and after reload */"},{"lineNumber":241,"author":{"gitId":"-"},"content":" cy.get(\u0027input[name\u003d\"since\"]:visible\u0027)"},{"lineNumber":242,"author":{"gitId":"-"},"content":" .type(\u00272019-06-04\u0027);"},{"lineNumber":243,"author":{"gitId":"-"},"content":""},{"lineNumber":244,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":245,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027since\u003d2019-06-04\u0027);"},{"lineNumber":246,"author":{"gitId":"-"},"content":""},{"lineNumber":247,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":248,"author":{"gitId":"-"},"content":""},{"lineNumber":249,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":250,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027since\u003d2019-06-04\u0027);"},{"lineNumber":251,"author":{"gitId":"-"},"content":" });"},{"lineNumber":252,"author":{"gitId":"-"},"content":""},{"lineNumber":253,"author":{"gitId":"-"},"content":" it(\u0027until: url params should persist after change and reload\u0027, () \u003d\u003e {"},{"lineNumber":254,"author":{"gitId":"-"},"content":" /* Check initial state (will require dayjs for getting current date) */"},{"lineNumber":255,"author":{"gitId":"-"},"content":" // cy.get(\u0027input[name\u003d\"until\"]:visible\u0027)"},{"lineNumber":256,"author":{"gitId":"-"},"content":" // .invoke(\u0027val\u0027)"},{"lineNumber":257,"author":{"gitId":"-"},"content":" // .should(\u0027eq\u0027, dayjs().format(\u0027YYYY-MM-DD\u0027));"},{"lineNumber":258,"author":{"gitId":"-"},"content":""},{"lineNumber":259,"author":{"gitId":"-"},"content":" // cy.url()"},{"lineNumber":260,"author":{"gitId":"-"},"content":" // .should(\u0027contain\u0027, \u0027date\u003d2023-07-06\u0027);"},{"lineNumber":261,"author":{"gitId":"-"},"content":""},{"lineNumber":262,"author":{"gitId":"-"},"content":" /* Modify since date and test URL before and after reload */"},{"lineNumber":263,"author":{"gitId":"-"},"content":" cy.get(\u0027input[name\u003d\"until\"]:visible\u0027)"},{"lineNumber":264,"author":{"gitId":"-"},"content":" .type(\u00272019-06-04\u0027);"},{"lineNumber":265,"author":{"gitId":"-"},"content":""},{"lineNumber":266,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":267,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027until\u003d2019-06-04\u0027);"},{"lineNumber":268,"author":{"gitId":"-"},"content":""},{"lineNumber":269,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":270,"author":{"gitId":"-"},"content":""},{"lineNumber":271,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":272,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027until\u003d2019-06-04\u0027);"},{"lineNumber":273,"author":{"gitId":"-"},"content":" });"},{"lineNumber":274,"author":{"gitId":"-"},"content":""},{"lineNumber":275,"author":{"gitId":"-"},"content":" it(\u0027breakdown by file type: url params should persist after change and reload\u0027, () \u003d\u003e {"},{"lineNumber":276,"author":{"gitId":"-"},"content":" cy.get(\u0027#summary label.filter-breakdown input:visible\u0027)"},{"lineNumber":277,"author":{"gitId":"-"},"content":" .should(\u0027not.be.checked\u0027);"},{"lineNumber":278,"author":{"gitId":"-"},"content":""},{"lineNumber":279,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":280,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027breakdown\u003dfalse\u0027);"},{"lineNumber":281,"author":{"gitId":"-"},"content":""},{"lineNumber":282,"author":{"gitId":"-"},"content":" cy.get(\u0027#summary label.filter-breakdown input:visible\u0027)"},{"lineNumber":283,"author":{"gitId":"-"},"content":" .check();"},{"lineNumber":284,"author":{"gitId":"-"},"content":""},{"lineNumber":285,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":286,"author":{"gitId":"-"},"content":""},{"lineNumber":287,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":288,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027breakdown\u003dtrue\u0027);"},{"lineNumber":289,"author":{"gitId":"-"},"content":" });"},{"lineNumber":290,"author":{"gitId":"-"},"content":""},{"lineNumber":291,"author":{"gitId":"-"},"content":" it(\u0027merge all groups: url params should persist after change and reload\u0027, () \u003d\u003e {"},{"lineNumber":292,"author":{"gitId":"-"},"content":" cy.get(\u0027#summary label.merge-group \u003e input:visible\u0027)"},{"lineNumber":293,"author":{"gitId":"-"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":294,"author":{"gitId":"-"},"content":" .check();"},{"lineNumber":295,"author":{"gitId":"-"},"content":""},{"lineNumber":296,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":297,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027mergegroup\u003dreposense%2FRepoSense%5Bcypress%5D\u0027);"},{"lineNumber":298,"author":{"gitId":"-"},"content":""},{"lineNumber":299,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":300,"author":{"gitId":"-"},"content":""},{"lineNumber":301,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":302,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027mergegroup\u003dreposense%2FRepoSense%5Bcypress%5D\u0027);"},{"lineNumber":303,"author":{"gitId":"-"},"content":" });"},{"lineNumber":304,"author":{"gitId":"-"},"content":""},{"lineNumber":305,"author":{"gitId":"-"},"content":" it(\u0027checked file types: url params should persist after change and reload\u0027, () \u003d\u003e {"},{"lineNumber":306,"author":{"gitId":"-"},"content":" cy.get(\u0027#summary label.filter-breakdown input:visible\u0027)"},{"lineNumber":307,"author":{"gitId":"-"},"content":" .should(\u0027not.be.checked\u0027);"},{"lineNumber":308,"author":{"gitId":"-"},"content":""},{"lineNumber":309,"author":{"gitId":"jonasongg"},"content":" // Assumption: gradle is the first file type and yml is the last file type to appear in the list"},{"lineNumber":310,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":311,"author":{"gitId":"-"},"content":" .should(\u0027not.contain\u0027, \u0027gradle\u0027);"},{"lineNumber":312,"author":{"gitId":"-"},"content":""},{"lineNumber":313,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":314,"author":{"gitId":"jonasongg"},"content":" .should(\u0027not.contain\u0027, \u0027yml\u0027);"},{"lineNumber":315,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":316,"author":{"gitId":"-"},"content":" cy.get(\u0027#summary label.filter-breakdown input:visible\u0027)"},{"lineNumber":317,"author":{"gitId":"-"},"content":" .check()"},{"lineNumber":318,"author":{"gitId":"-"},"content":" .should(\u0027be.checked\u0027);"},{"lineNumber":319,"author":{"gitId":"-"},"content":""},{"lineNumber":320,"author":{"gitId":"-"},"content":" cy.get(\u0027#summary div.fileTypes input[id\u003d\"gradle\"]\u0027)"},{"lineNumber":321,"author":{"gitId":"-"},"content":" .should(\u0027be.checked\u0027);"},{"lineNumber":322,"author":{"gitId":"-"},"content":""},{"lineNumber":323,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027#summary div.fileTypes input[id\u003d\"yml\"]\u0027)"},{"lineNumber":324,"author":{"gitId":"jonasongg"},"content":" .should(\u0027be.checked\u0027);"},{"lineNumber":325,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":326,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":327,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027gradle\u0027);"},{"lineNumber":328,"author":{"gitId":"-"},"content":""},{"lineNumber":329,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":330,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027yml\u0027);"},{"lineNumber":331,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":332,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":333,"author":{"gitId":"-"},"content":""},{"lineNumber":334,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027#summary div.fileTypes input[id\u003d\"gradle\"]\u0027)"},{"lineNumber":335,"author":{"gitId":"jonasongg"},"content":" .should(\u0027be.checked\u0027);"},{"lineNumber":336,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":337,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027#summary div.fileTypes input[id\u003d\"yml\"]\u0027)"},{"lineNumber":338,"author":{"gitId":"jonasongg"},"content":" .should(\u0027be.checked\u0027);"},{"lineNumber":339,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":340,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":341,"author":{"gitId":"-"},"content":" .should(\u0027contain\u0027, \u0027gradle\u0027);"},{"lineNumber":342,"author":{"gitId":"-"},"content":""},{"lineNumber":343,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":344,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027yml\u0027);"},{"lineNumber":345,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":346,"author":{"gitId":"-"},"content":" cy.get(\u0027#summary div.fileTypes input[id\u003d\"gradle\"]\u0027)"},{"lineNumber":347,"author":{"gitId":"-"},"content":" .uncheck()"},{"lineNumber":348,"author":{"gitId":"-"},"content":" .should(\u0027not.be.checked\u0027);"},{"lineNumber":349,"author":{"gitId":"-"},"content":""},{"lineNumber":350,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":351,"author":{"gitId":"-"},"content":" .should(\u0027not.contain\u0027, \u0027gradle\u0027);"},{"lineNumber":352,"author":{"gitId":"-"},"content":""},{"lineNumber":353,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":354,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027yml\u0027);"},{"lineNumber":355,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":356,"author":{"gitId":"-"},"content":" cy.reload();"},{"lineNumber":357,"author":{"gitId":"-"},"content":""},{"lineNumber":358,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027#summary div.fileTypes input[id\u003d\"gradle\"]\u0027)"},{"lineNumber":359,"author":{"gitId":"jonasongg"},"content":" .should(\u0027not.be.checked\u0027);"},{"lineNumber":360,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":361,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027#summary div.fileTypes input[id\u003d\"yml\"]\u0027)"},{"lineNumber":362,"author":{"gitId":"jonasongg"},"content":" .should(\u0027be.checked\u0027);"},{"lineNumber":363,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":364,"author":{"gitId":"-"},"content":" cy.url()"},{"lineNumber":365,"author":{"gitId":"-"},"content":" .should(\u0027not.contain\u0027, \u0027gradle\u0027);"},{"lineNumber":366,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":367,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":368,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027yml\u0027);"},{"lineNumber":369,"author":{"gitId":"jonasongg"},"content":" });"},{"lineNumber":370,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":371,"author":{"gitId":"jonasongg"},"content":" it(\u0027code panel: sort by: url params should persist after change and reload\u0027, () \u003d\u003e {"},{"lineNumber":372,"author":{"gitId":"jonasongg"},"content":" // open the code panel"},{"lineNumber":373,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027.icon-button.fa-code\u0027)"},{"lineNumber":374,"author":{"gitId":"jonasongg"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":375,"author":{"gitId":"jonasongg"},"content":" .first()"},{"lineNumber":376,"author":{"gitId":"jonasongg"},"content":" .click();"},{"lineNumber":377,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":378,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027div.mui-select.sort-by \u003e select:visible\u0027)"},{"lineNumber":379,"author":{"gitId":"jonasongg"},"content":" .invoke(\u0027val\u0027)"},{"lineNumber":380,"author":{"gitId":"jonasongg"},"content":" .should(\u0027eq\u0027, \u0027linesOfCode\u0027);"},{"lineNumber":381,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":382,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":383,"author":{"gitId":"jonasongg"},"content":" .should(\u0027not.contain\u0027, \u0027authorshipSortBy\u0027);"},{"lineNumber":384,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":385,"author":{"gitId":"jonasongg"},"content":" /* Select file name and test URL before and after reload */"},{"lineNumber":386,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027div.mui-select.sort-by \u003e select:visible\u0027)"},{"lineNumber":387,"author":{"gitId":"jonasongg"},"content":" .select(\u0027fileName\u0027);"},{"lineNumber":388,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":389,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":390,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027authorshipSortBy\u003dfileName\u0027);"},{"lineNumber":391,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":392,"author":{"gitId":"jonasongg"},"content":" cy.reload();"},{"lineNumber":393,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":394,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":395,"author":{"gitId":"jonasongg"},"content":" .should(\u0027not.contain\u0027, \u0027%23%2F\u0027);"},{"lineNumber":396,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":397,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":398,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027authorshipSortBy\u003dfileName\u0027);"},{"lineNumber":399,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":400,"author":{"gitId":"jonasongg"},"content":" /* Select file type and test URL before and after reload */"},{"lineNumber":401,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027div.mui-select.sort-by \u003e select:visible\u0027)"},{"lineNumber":402,"author":{"gitId":"jonasongg"},"content":" .select(\u0027fileType\u0027);"},{"lineNumber":403,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":404,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":405,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027authorshipSortBy\u003dfileType\u0027);"},{"lineNumber":406,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":407,"author":{"gitId":"jonasongg"},"content":" cy.reload();"},{"lineNumber":408,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":409,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":410,"author":{"gitId":"jonasongg"},"content":" .should(\u0027not.contain\u0027, \u0027%23%2F\u0027);"},{"lineNumber":411,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":412,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":413,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027authorshipSortBy\u003dfileType\u0027);"},{"lineNumber":414,"author":{"gitId":"jonasongg"},"content":" });"},{"lineNumber":415,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":416,"author":{"gitId":"jonasongg"},"content":" it(\u0027code panel: order: url params should persist after change and reload\u0027, () \u003d\u003e {"},{"lineNumber":417,"author":{"gitId":"jonasongg"},"content":" // open the code panel"},{"lineNumber":418,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027.icon-button.fa-code\u0027)"},{"lineNumber":419,"author":{"gitId":"jonasongg"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":420,"author":{"gitId":"jonasongg"},"content":" .first()"},{"lineNumber":421,"author":{"gitId":"jonasongg"},"content":" .click();"},{"lineNumber":422,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":423,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027div.mui-select.sort-order \u003e select:visible\u0027)"},{"lineNumber":424,"author":{"gitId":"jonasongg"},"content":" .invoke(\u0027val\u0027)"},{"lineNumber":425,"author":{"gitId":"jonasongg"},"content":" .should(\u0027eq\u0027, \u0027true\u0027); // true is Descending"},{"lineNumber":426,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":427,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":428,"author":{"gitId":"jonasongg"},"content":" .should(\u0027not.contain\u0027, \u0027reverseAuthorshipOrder\u0027);"},{"lineNumber":429,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":430,"author":{"gitId":"jonasongg"},"content":" /* Select ascending and test URL before and after reload */"},{"lineNumber":431,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027div.mui-select.sort-order \u003e select:visible\u0027)"},{"lineNumber":432,"author":{"gitId":"jonasongg"},"content":" .select(\u0027false\u0027);"},{"lineNumber":433,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":434,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":435,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027reverseAuthorshipOrder\u003dfalse\u0027);"},{"lineNumber":436,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":437,"author":{"gitId":"jonasongg"},"content":" cy.reload();"},{"lineNumber":438,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":439,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":440,"author":{"gitId":"jonasongg"},"content":" .should(\u0027not.contain\u0027, \u0027%23%2F\u0027);"},{"lineNumber":441,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":442,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":443,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027reverseAuthorshipOrder\u003dfalse\u0027);"},{"lineNumber":444,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":445,"author":{"gitId":"jonasongg"},"content":" /* Select descending and test URL before and after reload */"},{"lineNumber":446,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":447,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027div.mui-select.sort-order \u003e select:visible\u0027)"},{"lineNumber":448,"author":{"gitId":"jonasongg"},"content":" .select(\u0027true\u0027);"},{"lineNumber":449,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":450,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":451,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027reverseAuthorshipOrder\u003dtrue\u0027);"},{"lineNumber":452,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":453,"author":{"gitId":"jonasongg"},"content":" cy.reload();"},{"lineNumber":454,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":455,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":456,"author":{"gitId":"jonasongg"},"content":" .should(\u0027not.contain\u0027, \u0027%23%2F\u0027);"},{"lineNumber":457,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":458,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":459,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027reverseAuthorshipOrder\u003dtrue\u0027);"},{"lineNumber":460,"author":{"gitId":"jonasongg"},"content":" });"},{"lineNumber":461,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":462,"author":{"gitId":"jonasongg"},"content":" it(\u0027code panel: filter by glob: url params should persist after change and reload\u0027, () \u003d\u003e {"},{"lineNumber":463,"author":{"gitId":"jonasongg"},"content":" // open the code panel"},{"lineNumber":464,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027.icon-button.fa-code\u0027)"},{"lineNumber":465,"author":{"gitId":"jonasongg"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":466,"author":{"gitId":"jonasongg"},"content":" .first()"},{"lineNumber":467,"author":{"gitId":"jonasongg"},"content":" .click();"},{"lineNumber":468,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":469,"author":{"gitId":"jonasongg"},"content":" // click on filter glob radio button"},{"lineNumber":470,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027.radio-button--search\u0027)"},{"lineNumber":471,"author":{"gitId":"jonasongg"},"content":" .should(\u0027be.visible\u0027)"},{"lineNumber":472,"author":{"gitId":"jonasongg"},"content":" .click();"},{"lineNumber":473,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":474,"author":{"gitId":"jonasongg"},"content":" // enter some input"},{"lineNumber":475,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027#search\u0027)"},{"lineNumber":476,"author":{"gitId":"jonasongg"},"content":" .type(\u0027README.md\u0027);"},{"lineNumber":477,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":478,"author":{"gitId":"jonasongg"},"content":" // submit"},{"lineNumber":479,"author":{"gitId":"jonasongg"},"content":" cy.get(\u0027#search\u0027)"},{"lineNumber":480,"author":{"gitId":"jonasongg"},"content":" .type(\u0027{enter}\u0027);"},{"lineNumber":481,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":482,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":483,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027authorshipFilesGlob\u003dREADME.md\u0027);"},{"lineNumber":484,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":485,"author":{"gitId":"jonasongg"},"content":" // Some bugs appear after two reloads, so reload twice here"},{"lineNumber":486,"author":{"gitId":"jonasongg"},"content":" cy.reload();"},{"lineNumber":487,"author":{"gitId":"jonasongg"},"content":" cy.reload();"},{"lineNumber":488,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":489,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":490,"author":{"gitId":"jonasongg"},"content":" .should(\u0027not.contain\u0027, \u0027%23%2F\u0027);"},{"lineNumber":491,"author":{"gitId":"jonasongg"},"content":""},{"lineNumber":492,"author":{"gitId":"jonasongg"},"content":" cy.url()"},{"lineNumber":493,"author":{"gitId":"jonasongg"},"content":" .should(\u0027contain\u0027, \u0027authorshipFilesGlob\u003dREADME.md\u0027);"},{"lineNumber":494,"author":{"gitId":"-"},"content":" });"},{"lineNumber":495,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"-":339,"jonasongg":156}},{"path":"frontend/cypress/tests/general/general.cy.js","fileType":"js","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"describe(\u0027general\u0027, () \u003d\u003e {"},{"lineNumber":2,"author":{"gitId":"-"},"content":" it(\u0027correctly replaces report title\u0027, () \u003d\u003e {"},{"lineNumber":3,"author":{"gitId":"-"},"content":" cy.title().should(\u0027eq\u0027, \u0027RepoSense Test Report\u0027);"},{"lineNumber":4,"author":{"gitId":"-"},"content":" });"},{"lineNumber":5,"author":{"gitId":"sopa301"},"content":""},{"lineNumber":6,"author":{"gitId":"sopa301"},"content":" it(\u0027correctly contains given title\u0027, () \u003d\u003e {"},{"lineNumber":7,"author":{"gitId":"sopa301"},"content":" cy.get(\u0027h1\u0027).should(\u0027contain\u0027, \u0027RepoSense Intro\u0027);"},{"lineNumber":8,"author":{"gitId":"sopa301"},"content":" });"},{"lineNumber":9,"author":{"gitId":"-"},"content":"});"}],"authorContributionMap":{"sopa301":4,"-":5}},{"path":"frontend/package-lock.json","fileType":"json","isIgnored":true,"lines":[],"authorContributionMap":{"sopa301":270,"-":29032}},{"path":"frontend/package.json","fileType":"json","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"{"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \"name\": \"reposense\","},{"lineNumber":3,"author":{"gitId":"-"},"content":" \"version\": \"1.0.0\","},{"lineNumber":4,"author":{"gitId":"-"},"content":" \"description\": \"[![Build Status](https://travis-ci.org/reposense/RepoSense.svg?branch\u003dmaster)](https://travis-ci.org/reposense/RepoSense) [![Build status](https://ci.appveyor.com/api/projects/status/gsbkj5qby3pjd6nw/branch/master?svg\u003dtrue)](https://ci.appveyor.com/project/eugenepeh/reposense/branch/master)\","},{"lineNumber":5,"author":{"gitId":"-"},"content":" \"author\": \"\","},{"lineNumber":6,"author":{"gitId":"-"},"content":" \"scripts\": {"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \"serve\": \"vue-cli-service serve\","},{"lineNumber":8,"author":{"gitId":"-"},"content":" \"build\": \"vue-cli-service build\","},{"lineNumber":9,"author":{"gitId":"-"},"content":" \"lint\": \"eslint src/**/*.{ts,vue} cypress/tests/**/*.js cypress/support.js \u0026\u0026 stylelint ./src/**/*.{vue,scss} \u0026\u0026 npm run puglint\","},{"lineNumber":10,"author":{"gitId":"-"},"content":" \"devbuild\": \"vue-cli-service build --mode development\","},{"lineNumber":11,"author":{"gitId":"-"},"content":" \"lintfix\": \"eslint --fix src/**/*.{ts,vue} cypress/tests/**/*.js cypress/support.js \u0026\u0026 stylelint --fix ./src/**/*.{vue,scss}\","},{"lineNumber":12,"author":{"gitId":"-"},"content":" \"puglint\": \"pug-lint-vue src\","},{"lineNumber":13,"author":{"gitId":"-"},"content":" \"serveOpen\": \"vue-cli-service serve --open\""},{"lineNumber":14,"author":{"gitId":"-"},"content":" },"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \"main\": \"index.js\","},{"lineNumber":16,"author":{"gitId":"-"},"content":" \"dependencies\": {"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \"@fontsource/titillium-web\": \"^4.5.3\","},{"lineNumber":18,"author":{"gitId":"-"},"content":" \"@fortawesome/fontawesome-svg-core\": \"^6.0.0\","},{"lineNumber":19,"author":{"gitId":"-"},"content":" \"@fortawesome/free-brands-svg-icons\": \"^6.0.0\","},{"lineNumber":20,"author":{"gitId":"-"},"content":" \"@fortawesome/free-solid-svg-icons\": \"^6.0.0\","},{"lineNumber":21,"author":{"gitId":"-"},"content":" \"@fortawesome/vue-fontawesome\": \"^3.0.3\","},{"lineNumber":22,"author":{"gitId":"sopa301"},"content":" \"@types/markdown-it\": \"^13.0.7\","},{"lineNumber":23,"author":{"gitId":"-"},"content":" \"@types/minimatch\": \"^5.1.2\","},{"lineNumber":24,"author":{"gitId":"-"},"content":" \"@types/seedrandom\": \"^3.0.5\","},{"lineNumber":25,"author":{"gitId":"-"},"content":" \"core-js\": \"^3.6.5\","},{"lineNumber":26,"author":{"gitId":"-"},"content":" \"highlight.js\": \"^10.5.0\","},{"lineNumber":27,"author":{"gitId":"-"},"content":" \"jszip\": \"^3.5.0\","},{"lineNumber":28,"author":{"gitId":"sopa301"},"content":" \"markdown-it\": \"^14.0.0\","},{"lineNumber":29,"author":{"gitId":"-"},"content":" \"minimatch\": \"^5.0.1\","},{"lineNumber":30,"author":{"gitId":"-"},"content":" \"muicss\": \"^0.10.3\","},{"lineNumber":31,"author":{"gitId":"-"},"content":" \"normalize.css\": \"^8.0.1\","},{"lineNumber":32,"author":{"gitId":"-"},"content":" \"pug-lint-vue\": \"^0.4.0\","},{"lineNumber":33,"author":{"gitId":"-"},"content":" \"seedrandom\": \"^3.0.5\","},{"lineNumber":34,"author":{"gitId":"-"},"content":" \"vue\": \"^3.2.47\","},{"lineNumber":35,"author":{"gitId":"-"},"content":" \"vue-loading-overlay\": \"^5.0.3\","},{"lineNumber":36,"author":{"gitId":"-"},"content":" \"vue-observe-visibility\": \"^1.0.0\","},{"lineNumber":37,"author":{"gitId":"-"},"content":" \"vue-router\": \"^4.1.6\","},{"lineNumber":38,"author":{"gitId":"-"},"content":" \"vuex\": \"^4.0.2\","},{"lineNumber":39,"author":{"gitId":"-"},"content":" \"zod\": \"^3.22.3\""},{"lineNumber":40,"author":{"gitId":"-"},"content":" },"},{"lineNumber":41,"author":{"gitId":"-"},"content":" \"devDependencies\": {"},{"lineNumber":42,"author":{"gitId":"-"},"content":" \"@babel/eslint-parser\": \"^7.17.0\","},{"lineNumber":43,"author":{"gitId":"-"},"content":" \"@typescript-eslint/eslint-plugin\": \"^5.50.0\","},{"lineNumber":44,"author":{"gitId":"-"},"content":" \"@typescript-eslint/parser\": \"^5.50.0\","},{"lineNumber":45,"author":{"gitId":"-"},"content":" \"@vue/cli-plugin-babel\": \"^5.0.4\","},{"lineNumber":46,"author":{"gitId":"-"},"content":" \"@vue/cli-plugin-eslint\": \"^5.0.4\","},{"lineNumber":47,"author":{"gitId":"-"},"content":" \"@vue/cli-plugin-typescript\": \"^5.0.4\","},{"lineNumber":48,"author":{"gitId":"-"},"content":" \"@vue/cli-service\": \"^5.0.4\","},{"lineNumber":49,"author":{"gitId":"-"},"content":" \"@vue/compiler-sfc\": \"^3.2.47\","},{"lineNumber":50,"author":{"gitId":"-"},"content":" \"@vue/eslint-config-typescript\": \"^10.0.0\","},{"lineNumber":51,"author":{"gitId":"-"},"content":" \"eslint\": \"^8.33.0\","},{"lineNumber":52,"author":{"gitId":"-"},"content":" \"eslint-config-airbnb-base\": \"^15.0.0\","},{"lineNumber":53,"author":{"gitId":"-"},"content":" \"eslint-config-airbnb-typescript\": \"^17.0.0\","},{"lineNumber":54,"author":{"gitId":"-"},"content":" \"eslint-plugin-import\": \"^2.26.0\","},{"lineNumber":55,"author":{"gitId":"-"},"content":" \"eslint-plugin-vue\": \"^8.4.1\","},{"lineNumber":56,"author":{"gitId":"-"},"content":" \"node-sass\": \"^7.0.3\","},{"lineNumber":57,"author":{"gitId":"-"},"content":" \"postcss-html\": \"^1.4.1\","},{"lineNumber":58,"author":{"gitId":"-"},"content":" \"pug\": \"^3.0.2\","},{"lineNumber":59,"author":{"gitId":"-"},"content":" \"pug-plain-loader\": \"^1.1.0\","},{"lineNumber":60,"author":{"gitId":"-"},"content":" \"sass\": \"^1.58.0\","},{"lineNumber":61,"author":{"gitId":"-"},"content":" \"sass-loader\": \"^12.6.0\","},{"lineNumber":62,"author":{"gitId":"-"},"content":" \"stylelint\": \"^14.7.1\","},{"lineNumber":63,"author":{"gitId":"-"},"content":" \"stylelint-config-recommended-scss\": \"^6.0.0\","},{"lineNumber":64,"author":{"gitId":"-"},"content":" \"stylelint-config-recommended-vue\": \"^1.4.0\","},{"lineNumber":65,"author":{"gitId":"-"},"content":" \"stylelint-order\": \"^5.0.0\","},{"lineNumber":66,"author":{"gitId":"-"},"content":" \"stylelint-scss\": \"^4.2.0\","},{"lineNumber":67,"author":{"gitId":"-"},"content":" \"stylelint-webpack-plugin\": \"^3.2.0\","},{"lineNumber":68,"author":{"gitId":"-"},"content":" \"typescript\": \"^4.9.5\""},{"lineNumber":69,"author":{"gitId":"-"},"content":" },"},{"lineNumber":70,"author":{"gitId":"-"},"content":" \"bugs\": {"},{"lineNumber":71,"author":{"gitId":"-"},"content":" \"url\": \"https://github.com/reposense/RepoSense/issues\""},{"lineNumber":72,"author":{"gitId":"-"},"content":" },"},{"lineNumber":73,"author":{"gitId":"-"},"content":" \"directories\": {"},{"lineNumber":74,"author":{"gitId":"-"},"content":" \"doc\": \"docs\""},{"lineNumber":75,"author":{"gitId":"-"},"content":" },"},{"lineNumber":76,"author":{"gitId":"-"},"content":" \"homepage\": \"https://github.com/reposense/RepoSense#readme\","},{"lineNumber":77,"author":{"gitId":"-"},"content":" \"license\": \"ISC\","},{"lineNumber":78,"author":{"gitId":"-"},"content":" \"repository\": {"},{"lineNumber":79,"author":{"gitId":"-"},"content":" \"type\": \"git\","},{"lineNumber":80,"author":{"gitId":"-"},"content":" \"url\": \"git+https://github.com/reposense/RepoSense.git\""},{"lineNumber":81,"author":{"gitId":"-"},"content":" }"},{"lineNumber":82,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"sopa301":2,"-":80}},{"path":"src/main/java/reposense/RepoSense.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.time.ZonedDateTime;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.time.format.DateTimeFormatter;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.logging.Level;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.helper.HelpScreenException;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import reposense.git.GitConfig;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import reposense.model.CliArguments;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import reposense.model.RepoConfiguration;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import reposense.model.ReportConfiguration;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import reposense.model.RunConfigurationDecider;"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import reposense.parser.ArgsParser;"},{"lineNumber":18,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidCsvException;"},{"lineNumber":19,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidHeaderException;"},{"lineNumber":20,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.ParseException;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import reposense.report.ReportGenerator;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import reposense.system.LogsManager;"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import reposense.system.ReportServer;"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import reposense.util.FileUtil;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import reposense.util.TimeUtil;"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * The main RepoSense class."},{"lineNumber":29,"author":{"gitId":"-"},"content":" */"},{"lineNumber":30,"author":{"gitId":"-"},"content":"public class RepoSense {"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsManager.getLogger(RepoSense.class);"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final int SERVER_PORT_NUMBER \u003d 9000;"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final DateTimeFormatter formatter \u003d DateTimeFormatter.ofPattern(\"E MMM d HH:mm:ss yyyy z\");"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final String VERSION_UNSPECIFIED \u003d \"unspecified\";"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * The entry point of the program."},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Additional flags are provided by the user in {@code args}."},{"lineNumber":39,"author":{"gitId":"-"},"content":" */"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public static void main(String[] args) {"},{"lineNumber":41,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":42,"author":{"gitId":"-"},"content":" TimeUtil.startTimer();"},{"lineNumber":43,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(args);"},{"lineNumber":44,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e configs \u003d null;"},{"lineNumber":45,"author":{"gitId":"-"},"content":" ReportConfiguration reportConfig \u003d new ReportConfiguration();"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":" if (cliArguments.isViewModeOnly()) {"},{"lineNumber":48,"author":{"gitId":"-"},"content":" ReportServer.startServer(SERVER_PORT_NUMBER, cliArguments.getReportDirectoryPath().toAbsolutePath());"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }"},{"lineNumber":51,"author":{"gitId":"-"},"content":""},{"lineNumber":52,"author":{"gitId":"-"},"content":" configs \u003d RunConfigurationDecider.getRunConfiguration(cliArguments).getRepoConfigurations();"},{"lineNumber":53,"author":{"gitId":"-"},"content":" reportConfig \u003d cliArguments.getReportConfiguration();"},{"lineNumber":54,"author":{"gitId":"-"},"content":""},{"lineNumber":55,"author":{"gitId":"-"},"content":" RepoConfiguration.setFormatsToRepoConfigs(configs, cliArguments.getFormats());"},{"lineNumber":56,"author":{"gitId":"-"},"content":" RepoConfiguration.setDatesToRepoConfigs(configs, cliArguments.getSinceDate(), cliArguments.getUntilDate());"},{"lineNumber":57,"author":{"gitId":"-"},"content":" RepoConfiguration.setZoneIdToRepoConfigs(configs, cliArguments.getZoneId());"},{"lineNumber":58,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(configs,"},{"lineNumber":59,"author":{"gitId":"-"},"content":" cliArguments.isStandaloneConfigIgnored());"},{"lineNumber":60,"author":{"gitId":"-"},"content":" RepoConfiguration.setFileSizeLimitIgnoredToRepoConfigs(configs,"},{"lineNumber":61,"author":{"gitId":"-"},"content":" cliArguments.isFileSizeLimitIgnored());"},{"lineNumber":62,"author":{"gitId":"-"},"content":" RepoConfiguration.setIsLastModifiedDateIncludedToRepoConfigs(configs,"},{"lineNumber":63,"author":{"gitId":"-"},"content":" cliArguments.isLastModifiedDateIncluded());"},{"lineNumber":64,"author":{"gitId":"-"},"content":" RepoConfiguration.setIsShallowCloningPerformedToRepoConfigs(configs,"},{"lineNumber":65,"author":{"gitId":"-"},"content":" cliArguments.isShallowCloningPerformed());"},{"lineNumber":66,"author":{"gitId":"-"},"content":" RepoConfiguration.setIsFindingPreviousAuthorsPerformedToRepoConfigs(configs,"},{"lineNumber":67,"author":{"gitId":"-"},"content":" cliArguments.isFindingPreviousAuthorsPerformed());"},{"lineNumber":68,"author":{"gitId":"-"},"content":""},{"lineNumber":69,"author":{"gitId":"-"},"content":" List\u003cString[]\u003e globalGitConfig \u003d GitConfig.getGlobalGitLfsConfig();"},{"lineNumber":70,"author":{"gitId":"-"},"content":" if (globalGitConfig.size() !\u003d 0) {"},{"lineNumber":71,"author":{"gitId":"-"},"content":" GitConfig.setGlobalGitLfsConfig(GitConfig.SKIP_SMUDGE_CONFIG_SETTINGS);"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }"},{"lineNumber":73,"author":{"gitId":"-"},"content":""},{"lineNumber":74,"author":{"gitId":"-"},"content":" ReportGenerator reportGenerator \u003d new ReportGenerator();"},{"lineNumber":75,"author":{"gitId":"-"},"content":" List\u003cPath\u003e reportFoldersAndFiles \u003d reportGenerator.generateReposReport(configs,"},{"lineNumber":76,"author":{"gitId":"-"},"content":" cliArguments.getOutputFilePath().toAbsolutePath().toString(),"},{"lineNumber":77,"author":{"gitId":"-"},"content":" cliArguments.getAssetsFilePath().toAbsolutePath().toString(), reportConfig,"},{"lineNumber":78,"author":{"gitId":"-"},"content":" formatter.format(ZonedDateTime.now(cliArguments.getZoneId())),"},{"lineNumber":79,"author":{"gitId":"-"},"content":" cliArguments.getSinceDate(), cliArguments.getUntilDate(),"},{"lineNumber":80,"author":{"gitId":"-"},"content":" cliArguments.isSinceDateProvided(), cliArguments.isUntilDateProvided(),"},{"lineNumber":81,"author":{"gitId":"-"},"content":" cliArguments.getNumCloningThreads(), cliArguments.getNumAnalysisThreads(),"},{"lineNumber":82,"author":{"gitId":"-"},"content":" TimeUtil::getElapsedTime, cliArguments.getZoneId(), cliArguments.isFreshClonePerformed());"},{"lineNumber":83,"author":{"gitId":"-"},"content":""},{"lineNumber":84,"author":{"gitId":"-"},"content":" FileUtil.zipFoldersAndFiles(reportFoldersAndFiles, cliArguments.getOutputFilePath().toAbsolutePath(),"},{"lineNumber":85,"author":{"gitId":"-"},"content":" \".json\");"},{"lineNumber":86,"author":{"gitId":"-"},"content":""},{"lineNumber":87,"author":{"gitId":"-"},"content":" // Set back to user\u0027s initial global git lfs config"},{"lineNumber":88,"author":{"gitId":"-"},"content":" GitConfig.setGlobalGitLfsConfig(globalGitConfig);"},{"lineNumber":89,"author":{"gitId":"-"},"content":""},{"lineNumber":90,"author":{"gitId":"-"},"content":" logger.info(TimeUtil.getElapsedTimeMessage());"},{"lineNumber":91,"author":{"gitId":"-"},"content":""},{"lineNumber":92,"author":{"gitId":"-"},"content":" if (cliArguments.isAutomaticallyLaunching()) {"},{"lineNumber":93,"author":{"gitId":"-"},"content":" ReportServer.startServer(SERVER_PORT_NUMBER, cliArguments.getOutputFilePath().toAbsolutePath());"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }"},{"lineNumber":95,"author":{"gitId":"-"},"content":" } catch (IOException | ParseException | InvalidCsvException | InvalidHeaderException e) {"},{"lineNumber":96,"author":{"gitId":"-"},"content":" logger.log(Level.WARNING, e.getMessage(), e);"},{"lineNumber":97,"author":{"gitId":"-"},"content":" } catch (HelpScreenException e) {"},{"lineNumber":98,"author":{"gitId":"-"},"content":" // help message was printed by the ArgumentParser; it is safe to exit."},{"lineNumber":99,"author":{"gitId":"-"},"content":" }"},{"lineNumber":100,"author":{"gitId":"-"},"content":""},{"lineNumber":101,"author":{"gitId":"-"},"content":" LogsManager.moveLogFileToOutputFolder();"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }"},{"lineNumber":103,"author":{"gitId":"-"},"content":""},{"lineNumber":104,"author":{"gitId":"-"},"content":" public static String getVersion() {"},{"lineNumber":105,"author":{"gitId":"-"},"content":" String version \u003d RepoSense.class.getPackage().getImplementationVersion();"},{"lineNumber":106,"author":{"gitId":"-"},"content":""},{"lineNumber":107,"author":{"gitId":"-"},"content":" if (version \u003d\u003d null || version.equals(VERSION_UNSPECIFIED)) {"},{"lineNumber":108,"author":{"gitId":"-"},"content":" version \u003d System.getProperty(\"version\");"},{"lineNumber":109,"author":{"gitId":"-"},"content":" }"},{"lineNumber":110,"author":{"gitId":"-"},"content":""},{"lineNumber":111,"author":{"gitId":"-"},"content":" return version;"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }"},{"lineNumber":113,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":3,"-":110}},{"path":"src/main/java/reposense/model/Author.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.model;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.FileSystems;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.PathMatcher;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.ArrayList;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":8,"author":{"gitId":"asdfghjkxd"},"content":"import java.util.regex.Pattern;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Represents a Git Author."},{"lineNumber":12,"author":{"gitId":"-"},"content":" */"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class Author {"},{"lineNumber":14,"author":{"gitId":"-"},"content":" public static final String NAME_NO_AUTHOR_WITH_COMMITS_FOUND \u003d"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \"NO AUTHOR WITH COMMITS FOUND WITHIN THIS PERIOD OF TIME\";"},{"lineNumber":16,"author":{"gitId":"-"},"content":" private static final String UNKNOWN_AUTHOR_GIT_ID \u003d \"-\";"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":" private static final String STANDARD_GITHUB_EMAIL_DOMAIN \u003d \"@users.noreply.github.com\";"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private static final String STANDARD_GITLAB_EMAIL_DOMAIN \u003d \"@users.noreply.gitlab.com\";"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final String MESSAGE_UNCOMMON_EMAIL_PATTERN \u003d \"The provided email, %s, uses uncommon pattern.\";"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final String MESSAGE_UNCOMMON_GLOB_PATTERN \u003d \"The provided ignore glob, %s, uses uncommon pattern.\";"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final String COMMON_EMAIL_REGEX \u003d"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \"^([a-zA-Z0-9_\\\\-\\\\.\\\\+]+)@([a-zA-Z0-9_\\\\-\\\\.]+)\\\\.([a-zA-Z]{2,5})$\";"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String COMMON_GLOB_REGEX \u003d \"^[-a-zA-Z0-9 _/\\\\\\\\*!{}\\\\[\\\\]!(),:.]*$\";"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"-"},"content":" public static final Author UNKNOWN_AUTHOR \u003d new Author(UNKNOWN_AUTHOR_GIT_ID);"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" private final String gitId;"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":" private transient List\u003cString\u003e emails;"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private transient String displayName;"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private transient List\u003cString\u003e authorAliases;"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private transient List\u003cString\u003e ignoreGlobList;"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private transient PathMatcher ignoreGlobMatcher;"},{"lineNumber":36,"author":{"gitId":"-"},"content":""},{"lineNumber":37,"author":{"gitId":"-"},"content":" public Author(String gitId) {"},{"lineNumber":38,"author":{"gitId":"-"},"content":" this.gitId \u003d gitId;"},{"lineNumber":39,"author":{"gitId":"-"},"content":" this.emails \u003d new ArrayList\u003c\u003e();"},{"lineNumber":40,"author":{"gitId":"-"},"content":" this.displayName \u003d gitId;"},{"lineNumber":41,"author":{"gitId":"-"},"content":" this.authorAliases \u003d new ArrayList\u003c\u003e();"},{"lineNumber":42,"author":{"gitId":"-"},"content":" this.ignoreGlobList \u003d new ArrayList\u003c\u003e();"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":" addStandardGitHostEmails(this.emails);"},{"lineNumber":45,"author":{"gitId":"-"},"content":" updateIgnoreGlobMatcher();"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }"},{"lineNumber":47,"author":{"gitId":"-"},"content":""},{"lineNumber":48,"author":{"gitId":"-"},"content":" public Author(StandaloneAuthor sa) {"},{"lineNumber":49,"author":{"gitId":"-"},"content":" String gitId \u003d sa.getGitId();"},{"lineNumber":50,"author":{"gitId":"-"},"content":" List\u003cString\u003e emails \u003d new ArrayList\u003c\u003e(sa.getEmails());"},{"lineNumber":51,"author":{"gitId":"-"},"content":" String displayName \u003d !sa.getDisplayName().isEmpty() ? sa.getDisplayName() : sa.getGitId();"},{"lineNumber":52,"author":{"gitId":"-"},"content":" List\u003cString\u003e authorAliases \u003d sa.getAuthorNames();"},{"lineNumber":53,"author":{"gitId":"-"},"content":" List\u003cString\u003e ignoreGlobList \u003d sa.getIgnoreGlobList();"},{"lineNumber":54,"author":{"gitId":"-"},"content":""},{"lineNumber":55,"author":{"gitId":"-"},"content":" this.gitId \u003d gitId;"},{"lineNumber":56,"author":{"gitId":"-"},"content":" this.displayName \u003d displayName;"},{"lineNumber":57,"author":{"gitId":"-"},"content":" this.authorAliases \u003d authorAliases;"},{"lineNumber":58,"author":{"gitId":"-"},"content":""},{"lineNumber":59,"author":{"gitId":"-"},"content":" setEmails(emails);"},{"lineNumber":60,"author":{"gitId":"-"},"content":" setIgnoreGlobList(ignoreGlobList);"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }"},{"lineNumber":62,"author":{"gitId":"-"},"content":""},{"lineNumber":63,"author":{"gitId":"-"},"content":" public Author(Author another) {"},{"lineNumber":64,"author":{"gitId":"-"},"content":" this.gitId \u003d another.gitId;"},{"lineNumber":65,"author":{"gitId":"-"},"content":" this.emails \u003d another.emails;"},{"lineNumber":66,"author":{"gitId":"-"},"content":" this.displayName \u003d another.gitId;"},{"lineNumber":67,"author":{"gitId":"-"},"content":" this.authorAliases \u003d another.authorAliases;"},{"lineNumber":68,"author":{"gitId":"-"},"content":" this.ignoreGlobList \u003d another.ignoreGlobList;"},{"lineNumber":69,"author":{"gitId":"-"},"content":" this.ignoreGlobMatcher \u003d another.ignoreGlobMatcher;"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }"},{"lineNumber":71,"author":{"gitId":"-"},"content":""},{"lineNumber":72,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * Checks that all the strings in the {@code emails} only contains commonly used email patterns."},{"lineNumber":74,"author":{"gitId":"-"},"content":" *"},{"lineNumber":75,"author":{"gitId":"-"},"content":" * @throws IllegalArgumentException if any of the values do not meet the criteria."},{"lineNumber":76,"author":{"gitId":"-"},"content":" */"},{"lineNumber":77,"author":{"gitId":"-"},"content":" private static void validateEmails(List\u003cString\u003e emails) throws IllegalArgumentException {"},{"lineNumber":78,"author":{"gitId":"asdfghjkxd"},"content":" Pattern emailPattern \u003d Pattern.compile(COMMON_EMAIL_REGEX);"},{"lineNumber":79,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":80,"author":{"gitId":"-"},"content":" for (String email : emails) {"},{"lineNumber":81,"author":{"gitId":"asdfghjkxd"},"content":" if (!emailPattern.matcher(email).matches()) {"},{"lineNumber":82,"author":{"gitId":"-"},"content":" throw new IllegalArgumentException(String.format(MESSAGE_UNCOMMON_EMAIL_PATTERN, email));"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }"},{"lineNumber":85,"author":{"gitId":"-"},"content":" }"},{"lineNumber":86,"author":{"gitId":"-"},"content":""},{"lineNumber":87,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":88,"author":{"gitId":"-"},"content":" * Checks that all the strings in the {@code ignoreGlobList} only contains commonly used glob patterns."},{"lineNumber":89,"author":{"gitId":"-"},"content":" *"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * @throws IllegalArgumentException if any of the values do not meet the criteria."},{"lineNumber":91,"author":{"gitId":"-"},"content":" */"},{"lineNumber":92,"author":{"gitId":"-"},"content":" private static void validateIgnoreGlobs(List\u003cString\u003e ignoreGlobList) throws IllegalArgumentException {"},{"lineNumber":93,"author":{"gitId":"asdfghjkxd"},"content":" Pattern globPattern \u003d Pattern.compile(COMMON_GLOB_REGEX);"},{"lineNumber":94,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":95,"author":{"gitId":"-"},"content":" for (String glob : ignoreGlobList) {"},{"lineNumber":96,"author":{"gitId":"asdfghjkxd"},"content":" if (!globPattern.matcher(glob).matches()) {"},{"lineNumber":97,"author":{"gitId":"-"},"content":" throw new IllegalArgumentException(String.format(MESSAGE_UNCOMMON_GLOB_PATTERN, glob));"},{"lineNumber":98,"author":{"gitId":"-"},"content":" }"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }"},{"lineNumber":101,"author":{"gitId":"-"},"content":""},{"lineNumber":102,"author":{"gitId":"-"},"content":" public String getGitId() {"},{"lineNumber":103,"author":{"gitId":"-"},"content":" return gitId;"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }"},{"lineNumber":105,"author":{"gitId":"-"},"content":""},{"lineNumber":106,"author":{"gitId":"-"},"content":" public List\u003cString\u003e getEmails() {"},{"lineNumber":107,"author":{"gitId":"-"},"content":" return emails;"},{"lineNumber":108,"author":{"gitId":"-"},"content":" }"},{"lineNumber":109,"author":{"gitId":"-"},"content":""},{"lineNumber":110,"author":{"gitId":"-"},"content":" public void setEmails(List\u003cString\u003e emails) {"},{"lineNumber":111,"author":{"gitId":"-"},"content":" validateEmails(emails);"},{"lineNumber":112,"author":{"gitId":"-"},"content":" this.emails \u003d new ArrayList\u003c\u003e(emails);"},{"lineNumber":113,"author":{"gitId":"-"},"content":" addStandardGitHostEmails(this.emails);"},{"lineNumber":114,"author":{"gitId":"-"},"content":" }"},{"lineNumber":115,"author":{"gitId":"-"},"content":""},{"lineNumber":116,"author":{"gitId":"-"},"content":" public String getDisplayName() {"},{"lineNumber":117,"author":{"gitId":"-"},"content":" return displayName;"},{"lineNumber":118,"author":{"gitId":"-"},"content":" }"},{"lineNumber":119,"author":{"gitId":"-"},"content":""},{"lineNumber":120,"author":{"gitId":"-"},"content":" public void setDisplayName(String displayName) {"},{"lineNumber":121,"author":{"gitId":"-"},"content":" this.displayName \u003d displayName;"},{"lineNumber":122,"author":{"gitId":"-"},"content":" }"},{"lineNumber":123,"author":{"gitId":"-"},"content":""},{"lineNumber":124,"author":{"gitId":"-"},"content":" public List\u003cString\u003e getAuthorAliases() {"},{"lineNumber":125,"author":{"gitId":"-"},"content":" return authorAliases;"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }"},{"lineNumber":127,"author":{"gitId":"-"},"content":""},{"lineNumber":128,"author":{"gitId":"-"},"content":" public void setAuthorAliases(List\u003cString\u003e authorAliases) {"},{"lineNumber":129,"author":{"gitId":"-"},"content":" this.authorAliases \u003d authorAliases;"},{"lineNumber":130,"author":{"gitId":"-"},"content":" }"},{"lineNumber":131,"author":{"gitId":"-"},"content":""},{"lineNumber":132,"author":{"gitId":"-"},"content":" public List\u003cString\u003e getIgnoreGlobList() {"},{"lineNumber":133,"author":{"gitId":"-"},"content":" return ignoreGlobList;"},{"lineNumber":134,"author":{"gitId":"-"},"content":" }"},{"lineNumber":135,"author":{"gitId":"-"},"content":""},{"lineNumber":136,"author":{"gitId":"-"},"content":" public void setIgnoreGlobList(List\u003cString\u003e ignoreGlobList) {"},{"lineNumber":137,"author":{"gitId":"-"},"content":" validateIgnoreGlobs(ignoreGlobList);"},{"lineNumber":138,"author":{"gitId":"-"},"content":" this.ignoreGlobList \u003d new ArrayList\u003c\u003e(ignoreGlobList);"},{"lineNumber":139,"author":{"gitId":"-"},"content":" updateIgnoreGlobMatcher();"},{"lineNumber":140,"author":{"gitId":"-"},"content":" }"},{"lineNumber":141,"author":{"gitId":"-"},"content":""},{"lineNumber":142,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":143,"author":{"gitId":"-"},"content":" * Validates and adds {@code ignoreGlobList} into the {@link Author} class instance variable without duplicates"},{"lineNumber":144,"author":{"gitId":"-"},"content":" * and updates the ignore glob matcher."},{"lineNumber":145,"author":{"gitId":"-"},"content":" */"},{"lineNumber":146,"author":{"gitId":"-"},"content":" public void importIgnoreGlobList(List\u003cString\u003e ignoreGlobList) {"},{"lineNumber":147,"author":{"gitId":"-"},"content":" validateIgnoreGlobs(ignoreGlobList);"},{"lineNumber":148,"author":{"gitId":"-"},"content":" ignoreGlobList.forEach(ignoreGlob -\u003e {"},{"lineNumber":149,"author":{"gitId":"-"},"content":" if (!this.ignoreGlobList.contains(ignoreGlob)) {"},{"lineNumber":150,"author":{"gitId":"-"},"content":" this.ignoreGlobList.add(ignoreGlob);"},{"lineNumber":151,"author":{"gitId":"-"},"content":" }"},{"lineNumber":152,"author":{"gitId":"-"},"content":" });"},{"lineNumber":153,"author":{"gitId":"-"},"content":" updateIgnoreGlobMatcher();"},{"lineNumber":154,"author":{"gitId":"-"},"content":" }"},{"lineNumber":155,"author":{"gitId":"-"},"content":""},{"lineNumber":156,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":157,"author":{"gitId":"-"},"content":" * Returns true if this author is ignoring the {@code filePath} based on its ignore glob matcher."},{"lineNumber":158,"author":{"gitId":"-"},"content":" */"},{"lineNumber":159,"author":{"gitId":"-"},"content":" public boolean isIgnoringFile(Path filePath) {"},{"lineNumber":160,"author":{"gitId":"-"},"content":" return ignoreGlobMatcher.matches(filePath);"},{"lineNumber":161,"author":{"gitId":"-"},"content":" }"},{"lineNumber":162,"author":{"gitId":"-"},"content":""},{"lineNumber":163,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":164,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {"},{"lineNumber":165,"author":{"gitId":"-"},"content":" // short circuit if same object"},{"lineNumber":166,"author":{"gitId":"-"},"content":" if (this \u003d\u003d other) {"},{"lineNumber":167,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":168,"author":{"gitId":"-"},"content":" }"},{"lineNumber":169,"author":{"gitId":"-"},"content":""},{"lineNumber":170,"author":{"gitId":"-"},"content":" // instanceof handles null"},{"lineNumber":171,"author":{"gitId":"-"},"content":" if (!(other instanceof Author)) {"},{"lineNumber":172,"author":{"gitId":"-"},"content":" return false;"},{"lineNumber":173,"author":{"gitId":"-"},"content":" }"},{"lineNumber":174,"author":{"gitId":"-"},"content":""},{"lineNumber":175,"author":{"gitId":"-"},"content":" Author otherAuthor \u003d (Author) other;"},{"lineNumber":176,"author":{"gitId":"-"},"content":" return this.gitId.equalsIgnoreCase(otherAuthor.gitId);"},{"lineNumber":177,"author":{"gitId":"-"},"content":" }"},{"lineNumber":178,"author":{"gitId":"-"},"content":""},{"lineNumber":179,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":180,"author":{"gitId":"-"},"content":" public int hashCode() {"},{"lineNumber":181,"author":{"gitId":"-"},"content":" return gitId !\u003d null ? gitId.toLowerCase().hashCode() : 0;"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }"},{"lineNumber":183,"author":{"gitId":"-"},"content":""},{"lineNumber":184,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":185,"author":{"gitId":"-"},"content":" public String toString() {"},{"lineNumber":186,"author":{"gitId":"-"},"content":" return gitId;"},{"lineNumber":187,"author":{"gitId":"-"},"content":" }"},{"lineNumber":188,"author":{"gitId":"-"},"content":""},{"lineNumber":189,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":190,"author":{"gitId":"-"},"content":" * Updates the {@link PathMatcher} to the new ignore glob list set."},{"lineNumber":191,"author":{"gitId":"-"},"content":" * Called after a new ignore glob list is set."},{"lineNumber":192,"author":{"gitId":"-"},"content":" */"},{"lineNumber":193,"author":{"gitId":"-"},"content":" private void updateIgnoreGlobMatcher() {"},{"lineNumber":194,"author":{"gitId":"-"},"content":" String globString \u003d \"glob:{\" + String.join(\",\", ignoreGlobList) + \"}\";"},{"lineNumber":195,"author":{"gitId":"-"},"content":" ignoreGlobMatcher \u003d FileSystems.getDefault().getPathMatcher(globString);"},{"lineNumber":196,"author":{"gitId":"-"},"content":" }"},{"lineNumber":197,"author":{"gitId":"-"},"content":""},{"lineNumber":198,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":199,"author":{"gitId":"-"},"content":" * Adds the standard github and gitlab emails to {@code emails} if not present."},{"lineNumber":200,"author":{"gitId":"-"},"content":" */"},{"lineNumber":201,"author":{"gitId":"-"},"content":" private void addStandardGitHostEmails(List\u003cString\u003e emails) {"},{"lineNumber":202,"author":{"gitId":"-"},"content":" String standardGitHubEmail \u003d getGitId() + STANDARD_GITHUB_EMAIL_DOMAIN;"},{"lineNumber":203,"author":{"gitId":"-"},"content":" String standardGitLabEmail \u003d getGitId() + STANDARD_GITLAB_EMAIL_DOMAIN;"},{"lineNumber":204,"author":{"gitId":"-"},"content":" if (!emails.contains(standardGitHubEmail)) {"},{"lineNumber":205,"author":{"gitId":"-"},"content":" emails.add(standardGitHubEmail);"},{"lineNumber":206,"author":{"gitId":"-"},"content":" }"},{"lineNumber":207,"author":{"gitId":"-"},"content":" if (!emails.contains(standardGitLabEmail)) {"},{"lineNumber":208,"author":{"gitId":"-"},"content":" emails.add(standardGitLabEmail);"},{"lineNumber":209,"author":{"gitId":"-"},"content":" }"},{"lineNumber":210,"author":{"gitId":"-"},"content":" }"},{"lineNumber":211,"author":{"gitId":"-"},"content":"}"},{"lineNumber":212,"author":{"gitId":"-"},"content":""}],"authorContributionMap":{"asdfghjkxd":7,"-":205}},{"path":"src/main/java/reposense/model/CliRunConfiguration.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.model;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.ArrayList;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.logging.Level;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidLocationException;"},{"lineNumber":9,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.ParseException;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import reposense.system.LogsManager;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * Represents RepoSense run configured by CLI."},{"lineNumber":14,"author":{"gitId":"-"},"content":" */"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class CliRunConfiguration implements RunConfiguration {"},{"lineNumber":16,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsManager.getLogger(CliRunConfiguration.class);"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":" private final CliArguments cliArguments;"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":" public CliRunConfiguration(CliArguments cliArguments) {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" this.cliArguments \u003d cliArguments;"},{"lineNumber":22,"author":{"gitId":"-"},"content":" }"},{"lineNumber":23,"author":{"gitId":"-"},"content":""},{"lineNumber":24,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * Constructs a list of {@link RepoConfiguration}."},{"lineNumber":26,"author":{"gitId":"-"},"content":" *"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * @throws ParseException if all repo locations are invalid."},{"lineNumber":28,"author":{"gitId":"-"},"content":" */"},{"lineNumber":29,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":30,"author":{"gitId":"-"},"content":" public List\u003cRepoConfiguration\u003e getRepoConfigurations() throws ParseException {"},{"lineNumber":31,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e configs \u003d new ArrayList\u003c\u003e();"},{"lineNumber":32,"author":{"gitId":"-"},"content":" for (String locationString : cliArguments.getLocations()) {"},{"lineNumber":33,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":34,"author":{"gitId":"asdfghjkxd"},"content":" configs.add("},{"lineNumber":35,"author":{"gitId":"asdfghjkxd"},"content":" new RepoConfiguration.Builder()"},{"lineNumber":36,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(locationString))"},{"lineNumber":37,"author":{"gitId":"asdfghjkxd"},"content":" .build()"},{"lineNumber":38,"author":{"gitId":"asdfghjkxd"},"content":" );"},{"lineNumber":39,"author":{"gitId":"-"},"content":" } catch (InvalidLocationException ile) {"},{"lineNumber":40,"author":{"gitId":"-"},"content":" logger.log(Level.WARNING, ile.getMessage(), ile);"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":" if (configs.isEmpty()) {"},{"lineNumber":45,"author":{"gitId":"-"},"content":" throw new ParseException(\"All repository locations are invalid.\");"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }"},{"lineNumber":47,"author":{"gitId":"-"},"content":""},{"lineNumber":48,"author":{"gitId":"-"},"content":" return configs;"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }"},{"lineNumber":50,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":7,"-":43}},{"path":"src/main/java/reposense/model/ConfigRunConfiguration.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.model;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Files;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.logging.Level;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"import reposense.parser.AuthorConfigCsvParser;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import reposense.parser.GroupConfigCsvParser;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import reposense.parser.RepoConfigCsvParser;"},{"lineNumber":13,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidCsvException;"},{"lineNumber":14,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidHeaderException;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import reposense.system.LogsManager;"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Represents RepoSense run configured by config files."},{"lineNumber":19,"author":{"gitId":"-"},"content":" */"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class ConfigRunConfiguration implements RunConfiguration {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsManager.getLogger(ConfigRunConfiguration.class);"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":" private final CliArguments cliArguments;"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":" public ConfigRunConfiguration(CliArguments cliArguments) {"},{"lineNumber":26,"author":{"gitId":"-"},"content":" this.cliArguments \u003d cliArguments;"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Constructs a list of {@link RepoConfiguration}."},{"lineNumber":32,"author":{"gitId":"-"},"content":" *"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * @throws IOException if user-supplied csv file does not exist or is not readable."},{"lineNumber":34,"author":{"gitId":"-"},"content":" * @throws InvalidCsvException if user-supplied repo-config csv is malformed."},{"lineNumber":35,"author":{"gitId":"-"},"content":" * @throws InvalidHeaderException if user-supplied csv file has header that cannot be parsed."},{"lineNumber":36,"author":{"gitId":"-"},"content":" */"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public List\u003cRepoConfiguration\u003e getRepoConfigurations()"},{"lineNumber":39,"author":{"gitId":"-"},"content":" throws IOException, InvalidCsvException, InvalidHeaderException {"},{"lineNumber":40,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e repoConfigs \u003d new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":41,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e authorConfigs;"},{"lineNumber":42,"author":{"gitId":"-"},"content":" List\u003cGroupConfiguration\u003e groupConfigs;"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":" Path authorConfigFilePath \u003d cliArguments.getAuthorConfigFilePath();"},{"lineNumber":45,"author":{"gitId":"-"},"content":" Path groupConfigFilePath \u003d cliArguments.getGroupConfigFilePath();"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":""},{"lineNumber":48,"author":{"gitId":"-"},"content":" if (authorConfigFilePath !\u003d null \u0026\u0026 Files.exists(authorConfigFilePath)) {"},{"lineNumber":49,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":50,"author":{"gitId":"-"},"content":" authorConfigs \u003d new AuthorConfigCsvParser(cliArguments.getAuthorConfigFilePath()).parse();"},{"lineNumber":51,"author":{"gitId":"-"},"content":" RepoConfiguration.merge(repoConfigs, authorConfigs);"},{"lineNumber":52,"author":{"gitId":"-"},"content":" RepoConfiguration.setHasAuthorConfigFileToRepoConfigs(repoConfigs, true);"},{"lineNumber":53,"author":{"gitId":"-"},"content":" } catch (IOException | InvalidCsvException e) {"},{"lineNumber":54,"author":{"gitId":"-"},"content":" // for all IO and invalid csv exceptions, log the error and continue"},{"lineNumber":55,"author":{"gitId":"-"},"content":" logger.log(Level.WARNING, e.getMessage(), e);"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }"},{"lineNumber":58,"author":{"gitId":"-"},"content":""},{"lineNumber":59,"author":{"gitId":"-"},"content":" if (groupConfigFilePath !\u003d null \u0026\u0026 Files.exists(groupConfigFilePath)) {"},{"lineNumber":60,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":61,"author":{"gitId":"-"},"content":" groupConfigs \u003d new GroupConfigCsvParser(cliArguments.getGroupConfigFilePath()).parse();"},{"lineNumber":62,"author":{"gitId":"-"},"content":" RepoConfiguration.setGroupConfigsToRepos(repoConfigs, groupConfigs);"},{"lineNumber":63,"author":{"gitId":"-"},"content":" } catch (IOException | InvalidCsvException e) {"},{"lineNumber":64,"author":{"gitId":"-"},"content":" // for all IO and invalid csv exceptions, log the error and continue"},{"lineNumber":65,"author":{"gitId":"-"},"content":" logger.log(Level.WARNING, e.getMessage(), e);"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }"},{"lineNumber":68,"author":{"gitId":"-"},"content":""},{"lineNumber":69,"author":{"gitId":"-"},"content":" return repoConfigs;"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }"},{"lineNumber":71,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":2,"-":69}},{"path":"src/main/java/reposense/model/RepoConfiguration.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.model;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.File;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.time.LocalDateTime;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.time.ZoneId;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.ArrayList;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Collections;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Map;"},{"lineNumber":10,"author":{"gitId":"asdfghjkxd"},"content":"import java.util.Optional;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"import reposense.git.GitBranch;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import reposense.git.exception.GitBranchException;"},{"lineNumber":16,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.ConfigurationBuildException;"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import reposense.system.LogsManager;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import reposense.util.FileUtil;"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Represents configuration information from CSV config file for a single repository."},{"lineNumber":22,"author":{"gitId":"-"},"content":" */"},{"lineNumber":23,"author":{"gitId":"-"},"content":"public class RepoConfiguration {"},{"lineNumber":24,"author":{"gitId":"-"},"content":" public static final String DEFAULT_BRANCH \u003d \"HEAD\";"},{"lineNumber":25,"author":{"gitId":"-"},"content":" public static final String DEFAULT_EXTRA_OUTPUT_FOLDER_NAME \u003d \"\";"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public static final long DEFAULT_FILE_SIZE_LIMIT \u003d 500000;"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsManager.getLogger(RepoConfiguration.class);"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" private RepoLocation location;"},{"lineNumber":30,"author":{"gitId":"asdfghjkxd"},"content":" private String branch \u003d DEFAULT_BRANCH;"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private String displayName;"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private String outputFolderName;"},{"lineNumber":33,"author":{"gitId":"asdfghjkxd"},"content":" private transient String extraOutputFolderName \u003d DEFAULT_EXTRA_OUTPUT_FOLDER_NAME;"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private transient ZoneId zoneId;"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private transient LocalDateTime sinceDate;"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private transient LocalDateTime untilDate;"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private transient String repoFolderName;"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"asdfghjkxd"},"content":" private transient FileTypeManager fileTypeManager \u003d new FileTypeManager(Collections.emptyList());"},{"lineNumber":40,"author":{"gitId":"-"},"content":" private transient List\u003cString\u003e ignoreGlobList \u003d new ArrayList\u003c\u003e();"},{"lineNumber":41,"author":{"gitId":"-"},"content":" private transient List\u003cString\u003e ignoredAuthorsList \u003d new ArrayList\u003c\u003e();"},{"lineNumber":42,"author":{"gitId":"-"},"content":" private transient AuthorConfiguration authorConfig;"},{"lineNumber":43,"author":{"gitId":"asdfghjkxd"},"content":" private transient boolean isStandaloneConfigIgnored \u003d false;"},{"lineNumber":44,"author":{"gitId":"asdfghjkxd"},"content":" private transient boolean isFileSizeLimitIgnored \u003d false;"},{"lineNumber":45,"author":{"gitId":"asdfghjkxd"},"content":" private transient List\u003cCommitHash\u003e ignoreCommitList \u003d Collections.emptyList();"},{"lineNumber":46,"author":{"gitId":"-"},"content":" private transient boolean isLastModifiedDateIncluded;"},{"lineNumber":47,"author":{"gitId":"asdfghjkxd"},"content":" private transient boolean isShallowCloningPerformed \u003d false;"},{"lineNumber":48,"author":{"gitId":"asdfghjkxd"},"content":" private transient boolean isFindingPreviousAuthorsPerformed \u003d false;"},{"lineNumber":49,"author":{"gitId":"asdfghjkxd"},"content":" private transient boolean isFormatsOverriding \u003d false;"},{"lineNumber":50,"author":{"gitId":"-"},"content":" private transient boolean isIgnoreGlobListOverriding;"},{"lineNumber":51,"author":{"gitId":"asdfghjkxd"},"content":" private transient boolean isIgnoreCommitListOverriding \u003d false;"},{"lineNumber":52,"author":{"gitId":"-"},"content":" private transient boolean isIgnoredAuthorsListOverriding;"},{"lineNumber":53,"author":{"gitId":"asdfghjkxd"},"content":" private transient long fileSizeLimit \u003d DEFAULT_FILE_SIZE_LIMIT;"},{"lineNumber":54,"author":{"gitId":"asdfghjkxd"},"content":" private transient boolean isFileSizeLimitOverriding \u003d false;"},{"lineNumber":55,"author":{"gitId":"asdfghjkxd"},"content":" private transient boolean isIgnoredFileAnalysisSkipped \u003d false;"},{"lineNumber":56,"author":{"gitId":"-"},"content":""},{"lineNumber":57,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":58,"author":{"gitId":"asdfghjkxd"},"content":" * Constructs an empty instance of {@code RepoConfiguration}, which is used by the {@code Builder}"},{"lineNumber":59,"author":{"gitId":"asdfghjkxd"},"content":" * to construct new {@code RepoConfiguration} instances."},{"lineNumber":60,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":61,"author":{"gitId":"asdfghjkxd"},"content":" private RepoConfiguration() {}"},{"lineNumber":62,"author":{"gitId":"-"},"content":""},{"lineNumber":63,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":64,"author":{"gitId":"asdfghjkxd"},"content":" * Builds the necessary configurations for RepoConfiguration."},{"lineNumber":65,"author":{"gitId":"asdfghjkxd"},"content":" * Obeys the Builder pattern as described in {@link CliArguments}."},{"lineNumber":66,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":67,"author":{"gitId":"asdfghjkxd"},"content":" public static class Builder {"},{"lineNumber":68,"author":{"gitId":"asdfghjkxd"},"content":" private String displayName;"},{"lineNumber":69,"author":{"gitId":"asdfghjkxd"},"content":" private String outputFolderName;"},{"lineNumber":70,"author":{"gitId":"asdfghjkxd"},"content":" private String repoFolderName;"},{"lineNumber":71,"author":{"gitId":"asdfghjkxd"},"content":" private RepoConfiguration repoConfiguration;"},{"lineNumber":72,"author":{"gitId":"-"},"content":""},{"lineNumber":73,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":74,"author":{"gitId":"asdfghjkxd"},"content":" * Returns an empty instance of the RepoConfiguration Builder."},{"lineNumber":75,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":76,"author":{"gitId":"asdfghjkxd"},"content":" public Builder() {"},{"lineNumber":77,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration \u003d new RepoConfiguration();"},{"lineNumber":78,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":79,"author":{"gitId":"-"},"content":""},{"lineNumber":80,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":81,"author":{"gitId":"asdfghjkxd"},"content":" * Processes the author configuration of the repository."},{"lineNumber":82,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":83,"author":{"gitId":"asdfghjkxd"},"content":" private void processAuthor() {"},{"lineNumber":84,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.authorConfig \u003d new AuthorConfiguration("},{"lineNumber":85,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.location,"},{"lineNumber":86,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.branch);"},{"lineNumber":87,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":88,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":89,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":90,"author":{"gitId":"asdfghjkxd"},"content":" * Processes the branch of the repository."},{"lineNumber":91,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":92,"author":{"gitId":"asdfghjkxd"},"content":" private void processBranch() {"},{"lineNumber":93,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.branch \u003d this.repoConfiguration.location.isEmpty()"},{"lineNumber":94,"author":{"gitId":"asdfghjkxd"},"content":" ? DEFAULT_BRANCH"},{"lineNumber":95,"author":{"gitId":"asdfghjkxd"},"content":" : this.repoConfiguration.branch;"},{"lineNumber":96,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":97,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":98,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":99,"author":{"gitId":"asdfghjkxd"},"content":" * Processes the relevant names of the repository configs."},{"lineNumber":100,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":101,"author":{"gitId":"asdfghjkxd"},"content":" private void processNames() {"},{"lineNumber":102,"author":{"gitId":"asdfghjkxd"},"content":" String repoName \u003d this.repoConfiguration.location.getRepoName();"},{"lineNumber":103,"author":{"gitId":"asdfghjkxd"},"content":" String org \u003d this.repoConfiguration.location.getOrganization();"},{"lineNumber":104,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":105,"author":{"gitId":"asdfghjkxd"},"content":" String defaultDisplayName \u003d repoName + \"[\" + this.repoConfiguration.branch + \"]\";"},{"lineNumber":106,"author":{"gitId":"asdfghjkxd"},"content":" String defaultOutputFolderName \u003d repoName + \"_\" + this.repoConfiguration.branch;"},{"lineNumber":107,"author":{"gitId":"asdfghjkxd"},"content":" String defaultRepoFolderName \u003d repoName;"},{"lineNumber":108,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":109,"author":{"gitId":"asdfghjkxd"},"content":" if (!org.isEmpty()) {"},{"lineNumber":110,"author":{"gitId":"asdfghjkxd"},"content":" defaultDisplayName \u003d org + \"/\" + defaultDisplayName;"},{"lineNumber":111,"author":{"gitId":"asdfghjkxd"},"content":" defaultRepoFolderName \u003d org + \"_\" + defaultRepoFolderName;"},{"lineNumber":112,"author":{"gitId":"asdfghjkxd"},"content":" defaultOutputFolderName \u003d org + \"_\" + defaultOutputFolderName;"},{"lineNumber":113,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":114,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":115,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.displayName \u003d Optional.ofNullable(this.displayName)"},{"lineNumber":116,"author":{"gitId":"asdfghjkxd"},"content":" .orElse(defaultDisplayName);"},{"lineNumber":117,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.outputFolderName \u003d Optional.ofNullable(this.outputFolderName)"},{"lineNumber":118,"author":{"gitId":"asdfghjkxd"},"content":" .orElse(defaultOutputFolderName);"},{"lineNumber":119,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.repoFolderName \u003d Optional.ofNullable(this.repoFolderName)"},{"lineNumber":120,"author":{"gitId":"asdfghjkxd"},"content":" .orElse(defaultRepoFolderName);"},{"lineNumber":121,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":122,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":123,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":124,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code location} for {@code RepoConfiguration}."},{"lineNumber":125,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":126,"author":{"gitId":"asdfghjkxd"},"content":" * @param location A repository location."},{"lineNumber":127,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object"},{"lineNumber":128,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":129,"author":{"gitId":"asdfghjkxd"},"content":" public Builder location(RepoLocation location) {"},{"lineNumber":130,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.location \u003d location;"},{"lineNumber":131,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":132,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":133,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":134,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":135,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code branch} for {@code RepoConfiguration}."},{"lineNumber":136,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":137,"author":{"gitId":"asdfghjkxd"},"content":" * @param branch Branch of the repository of interest."},{"lineNumber":138,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":139,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":140,"author":{"gitId":"asdfghjkxd"},"content":" public Builder branch(String branch) {"},{"lineNumber":141,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.branch \u003d branch;"},{"lineNumber":142,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":143,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":144,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":145,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":146,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code displayName} for {@code RepoConfiguration}."},{"lineNumber":147,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":148,"author":{"gitId":"asdfghjkxd"},"content":" * @param displayName Display name of the repository."},{"lineNumber":149,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":150,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":151,"author":{"gitId":"asdfghjkxd"},"content":" public Builder displayName(String displayName) {"},{"lineNumber":152,"author":{"gitId":"asdfghjkxd"},"content":" this.displayName \u003d displayName;"},{"lineNumber":153,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.displayName \u003d displayName;"},{"lineNumber":154,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":155,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":156,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":157,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":158,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code outputFolderName} for {@code RepoConfiguration}."},{"lineNumber":159,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":160,"author":{"gitId":"asdfghjkxd"},"content":" * @param outputFolderName Output folder name of the repository."},{"lineNumber":161,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":162,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":163,"author":{"gitId":"asdfghjkxd"},"content":" public Builder outputFolderName(String outputFolderName) {"},{"lineNumber":164,"author":{"gitId":"asdfghjkxd"},"content":" this.outputFolderName \u003d outputFolderName;"},{"lineNumber":165,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.outputFolderName \u003d outputFolderName;"},{"lineNumber":166,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":167,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":168,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":169,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":170,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code extraOutputFolderName} for {@code RepoConfiguration}."},{"lineNumber":171,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":172,"author":{"gitId":"asdfghjkxd"},"content":" * @param extraOutputFolderName Extra output folder name of the repository."},{"lineNumber":173,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":174,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":175,"author":{"gitId":"asdfghjkxd"},"content":" public Builder extraOutputFolderName(String extraOutputFolderName) {"},{"lineNumber":176,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.extraOutputFolderName \u003d extraOutputFolderName;"},{"lineNumber":177,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":178,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":179,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":180,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":181,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code zoneId} for {@code RepoConfiguration}."},{"lineNumber":182,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":183,"author":{"gitId":"asdfghjkxd"},"content":" * @param zoneId Time-zone of the repository."},{"lineNumber":184,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":185,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":186,"author":{"gitId":"asdfghjkxd"},"content":" public Builder zoneId(ZoneId zoneId) {"},{"lineNumber":187,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.zoneId \u003d zoneId;"},{"lineNumber":188,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":189,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":190,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":191,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":192,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code sinceDate} for {@code RepoConfiguration}."},{"lineNumber":193,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":194,"author":{"gitId":"asdfghjkxd"},"content":" * @param sinceDate Starting date of analysis."},{"lineNumber":195,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":196,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":197,"author":{"gitId":"asdfghjkxd"},"content":" public Builder sinceDate(LocalDateTime sinceDate) {"},{"lineNumber":198,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.sinceDate \u003d sinceDate;"},{"lineNumber":199,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":200,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":201,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":202,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":203,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code untilDate} for {@code RepoConfiguration}."},{"lineNumber":204,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":205,"author":{"gitId":"asdfghjkxd"},"content":" * @param untilDate Ending date of analysis."},{"lineNumber":206,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":207,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":208,"author":{"gitId":"asdfghjkxd"},"content":" public Builder untilDate(LocalDateTime untilDate) {"},{"lineNumber":209,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.untilDate \u003d untilDate;"},{"lineNumber":210,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":211,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":212,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":213,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":214,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code repoFolderName} for {@code RepoConfiguration}."},{"lineNumber":215,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":216,"author":{"gitId":"asdfghjkxd"},"content":" * @param repoFolderName Folder name of the repository."},{"lineNumber":217,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":218,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":219,"author":{"gitId":"asdfghjkxd"},"content":" public Builder repoFolderName(String repoFolderName) {"},{"lineNumber":220,"author":{"gitId":"asdfghjkxd"},"content":" this.repoFolderName \u003d repoFolderName;"},{"lineNumber":221,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.repoFolderName \u003d repoFolderName;"},{"lineNumber":222,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":223,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":224,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":225,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":226,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code fileTypeManager} for {@code RepoConfiguration}."},{"lineNumber":227,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":228,"author":{"gitId":"asdfghjkxd"},"content":" * @param fileTypes List of file types and groupings permitted."},{"lineNumber":229,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":230,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":231,"author":{"gitId":"asdfghjkxd"},"content":" public Builder fileTypeManager(List\u003cFileType\u003e fileTypes) {"},{"lineNumber":232,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.fileTypeManager \u003d new FileTypeManager(fileTypes);"},{"lineNumber":233,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":234,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":235,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":236,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":237,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code ignoreGlobList} for {@code RepoConfiguration}."},{"lineNumber":238,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":239,"author":{"gitId":"asdfghjkxd"},"content":" * @param ignoredGlobList List of glob patterns to ignore."},{"lineNumber":240,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":241,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":242,"author":{"gitId":"asdfghjkxd"},"content":" public Builder ignoreGlobList(List\u003cString\u003e ignoredGlobList) {"},{"lineNumber":243,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.ignoreGlobList \u003d ignoredGlobList;"},{"lineNumber":244,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":245,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":246,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":247,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":248,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code ignoredAuthorsList} for {@code RepoConfiguration}."},{"lineNumber":249,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":250,"author":{"gitId":"asdfghjkxd"},"content":" * @param ignoredAuthorsList List of authors to ignore."},{"lineNumber":251,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":252,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":253,"author":{"gitId":"asdfghjkxd"},"content":" public Builder ignoredAuthorsList(List\u003cString\u003e ignoredAuthorsList) {"},{"lineNumber":254,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.ignoredAuthorsList \u003d ignoredAuthorsList;"},{"lineNumber":255,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":256,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":257,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":258,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":259,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code authorConfig} for {@code RepoConfiguration}."},{"lineNumber":260,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":261,"author":{"gitId":"asdfghjkxd"},"content":" * @param authorConfig Author configuration information of the repository."},{"lineNumber":262,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":263,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":264,"author":{"gitId":"asdfghjkxd"},"content":" public Builder authorConfig(AuthorConfiguration authorConfig) {"},{"lineNumber":265,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.authorConfig \u003d authorConfig;"},{"lineNumber":266,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":267,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":268,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":269,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":270,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code isStandaloneConfigIgnored} for {@code RepoConfiguration}."},{"lineNumber":271,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":272,"author":{"gitId":"asdfghjkxd"},"content":" * @param isStandaloneConfigIgnored Checks if standalone config is ignored."},{"lineNumber":273,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":274,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":275,"author":{"gitId":"asdfghjkxd"},"content":" public Builder isStandaloneConfigIgnored(boolean isStandaloneConfigIgnored) {"},{"lineNumber":276,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.isStandaloneConfigIgnored \u003d isStandaloneConfigIgnored;"},{"lineNumber":277,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":278,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":279,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":280,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":281,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code isFileSizeLimitIgnored} for {@code RepoConfiguration}."},{"lineNumber":282,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":283,"author":{"gitId":"asdfghjkxd"},"content":" * @param isFileSizeLimitIgnored Checks if file size limit is ignored."},{"lineNumber":284,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":285,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":286,"author":{"gitId":"asdfghjkxd"},"content":" public Builder isFileSizeLimitIgnored(boolean isFileSizeLimitIgnored) {"},{"lineNumber":287,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.isFileSizeLimitIgnored \u003d isFileSizeLimitIgnored;"},{"lineNumber":288,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":289,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":290,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":291,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":292,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code ignoreCommitList} for {@code RepoConfiguration}."},{"lineNumber":293,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":294,"author":{"gitId":"asdfghjkxd"},"content":" * @param ignoreCommitList List of commits to ignore."},{"lineNumber":295,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":296,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":297,"author":{"gitId":"asdfghjkxd"},"content":" public Builder ignoreCommitList(List\u003cCommitHash\u003e ignoreCommitList) {"},{"lineNumber":298,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.ignoreCommitList \u003d ignoreCommitList;"},{"lineNumber":299,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":300,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":301,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":302,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":303,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code isLastModifiedDateIncluded} for {@code RepoConfiguration}."},{"lineNumber":304,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":305,"author":{"gitId":"asdfghjkxd"},"content":" * @param isLastModifiedDateIncluded Checks if last modified date is included."},{"lineNumber":306,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":307,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":308,"author":{"gitId":"asdfghjkxd"},"content":" public Builder isLastModifiedDateIncluded(boolean isLastModifiedDateIncluded) {"},{"lineNumber":309,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.isLastModifiedDateIncluded \u003d isLastModifiedDateIncluded;"},{"lineNumber":310,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":311,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":312,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":313,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":314,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code isShallowCloningPerformed} for {@code RepoConfiguration}."},{"lineNumber":315,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":316,"author":{"gitId":"asdfghjkxd"},"content":" * @param isShallowCloningPerformed Checks if shallow cloning is performed."},{"lineNumber":317,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":318,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":319,"author":{"gitId":"asdfghjkxd"},"content":" public Builder isShallowCloningPerformed(boolean isShallowCloningPerformed) {"},{"lineNumber":320,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.isShallowCloningPerformed \u003d isShallowCloningPerformed;"},{"lineNumber":321,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":322,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":323,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":324,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":325,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code isFindingPreviousAuthorsPerformed} for {@code RepoConfiguration}."},{"lineNumber":326,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":327,"author":{"gitId":"asdfghjkxd"},"content":" * @param isFindingPreviousAuthorsPerformed Checks if finding previous authors is performed."},{"lineNumber":328,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":329,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":330,"author":{"gitId":"asdfghjkxd"},"content":" public Builder isFindingPreviousAuthorsPerformed(boolean isFindingPreviousAuthorsPerformed) {"},{"lineNumber":331,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.isFindingPreviousAuthorsPerformed \u003d isFindingPreviousAuthorsPerformed;"},{"lineNumber":332,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":333,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":334,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":335,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":336,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code isFormatsOverriding} for {@code RepoConfiguration}."},{"lineNumber":337,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":338,"author":{"gitId":"asdfghjkxd"},"content":" * @param isFormatsOverriding Checks if file formats are overridden."},{"lineNumber":339,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":340,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":341,"author":{"gitId":"asdfghjkxd"},"content":" public Builder isFormatsOverriding(boolean isFormatsOverriding) {"},{"lineNumber":342,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.isFormatsOverriding \u003d isFormatsOverriding;"},{"lineNumber":343,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":344,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":345,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":346,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":347,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code isIgnoreGlobListOverriding} for {@code RepoConfiguration}."},{"lineNumber":348,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":349,"author":{"gitId":"asdfghjkxd"},"content":" * @param isIgnoreGlobListOverriding Checks if the list of ignored glob is overridden."},{"lineNumber":350,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":351,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":352,"author":{"gitId":"asdfghjkxd"},"content":" public Builder isIgnoreGlobListOverriding(boolean isIgnoreGlobListOverriding) {"},{"lineNumber":353,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.isIgnoreGlobListOverriding \u003d isIgnoreGlobListOverriding;"},{"lineNumber":354,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":355,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":356,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":357,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":358,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code isIgnoreCommitListOverriding} for {@code RepoConfiguration}."},{"lineNumber":359,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":360,"author":{"gitId":"asdfghjkxd"},"content":" * @param isIgnoreCommitListOverriding Checks if the list of ignored commits is overridden."},{"lineNumber":361,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":362,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":363,"author":{"gitId":"asdfghjkxd"},"content":" public Builder isIgnoreCommitListOverriding(boolean isIgnoreCommitListOverriding) {"},{"lineNumber":364,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.isIgnoreCommitListOverriding \u003d isIgnoreCommitListOverriding;"},{"lineNumber":365,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":366,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":367,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":368,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":369,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code isFileSizeLimitOverriding} for {@code RepoConfiguration}."},{"lineNumber":370,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":371,"author":{"gitId":"asdfghjkxd"},"content":" * @param isIgnoredAuthorsListOverriding Checks if the list of ignored authors is overridden."},{"lineNumber":372,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":373,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":374,"author":{"gitId":"asdfghjkxd"},"content":" public Builder isIgnoredAuthorsListOverriding(boolean isIgnoredAuthorsListOverriding) {"},{"lineNumber":375,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.isIgnoredAuthorsListOverriding \u003d isIgnoredAuthorsListOverriding;"},{"lineNumber":376,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":377,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":378,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":379,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":380,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code fileSizeLimit} for {@code RepoConfiguration}."},{"lineNumber":381,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":382,"author":{"gitId":"asdfghjkxd"},"content":" * @param fileSizeLimit File size limit of the repository."},{"lineNumber":383,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":384,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":385,"author":{"gitId":"asdfghjkxd"},"content":" public Builder fileSizeLimit(long fileSizeLimit) {"},{"lineNumber":386,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.fileSizeLimit \u003d fileSizeLimit;"},{"lineNumber":387,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":388,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":389,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":390,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":391,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code isFileSizeLimitOverriding} for {@code RepoConfiguration}."},{"lineNumber":392,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":393,"author":{"gitId":"asdfghjkxd"},"content":" * @param isFileSizeLimitOverriding Checks if the file size limit is overridden."},{"lineNumber":394,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":395,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":396,"author":{"gitId":"asdfghjkxd"},"content":" public Builder isFileSizeLimitOverriding(boolean isFileSizeLimitOverriding) {"},{"lineNumber":397,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.isFileSizeLimitOverriding \u003d isFileSizeLimitOverriding;"},{"lineNumber":398,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":399,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":400,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":401,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":402,"author":{"gitId":"asdfghjkxd"},"content":" * Updates the {@code isIgnoredFileAnalysisSkipped} for {@code RepoConfiguration}."},{"lineNumber":403,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":404,"author":{"gitId":"asdfghjkxd"},"content":" * @param isIgnoredFileAnalysisSkipped Checks if the analysis of ignored files is skipped."},{"lineNumber":405,"author":{"gitId":"asdfghjkxd"},"content":" * @return This builder object."},{"lineNumber":406,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":407,"author":{"gitId":"asdfghjkxd"},"content":" public Builder isIgnoredFileAnalysisSkipped(boolean isIgnoredFileAnalysisSkipped) {"},{"lineNumber":408,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration.isIgnoredFileAnalysisSkipped \u003d isIgnoredFileAnalysisSkipped;"},{"lineNumber":409,"author":{"gitId":"asdfghjkxd"},"content":" return this;"},{"lineNumber":410,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":411,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":412,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":413,"author":{"gitId":"asdfghjkxd"},"content":" * Builds the {@code RepoConfiguration} object with the necessary configurations."},{"lineNumber":414,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":415,"author":{"gitId":"asdfghjkxd"},"content":" * @return {@code RepoConfiguration}."},{"lineNumber":416,"author":{"gitId":"asdfghjkxd"},"content":" * @throws ConfigurationBuildException if there was an issue building the {@code RepoConfiguration}"},{"lineNumber":417,"author":{"gitId":"asdfghjkxd"},"content":" * object."},{"lineNumber":418,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":419,"author":{"gitId":"asdfghjkxd"},"content":" public RepoConfiguration build() {"},{"lineNumber":420,"author":{"gitId":"asdfghjkxd"},"content":" if (!validate()) {"},{"lineNumber":421,"author":{"gitId":"asdfghjkxd"},"content":" throw new ConfigurationBuildException();"},{"lineNumber":422,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":423,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":424,"author":{"gitId":"asdfghjkxd"},"content":" this.processAuthor();"},{"lineNumber":425,"author":{"gitId":"asdfghjkxd"},"content":" this.processBranch();"},{"lineNumber":426,"author":{"gitId":"asdfghjkxd"},"content":" this.processNames();"},{"lineNumber":427,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":428,"author":{"gitId":"asdfghjkxd"},"content":" // save a reference to the current built object"},{"lineNumber":429,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration toReturn \u003d this.repoConfiguration;"},{"lineNumber":430,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":431,"author":{"gitId":"asdfghjkxd"},"content":" // reset the internal reference to avoid aliasing"},{"lineNumber":432,"author":{"gitId":"asdfghjkxd"},"content":" this.repoConfiguration \u003d new RepoConfiguration();"},{"lineNumber":433,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":434,"author":{"gitId":"asdfghjkxd"},"content":" // return the reference to the built RepoConfiguration object"},{"lineNumber":435,"author":{"gitId":"asdfghjkxd"},"content":" return toReturn;"},{"lineNumber":436,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":437,"author":{"gitId":"-"},"content":""},{"lineNumber":438,"author":{"gitId":"asdfghjkxd"},"content":" /**"},{"lineNumber":439,"author":{"gitId":"asdfghjkxd"},"content":" * Checks if the current {@code RepoConfiguration} object contains all the necessary parameters"},{"lineNumber":440,"author":{"gitId":"asdfghjkxd"},"content":" * needed to build successfully."},{"lineNumber":441,"author":{"gitId":"asdfghjkxd"},"content":" *"},{"lineNumber":442,"author":{"gitId":"asdfghjkxd"},"content":" * @return true if the {@code RepoConfiguration} object contains all the necessary parameters else false"},{"lineNumber":443,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":444,"author":{"gitId":"asdfghjkxd"},"content":" private boolean validate() {"},{"lineNumber":445,"author":{"gitId":"asdfghjkxd"},"content":" return Optional.ofNullable(this.repoConfiguration.location).isPresent();"},{"lineNumber":446,"author":{"gitId":"-"},"content":" }"},{"lineNumber":447,"author":{"gitId":"-"},"content":" }"},{"lineNumber":448,"author":{"gitId":"-"},"content":""},{"lineNumber":449,"author":{"gitId":"-"},"content":" public static void setDatesToRepoConfigs(List\u003cRepoConfiguration\u003e configs,"},{"lineNumber":450,"author":{"gitId":"-"},"content":" LocalDateTime sinceDate, LocalDateTime untilDate) {"},{"lineNumber":451,"author":{"gitId":"-"},"content":" for (RepoConfiguration config : configs) {"},{"lineNumber":452,"author":{"gitId":"-"},"content":" config.setSinceDate(sinceDate);"},{"lineNumber":453,"author":{"gitId":"-"},"content":" config.setUntilDate(untilDate);"},{"lineNumber":454,"author":{"gitId":"-"},"content":" }"},{"lineNumber":455,"author":{"gitId":"-"},"content":" }"},{"lineNumber":456,"author":{"gitId":"-"},"content":""},{"lineNumber":457,"author":{"gitId":"-"},"content":" public static void setZoneIdToRepoConfigs(List\u003cRepoConfiguration\u003e configs, ZoneId zoneId) {"},{"lineNumber":458,"author":{"gitId":"-"},"content":" for (RepoConfiguration config : configs) {"},{"lineNumber":459,"author":{"gitId":"-"},"content":" config.setZoneId(zoneId);"},{"lineNumber":460,"author":{"gitId":"-"},"content":" }"},{"lineNumber":461,"author":{"gitId":"-"},"content":" }"},{"lineNumber":462,"author":{"gitId":"-"},"content":""},{"lineNumber":463,"author":{"gitId":"-"},"content":" public static void setIsLastModifiedDateIncludedToRepoConfigs(List\u003cRepoConfiguration\u003e configs,"},{"lineNumber":464,"author":{"gitId":"-"},"content":" boolean isLastModifiedDateIncluded) {"},{"lineNumber":465,"author":{"gitId":"-"},"content":" for (RepoConfiguration config : configs) {"},{"lineNumber":466,"author":{"gitId":"-"},"content":" config.setIsLastModifiedDateIncluded(isLastModifiedDateIncluded);"},{"lineNumber":467,"author":{"gitId":"-"},"content":" }"},{"lineNumber":468,"author":{"gitId":"-"},"content":" }"},{"lineNumber":469,"author":{"gitId":"-"},"content":""},{"lineNumber":470,"author":{"gitId":"-"},"content":" public static void setIsShallowCloningPerformedToRepoConfigs(List\u003cRepoConfiguration\u003e configs,"},{"lineNumber":471,"author":{"gitId":"-"},"content":" boolean isShallowCloningPerformed) {"},{"lineNumber":472,"author":{"gitId":"-"},"content":" if (isShallowCloningPerformed) {"},{"lineNumber":473,"author":{"gitId":"-"},"content":" configs.stream().forEach(config -\u003e config.setIsShallowCloningPerformed(true));"},{"lineNumber":474,"author":{"gitId":"-"},"content":" }"},{"lineNumber":475,"author":{"gitId":"-"},"content":" }"},{"lineNumber":476,"author":{"gitId":"-"},"content":""},{"lineNumber":477,"author":{"gitId":"-"},"content":" public static void setIsFindingPreviousAuthorsPerformedToRepoConfigs(List\u003cRepoConfiguration\u003e configs,"},{"lineNumber":478,"author":{"gitId":"-"},"content":" boolean isFindingPreviousAuthorsPerformed) {"},{"lineNumber":479,"author":{"gitId":"-"},"content":" if (isFindingPreviousAuthorsPerformed) {"},{"lineNumber":480,"author":{"gitId":"-"},"content":" configs.stream().forEach(config -\u003e config.setIsFindingPreviousAuthorsPerformed(true));"},{"lineNumber":481,"author":{"gitId":"-"},"content":" }"},{"lineNumber":482,"author":{"gitId":"-"},"content":" }"},{"lineNumber":483,"author":{"gitId":"-"},"content":""},{"lineNumber":484,"author":{"gitId":"-"},"content":" public static void setHasAuthorConfigFileToRepoConfigs(List\u003cRepoConfiguration\u003e configs,"},{"lineNumber":485,"author":{"gitId":"-"},"content":" boolean setHasAuthorConfigFile) {"},{"lineNumber":486,"author":{"gitId":"-"},"content":" configs.stream().forEach(config -\u003e config.setHasAuthorConfigFile(setHasAuthorConfigFile));"},{"lineNumber":487,"author":{"gitId":"-"},"content":" }"},{"lineNumber":488,"author":{"gitId":"-"},"content":""},{"lineNumber":489,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":490,"author":{"gitId":"-"},"content":" * Merges a {@link RepoConfiguration} from {@code repoConfigs} with an {@link AuthorConfiguration} from"},{"lineNumber":491,"author":{"gitId":"-"},"content":" * {@code authorConfigs} if their {@link RepoLocation} and branch matches."},{"lineNumber":492,"author":{"gitId":"-"},"content":" */"},{"lineNumber":493,"author":{"gitId":"-"},"content":" public static void merge(List\u003cRepoConfiguration\u003e repoConfigs, List\u003cAuthorConfiguration\u003e authorConfigs) {"},{"lineNumber":494,"author":{"gitId":"-"},"content":" for (AuthorConfiguration authorConfig : authorConfigs) {"},{"lineNumber":495,"author":{"gitId":"-"},"content":" if (authorConfig.getLocation().isEmpty()) {"},{"lineNumber":496,"author":{"gitId":"-"},"content":" for (RepoConfiguration repoConfig : repoConfigs) {"},{"lineNumber":497,"author":{"gitId":"-"},"content":" repoConfig.addAuthors(authorConfig.getAuthorList());"},{"lineNumber":498,"author":{"gitId":"-"},"content":" }"},{"lineNumber":499,"author":{"gitId":"-"},"content":" continue;"},{"lineNumber":500,"author":{"gitId":"-"},"content":" }"},{"lineNumber":501,"author":{"gitId":"-"},"content":""},{"lineNumber":502,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e locationMatchingRepoConfigs \u003d"},{"lineNumber":503,"author":{"gitId":"-"},"content":" getMatchingRepoConfigsByLocation(repoConfigs, authorConfig.getLocation());"},{"lineNumber":504,"author":{"gitId":"-"},"content":""},{"lineNumber":505,"author":{"gitId":"-"},"content":" if (locationMatchingRepoConfigs.isEmpty()) {"},{"lineNumber":506,"author":{"gitId":"-"},"content":" logger.warning(String.format("},{"lineNumber":507,"author":{"gitId":"-"},"content":" \"Repository %s is not found in repo-config.csv.\","},{"lineNumber":508,"author":{"gitId":"-"},"content":" authorConfig.getLocation()));"},{"lineNumber":509,"author":{"gitId":"-"},"content":" continue;"},{"lineNumber":510,"author":{"gitId":"-"},"content":" }"},{"lineNumber":511,"author":{"gitId":"-"},"content":" if (authorConfig.isDefaultBranch()) {"},{"lineNumber":512,"author":{"gitId":"-"},"content":" locationMatchingRepoConfigs.forEach(matchingRepoConfig -\u003e {"},{"lineNumber":513,"author":{"gitId":"-"},"content":" matchingRepoConfig.addAuthors(authorConfig.getAuthorList());"},{"lineNumber":514,"author":{"gitId":"-"},"content":" });"},{"lineNumber":515,"author":{"gitId":"-"},"content":" continue;"},{"lineNumber":516,"author":{"gitId":"-"},"content":" }"},{"lineNumber":517,"author":{"gitId":"-"},"content":""},{"lineNumber":518,"author":{"gitId":"-"},"content":" RepoConfiguration branchMatchingRepoConfig \u003d getMatchingRepoConfig(repoConfigs, authorConfig);"},{"lineNumber":519,"author":{"gitId":"-"},"content":""},{"lineNumber":520,"author":{"gitId":"-"},"content":" if (branchMatchingRepoConfig \u003d\u003d null) {"},{"lineNumber":521,"author":{"gitId":"-"},"content":" if (!authorConfig.isDefaultBranch()) {"},{"lineNumber":522,"author":{"gitId":"-"},"content":" logger.warning(String.format("},{"lineNumber":523,"author":{"gitId":"-"},"content":" \"Repository %s (branch %s) is not found in repo-config.csv.\","},{"lineNumber":524,"author":{"gitId":"-"},"content":" authorConfig.getLocation(), authorConfig.getBranch()));"},{"lineNumber":525,"author":{"gitId":"-"},"content":" }"},{"lineNumber":526,"author":{"gitId":"-"},"content":" continue;"},{"lineNumber":527,"author":{"gitId":"-"},"content":" }"},{"lineNumber":528,"author":{"gitId":"-"},"content":""},{"lineNumber":529,"author":{"gitId":"-"},"content":" branchMatchingRepoConfig.addAuthors(authorConfig.getAuthorList());"},{"lineNumber":530,"author":{"gitId":"-"},"content":" }"},{"lineNumber":531,"author":{"gitId":"-"},"content":" }"},{"lineNumber":532,"author":{"gitId":"-"},"content":""},{"lineNumber":533,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":534,"author":{"gitId":"-"},"content":" * Sets the list of groups in {@code groupConfigs} to the respective {@code repoConfigs}."},{"lineNumber":535,"author":{"gitId":"-"},"content":" */"},{"lineNumber":536,"author":{"gitId":"-"},"content":" public static void setGroupConfigsToRepos(List\u003cRepoConfiguration\u003e repoConfigs,"},{"lineNumber":537,"author":{"gitId":"-"},"content":" List\u003cGroupConfiguration\u003e groupConfigs) {"},{"lineNumber":538,"author":{"gitId":"-"},"content":" for (GroupConfiguration groupConfig : groupConfigs) {"},{"lineNumber":539,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e matchingRepoConfigs;"},{"lineNumber":540,"author":{"gitId":"-"},"content":" if (groupConfig.getLocation().isEmpty()) {"},{"lineNumber":541,"author":{"gitId":"-"},"content":" matchingRepoConfigs \u003d repoConfigs;"},{"lineNumber":542,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":543,"author":{"gitId":"-"},"content":" matchingRepoConfigs \u003d getMatchingRepoConfigsByLocation(repoConfigs,"},{"lineNumber":544,"author":{"gitId":"-"},"content":" groupConfig.getLocation());"},{"lineNumber":545,"author":{"gitId":"-"},"content":" }"},{"lineNumber":546,"author":{"gitId":"-"},"content":" if (matchingRepoConfigs.isEmpty()) {"},{"lineNumber":547,"author":{"gitId":"-"},"content":" logger.warning(String.format("},{"lineNumber":548,"author":{"gitId":"-"},"content":" \"Repository %s is not found in repo-config.csv.\", groupConfig.getLocation()));"},{"lineNumber":549,"author":{"gitId":"-"},"content":" continue;"},{"lineNumber":550,"author":{"gitId":"-"},"content":" }"},{"lineNumber":551,"author":{"gitId":"-"},"content":" matchingRepoConfigs.forEach(matchingRepoConfig -\u003e {"},{"lineNumber":552,"author":{"gitId":"-"},"content":" matchingRepoConfig.addGroups(groupConfig.getGroupsList());"},{"lineNumber":553,"author":{"gitId":"-"},"content":" });"},{"lineNumber":554,"author":{"gitId":"-"},"content":" }"},{"lineNumber":555,"author":{"gitId":"-"},"content":" }"},{"lineNumber":556,"author":{"gitId":"-"},"content":""},{"lineNumber":557,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":558,"author":{"gitId":"-"},"content":" * Iterates through {@code repoConfigs} to find a {@link RepoConfiguration} with {@link RepoLocation} and branch"},{"lineNumber":559,"author":{"gitId":"-"},"content":" * that matches {@code authorConfig}. Returns {@code null} if no match is found."},{"lineNumber":560,"author":{"gitId":"-"},"content":" */"},{"lineNumber":561,"author":{"gitId":"-"},"content":" private static RepoConfiguration getMatchingRepoConfig(List\u003cRepoConfiguration\u003e repoConfigs,"},{"lineNumber":562,"author":{"gitId":"-"},"content":" AuthorConfiguration authorConfig) {"},{"lineNumber":563,"author":{"gitId":"-"},"content":" if (authorConfig.isDefaultBranch()) {"},{"lineNumber":564,"author":{"gitId":"-"},"content":" return null;"},{"lineNumber":565,"author":{"gitId":"-"},"content":" }"},{"lineNumber":566,"author":{"gitId":"-"},"content":" for (RepoConfiguration repoConfig : repoConfigs) {"},{"lineNumber":567,"author":{"gitId":"-"},"content":" if (repoConfig.getLocation().equals(authorConfig.getLocation())"},{"lineNumber":568,"author":{"gitId":"-"},"content":" \u0026\u0026 repoConfig.getBranch().equals(authorConfig.getBranch())) {"},{"lineNumber":569,"author":{"gitId":"-"},"content":" return repoConfig;"},{"lineNumber":570,"author":{"gitId":"-"},"content":" }"},{"lineNumber":571,"author":{"gitId":"-"},"content":" }"},{"lineNumber":572,"author":{"gitId":"-"},"content":" return null;"},{"lineNumber":573,"author":{"gitId":"-"},"content":" }"},{"lineNumber":574,"author":{"gitId":"-"},"content":""},{"lineNumber":575,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":576,"author":{"gitId":"-"},"content":" * Returns a list of {@link RepoConfiguration} where the {@link RepoLocation} of a {@link RepoConfiguration}"},{"lineNumber":577,"author":{"gitId":"-"},"content":" * in the list of {@code configs} matches {@code targetRepoLocation}."},{"lineNumber":578,"author":{"gitId":"-"},"content":" */"},{"lineNumber":579,"author":{"gitId":"-"},"content":" private static List\u003cRepoConfiguration\u003e getMatchingRepoConfigsByLocation(List\u003cRepoConfiguration\u003e configs,"},{"lineNumber":580,"author":{"gitId":"-"},"content":" RepoLocation targetRepoLocation) {"},{"lineNumber":581,"author":{"gitId":"-"},"content":" return configs.stream().filter(config -\u003e config.getLocation().equals(targetRepoLocation))"},{"lineNumber":582,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());"},{"lineNumber":583,"author":{"gitId":"-"},"content":" }"},{"lineNumber":584,"author":{"gitId":"-"},"content":""},{"lineNumber":585,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":586,"author":{"gitId":"-"},"content":" * Sets {@code formats} to {@link RepoConfiguration} in {@code configs} if its format list is empty."},{"lineNumber":587,"author":{"gitId":"-"},"content":" */"},{"lineNumber":588,"author":{"gitId":"-"},"content":" public static void setFormatsToRepoConfigs(List\u003cRepoConfiguration\u003e configs, List\u003cFileType\u003e formats) {"},{"lineNumber":589,"author":{"gitId":"-"},"content":" for (RepoConfiguration config : configs) {"},{"lineNumber":590,"author":{"gitId":"-"},"content":" if (!config.fileTypeManager.hasSpecifiedFormats()) {"},{"lineNumber":591,"author":{"gitId":"-"},"content":" config.fileTypeManager.setFormats(formats);"},{"lineNumber":592,"author":{"gitId":"-"},"content":" }"},{"lineNumber":593,"author":{"gitId":"-"},"content":" }"},{"lineNumber":594,"author":{"gitId":"-"},"content":" }"},{"lineNumber":595,"author":{"gitId":"-"},"content":""},{"lineNumber":596,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":597,"author":{"gitId":"-"},"content":" * Sets each {@link RepoConfiguration} in {@code configs} to ignore its standalone config, if"},{"lineNumber":598,"author":{"gitId":"-"},"content":" * {@code ignoreAllStandaloneConfigs} is true."},{"lineNumber":599,"author":{"gitId":"-"},"content":" */"},{"lineNumber":600,"author":{"gitId":"-"},"content":" public static void setStandaloneConfigIgnoredToRepoConfigs(List\u003cRepoConfiguration\u003e configs,"},{"lineNumber":601,"author":{"gitId":"-"},"content":" boolean ignoreAllStandaloneConfigs) {"},{"lineNumber":602,"author":{"gitId":"-"},"content":" if (ignoreAllStandaloneConfigs) {"},{"lineNumber":603,"author":{"gitId":"-"},"content":" configs.forEach(config -\u003e config.setStandaloneConfigIgnored(true));"},{"lineNumber":604,"author":{"gitId":"-"},"content":" }"},{"lineNumber":605,"author":{"gitId":"-"},"content":" }"},{"lineNumber":606,"author":{"gitId":"-"},"content":""},{"lineNumber":607,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":608,"author":{"gitId":"-"},"content":" * Sets each {@link RepoConfiguration} in {@code configs} to ignore its filesize limit, if"},{"lineNumber":609,"author":{"gitId":"-"},"content":" * {@code ignoreFilesizeLimit} is true."},{"lineNumber":610,"author":{"gitId":"-"},"content":" */"},{"lineNumber":611,"author":{"gitId":"-"},"content":" public static void setFileSizeLimitIgnoredToRepoConfigs(List\u003cRepoConfiguration\u003e configs,"},{"lineNumber":612,"author":{"gitId":"-"},"content":" boolean ignoreFileSizeLimit) {"},{"lineNumber":613,"author":{"gitId":"-"},"content":" if (ignoreFileSizeLimit) {"},{"lineNumber":614,"author":{"gitId":"-"},"content":" configs.forEach(config -\u003e config.setFileSizeLimitIgnored(true));"},{"lineNumber":615,"author":{"gitId":"-"},"content":" }"},{"lineNumber":616,"author":{"gitId":"-"},"content":" }"},{"lineNumber":617,"author":{"gitId":"-"},"content":""},{"lineNumber":618,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":619,"author":{"gitId":"-"},"content":" * Checks if any of the {@code configs} is finding previous authors for commit analysis."},{"lineNumber":620,"author":{"gitId":"-"},"content":" */"},{"lineNumber":621,"author":{"gitId":"-"},"content":" public static boolean isAnyRepoFindingPreviousAuthors(List\u003cRepoConfiguration\u003e configs) {"},{"lineNumber":622,"author":{"gitId":"-"},"content":" return configs.stream().anyMatch(RepoConfiguration::isFindingPreviousAuthorsPerformed);"},{"lineNumber":623,"author":{"gitId":"-"},"content":" }"},{"lineNumber":624,"author":{"gitId":"-"},"content":""},{"lineNumber":625,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":626,"author":{"gitId":"-"},"content":" * Clears existing information related to this repository and its authors, and replaces it with information from"},{"lineNumber":627,"author":{"gitId":"-"},"content":" * {@code standaloneConfig}."},{"lineNumber":628,"author":{"gitId":"-"},"content":" */"},{"lineNumber":629,"author":{"gitId":"-"},"content":" public void update(StandaloneConfig standaloneConfig) {"},{"lineNumber":630,"author":{"gitId":"-"},"content":" // only assign the new values when all the fields in {@code standaloneConfig} pass the validations."},{"lineNumber":631,"author":{"gitId":"-"},"content":" List\u003cFileType\u003e replacementFileTypes \u003d FileType.convertFormatStringsToFileTypes(standaloneConfig.getFormats());"},{"lineNumber":632,"author":{"gitId":"-"},"content":" CommitHash.validateCommits(standaloneConfig.getIgnoreCommitList());"},{"lineNumber":633,"author":{"gitId":"-"},"content":""},{"lineNumber":634,"author":{"gitId":"-"},"content":" if (!isIgnoreGlobListOverriding) {"},{"lineNumber":635,"author":{"gitId":"-"},"content":" ignoreGlobList \u003d standaloneConfig.getIgnoreGlobList();"},{"lineNumber":636,"author":{"gitId":"-"},"content":" }"},{"lineNumber":637,"author":{"gitId":"-"},"content":" if (!isFormatsOverriding) {"},{"lineNumber":638,"author":{"gitId":"-"},"content":" fileTypeManager.setFormats(replacementFileTypes);"},{"lineNumber":639,"author":{"gitId":"-"},"content":" }"},{"lineNumber":640,"author":{"gitId":"-"},"content":" if (!isIgnoreCommitListOverriding) {"},{"lineNumber":641,"author":{"gitId":"-"},"content":" ignoreCommitList \u003d CommitHash.convertStringsToCommits(standaloneConfig.getIgnoreCommitList());"},{"lineNumber":642,"author":{"gitId":"-"},"content":" }"},{"lineNumber":643,"author":{"gitId":"-"},"content":" if (!isIgnoredAuthorsListOverriding) {"},{"lineNumber":644,"author":{"gitId":"-"},"content":" ignoredAuthorsList \u003d standaloneConfig.getIgnoreAuthorList();"},{"lineNumber":645,"author":{"gitId":"-"},"content":" }"},{"lineNumber":646,"author":{"gitId":"-"},"content":" if (!isFileSizeLimitOverriding) {"},{"lineNumber":647,"author":{"gitId":"-"},"content":" fileSizeLimit \u003d standaloneConfig.getFileSizeLimit();"},{"lineNumber":648,"author":{"gitId":"-"},"content":" }"},{"lineNumber":649,"author":{"gitId":"-"},"content":" authorConfig.update(standaloneConfig, ignoreGlobList);"},{"lineNumber":650,"author":{"gitId":"-"},"content":" }"},{"lineNumber":651,"author":{"gitId":"-"},"content":""},{"lineNumber":652,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":653,"author":{"gitId":"-"},"content":" * Returns the matching {@link Author} given a {@code name} and an {@code email}."},{"lineNumber":654,"author":{"gitId":"-"},"content":" * If no matching {@link Author} is found, {@link Author#UNKNOWN_AUTHOR} is returned."},{"lineNumber":655,"author":{"gitId":"-"},"content":" */"},{"lineNumber":656,"author":{"gitId":"-"},"content":" public Author getAuthor(String name, String email) {"},{"lineNumber":657,"author":{"gitId":"-"},"content":" return authorConfig.getAuthor(name, email);"},{"lineNumber":658,"author":{"gitId":"-"},"content":" }"},{"lineNumber":659,"author":{"gitId":"-"},"content":""},{"lineNumber":660,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":661,"author":{"gitId":"-"},"content":" * Updates branch with {@code currentBranch} if default branch is specified."},{"lineNumber":662,"author":{"gitId":"-"},"content":" */"},{"lineNumber":663,"author":{"gitId":"-"},"content":" public void updateBranch(String currentBranch) {"},{"lineNumber":664,"author":{"gitId":"-"},"content":" if (branch.equals(DEFAULT_BRANCH)) {"},{"lineNumber":665,"author":{"gitId":"-"},"content":" setBranch(currentBranch);"},{"lineNumber":666,"author":{"gitId":"-"},"content":" }"},{"lineNumber":667,"author":{"gitId":"-"},"content":" }"},{"lineNumber":668,"author":{"gitId":"-"},"content":""},{"lineNumber":669,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":670,"author":{"gitId":"-"},"content":" * Gets the current branch and updates branch with current branch if default branch is specified."},{"lineNumber":671,"author":{"gitId":"-"},"content":" *"},{"lineNumber":672,"author":{"gitId":"-"},"content":" * @throws GitBranchException if current branch cannot be retrieved."},{"lineNumber":673,"author":{"gitId":"-"},"content":" */"},{"lineNumber":674,"author":{"gitId":"-"},"content":" public void updateBranch() throws GitBranchException {"},{"lineNumber":675,"author":{"gitId":"-"},"content":" if (branch.equals(DEFAULT_BRANCH)) {"},{"lineNumber":676,"author":{"gitId":"-"},"content":" String currentBranch \u003d GitBranch.getCurrentBranch(getRepoRoot());"},{"lineNumber":677,"author":{"gitId":"-"},"content":" setBranch(currentBranch);"},{"lineNumber":678,"author":{"gitId":"-"},"content":" }"},{"lineNumber":679,"author":{"gitId":"-"},"content":" }"},{"lineNumber":680,"author":{"gitId":"-"},"content":""},{"lineNumber":681,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":682,"author":{"gitId":"-"},"content":" * Gets the path to the root folder of the repository."},{"lineNumber":683,"author":{"gitId":"-"},"content":" */"},{"lineNumber":684,"author":{"gitId":"-"},"content":" public String getRepoRoot() {"},{"lineNumber":685,"author":{"gitId":"-"},"content":" String path \u003d FileUtil.REPOS_ADDRESS + File.separator + getRepoFolderName() + File.separator;"},{"lineNumber":686,"author":{"gitId":"-"},"content":""},{"lineNumber":687,"author":{"gitId":"-"},"content":" if (!getRepoName().isEmpty()) {"},{"lineNumber":688,"author":{"gitId":"-"},"content":" if (!extraOutputFolderName.isEmpty()) {"},{"lineNumber":689,"author":{"gitId":"-"},"content":" path +\u003d extraOutputFolderName + File.separator;"},{"lineNumber":690,"author":{"gitId":"-"},"content":" }"},{"lineNumber":691,"author":{"gitId":"-"},"content":""},{"lineNumber":692,"author":{"gitId":"-"},"content":" path +\u003d getRepoName() + File.separator;"},{"lineNumber":693,"author":{"gitId":"-"},"content":" }"},{"lineNumber":694,"author":{"gitId":"-"},"content":""},{"lineNumber":695,"author":{"gitId":"-"},"content":" return path;"},{"lineNumber":696,"author":{"gitId":"-"},"content":" }"},{"lineNumber":697,"author":{"gitId":"-"},"content":""},{"lineNumber":698,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":699,"author":{"gitId":"-"},"content":" * Gets the name of the folder containing the cloned repository; the parent directory of the repo\u0027s root folder."},{"lineNumber":700,"author":{"gitId":"-"},"content":" */"},{"lineNumber":701,"author":{"gitId":"-"},"content":" public String getRepoFolderName() {"},{"lineNumber":702,"author":{"gitId":"-"},"content":" return repoFolderName;"},{"lineNumber":703,"author":{"gitId":"-"},"content":" }"},{"lineNumber":704,"author":{"gitId":"-"},"content":""},{"lineNumber":705,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":706,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {"},{"lineNumber":707,"author":{"gitId":"-"},"content":""},{"lineNumber":708,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {"},{"lineNumber":709,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":710,"author":{"gitId":"-"},"content":" }"},{"lineNumber":711,"author":{"gitId":"-"},"content":""},{"lineNumber":712,"author":{"gitId":"-"},"content":" if (!(other instanceof RepoConfiguration)) {"},{"lineNumber":713,"author":{"gitId":"-"},"content":" return false;"},{"lineNumber":714,"author":{"gitId":"-"},"content":" }"},{"lineNumber":715,"author":{"gitId":"-"},"content":""},{"lineNumber":716,"author":{"gitId":"-"},"content":" RepoConfiguration otherRepoConfig \u003d (RepoConfiguration) other;"},{"lineNumber":717,"author":{"gitId":"-"},"content":""},{"lineNumber":718,"author":{"gitId":"-"},"content":" return location.equals(otherRepoConfig.location)"},{"lineNumber":719,"author":{"gitId":"-"},"content":" \u0026\u0026 branch.equals(otherRepoConfig.branch)"},{"lineNumber":720,"author":{"gitId":"-"},"content":" \u0026\u0026 authorConfig.equals(otherRepoConfig.authorConfig)"},{"lineNumber":721,"author":{"gitId":"-"},"content":" \u0026\u0026 ignoreGlobList.equals(otherRepoConfig.ignoreGlobList)"},{"lineNumber":722,"author":{"gitId":"-"},"content":" \u0026\u0026 ignoredAuthorsList.equals(otherRepoConfig.ignoredAuthorsList)"},{"lineNumber":723,"author":{"gitId":"-"},"content":" \u0026\u0026 fileSizeLimit \u003d\u003d otherRepoConfig.fileSizeLimit"},{"lineNumber":724,"author":{"gitId":"-"},"content":" \u0026\u0026 isStandaloneConfigIgnored \u003d\u003d otherRepoConfig.isStandaloneConfigIgnored"},{"lineNumber":725,"author":{"gitId":"-"},"content":" \u0026\u0026 fileTypeManager.equals(otherRepoConfig.fileTypeManager)"},{"lineNumber":726,"author":{"gitId":"-"},"content":" \u0026\u0026 isLastModifiedDateIncluded \u003d\u003d otherRepoConfig.isLastModifiedDateIncluded"},{"lineNumber":727,"author":{"gitId":"-"},"content":" \u0026\u0026 isFormatsOverriding \u003d\u003d otherRepoConfig.isFormatsOverriding"},{"lineNumber":728,"author":{"gitId":"-"},"content":" \u0026\u0026 isShallowCloningPerformed \u003d\u003d otherRepoConfig.isShallowCloningPerformed"},{"lineNumber":729,"author":{"gitId":"-"},"content":" \u0026\u0026 isIgnoreGlobListOverriding \u003d\u003d otherRepoConfig.isIgnoreGlobListOverriding"},{"lineNumber":730,"author":{"gitId":"-"},"content":" \u0026\u0026 isIgnoreCommitListOverriding \u003d\u003d otherRepoConfig.isIgnoreCommitListOverriding"},{"lineNumber":731,"author":{"gitId":"-"},"content":" \u0026\u0026 isIgnoredAuthorsListOverriding \u003d\u003d otherRepoConfig.isIgnoredAuthorsListOverriding"},{"lineNumber":732,"author":{"gitId":"-"},"content":" \u0026\u0026 isFileSizeLimitOverriding \u003d\u003d otherRepoConfig.isFileSizeLimitOverriding"},{"lineNumber":733,"author":{"gitId":"-"},"content":" \u0026\u0026 isFileSizeLimitIgnored \u003d\u003d otherRepoConfig.isFileSizeLimitIgnored"},{"lineNumber":734,"author":{"gitId":"-"},"content":" \u0026\u0026 isIgnoredFileAnalysisSkipped \u003d\u003d otherRepoConfig.isIgnoredFileAnalysisSkipped;"},{"lineNumber":735,"author":{"gitId":"-"},"content":" }"},{"lineNumber":736,"author":{"gitId":"-"},"content":""},{"lineNumber":737,"author":{"gitId":"-"},"content":" public Map\u003cAuthor, String\u003e getAuthorDisplayNameMap() {"},{"lineNumber":738,"author":{"gitId":"-"},"content":" return authorConfig.getAuthorDisplayNameMap();"},{"lineNumber":739,"author":{"gitId":"-"},"content":" }"},{"lineNumber":740,"author":{"gitId":"-"},"content":""},{"lineNumber":741,"author":{"gitId":"-"},"content":" public void setAuthorDisplayNameMap(Map\u003cAuthor, String\u003e authorDisplayNameMap) {"},{"lineNumber":742,"author":{"gitId":"-"},"content":" authorConfig.setAuthorDisplayNameMap(authorDisplayNameMap);"},{"lineNumber":743,"author":{"gitId":"-"},"content":" }"},{"lineNumber":744,"author":{"gitId":"-"},"content":""},{"lineNumber":745,"author":{"gitId":"-"},"content":" public String getBranch() {"},{"lineNumber":746,"author":{"gitId":"-"},"content":" return branch;"},{"lineNumber":747,"author":{"gitId":"-"},"content":" }"},{"lineNumber":748,"author":{"gitId":"-"},"content":""},{"lineNumber":749,"author":{"gitId":"-"},"content":" public void setBranch(String branch) {"},{"lineNumber":750,"author":{"gitId":"-"},"content":" updateDisplayName(branch);"},{"lineNumber":751,"author":{"gitId":"-"},"content":" updateOutputFolderName(branch);"},{"lineNumber":752,"author":{"gitId":"-"},"content":" this.branch \u003d branch;"},{"lineNumber":753,"author":{"gitId":"-"},"content":" authorConfig.setBranch(branch);"},{"lineNumber":754,"author":{"gitId":"-"},"content":" }"},{"lineNumber":755,"author":{"gitId":"-"},"content":""},{"lineNumber":756,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":757,"author":{"gitId":"-"},"content":" * Updates the branch in the {@code displayName} to the current {@code branch}."},{"lineNumber":758,"author":{"gitId":"-"},"content":" */"},{"lineNumber":759,"author":{"gitId":"-"},"content":" public void updateDisplayName(String branch) {"},{"lineNumber":760,"author":{"gitId":"-"},"content":" this.displayName \u003d displayName.substring(0, displayName.lastIndexOf(\u0027[\u0027) + 1) + branch + \"]\";"},{"lineNumber":761,"author":{"gitId":"-"},"content":" }"},{"lineNumber":762,"author":{"gitId":"-"},"content":""},{"lineNumber":763,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":764,"author":{"gitId":"-"},"content":" * Updates the branch in the {@code outputFolderName} to the current {@code branch}."},{"lineNumber":765,"author":{"gitId":"-"},"content":" */"},{"lineNumber":766,"author":{"gitId":"-"},"content":" public void updateOutputFolderName(String branch) {"},{"lineNumber":767,"author":{"gitId":"-"},"content":" this.outputFolderName \u003d outputFolderName.substring(0, outputFolderName.lastIndexOf(\u0027_\u0027) + 1) + branch;"},{"lineNumber":768,"author":{"gitId":"-"},"content":" }"},{"lineNumber":769,"author":{"gitId":"-"},"content":""},{"lineNumber":770,"author":{"gitId":"-"},"content":" public List\u003cString\u003e getIgnoreGlobList() {"},{"lineNumber":771,"author":{"gitId":"-"},"content":" return ignoreGlobList;"},{"lineNumber":772,"author":{"gitId":"-"},"content":" }"},{"lineNumber":773,"author":{"gitId":"-"},"content":""},{"lineNumber":774,"author":{"gitId":"-"},"content":" public void setIgnoreGlobList(List\u003cString\u003e ignoreGlobList) {"},{"lineNumber":775,"author":{"gitId":"-"},"content":" this.ignoreGlobList \u003d ignoreGlobList;"},{"lineNumber":776,"author":{"gitId":"-"},"content":" }"},{"lineNumber":777,"author":{"gitId":"-"},"content":""},{"lineNumber":778,"author":{"gitId":"-"},"content":" public List\u003cCommitHash\u003e getIgnoreCommitList() {"},{"lineNumber":779,"author":{"gitId":"-"},"content":" return ignoreCommitList;"},{"lineNumber":780,"author":{"gitId":"-"},"content":" }"},{"lineNumber":781,"author":{"gitId":"-"},"content":""},{"lineNumber":782,"author":{"gitId":"-"},"content":" public long getFileSizeLimit() {"},{"lineNumber":783,"author":{"gitId":"-"},"content":" return fileSizeLimit;"},{"lineNumber":784,"author":{"gitId":"-"},"content":" }"},{"lineNumber":785,"author":{"gitId":"-"},"content":""},{"lineNumber":786,"author":{"gitId":"-"},"content":" public void setIgnoreCommitList(List\u003cCommitHash\u003e ignoreCommitList) {"},{"lineNumber":787,"author":{"gitId":"-"},"content":" this.ignoreCommitList \u003d ignoreCommitList;"},{"lineNumber":788,"author":{"gitId":"-"},"content":" }"},{"lineNumber":789,"author":{"gitId":"-"},"content":""},{"lineNumber":790,"author":{"gitId":"-"},"content":" public List\u003cString\u003e getIgnoredAuthorsList() {"},{"lineNumber":791,"author":{"gitId":"-"},"content":" return this.ignoredAuthorsList;"},{"lineNumber":792,"author":{"gitId":"-"},"content":" }"},{"lineNumber":793,"author":{"gitId":"-"},"content":""},{"lineNumber":794,"author":{"gitId":"-"},"content":" public void setIgnoredAuthorsList(List\u003cString\u003e ignoredAuthorsList) {"},{"lineNumber":795,"author":{"gitId":"-"},"content":" this.ignoredAuthorsList \u003d ignoredAuthorsList;"},{"lineNumber":796,"author":{"gitId":"-"},"content":" }"},{"lineNumber":797,"author":{"gitId":"-"},"content":""},{"lineNumber":798,"author":{"gitId":"-"},"content":" public boolean isIgnoredAuthorsListOverriding() {"},{"lineNumber":799,"author":{"gitId":"-"},"content":" return this.isIgnoredAuthorsListOverriding;"},{"lineNumber":800,"author":{"gitId":"-"},"content":" }"},{"lineNumber":801,"author":{"gitId":"-"},"content":""},{"lineNumber":802,"author":{"gitId":"-"},"content":" public void setIsLastModifiedDateIncluded(boolean lastModifiedDateIncluded) {"},{"lineNumber":803,"author":{"gitId":"-"},"content":" this.isLastModifiedDateIncluded \u003d lastModifiedDateIncluded;"},{"lineNumber":804,"author":{"gitId":"-"},"content":" }"},{"lineNumber":805,"author":{"gitId":"-"},"content":""},{"lineNumber":806,"author":{"gitId":"-"},"content":" public void setIsShallowCloningPerformed(boolean isShallowCloningPerformed) {"},{"lineNumber":807,"author":{"gitId":"-"},"content":" this.isShallowCloningPerformed \u003d isShallowCloningPerformed;"},{"lineNumber":808,"author":{"gitId":"-"},"content":" }"},{"lineNumber":809,"author":{"gitId":"-"},"content":""},{"lineNumber":810,"author":{"gitId":"-"},"content":" public void setIsFindingPreviousAuthorsPerformed(boolean isFindingPreviousAuthorsPerformed) {"},{"lineNumber":811,"author":{"gitId":"-"},"content":" this.isFindingPreviousAuthorsPerformed \u003d isFindingPreviousAuthorsPerformed;"},{"lineNumber":812,"author":{"gitId":"-"},"content":" }"},{"lineNumber":813,"author":{"gitId":"-"},"content":""},{"lineNumber":814,"author":{"gitId":"-"},"content":" public boolean isLastModifiedDateIncluded() {"},{"lineNumber":815,"author":{"gitId":"-"},"content":" return this.isLastModifiedDateIncluded;"},{"lineNumber":816,"author":{"gitId":"-"},"content":" }"},{"lineNumber":817,"author":{"gitId":"-"},"content":""},{"lineNumber":818,"author":{"gitId":"-"},"content":" public boolean isShallowCloningPerformed() {"},{"lineNumber":819,"author":{"gitId":"-"},"content":" return this.isShallowCloningPerformed;"},{"lineNumber":820,"author":{"gitId":"-"},"content":" }"},{"lineNumber":821,"author":{"gitId":"-"},"content":""},{"lineNumber":822,"author":{"gitId":"-"},"content":" public void setIsIgnoredAuthorsListOverriding(boolean isIgnoredAuthorsListOverriding) {"},{"lineNumber":823,"author":{"gitId":"-"},"content":" this.isIgnoredAuthorsListOverriding \u003d isIgnoredAuthorsListOverriding;"},{"lineNumber":824,"author":{"gitId":"-"},"content":" }"},{"lineNumber":825,"author":{"gitId":"-"},"content":""},{"lineNumber":826,"author":{"gitId":"-"},"content":" public void removeIgnoredAuthors() {"},{"lineNumber":827,"author":{"gitId":"-"},"content":" authorConfig.removeIgnoredAuthors(ignoredAuthorsList);"},{"lineNumber":828,"author":{"gitId":"-"},"content":" }"},{"lineNumber":829,"author":{"gitId":"-"},"content":""},{"lineNumber":830,"author":{"gitId":"-"},"content":" public List\u003cAuthor\u003e getAuthorList() {"},{"lineNumber":831,"author":{"gitId":"-"},"content":" return authorConfig.getAuthorList();"},{"lineNumber":832,"author":{"gitId":"-"},"content":" }"},{"lineNumber":833,"author":{"gitId":"-"},"content":""},{"lineNumber":834,"author":{"gitId":"-"},"content":" public void addAuthor(Author author) {"},{"lineNumber":835,"author":{"gitId":"-"},"content":" authorConfig.addAuthor(author, this.getIgnoreGlobList());"},{"lineNumber":836,"author":{"gitId":"-"},"content":" }"},{"lineNumber":837,"author":{"gitId":"-"},"content":""},{"lineNumber":838,"author":{"gitId":"-"},"content":" public void addAuthors(List\u003cAuthor\u003e authorList) {"},{"lineNumber":839,"author":{"gitId":"-"},"content":" authorConfig.addAuthors(authorList, this.getIgnoreGlobList());"},{"lineNumber":840,"author":{"gitId":"-"},"content":" }"},{"lineNumber":841,"author":{"gitId":"-"},"content":""},{"lineNumber":842,"author":{"gitId":"-"},"content":" public void setAuthorConfiguration(AuthorConfiguration authorConfig) {"},{"lineNumber":843,"author":{"gitId":"-"},"content":" this.authorConfig \u003d authorConfig;"},{"lineNumber":844,"author":{"gitId":"-"},"content":" for (Author author : authorConfig.getAuthorList()) {"},{"lineNumber":845,"author":{"gitId":"-"},"content":" AuthorConfiguration.propagateIgnoreGlobList(author, ignoreGlobList);"},{"lineNumber":846,"author":{"gitId":"-"},"content":" }"},{"lineNumber":847,"author":{"gitId":"-"},"content":" }"},{"lineNumber":848,"author":{"gitId":"-"},"content":""},{"lineNumber":849,"author":{"gitId":"-"},"content":" public boolean containsAuthor(Author author) {"},{"lineNumber":850,"author":{"gitId":"-"},"content":" return authorConfig.containsAuthor(author);"},{"lineNumber":851,"author":{"gitId":"-"},"content":" }"},{"lineNumber":852,"author":{"gitId":"-"},"content":""},{"lineNumber":853,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":854,"author":{"gitId":"-"},"content":" * Clears authors information and sets the {@code authorList} to {@link RepoConfiguration}."},{"lineNumber":855,"author":{"gitId":"-"},"content":" */"},{"lineNumber":856,"author":{"gitId":"-"},"content":" public void setAuthorList(List\u003cAuthor\u003e authorList) {"},{"lineNumber":857,"author":{"gitId":"-"},"content":" authorConfig.clear();"},{"lineNumber":858,"author":{"gitId":"-"},"content":" authorConfig.setAuthorList(authorList);"},{"lineNumber":859,"author":{"gitId":"-"},"content":" authorConfig.buildFromAuthorList();"},{"lineNumber":860,"author":{"gitId":"-"},"content":" authorList.forEach(author -\u003e AuthorConfiguration.propagateIgnoreGlobList(author, this.getIgnoreGlobList()));"},{"lineNumber":861,"author":{"gitId":"-"},"content":" }"},{"lineNumber":862,"author":{"gitId":"-"},"content":""},{"lineNumber":863,"author":{"gitId":"-"},"content":" public void setHasAuthorConfigFile(boolean hasAuthorConfigFile) {"},{"lineNumber":864,"author":{"gitId":"-"},"content":" authorConfig.setHasAuthorConfigFile(hasAuthorConfigFile);"},{"lineNumber":865,"author":{"gitId":"-"},"content":" }"},{"lineNumber":866,"author":{"gitId":"-"},"content":""},{"lineNumber":867,"author":{"gitId":"-"},"content":" public Map\u003cString, Author\u003e getAuthorNamesToAuthorMap() {"},{"lineNumber":868,"author":{"gitId":"-"},"content":" return authorConfig.getAuthorNamesToAuthorMap();"},{"lineNumber":869,"author":{"gitId":"-"},"content":" }"},{"lineNumber":870,"author":{"gitId":"-"},"content":""},{"lineNumber":871,"author":{"gitId":"-"},"content":" public void setAuthorNamesToAuthorMap(Map\u003cString, Author\u003e authorNamesToAuthorMap) {"},{"lineNumber":872,"author":{"gitId":"-"},"content":" authorConfig.setAuthorNamesToAuthorMap(authorNamesToAuthorMap);"},{"lineNumber":873,"author":{"gitId":"-"},"content":" }"},{"lineNumber":874,"author":{"gitId":"-"},"content":""},{"lineNumber":875,"author":{"gitId":"-"},"content":" public Map\u003cString, Author\u003e getAuthorEmailsToAuthorMap() {"},{"lineNumber":876,"author":{"gitId":"-"},"content":" return authorConfig.getAuthorEmailsToAuthorMap();"},{"lineNumber":877,"author":{"gitId":"-"},"content":" }"},{"lineNumber":878,"author":{"gitId":"-"},"content":""},{"lineNumber":879,"author":{"gitId":"-"},"content":" public void setAuthorEmailsToAuthorMap(Map\u003cString, Author\u003e authorEmailsToAuthorMap) {"},{"lineNumber":880,"author":{"gitId":"-"},"content":" authorConfig.setAuthorEmailsToAuthorMap(authorEmailsToAuthorMap);"},{"lineNumber":881,"author":{"gitId":"-"},"content":" }"},{"lineNumber":882,"author":{"gitId":"-"},"content":""},{"lineNumber":883,"author":{"gitId":"-"},"content":" public void clearAuthorDetailsToAuthorMap() {"},{"lineNumber":884,"author":{"gitId":"-"},"content":" authorConfig.clearAuthorDetailsToAuthorMap();"},{"lineNumber":885,"author":{"gitId":"-"},"content":" }"},{"lineNumber":886,"author":{"gitId":"-"},"content":""},{"lineNumber":887,"author":{"gitId":"-"},"content":" public void setFormats(List\u003cFileType\u003e formats) {"},{"lineNumber":888,"author":{"gitId":"-"},"content":" fileTypeManager.setFormats(formats);"},{"lineNumber":889,"author":{"gitId":"-"},"content":" }"},{"lineNumber":890,"author":{"gitId":"-"},"content":""},{"lineNumber":891,"author":{"gitId":"-"},"content":" private void setGroups(List\u003cFileType\u003e groups) {"},{"lineNumber":892,"author":{"gitId":"-"},"content":" fileTypeManager.setGroups(groups);"},{"lineNumber":893,"author":{"gitId":"-"},"content":" }"},{"lineNumber":894,"author":{"gitId":"-"},"content":""},{"lineNumber":895,"author":{"gitId":"-"},"content":" public void addGroups(List\u003cFileType\u003e groups) {"},{"lineNumber":896,"author":{"gitId":"-"},"content":" fileTypeManager.addGroups(groups);"},{"lineNumber":897,"author":{"gitId":"-"},"content":" }"},{"lineNumber":898,"author":{"gitId":"-"},"content":""},{"lineNumber":899,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":900,"author":{"gitId":"-"},"content":" * Returns all format or group types (depending on whether the user has specified a custom grouping)."},{"lineNumber":901,"author":{"gitId":"-"},"content":" */"},{"lineNumber":902,"author":{"gitId":"-"},"content":" public List\u003cFileType\u003e getAllFileTypes() {"},{"lineNumber":903,"author":{"gitId":"-"},"content":" return fileTypeManager.getAllFileTypes();"},{"lineNumber":904,"author":{"gitId":"-"},"content":" }"},{"lineNumber":905,"author":{"gitId":"-"},"content":""},{"lineNumber":906,"author":{"gitId":"-"},"content":" public FileType getFileType(String fileName) {"},{"lineNumber":907,"author":{"gitId":"-"},"content":" return fileTypeManager.getFileType(fileName);"},{"lineNumber":908,"author":{"gitId":"-"},"content":" }"},{"lineNumber":909,"author":{"gitId":"-"},"content":""},{"lineNumber":910,"author":{"gitId":"-"},"content":" public FileTypeManager getFileTypeManager() {"},{"lineNumber":911,"author":{"gitId":"-"},"content":" return fileTypeManager;"},{"lineNumber":912,"author":{"gitId":"-"},"content":" }"},{"lineNumber":913,"author":{"gitId":"-"},"content":""},{"lineNumber":914,"author":{"gitId":"-"},"content":" public LocalDateTime getSinceDate() {"},{"lineNumber":915,"author":{"gitId":"-"},"content":" return sinceDate;"},{"lineNumber":916,"author":{"gitId":"-"},"content":" }"},{"lineNumber":917,"author":{"gitId":"-"},"content":""},{"lineNumber":918,"author":{"gitId":"-"},"content":" public void setSinceDate(LocalDateTime sinceDate) {"},{"lineNumber":919,"author":{"gitId":"-"},"content":" this.sinceDate \u003d sinceDate;"},{"lineNumber":920,"author":{"gitId":"-"},"content":" }"},{"lineNumber":921,"author":{"gitId":"-"},"content":""},{"lineNumber":922,"author":{"gitId":"-"},"content":" public LocalDateTime getUntilDate() {"},{"lineNumber":923,"author":{"gitId":"-"},"content":" return untilDate;"},{"lineNumber":924,"author":{"gitId":"-"},"content":" }"},{"lineNumber":925,"author":{"gitId":"-"},"content":""},{"lineNumber":926,"author":{"gitId":"-"},"content":" public void setUntilDate(LocalDateTime untilDate) {"},{"lineNumber":927,"author":{"gitId":"-"},"content":" this.untilDate \u003d untilDate;"},{"lineNumber":928,"author":{"gitId":"-"},"content":" }"},{"lineNumber":929,"author":{"gitId":"-"},"content":""},{"lineNumber":930,"author":{"gitId":"-"},"content":" public ZoneId getZoneId() {"},{"lineNumber":931,"author":{"gitId":"-"},"content":" return zoneId;"},{"lineNumber":932,"author":{"gitId":"-"},"content":" }"},{"lineNumber":933,"author":{"gitId":"-"},"content":""},{"lineNumber":934,"author":{"gitId":"-"},"content":" public void setZoneId(ZoneId zoneId) {"},{"lineNumber":935,"author":{"gitId":"-"},"content":" this.zoneId \u003d zoneId;"},{"lineNumber":936,"author":{"gitId":"-"},"content":" }"},{"lineNumber":937,"author":{"gitId":"-"},"content":""},{"lineNumber":938,"author":{"gitId":"-"},"content":" public void setAuthorDisplayName(Author author, String displayName) {"},{"lineNumber":939,"author":{"gitId":"-"},"content":" authorConfig.setAuthorDisplayName(author, displayName);"},{"lineNumber":940,"author":{"gitId":"-"},"content":" }"},{"lineNumber":941,"author":{"gitId":"-"},"content":""},{"lineNumber":942,"author":{"gitId":"-"},"content":" public void addAuthorNamesToAuthorMapEntry(Author author, String name) {"},{"lineNumber":943,"author":{"gitId":"-"},"content":" authorConfig.addAuthorNamesToAuthorMapEntry(author, name);"},{"lineNumber":944,"author":{"gitId":"-"},"content":" }"},{"lineNumber":945,"author":{"gitId":"-"},"content":""},{"lineNumber":946,"author":{"gitId":"-"},"content":" public void addAuthorNamesToAuthorMapEntry(Author author, List\u003cString\u003e names) {"},{"lineNumber":947,"author":{"gitId":"-"},"content":" authorConfig.addAuthorNamesToAuthorMapEntry(author, names);"},{"lineNumber":948,"author":{"gitId":"-"},"content":" }"},{"lineNumber":949,"author":{"gitId":"-"},"content":""},{"lineNumber":950,"author":{"gitId":"-"},"content":" public void addAuthorEmailsToAuthorMapEntry(Author author, List\u003cString\u003e emails) {"},{"lineNumber":951,"author":{"gitId":"-"},"content":" authorConfig.addAuthorEmailsToAuthorMapEntry(author, emails);"},{"lineNumber":952,"author":{"gitId":"-"},"content":" }"},{"lineNumber":953,"author":{"gitId":"-"},"content":""},{"lineNumber":954,"author":{"gitId":"-"},"content":" public String getDisplayName() {"},{"lineNumber":955,"author":{"gitId":"-"},"content":" return displayName;"},{"lineNumber":956,"author":{"gitId":"-"},"content":" }"},{"lineNumber":957,"author":{"gitId":"-"},"content":""},{"lineNumber":958,"author":{"gitId":"-"},"content":" public String getRepoName() {"},{"lineNumber":959,"author":{"gitId":"-"},"content":" return location.getRepoName();"},{"lineNumber":960,"author":{"gitId":"-"},"content":" }"},{"lineNumber":961,"author":{"gitId":"-"},"content":""},{"lineNumber":962,"author":{"gitId":"-"},"content":" public String getOutputFolderName() {"},{"lineNumber":963,"author":{"gitId":"-"},"content":" return outputFolderName;"},{"lineNumber":964,"author":{"gitId":"-"},"content":" }"},{"lineNumber":965,"author":{"gitId":"-"},"content":""},{"lineNumber":966,"author":{"gitId":"-"},"content":" public void setStandaloneConfigIgnored(boolean isStandaloneConfigIgnored) {"},{"lineNumber":967,"author":{"gitId":"-"},"content":" this.isStandaloneConfigIgnored \u003d isStandaloneConfigIgnored;"},{"lineNumber":968,"author":{"gitId":"-"},"content":" }"},{"lineNumber":969,"author":{"gitId":"-"},"content":""},{"lineNumber":970,"author":{"gitId":"-"},"content":" public void setFileSizeLimitIgnored(boolean isFileSizeLimitIgnored) {"},{"lineNumber":971,"author":{"gitId":"-"},"content":" this.isFileSizeLimitIgnored \u003d isFileSizeLimitIgnored;"},{"lineNumber":972,"author":{"gitId":"-"},"content":" }"},{"lineNumber":973,"author":{"gitId":"-"},"content":""},{"lineNumber":974,"author":{"gitId":"-"},"content":" public RepoLocation getLocation() {"},{"lineNumber":975,"author":{"gitId":"-"},"content":" return location;"},{"lineNumber":976,"author":{"gitId":"-"},"content":" }"},{"lineNumber":977,"author":{"gitId":"-"},"content":""},{"lineNumber":978,"author":{"gitId":"-"},"content":" public String getOrganization() {"},{"lineNumber":979,"author":{"gitId":"-"},"content":" return location.getOrganization();"},{"lineNumber":980,"author":{"gitId":"-"},"content":" }"},{"lineNumber":981,"author":{"gitId":"-"},"content":""},{"lineNumber":982,"author":{"gitId":"-"},"content":" public boolean isStandaloneConfigIgnored() {"},{"lineNumber":983,"author":{"gitId":"-"},"content":" return isStandaloneConfigIgnored;"},{"lineNumber":984,"author":{"gitId":"-"},"content":" }"},{"lineNumber":985,"author":{"gitId":"-"},"content":""},{"lineNumber":986,"author":{"gitId":"-"},"content":" public boolean isFileSizeLimitIgnored() {"},{"lineNumber":987,"author":{"gitId":"-"},"content":" return isFileSizeLimitIgnored;"},{"lineNumber":988,"author":{"gitId":"-"},"content":" }"},{"lineNumber":989,"author":{"gitId":"-"},"content":""},{"lineNumber":990,"author":{"gitId":"-"},"content":" public boolean isIgnoredFileAnalysisSkipped() {"},{"lineNumber":991,"author":{"gitId":"-"},"content":" return isIgnoredFileAnalysisSkipped;"},{"lineNumber":992,"author":{"gitId":"-"},"content":" }"},{"lineNumber":993,"author":{"gitId":"-"},"content":""},{"lineNumber":994,"author":{"gitId":"-"},"content":" public boolean isFormatsOverriding() {"},{"lineNumber":995,"author":{"gitId":"-"},"content":" return isFormatsOverriding;"},{"lineNumber":996,"author":{"gitId":"-"},"content":" }"},{"lineNumber":997,"author":{"gitId":"-"},"content":""},{"lineNumber":998,"author":{"gitId":"-"},"content":" public boolean isIgnoreGlobListOverriding() {"},{"lineNumber":999,"author":{"gitId":"-"},"content":" return isIgnoreGlobListOverriding;"},{"lineNumber":1000,"author":{"gitId":"-"},"content":" }"},{"lineNumber":1001,"author":{"gitId":"-"},"content":""},{"lineNumber":1002,"author":{"gitId":"-"},"content":" public boolean isIgnoreCommitListOverriding() {"},{"lineNumber":1003,"author":{"gitId":"-"},"content":" return isIgnoreCommitListOverriding;"},{"lineNumber":1004,"author":{"gitId":"-"},"content":" }"},{"lineNumber":1005,"author":{"gitId":"-"},"content":""},{"lineNumber":1006,"author":{"gitId":"-"},"content":" public boolean isFileSizeLimitOverriding() {"},{"lineNumber":1007,"author":{"gitId":"-"},"content":" return isFileSizeLimitOverriding;"},{"lineNumber":1008,"author":{"gitId":"-"},"content":" }"},{"lineNumber":1009,"author":{"gitId":"-"},"content":""},{"lineNumber":1010,"author":{"gitId":"-"},"content":" public boolean isFindingPreviousAuthorsPerformed() {"},{"lineNumber":1011,"author":{"gitId":"-"},"content":" return isFindingPreviousAuthorsPerformed;"},{"lineNumber":1012,"author":{"gitId":"-"},"content":" }"},{"lineNumber":1013,"author":{"gitId":"-"},"content":""},{"lineNumber":1014,"author":{"gitId":"-"},"content":" public AuthorConfiguration getAuthorConfig() {"},{"lineNumber":1015,"author":{"gitId":"-"},"content":" return authorConfig;"},{"lineNumber":1016,"author":{"gitId":"-"},"content":" }"},{"lineNumber":1017,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":400,"-":617}},{"path":"src/main/java/reposense/model/RepoLocation.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.model;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static reposense.util.FileUtil.isValidPath;"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.net.URI;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.net.URISyntaxException;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.FileSystems;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Map;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Optional;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.regex.Matcher;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.regex.Pattern;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"import reposense.git.GitRemote;"},{"lineNumber":15,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidLocationException;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import reposense.report.ErrorSummary;"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import reposense.util.StringsUtil;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import reposense.util.SystemUtil;"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Represents a repository location."},{"lineNumber":22,"author":{"gitId":"-"},"content":" */"},{"lineNumber":23,"author":{"gitId":"-"},"content":"public class RepoLocation {"},{"lineNumber":24,"author":{"gitId":"-"},"content":" protected static final String UNSUPPORTED_DOMAIN_NAME \u003d \"NOT_RECOGNIZED\";"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final String MESSAGE_INVALID_LOCATION \u003d \"%s is an invalid location.\";"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final String MESSAGE_INVALID_REMOTE_URL \u003d \"%s is an invalid remote URL.\";"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" private static final String REPO_NAME_REGEX \u003d \"(?\u003crepoName\u003e[^/]+?)(/?\\\\.git)?/?\";"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String PATH_TO_REPO_REGEX \u003d \"(?\u003cpath\u003e.*?)/?\" + REPO_NAME_REGEX;"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final Pattern GIT_REPOSITORY_LOCATION_PATTERN \u003d"},{"lineNumber":32,"author":{"gitId":"-"},"content":" Pattern.compile(\"^(ssh|git|https?|ftps?)://(?\u003cdomain\u003e[^/]*?)/\" + PATH_TO_REPO_REGEX + \"$\");"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final Pattern SCP_LIKE_SSH_REPOSITORY_LOCATION_PATTERN \u003d"},{"lineNumber":34,"author":{"gitId":"-"},"content":" Pattern.compile(\"^(.*@)?(?\u003cdomain\u003e.*?):(?\u003cpath\u003e[^/].*?)??/??\" + REPO_NAME_REGEX + \"$\");"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private static final Pattern LOCAL_REPOSITORY_NON_WINDOWS_LOCATION_PATTERN \u003d"},{"lineNumber":36,"author":{"gitId":"-"},"content":" Pattern.compile(\"^(file://)?\" + PATH_TO_REPO_REGEX + \"$\");"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private static final Pattern LOCAL_REPOSITORY_WINDOWS_LOCATION_PATTERN \u003d"},{"lineNumber":38,"author":{"gitId":"-"},"content":" Pattern.compile(\"^\" + PATH_TO_REPO_REGEX.replaceAll(\"/\", \"\\\\\\\\\\\\\\\\\") + \"$\");"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private static final Pattern DOMAIN_NAME_PATTERN \u003d Pattern.compile(\"^(ww.\\\\.)?+(.*@)?(?\u003cdomainName\u003e[^.]+)\\\\..+$\");"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" private static final String GROUP_REPO_NAME \u003d \"repoName\";"},{"lineNumber":42,"author":{"gitId":"-"},"content":" private static final String GROUP_PATH \u003d \"path\";"},{"lineNumber":43,"author":{"gitId":"-"},"content":" private static final String GROUP_DOMAIN_NAME \u003d \"domainName\";"},{"lineNumber":44,"author":{"gitId":"-"},"content":" private static final String GROUP_DOMAIN \u003d \"domain\";"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":" private static final String PATH_SEPARATOR_REPLACEMENT \u003d \"-\";"},{"lineNumber":47,"author":{"gitId":"-"},"content":""},{"lineNumber":48,"author":{"gitId":"-"},"content":" // Used for remote link generation (serialized)"},{"lineNumber":49,"author":{"gitId":"-"},"content":" private final String location;"},{"lineNumber":50,"author":{"gitId":"-"},"content":" private final String repoName;"},{"lineNumber":51,"author":{"gitId":"-"},"content":" private final String organization;"},{"lineNumber":52,"author":{"gitId":"-"},"content":" private final String domainName;"},{"lineNumber":53,"author":{"gitId":"-"},"content":""},{"lineNumber":54,"author":{"gitId":"-"},"content":" // Used for generation of local repository report output directory"},{"lineNumber":55,"author":{"gitId":"-"},"content":" private final transient String outputFolderRepoName;"},{"lineNumber":56,"author":{"gitId":"-"},"content":" private final transient String outputFolderOrganization;"},{"lineNumber":57,"author":{"gitId":"-"},"content":""},{"lineNumber":58,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * Creates {@link RepoLocation} based on the {@code location}, which is represented by a {@code URL}"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * or {@link Path}."},{"lineNumber":61,"author":{"gitId":"-"},"content":" *"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * @throws InvalidLocationException if {@code location} cannot be represented by a {@code URL} or {@link Path}."},{"lineNumber":63,"author":{"gitId":"-"},"content":" */"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public RepoLocation(String location) throws InvalidLocationException {"},{"lineNumber":65,"author":{"gitId":"-"},"content":" if (SystemUtil.isWindows()) {"},{"lineNumber":66,"author":{"gitId":"-"},"content":" location \u003d StringsUtil.removeTrailingBackslash(location);"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }"},{"lineNumber":68,"author":{"gitId":"-"},"content":""},{"lineNumber":69,"author":{"gitId":"-"},"content":" this.location \u003d location;"},{"lineNumber":70,"author":{"gitId":"-"},"content":" String[] remoteRepoNameAndOrg;"},{"lineNumber":71,"author":{"gitId":"-"},"content":" String[] outputFolderRepoNameAndOrg;"},{"lineNumber":72,"author":{"gitId":"-"},"content":" if (location.isEmpty()) {"},{"lineNumber":73,"author":{"gitId":"-"},"content":" remoteRepoNameAndOrg \u003d new String[] {\"\", \"\", UNSUPPORTED_DOMAIN_NAME};"},{"lineNumber":74,"author":{"gitId":"-"},"content":" outputFolderRepoNameAndOrg \u003d remoteRepoNameAndOrg;"},{"lineNumber":75,"author":{"gitId":"-"},"content":" } else if (isLocalRepo(location)) {"},{"lineNumber":76,"author":{"gitId":"-"},"content":" outputFolderRepoNameAndOrg \u003d getLocalRepoNameAndOrg(location);"},{"lineNumber":77,"author":{"gitId":"-"},"content":""},{"lineNumber":78,"author":{"gitId":"-"},"content":" Map\u003cString, String\u003e remotes \u003d GitRemote.getRemotes(location);"},{"lineNumber":79,"author":{"gitId":"-"},"content":" String newLocation \u003d GitRemote.getAvailableRemoteLocation(remotes).orElse(location);"},{"lineNumber":80,"author":{"gitId":"-"},"content":""},{"lineNumber":81,"author":{"gitId":"-"},"content":" remoteRepoNameAndOrg \u003d remotes.size() \u003d\u003d 0"},{"lineNumber":82,"author":{"gitId":"-"},"content":" ? outputFolderRepoNameAndOrg"},{"lineNumber":83,"author":{"gitId":"-"},"content":" : getRemoteRepoNameAndOrg(newLocation);"},{"lineNumber":84,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":85,"author":{"gitId":"-"},"content":" remoteRepoNameAndOrg \u003d getRemoteRepoNameAndOrg(location);"},{"lineNumber":86,"author":{"gitId":"-"},"content":" outputFolderRepoNameAndOrg \u003d remoteRepoNameAndOrg;"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }"},{"lineNumber":88,"author":{"gitId":"-"},"content":""},{"lineNumber":89,"author":{"gitId":"-"},"content":" this.repoName \u003d remoteRepoNameAndOrg[0];"},{"lineNumber":90,"author":{"gitId":"-"},"content":" this.organization \u003d remoteRepoNameAndOrg[1];"},{"lineNumber":91,"author":{"gitId":"-"},"content":" this.domainName \u003d remoteRepoNameAndOrg[2];"},{"lineNumber":92,"author":{"gitId":"-"},"content":""},{"lineNumber":93,"author":{"gitId":"-"},"content":" this.outputFolderRepoName \u003d outputFolderRepoNameAndOrg[0];"},{"lineNumber":94,"author":{"gitId":"-"},"content":" this.outputFolderOrganization \u003d outputFolderRepoNameAndOrg[1];"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }"},{"lineNumber":96,"author":{"gitId":"-"},"content":""},{"lineNumber":97,"author":{"gitId":"-"},"content":" public boolean isEmpty() {"},{"lineNumber":98,"author":{"gitId":"-"},"content":" return location.isEmpty();"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }"},{"lineNumber":100,"author":{"gitId":"-"},"content":""},{"lineNumber":101,"author":{"gitId":"-"},"content":" public String getRepoName() {"},{"lineNumber":102,"author":{"gitId":"-"},"content":" return outputFolderRepoName;"},{"lineNumber":103,"author":{"gitId":"-"},"content":" }"},{"lineNumber":104,"author":{"gitId":"-"},"content":""},{"lineNumber":105,"author":{"gitId":"-"},"content":" public String getOrganization() {"},{"lineNumber":106,"author":{"gitId":"-"},"content":" return outputFolderOrganization;"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }"},{"lineNumber":108,"author":{"gitId":"-"},"content":""},{"lineNumber":109,"author":{"gitId":"-"},"content":" public String getDomainName() {"},{"lineNumber":110,"author":{"gitId":"-"},"content":" return domainName;"},{"lineNumber":111,"author":{"gitId":"-"},"content":" }"},{"lineNumber":112,"author":{"gitId":"-"},"content":""},{"lineNumber":113,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":114,"author":{"gitId":"-"},"content":" * Returns true if {@code repoArgument} is a valid local repository argument."},{"lineNumber":115,"author":{"gitId":"-"},"content":" * This implementation follows directly from the {@code git clone}"},{"lineNumber":116,"author":{"gitId":"-"},"content":" * \u003ca href\u003d\"https://git-scm.com/docs/git-clone#_git_urls\"\u003especification\u003c/a\u003e."},{"lineNumber":117,"author":{"gitId":"-"},"content":" */"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public static boolean isLocalRepo(String repoArgument) {"},{"lineNumber":119,"author":{"gitId":"-"},"content":" if (!repoArgument.contains(\":\")) {"},{"lineNumber":120,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }"},{"lineNumber":122,"author":{"gitId":"-"},"content":""},{"lineNumber":123,"author":{"gitId":"-"},"content":" boolean hasSlashBeforeFirstColon \u003d repoArgument.split(\":\", 2)[0].contains(\"/\");"},{"lineNumber":124,"author":{"gitId":"-"},"content":" if (hasSlashBeforeFirstColon) {"},{"lineNumber":125,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":126,"author":{"gitId":"-"},"content":" }"},{"lineNumber":127,"author":{"gitId":"-"},"content":""},{"lineNumber":128,"author":{"gitId":"-"},"content":" // checks if it is a URL file protocol"},{"lineNumber":129,"author":{"gitId":"-"},"content":" String urlProtocol \u003d repoArgument.split(\"://\", 2)[0];"},{"lineNumber":130,"author":{"gitId":"-"},"content":" if (urlProtocol.equals(\"file\")) {"},{"lineNumber":131,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }"},{"lineNumber":133,"author":{"gitId":"-"},"content":""},{"lineNumber":134,"author":{"gitId":"-"},"content":" // catch disk drive arguments such as C:\\"},{"lineNumber":135,"author":{"gitId":"-"},"content":" if (SystemUtil.isWindows() \u0026\u0026 isValidPath(repoArgument)) {"},{"lineNumber":136,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }"},{"lineNumber":138,"author":{"gitId":"-"},"content":""},{"lineNumber":139,"author":{"gitId":"-"},"content":" return false;"},{"lineNumber":140,"author":{"gitId":"-"},"content":" }"},{"lineNumber":141,"author":{"gitId":"-"},"content":""},{"lineNumber":142,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":143,"author":{"gitId":"-"},"content":" * Returns a best-guess repo name and organization from the given local repo {@code location}."},{"lineNumber":144,"author":{"gitId":"-"},"content":" * The return is a length-3 string array with the repo name at index 0, organization at index 1"},{"lineNumber":145,"author":{"gitId":"-"},"content":" * and domain name (unsupported domain) at index 2."},{"lineNumber":146,"author":{"gitId":"-"},"content":" *"},{"lineNumber":147,"author":{"gitId":"-"},"content":" * @throws InvalidLocationException if the location specified is not a proper local repository."},{"lineNumber":148,"author":{"gitId":"-"},"content":" */"},{"lineNumber":149,"author":{"gitId":"-"},"content":" private String[] getLocalRepoNameAndOrg(String location) throws InvalidLocationException {"},{"lineNumber":150,"author":{"gitId":"-"},"content":" boolean isWindows \u003d SystemUtil.isWindows();"},{"lineNumber":151,"author":{"gitId":"-"},"content":" if (isWindows) {"},{"lineNumber":152,"author":{"gitId":"-"},"content":" location \u003d location.replaceAll(\"file://\", \"\");"},{"lineNumber":153,"author":{"gitId":"-"},"content":" location \u003d location.replaceAll(\"/\", \"\\\\\\\\\");"},{"lineNumber":154,"author":{"gitId":"-"},"content":" location \u003d location.replaceAll(\"[|:]\", \"-\");"},{"lineNumber":155,"author":{"gitId":"-"},"content":" }"},{"lineNumber":156,"author":{"gitId":"-"},"content":" Pattern localRepoPattern \u003d isWindows"},{"lineNumber":157,"author":{"gitId":"-"},"content":" ? LOCAL_REPOSITORY_WINDOWS_LOCATION_PATTERN"},{"lineNumber":158,"author":{"gitId":"-"},"content":" : LOCAL_REPOSITORY_NON_WINDOWS_LOCATION_PATTERN;"},{"lineNumber":159,"author":{"gitId":"-"},"content":" Matcher localRepoMatcher \u003d localRepoPattern.matcher(location);"},{"lineNumber":160,"author":{"gitId":"-"},"content":""},{"lineNumber":161,"author":{"gitId":"-"},"content":" if (!localRepoMatcher.matches()) {"},{"lineNumber":162,"author":{"gitId":"-"},"content":" ErrorSummary.getInstance().addErrorMessage(location,"},{"lineNumber":163,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_LOCATION, location));"},{"lineNumber":164,"author":{"gitId":"-"},"content":" throw new InvalidLocationException(String.format(MESSAGE_INVALID_LOCATION, location));"},{"lineNumber":165,"author":{"gitId":"-"},"content":" }"},{"lineNumber":166,"author":{"gitId":"-"},"content":""},{"lineNumber":167,"author":{"gitId":"-"},"content":" String tempRepoName \u003d localRepoMatcher.group(GROUP_REPO_NAME);"},{"lineNumber":168,"author":{"gitId":"-"},"content":" String tempOrganization \u003d getOrganizationFromMatcher(localRepoMatcher);"},{"lineNumber":169,"author":{"gitId":"-"},"content":" return new String[] {tempRepoName, tempOrganization, UNSUPPORTED_DOMAIN_NAME};"},{"lineNumber":170,"author":{"gitId":"-"},"content":" }"},{"lineNumber":171,"author":{"gitId":"-"},"content":""},{"lineNumber":172,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":173,"author":{"gitId":"-"},"content":" * Returns a best-guess repo name, organization and domain name from the given remote repo"},{"lineNumber":174,"author":{"gitId":"-"},"content":" * {@code location}. The return is a length-3 string array with the repo name at index 0,"},{"lineNumber":175,"author":{"gitId":"-"},"content":" * organization at index 1 and domain name at index 2."},{"lineNumber":176,"author":{"gitId":"-"},"content":" *"},{"lineNumber":177,"author":{"gitId":"-"},"content":" * @throws InvalidLocationException if the location specified is not a proper remote repository."},{"lineNumber":178,"author":{"gitId":"-"},"content":" */"},{"lineNumber":179,"author":{"gitId":"-"},"content":" private String[] getRemoteRepoNameAndOrg(String location) throws InvalidLocationException {"},{"lineNumber":180,"author":{"gitId":"-"},"content":" Matcher remoteRepoMatcher \u003d GIT_REPOSITORY_LOCATION_PATTERN.matcher(location);"},{"lineNumber":181,"author":{"gitId":"-"},"content":" Matcher sshRepoMatcher \u003d SCP_LIKE_SSH_REPOSITORY_LOCATION_PATTERN.matcher(location);"},{"lineNumber":182,"author":{"gitId":"-"},"content":""},{"lineNumber":183,"author":{"gitId":"-"},"content":" boolean isNormalUrl \u003d remoteRepoMatcher.matches();"},{"lineNumber":184,"author":{"gitId":"-"},"content":" if (isNormalUrl) {"},{"lineNumber":185,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":186,"author":{"gitId":"-"},"content":" new URI(location);"},{"lineNumber":187,"author":{"gitId":"-"},"content":" } catch (URISyntaxException e) {"},{"lineNumber":188,"author":{"gitId":"-"},"content":" ErrorSummary.getInstance().addErrorMessage(location,"},{"lineNumber":189,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_REMOTE_URL, location));"},{"lineNumber":190,"author":{"gitId":"-"},"content":" throw new InvalidLocationException(String.format(MESSAGE_INVALID_REMOTE_URL, location));"},{"lineNumber":191,"author":{"gitId":"-"},"content":" }"},{"lineNumber":192,"author":{"gitId":"-"},"content":" }"},{"lineNumber":193,"author":{"gitId":"-"},"content":" boolean isValidRemoteRepoUrl \u003d remoteRepoMatcher.matches() || sshRepoMatcher.matches();"},{"lineNumber":194,"author":{"gitId":"-"},"content":" if (!isValidRemoteRepoUrl) {"},{"lineNumber":195,"author":{"gitId":"-"},"content":" ErrorSummary.getInstance().addErrorMessage(location,"},{"lineNumber":196,"author":{"gitId":"-"},"content":" String.format(MESSAGE_INVALID_REMOTE_URL, location));"},{"lineNumber":197,"author":{"gitId":"-"},"content":" throw new InvalidLocationException(String.format(MESSAGE_INVALID_REMOTE_URL, location));"},{"lineNumber":198,"author":{"gitId":"-"},"content":" }"},{"lineNumber":199,"author":{"gitId":"-"},"content":""},{"lineNumber":200,"author":{"gitId":"-"},"content":" // priority for standard URL matches over SSH as SSH matcher will normally also match standard URL"},{"lineNumber":201,"author":{"gitId":"-"},"content":" Matcher actualMatcher \u003d remoteRepoMatcher.matches() ? remoteRepoMatcher : sshRepoMatcher;"},{"lineNumber":202,"author":{"gitId":"-"},"content":" String tempRepoName \u003d actualMatcher.group(GROUP_REPO_NAME);"},{"lineNumber":203,"author":{"gitId":"-"},"content":" String tempOrganization \u003d getOrganizationFromMatcher(actualMatcher);"},{"lineNumber":204,"author":{"gitId":"-"},"content":""},{"lineNumber":205,"author":{"gitId":"-"},"content":" return new String[] {tempRepoName, tempOrganization,"},{"lineNumber":206,"author":{"gitId":"-"},"content":" getDomainNameFromDomain(actualMatcher.group(GROUP_DOMAIN))};"},{"lineNumber":207,"author":{"gitId":"-"},"content":" }"},{"lineNumber":208,"author":{"gitId":"-"},"content":""},{"lineNumber":209,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":210,"author":{"gitId":"-"},"content":" * Returns the organization string from the {@code matcher} if one exists."},{"lineNumber":211,"author":{"gitId":"-"},"content":" * If no match was found for it, returns an empty string instead."},{"lineNumber":212,"author":{"gitId":"-"},"content":" */"},{"lineNumber":213,"author":{"gitId":"-"},"content":" private static String getOrganizationFromMatcher(Matcher matcher) {"},{"lineNumber":214,"author":{"gitId":"-"},"content":" return Optional.ofNullable(matcher.group(GROUP_PATH))"},{"lineNumber":215,"author":{"gitId":"-"},"content":" .map(s -\u003e Paths.get(s).normalize().toString())"},{"lineNumber":216,"author":{"gitId":"-"},"content":" .map(s -\u003e s.replaceAll(Pattern.quote(FileSystems.getDefault().getSeparator()),"},{"lineNumber":217,"author":{"gitId":"-"},"content":" PATH_SEPARATOR_REPLACEMENT))"},{"lineNumber":218,"author":{"gitId":"-"},"content":" .orElse(\"\");"},{"lineNumber":219,"author":{"gitId":"-"},"content":" }"},{"lineNumber":220,"author":{"gitId":"-"},"content":""},{"lineNumber":221,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":222,"author":{"gitId":"-"},"content":" * Returns the domain name of the URL from the {@code matcher} if it is one of the recognised ones."},{"lineNumber":223,"author":{"gitId":"-"},"content":" * Returns {@code UNRECOGNISED_DOMAIN_NAME} if it is a local repo or not recognised."},{"lineNumber":224,"author":{"gitId":"-"},"content":" *"},{"lineNumber":225,"author":{"gitId":"-"},"content":" * @throws InvalidLocationException if the domain specified is not a proper domain name."},{"lineNumber":226,"author":{"gitId":"-"},"content":" */"},{"lineNumber":227,"author":{"gitId":"-"},"content":" public static String getDomainNameFromDomain(String domain) throws InvalidLocationException {"},{"lineNumber":228,"author":{"gitId":"-"},"content":" Matcher domainNameMatcher \u003d DOMAIN_NAME_PATTERN.matcher(domain);"},{"lineNumber":229,"author":{"gitId":"-"},"content":" if (!domainNameMatcher.matches()) {"},{"lineNumber":230,"author":{"gitId":"-"},"content":" throw new InvalidLocationException(MESSAGE_INVALID_REMOTE_URL);"},{"lineNumber":231,"author":{"gitId":"-"},"content":" }"},{"lineNumber":232,"author":{"gitId":"-"},"content":" String domainName \u003d domainNameMatcher.group(GROUP_DOMAIN_NAME);"},{"lineNumber":233,"author":{"gitId":"-"},"content":" return isSupportedDomainName(domainName)"},{"lineNumber":234,"author":{"gitId":"-"},"content":" ? domainName"},{"lineNumber":235,"author":{"gitId":"-"},"content":" : UNSUPPORTED_DOMAIN_NAME;"},{"lineNumber":236,"author":{"gitId":"-"},"content":" }"},{"lineNumber":237,"author":{"gitId":"-"},"content":""},{"lineNumber":238,"author":{"gitId":"-"},"content":" private static boolean isSupportedDomainName(String domainName) {"},{"lineNumber":239,"author":{"gitId":"-"},"content":" return SupportedDomainUrlMap.isSupportedDomainName(domainName);"},{"lineNumber":240,"author":{"gitId":"-"},"content":" }"},{"lineNumber":241,"author":{"gitId":"-"},"content":""},{"lineNumber":242,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":243,"author":{"gitId":"-"},"content":" public String toString() {"},{"lineNumber":244,"author":{"gitId":"-"},"content":" return location;"},{"lineNumber":245,"author":{"gitId":"-"},"content":" }"},{"lineNumber":246,"author":{"gitId":"-"},"content":""},{"lineNumber":247,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":248,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {"},{"lineNumber":249,"author":{"gitId":"-"},"content":" // short circuit if same object"},{"lineNumber":250,"author":{"gitId":"-"},"content":" if (this \u003d\u003d other) {"},{"lineNumber":251,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":252,"author":{"gitId":"-"},"content":" }"},{"lineNumber":253,"author":{"gitId":"-"},"content":""},{"lineNumber":254,"author":{"gitId":"-"},"content":" // instanceof handles null"},{"lineNumber":255,"author":{"gitId":"-"},"content":" if (!(other instanceof RepoLocation)) {"},{"lineNumber":256,"author":{"gitId":"-"},"content":" return false;"},{"lineNumber":257,"author":{"gitId":"-"},"content":" }"},{"lineNumber":258,"author":{"gitId":"-"},"content":""},{"lineNumber":259,"author":{"gitId":"-"},"content":" RepoLocation otherLocation \u003d (RepoLocation) other;"},{"lineNumber":260,"author":{"gitId":"-"},"content":" return this.location.equals(otherLocation.location)"},{"lineNumber":261,"author":{"gitId":"-"},"content":" \u0026\u0026 this.repoName.equals(otherLocation.repoName)"},{"lineNumber":262,"author":{"gitId":"-"},"content":" \u0026\u0026 this.organization.equals(otherLocation.organization)"},{"lineNumber":263,"author":{"gitId":"-"},"content":" \u0026\u0026 this.domainName.equals(otherLocation.domainName)"},{"lineNumber":264,"author":{"gitId":"-"},"content":" \u0026\u0026 this.outputFolderRepoName.equals(otherLocation.outputFolderRepoName)"},{"lineNumber":265,"author":{"gitId":"-"},"content":" \u0026\u0026 this.outputFolderOrganization.equals(otherLocation.outputFolderOrganization);"},{"lineNumber":266,"author":{"gitId":"-"},"content":" }"},{"lineNumber":267,"author":{"gitId":"-"},"content":""},{"lineNumber":268,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":269,"author":{"gitId":"-"},"content":" public int hashCode() {"},{"lineNumber":270,"author":{"gitId":"-"},"content":" return location.hashCode();"},{"lineNumber":271,"author":{"gitId":"-"},"content":" }"},{"lineNumber":272,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":271}},{"path":"src/main/java/reposense/model/RunConfiguration.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.model;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidCsvException;"},{"lineNumber":7,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidHeaderException;"},{"lineNumber":8,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.ParseException;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Interface to get configurations for current RepoSense run."},{"lineNumber":12,"author":{"gitId":"-"},"content":" */"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public interface RunConfiguration {"},{"lineNumber":14,"author":{"gitId":"-"},"content":""},{"lineNumber":15,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e getRepoConfigurations()"},{"lineNumber":16,"author":{"gitId":"-"},"content":" throws ParseException, IOException, InvalidCsvException, InvalidHeaderException;"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":3,"-":15}},{"path":"src/main/java/reposense/parser/ArgsParser.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.parser;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.File;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.io.IOException;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.time.LocalDateTime;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.time.ZoneId;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Collections;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Optional;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"import com.google.gson.JsonSyntaxException;"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.ArgumentParsers;"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.helper.HelpScreenException;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.impl.Arguments;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.impl.action.HelpArgumentAction;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.impl.action.VersionArgumentAction;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentGroup;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParser;"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParserException;"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.FeatureControl;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.MutuallyExclusiveGroup;"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.Namespace;"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import reposense.RepoSense;"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import reposense.model.CliArguments;"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import reposense.model.FileType;"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import reposense.model.ReportConfiguration;"},{"lineNumber":31,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.ParseException;"},{"lineNumber":32,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.AlphanumericArgumentType;"},{"lineNumber":33,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.AnalysisThreadsArgumentType;"},{"lineNumber":34,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.AssetsFolderArgumentType;"},{"lineNumber":35,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.CloningThreadsArgumentType;"},{"lineNumber":36,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.ConfigFolderArgumentType;"},{"lineNumber":37,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.OutputFolderArgumentType;"},{"lineNumber":38,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.PeriodArgumentType;"},{"lineNumber":39,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.ReportFolderArgumentType;"},{"lineNumber":40,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.SinceDateArgumentType;"},{"lineNumber":41,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.UntilDateArgumentType;"},{"lineNumber":42,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.ZoneIdArgumentType;"},{"lineNumber":43,"author":{"gitId":"-"},"content":"import reposense.system.LogsManager;"},{"lineNumber":44,"author":{"gitId":"-"},"content":"import reposense.util.TimeUtil;"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Verifies and parses a string-formatted date to a {@link CliArguments} object."},{"lineNumber":48,"author":{"gitId":"-"},"content":" */"},{"lineNumber":49,"author":{"gitId":"-"},"content":"public class ArgsParser {"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public static final String DEFAULT_REPORT_NAME \u003d \"reposense-report\";"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public static final int DEFAULT_NUM_CLONING_THREADS \u003d 4;"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public static final int DEFAULT_NUM_ANALYSIS_THREADS \u003d Runtime.getRuntime().availableProcessors();"},{"lineNumber":53,"author":{"gitId":"-"},"content":" public static final boolean DEFAULT_IS_TEST_MODE \u003d false;"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public static final boolean DEFAULT_SHOULD_FRESH_CLONE \u003d false;"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":" public static final String[] HELP_FLAGS \u003d new String[] {\"--help\", \"-h\"};"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public static final String[] CONFIG_FLAGS \u003d new String[] {\"--config\", \"-c\"};"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public static final String[] REPO_FLAGS \u003d new String[] {\"--repo\", \"--repos\", \"-r\"};"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public static final String[] VIEW_FLAGS \u003d new String[] {\"--view\", \"-v\"};"},{"lineNumber":60,"author":{"gitId":"-"},"content":" public static final String[] OUTPUT_FLAGS \u003d new String[] {\"--output\", \"-o\"};"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public static final String[] ASSETS_FLAGS \u003d new String[] {\"--assets\", \"-a\"};"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public static final String[] SINCE_FLAGS \u003d new String[] {\"--since\", \"-s\"};"},{"lineNumber":63,"author":{"gitId":"-"},"content":" public static final String[] UNTIL_FLAGS \u003d new String[] {\"--until\", \"-u\"};"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public static final String[] PERIOD_FLAGS \u003d new String[] {\"--period\", \"-p\"};"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public static final String[] SHALLOW_CLONING_FLAGS \u003d new String[] {\"--shallow-cloning\", \"-S\"};"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public static final String[] FORMAT_FLAGS \u003d new String[] {\"--formats\", \"-f\"};"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public static final String[] IGNORE_CONFIG_FLAGS \u003d new String[] {\"--ignore-standalone-config\", \"-i\"};"},{"lineNumber":68,"author":{"gitId":"-"},"content":" public static final String[] IGNORE_SIZELIMIT_FLAGS \u003d new String[] {\"--ignore-filesize-limit\", \"-I\"};"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public static final String[] TIMEZONE_FLAGS \u003d new String[] {\"--timezone\", \"-t\"};"},{"lineNumber":70,"author":{"gitId":"-"},"content":" public static final String[] VERSION_FLAGS \u003d new String[] {\"--version\", \"-V\"};"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public static final String[] LAST_MODIFIED_DATE_FLAGS \u003d new String[] {\"--last-modified-date\", \"-l\"};"},{"lineNumber":72,"author":{"gitId":"-"},"content":" public static final String[] FIND_PREVIOUS_AUTHORS_FLAGS \u003d new String[] {\"--find-previous-authors\", \"-F\"};"},{"lineNumber":73,"author":{"gitId":"-"},"content":""},{"lineNumber":74,"author":{"gitId":"-"},"content":" public static final String[] CLONING_THREADS_FLAG \u003d new String[] {\"--cloning-threads\"};"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public static final String[] ANALYSIS_THREADS_FLAG \u003d new String[] {\"--analysis-threads\"};"},{"lineNumber":76,"author":{"gitId":"-"},"content":""},{"lineNumber":77,"author":{"gitId":"-"},"content":" public static final String[] TEST_MODE_FLAG \u003d new String[] {\"--test-mode\"};"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public static final String[] FRESH_CLONING_FLAG \u003d new String[] {\"--fresh-cloning\"};"},{"lineNumber":79,"author":{"gitId":"-"},"content":""},{"lineNumber":80,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsManager.getLogger(ArgsParser.class);"},{"lineNumber":81,"author":{"gitId":"-"},"content":""},{"lineNumber":82,"author":{"gitId":"-"},"content":" private static final String PROGRAM_USAGE \u003d \"java -jar RepoSense.jar\";"},{"lineNumber":83,"author":{"gitId":"-"},"content":" private static final String PROGRAM_DESCRIPTION \u003d"},{"lineNumber":84,"author":{"gitId":"-"},"content":" \"RepoSense is a contribution analysis tool for Git repositories.\";"},{"lineNumber":85,"author":{"gitId":"-"},"content":" private static final String MESSAGE_HEADER_MUTEX \u003d \"mutual exclusive arguments\";"},{"lineNumber":86,"author":{"gitId":"-"},"content":" private static final String MESSAGE_HEADER_TESTING \u003d \"test mode arguments\";"},{"lineNumber":87,"author":{"gitId":"-"},"content":" private static final String MESSAGE_HAVE_SINCE_DATE_UNTIL_DATE_AND_PERIOD \u003d"},{"lineNumber":88,"author":{"gitId":"-"},"content":" \"\\\"Since Date\\\", \\\"Until Date\\\", and \\\"Period\\\" cannot be applied together.\";"},{"lineNumber":89,"author":{"gitId":"-"},"content":" private static final String MESSAGE_USING_DEFAULT_CONFIG_PATH \u003d"},{"lineNumber":90,"author":{"gitId":"-"},"content":" \"Config path not provided, using the config folder as default.\";"},{"lineNumber":91,"author":{"gitId":"-"},"content":" private static final String MESSAGE_INVALID_CONFIG_PATH \u003d \"%s is malformed.\";"},{"lineNumber":92,"author":{"gitId":"-"},"content":" private static final String MESSAGE_INVALID_CONFIG_JSON \u003d \"%s Ignoring the report config provided.\";"},{"lineNumber":93,"author":{"gitId":"-"},"content":" private static final String MESSAGE_SINCE_D1_WITH_PERIOD \u003d \"You may be using --since d1 with the --period flag. \""},{"lineNumber":94,"author":{"gitId":"-"},"content":" + \"This may result in an incorrect date range being analysed.\";"},{"lineNumber":95,"author":{"gitId":"-"},"content":" private static final String MESSAGE_SINCE_DATE_LATER_THAN_UNTIL_DATE \u003d"},{"lineNumber":96,"author":{"gitId":"-"},"content":" \"\\\"Since Date\\\" cannot be later than \\\"Until Date\\\".\";"},{"lineNumber":97,"author":{"gitId":"-"},"content":" private static final String MESSAGE_SINCE_DATE_LATER_THAN_TODAY_DATE \u003d"},{"lineNumber":98,"author":{"gitId":"-"},"content":" \"\\\"Since Date\\\" must not be later than today\u0027s date.\";"},{"lineNumber":99,"author":{"gitId":"-"},"content":" private static final Path EMPTY_PATH \u003d Paths.get(\"\");"},{"lineNumber":100,"author":{"gitId":"-"},"content":" private static final Path DEFAULT_CONFIG_PATH \u003d Paths.get(System.getProperty(\"user.dir\")"},{"lineNumber":101,"author":{"gitId":"-"},"content":" + File.separator + \"config\" + File.separator);"},{"lineNumber":102,"author":{"gitId":"-"},"content":" private static final Path DEFAULT_ASSETS_PATH \u003d Paths.get(System.getProperty(\"user.dir\")"},{"lineNumber":103,"author":{"gitId":"-"},"content":" + File.separator + \"assets\" + File.separator);"},{"lineNumber":104,"author":{"gitId":"-"},"content":""},{"lineNumber":105,"author":{"gitId":"-"},"content":" private static ArgumentParser getArgumentParser() {"},{"lineNumber":106,"author":{"gitId":"-"},"content":" ArgumentParser parser \u003d ArgumentParsers"},{"lineNumber":107,"author":{"gitId":"-"},"content":" .newFor(PROGRAM_USAGE)"},{"lineNumber":108,"author":{"gitId":"-"},"content":" .addHelp(false)"},{"lineNumber":109,"author":{"gitId":"-"},"content":" .build()"},{"lineNumber":110,"author":{"gitId":"-"},"content":" .description(PROGRAM_DESCRIPTION);"},{"lineNumber":111,"author":{"gitId":"-"},"content":""},{"lineNumber":112,"author":{"gitId":"-"},"content":" MutuallyExclusiveGroup mutexParser \u003d parser"},{"lineNumber":113,"author":{"gitId":"-"},"content":" .addMutuallyExclusiveGroup(MESSAGE_HEADER_MUTEX)"},{"lineNumber":114,"author":{"gitId":"-"},"content":" .required(false);"},{"lineNumber":115,"author":{"gitId":"-"},"content":""},{"lineNumber":116,"author":{"gitId":"-"},"content":" MutuallyExclusiveGroup mutexParser2 \u003d parser"},{"lineNumber":117,"author":{"gitId":"-"},"content":" .addMutuallyExclusiveGroup(MESSAGE_HEADER_MUTEX)"},{"lineNumber":118,"author":{"gitId":"-"},"content":" .required(false);"},{"lineNumber":119,"author":{"gitId":"-"},"content":""},{"lineNumber":120,"author":{"gitId":"-"},"content":" ArgumentGroup argumentGroup \u003d parser"},{"lineNumber":121,"author":{"gitId":"-"},"content":" .addArgumentGroup(MESSAGE_HEADER_TESTING);"},{"lineNumber":122,"author":{"gitId":"-"},"content":""},{"lineNumber":123,"author":{"gitId":"-"},"content":" // Boolean flags"},{"lineNumber":124,"author":{"gitId":"-"},"content":" parser.addArgument(HELP_FLAGS)"},{"lineNumber":125,"author":{"gitId":"-"},"content":" .help(\"Show help message.\")"},{"lineNumber":126,"author":{"gitId":"-"},"content":" .action(new HelpArgumentAction());"},{"lineNumber":127,"author":{"gitId":"-"},"content":""},{"lineNumber":128,"author":{"gitId":"-"},"content":" parser.version(\"RepoSense \" + RepoSense.getVersion());"},{"lineNumber":129,"author":{"gitId":"-"},"content":" parser.addArgument(VERSION_FLAGS)"},{"lineNumber":130,"author":{"gitId":"-"},"content":" .help(\"Show the version of RepoSense.\")"},{"lineNumber":131,"author":{"gitId":"-"},"content":" .action(new VersionArgumentAction());"},{"lineNumber":132,"author":{"gitId":"-"},"content":""},{"lineNumber":133,"author":{"gitId":"-"},"content":" parser.addArgument(IGNORE_CONFIG_FLAGS)"},{"lineNumber":134,"author":{"gitId":"-"},"content":" .dest(IGNORE_CONFIG_FLAGS[0])"},{"lineNumber":135,"author":{"gitId":"-"},"content":" .action(Arguments.storeTrue())"},{"lineNumber":136,"author":{"gitId":"-"},"content":" .help(\"A flag to ignore the standalone config file in the repo.\");"},{"lineNumber":137,"author":{"gitId":"-"},"content":""},{"lineNumber":138,"author":{"gitId":"-"},"content":" parser.addArgument(IGNORE_SIZELIMIT_FLAGS)"},{"lineNumber":139,"author":{"gitId":"-"},"content":" .dest(IGNORE_SIZELIMIT_FLAGS[0])"},{"lineNumber":140,"author":{"gitId":"-"},"content":" .action(Arguments.storeTrue())"},{"lineNumber":141,"author":{"gitId":"-"},"content":" .help(\"A flag to ignore the filesize limit for analyzed files.\");"},{"lineNumber":142,"author":{"gitId":"-"},"content":""},{"lineNumber":143,"author":{"gitId":"-"},"content":" parser.addArgument(VIEW_FLAGS)"},{"lineNumber":144,"author":{"gitId":"-"},"content":" .dest(VIEW_FLAGS[0])"},{"lineNumber":145,"author":{"gitId":"-"},"content":" .nargs(\"?\")"},{"lineNumber":146,"author":{"gitId":"-"},"content":" .metavar(\"PATH\")"},{"lineNumber":147,"author":{"gitId":"-"},"content":" .type(new ReportFolderArgumentType())"},{"lineNumber":148,"author":{"gitId":"-"},"content":" .setConst(EMPTY_PATH)"},{"lineNumber":149,"author":{"gitId":"-"},"content":" .help(\"Starts a server to display the report in the provided directory. \""},{"lineNumber":150,"author":{"gitId":"-"},"content":" + \"If used as a flag (with no argument), \""},{"lineNumber":151,"author":{"gitId":"-"},"content":" + \"generates a report and automatically displays the report.\");"},{"lineNumber":152,"author":{"gitId":"-"},"content":""},{"lineNumber":153,"author":{"gitId":"-"},"content":" parser.addArgument(OUTPUT_FLAGS)"},{"lineNumber":154,"author":{"gitId":"-"},"content":" .dest(OUTPUT_FLAGS[0])"},{"lineNumber":155,"author":{"gitId":"-"},"content":" .metavar(\"PATH\")"},{"lineNumber":156,"author":{"gitId":"-"},"content":" .type(new OutputFolderArgumentType())"},{"lineNumber":157,"author":{"gitId":"-"},"content":" .setDefault(Paths.get(ArgsParser.DEFAULT_REPORT_NAME))"},{"lineNumber":158,"author":{"gitId":"-"},"content":" .help(\"The directory to output the report folder, reposense-report. \""},{"lineNumber":159,"author":{"gitId":"-"},"content":" + \"If not provided, the report folder will be created in the current working directory.\");"},{"lineNumber":160,"author":{"gitId":"-"},"content":""},{"lineNumber":161,"author":{"gitId":"-"},"content":" parser.addArgument(ASSETS_FLAGS)"},{"lineNumber":162,"author":{"gitId":"-"},"content":" .dest(ASSETS_FLAGS[0])"},{"lineNumber":163,"author":{"gitId":"-"},"content":" .metavar(\"PATH\")"},{"lineNumber":164,"author":{"gitId":"-"},"content":" .type(new AssetsFolderArgumentType())"},{"lineNumber":165,"author":{"gitId":"-"},"content":" .setDefault(DEFAULT_ASSETS_PATH)"},{"lineNumber":166,"author":{"gitId":"-"},"content":" .help(\"The directory to place assets files to customize report generation. \""},{"lineNumber":167,"author":{"gitId":"-"},"content":" + \"If not provided, the assets folder in the current working directory will be used.\");"},{"lineNumber":168,"author":{"gitId":"-"},"content":""},{"lineNumber":169,"author":{"gitId":"-"},"content":" parser.addArgument(SINCE_FLAGS)"},{"lineNumber":170,"author":{"gitId":"-"},"content":" .dest(SINCE_FLAGS[0])"},{"lineNumber":171,"author":{"gitId":"-"},"content":" .metavar(\"dd/MM/yyyy\")"},{"lineNumber":172,"author":{"gitId":"-"},"content":" .type(new SinceDateArgumentType())"},{"lineNumber":173,"author":{"gitId":"-"},"content":" .setDefault(Optional.empty())"},{"lineNumber":174,"author":{"gitId":"-"},"content":" .help(\"The date to start filtering.\");"},{"lineNumber":175,"author":{"gitId":"-"},"content":""},{"lineNumber":176,"author":{"gitId":"-"},"content":" parser.addArgument(UNTIL_FLAGS)"},{"lineNumber":177,"author":{"gitId":"-"},"content":" .dest(UNTIL_FLAGS[0])"},{"lineNumber":178,"author":{"gitId":"-"},"content":" .metavar(\"dd/MM/yyyy\")"},{"lineNumber":179,"author":{"gitId":"-"},"content":" .type(new UntilDateArgumentType())"},{"lineNumber":180,"author":{"gitId":"-"},"content":" .setDefault(Optional.empty())"},{"lineNumber":181,"author":{"gitId":"-"},"content":" .help(\"The date to stop filtering.\");"},{"lineNumber":182,"author":{"gitId":"-"},"content":""},{"lineNumber":183,"author":{"gitId":"-"},"content":" parser.addArgument(PERIOD_FLAGS)"},{"lineNumber":184,"author":{"gitId":"-"},"content":" .dest(PERIOD_FLAGS[0])"},{"lineNumber":185,"author":{"gitId":"-"},"content":" .metavar(\"PERIOD\")"},{"lineNumber":186,"author":{"gitId":"-"},"content":" .type(new PeriodArgumentType())"},{"lineNumber":187,"author":{"gitId":"-"},"content":" .setDefault(Optional.empty())"},{"lineNumber":188,"author":{"gitId":"-"},"content":" .help(\"The number of days of the filtering window.\");"},{"lineNumber":189,"author":{"gitId":"-"},"content":""},{"lineNumber":190,"author":{"gitId":"-"},"content":" parser.addArgument(FORMAT_FLAGS)"},{"lineNumber":191,"author":{"gitId":"-"},"content":" .dest(FORMAT_FLAGS[0])"},{"lineNumber":192,"author":{"gitId":"-"},"content":" .nargs(\"*\")"},{"lineNumber":193,"author":{"gitId":"-"},"content":" .metavar(\"FORMAT\")"},{"lineNumber":194,"author":{"gitId":"-"},"content":" .type(new AlphanumericArgumentType())"},{"lineNumber":195,"author":{"gitId":"-"},"content":" .setDefault(Collections.emptyList())"},{"lineNumber":196,"author":{"gitId":"-"},"content":" .help(\"The alphanumeric file formats to process.\\n\""},{"lineNumber":197,"author":{"gitId":"-"},"content":" + \"If not provided, default file formats will be used.\\n\""},{"lineNumber":198,"author":{"gitId":"-"},"content":" + \"Please refer to userguide for more information.\");"},{"lineNumber":199,"author":{"gitId":"-"},"content":""},{"lineNumber":200,"author":{"gitId":"-"},"content":" parser.addArgument(TIMEZONE_FLAGS)"},{"lineNumber":201,"author":{"gitId":"-"},"content":" .dest(TIMEZONE_FLAGS[0])"},{"lineNumber":202,"author":{"gitId":"-"},"content":" .metavar(\"ZONE_ID[±hh[mm]]\")"},{"lineNumber":203,"author":{"gitId":"-"},"content":" .type(new ZoneIdArgumentType())"},{"lineNumber":204,"author":{"gitId":"-"},"content":" .setDefault(ZoneId.systemDefault())"},{"lineNumber":205,"author":{"gitId":"-"},"content":" .help(\"The timezone to use for the generated report. \""},{"lineNumber":206,"author":{"gitId":"-"},"content":" + \"One kind of valid timezones is relative to UTC. E.g. UTC, UTC+08, UTC-1030. \\n\""},{"lineNumber":207,"author":{"gitId":"-"},"content":" + \"If not provided, system default timezone will be used.\");"},{"lineNumber":208,"author":{"gitId":"-"},"content":""},{"lineNumber":209,"author":{"gitId":"-"},"content":" parser.addArgument(FIND_PREVIOUS_AUTHORS_FLAGS)"},{"lineNumber":210,"author":{"gitId":"-"},"content":" .dest(FIND_PREVIOUS_AUTHORS_FLAGS[0])"},{"lineNumber":211,"author":{"gitId":"-"},"content":" .action(Arguments.storeTrue())"},{"lineNumber":212,"author":{"gitId":"-"},"content":" .help(\"A flag to make RepoSense utilize Git blame\u0027s ignore revisions functionality, RepoSense \""},{"lineNumber":213,"author":{"gitId":"-"},"content":" + \"will attempt to blame the line changes caused by commits in the ignore commit list to the \""},{"lineNumber":214,"author":{"gitId":"-"},"content":" + \"previous authors who altered those lines (if available)\");"},{"lineNumber":215,"author":{"gitId":"-"},"content":""},{"lineNumber":216,"author":{"gitId":"-"},"content":" // Mutex flags - these will always be the last parameters in help message."},{"lineNumber":217,"author":{"gitId":"-"},"content":" mutexParser.addArgument(CONFIG_FLAGS)"},{"lineNumber":218,"author":{"gitId":"-"},"content":" .dest(CONFIG_FLAGS[0])"},{"lineNumber":219,"author":{"gitId":"-"},"content":" .type(new ConfigFolderArgumentType())"},{"lineNumber":220,"author":{"gitId":"-"},"content":" .metavar(\"PATH\")"},{"lineNumber":221,"author":{"gitId":"-"},"content":" .setDefault(DEFAULT_CONFIG_PATH)"},{"lineNumber":222,"author":{"gitId":"-"},"content":" .help(\"The directory containing the config files.\""},{"lineNumber":223,"author":{"gitId":"-"},"content":" + \"If not provided, the config files will be obtained from the config folder.\");"},{"lineNumber":224,"author":{"gitId":"-"},"content":""},{"lineNumber":225,"author":{"gitId":"-"},"content":" mutexParser.addArgument(REPO_FLAGS)"},{"lineNumber":226,"author":{"gitId":"-"},"content":" .nargs(\"+\")"},{"lineNumber":227,"author":{"gitId":"-"},"content":" .dest(REPO_FLAGS[0])"},{"lineNumber":228,"author":{"gitId":"-"},"content":" .metavar(\"LOCATION\")"},{"lineNumber":229,"author":{"gitId":"-"},"content":" .help(\"The remote Git host URLs or local directories to clone the repositories from.\");"},{"lineNumber":230,"author":{"gitId":"-"},"content":""},{"lineNumber":231,"author":{"gitId":"-"},"content":" mutexParser2.addArgument(LAST_MODIFIED_DATE_FLAGS)"},{"lineNumber":232,"author":{"gitId":"-"},"content":" .dest(LAST_MODIFIED_DATE_FLAGS[0])"},{"lineNumber":233,"author":{"gitId":"-"},"content":" .action(Arguments.storeTrue())"},{"lineNumber":234,"author":{"gitId":"-"},"content":" .help(\"A flag to keep track of the last modified date of each line of code.\");"},{"lineNumber":235,"author":{"gitId":"-"},"content":""},{"lineNumber":236,"author":{"gitId":"-"},"content":" mutexParser2.addArgument(SHALLOW_CLONING_FLAGS)"},{"lineNumber":237,"author":{"gitId":"-"},"content":" .dest(SHALLOW_CLONING_FLAGS[0])"},{"lineNumber":238,"author":{"gitId":"-"},"content":" .action(Arguments.storeTrue())"},{"lineNumber":239,"author":{"gitId":"-"},"content":" .help(\"A flag to make RepoSense employ Git\u0027s shallow cloning functionality, which can significantly \""},{"lineNumber":240,"author":{"gitId":"-"},"content":" + \"reduce the time taken to clone large repositories. This flag should not be used for \""},{"lineNumber":241,"author":{"gitId":"-"},"content":" + \"smaller repositories, where the .git file is smaller than 500 MB.\");"},{"lineNumber":242,"author":{"gitId":"-"},"content":""},{"lineNumber":243,"author":{"gitId":"-"},"content":" parser.addArgument(CLONING_THREADS_FLAG)"},{"lineNumber":244,"author":{"gitId":"-"},"content":" .dest(CLONING_THREADS_FLAG[0])"},{"lineNumber":245,"author":{"gitId":"-"},"content":" .type(new CloningThreadsArgumentType())"},{"lineNumber":246,"author":{"gitId":"-"},"content":" .setDefault(DEFAULT_NUM_CLONING_THREADS)"},{"lineNumber":247,"author":{"gitId":"-"},"content":" .help(FeatureControl.SUPPRESS);"},{"lineNumber":248,"author":{"gitId":"-"},"content":""},{"lineNumber":249,"author":{"gitId":"-"},"content":" parser.addArgument(ANALYSIS_THREADS_FLAG)"},{"lineNumber":250,"author":{"gitId":"-"},"content":" .dest(ANALYSIS_THREADS_FLAG[0])"},{"lineNumber":251,"author":{"gitId":"-"},"content":" .type(new AnalysisThreadsArgumentType())"},{"lineNumber":252,"author":{"gitId":"-"},"content":" .setDefault(DEFAULT_NUM_ANALYSIS_THREADS)"},{"lineNumber":253,"author":{"gitId":"-"},"content":" .help(FeatureControl.SUPPRESS);"},{"lineNumber":254,"author":{"gitId":"-"},"content":""},{"lineNumber":255,"author":{"gitId":"-"},"content":" // Testing flags"},{"lineNumber":256,"author":{"gitId":"-"},"content":" argumentGroup.addArgument(TEST_MODE_FLAG)"},{"lineNumber":257,"author":{"gitId":"-"},"content":" .dest(TEST_MODE_FLAG[0])"},{"lineNumber":258,"author":{"gitId":"-"},"content":" .action(Arguments.storeTrue())"},{"lineNumber":259,"author":{"gitId":"-"},"content":" .help(\"Enables testing mode.\");"},{"lineNumber":260,"author":{"gitId":"-"},"content":""},{"lineNumber":261,"author":{"gitId":"-"},"content":" argumentGroup.addArgument(FRESH_CLONING_FLAG)"},{"lineNumber":262,"author":{"gitId":"-"},"content":" .dest(FRESH_CLONING_FLAG[0])"},{"lineNumber":263,"author":{"gitId":"-"},"content":" .action(Arguments.storeTrue())"},{"lineNumber":264,"author":{"gitId":"-"},"content":" .help(\"Enables fresh cloning. Requires testing mode to be enabled.\");"},{"lineNumber":265,"author":{"gitId":"-"},"content":""},{"lineNumber":266,"author":{"gitId":"-"},"content":" return parser;"},{"lineNumber":267,"author":{"gitId":"-"},"content":" }"},{"lineNumber":268,"author":{"gitId":"-"},"content":""},{"lineNumber":269,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":270,"author":{"gitId":"-"},"content":" * Parses the given string {@code args} to a {@link CliArguments} object."},{"lineNumber":271,"author":{"gitId":"-"},"content":" *"},{"lineNumber":272,"author":{"gitId":"-"},"content":" * @throws HelpScreenException if given args contain the --help flag. Help message will be printed out"},{"lineNumber":273,"author":{"gitId":"-"},"content":" * by the {@link ArgumentParser} hence this is to signal to the caller that the program is safe to exit."},{"lineNumber":274,"author":{"gitId":"-"},"content":" * @throws ParseException if the given string arguments fails to parse to a {@link CliArguments} object."},{"lineNumber":275,"author":{"gitId":"-"},"content":" */"},{"lineNumber":276,"author":{"gitId":"-"},"content":" public static CliArguments parse(String[] args) throws HelpScreenException, ParseException {"},{"lineNumber":277,"author":{"gitId":"-"},"content":" ArgumentParser parser \u003d getArgumentParser();"},{"lineNumber":278,"author":{"gitId":"-"},"content":" Namespace results;"},{"lineNumber":279,"author":{"gitId":"-"},"content":""},{"lineNumber":280,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":281,"author":{"gitId":"-"},"content":" results \u003d parser.parseArgs(args);"},{"lineNumber":282,"author":{"gitId":"-"},"content":" } catch (HelpScreenException hse) {"},{"lineNumber":283,"author":{"gitId":"-"},"content":" throw hse;"},{"lineNumber":284,"author":{"gitId":"-"},"content":" } catch (ArgumentParserException ape) {"},{"lineNumber":285,"author":{"gitId":"-"},"content":" throw new ParseException(getArgumentParser().formatUsage() + ape.getMessage() + \"\\n\");"},{"lineNumber":286,"author":{"gitId":"-"},"content":" }"},{"lineNumber":287,"author":{"gitId":"-"},"content":""},{"lineNumber":288,"author":{"gitId":"-"},"content":" Path configFolderPath \u003d results.get(CONFIG_FLAGS[0]);"},{"lineNumber":289,"author":{"gitId":"-"},"content":" Path reportFolderPath \u003d results.get(VIEW_FLAGS[0]);"},{"lineNumber":290,"author":{"gitId":"-"},"content":" Path outputFolderPath \u003d results.get(OUTPUT_FLAGS[0]);"},{"lineNumber":291,"author":{"gitId":"-"},"content":" ZoneId zoneId \u003d results.get(TIMEZONE_FLAGS[0]);"},{"lineNumber":292,"author":{"gitId":"-"},"content":" Path assetsFolderPath \u003d results.get(ASSETS_FLAGS[0]);"},{"lineNumber":293,"author":{"gitId":"-"},"content":" List\u003cString\u003e locations \u003d results.get(REPO_FLAGS[0]);"},{"lineNumber":294,"author":{"gitId":"-"},"content":" List\u003cFileType\u003e formats \u003d FileType.convertFormatStringsToFileTypes(results.get(FORMAT_FLAGS[0]));"},{"lineNumber":295,"author":{"gitId":"-"},"content":" boolean isStandaloneConfigIgnored \u003d results.get(IGNORE_CONFIG_FLAGS[0]);"},{"lineNumber":296,"author":{"gitId":"-"},"content":" boolean isFileSizeLimitIgnored \u003d results.get(IGNORE_SIZELIMIT_FLAGS[0]);"},{"lineNumber":297,"author":{"gitId":"-"},"content":" boolean shouldIncludeLastModifiedDate \u003d results.get(LAST_MODIFIED_DATE_FLAGS[0]);"},{"lineNumber":298,"author":{"gitId":"-"},"content":" boolean shouldPerformShallowCloning \u003d results.get(SHALLOW_CLONING_FLAGS[0]);"},{"lineNumber":299,"author":{"gitId":"-"},"content":" boolean shouldFindPreviousAuthors \u003d results.get(FIND_PREVIOUS_AUTHORS_FLAGS[0]);"},{"lineNumber":300,"author":{"gitId":"-"},"content":" boolean isTestMode \u003d results.get(TEST_MODE_FLAG[0]);"},{"lineNumber":301,"author":{"gitId":"-"},"content":" int numCloningThreads \u003d results.get(CLONING_THREADS_FLAG[0]);"},{"lineNumber":302,"author":{"gitId":"-"},"content":" int numAnalysisThreads \u003d results.get(ANALYSIS_THREADS_FLAG[0]);"},{"lineNumber":303,"author":{"gitId":"-"},"content":""},{"lineNumber":304,"author":{"gitId":"-"},"content":" CliArguments.Builder cliArgumentsBuilder \u003d new CliArguments.Builder()"},{"lineNumber":305,"author":{"gitId":"-"},"content":" .configFolderPath(configFolderPath)"},{"lineNumber":306,"author":{"gitId":"-"},"content":" .reportDirectoryPath(reportFolderPath)"},{"lineNumber":307,"author":{"gitId":"-"},"content":" .outputFilePath(outputFolderPath)"},{"lineNumber":308,"author":{"gitId":"-"},"content":" .zoneId(zoneId)"},{"lineNumber":309,"author":{"gitId":"-"},"content":" .assetsFilePath(assetsFolderPath)"},{"lineNumber":310,"author":{"gitId":"-"},"content":" .locations(locations)"},{"lineNumber":311,"author":{"gitId":"-"},"content":" .formats(formats)"},{"lineNumber":312,"author":{"gitId":"-"},"content":" .isStandaloneConfigIgnored(isStandaloneConfigIgnored)"},{"lineNumber":313,"author":{"gitId":"-"},"content":" .isFileSizeLimitIgnored(isFileSizeLimitIgnored)"},{"lineNumber":314,"author":{"gitId":"-"},"content":" .isLastModifiedDateIncluded(shouldIncludeLastModifiedDate)"},{"lineNumber":315,"author":{"gitId":"-"},"content":" .isShallowCloningPerformed(shouldPerformShallowCloning)"},{"lineNumber":316,"author":{"gitId":"-"},"content":" .isFindingPreviousAuthorsPerformed(shouldFindPreviousAuthors)"},{"lineNumber":317,"author":{"gitId":"-"},"content":" .numCloningThreads(numCloningThreads)"},{"lineNumber":318,"author":{"gitId":"-"},"content":" .numAnalysisThreads(numAnalysisThreads)"},{"lineNumber":319,"author":{"gitId":"-"},"content":" .isTestMode(isTestMode);"},{"lineNumber":320,"author":{"gitId":"-"},"content":""},{"lineNumber":321,"author":{"gitId":"-"},"content":" LogsManager.setLogFolderLocation(outputFolderPath);"},{"lineNumber":322,"author":{"gitId":"-"},"content":""},{"lineNumber":323,"author":{"gitId":"-"},"content":" if (locations \u003d\u003d null \u0026\u0026 configFolderPath.equals(DEFAULT_CONFIG_PATH)) {"},{"lineNumber":324,"author":{"gitId":"-"},"content":" logger.info(MESSAGE_USING_DEFAULT_CONFIG_PATH);"},{"lineNumber":325,"author":{"gitId":"-"},"content":" }"},{"lineNumber":326,"author":{"gitId":"-"},"content":""},{"lineNumber":327,"author":{"gitId":"-"},"content":" addReportConfigToBuilder(cliArgumentsBuilder, results);"},{"lineNumber":328,"author":{"gitId":"-"},"content":" addAnalysisDatesToBuilder(cliArgumentsBuilder, results);"},{"lineNumber":329,"author":{"gitId":"-"},"content":""},{"lineNumber":330,"author":{"gitId":"-"},"content":" boolean isViewModeOnly \u003d reportFolderPath !\u003d null"},{"lineNumber":331,"author":{"gitId":"-"},"content":" \u0026\u0026 !reportFolderPath.equals(EMPTY_PATH)"},{"lineNumber":332,"author":{"gitId":"-"},"content":" \u0026\u0026 configFolderPath.equals(DEFAULT_CONFIG_PATH)"},{"lineNumber":333,"author":{"gitId":"-"},"content":" \u0026\u0026 locations \u003d\u003d null;"},{"lineNumber":334,"author":{"gitId":"-"},"content":" cliArgumentsBuilder.isViewModeOnly(isViewModeOnly);"},{"lineNumber":335,"author":{"gitId":"-"},"content":""},{"lineNumber":336,"author":{"gitId":"-"},"content":" boolean isAutomaticallyLaunching \u003d reportFolderPath !\u003d null;"},{"lineNumber":337,"author":{"gitId":"-"},"content":" if (isAutomaticallyLaunching \u0026\u0026 !reportFolderPath.equals(EMPTY_PATH) \u0026\u0026 !isViewModeOnly) {"},{"lineNumber":338,"author":{"gitId":"-"},"content":" logger.info(String.format(\"Ignoring argument \u0027%s\u0027 for --view.\", reportFolderPath.toString()));"},{"lineNumber":339,"author":{"gitId":"-"},"content":" }"},{"lineNumber":340,"author":{"gitId":"-"},"content":" cliArgumentsBuilder.isAutomaticallyLaunching(isAutomaticallyLaunching);"},{"lineNumber":341,"author":{"gitId":"-"},"content":""},{"lineNumber":342,"author":{"gitId":"-"},"content":""},{"lineNumber":343,"author":{"gitId":"-"},"content":" boolean shouldPerformFreshCloning \u003d isTestMode"},{"lineNumber":344,"author":{"gitId":"-"},"content":" ? results.get(FRESH_CLONING_FLAG[0])"},{"lineNumber":345,"author":{"gitId":"-"},"content":" : DEFAULT_SHOULD_FRESH_CLONE;"},{"lineNumber":346,"author":{"gitId":"-"},"content":" cliArgumentsBuilder.isFreshClonePerformed(shouldPerformFreshCloning);"},{"lineNumber":347,"author":{"gitId":"-"},"content":""},{"lineNumber":348,"author":{"gitId":"-"},"content":" return cliArgumentsBuilder.build();"},{"lineNumber":349,"author":{"gitId":"-"},"content":" }"},{"lineNumber":350,"author":{"gitId":"-"},"content":""},{"lineNumber":351,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":352,"author":{"gitId":"-"},"content":" * Adds the reportConfig field to the given {@code builder}."},{"lineNumber":353,"author":{"gitId":"-"},"content":" *"},{"lineNumber":354,"author":{"gitId":"-"},"content":" * @param builder Builder to be supplied with the reportConfig field."},{"lineNumber":355,"author":{"gitId":"-"},"content":" * @param results Parsed results of the user-supplied CLI arguments."},{"lineNumber":356,"author":{"gitId":"-"},"content":" */"},{"lineNumber":357,"author":{"gitId":"-"},"content":" private static void addReportConfigToBuilder(CliArguments.Builder builder, Namespace results) {"},{"lineNumber":358,"author":{"gitId":"-"},"content":" ReportConfiguration reportConfig \u003d new ReportConfiguration();"},{"lineNumber":359,"author":{"gitId":"-"},"content":" List\u003cString\u003e locations \u003d results.get(REPO_FLAGS[0]);"},{"lineNumber":360,"author":{"gitId":"-"},"content":" Path configFolderPath \u003d results.get(CONFIG_FLAGS[0]);"},{"lineNumber":361,"author":{"gitId":"-"},"content":""},{"lineNumber":362,"author":{"gitId":"-"},"content":" // Report config is ignored if --repos is provided"},{"lineNumber":363,"author":{"gitId":"-"},"content":" if (locations \u003d\u003d null) {"},{"lineNumber":364,"author":{"gitId":"-"},"content":" Path reportConfigFilePath \u003d configFolderPath.resolve(ReportConfigJsonParser.REPORT_CONFIG_FILENAME);"},{"lineNumber":365,"author":{"gitId":"-"},"content":""},{"lineNumber":366,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":367,"author":{"gitId":"-"},"content":" reportConfig \u003d new ReportConfigJsonParser().parse(reportConfigFilePath);"},{"lineNumber":368,"author":{"gitId":"-"},"content":" } catch (JsonSyntaxException jse) {"},{"lineNumber":369,"author":{"gitId":"-"},"content":" logger.warning(String.format(MESSAGE_INVALID_CONFIG_PATH, reportConfigFilePath));"},{"lineNumber":370,"author":{"gitId":"-"},"content":" } catch (IllegalArgumentException iae) {"},{"lineNumber":371,"author":{"gitId":"-"},"content":" logger.warning(String.format(MESSAGE_INVALID_CONFIG_JSON, iae.getMessage()));"},{"lineNumber":372,"author":{"gitId":"-"},"content":" } catch (IOException ioe) {"},{"lineNumber":373,"author":{"gitId":"-"},"content":" // IOException thrown as report-config.json is not found."},{"lineNumber":374,"author":{"gitId":"-"},"content":" // Ignore exception as the file is optional."},{"lineNumber":375,"author":{"gitId":"-"},"content":" }"},{"lineNumber":376,"author":{"gitId":"-"},"content":" }"},{"lineNumber":377,"author":{"gitId":"-"},"content":" builder.reportConfiguration(reportConfig);"},{"lineNumber":378,"author":{"gitId":"-"},"content":" }"},{"lineNumber":379,"author":{"gitId":"-"},"content":""},{"lineNumber":380,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":381,"author":{"gitId":"-"},"content":" * Adds the sinceDate and untilDate fields for analysis to the given {@code builder}."},{"lineNumber":382,"author":{"gitId":"-"},"content":" *"},{"lineNumber":383,"author":{"gitId":"-"},"content":" * @param builder Builder to be supplied with the sinceDate and untilDate fields"},{"lineNumber":384,"author":{"gitId":"-"},"content":" * @param results Parsed results of the user-supplied CLI arguments."},{"lineNumber":385,"author":{"gitId":"-"},"content":" * @throws ParseException if all of sinceDate, untilDate and (analysis) period is provided"},{"lineNumber":386,"author":{"gitId":"-"},"content":" * or if the sinceDate is invalid."},{"lineNumber":387,"author":{"gitId":"-"},"content":" */"},{"lineNumber":388,"author":{"gitId":"-"},"content":" private static void addAnalysisDatesToBuilder(CliArguments.Builder builder, Namespace results)"},{"lineNumber":389,"author":{"gitId":"-"},"content":" throws ParseException {"},{"lineNumber":390,"author":{"gitId":"-"},"content":" ZoneId zoneId \u003d results.get(TIMEZONE_FLAGS[0]);"},{"lineNumber":391,"author":{"gitId":"-"},"content":" Optional\u003cLocalDateTime\u003e cliSinceDate \u003d results.get(SINCE_FLAGS[0]);"},{"lineNumber":392,"author":{"gitId":"-"},"content":" Optional\u003cLocalDateTime\u003e cliUntilDate \u003d results.get(UNTIL_FLAGS[0]);"},{"lineNumber":393,"author":{"gitId":"-"},"content":" Optional\u003cInteger\u003e cliPeriod \u003d results.get(PERIOD_FLAGS[0]);"},{"lineNumber":394,"author":{"gitId":"-"},"content":""},{"lineNumber":395,"author":{"gitId":"-"},"content":" boolean isSinceDateProvided \u003d cliSinceDate.isPresent();"},{"lineNumber":396,"author":{"gitId":"-"},"content":" boolean isUntilDateProvided \u003d cliUntilDate.isPresent();"},{"lineNumber":397,"author":{"gitId":"-"},"content":" boolean isPeriodProvided \u003d cliPeriod.isPresent();"},{"lineNumber":398,"author":{"gitId":"-"},"content":" if (isSinceDateProvided \u0026\u0026 isUntilDateProvided \u0026\u0026 isPeriodProvided) {"},{"lineNumber":399,"author":{"gitId":"-"},"content":" throw new ParseException(MESSAGE_HAVE_SINCE_DATE_UNTIL_DATE_AND_PERIOD);"},{"lineNumber":400,"author":{"gitId":"-"},"content":" }"},{"lineNumber":401,"author":{"gitId":"-"},"content":""},{"lineNumber":402,"author":{"gitId":"-"},"content":" LocalDateTime sinceDate;"},{"lineNumber":403,"author":{"gitId":"-"},"content":" LocalDateTime untilDate;"},{"lineNumber":404,"author":{"gitId":"-"},"content":" boolean isUsingArbitraryDate \u003d false;"},{"lineNumber":405,"author":{"gitId":"-"},"content":""},{"lineNumber":406,"author":{"gitId":"-"},"content":" LocalDateTime currentDate \u003d TimeUtil.getCurrentDate(zoneId);"},{"lineNumber":407,"author":{"gitId":"-"},"content":""},{"lineNumber":408,"author":{"gitId":"-"},"content":" if (isSinceDateProvided) {"},{"lineNumber":409,"author":{"gitId":"-"},"content":" sinceDate \u003d TimeUtil.getSinceDate(cliSinceDate.get());"},{"lineNumber":410,"author":{"gitId":"-"},"content":" // For --since d1, need to adjust the arbitrary date based on timezone"},{"lineNumber":411,"author":{"gitId":"-"},"content":" if (TimeUtil.isEqualToArbitraryFirstDateUtc(sinceDate)) {"},{"lineNumber":412,"author":{"gitId":"-"},"content":" isUsingArbitraryDate \u003d true;"},{"lineNumber":413,"author":{"gitId":"-"},"content":" sinceDate \u003d TimeUtil.getArbitraryFirstCommitDateConverted(zoneId);"},{"lineNumber":414,"author":{"gitId":"-"},"content":" }"},{"lineNumber":415,"author":{"gitId":"-"},"content":" } else if (isUntilDateProvided) {"},{"lineNumber":416,"author":{"gitId":"-"},"content":" sinceDate \u003d isPeriodProvided"},{"lineNumber":417,"author":{"gitId":"-"},"content":" ? TimeUtil.getDateMinusNDays(cliUntilDate.get(), cliPeriod.get())"},{"lineNumber":418,"author":{"gitId":"-"},"content":" : TimeUtil.getDateMinusAMonth(cliUntilDate.get());"},{"lineNumber":419,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":420,"author":{"gitId":"-"},"content":" sinceDate \u003d isPeriodProvided"},{"lineNumber":421,"author":{"gitId":"-"},"content":" ? TimeUtil.getDateMinusNDays(currentDate, cliPeriod.get())"},{"lineNumber":422,"author":{"gitId":"-"},"content":" : TimeUtil.getDateMinusAMonth(currentDate);"},{"lineNumber":423,"author":{"gitId":"-"},"content":" }"},{"lineNumber":424,"author":{"gitId":"-"},"content":""},{"lineNumber":425,"author":{"gitId":"-"},"content":" if (isPeriodProvided \u0026\u0026 isUsingArbitraryDate) {"},{"lineNumber":426,"author":{"gitId":"-"},"content":" logger.warning(MESSAGE_SINCE_D1_WITH_PERIOD);"},{"lineNumber":427,"author":{"gitId":"-"},"content":" }"},{"lineNumber":428,"author":{"gitId":"-"},"content":""},{"lineNumber":429,"author":{"gitId":"-"},"content":" if (isUntilDateProvided) {"},{"lineNumber":430,"author":{"gitId":"-"},"content":" untilDate \u003d TimeUtil.getUntilDate(cliUntilDate.get());"},{"lineNumber":431,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":432,"author":{"gitId":"-"},"content":" untilDate \u003d (isSinceDateProvided \u0026\u0026 isPeriodProvided)"},{"lineNumber":433,"author":{"gitId":"-"},"content":" ? TimeUtil.getDatePlusNDays(cliSinceDate.get(), cliPeriod.get())"},{"lineNumber":434,"author":{"gitId":"-"},"content":" : currentDate;"},{"lineNumber":435,"author":{"gitId":"-"},"content":" }"},{"lineNumber":436,"author":{"gitId":"-"},"content":""},{"lineNumber":437,"author":{"gitId":"-"},"content":" untilDate \u003d untilDate.compareTo(currentDate) \u003c 0"},{"lineNumber":438,"author":{"gitId":"-"},"content":" ? untilDate"},{"lineNumber":439,"author":{"gitId":"-"},"content":" : currentDate;"},{"lineNumber":440,"author":{"gitId":"-"},"content":""},{"lineNumber":441,"author":{"gitId":"-"},"content":" if (sinceDate.compareTo(currentDate) \u003e 0) {"},{"lineNumber":442,"author":{"gitId":"-"},"content":" throw new ParseException(MESSAGE_SINCE_DATE_LATER_THAN_TODAY_DATE);"},{"lineNumber":443,"author":{"gitId":"-"},"content":" }"},{"lineNumber":444,"author":{"gitId":"-"},"content":""},{"lineNumber":445,"author":{"gitId":"-"},"content":" if (sinceDate.compareTo(untilDate) \u003e 0) {"},{"lineNumber":446,"author":{"gitId":"-"},"content":" throw new ParseException(MESSAGE_SINCE_DATE_LATER_THAN_UNTIL_DATE);"},{"lineNumber":447,"author":{"gitId":"-"},"content":" }"},{"lineNumber":448,"author":{"gitId":"-"},"content":""},{"lineNumber":449,"author":{"gitId":"-"},"content":" builder.sinceDate(sinceDate)"},{"lineNumber":450,"author":{"gitId":"-"},"content":" .isSinceDateProvided(isSinceDateProvided)"},{"lineNumber":451,"author":{"gitId":"-"},"content":" .untilDate(untilDate)"},{"lineNumber":452,"author":{"gitId":"-"},"content":" .isUntilDateProvided(isUntilDateProvided);"},{"lineNumber":453,"author":{"gitId":"-"},"content":" }"},{"lineNumber":454,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":12,"-":442}},{"path":"src/main/java/reposense/parser/AuthorConfigCsvParser.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.parser;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.FileNotFoundException;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.ArrayList;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.apache.commons.csv.CSVRecord;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"import reposense.model.Author;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import reposense.model.AuthorConfiguration;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import reposense.model.RepoLocation;"},{"lineNumber":13,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidLocationException;"},{"lineNumber":14,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.ParseException;"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Container for the values parsed from {@code author-config.csv} file."},{"lineNumber":18,"author":{"gitId":"-"},"content":" */"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class AuthorConfigCsvParser extends CsvParser\u003cAuthorConfiguration\u003e {"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public static final String AUTHOR_CONFIG_FILENAME \u003d \"author-config.csv\";"},{"lineNumber":21,"author":{"gitId":"-"},"content":""},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Positions of the elements of a line in author-config.csv config file."},{"lineNumber":24,"author":{"gitId":"-"},"content":" */"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String[] LOCATION_HEADER \u003d {\"Repository\u0027s Location\"};"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final String[] BRANCH_HEADER \u003d {\"Branch\"};"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final String[] GIT_ID_HEADERS \u003d {\"Author\u0027s Git Host ID\", \"Author\u0027s GitHub ID\"};"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private static final String[] EMAIL_HEADER \u003d {\"Author\u0027s Emails\"};"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private static final String[] DISPLAY_NAME_HEADER \u003d {\"Author\u0027s Display Name\"};"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String[] ALIAS_HEADER \u003d {\"Author\u0027s Git Author Name\"};"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final String[] IGNORE_GLOB_LIST_HEADER \u003d {\"Ignore Glob List\"};"},{"lineNumber":32,"author":{"gitId":"-"},"content":""},{"lineNumber":33,"author":{"gitId":"-"},"content":" public AuthorConfigCsvParser(Path csvFilePath) throws FileNotFoundException {"},{"lineNumber":34,"author":{"gitId":"-"},"content":" super(csvFilePath);"},{"lineNumber":35,"author":{"gitId":"-"},"content":" }"},{"lineNumber":36,"author":{"gitId":"-"},"content":""},{"lineNumber":37,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Gets the list of headers that are mandatory for verification."},{"lineNumber":39,"author":{"gitId":"-"},"content":" */"},{"lineNumber":40,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":41,"author":{"gitId":"-"},"content":" protected String[][] mandatoryHeaders() {"},{"lineNumber":42,"author":{"gitId":"-"},"content":" return new String[][] {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" GIT_ID_HEADERS,"},{"lineNumber":44,"author":{"gitId":"-"},"content":" };"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * Gets the list of optional headers that can be parsed."},{"lineNumber":49,"author":{"gitId":"-"},"content":" */"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":51,"author":{"gitId":"-"},"content":" protected String[][] optionalHeaders() {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" return new String[][] {"},{"lineNumber":53,"author":{"gitId":"-"},"content":" LOCATION_HEADER, BRANCH_HEADER, EMAIL_HEADER, DISPLAY_NAME_HEADER, ALIAS_HEADER,"},{"lineNumber":54,"author":{"gitId":"-"},"content":" IGNORE_GLOB_LIST_HEADER,"},{"lineNumber":55,"author":{"gitId":"-"},"content":" };"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }"},{"lineNumber":57,"author":{"gitId":"-"},"content":""},{"lineNumber":58,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * Processes the csv {@code record} line by line and add created {@link AuthorConfiguration} into {@code results}"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * but skips {@code author} already exists in a {@link AuthorConfiguration} that has same {@code location}"},{"lineNumber":61,"author":{"gitId":"-"},"content":" * and {@code branch}."},{"lineNumber":62,"author":{"gitId":"-"},"content":" */"},{"lineNumber":63,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":64,"author":{"gitId":"-"},"content":" protected void processLine(List\u003cAuthorConfiguration\u003e results, CSVRecord record) throws ParseException {"},{"lineNumber":65,"author":{"gitId":"-"},"content":" List\u003cString\u003e locationsWithBranches \u003d getAsListOrDefault(record, LOCATION_HEADER);"},{"lineNumber":66,"author":{"gitId":"-"},"content":" String branch \u003d getOrDefault(record, BRANCH_HEADER, AuthorConfiguration.DEFAULT_BRANCH);"},{"lineNumber":67,"author":{"gitId":"-"},"content":" String gitId \u003d get(record, GIT_ID_HEADERS);"},{"lineNumber":68,"author":{"gitId":"-"},"content":" List\u003cString\u003e emails \u003d getAsList(record, EMAIL_HEADER);"},{"lineNumber":69,"author":{"gitId":"-"},"content":" String displayName \u003d get(record, DISPLAY_NAME_HEADER);"},{"lineNumber":70,"author":{"gitId":"-"},"content":" List\u003cString\u003e aliases \u003d getAsList(record, ALIAS_HEADER);"},{"lineNumber":71,"author":{"gitId":"-"},"content":" List\u003cString\u003e ignoreGlobList \u003d getAsList(record, IGNORE_GLOB_LIST_HEADER);"},{"lineNumber":72,"author":{"gitId":"-"},"content":""},{"lineNumber":73,"author":{"gitId":"-"},"content":" for (String locationWithBranches : locationsWithBranches) {"},{"lineNumber":74,"author":{"gitId":"-"},"content":" List\u003cString\u003e parsedLocationWithBranches \u003d AuthorConfigLocationParser"},{"lineNumber":75,"author":{"gitId":"-"},"content":" .parseLocation(locationWithBranches, branch);"},{"lineNumber":76,"author":{"gitId":"-"},"content":""},{"lineNumber":77,"author":{"gitId":"-"},"content":" String currLocation \u003d parsedLocationWithBranches.get(0);"},{"lineNumber":78,"author":{"gitId":"-"},"content":" for (int i \u003d 1; i \u003c parsedLocationWithBranches.size(); i++) {"},{"lineNumber":79,"author":{"gitId":"-"},"content":" String currBranch \u003d parsedLocationWithBranches.get(i);"},{"lineNumber":80,"author":{"gitId":"-"},"content":" registerLocationAndBranch(results, gitId, emails, displayName, aliases,"},{"lineNumber":81,"author":{"gitId":"-"},"content":" ignoreGlobList, currLocation, currBranch);"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }"},{"lineNumber":84,"author":{"gitId":"-"},"content":" }"},{"lineNumber":85,"author":{"gitId":"-"},"content":""},{"lineNumber":86,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * Registers an author for a single location and branch with the information"},{"lineNumber":88,"author":{"gitId":"-"},"content":" * provided by each line."},{"lineNumber":89,"author":{"gitId":"-"},"content":" *"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * @throws InvalidLocationException if {@code location} is invalid."},{"lineNumber":91,"author":{"gitId":"-"},"content":" */"},{"lineNumber":92,"author":{"gitId":"-"},"content":" private void registerLocationAndBranch(List\u003cAuthorConfiguration\u003e results, String gitId,"},{"lineNumber":93,"author":{"gitId":"-"},"content":" List\u003cString\u003e emails, String displayName,"},{"lineNumber":94,"author":{"gitId":"-"},"content":" List\u003cString\u003e aliases, List\u003cString\u003e ignoreGlobList,"},{"lineNumber":95,"author":{"gitId":"-"},"content":" String currLocation, String currBranch) throws InvalidLocationException {"},{"lineNumber":96,"author":{"gitId":"-"},"content":" AuthorConfiguration config \u003d findMatchingAuthorConfiguration(results, currLocation, currBranch);"},{"lineNumber":97,"author":{"gitId":"-"},"content":""},{"lineNumber":98,"author":{"gitId":"-"},"content":" Author author \u003d new Author(gitId);"},{"lineNumber":99,"author":{"gitId":"-"},"content":""},{"lineNumber":100,"author":{"gitId":"-"},"content":" if (config.containsAuthor(author)) {"},{"lineNumber":101,"author":{"gitId":"-"},"content":" logger.warning(String.format("},{"lineNumber":102,"author":{"gitId":"-"},"content":" \"Skipping author as %s already in repository %s %s\","},{"lineNumber":103,"author":{"gitId":"-"},"content":" author.getGitId(), config.getLocation(), config.getBranch()));"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }"},{"lineNumber":105,"author":{"gitId":"-"},"content":""},{"lineNumber":106,"author":{"gitId":"-"},"content":" author.setEmails(new ArrayList\u003c\u003e(emails));"},{"lineNumber":107,"author":{"gitId":"-"},"content":" author.setDisplayName(!displayName.isEmpty() ? displayName : author.getGitId());"},{"lineNumber":108,"author":{"gitId":"-"},"content":" if (!aliases.isEmpty()) {"},{"lineNumber":109,"author":{"gitId":"-"},"content":" author.setAuthorAliases(aliases);"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }"},{"lineNumber":111,"author":{"gitId":"-"},"content":" if (!ignoreGlobList.isEmpty()) {"},{"lineNumber":112,"author":{"gitId":"-"},"content":" author.setIgnoreGlobList(ignoreGlobList);"},{"lineNumber":113,"author":{"gitId":"-"},"content":" }"},{"lineNumber":114,"author":{"gitId":"-"},"content":""},{"lineNumber":115,"author":{"gitId":"-"},"content":" config.addAuthor(author);"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }"},{"lineNumber":117,"author":{"gitId":"-"},"content":""},{"lineNumber":118,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":119,"author":{"gitId":"-"},"content":" * Gets an existing {@link AuthorConfiguration} from {@code results} if {@code location} and {@code branch} matches."},{"lineNumber":120,"author":{"gitId":"-"},"content":" * Otherwise, adds a newly created {@link AuthorConfiguration} into {@code results} and returns it."},{"lineNumber":121,"author":{"gitId":"-"},"content":" *"},{"lineNumber":122,"author":{"gitId":"-"},"content":" * @throws InvalidLocationException if {@code location} is invalid."},{"lineNumber":123,"author":{"gitId":"-"},"content":" */"},{"lineNumber":124,"author":{"gitId":"-"},"content":" private static AuthorConfiguration findMatchingAuthorConfiguration(List\u003cAuthorConfiguration\u003e results,"},{"lineNumber":125,"author":{"gitId":"-"},"content":" String location, String branch) throws InvalidLocationException {"},{"lineNumber":126,"author":{"gitId":"-"},"content":" AuthorConfiguration config \u003d new AuthorConfiguration(new RepoLocation(location), branch);"},{"lineNumber":127,"author":{"gitId":"-"},"content":""},{"lineNumber":128,"author":{"gitId":"-"},"content":" for (AuthorConfiguration authorConfig : results) {"},{"lineNumber":129,"author":{"gitId":"-"},"content":" if (authorConfig.getLocation().equals(config.getLocation())"},{"lineNumber":130,"author":{"gitId":"-"},"content":" \u0026\u0026 authorConfig.getBranch().equals(config.getBranch())) {"},{"lineNumber":131,"author":{"gitId":"-"},"content":" return authorConfig;"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }"},{"lineNumber":134,"author":{"gitId":"-"},"content":""},{"lineNumber":135,"author":{"gitId":"-"},"content":" results.add(config);"},{"lineNumber":136,"author":{"gitId":"-"},"content":" return config;"},{"lineNumber":137,"author":{"gitId":"-"},"content":" }"},{"lineNumber":138,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":2,"-":136}},{"path":"src/main/java/reposense/parser/ConfigurationBuildException.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser;"},{"lineNumber":2,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":3,"author":{"gitId":"asdfghjkxd"},"content":"/**"},{"lineNumber":4,"author":{"gitId":"asdfghjkxd"},"content":" * Signals that there was an issue building a Configuration (missing parameters, etc.)."},{"lineNumber":5,"author":{"gitId":"asdfghjkxd"},"content":" */"},{"lineNumber":6,"author":{"gitId":"asdfghjkxd"},"content":"public class ConfigurationBuildException extends RuntimeException {"},{"lineNumber":7,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":8,"author":{"gitId":"asdfghjkxd"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":8}},{"path":"src/main/java/reposense/parser/CsvParser.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.parser;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.BufferedReader;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.io.FileNotFoundException;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.io.FileReader;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.io.IOException;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.Files;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.ArrayList;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Arrays;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Collections;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.HashMap;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.HashSet;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.Map;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import java.util.Optional;"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import java.util.Set;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import java.util.StringJoiner;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import java.util.logging.Level;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;"},{"lineNumber":23,"author":{"gitId":"-"},"content":""},{"lineNumber":24,"author":{"gitId":"-"},"content":"import org.apache.commons.csv.CSVFormat;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import org.apache.commons.csv.CSVRecord;"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidCsvException;"},{"lineNumber":28,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidHeaderException;"},{"lineNumber":29,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.ParseException;"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import reposense.system.LogsManager;"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Contains CSV parsing related functionalities."},{"lineNumber":34,"author":{"gitId":"-"},"content":" */"},{"lineNumber":35,"author":{"gitId":"-"},"content":"public abstract class CsvParser\u003cT\u003e {"},{"lineNumber":36,"author":{"gitId":"-"},"content":" protected static final String COLUMN_VALUES_SEPARATOR \u003d \";\";"},{"lineNumber":37,"author":{"gitId":"-"},"content":" protected static final Logger logger \u003d LogsManager.getLogger(CsvParser.class);"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"-"},"content":" private static final String EMPTY_STRING \u003d \"\";"},{"lineNumber":40,"author":{"gitId":"-"},"content":" private static final String OVERRIDE_KEYWORD \u003d \"override:\";"},{"lineNumber":41,"author":{"gitId":"-"},"content":" private static final String MESSAGE_EMPTY_LINE \u003d \"[EMPTY LINE]\";"},{"lineNumber":42,"author":{"gitId":"-"},"content":" private static final String MESSAGE_UNABLE_TO_READ_CSV_FILE \u003d \"Unable to read the supplied CSV file.\";"},{"lineNumber":43,"author":{"gitId":"-"},"content":" private static final String MESSAGE_MALFORMED_LINE_FORMAT \u003d \"Line %d in CSV file, %s, is malformed.\\n\""},{"lineNumber":44,"author":{"gitId":"-"},"content":" + \"Content: %s\";"},{"lineNumber":45,"author":{"gitId":"-"},"content":" private static final String MESSAGE_LINE_PARSE_EXCEPTION_FORMAT \u003d \"Error parsing line %d in CSV file, %s.\\n\""},{"lineNumber":46,"author":{"gitId":"-"},"content":" + \"Content: %s\\n\""},{"lineNumber":47,"author":{"gitId":"-"},"content":" + \"Error: %s\";"},{"lineNumber":48,"author":{"gitId":"-"},"content":" private static final String MESSAGE_EMPTY_CSV_FORMAT \u003d \"The CSV file, %s, is empty.\";"},{"lineNumber":49,"author":{"gitId":"-"},"content":" private static final String MESSAGE_MANDATORY_HEADER_MISSING \u003d \"Required column header, %s, not found in \""},{"lineNumber":50,"author":{"gitId":"-"},"content":" + \"CSV file, %s\";"},{"lineNumber":51,"author":{"gitId":"-"},"content":" private static final String MESSAGE_DUPLICATE_COLUMN_HEADER \u003d \"Duplicate columns are present in CSV file, %s.\";"},{"lineNumber":52,"author":{"gitId":"-"},"content":" private static final String MESSAGE_COLUMNS_RECOGNIZED \u003d \"Parsed header of CSV file, %s, and recognized columns: \""},{"lineNumber":53,"author":{"gitId":"-"},"content":" + \"%s\";"},{"lineNumber":54,"author":{"gitId":"-"},"content":" private static final String MESSAGE_ZERO_VALID_CONFIGS \u003d \"No valid configurations in the %s.\";"},{"lineNumber":55,"author":{"gitId":"-"},"content":" private static final String MESSAGE_UNKNOWN_COLUMN \u003d \"Unknown column(s) found: %s (%s)\";"},{"lineNumber":56,"author":{"gitId":"-"},"content":""},{"lineNumber":57,"author":{"gitId":"-"},"content":" private Path csvFilePath;"},{"lineNumber":58,"author":{"gitId":"-"},"content":" private Map\u003cString, Integer\u003e headerMap \u003d new HashMap\u003c\u003e();"},{"lineNumber":59,"author":{"gitId":"-"},"content":" private int numOfLinesBeforeFirstRecord \u003d 0;"},{"lineNumber":60,"author":{"gitId":"-"},"content":""},{"lineNumber":61,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * Creates {@link CsvParser} with given {@code csvFilepath}."},{"lineNumber":63,"author":{"gitId":"-"},"content":" *"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * @throws FileNotFoundException if the csv file cannot be found in the provided {@code csvFilePath}."},{"lineNumber":65,"author":{"gitId":"-"},"content":" */"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public CsvParser(Path csvFilePath) throws FileNotFoundException {"},{"lineNumber":67,"author":{"gitId":"-"},"content":" if (csvFilePath \u003d\u003d null || !Files.exists(csvFilePath)) {"},{"lineNumber":68,"author":{"gitId":"-"},"content":" throw new FileNotFoundException(\"Csv file does not exist at the given path.\\n\""},{"lineNumber":69,"author":{"gitId":"-"},"content":" + \"Use \u0027-help\u0027 to list all the available subcommands and some concept guides.\");"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }"},{"lineNumber":71,"author":{"gitId":"-"},"content":""},{"lineNumber":72,"author":{"gitId":"-"},"content":" this.csvFilePath \u003d csvFilePath;"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }"},{"lineNumber":74,"author":{"gitId":"-"},"content":""},{"lineNumber":75,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * Parses the csv file associated with this instance of the {@link CsvParser} and returns a {@link List}"},{"lineNumber":77,"author":{"gitId":"-"},"content":" * containing the records in this file."},{"lineNumber":78,"author":{"gitId":"-"},"content":" *"},{"lineNumber":79,"author":{"gitId":"-"},"content":" * @throws IOException if there are errors accessing the given csv file."},{"lineNumber":80,"author":{"gitId":"-"},"content":" * @throws InvalidCsvException if the csv is malformed."},{"lineNumber":81,"author":{"gitId":"-"},"content":" * @throws InvalidHeaderException if header of csv file cannot be read."},{"lineNumber":82,"author":{"gitId":"-"},"content":" */"},{"lineNumber":83,"author":{"gitId":"-"},"content":" public List\u003cT\u003e parse() throws IOException, InvalidCsvException, InvalidHeaderException {"},{"lineNumber":84,"author":{"gitId":"-"},"content":" List\u003cT\u003e results \u003d new ArrayList\u003c\u003e();"},{"lineNumber":85,"author":{"gitId":"-"},"content":" Iterable\u003cCSVRecord\u003e records;"},{"lineNumber":86,"author":{"gitId":"-"},"content":""},{"lineNumber":87,"author":{"gitId":"-"},"content":" try (BufferedReader csvReader \u003d new BufferedReader(new FileReader(csvFilePath.toFile()))) {"},{"lineNumber":88,"author":{"gitId":"-"},"content":" String[] header \u003d getHeader(csvReader);"},{"lineNumber":89,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":90,"author":{"gitId":"-"},"content":" records \u003d CSVFormat.Builder.create(CSVFormat.DEFAULT).setIgnoreEmptyLines(false).setHeader(header)"},{"lineNumber":91,"author":{"gitId":"-"},"content":" .setTrim(true).setIgnoreHeaderCase(true).build().parse(csvReader);"},{"lineNumber":92,"author":{"gitId":"-"},"content":" } catch (IllegalArgumentException iae) {"},{"lineNumber":93,"author":{"gitId":"-"},"content":" throw new InvalidCsvException("},{"lineNumber":94,"author":{"gitId":"-"},"content":" String.format(MESSAGE_DUPLICATE_COLUMN_HEADER, csvFilePath.getFileName()));"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }"},{"lineNumber":96,"author":{"gitId":"-"},"content":""},{"lineNumber":97,"author":{"gitId":"-"},"content":" for (CSVRecord record : records) {"},{"lineNumber":98,"author":{"gitId":"-"},"content":" if (isLineMalformed(record)) {"},{"lineNumber":99,"author":{"gitId":"-"},"content":" continue;"},{"lineNumber":100,"author":{"gitId":"-"},"content":" }"},{"lineNumber":101,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":102,"author":{"gitId":"-"},"content":" processLine(results, record);"},{"lineNumber":103,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {"},{"lineNumber":104,"author":{"gitId":"-"},"content":" logger.warning(String.format(MESSAGE_LINE_PARSE_EXCEPTION_FORMAT, getLineNumber(record),"},{"lineNumber":105,"author":{"gitId":"-"},"content":" csvFilePath.getFileName(), getRowContentAsRawString(record), pe.getMessage()));"},{"lineNumber":106,"author":{"gitId":"-"},"content":" } catch (IllegalArgumentException iae) {"},{"lineNumber":107,"author":{"gitId":"-"},"content":" logger.log(Level.WARNING, iae.getMessage(), iae);"},{"lineNumber":108,"author":{"gitId":"-"},"content":" }"},{"lineNumber":109,"author":{"gitId":"-"},"content":" }"},{"lineNumber":110,"author":{"gitId":"-"},"content":" } catch (IOException ioe) {"},{"lineNumber":111,"author":{"gitId":"-"},"content":" throw new IOException(MESSAGE_UNABLE_TO_READ_CSV_FILE, ioe);"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }"},{"lineNumber":113,"author":{"gitId":"-"},"content":""},{"lineNumber":114,"author":{"gitId":"-"},"content":" if (results.isEmpty()) {"},{"lineNumber":115,"author":{"gitId":"-"},"content":" throw new InvalidCsvException(String.format(MESSAGE_ZERO_VALID_CONFIGS, csvFilePath.getFileName()));"},{"lineNumber":116,"author":{"gitId":"-"},"content":" }"},{"lineNumber":117,"author":{"gitId":"-"},"content":" return results;"},{"lineNumber":118,"author":{"gitId":"-"},"content":" }"},{"lineNumber":119,"author":{"gitId":"-"},"content":""},{"lineNumber":120,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":121,"author":{"gitId":"-"},"content":" * Returns the header of a CSV file, which is assumed to be the first non-empty / non-whitespace line in the file"},{"lineNumber":122,"author":{"gitId":"-"},"content":" * read by {@code reader}."},{"lineNumber":123,"author":{"gitId":"-"},"content":" * The line is split into an array of {@code String}s, using the comma symbol as delimiter."},{"lineNumber":124,"author":{"gitId":"-"},"content":" *"},{"lineNumber":125,"author":{"gitId":"-"},"content":" * @throws IOException if there is an error accessing the file."},{"lineNumber":126,"author":{"gitId":"-"},"content":" * @throws InvalidCsvException if the file has only empty or blank lines."},{"lineNumber":127,"author":{"gitId":"-"},"content":" * @throws InvalidHeaderException if header of csv file cannot be read."},{"lineNumber":128,"author":{"gitId":"-"},"content":" */"},{"lineNumber":129,"author":{"gitId":"-"},"content":" private String[] getHeader(BufferedReader reader) throws IOException, InvalidCsvException, InvalidHeaderException {"},{"lineNumber":130,"author":{"gitId":"-"},"content":" String currentLine \u003d \"\";"},{"lineNumber":131,"author":{"gitId":"-"},"content":""},{"lineNumber":132,"author":{"gitId":"-"},"content":" // read from file until we encounter a line that is neither blank nor empty"},{"lineNumber":133,"author":{"gitId":"-"},"content":" while (currentLine.isEmpty()) {"},{"lineNumber":134,"author":{"gitId":"-"},"content":" currentLine \u003d Optional.ofNullable(reader.readLine())"},{"lineNumber":135,"author":{"gitId":"-"},"content":" .map(String::trim)"},{"lineNumber":136,"author":{"gitId":"-"},"content":" .orElseThrow(() -\u003e new InvalidCsvException(String.format("},{"lineNumber":137,"author":{"gitId":"-"},"content":" MESSAGE_EMPTY_CSV_FORMAT, csvFilePath.getFileName())));"},{"lineNumber":138,"author":{"gitId":"-"},"content":""},{"lineNumber":139,"author":{"gitId":"-"},"content":" numOfLinesBeforeFirstRecord++;"},{"lineNumber":140,"author":{"gitId":"-"},"content":" }"},{"lineNumber":141,"author":{"gitId":"-"},"content":" String[] header \u003d currentLine.split(\",\");"},{"lineNumber":142,"author":{"gitId":"-"},"content":" validateHeader(header);"},{"lineNumber":143,"author":{"gitId":"-"},"content":" return header;"},{"lineNumber":144,"author":{"gitId":"-"},"content":" }"},{"lineNumber":145,"author":{"gitId":"-"},"content":""},{"lineNumber":146,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":147,"author":{"gitId":"-"},"content":" * Returns true if {@code record} does not contain the same number of columns as the header or contains missing"},{"lineNumber":148,"author":{"gitId":"-"},"content":" * values at the mandatory columns in CSV format."},{"lineNumber":149,"author":{"gitId":"-"},"content":" */"},{"lineNumber":150,"author":{"gitId":"-"},"content":" private boolean isLineMalformed(CSVRecord record) {"},{"lineNumber":151,"author":{"gitId":"-"},"content":" if (!record.isConsistent()) {"},{"lineNumber":152,"author":{"gitId":"-"},"content":" logger.warning(String.format(MESSAGE_MALFORMED_LINE_FORMAT, getLineNumber(record),"},{"lineNumber":153,"author":{"gitId":"-"},"content":" csvFilePath.getFileName(), getRowContentAsRawString(record)));"},{"lineNumber":154,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":155,"author":{"gitId":"-"},"content":" }"},{"lineNumber":156,"author":{"gitId":"-"},"content":""},{"lineNumber":157,"author":{"gitId":"-"},"content":" for (String[] equivalentHeaders : mandatoryHeaders()) {"},{"lineNumber":158,"author":{"gitId":"-"},"content":" boolean isLineFormatMalformed \u003d"},{"lineNumber":159,"author":{"gitId":"-"},"content":" Arrays.stream(equivalentHeaders).allMatch(header -\u003e get(record, header).isEmpty());"},{"lineNumber":160,"author":{"gitId":"-"},"content":" if (isLineFormatMalformed) {"},{"lineNumber":161,"author":{"gitId":"-"},"content":" logger.warning(String.format(MESSAGE_MALFORMED_LINE_FORMAT, getLineNumber(record),"},{"lineNumber":162,"author":{"gitId":"-"},"content":" csvFilePath.getFileName(), getRowContentAsRawString(record)));"},{"lineNumber":163,"author":{"gitId":"-"},"content":" return true;"},{"lineNumber":164,"author":{"gitId":"-"},"content":" }"},{"lineNumber":165,"author":{"gitId":"-"},"content":" }"},{"lineNumber":166,"author":{"gitId":"-"},"content":""},{"lineNumber":167,"author":{"gitId":"-"},"content":" return false;"},{"lineNumber":168,"author":{"gitId":"-"},"content":" }"},{"lineNumber":169,"author":{"gitId":"-"},"content":""},{"lineNumber":170,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":171,"author":{"gitId":"-"},"content":" * Returns the value of {@code record} at the column with the header {@code header}."},{"lineNumber":172,"author":{"gitId":"-"},"content":" */"},{"lineNumber":173,"author":{"gitId":"-"},"content":" protected String get(final CSVRecord record, String header) {"},{"lineNumber":174,"author":{"gitId":"-"},"content":" return headerMap.containsKey(header) ? record.get(headerMap.get(header)).trim() : EMPTY_STRING;"},{"lineNumber":175,"author":{"gitId":"-"},"content":" }"},{"lineNumber":176,"author":{"gitId":"-"},"content":""},{"lineNumber":177,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":178,"author":{"gitId":"-"},"content":" * Returns the value of {@code record} at the column that match any of the equivalent headers in"},{"lineNumber":179,"author":{"gitId":"-"},"content":" * {@code equivalentHeaders}."},{"lineNumber":180,"author":{"gitId":"-"},"content":" */"},{"lineNumber":181,"author":{"gitId":"-"},"content":" protected String get(final CSVRecord record, String[] equivalentHeaders) {"},{"lineNumber":182,"author":{"gitId":"-"},"content":" for (String header : equivalentHeaders) {"},{"lineNumber":183,"author":{"gitId":"-"},"content":" if (headerMap.containsKey(header)) {"},{"lineNumber":184,"author":{"gitId":"-"},"content":" return record.get(headerMap.get(header)).trim();"},{"lineNumber":185,"author":{"gitId":"-"},"content":" }"},{"lineNumber":186,"author":{"gitId":"-"},"content":" }"},{"lineNumber":187,"author":{"gitId":"-"},"content":""},{"lineNumber":188,"author":{"gitId":"-"},"content":" return EMPTY_STRING;"},{"lineNumber":189,"author":{"gitId":"-"},"content":" }"},{"lineNumber":190,"author":{"gitId":"-"},"content":""},{"lineNumber":191,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":192,"author":{"gitId":"-"},"content":" * Returns the value of {@code record} at the column that match any of the equivalent headers in"},{"lineNumber":193,"author":{"gitId":"-"},"content":" * {@code equivalentHeaders} if present, or returns {@code defaultValue} otherwise."},{"lineNumber":194,"author":{"gitId":"-"},"content":" */"},{"lineNumber":195,"author":{"gitId":"-"},"content":" protected String getOrDefault(final CSVRecord record, String[] equivalentHeaders, String defaultValue) {"},{"lineNumber":196,"author":{"gitId":"-"},"content":" String value \u003d get(record, equivalentHeaders);"},{"lineNumber":197,"author":{"gitId":"-"},"content":" return value.isEmpty() ? defaultValue : value;"},{"lineNumber":198,"author":{"gitId":"-"},"content":" }"},{"lineNumber":199,"author":{"gitId":"-"},"content":""},{"lineNumber":200,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":201,"author":{"gitId":"-"},"content":" * Returns the value of {@code record} at the column that match any of the equivalent headers in"},{"lineNumber":202,"author":{"gitId":"-"},"content":" * {@code equivalentHeaders} as a {@link List} if it is in {@code record} and not empty."},{"lineNumber":203,"author":{"gitId":"-"},"content":" * The column is delimited by {@code COLUMN_VALUES_SEPARATOR}."},{"lineNumber":204,"author":{"gitId":"-"},"content":" * Returns an empty {@link List} otherwise."},{"lineNumber":205,"author":{"gitId":"-"},"content":" */"},{"lineNumber":206,"author":{"gitId":"-"},"content":" protected List\u003cString\u003e getAsList(final CSVRecord record, String[] equivalentHeaders) {"},{"lineNumber":207,"author":{"gitId":"-"},"content":" String value \u003d get(record, equivalentHeaders);"},{"lineNumber":208,"author":{"gitId":"-"},"content":" if (value.isEmpty()) {"},{"lineNumber":209,"author":{"gitId":"-"},"content":" return Collections.emptyList();"},{"lineNumber":210,"author":{"gitId":"-"},"content":" }"},{"lineNumber":211,"author":{"gitId":"-"},"content":""},{"lineNumber":212,"author":{"gitId":"-"},"content":" return Arrays.stream(value.split(COLUMN_VALUES_SEPARATOR))"},{"lineNumber":213,"author":{"gitId":"-"},"content":" .map(String::trim)"},{"lineNumber":214,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());"},{"lineNumber":215,"author":{"gitId":"-"},"content":" }"},{"lineNumber":216,"author":{"gitId":"-"},"content":""},{"lineNumber":217,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":218,"author":{"gitId":"-"},"content":" * Returns the value of {@code record} at {@code colNum} as a {@code List},"},{"lineNumber":219,"author":{"gitId":"-"},"content":" * delimited by {@code COLUMN_VALUES_SEPARATOR} if it is in {@code record} and not empty, or"},{"lineNumber":220,"author":{"gitId":"-"},"content":" * returns a single element List containing the empty string otherwise."},{"lineNumber":221,"author":{"gitId":"-"},"content":" */"},{"lineNumber":222,"author":{"gitId":"-"},"content":" protected List\u003cString\u003e getAsListOrDefault(final CSVRecord record, String[] equivalentHeaders) {"},{"lineNumber":223,"author":{"gitId":"-"},"content":" List\u003cString\u003e list \u003d getAsList(record, equivalentHeaders);"},{"lineNumber":224,"author":{"gitId":"-"},"content":" return list.isEmpty() ? Collections.singletonList(\"\") : list;"},{"lineNumber":225,"author":{"gitId":"-"},"content":" }"},{"lineNumber":226,"author":{"gitId":"-"},"content":""},{"lineNumber":227,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":228,"author":{"gitId":"-"},"content":" * Returns the values in {@code record} as a list with the {@link CsvParser#OVERRIDE_KEYWORD} prefix removed."},{"lineNumber":229,"author":{"gitId":"-"},"content":" * Returns an empty list if {@code record} at the column that match any of the equivalent headers in"},{"lineNumber":230,"author":{"gitId":"-"},"content":" * {@code equivalentHeaders} is empty."},{"lineNumber":231,"author":{"gitId":"-"},"content":" */"},{"lineNumber":232,"author":{"gitId":"-"},"content":" protected List\u003cString\u003e getAsListWithoutOverridePrefix(final CSVRecord record, String[] equivalentHeaders) {"},{"lineNumber":233,"author":{"gitId":"-"},"content":" List\u003cString\u003e data \u003d getAsList(record, equivalentHeaders);"},{"lineNumber":234,"author":{"gitId":"-"},"content":" if (isElementOverridingStandaloneConfig(record, equivalentHeaders)) {"},{"lineNumber":235,"author":{"gitId":"-"},"content":" data.set(0, data.get(0).replaceFirst(OVERRIDE_KEYWORD, \"\"));"},{"lineNumber":236,"author":{"gitId":"-"},"content":" data.removeIf(String::isEmpty);"},{"lineNumber":237,"author":{"gitId":"-"},"content":" }"},{"lineNumber":238,"author":{"gitId":"-"},"content":""},{"lineNumber":239,"author":{"gitId":"-"},"content":" return data;"},{"lineNumber":240,"author":{"gitId":"-"},"content":" }"},{"lineNumber":241,"author":{"gitId":"-"},"content":""},{"lineNumber":242,"author":{"gitId":"-"},"content":" private long getLineNumber(final CSVRecord record) {"},{"lineNumber":243,"author":{"gitId":"-"},"content":" return record.getRecordNumber() + numOfLinesBeforeFirstRecord;"},{"lineNumber":244,"author":{"gitId":"-"},"content":" }"},{"lineNumber":245,"author":{"gitId":"-"},"content":""},{"lineNumber":246,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":247,"author":{"gitId":"-"},"content":" * Returns true if the {@code record} at the column that match any of the equivalent headers in"},{"lineNumber":248,"author":{"gitId":"-"},"content":" * {@code equivalentHeaders} is prefixed with the override keyword."},{"lineNumber":249,"author":{"gitId":"-"},"content":" */"},{"lineNumber":250,"author":{"gitId":"-"},"content":" protected boolean isElementOverridingStandaloneConfig(final CSVRecord record, String[] equivalentHeaders) {"},{"lineNumber":251,"author":{"gitId":"-"},"content":" return get(record, equivalentHeaders).startsWith(OVERRIDE_KEYWORD);"},{"lineNumber":252,"author":{"gitId":"-"},"content":" }"},{"lineNumber":253,"author":{"gitId":"-"},"content":""},{"lineNumber":254,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":255,"author":{"gitId":"-"},"content":" * Returns the contents of {@code record} as a raw string."},{"lineNumber":256,"author":{"gitId":"-"},"content":" */"},{"lineNumber":257,"author":{"gitId":"-"},"content":" private String getRowContentAsRawString(final CSVRecord record) {"},{"lineNumber":258,"author":{"gitId":"-"},"content":" StringJoiner inputRowString \u003d new StringJoiner(\",\");"},{"lineNumber":259,"author":{"gitId":"-"},"content":" for (String value : record) {"},{"lineNumber":260,"author":{"gitId":"-"},"content":" inputRowString.add(value);"},{"lineNumber":261,"author":{"gitId":"-"},"content":" }"},{"lineNumber":262,"author":{"gitId":"-"},"content":" String contentAsString \u003d inputRowString.toString();"},{"lineNumber":263,"author":{"gitId":"-"},"content":" return (contentAsString.trim().isEmpty()) ? MESSAGE_EMPTY_LINE : contentAsString;"},{"lineNumber":264,"author":{"gitId":"-"},"content":" }"},{"lineNumber":265,"author":{"gitId":"-"},"content":""},{"lineNumber":266,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":267,"author":{"gitId":"-"},"content":" * Generates map of column header to position number for input {@code possibleHeader}."},{"lineNumber":268,"author":{"gitId":"-"},"content":" *"},{"lineNumber":269,"author":{"gitId":"-"},"content":" * @throws InvalidCsvException if {@code possibleHeader} does not contain all the mandatory headers."},{"lineNumber":270,"author":{"gitId":"-"},"content":" * @throws InvalidHeaderException if a column in {@code possibleHeader} cannot be parsed."},{"lineNumber":271,"author":{"gitId":"-"},"content":" */"},{"lineNumber":272,"author":{"gitId":"-"},"content":" private void validateHeader(String[] possibleHeader) throws InvalidCsvException, InvalidHeaderException {"},{"lineNumber":273,"author":{"gitId":"-"},"content":" int headerSize \u003d possibleHeader.length;"},{"lineNumber":274,"author":{"gitId":"-"},"content":" Set\u003cString\u003e knownColumns \u003d new HashSet\u003c\u003e();"},{"lineNumber":275,"author":{"gitId":"-"},"content":" ArrayList\u003cString\u003e unknownColumns \u003d new ArrayList\u003c\u003e();"},{"lineNumber":276,"author":{"gitId":"-"},"content":" List\u003cString\u003e parsedHeaders \u003d mandatoryAndOptionalHeaders();"},{"lineNumber":277,"author":{"gitId":"-"},"content":""},{"lineNumber":278,"author":{"gitId":"-"},"content":" for (int i \u003d 0; i \u003c headerSize; i++) {"},{"lineNumber":279,"author":{"gitId":"-"},"content":" String possible \u003d possibleHeader[i].trim();"},{"lineNumber":280,"author":{"gitId":"-"},"content":" for (String parsedHeader : parsedHeaders) {"},{"lineNumber":281,"author":{"gitId":"-"},"content":" if (possible.equalsIgnoreCase(parsedHeader)) {"},{"lineNumber":282,"author":{"gitId":"-"},"content":" headerMap.put(parsedHeader, i);"},{"lineNumber":283,"author":{"gitId":"-"},"content":" knownColumns.add(possible);"},{"lineNumber":284,"author":{"gitId":"-"},"content":" break;"},{"lineNumber":285,"author":{"gitId":"-"},"content":" }"},{"lineNumber":286,"author":{"gitId":"-"},"content":" }"},{"lineNumber":287,"author":{"gitId":"-"},"content":""},{"lineNumber":288,"author":{"gitId":"-"},"content":" if (!knownColumns.contains(possible)) {"},{"lineNumber":289,"author":{"gitId":"-"},"content":" unknownColumns.add(possible);"},{"lineNumber":290,"author":{"gitId":"-"},"content":" }"},{"lineNumber":291,"author":{"gitId":"-"},"content":" }"},{"lineNumber":292,"author":{"gitId":"-"},"content":""},{"lineNumber":293,"author":{"gitId":"-"},"content":" if (unknownColumns.size() \u003e 0) {"},{"lineNumber":294,"author":{"gitId":"-"},"content":" String errorMessage \u003d String.join(\", \", unknownColumns);"},{"lineNumber":295,"author":{"gitId":"-"},"content":" throw new InvalidHeaderException("},{"lineNumber":296,"author":{"gitId":"-"},"content":" String.format(MESSAGE_UNKNOWN_COLUMN, errorMessage, csvFilePath.toString()));"},{"lineNumber":297,"author":{"gitId":"-"},"content":" }"},{"lineNumber":298,"author":{"gitId":"-"},"content":""},{"lineNumber":299,"author":{"gitId":"-"},"content":" for (String[] equivalentHeaders : mandatoryHeaders()) {"},{"lineNumber":300,"author":{"gitId":"-"},"content":" boolean isAnyEquivalentHeaderPresent \u003d"},{"lineNumber":301,"author":{"gitId":"-"},"content":" Arrays.stream(equivalentHeaders).anyMatch(header -\u003e headerMap.containsKey(header));"},{"lineNumber":302,"author":{"gitId":"-"},"content":""},{"lineNumber":303,"author":{"gitId":"-"},"content":" if (!isAnyEquivalentHeaderPresent) {"},{"lineNumber":304,"author":{"gitId":"-"},"content":" throw new InvalidCsvException(String.format("},{"lineNumber":305,"author":{"gitId":"-"},"content":" MESSAGE_MANDATORY_HEADER_MISSING, Arrays.toString(equivalentHeaders),"},{"lineNumber":306,"author":{"gitId":"-"},"content":" csvFilePath.getFileName()));"},{"lineNumber":307,"author":{"gitId":"-"},"content":" }"},{"lineNumber":308,"author":{"gitId":"-"},"content":" }"},{"lineNumber":309,"author":{"gitId":"-"},"content":""},{"lineNumber":310,"author":{"gitId":"-"},"content":" logger.info(String.format(MESSAGE_COLUMNS_RECOGNIZED, csvFilePath.getFileName(),"},{"lineNumber":311,"author":{"gitId":"-"},"content":" String.join(\", \", headerMap.keySet())));"},{"lineNumber":312,"author":{"gitId":"-"},"content":" }"},{"lineNumber":313,"author":{"gitId":"-"},"content":""},{"lineNumber":314,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":315,"author":{"gitId":"-"},"content":" * Gets the list of headers that are mandatory for verification."},{"lineNumber":316,"author":{"gitId":"-"},"content":" */"},{"lineNumber":317,"author":{"gitId":"-"},"content":" protected abstract String[][] mandatoryHeaders();"},{"lineNumber":318,"author":{"gitId":"-"},"content":""},{"lineNumber":319,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":320,"author":{"gitId":"-"},"content":" * Gets the list of optional headers that can be parsed."},{"lineNumber":321,"author":{"gitId":"-"},"content":" */"},{"lineNumber":322,"author":{"gitId":"-"},"content":" protected abstract String[][] optionalHeaders();"},{"lineNumber":323,"author":{"gitId":"-"},"content":""},{"lineNumber":324,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":325,"author":{"gitId":"-"},"content":" * Gets the list of all mandatory and optional headers that can be parsed."},{"lineNumber":326,"author":{"gitId":"-"},"content":" */"},{"lineNumber":327,"author":{"gitId":"-"},"content":" protected List\u003cString\u003e mandatoryAndOptionalHeaders() {"},{"lineNumber":328,"author":{"gitId":"-"},"content":" return Stream.concat(Arrays.stream(mandatoryHeaders()), Arrays.stream(optionalHeaders()))"},{"lineNumber":329,"author":{"gitId":"-"},"content":" .flatMap(Stream::of)"},{"lineNumber":330,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());"},{"lineNumber":331,"author":{"gitId":"-"},"content":" }"},{"lineNumber":332,"author":{"gitId":"-"},"content":""},{"lineNumber":333,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":334,"author":{"gitId":"-"},"content":" * Processes the csv file line by line."},{"lineNumber":335,"author":{"gitId":"-"},"content":" * All {@link CsvParser}s must use {@link CsvParser#get}, {@link CsvParser#getOrDefault},"},{"lineNumber":336,"author":{"gitId":"-"},"content":" * {@link CsvParser#getAsList} or {@link CsvParser#getAsListWithoutOverridePrefix} to read contents in"},{"lineNumber":337,"author":{"gitId":"-"},"content":" * {@code record} and add created objects into {@code results}."},{"lineNumber":338,"author":{"gitId":"-"},"content":" *"},{"lineNumber":339,"author":{"gitId":"-"},"content":" * @throws ParseException if any line does not get read successfully."},{"lineNumber":340,"author":{"gitId":"-"},"content":" */"},{"lineNumber":341,"author":{"gitId":"-"},"content":" protected abstract void processLine(List\u003cT\u003e results, final CSVRecord record) throws ParseException;"},{"lineNumber":342,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":3,"-":339}},{"path":"src/main/java/reposense/parser/GroupConfigCsvParser.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.parser;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.FileNotFoundException;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.apache.commons.csv.CSVRecord;"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"import reposense.model.FileType;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import reposense.model.GroupConfiguration;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import reposense.model.RepoLocation;"},{"lineNumber":12,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidLocationException;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Container for the values parsed from {@code group-config.csv} file."},{"lineNumber":16,"author":{"gitId":"-"},"content":" */"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class GroupConfigCsvParser extends CsvParser\u003cGroupConfiguration\u003e {"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String GROUP_CONFIG_FILENAME \u003d \"group-config.csv\";"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Positions of the elements of a line in group-config.csv config file"},{"lineNumber":22,"author":{"gitId":"-"},"content":" */"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final String[] LOCATION_HEADER \u003d {\"Repository\u0027s Location\"};"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final String[] GROUP_NAME_HEADER \u003d {\"Group Name\"};"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String[] FILES_GLOB_HEADER \u003d {\"Globs\"};"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"-"},"content":" public GroupConfigCsvParser(Path csvFilePath) throws FileNotFoundException {"},{"lineNumber":28,"author":{"gitId":"-"},"content":" super(csvFilePath);"},{"lineNumber":29,"author":{"gitId":"-"},"content":" }"},{"lineNumber":30,"author":{"gitId":"-"},"content":""},{"lineNumber":31,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Gets the list of headers that are mandatory for verification."},{"lineNumber":33,"author":{"gitId":"-"},"content":" */"},{"lineNumber":34,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":35,"author":{"gitId":"-"},"content":" protected String[][] mandatoryHeaders() {"},{"lineNumber":36,"author":{"gitId":"-"},"content":" return new String[][] {"},{"lineNumber":37,"author":{"gitId":"-"},"content":" GROUP_NAME_HEADER, FILES_GLOB_HEADER,"},{"lineNumber":38,"author":{"gitId":"-"},"content":" };"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * Gets the list of optional headers that can be parsed."},{"lineNumber":43,"author":{"gitId":"-"},"content":" */"},{"lineNumber":44,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":45,"author":{"gitId":"-"},"content":" protected String[][] optionalHeaders() {"},{"lineNumber":46,"author":{"gitId":"-"},"content":" return new String[][] {"},{"lineNumber":47,"author":{"gitId":"-"},"content":" LOCATION_HEADER,"},{"lineNumber":48,"author":{"gitId":"-"},"content":" };"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":52,"author":{"gitId":"-"},"content":" * Processes the csv {@code record} line by line and adds created {@link GroupConfiguration} into {@code results}."},{"lineNumber":53,"author":{"gitId":"-"},"content":" */"},{"lineNumber":54,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":55,"author":{"gitId":"-"},"content":" protected void processLine(List\u003cGroupConfiguration\u003e results, CSVRecord record) throws InvalidLocationException {"},{"lineNumber":56,"author":{"gitId":"-"},"content":" String location \u003d get(record, LOCATION_HEADER);"},{"lineNumber":57,"author":{"gitId":"-"},"content":" String groupName \u003d get(record, GROUP_NAME_HEADER);"},{"lineNumber":58,"author":{"gitId":"-"},"content":" List\u003cString\u003e globList \u003d getAsList(record, FILES_GLOB_HEADER);"},{"lineNumber":59,"author":{"gitId":"-"},"content":""},{"lineNumber":60,"author":{"gitId":"-"},"content":" GroupConfiguration groupConfig \u003d null;"},{"lineNumber":61,"author":{"gitId":"-"},"content":" groupConfig \u003d findMatchingGroupConfiguration(results, location);"},{"lineNumber":62,"author":{"gitId":"-"},"content":""},{"lineNumber":63,"author":{"gitId":"-"},"content":" FileType group \u003d new FileType(groupName, globList);"},{"lineNumber":64,"author":{"gitId":"-"},"content":" if (groupConfig.containsGroup(group)) {"},{"lineNumber":65,"author":{"gitId":"-"},"content":" logger.warning(String.format("},{"lineNumber":66,"author":{"gitId":"-"},"content":" \"Skipping group as %s has already been specified for the repository %s\","},{"lineNumber":67,"author":{"gitId":"-"},"content":" group.toString(), groupConfig.getLocation()));"},{"lineNumber":68,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }"},{"lineNumber":70,"author":{"gitId":"-"},"content":""},{"lineNumber":71,"author":{"gitId":"-"},"content":" groupConfig.addGroup(group);"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }"},{"lineNumber":73,"author":{"gitId":"-"},"content":""},{"lineNumber":74,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":75,"author":{"gitId":"-"},"content":" * Gets an existing {@link GroupConfiguration} from {@code results} if {@code location} matches."},{"lineNumber":76,"author":{"gitId":"-"},"content":" * Otherwise, adds a newly created {@link GroupConfiguration} into {@code results} and returns it."},{"lineNumber":77,"author":{"gitId":"-"},"content":" *"},{"lineNumber":78,"author":{"gitId":"-"},"content":" * @throws InvalidLocationException if {@code location} is invalid."},{"lineNumber":79,"author":{"gitId":"-"},"content":" */"},{"lineNumber":80,"author":{"gitId":"-"},"content":" private static GroupConfiguration findMatchingGroupConfiguration(List\u003cGroupConfiguration\u003e results,"},{"lineNumber":81,"author":{"gitId":"-"},"content":" String location) throws InvalidLocationException {"},{"lineNumber":82,"author":{"gitId":"-"},"content":" GroupConfiguration config \u003d new GroupConfiguration(new RepoLocation(location));"},{"lineNumber":83,"author":{"gitId":"-"},"content":""},{"lineNumber":84,"author":{"gitId":"-"},"content":" for (GroupConfiguration groupConfig : results) {"},{"lineNumber":85,"author":{"gitId":"-"},"content":" if (groupConfig.getLocation().equals(config.getLocation())) {"},{"lineNumber":86,"author":{"gitId":"-"},"content":" return groupConfig;"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }"},{"lineNumber":89,"author":{"gitId":"-"},"content":""},{"lineNumber":90,"author":{"gitId":"-"},"content":" results.add(config);"},{"lineNumber":91,"author":{"gitId":"-"},"content":" return config;"},{"lineNumber":92,"author":{"gitId":"-"},"content":" }"},{"lineNumber":93,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":92}},{"path":"src/main/java/reposense/parser/RepoConfigCsvParser.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.parser;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.FileNotFoundException;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.apache.commons.csv.CSVRecord;"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"import reposense.model.CommitHash;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import reposense.model.FileType;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import reposense.model.RepoConfiguration;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import reposense.model.RepoLocation;"},{"lineNumber":13,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidLocationException;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import reposense.util.FileUtil;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import reposense.util.StringsUtil;"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":18,"author":{"gitId":"-"},"content":" * Container for the values parsed from {@code repo-config.csv} file."},{"lineNumber":19,"author":{"gitId":"-"},"content":" */"},{"lineNumber":20,"author":{"gitId":"-"},"content":"public class RepoConfigCsvParser extends CsvParser\u003cRepoConfiguration\u003e {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public static final String REPO_CONFIG_FILENAME \u003d \"repo-config.csv\";"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final String IGNORE_STANDALONE_CONFIG_KEYWORD \u003d \"yes\";"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final String IGNORE_FILESIZE_LIMIT_KEYWORD \u003d \"yes\";"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final String SKIP_IGNORED_FILE_ANALYSIS_KEYWORD \u003d \"yes\";"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String SHALLOW_CLONING_CONFIG_KEYWORD \u003d \"yes\";"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final String FIND_PREVIOUS_AUTHORS_KEYWORD \u003d \"yes\";"},{"lineNumber":27,"author":{"gitId":"-"},"content":""},{"lineNumber":28,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":29,"author":{"gitId":"-"},"content":" * Positions of the elements of a line in repo-config.csv config file"},{"lineNumber":30,"author":{"gitId":"-"},"content":" */"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final String[] LOCATION_HEADER \u003d {\"Repository\u0027s Location\"};"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final String[] BRANCH_HEADER \u003d {\"Branch\"};"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final String[] FILE_FORMATS_HEADER \u003d {\"File formats\"};"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final String[] IGNORE_GLOB_LIST_HEADER \u003d {\"Ignore Glob List\"};"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private static final String[] IGNORE_STANDALONE_CONFIG_HEADER \u003d {\"Ignore Standalone Config\"};"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private static final String[] IGNORE_FILESIZE_LIMIT_HEADER \u003d {\"Ignore File Size Limit\"};"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private static final String[] IGNORE_COMMIT_LIST_CONFIG_HEADER \u003d {\"Ignore Commits List\"};"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private static final String[] IGNORE_AUTHOR_LIST_CONFIG_HEADER \u003d {\"Ignore Authors List\"};"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private static final String[] SKIP_IGNORED_FILE_ANALYSIS_HEADER \u003d {\"Skip Ignored File Analysis\"};"},{"lineNumber":40,"author":{"gitId":"-"},"content":" private static final String[] SHALLOW_CLONING_CONFIG_HEADER \u003d {\"Shallow Cloning\"};"},{"lineNumber":41,"author":{"gitId":"-"},"content":" private static final String[] FIND_PREVIOUS_AUTHORS_CONFIG_HEADER \u003d {\"Find Previous Authors\"};"},{"lineNumber":42,"author":{"gitId":"-"},"content":" private static final String[] FILESIZE_LIMIT_HEADER \u003d {\"File Size Limit\"};"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":" public RepoConfigCsvParser(Path csvFilePath) throws FileNotFoundException {"},{"lineNumber":45,"author":{"gitId":"-"},"content":" super(csvFilePath);"},{"lineNumber":46,"author":{"gitId":"-"},"content":" }"},{"lineNumber":47,"author":{"gitId":"-"},"content":""},{"lineNumber":48,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":49,"author":{"gitId":"-"},"content":" * Gets the list of headers that are mandatory for verification."},{"lineNumber":50,"author":{"gitId":"-"},"content":" */"},{"lineNumber":51,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":52,"author":{"gitId":"-"},"content":" protected String[][] mandatoryHeaders() {"},{"lineNumber":53,"author":{"gitId":"-"},"content":" return new String[][] {"},{"lineNumber":54,"author":{"gitId":"-"},"content":" LOCATION_HEADER,"},{"lineNumber":55,"author":{"gitId":"-"},"content":" };"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }"},{"lineNumber":57,"author":{"gitId":"-"},"content":""},{"lineNumber":58,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * Gets the list of optional headers that can be parsed."},{"lineNumber":60,"author":{"gitId":"-"},"content":" */"},{"lineNumber":61,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":62,"author":{"gitId":"-"},"content":" protected String[][] optionalHeaders() {"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return new String[][] {"},{"lineNumber":64,"author":{"gitId":"-"},"content":" BRANCH_HEADER, FILE_FORMATS_HEADER, IGNORE_GLOB_LIST_HEADER, IGNORE_STANDALONE_CONFIG_HEADER,"},{"lineNumber":65,"author":{"gitId":"-"},"content":" IGNORE_FILESIZE_LIMIT_HEADER, IGNORE_COMMIT_LIST_CONFIG_HEADER, IGNORE_AUTHOR_LIST_CONFIG_HEADER,"},{"lineNumber":66,"author":{"gitId":"-"},"content":" SHALLOW_CLONING_CONFIG_HEADER, FIND_PREVIOUS_AUTHORS_CONFIG_HEADER, FILESIZE_LIMIT_HEADER,"},{"lineNumber":67,"author":{"gitId":"-"},"content":" SKIP_IGNORED_FILE_ANALYSIS_HEADER"},{"lineNumber":68,"author":{"gitId":"-"},"content":" };"},{"lineNumber":69,"author":{"gitId":"-"},"content":" }"},{"lineNumber":70,"author":{"gitId":"-"},"content":""},{"lineNumber":71,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":72,"author":{"gitId":"-"},"content":" * Processes the csv {@code record} line by line and add created {@link RepoConfiguration} into {@code results} but"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * ignores duplicated {@link RepoConfiguration} if there exists one that has same {@code location} and"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * {@code branch}."},{"lineNumber":75,"author":{"gitId":"-"},"content":" *"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * @throws InvalidLocationException if the location represented in {@code record} is invalid."},{"lineNumber":77,"author":{"gitId":"-"},"content":" */"},{"lineNumber":78,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":79,"author":{"gitId":"-"},"content":" protected void processLine(List\u003cRepoConfiguration\u003e results, CSVRecord record) throws InvalidLocationException {"},{"lineNumber":80,"author":{"gitId":"-"},"content":" // The variable expansion is performed to simulate running the same location from command line."},{"lineNumber":81,"author":{"gitId":"-"},"content":" // This helps to support things like tilde expansion and other Bash/CMD features."},{"lineNumber":82,"author":{"gitId":"-"},"content":" RepoLocation location \u003d new RepoLocation(FileUtil.getVariableExpandedFilePath(get(record, LOCATION_HEADER)));"},{"lineNumber":83,"author":{"gitId":"-"},"content":" String branch \u003d getOrDefault(record, BRANCH_HEADER, RepoConfiguration.DEFAULT_BRANCH);"},{"lineNumber":84,"author":{"gitId":"-"},"content":""},{"lineNumber":85,"author":{"gitId":"-"},"content":" boolean isFormatsOverriding \u003d isElementOverridingStandaloneConfig(record, FILE_FORMATS_HEADER);"},{"lineNumber":86,"author":{"gitId":"-"},"content":" List\u003cFileType\u003e formats \u003d FileType.convertFormatStringsToFileTypes("},{"lineNumber":87,"author":{"gitId":"-"},"content":" getAsListWithoutOverridePrefix(record, FILE_FORMATS_HEADER));"},{"lineNumber":88,"author":{"gitId":"-"},"content":""},{"lineNumber":89,"author":{"gitId":"-"},"content":" boolean isIgnoreGlobListOverriding \u003d isElementOverridingStandaloneConfig(record, IGNORE_GLOB_LIST_HEADER);"},{"lineNumber":90,"author":{"gitId":"-"},"content":" List\u003cString\u003e ignoreGlobList \u003d getAsListWithoutOverridePrefix(record, IGNORE_GLOB_LIST_HEADER);"},{"lineNumber":91,"author":{"gitId":"-"},"content":""},{"lineNumber":92,"author":{"gitId":"-"},"content":" boolean isIgnoreCommitListOverriding \u003d"},{"lineNumber":93,"author":{"gitId":"-"},"content":" isElementOverridingStandaloneConfig(record, IGNORE_COMMIT_LIST_CONFIG_HEADER);"},{"lineNumber":94,"author":{"gitId":"-"},"content":" List\u003cCommitHash\u003e ignoreCommitList \u003d CommitHash.convertStringsToCommits("},{"lineNumber":95,"author":{"gitId":"-"},"content":" getAsListWithoutOverridePrefix(record, IGNORE_COMMIT_LIST_CONFIG_HEADER));"},{"lineNumber":96,"author":{"gitId":"-"},"content":""},{"lineNumber":97,"author":{"gitId":"-"},"content":" boolean isIgnoredAuthorsListOverriding \u003d"},{"lineNumber":98,"author":{"gitId":"-"},"content":" isElementOverridingStandaloneConfig(record, IGNORE_AUTHOR_LIST_CONFIG_HEADER);"},{"lineNumber":99,"author":{"gitId":"-"},"content":" List\u003cString\u003e ignoredAuthorsList \u003d getAsListWithoutOverridePrefix(record, IGNORE_AUTHOR_LIST_CONFIG_HEADER);"},{"lineNumber":100,"author":{"gitId":"-"},"content":""},{"lineNumber":101,"author":{"gitId":"-"},"content":" boolean isFileSizeLimitIgnored \u003d matchValueAndKeyword(record, IGNORE_FILESIZE_LIMIT_HEADER,"},{"lineNumber":102,"author":{"gitId":"-"},"content":" IGNORE_FILESIZE_LIMIT_KEYWORD);"},{"lineNumber":103,"author":{"gitId":"-"},"content":""},{"lineNumber":104,"author":{"gitId":"-"},"content":" boolean isIgnoredFileAnalysisSkipped \u003d matchValueAndKeyword(record, SKIP_IGNORED_FILE_ANALYSIS_HEADER,"},{"lineNumber":105,"author":{"gitId":"-"},"content":" SKIP_IGNORED_FILE_ANALYSIS_KEYWORD);"},{"lineNumber":106,"author":{"gitId":"-"},"content":""},{"lineNumber":107,"author":{"gitId":"-"},"content":" if (isFileSizeLimitIgnored \u0026\u0026 isIgnoredFileAnalysisSkipped) {"},{"lineNumber":108,"author":{"gitId":"-"},"content":" logger.warning(\"Ignoring skip ignored file analysis column since file size limit is ignored\");"},{"lineNumber":109,"author":{"gitId":"-"},"content":" isIgnoredFileAnalysisSkipped \u003d false;"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }"},{"lineNumber":111,"author":{"gitId":"-"},"content":""},{"lineNumber":112,"author":{"gitId":"-"},"content":" boolean isFileSizeLimitOverriding \u003d isElementOverridingStandaloneConfig(record, FILESIZE_LIMIT_HEADER);"},{"lineNumber":113,"author":{"gitId":"-"},"content":" List\u003cString\u003e fileSizeLimitStringList \u003d getAsListWithoutOverridePrefix(record, FILESIZE_LIMIT_HEADER);"},{"lineNumber":114,"author":{"gitId":"-"},"content":" long fileSizeLimit \u003d RepoConfiguration.DEFAULT_FILE_SIZE_LIMIT;"},{"lineNumber":115,"author":{"gitId":"-"},"content":""},{"lineNumber":116,"author":{"gitId":"-"},"content":" // If file diff limit is specified"},{"lineNumber":117,"author":{"gitId":"-"},"content":" if (fileSizeLimitStringList.size() \u003e 0) {"},{"lineNumber":118,"author":{"gitId":"asdfghjkxd"},"content":" String fileSizeLimitString \u003d fileSizeLimitStringList.get(0).trim();"},{"lineNumber":119,"author":{"gitId":"asdfghjkxd"},"content":" int parseValue;"},{"lineNumber":120,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":121,"author":{"gitId":"-"},"content":" if (isFileSizeLimitIgnored) {"},{"lineNumber":122,"author":{"gitId":"-"},"content":" logger.warning(\"Ignoring file size limit column since file size limit is ignored\");"},{"lineNumber":123,"author":{"gitId":"-"},"content":" isFileSizeLimitOverriding \u003d false;"},{"lineNumber":124,"author":{"gitId":"asdfghjkxd"},"content":" } else if (!StringsUtil.isNumeric(fileSizeLimitString)"},{"lineNumber":125,"author":{"gitId":"-"},"content":" || (parseValue \u003d Integer.parseInt(fileSizeLimitString)) \u003c\u003d 0) {"},{"lineNumber":126,"author":{"gitId":"-"},"content":" logger.warning(String.format(\"Values in \\\"%s\\\" column should be positive integers.\","},{"lineNumber":127,"author":{"gitId":"-"},"content":" FILESIZE_LIMIT_HEADER[0]));"},{"lineNumber":128,"author":{"gitId":"-"},"content":" isFileSizeLimitOverriding \u003d false;"},{"lineNumber":129,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":130,"author":{"gitId":"-"},"content":" fileSizeLimit \u003d parseValue;"},{"lineNumber":131,"author":{"gitId":"-"},"content":" }"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }"},{"lineNumber":133,"author":{"gitId":"-"},"content":""},{"lineNumber":134,"author":{"gitId":"-"},"content":" boolean isStandaloneConfigIgnored \u003d matchValueAndKeyword(record, IGNORE_STANDALONE_CONFIG_HEADER,"},{"lineNumber":135,"author":{"gitId":"-"},"content":" IGNORE_STANDALONE_CONFIG_KEYWORD);"},{"lineNumber":136,"author":{"gitId":"-"},"content":""},{"lineNumber":137,"author":{"gitId":"-"},"content":" boolean isShallowCloningPerformed \u003d matchValueAndKeyword(record, SHALLOW_CLONING_CONFIG_HEADER,"},{"lineNumber":138,"author":{"gitId":"-"},"content":" SHALLOW_CLONING_CONFIG_KEYWORD);"},{"lineNumber":139,"author":{"gitId":"-"},"content":""},{"lineNumber":140,"author":{"gitId":"-"},"content":" boolean isFindingPreviousAuthorsPerformed \u003d matchValueAndKeyword(record, FIND_PREVIOUS_AUTHORS_CONFIG_HEADER,"},{"lineNumber":141,"author":{"gitId":"-"},"content":" FIND_PREVIOUS_AUTHORS_KEYWORD);"},{"lineNumber":142,"author":{"gitId":"-"},"content":""},{"lineNumber":143,"author":{"gitId":"-"},"content":" addConfig(results, location, branch, isFormatsOverriding, formats, isIgnoreGlobListOverriding, ignoreGlobList,"},{"lineNumber":144,"author":{"gitId":"-"},"content":" isIgnoreCommitListOverriding, ignoreCommitList, isIgnoredAuthorsListOverriding, ignoredAuthorsList,"},{"lineNumber":145,"author":{"gitId":"-"},"content":" isFileSizeLimitIgnored, isIgnoredFileAnalysisSkipped, isFileSizeLimitOverriding, fileSizeLimit,"},{"lineNumber":146,"author":{"gitId":"-"},"content":" isStandaloneConfigIgnored, isShallowCloningPerformed, isFindingPreviousAuthorsPerformed);"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }"},{"lineNumber":148,"author":{"gitId":"-"},"content":""},{"lineNumber":149,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":150,"author":{"gitId":"-"},"content":" * Returns true if value from {@code record}, that matches any of the equivalent headers in"},{"lineNumber":151,"author":{"gitId":"-"},"content":" * {@code equivalentHeaders}, is the same as the given {@code keyword}, else false."},{"lineNumber":152,"author":{"gitId":"-"},"content":" */"},{"lineNumber":153,"author":{"gitId":"-"},"content":" private boolean matchValueAndKeyword(CSVRecord record, String[] equivalentHeaders, String keyword) {"},{"lineNumber":154,"author":{"gitId":"-"},"content":" String value \u003d get(record, equivalentHeaders);"},{"lineNumber":155,"author":{"gitId":"-"},"content":" boolean isIgnored \u003d value.equalsIgnoreCase(keyword);"},{"lineNumber":156,"author":{"gitId":"-"},"content":""},{"lineNumber":157,"author":{"gitId":"-"},"content":" if (!isIgnored \u0026\u0026 !value.isEmpty()) {"},{"lineNumber":158,"author":{"gitId":"-"},"content":" logger.warning(String.format(\"Ignoring unknown value %s in %s column.\", value, keyword.toLowerCase()));"},{"lineNumber":159,"author":{"gitId":"-"},"content":" }"},{"lineNumber":160,"author":{"gitId":"-"},"content":""},{"lineNumber":161,"author":{"gitId":"-"},"content":" return isIgnored;"},{"lineNumber":162,"author":{"gitId":"-"},"content":" }"},{"lineNumber":163,"author":{"gitId":"-"},"content":""},{"lineNumber":164,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":165,"author":{"gitId":"-"},"content":" * Creates a new {@link RepoConfiguration} with the supplied inputs and attempts to add it to {@code results}."},{"lineNumber":166,"author":{"gitId":"-"},"content":" * Does nothing if the repo already exists in {@code results}."},{"lineNumber":167,"author":{"gitId":"-"},"content":" */"},{"lineNumber":168,"author":{"gitId":"-"},"content":" private void addConfig(List\u003cRepoConfiguration\u003e results, RepoLocation location, String branch,"},{"lineNumber":169,"author":{"gitId":"-"},"content":" boolean isFormatsOverriding, List\u003cFileType\u003e formats, boolean isIgnoreGlobListOverriding,"},{"lineNumber":170,"author":{"gitId":"-"},"content":" List\u003cString\u003e ignoreGlobList, boolean isIgnoreCommitListOverriding, List\u003cCommitHash\u003e ignoreCommitList,"},{"lineNumber":171,"author":{"gitId":"-"},"content":" boolean isIgnoredAuthorsListOverriding, List\u003cString\u003e ignoredAuthorsList, boolean isFileSizeLimitIgnored,"},{"lineNumber":172,"author":{"gitId":"-"},"content":" boolean isIgnoredFileAnalysisSkipped, boolean isFileSizeLimitOverriding, long fileSizeLimit,"},{"lineNumber":173,"author":{"gitId":"-"},"content":" boolean isStandaloneConfigIgnored, boolean isShallowCloningPerformed,"},{"lineNumber":174,"author":{"gitId":"-"},"content":" boolean isFindingPreviousAuthorsPerformed) {"},{"lineNumber":175,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration config \u003d new RepoConfiguration.Builder()"},{"lineNumber":176,"author":{"gitId":"asdfghjkxd"},"content":" .location(location)"},{"lineNumber":177,"author":{"gitId":"asdfghjkxd"},"content":" .branch(branch)"},{"lineNumber":178,"author":{"gitId":"asdfghjkxd"},"content":" .fileTypeManager(formats)"},{"lineNumber":179,"author":{"gitId":"asdfghjkxd"},"content":" .ignoreGlobList(ignoreGlobList)"},{"lineNumber":180,"author":{"gitId":"asdfghjkxd"},"content":" .fileSizeLimit(fileSizeLimit)"},{"lineNumber":181,"author":{"gitId":"asdfghjkxd"},"content":" .isStandaloneConfigIgnored(isStandaloneConfigIgnored)"},{"lineNumber":182,"author":{"gitId":"asdfghjkxd"},"content":" .isFileSizeLimitIgnored(isFileSizeLimitIgnored)"},{"lineNumber":183,"author":{"gitId":"asdfghjkxd"},"content":" .ignoreCommitList(ignoreCommitList)"},{"lineNumber":184,"author":{"gitId":"asdfghjkxd"},"content":" .isFormatsOverriding(isFormatsOverriding)"},{"lineNumber":185,"author":{"gitId":"asdfghjkxd"},"content":" .isIgnoreGlobListOverriding(isIgnoreGlobListOverriding)"},{"lineNumber":186,"author":{"gitId":"asdfghjkxd"},"content":" .isIgnoreCommitListOverriding(isIgnoreCommitListOverriding)"},{"lineNumber":187,"author":{"gitId":"asdfghjkxd"},"content":" .isFileSizeLimitOverriding(isFileSizeLimitOverriding)"},{"lineNumber":188,"author":{"gitId":"asdfghjkxd"},"content":" .isShallowCloningPerformed(isShallowCloningPerformed)"},{"lineNumber":189,"author":{"gitId":"asdfghjkxd"},"content":" .isFindingPreviousAuthorsPerformed(isFindingPreviousAuthorsPerformed)"},{"lineNumber":190,"author":{"gitId":"asdfghjkxd"},"content":" .isIgnoredFileAnalysisSkipped(isIgnoredFileAnalysisSkipped)"},{"lineNumber":191,"author":{"gitId":"asdfghjkxd"},"content":" .ignoredAuthorsList(ignoredAuthorsList)"},{"lineNumber":192,"author":{"gitId":"asdfghjkxd"},"content":" .isIgnoredAuthorsListOverriding(isIgnoredAuthorsListOverriding)"},{"lineNumber":193,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":194,"author":{"gitId":"-"},"content":""},{"lineNumber":195,"author":{"gitId":"-"},"content":" if (results.contains(config)) {"},{"lineNumber":196,"author":{"gitId":"-"},"content":" logger.warning(\"Ignoring duplicated repository \" + location + \" \" + branch);"},{"lineNumber":197,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":198,"author":{"gitId":"-"},"content":" }"},{"lineNumber":199,"author":{"gitId":"-"},"content":""},{"lineNumber":200,"author":{"gitId":"-"},"content":" results.add(config);"},{"lineNumber":201,"author":{"gitId":"-"},"content":" }"},{"lineNumber":202,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":24,"-":178}},{"path":"src/main/java/reposense/parser/exceptions/InvalidCsvException.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.exceptions;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Signals that there is a major error in a CSV file (e.g. wrong number of columns, zero valid records)."},{"lineNumber":5,"author":{"gitId":"-"},"content":" */"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class InvalidCsvException extends Exception {"},{"lineNumber":7,"author":{"gitId":"-"},"content":" public InvalidCsvException(String message) {"},{"lineNumber":8,"author":{"gitId":"-"},"content":" super(message);"},{"lineNumber":9,"author":{"gitId":"-"},"content":" }"},{"lineNumber":10,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":9}},{"path":"src/main/java/reposense/parser/exceptions/InvalidHeaderException.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.exceptions;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Signals that there is a problem in the header of csv config file."},{"lineNumber":5,"author":{"gitId":"-"},"content":" */"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class InvalidHeaderException extends Exception {"},{"lineNumber":7,"author":{"gitId":"-"},"content":" public InvalidHeaderException(String message) {"},{"lineNumber":8,"author":{"gitId":"-"},"content":" super(message);"},{"lineNumber":9,"author":{"gitId":"-"},"content":" }"},{"lineNumber":10,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":9}},{"path":"src/main/java/reposense/parser/exceptions/InvalidLocationException.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.exceptions;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Signals that location cannot be represented by {@code URL} or {@code Path}."},{"lineNumber":5,"author":{"gitId":"-"},"content":" */"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class InvalidLocationException extends ParseException {"},{"lineNumber":7,"author":{"gitId":"-"},"content":" public InvalidLocationException(String message) {"},{"lineNumber":8,"author":{"gitId":"-"},"content":" super(message);"},{"lineNumber":9,"author":{"gitId":"-"},"content":" }"},{"lineNumber":10,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":9}},{"path":"src/main/java/reposense/parser/exceptions/ParseException.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.exceptions;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":4,"author":{"gitId":"-"},"content":" * Signals that there is an exception when parsing a string."},{"lineNumber":5,"author":{"gitId":"-"},"content":" */"},{"lineNumber":6,"author":{"gitId":"-"},"content":"public class ParseException extends Exception {"},{"lineNumber":7,"author":{"gitId":"-"},"content":" public ParseException(String message) {"},{"lineNumber":8,"author":{"gitId":"-"},"content":" super(message);"},{"lineNumber":9,"author":{"gitId":"-"},"content":" }"},{"lineNumber":10,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":9}},{"path":"src/main/java/reposense/parser/types/AlphanumericArgumentType.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.types;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.regex.Pattern;"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.Argument;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParser;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParserException;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentType;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * Represents an alphanumeric type {@code String} argument."},{"lineNumber":12,"author":{"gitId":"-"},"content":" */"},{"lineNumber":13,"author":{"gitId":"-"},"content":"public class AlphanumericArgumentType implements ArgumentType\u003cString\u003e {"},{"lineNumber":14,"author":{"gitId":"-"},"content":" private static final String PARSE_EXCEPTION_MESSAGE_NOT_IN_ALPLANUMERIC \u003d"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \"Invalid format. It must be in alphanumeric.\";"},{"lineNumber":16,"author":{"gitId":"-"},"content":" private static final Pattern ALPHANUMERIC_PATTERN \u003d Pattern.compile(\"[A-Za-z0-9]+\");"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public String convert(ArgumentParser parser, Argument arg, String value) throws ArgumentParserException {"},{"lineNumber":20,"author":{"gitId":"-"},"content":" if (!ALPHANUMERIC_PATTERN.matcher(value).matches()) {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" throw new ArgumentParserException("},{"lineNumber":22,"author":{"gitId":"-"},"content":" String.format(PARSE_EXCEPTION_MESSAGE_NOT_IN_ALPLANUMERIC, value), parser);"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":" return value;"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }"},{"lineNumber":27,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":26}},{"path":"src/main/java/reposense/parser/types/AnalysisThreadsArgumentType.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.types;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.Argument;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParser;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParserException;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentType;"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Verifies and parses a string-formatted integer to an {@link Integer} object."},{"lineNumber":10,"author":{"gitId":"-"},"content":" */"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class AnalysisThreadsArgumentType implements ArgumentType\u003cInteger\u003e {"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public Integer convert(ArgumentParser parser, Argument arg, String value) throws ArgumentParserException {"},{"lineNumber":13,"author":{"gitId":"-"},"content":" return Integer.parseInt(value);"},{"lineNumber":14,"author":{"gitId":"-"},"content":" }"},{"lineNumber":15,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":14}},{"path":"src/main/java/reposense/parser/types/AssetsFolderArgumentType.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.types;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.impl.Arguments;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.Argument;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParser;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParserException;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentType;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * Checks the argument of {@code --assets} flag."},{"lineNumber":14,"author":{"gitId":"-"},"content":" */"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class AssetsFolderArgumentType implements ArgumentType\u003cPath\u003e {"},{"lineNumber":16,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public Path convert(ArgumentParser parser, Argument arg, String value) throws ArgumentParserException {"},{"lineNumber":18,"author":{"gitId":"-"},"content":" // Piggyback on library methods to do file existence checks"},{"lineNumber":19,"author":{"gitId":"-"},"content":" Arguments.fileType().verifyExists().verifyIsDirectory().verifyCanRead().convert(parser, arg, value);"},{"lineNumber":20,"author":{"gitId":"-"},"content":" return Paths.get(value);"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }"},{"lineNumber":22,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":21}},{"path":"src/main/java/reposense/parser/types/CloningThreadsArgumentType.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.types;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.Argument;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParser;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParserException;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentType;"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":9,"author":{"gitId":"-"},"content":" * Verifies and parses a string-formatted integer to an {@link Integer} object."},{"lineNumber":10,"author":{"gitId":"-"},"content":" */"},{"lineNumber":11,"author":{"gitId":"-"},"content":"public class CloningThreadsArgumentType implements ArgumentType\u003cInteger\u003e {"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public Integer convert(ArgumentParser parser, Argument arg, String value) throws ArgumentParserException {"},{"lineNumber":13,"author":{"gitId":"-"},"content":" return Integer.parseInt(value);"},{"lineNumber":14,"author":{"gitId":"-"},"content":" }"},{"lineNumber":15,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":14}},{"path":"src/main/java/reposense/parser/types/ConfigFolderArgumentType.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.types;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Files;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.impl.Arguments;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.Argument;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParser;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParserException;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentType;"},{"lineNumber":12,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.RepoConfigCsvParser;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Checks the argument of {@code --config} flag."},{"lineNumber":16,"author":{"gitId":"-"},"content":" */"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class ConfigFolderArgumentType implements ArgumentType\u003cPath\u003e {"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private static final String PARSE_EXCEPTION_MESSAGE_MISSING_REQUIRED_CONFIG_FILES \u003d"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \"The required config file %s is not found in the specified folder.\";"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":22,"author":{"gitId":"-"},"content":" public Path convert(ArgumentParser parser, Argument arg, String value) throws ArgumentParserException {"},{"lineNumber":23,"author":{"gitId":"-"},"content":" // Piggyback on library methods to do file existence checks"},{"lineNumber":24,"author":{"gitId":"-"},"content":" Arguments.fileType().verifyExists().verifyIsDirectory().verifyCanRead().convert(parser, arg, value);"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":" if (Files.exists(Paths.get(value).resolve(RepoConfigCsvParser.REPO_CONFIG_FILENAME))) {"},{"lineNumber":27,"author":{"gitId":"-"},"content":" return Paths.get(value);"},{"lineNumber":28,"author":{"gitId":"-"},"content":" }"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"-"},"content":" throw new ArgumentParserException(String.format(PARSE_EXCEPTION_MESSAGE_MISSING_REQUIRED_CONFIG_FILES,"},{"lineNumber":31,"author":{"gitId":"-"},"content":" RepoConfigCsvParser.REPO_CONFIG_FILENAME), parser);"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }"},{"lineNumber":33,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":2,"-":31}},{"path":"src/main/java/reposense/parser/types/DateArgumentType.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.types;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.time.LocalDateTime;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Optional;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.Argument;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParser;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParserException;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentType;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import reposense.util.TimeUtil;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * Verifies and parses a string-formatted date to a {@link LocalDateTime} object."},{"lineNumber":14,"author":{"gitId":"-"},"content":" */"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class DateArgumentType implements ArgumentType\u003cOptional\u003cLocalDateTime\u003e\u003e {"},{"lineNumber":16,"author":{"gitId":"-"},"content":" private static final String PARSE_EXCEPTION_MESSAGE_INVALID_DATE_STRING_FORMAT \u003d \"Invalid Date: %s\";"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public Optional\u003cLocalDateTime\u003e convert(ArgumentParser parser, Argument arg, String value)"},{"lineNumber":20,"author":{"gitId":"-"},"content":" throws ArgumentParserException {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":22,"author":{"gitId":"-"},"content":" return Optional.of(TimeUtil.parseDate(value));"},{"lineNumber":23,"author":{"gitId":"-"},"content":" } catch (java.text.ParseException pe) {"},{"lineNumber":24,"author":{"gitId":"-"},"content":" throw new ArgumentParserException("},{"lineNumber":25,"author":{"gitId":"-"},"content":" String.format(PARSE_EXCEPTION_MESSAGE_INVALID_DATE_STRING_FORMAT, value), parser);"},{"lineNumber":26,"author":{"gitId":"-"},"content":" }"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }"},{"lineNumber":28,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":27}},{"path":"src/main/java/reposense/parser/types/OutputFolderArgumentType.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.types;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.impl.Arguments;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.Argument;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParser;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParserException;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentType;"},{"lineNumber":11,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.ArgsParser;"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * Checks the argument of {@code --output} flag."},{"lineNumber":15,"author":{"gitId":"-"},"content":" */"},{"lineNumber":16,"author":{"gitId":"-"},"content":"public class OutputFolderArgumentType implements ArgumentType\u003cPath\u003e {"},{"lineNumber":17,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public Path convert(ArgumentParser parser, Argument arg, String value) throws ArgumentParserException {"},{"lineNumber":19,"author":{"gitId":"-"},"content":" // Piggyback on library methods to do file existence checks"},{"lineNumber":20,"author":{"gitId":"-"},"content":" Arguments.fileType().verifyExists().verifyIsDirectory().verifyCanWrite()"},{"lineNumber":21,"author":{"gitId":"-"},"content":" .or()"},{"lineNumber":22,"author":{"gitId":"-"},"content":" .verifyNotExists().convert(parser, arg, value);"},{"lineNumber":23,"author":{"gitId":"-"},"content":" return Paths.get(value).resolve(ArgsParser.DEFAULT_REPORT_NAME);"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }"},{"lineNumber":25,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":2,"-":23}},{"path":"src/main/java/reposense/parser/types/PeriodArgumentType.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.types;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.Optional;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.regex.Pattern;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.Argument;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParser;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParserException;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentType;"},{"lineNumber":10,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.ParseException;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * Verifies and parses a string-formatted period to an integer."},{"lineNumber":14,"author":{"gitId":"-"},"content":" */"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class PeriodArgumentType implements ArgumentType\u003cOptional\u003cInteger\u003e\u003e {"},{"lineNumber":16,"author":{"gitId":"-"},"content":" private static final String PARSE_EXCEPTION_MESSAGE_NOT_IN_NUMERIC \u003d"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \"Invalid format. Period must be in the format of nd (n days) or nw (n weeks), \""},{"lineNumber":18,"author":{"gitId":"-"},"content":" + \"where n is a number greater than 0.\";"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private static final String PARSE_EXCEPTION_MESSAGE_SMALLER_THAN_ZERO \u003d"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \"Invalid format. Period must be greater than 0.\";"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final String PARSE_EXCEPTION_MESSAGE_NUMBER_TOO_LARGE \u003d"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \"Invalid format. Input number may be too large.\";"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final Pattern PERIOD_PATTERN \u003d Pattern.compile(\"[0-9]+[dw]\");"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":26,"author":{"gitId":"-"},"content":" public Optional\u003cInteger\u003e convert(ArgumentParser parser, Argument arg, String value) throws ArgumentParserException {"},{"lineNumber":27,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":28,"author":{"gitId":"-"},"content":" return parse(value);"},{"lineNumber":29,"author":{"gitId":"-"},"content":" } catch (ParseException pe) {"},{"lineNumber":30,"author":{"gitId":"-"},"content":" throw new ArgumentParserException(pe.getMessage(), parser);"},{"lineNumber":31,"author":{"gitId":"-"},"content":" }"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }"},{"lineNumber":33,"author":{"gitId":"-"},"content":""},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Parses a {@code period} String and returns an {@link Integer} representing the number of days."},{"lineNumber":36,"author":{"gitId":"-"},"content":" *"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * @throws ParseException if period format or number is invalid."},{"lineNumber":38,"author":{"gitId":"-"},"content":" */"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public static Optional\u003cInteger\u003e parse(String period) throws ParseException {"},{"lineNumber":40,"author":{"gitId":"-"},"content":" if (!PERIOD_PATTERN.matcher(period).matches()) {"},{"lineNumber":41,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(PARSE_EXCEPTION_MESSAGE_NOT_IN_NUMERIC, period));"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":" int multiplier \u003d period.substring(period.length() - 1).equals(\"d\") ? 1 : 7;"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":47,"author":{"gitId":"-"},"content":" int convertedValue \u003d Integer.parseInt(period.substring(0, period.length() - 1)) * multiplier;"},{"lineNumber":48,"author":{"gitId":"-"},"content":" if (convertedValue \u003c\u003d 0) {"},{"lineNumber":49,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(PARSE_EXCEPTION_MESSAGE_SMALLER_THAN_ZERO, period));"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }"},{"lineNumber":51,"author":{"gitId":"-"},"content":""},{"lineNumber":52,"author":{"gitId":"-"},"content":" return Optional.of(convertedValue);"},{"lineNumber":53,"author":{"gitId":"-"},"content":" } catch (NumberFormatException e) {"},{"lineNumber":54,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(PARSE_EXCEPTION_MESSAGE_NUMBER_TOO_LARGE, period));"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }"},{"lineNumber":57,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":2,"-":55}},{"path":"src/main/java/reposense/parser/types/ReportFolderArgumentType.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.types;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.impl.Arguments;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.Argument;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParser;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParserException;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentType;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * Checks the argument of {@code --view} flag."},{"lineNumber":14,"author":{"gitId":"-"},"content":" */"},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class ReportFolderArgumentType implements ArgumentType\u003cPath\u003e {"},{"lineNumber":16,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public Path convert(ArgumentParser parser, Argument arg, String value) throws ArgumentParserException {"},{"lineNumber":18,"author":{"gitId":"-"},"content":" // Piggyback on library methods to do file existence checks"},{"lineNumber":19,"author":{"gitId":"-"},"content":" Arguments.fileType().verifyExists().verifyIsDirectory().verifyCanRead().convert(parser, arg, value);"},{"lineNumber":20,"author":{"gitId":"-"},"content":" return Paths.get(value);"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }"},{"lineNumber":22,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":21}},{"path":"src/main/java/reposense/parser/types/SinceDateArgumentType.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.types;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.time.Instant;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.time.LocalDateTime;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.time.ZoneId;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.time.ZonedDateTime;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Optional;"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.Argument;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParser;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParserException;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import reposense.util.TimeUtil;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * Verifies and parses a string-formatted since date to a {@link LocalDateTime} object."},{"lineNumber":16,"author":{"gitId":"-"},"content":" */"},{"lineNumber":17,"author":{"gitId":"-"},"content":"public class SinceDateArgumentType extends DateArgumentType {"},{"lineNumber":18,"author":{"gitId":"-"},"content":" /*"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * When user specifies \"d1\", arbitrary first commit date will be returned."},{"lineNumber":20,"author":{"gitId":"-"},"content":" * This date is equivalent to 1970-01-01 00:00:00 in UTC time."},{"lineNumber":21,"author":{"gitId":"-"},"content":" * Then, ReportGenerator will replace the arbitrary since date with the earliest commit date."},{"lineNumber":22,"author":{"gitId":"-"},"content":" */"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public static final String FIRST_COMMIT_DATE_SHORTHAND \u003d \"d1\";"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final ZonedDateTime ARBITRARY_FIRST_COMMIT_DATE_UTC \u003d ZonedDateTime.ofInstant("},{"lineNumber":25,"author":{"gitId":"-"},"content":" Instant.ofEpochMilli(0), ZoneId.of(\"Z\"));"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final LocalDateTime ARBITRARY_FIRST_COMMIT_DATE_LOCAL \u003d ARBITRARY_FIRST_COMMIT_DATE_UTC"},{"lineNumber":27,"author":{"gitId":"-"},"content":" .toLocalDateTime();"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * Returns an arbitrary year {@link SinceDateArgumentType#ARBITRARY_FIRST_COMMIT_DATE_LOCAL} if user specifies"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * {@link SinceDateArgumentType#FIRST_COMMIT_DATE_SHORTHAND} in {@code value}, or attempts to return the"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * desired date otherwise."},{"lineNumber":33,"author":{"gitId":"-"},"content":" *"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * @throws ArgumentParserException if the given date cannot be parsed."},{"lineNumber":35,"author":{"gitId":"-"},"content":" */"},{"lineNumber":36,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public Optional\u003cLocalDateTime\u003e convert(ArgumentParser parser, Argument arg, String value)"},{"lineNumber":38,"author":{"gitId":"-"},"content":" throws ArgumentParserException {"},{"lineNumber":39,"author":{"gitId":"-"},"content":" if (FIRST_COMMIT_DATE_SHORTHAND.equals(value)) {"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return Optional.of(ARBITRARY_FIRST_COMMIT_DATE_LOCAL);"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }"},{"lineNumber":42,"author":{"gitId":"-"},"content":" String sinceDate \u003d TimeUtil.extractDate(value);"},{"lineNumber":43,"author":{"gitId":"-"},"content":" return super.convert(parser, arg, sinceDate + \" 00:00:00\");"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Returns the {@link SinceDateArgumentType#ARBITRARY_FIRST_COMMIT_DATE_LOCAL}, which is the"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * {@link LocalDateTime} of {@link SinceDateArgumentType#ARBITRARY_FIRST_COMMIT_DATE_UTC}."},{"lineNumber":49,"author":{"gitId":"-"},"content":" */"},{"lineNumber":50,"author":{"gitId":"-"},"content":" public static LocalDateTime getArbitraryFirstCommitDateLocal() {"},{"lineNumber":51,"author":{"gitId":"-"},"content":" return ARBITRARY_FIRST_COMMIT_DATE_LOCAL;"},{"lineNumber":52,"author":{"gitId":"-"},"content":" }"},{"lineNumber":53,"author":{"gitId":"-"},"content":""},{"lineNumber":54,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * Returns the {@link SinceDateArgumentType#ARBITRARY_FIRST_COMMIT_DATE_UTC} adjusted for the time zone based on"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * {@code toZoneId} and converted to a {@link LocalDateTime} object."},{"lineNumber":57,"author":{"gitId":"-"},"content":" */"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public static LocalDateTime getArbitraryFirstCommitDateConverted(ZoneId toZoneId) {"},{"lineNumber":59,"author":{"gitId":"-"},"content":" return ARBITRARY_FIRST_COMMIT_DATE_UTC.withZoneSameInstant(toZoneId).toLocalDateTime();"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }"},{"lineNumber":61,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":60}},{"path":"src/main/java/reposense/parser/types/UntilDateArgumentType.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.types;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.time.LocalDateTime;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.util.Optional;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.Argument;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParser;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParserException;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import reposense.util.TimeUtil;"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Verifies and parses a string-formatted until date to a {@link LocalDateTime} object."},{"lineNumber":13,"author":{"gitId":"-"},"content":" */"},{"lineNumber":14,"author":{"gitId":"-"},"content":""},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class UntilDateArgumentType extends DateArgumentType {"},{"lineNumber":16,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":17,"author":{"gitId":"-"},"content":" public Optional\u003cLocalDateTime\u003e convert(ArgumentParser parser, Argument arg, String value)"},{"lineNumber":18,"author":{"gitId":"-"},"content":" throws ArgumentParserException {"},{"lineNumber":19,"author":{"gitId":"-"},"content":" String untilDate \u003d TimeUtil.extractDate(value);"},{"lineNumber":20,"author":{"gitId":"-"},"content":" return super.convert(parser, arg, untilDate + \" 23:59:59\");"},{"lineNumber":21,"author":{"gitId":"-"},"content":" }"},{"lineNumber":22,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":21}},{"path":"src/main/java/reposense/parser/types/ZoneIdArgumentType.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"asdfghjkxd"},"content":"package reposense.parser.types;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.time.DateTimeException;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.time.ZoneId;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.Argument;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParser;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentParserException;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.inf.ArgumentType;"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":12,"author":{"gitId":"-"},"content":" * Verifies and parses a string-formatted zone id to a {@link ZoneId} object."},{"lineNumber":13,"author":{"gitId":"-"},"content":" */"},{"lineNumber":14,"author":{"gitId":"-"},"content":"public class ZoneIdArgumentType implements ArgumentType\u003cZoneId\u003e {"},{"lineNumber":15,"author":{"gitId":"-"},"content":" private static final String MESSAGE_TIMEZONE_INVALID \u003d"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \"The timezone provided is invalid, please use a more widely accepted format. E.g. UTC[±hh[mm]]\";"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":" @Override"},{"lineNumber":19,"author":{"gitId":"-"},"content":" public ZoneId convert(ArgumentParser parser, Argument arg, String value) throws ArgumentParserException {"},{"lineNumber":20,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":21,"author":{"gitId":"-"},"content":" return ZoneId.of(value);"},{"lineNumber":22,"author":{"gitId":"-"},"content":" } catch (DateTimeException dte) {"},{"lineNumber":23,"author":{"gitId":"-"},"content":" throw new ArgumentParserException(MESSAGE_TIMEZONE_INVALID, parser);"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }"},{"lineNumber":25,"author":{"gitId":"-"},"content":" }"},{"lineNumber":26,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":25}},{"path":"src/main/java/reposense/report/ReportGenerator.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.report;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.IOException;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.io.InputStream;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.io.PrintWriter;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.io.StringWriter;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.Files;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.time.LocalDateTime;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.time.ZoneId;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.ArrayList;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.Arrays;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.util.Collections;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.HashMap;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import java.util.Iterator;"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import java.util.Map;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import java.util.Optional;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import java.util.concurrent.CompletableFuture;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import java.util.concurrent.ExecutorService;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import java.util.concurrent.Executors;"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import java.util.function.Supplier;"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import java.util.logging.Level;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;"},{"lineNumber":27,"author":{"gitId":"-"},"content":""},{"lineNumber":28,"author":{"gitId":"-"},"content":"import com.google.gson.JsonSyntaxException;"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"-"},"content":"import reposense.RepoSense;"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import reposense.authorship.AuthorshipReporter;"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import reposense.authorship.model.AuthorshipSummary;"},{"lineNumber":33,"author":{"gitId":"-"},"content":"import reposense.commits.CommitsReporter;"},{"lineNumber":34,"author":{"gitId":"-"},"content":"import reposense.commits.model.CommitContributionSummary;"},{"lineNumber":35,"author":{"gitId":"-"},"content":"import reposense.git.GitBlame;"},{"lineNumber":36,"author":{"gitId":"-"},"content":"import reposense.git.GitClone;"},{"lineNumber":37,"author":{"gitId":"-"},"content":"import reposense.git.GitRevParse;"},{"lineNumber":38,"author":{"gitId":"-"},"content":"import reposense.git.GitShortlog;"},{"lineNumber":39,"author":{"gitId":"-"},"content":"import reposense.git.GitShow;"},{"lineNumber":40,"author":{"gitId":"-"},"content":"import reposense.git.exception.CommitNotFoundException;"},{"lineNumber":41,"author":{"gitId":"-"},"content":"import reposense.git.exception.GitBranchException;"},{"lineNumber":42,"author":{"gitId":"-"},"content":"import reposense.git.exception.GitCloneException;"},{"lineNumber":43,"author":{"gitId":"-"},"content":"import reposense.model.Author;"},{"lineNumber":44,"author":{"gitId":"-"},"content":"import reposense.model.CommitHash;"},{"lineNumber":45,"author":{"gitId":"-"},"content":"import reposense.model.RepoConfiguration;"},{"lineNumber":46,"author":{"gitId":"-"},"content":"import reposense.model.RepoLocation;"},{"lineNumber":47,"author":{"gitId":"-"},"content":"import reposense.model.ReportConfiguration;"},{"lineNumber":48,"author":{"gitId":"-"},"content":"import reposense.model.StandaloneConfig;"},{"lineNumber":49,"author":{"gitId":"-"},"content":"import reposense.parser.StandaloneConfigJsonParser;"},{"lineNumber":50,"author":{"gitId":"-"},"content":"import reposense.report.exception.NoAuthorsWithCommitsFoundException;"},{"lineNumber":51,"author":{"gitId":"-"},"content":"import reposense.system.LogsManager;"},{"lineNumber":52,"author":{"gitId":"-"},"content":"import reposense.util.FileUtil;"},{"lineNumber":53,"author":{"gitId":"-"},"content":"import reposense.util.ProgressTracker;"},{"lineNumber":54,"author":{"gitId":"-"},"content":"import reposense.util.TimeUtil;"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * Contains report generation related functionalities."},{"lineNumber":58,"author":{"gitId":"-"},"content":" */"},{"lineNumber":59,"author":{"gitId":"-"},"content":"public class ReportGenerator {"},{"lineNumber":60,"author":{"gitId":"-"},"content":" private static final String REPOSENSE_CONFIG_FOLDER \u003d \"_reposense\";"},{"lineNumber":61,"author":{"gitId":"-"},"content":" private static final String REPOSENSE_CONFIG_FILE \u003d \"config.json\";"},{"lineNumber":62,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsManager.getLogger(ReportGenerator.class);"},{"lineNumber":63,"author":{"gitId":"-"},"content":""},{"lineNumber":64,"author":{"gitId":"-"},"content":" // zip file which contains all the report template files"},{"lineNumber":65,"author":{"gitId":"-"},"content":" private static final String TEMPLATE_FILE \u003d \"/templateZip.zip\";"},{"lineNumber":66,"author":{"gitId":"-"},"content":""},{"lineNumber":67,"author":{"gitId":"-"},"content":" private static final String MESSAGE_INVALID_CONFIG_JSON \u003d \"%s Ignoring the config provided by %s (%s).\";"},{"lineNumber":68,"author":{"gitId":"-"},"content":" private static final String MESSAGE_ERROR_CREATING_DIRECTORY \u003d"},{"lineNumber":69,"author":{"gitId":"-"},"content":" \"Error has occurred while creating repo directory for %s (%s), will skip this repo.\";"},{"lineNumber":70,"author":{"gitId":"-"},"content":" private static final String MESSAGE_NO_STANDALONE_CONFIG \u003d \"%s (%s) does not contain a standalone config file.\";"},{"lineNumber":71,"author":{"gitId":"-"},"content":" private static final String MESSAGE_IGNORING_STANDALONE_CONFIG \u003d \"Ignoring standalone config file in %s (%s).\";"},{"lineNumber":72,"author":{"gitId":"-"},"content":" private static final String MESSAGE_MALFORMED_STANDALONE_CONFIG \u003d \"%s/%s/%s is malformed for %s (%s).\";"},{"lineNumber":73,"author":{"gitId":"-"},"content":" private static final String MESSAGE_NO_AUTHORS_SPECIFIED \u003d"},{"lineNumber":74,"author":{"gitId":"-"},"content":" \"%s (%s) has no authors specified, using all authors by default.\";"},{"lineNumber":75,"author":{"gitId":"-"},"content":" private static final String MESSAGE_NO_AUTHORS_WITH_COMMITS_FOUND \u003d"},{"lineNumber":76,"author":{"gitId":"-"},"content":" \"No authors found with commits for %s (%s).\";"},{"lineNumber":77,"author":{"gitId":"-"},"content":" private static final String MESSAGE_START_ANALYSIS \u003d \"Analyzing %s (%s)...\";"},{"lineNumber":78,"author":{"gitId":"-"},"content":" private static final String MESSAGE_COMPLETE_ANALYSIS \u003d \"Analysis of %s (%s) completed!\";"},{"lineNumber":79,"author":{"gitId":"-"},"content":" private static final String MESSAGE_REPORT_GENERATED \u003d \"The report is generated at %s\";"},{"lineNumber":80,"author":{"gitId":"-"},"content":" private static final String MESSAGE_BRANCH_DOES_NOT_EXIST \u003d \"Branch %s does not exist in %s! Analysis terminated.\";"},{"lineNumber":81,"author":{"gitId":"-"},"content":" private static final String MESSAGE_MISSING_TEMPLATE \u003d"},{"lineNumber":82,"author":{"gitId":"-"},"content":" \"Unable to find template file. Proceeding to generate report...\";"},{"lineNumber":83,"author":{"gitId":"-"},"content":""},{"lineNumber":84,"author":{"gitId":"-"},"content":" private static final String LOG_ERROR_CLONING \u003d \"Failed to clone from %s\";"},{"lineNumber":85,"author":{"gitId":"-"},"content":" private static final String LOG_ERROR_EXPANDING_COMMIT \u003d \"Cannot expand %s, it shall remain unexpanded\";"},{"lineNumber":86,"author":{"gitId":"-"},"content":" private static final String LOG_BRANCH_DOES_NOT_EXIST \u003d \"Branch \\\"%s\\\" does not exist.\";"},{"lineNumber":87,"author":{"gitId":"-"},"content":" private static final String LOG_ERROR_CLONING_OR_BRANCHING \u003d \"Exception met while cloning or checking out.\";"},{"lineNumber":88,"author":{"gitId":"-"},"content":" private static final String LOG_UNEXPECTED_ERROR \u003d \"Unexpected error stack trace for %s:\\n\u003e%s\";"},{"lineNumber":89,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e assetsFilesWhiteList \u003d"},{"lineNumber":90,"author":{"gitId":"sopa301"},"content":" Collections.unmodifiableList(Arrays.asList(new String[] {\"favicon.ico\", \"title.md\"}));"},{"lineNumber":91,"author":{"gitId":"-"},"content":""},{"lineNumber":92,"author":{"gitId":"-"},"content":" private LocalDateTime earliestSinceDate \u003d null;"},{"lineNumber":93,"author":{"gitId":"-"},"content":" private ProgressTracker progressTracker \u003d null;"},{"lineNumber":94,"author":{"gitId":"-"},"content":""},{"lineNumber":95,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":96,"author":{"gitId":"-"},"content":" * Generates the authorship and commits JSON file for each repo in {@code configs} at {@code outputPath}, as"},{"lineNumber":97,"author":{"gitId":"-"},"content":" * well as the summary JSON file of all the repos."},{"lineNumber":98,"author":{"gitId":"-"},"content":" *"},{"lineNumber":99,"author":{"gitId":"-"},"content":" * @param configs The list of repos to analyze."},{"lineNumber":100,"author":{"gitId":"-"},"content":" * @param outputPath The location at which to save the report."},{"lineNumber":101,"author":{"gitId":"-"},"content":" * @param assetsPath The location at which assets for generating the report are stored."},{"lineNumber":102,"author":{"gitId":"-"},"content":" * @param reportConfig The config for the output report."},{"lineNumber":103,"author":{"gitId":"-"},"content":" * @param generationDate The time at which the report was generated."},{"lineNumber":104,"author":{"gitId":"-"},"content":" * @param cliSinceDate The date-time from which to start analyzing commits."},{"lineNumber":105,"author":{"gitId":"-"},"content":" * @param untilDate The cut-off date-time for analyzing commits."},{"lineNumber":106,"author":{"gitId":"-"},"content":" * @param isSinceDateProvided The boolean variable for whether client provided a sinceDate."},{"lineNumber":107,"author":{"gitId":"-"},"content":" * @param isUntilDateProvided The boolean variable for whether client provided an untilDate."},{"lineNumber":108,"author":{"gitId":"-"},"content":" * @param numCloningThreads The number of threads to use to clone the repos."},{"lineNumber":109,"author":{"gitId":"-"},"content":" * @param numAnalysisThreads The number of threads to use to analyze the repos."},{"lineNumber":110,"author":{"gitId":"-"},"content":" * @param reportGenerationTimeProvider Supplier for time taken to generate the report."},{"lineNumber":111,"author":{"gitId":"-"},"content":" * @param zoneId The timezone to adjust all date-times to."},{"lineNumber":112,"author":{"gitId":"-"},"content":" * @param shouldFreshClone The boolean variable for whether to clone a repo again during tests."},{"lineNumber":113,"author":{"gitId":"-"},"content":" * @return the list of file paths that were generated."},{"lineNumber":114,"author":{"gitId":"-"},"content":" * @throws IOException if templateZip.zip does not exists in jar file."},{"lineNumber":115,"author":{"gitId":"-"},"content":" */"},{"lineNumber":116,"author":{"gitId":"-"},"content":" public List\u003cPath\u003e generateReposReport(List\u003cRepoConfiguration\u003e configs, String outputPath, String assetsPath,"},{"lineNumber":117,"author":{"gitId":"-"},"content":" ReportConfiguration reportConfig, String generationDate, LocalDateTime cliSinceDate,"},{"lineNumber":118,"author":{"gitId":"-"},"content":" LocalDateTime untilDate, boolean isSinceDateProvided, boolean isUntilDateProvided, int numCloningThreads,"},{"lineNumber":119,"author":{"gitId":"-"},"content":" int numAnalysisThreads, Supplier\u003cString\u003e reportGenerationTimeProvider, ZoneId zoneId,"},{"lineNumber":120,"author":{"gitId":"-"},"content":" boolean shouldFreshClone) throws IOException {"},{"lineNumber":121,"author":{"gitId":"-"},"content":" prepareTemplateFile(outputPath);"},{"lineNumber":122,"author":{"gitId":"-"},"content":" if (Files.exists(Paths.get(assetsPath))) {"},{"lineNumber":123,"author":{"gitId":"-"},"content":" FileUtil.copyDirectoryContents(assetsPath, outputPath, assetsFilesWhiteList);"},{"lineNumber":124,"author":{"gitId":"-"},"content":" }"},{"lineNumber":125,"author":{"gitId":"-"},"content":""},{"lineNumber":126,"author":{"gitId":"-"},"content":" earliestSinceDate \u003d null;"},{"lineNumber":127,"author":{"gitId":"-"},"content":" progressTracker \u003d new ProgressTracker(configs.size());"},{"lineNumber":128,"author":{"gitId":"-"},"content":""},{"lineNumber":129,"author":{"gitId":"-"},"content":" List\u003cPath\u003e reportFoldersAndFiles \u003d cloneAndAnalyzeRepos(configs, outputPath,"},{"lineNumber":130,"author":{"gitId":"-"},"content":" numCloningThreads, numAnalysisThreads, shouldFreshClone);"},{"lineNumber":131,"author":{"gitId":"-"},"content":""},{"lineNumber":132,"author":{"gitId":"-"},"content":" LocalDateTime reportSinceDate \u003d (TimeUtil.isEqualToArbitraryFirstDateConverted(cliSinceDate, zoneId))"},{"lineNumber":133,"author":{"gitId":"-"},"content":" ? earliestSinceDate : cliSinceDate;"},{"lineNumber":134,"author":{"gitId":"-"},"content":""},{"lineNumber":135,"author":{"gitId":"-"},"content":" Optional\u003cPath\u003e summaryPath \u003d FileUtil.writeJsonFile("},{"lineNumber":136,"author":{"gitId":"-"},"content":" new SummaryJson(configs, reportConfig, generationDate,"},{"lineNumber":137,"author":{"gitId":"-"},"content":" reportSinceDate, untilDate, isSinceDateProvided,"},{"lineNumber":138,"author":{"gitId":"-"},"content":" isUntilDateProvided, RepoSense.getVersion(), ErrorSummary.getInstance().getErrorSet(),"},{"lineNumber":139,"author":{"gitId":"-"},"content":" reportGenerationTimeProvider.get(), zoneId),"},{"lineNumber":140,"author":{"gitId":"-"},"content":" getSummaryResultPath(outputPath));"},{"lineNumber":141,"author":{"gitId":"-"},"content":" summaryPath.ifPresent(reportFoldersAndFiles::add);"},{"lineNumber":142,"author":{"gitId":"-"},"content":""},{"lineNumber":143,"author":{"gitId":"-"},"content":" logger.info(String.format(MESSAGE_REPORT_GENERATED, outputPath));"},{"lineNumber":144,"author":{"gitId":"-"},"content":""},{"lineNumber":145,"author":{"gitId":"-"},"content":" return reportFoldersAndFiles;"},{"lineNumber":146,"author":{"gitId":"-"},"content":" }"},{"lineNumber":147,"author":{"gitId":"-"},"content":""},{"lineNumber":148,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":149,"author":{"gitId":"-"},"content":" * Copies the template file to the specified {@code outputPath} for the repo report to be generated."},{"lineNumber":150,"author":{"gitId":"-"},"content":" *"},{"lineNumber":151,"author":{"gitId":"-"},"content":" * @throws IOException if I/O error encountered while copying template file."},{"lineNumber":152,"author":{"gitId":"-"},"content":" */"},{"lineNumber":153,"author":{"gitId":"-"},"content":" private void prepareTemplateFile(String outputPath) throws IOException {"},{"lineNumber":154,"author":{"gitId":"-"},"content":" InputStream is \u003d RepoSense.class.getResourceAsStream(TEMPLATE_FILE);"},{"lineNumber":155,"author":{"gitId":"-"},"content":" if (is !\u003d null) {"},{"lineNumber":156,"author":{"gitId":"-"},"content":" FileUtil.copyTemplate(is, outputPath);"},{"lineNumber":157,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":158,"author":{"gitId":"-"},"content":" logger.warning(MESSAGE_MISSING_TEMPLATE);"},{"lineNumber":159,"author":{"gitId":"-"},"content":" }"},{"lineNumber":160,"author":{"gitId":"-"},"content":" }"},{"lineNumber":161,"author":{"gitId":"-"},"content":""},{"lineNumber":162,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":163,"author":{"gitId":"-"},"content":" * Groups {@link RepoConfiguration} with the same {@link RepoLocation} together so that they are only cloned once."},{"lineNumber":164,"author":{"gitId":"-"},"content":" */"},{"lineNumber":165,"author":{"gitId":"-"},"content":" private Map\u003cRepoLocation, List\u003cRepoConfiguration\u003e\u003e groupConfigsByRepoLocation("},{"lineNumber":166,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e configs) {"},{"lineNumber":167,"author":{"gitId":"-"},"content":" Map\u003cRepoLocation, List\u003cRepoConfiguration\u003e\u003e repoLocationMap \u003d new HashMap\u003c\u003e();"},{"lineNumber":168,"author":{"gitId":"-"},"content":" for (RepoConfiguration config : configs) {"},{"lineNumber":169,"author":{"gitId":"-"},"content":" RepoLocation location \u003d config.getLocation();"},{"lineNumber":170,"author":{"gitId":"-"},"content":""},{"lineNumber":171,"author":{"gitId":"-"},"content":" if (!repoLocationMap.containsKey(location)) {"},{"lineNumber":172,"author":{"gitId":"-"},"content":" repoLocationMap.put(location, new ArrayList\u003c\u003e());"},{"lineNumber":173,"author":{"gitId":"-"},"content":" }"},{"lineNumber":174,"author":{"gitId":"-"},"content":" repoLocationMap.get(location).add(config);"},{"lineNumber":175,"author":{"gitId":"-"},"content":" }"},{"lineNumber":176,"author":{"gitId":"-"},"content":" return repoLocationMap;"},{"lineNumber":177,"author":{"gitId":"-"},"content":" }"},{"lineNumber":178,"author":{"gitId":"-"},"content":""},{"lineNumber":179,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":180,"author":{"gitId":"-"},"content":" * Clone, analyze and generate the report for repositories in {@code repoLocationMap}."},{"lineNumber":181,"author":{"gitId":"-"},"content":" * Performs cloning and analysis of each repository in parallel, and generates the report."},{"lineNumber":182,"author":{"gitId":"-"},"content":" * Also removes any configs that failed to clone or analyze from {@code configs}."},{"lineNumber":183,"author":{"gitId":"-"},"content":" * By default, runs in multi-threaded mode with {@code numCloningThreads} threads for cloning"},{"lineNumber":184,"author":{"gitId":"-"},"content":" * and {@code numAnalysisThreads} threads for analysis."},{"lineNumber":185,"author":{"gitId":"-"},"content":" * To turn off multi-threading, run the program with the flags"},{"lineNumber":186,"author":{"gitId":"-"},"content":" * {@code --cloning-threads 1 --analysis-threads 1}."},{"lineNumber":187,"author":{"gitId":"-"},"content":" * For test environments, cloning is skipped if it has been done before and {@code shouldFreshClone} is false."},{"lineNumber":188,"author":{"gitId":"-"},"content":" *"},{"lineNumber":189,"author":{"gitId":"-"},"content":" * @return A list of paths to the JSON report files generated for each repository."},{"lineNumber":190,"author":{"gitId":"-"},"content":" */"},{"lineNumber":191,"author":{"gitId":"-"},"content":" private List\u003cPath\u003e cloneAndAnalyzeRepos(List\u003cRepoConfiguration\u003e configs, String outputPath,"},{"lineNumber":192,"author":{"gitId":"-"},"content":" int numCloningThreads, int numAnalysisThreads, boolean shouldFreshClone) {"},{"lineNumber":193,"author":{"gitId":"-"},"content":" Map\u003cRepoLocation, List\u003cRepoConfiguration\u003e\u003e repoLocationMap \u003d groupConfigsByRepoLocation(configs);"},{"lineNumber":194,"author":{"gitId":"-"},"content":" List\u003cRepoLocation\u003e repoLocationList \u003d new ArrayList\u003c\u003e(repoLocationMap.keySet());"},{"lineNumber":195,"author":{"gitId":"-"},"content":""},{"lineNumber":196,"author":{"gitId":"-"},"content":" // Fixed thread pools are used to limit the number of threads used by cloning and analysis jobs at any one time"},{"lineNumber":197,"author":{"gitId":"-"},"content":" ExecutorService cloneExecutor \u003d Executors.newFixedThreadPool(numCloningThreads);"},{"lineNumber":198,"author":{"gitId":"-"},"content":" ExecutorService analyzeExecutor \u003d Executors.newFixedThreadPool(numAnalysisThreads);"},{"lineNumber":199,"author":{"gitId":"-"},"content":""},{"lineNumber":200,"author":{"gitId":"-"},"content":" List\u003cCompletableFuture\u003cAnalyzeJobOutput\u003e\u003e analyzeJobFutures \u003d new ArrayList\u003c\u003e();"},{"lineNumber":201,"author":{"gitId":"-"},"content":" for (RepoLocation location : repoLocationList) {"},{"lineNumber":202,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e configsToAnalyze \u003d repoLocationMap.get(location);"},{"lineNumber":203,"author":{"gitId":"-"},"content":""},{"lineNumber":204,"author":{"gitId":"-"},"content":" // The `CompletableFuture.supplyAsync` method is used to clone the repo in parallel."},{"lineNumber":205,"author":{"gitId":"-"},"content":" // Note that the `cloneExecutor` is passed as a parameter to ensure that the number of threads used"},{"lineNumber":206,"author":{"gitId":"-"},"content":" // for cloning is no more than `numCloningThreads`."},{"lineNumber":207,"author":{"gitId":"-"},"content":" CompletableFuture\u003cCloneJobOutput\u003e cloneFuture \u003d CompletableFuture.supplyAsync(() -\u003e"},{"lineNumber":208,"author":{"gitId":"-"},"content":" cloneRepo(configsToAnalyze.get(0), location, shouldFreshClone), cloneExecutor);"},{"lineNumber":209,"author":{"gitId":"-"},"content":""},{"lineNumber":210,"author":{"gitId":"-"},"content":" // The `thenApplyAsync` method is used to analyze the cloned repo in parallel."},{"lineNumber":211,"author":{"gitId":"-"},"content":" // This ensures that the analysis job for each repo will only be run after the repo has been cloned."},{"lineNumber":212,"author":{"gitId":"-"},"content":" // Note that the `analyzeExecutor` is passed as a parameter to ensure that the number of threads used"},{"lineNumber":213,"author":{"gitId":"-"},"content":" // for analysis is no more than `numAnalysisThreads`."},{"lineNumber":214,"author":{"gitId":"-"},"content":" CompletableFuture\u003cAnalyzeJobOutput\u003e analyzeFuture \u003d cloneFuture.thenApplyAsync("},{"lineNumber":215,"author":{"gitId":"-"},"content":" cloneJobOutput -\u003e analyzeRepos(outputPath, configsToAnalyze, cloneJobOutput), analyzeExecutor);"},{"lineNumber":216,"author":{"gitId":"-"},"content":""},{"lineNumber":217,"author":{"gitId":"-"},"content":" analyzeJobFutures.add(analyzeFuture);"},{"lineNumber":218,"author":{"gitId":"-"},"content":" }"},{"lineNumber":219,"author":{"gitId":"-"},"content":""},{"lineNumber":220,"author":{"gitId":"-"},"content":" // Next, we collect the list of outputs from all the analyze jobs"},{"lineNumber":221,"author":{"gitId":"-"},"content":" List\u003cAnalyzeJobOutput\u003e jobOutputs \u003d analyzeJobFutures.stream()"},{"lineNumber":222,"author":{"gitId":"-"},"content":" .map(CompletableFuture::join)"},{"lineNumber":223,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());"},{"lineNumber":224,"author":{"gitId":"-"},"content":""},{"lineNumber":225,"author":{"gitId":"-"},"content":" // Finally, the ExecutorService objects are shut down to prevent memory leaks"},{"lineNumber":226,"author":{"gitId":"-"},"content":" cloneExecutor.shutdown();"},{"lineNumber":227,"author":{"gitId":"-"},"content":" analyzeExecutor.shutdown();"},{"lineNumber":228,"author":{"gitId":"-"},"content":""},{"lineNumber":229,"author":{"gitId":"-"},"content":" List\u003cPath\u003e generatedFiles \u003d jobOutputs"},{"lineNumber":230,"author":{"gitId":"-"},"content":" .stream()"},{"lineNumber":231,"author":{"gitId":"-"},"content":" .flatMap(jobOutput -\u003e jobOutput.getFiles().stream())"},{"lineNumber":232,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());"},{"lineNumber":233,"author":{"gitId":"-"},"content":""},{"lineNumber":234,"author":{"gitId":"-"},"content":" List\u003cRepoLocation\u003e cloneFailLocations \u003d jobOutputs"},{"lineNumber":235,"author":{"gitId":"-"},"content":" .stream()"},{"lineNumber":236,"author":{"gitId":"-"},"content":" .filter(jobOutput -\u003e !jobOutput.isCloneSuccessful())"},{"lineNumber":237,"author":{"gitId":"-"},"content":" .map(jobOutput -\u003e jobOutput.getLocation())"},{"lineNumber":238,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());"},{"lineNumber":239,"author":{"gitId":"-"},"content":" cloneFailLocations.forEach(location -\u003e handleCloningFailed(configs, location));"},{"lineNumber":240,"author":{"gitId":"-"},"content":""},{"lineNumber":241,"author":{"gitId":"-"},"content":" List\u003cAnalysisErrorInfo\u003e analysisErrors \u003d jobOutputs"},{"lineNumber":242,"author":{"gitId":"-"},"content":" .stream()"},{"lineNumber":243,"author":{"gitId":"-"},"content":" .flatMap(jobOutput -\u003e jobOutput.getAnalyseErrors().stream())"},{"lineNumber":244,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());"},{"lineNumber":245,"author":{"gitId":"-"},"content":" analysisErrors.forEach(errorInfo -\u003e"},{"lineNumber":246,"author":{"gitId":"-"},"content":" handleAnalysisFailed(configs, errorInfo.getFailedConfig(), errorInfo.getErrorMessage()));"},{"lineNumber":247,"author":{"gitId":"-"},"content":""},{"lineNumber":248,"author":{"gitId":"-"},"content":" RepoCloner repoCloner \u003d new RepoCloner();"},{"lineNumber":249,"author":{"gitId":"-"},"content":" repoCloner.cleanup();"},{"lineNumber":250,"author":{"gitId":"-"},"content":" return generatedFiles;"},{"lineNumber":251,"author":{"gitId":"-"},"content":" }"},{"lineNumber":252,"author":{"gitId":"-"},"content":""},{"lineNumber":253,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":254,"author":{"gitId":"-"},"content":" * Clones repo specified by {@code config} at {@code location}."},{"lineNumber":255,"author":{"gitId":"-"},"content":" * For test environments, cloning is skipped if it has been done before and {@code shouldFreshClone} is false."},{"lineNumber":256,"author":{"gitId":"-"},"content":" *"},{"lineNumber":257,"author":{"gitId":"-"},"content":" * @return A {@link CloneJobOutput} object comprising the {@code location} of the repo, whether the cloning was"},{"lineNumber":258,"author":{"gitId":"-"},"content":" * successful, and the {@code defaultBranch} of the repo."},{"lineNumber":259,"author":{"gitId":"-"},"content":" */"},{"lineNumber":260,"author":{"gitId":"-"},"content":" private CloneJobOutput cloneRepo(RepoConfiguration config, RepoLocation location, boolean shouldFreshClone) {"},{"lineNumber":261,"author":{"gitId":"-"},"content":" RepoCloner repoCloner \u003d new RepoCloner();"},{"lineNumber":262,"author":{"gitId":"-"},"content":" repoCloner.cloneBare(config, shouldFreshClone);"},{"lineNumber":263,"author":{"gitId":"-"},"content":" RepoLocation clonedRepoLocation \u003d repoCloner.getClonedRepoLocation();"},{"lineNumber":264,"author":{"gitId":"-"},"content":" if (clonedRepoLocation !\u003d null) {"},{"lineNumber":265,"author":{"gitId":"-"},"content":" String defaultBranch \u003d repoCloner.getCurrentRepoDefaultBranch();"},{"lineNumber":266,"author":{"gitId":"-"},"content":" return new CloneJobOutput(location, defaultBranch);"},{"lineNumber":267,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":268,"author":{"gitId":"-"},"content":" return new CloneJobOutput(location);"},{"lineNumber":269,"author":{"gitId":"-"},"content":" }"},{"lineNumber":270,"author":{"gitId":"-"},"content":" }"},{"lineNumber":271,"author":{"gitId":"-"},"content":""},{"lineNumber":272,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":273,"author":{"gitId":"-"},"content":" * Analyzes all repos in {@code configsToAnalyze} and generates their report at {@code outputPath}."},{"lineNumber":274,"author":{"gitId":"-"},"content":" * Uses {@code cloneJobOutput} to find repo location, default branch and whether cloning was successful."},{"lineNumber":275,"author":{"gitId":"-"},"content":" *"},{"lineNumber":276,"author":{"gitId":"-"},"content":" * @return An {@link AnalyzeJobOutput} object comprising the {@code location} of the repo, whether the cloning was"},{"lineNumber":277,"author":{"gitId":"-"},"content":" * successful, the list of {@code generatedFiles} by the analysis and a list of {@code analysisErrors} encountered."},{"lineNumber":278,"author":{"gitId":"-"},"content":" */"},{"lineNumber":279,"author":{"gitId":"-"},"content":" private AnalyzeJobOutput analyzeRepos(String outputPath, List\u003cRepoConfiguration\u003e configsToAnalyze,"},{"lineNumber":280,"author":{"gitId":"-"},"content":" CloneJobOutput cloneJobOutput) {"},{"lineNumber":281,"author":{"gitId":"-"},"content":" RepoLocation location \u003d cloneJobOutput.getLocation();"},{"lineNumber":282,"author":{"gitId":"-"},"content":" boolean cloneSuccessful \u003d cloneJobOutput.isCloneSuccessful();"},{"lineNumber":283,"author":{"gitId":"-"},"content":""},{"lineNumber":284,"author":{"gitId":"-"},"content":" List\u003cPath\u003e generatedFiles \u003d new ArrayList\u003c\u003e();"},{"lineNumber":285,"author":{"gitId":"-"},"content":" List\u003cAnalysisErrorInfo\u003e analysisErrors \u003d new ArrayList\u003c\u003e();"},{"lineNumber":286,"author":{"gitId":"-"},"content":" RepoCloner repoCloner \u003d new RepoCloner();"},{"lineNumber":287,"author":{"gitId":"-"},"content":" if (!cloneSuccessful) {"},{"lineNumber":288,"author":{"gitId":"-"},"content":" repoCloner.cleanupRepo(configsToAnalyze.get(0));"},{"lineNumber":289,"author":{"gitId":"-"},"content":" return new AnalyzeJobOutput(location, cloneSuccessful, generatedFiles, analysisErrors);"},{"lineNumber":290,"author":{"gitId":"-"},"content":" }"},{"lineNumber":291,"author":{"gitId":"-"},"content":" Iterator\u003cRepoConfiguration\u003e itr \u003d configsToAnalyze.iterator();"},{"lineNumber":292,"author":{"gitId":"-"},"content":" while (itr.hasNext()) {"},{"lineNumber":293,"author":{"gitId":"-"},"content":" progressTracker.incrementProgress();"},{"lineNumber":294,"author":{"gitId":"-"},"content":" RepoConfiguration configToAnalyze \u003d itr.next();"},{"lineNumber":295,"author":{"gitId":"-"},"content":" configToAnalyze.updateBranch(cloneJobOutput.getDefaultBranch());"},{"lineNumber":296,"author":{"gitId":"-"},"content":""},{"lineNumber":297,"author":{"gitId":"-"},"content":" Path repoReportDirectory \u003d Paths.get(outputPath, configToAnalyze.getOutputFolderName());"},{"lineNumber":298,"author":{"gitId":"-"},"content":" logger.info("},{"lineNumber":299,"author":{"gitId":"-"},"content":" String.format(progressTracker.getProgress() + \" \""},{"lineNumber":300,"author":{"gitId":"-"},"content":" + MESSAGE_START_ANALYSIS, configToAnalyze.getLocation(), configToAnalyze.getBranch()));"},{"lineNumber":301,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":302,"author":{"gitId":"-"},"content":" GitRevParse.assertBranchExists(configToAnalyze, FileUtil.getBareRepoPath(configToAnalyze));"},{"lineNumber":303,"author":{"gitId":"-"},"content":" GitClone.cloneFromBareAndUpdateBranch(Paths.get(\".\"), configToAnalyze);"},{"lineNumber":304,"author":{"gitId":"-"},"content":""},{"lineNumber":305,"author":{"gitId":"-"},"content":" FileUtil.createDirectory(repoReportDirectory);"},{"lineNumber":306,"author":{"gitId":"-"},"content":" generatedFiles.addAll(analyzeRepo(configToAnalyze, repoReportDirectory.toString()));"},{"lineNumber":307,"author":{"gitId":"-"},"content":" } catch (IOException ioe) {"},{"lineNumber":308,"author":{"gitId":"-"},"content":" String logMessage \u003d String.format(MESSAGE_ERROR_CREATING_DIRECTORY,"},{"lineNumber":309,"author":{"gitId":"-"},"content":" configToAnalyze.getLocation(), configToAnalyze.getBranch());"},{"lineNumber":310,"author":{"gitId":"-"},"content":" logger.log(Level.WARNING, logMessage, ioe);"},{"lineNumber":311,"author":{"gitId":"-"},"content":" } catch (GitBranchException gbe) {"},{"lineNumber":312,"author":{"gitId":"-"},"content":" logger.log(Level.SEVERE, String.format(MESSAGE_BRANCH_DOES_NOT_EXIST,"},{"lineNumber":313,"author":{"gitId":"-"},"content":" configToAnalyze.getBranch(), configToAnalyze.getLocation()), gbe);"},{"lineNumber":314,"author":{"gitId":"-"},"content":" analysisErrors.add(new AnalysisErrorInfo(configToAnalyze,"},{"lineNumber":315,"author":{"gitId":"-"},"content":" String.format(LOG_BRANCH_DOES_NOT_EXIST, configToAnalyze.getBranch())));"},{"lineNumber":316,"author":{"gitId":"-"},"content":" } catch (GitCloneException gce) {"},{"lineNumber":317,"author":{"gitId":"-"},"content":" analysisErrors.add(new AnalysisErrorInfo(configToAnalyze, LOG_ERROR_CLONING_OR_BRANCHING));"},{"lineNumber":318,"author":{"gitId":"-"},"content":" } catch (NoAuthorsWithCommitsFoundException nafe) {"},{"lineNumber":319,"author":{"gitId":"-"},"content":" logger.log(Level.WARNING, String.format(MESSAGE_NO_AUTHORS_WITH_COMMITS_FOUND,"},{"lineNumber":320,"author":{"gitId":"-"},"content":" configToAnalyze.getLocation(), configToAnalyze.getBranch()));"},{"lineNumber":321,"author":{"gitId":"-"},"content":" generatedFiles.addAll(generateEmptyRepoReport(repoReportDirectory.toString(),"},{"lineNumber":322,"author":{"gitId":"-"},"content":" Author.NAME_NO_AUTHOR_WITH_COMMITS_FOUND));"},{"lineNumber":323,"author":{"gitId":"-"},"content":" generateEmptyRepoReport(repoReportDirectory.toString(), Author.NAME_NO_AUTHOR_WITH_COMMITS_FOUND);"},{"lineNumber":324,"author":{"gitId":"-"},"content":" } catch (Exception e) {"},{"lineNumber":325,"author":{"gitId":"-"},"content":" StringWriter sw \u003d new StringWriter();"},{"lineNumber":326,"author":{"gitId":"-"},"content":" e.printStackTrace(new PrintWriter(sw));"},{"lineNumber":327,"author":{"gitId":"-"},"content":" logger.log(Level.SEVERE, sw.toString());"},{"lineNumber":328,"author":{"gitId":"-"},"content":" analysisErrors.add(new AnalysisErrorInfo(configToAnalyze,"},{"lineNumber":329,"author":{"gitId":"-"},"content":" String.format(LOG_UNEXPECTED_ERROR, configToAnalyze.getLocation(), sw.toString())));"},{"lineNumber":330,"author":{"gitId":"-"},"content":" }"},{"lineNumber":331,"author":{"gitId":"-"},"content":" }"},{"lineNumber":332,"author":{"gitId":"-"},"content":" repoCloner.cleanupRepo(configsToAnalyze.get(0));"},{"lineNumber":333,"author":{"gitId":"-"},"content":" return new AnalyzeJobOutput(location, cloneSuccessful, generatedFiles, analysisErrors);"},{"lineNumber":334,"author":{"gitId":"-"},"content":" }"},{"lineNumber":335,"author":{"gitId":"-"},"content":""},{"lineNumber":336,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":337,"author":{"gitId":"-"},"content":" * Analyzes repo specified by {@code config} and generates the report at {@code repoReportDirectory}."},{"lineNumber":338,"author":{"gitId":"-"},"content":" *"},{"lineNumber":339,"author":{"gitId":"-"},"content":" * @return A list of paths to the JSON report files generated for the repo specified by {@code config}."},{"lineNumber":340,"author":{"gitId":"-"},"content":" * @throws NoAuthorsWithCommitsFoundException if there are no authors with commits found for the repo."},{"lineNumber":341,"author":{"gitId":"-"},"content":" */"},{"lineNumber":342,"author":{"gitId":"-"},"content":" private List\u003cPath\u003e analyzeRepo(RepoConfiguration config, String repoReportDirectory)"},{"lineNumber":343,"author":{"gitId":"-"},"content":" throws NoAuthorsWithCommitsFoundException {"},{"lineNumber":344,"author":{"gitId":"-"},"content":" // preprocess the config and repo"},{"lineNumber":345,"author":{"gitId":"-"},"content":" updateRepoConfig(config);"},{"lineNumber":346,"author":{"gitId":"-"},"content":" updateAuthorList(config);"},{"lineNumber":347,"author":{"gitId":"-"},"content":" updateIgnoreCommitList(config);"},{"lineNumber":348,"author":{"gitId":"-"},"content":""},{"lineNumber":349,"author":{"gitId":"-"},"content":" if (config.isFindingPreviousAuthorsPerformed()) {"},{"lineNumber":350,"author":{"gitId":"-"},"content":" generateIgnoreRevsFile(config);"},{"lineNumber":351,"author":{"gitId":"-"},"content":" }"},{"lineNumber":352,"author":{"gitId":"-"},"content":""},{"lineNumber":353,"author":{"gitId":"-"},"content":" AuthorshipReporter authorshipReporter \u003d new AuthorshipReporter();"},{"lineNumber":354,"author":{"gitId":"-"},"content":" AuthorshipSummary authorshipSummary \u003d authorshipReporter.generateAuthorshipSummary(config);"},{"lineNumber":355,"author":{"gitId":"-"},"content":""},{"lineNumber":356,"author":{"gitId":"-"},"content":" CommitsReporter commitsReporter \u003d new CommitsReporter();"},{"lineNumber":357,"author":{"gitId":"-"},"content":" CommitContributionSummary commitSummary \u003d commitsReporter.generateCommitSummary(config);"},{"lineNumber":358,"author":{"gitId":"-"},"content":" earliestSinceDate \u003d commitSummary.getEarliestSinceDate();"},{"lineNumber":359,"author":{"gitId":"-"},"content":""},{"lineNumber":360,"author":{"gitId":"-"},"content":" List\u003cPath\u003e generatedFiles \u003d generateIndividualRepoReport(repoReportDirectory, commitSummary, authorshipSummary);"},{"lineNumber":361,"author":{"gitId":"-"},"content":" logger.info(String.format(MESSAGE_COMPLETE_ANALYSIS, config.getLocation(), config.getBranch()));"},{"lineNumber":362,"author":{"gitId":"-"},"content":" return generatedFiles;"},{"lineNumber":363,"author":{"gitId":"-"},"content":" }"},{"lineNumber":364,"author":{"gitId":"-"},"content":""},{"lineNumber":365,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":366,"author":{"gitId":"-"},"content":" * Updates {@code config} with configuration provided by repository if exists."},{"lineNumber":367,"author":{"gitId":"-"},"content":" *"},{"lineNumber":368,"author":{"gitId":"-"},"content":" * @throws AssertionError if there is a problem with the file existence check."},{"lineNumber":369,"author":{"gitId":"-"},"content":" */"},{"lineNumber":370,"author":{"gitId":"-"},"content":" public void updateRepoConfig(RepoConfiguration config) throws AssertionError {"},{"lineNumber":371,"author":{"gitId":"-"},"content":" Path configJsonPath \u003d"},{"lineNumber":372,"author":{"gitId":"-"},"content":" Paths.get(config.getRepoRoot(), REPOSENSE_CONFIG_FOLDER, REPOSENSE_CONFIG_FILE).toAbsolutePath();"},{"lineNumber":373,"author":{"gitId":"-"},"content":""},{"lineNumber":374,"author":{"gitId":"-"},"content":" if (!Files.exists(configJsonPath)) {"},{"lineNumber":375,"author":{"gitId":"-"},"content":" logger.info(String.format(MESSAGE_NO_STANDALONE_CONFIG, config.getLocation(), config.getBranch()));"},{"lineNumber":376,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":377,"author":{"gitId":"-"},"content":" }"},{"lineNumber":378,"author":{"gitId":"-"},"content":""},{"lineNumber":379,"author":{"gitId":"-"},"content":" if (config.isStandaloneConfigIgnored()) {"},{"lineNumber":380,"author":{"gitId":"-"},"content":" logger.info(String.format(MESSAGE_IGNORING_STANDALONE_CONFIG, config.getLocation(), config.getBranch()));"},{"lineNumber":381,"author":{"gitId":"-"},"content":" return;"},{"lineNumber":382,"author":{"gitId":"-"},"content":" }"},{"lineNumber":383,"author":{"gitId":"-"},"content":""},{"lineNumber":384,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":385,"author":{"gitId":"-"},"content":" StandaloneConfig standaloneConfig \u003d new StandaloneConfigJsonParser().parse(configJsonPath);"},{"lineNumber":386,"author":{"gitId":"-"},"content":" config.update(standaloneConfig);"},{"lineNumber":387,"author":{"gitId":"-"},"content":" } catch (JsonSyntaxException jse) {"},{"lineNumber":388,"author":{"gitId":"-"},"content":" logger.warning(String.format(MESSAGE_MALFORMED_STANDALONE_CONFIG, config.getDisplayName(),"},{"lineNumber":389,"author":{"gitId":"-"},"content":" REPOSENSE_CONFIG_FOLDER, REPOSENSE_CONFIG_FILE, config.getLocation(), config.getBranch()));"},{"lineNumber":390,"author":{"gitId":"-"},"content":" } catch (IllegalArgumentException iae) {"},{"lineNumber":391,"author":{"gitId":"-"},"content":" logger.warning(String.format(MESSAGE_INVALID_CONFIG_JSON,"},{"lineNumber":392,"author":{"gitId":"-"},"content":" iae.getMessage(), config.getLocation(), config.getBranch()));"},{"lineNumber":393,"author":{"gitId":"-"},"content":" } catch (IOException ioe) {"},{"lineNumber":394,"author":{"gitId":"-"},"content":" throw new AssertionError("},{"lineNumber":395,"author":{"gitId":"-"},"content":" \"This exception should not happen as we have performed the file existence check.\");"},{"lineNumber":396,"author":{"gitId":"-"},"content":" }"},{"lineNumber":397,"author":{"gitId":"-"},"content":" }"},{"lineNumber":398,"author":{"gitId":"-"},"content":""},{"lineNumber":399,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":400,"author":{"gitId":"-"},"content":" * Find and update {@code config} with all the author identities if author list is empty."},{"lineNumber":401,"author":{"gitId":"-"},"content":" * Also removes ignored authors from author list."},{"lineNumber":402,"author":{"gitId":"-"},"content":" *"},{"lineNumber":403,"author":{"gitId":"-"},"content":" * @throws NoAuthorsWithCommitsFoundException if there are no authors with commits found for the repo."},{"lineNumber":404,"author":{"gitId":"-"},"content":" */"},{"lineNumber":405,"author":{"gitId":"-"},"content":" private void updateAuthorList(RepoConfiguration config) throws NoAuthorsWithCommitsFoundException {"},{"lineNumber":406,"author":{"gitId":"-"},"content":" if (config.getAuthorList().isEmpty()) {"},{"lineNumber":407,"author":{"gitId":"-"},"content":" logger.info(String.format(MESSAGE_NO_AUTHORS_SPECIFIED, config.getLocation(), config.getBranch()));"},{"lineNumber":408,"author":{"gitId":"-"},"content":" List\u003cAuthor\u003e authorList \u003d GitShortlog.getAuthors(config);"},{"lineNumber":409,"author":{"gitId":"-"},"content":""},{"lineNumber":410,"author":{"gitId":"-"},"content":" if (authorList.isEmpty()) {"},{"lineNumber":411,"author":{"gitId":"-"},"content":" throw new NoAuthorsWithCommitsFoundException();"},{"lineNumber":412,"author":{"gitId":"-"},"content":" }"},{"lineNumber":413,"author":{"gitId":"-"},"content":""},{"lineNumber":414,"author":{"gitId":"-"},"content":" config.setAuthorList(authorList);"},{"lineNumber":415,"author":{"gitId":"-"},"content":" }"},{"lineNumber":416,"author":{"gitId":"-"},"content":" config.removeIgnoredAuthors();"},{"lineNumber":417,"author":{"gitId":"-"},"content":" }"},{"lineNumber":418,"author":{"gitId":"-"},"content":""},{"lineNumber":419,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":420,"author":{"gitId":"-"},"content":" * Updates {@code config} with the exact list of commits if commit ranges are provided."},{"lineNumber":421,"author":{"gitId":"-"},"content":" */"},{"lineNumber":422,"author":{"gitId":"-"},"content":" private void updateIgnoreCommitList(RepoConfiguration config) {"},{"lineNumber":423,"author":{"gitId":"-"},"content":" List\u003cCommitHash\u003e updatedIgnoreCommitList \u003d config.getIgnoreCommitList().stream()"},{"lineNumber":424,"author":{"gitId":"-"},"content":" .flatMap(x -\u003e CommitHash.getHashes(config.getRepoRoot(), config.getBranch(), x))"},{"lineNumber":425,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());"},{"lineNumber":426,"author":{"gitId":"-"},"content":" config.setIgnoreCommitList(updatedIgnoreCommitList);"},{"lineNumber":427,"author":{"gitId":"-"},"content":" }"},{"lineNumber":428,"author":{"gitId":"-"},"content":""},{"lineNumber":429,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":430,"author":{"gitId":"-"},"content":" * Adds {@code configs} that were not successfully cloned from {@code failedRepoLocation}"},{"lineNumber":431,"author":{"gitId":"-"},"content":" * into the list of errors in the summary report and removes them from the list of {@code configs}."},{"lineNumber":432,"author":{"gitId":"-"},"content":" */"},{"lineNumber":433,"author":{"gitId":"-"},"content":" private void handleCloningFailed(List\u003cRepoConfiguration\u003e configs, RepoLocation failedRepoLocation) {"},{"lineNumber":434,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e failedConfigs \u003d configs.stream()"},{"lineNumber":435,"author":{"gitId":"-"},"content":" .filter(config -\u003e config.getLocation().equals(failedRepoLocation))"},{"lineNumber":436,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());"},{"lineNumber":437,"author":{"gitId":"-"},"content":" handleFailedConfigs(configs, failedConfigs, String.format(LOG_ERROR_CLONING, failedRepoLocation));"},{"lineNumber":438,"author":{"gitId":"-"},"content":" }"},{"lineNumber":439,"author":{"gitId":"-"},"content":""},{"lineNumber":440,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":441,"author":{"gitId":"-"},"content":" * Adds {@code failedConfig} that failed analysis into the list of errors in the summary report along with"},{"lineNumber":442,"author":{"gitId":"-"},"content":" * an {@code errorMessage} and removes {@code failedConfig} from the list of {@code configs}."},{"lineNumber":443,"author":{"gitId":"-"},"content":" */"},{"lineNumber":444,"author":{"gitId":"-"},"content":" private void handleAnalysisFailed(List\u003cRepoConfiguration\u003e configs, RepoConfiguration failedConfig,"},{"lineNumber":445,"author":{"gitId":"-"},"content":" String errorMessage) {"},{"lineNumber":446,"author":{"gitId":"-"},"content":" handleFailedConfigs(configs, Collections.singletonList(failedConfig), errorMessage);"},{"lineNumber":447,"author":{"gitId":"-"},"content":" }"},{"lineNumber":448,"author":{"gitId":"-"},"content":""},{"lineNumber":449,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":450,"author":{"gitId":"-"},"content":" * Adds {@code failedConfigs} that failed cloning/analysis into the list of errors in the summary report along"},{"lineNumber":451,"author":{"gitId":"-"},"content":" * with an {@code errorMessage} and removes {@code failedConfigs} from the list of {@code configs}."},{"lineNumber":452,"author":{"gitId":"-"},"content":" */"},{"lineNumber":453,"author":{"gitId":"-"},"content":" private void handleFailedConfigs(List\u003cRepoConfiguration\u003e configs, List\u003cRepoConfiguration\u003e failedConfigs,"},{"lineNumber":454,"author":{"gitId":"-"},"content":" String errorMessage) {"},{"lineNumber":455,"author":{"gitId":"-"},"content":" Iterator\u003cRepoConfiguration\u003e itr \u003d configs.iterator();"},{"lineNumber":456,"author":{"gitId":"-"},"content":" while (itr.hasNext()) {"},{"lineNumber":457,"author":{"gitId":"-"},"content":" RepoConfiguration config \u003d itr.next();"},{"lineNumber":458,"author":{"gitId":"-"},"content":" if (failedConfigs.contains(config)) {"},{"lineNumber":459,"author":{"gitId":"-"},"content":" ErrorSummary.getInstance().addErrorMessage(config.getDisplayName(), errorMessage);"},{"lineNumber":460,"author":{"gitId":"-"},"content":" itr.remove();"},{"lineNumber":461,"author":{"gitId":"-"},"content":" }"},{"lineNumber":462,"author":{"gitId":"-"},"content":" }"},{"lineNumber":463,"author":{"gitId":"-"},"content":" }"},{"lineNumber":464,"author":{"gitId":"-"},"content":""},{"lineNumber":465,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":466,"author":{"gitId":"-"},"content":" * Generates an empty report at the {@code repoReportDirectory}, with the author display name"},{"lineNumber":467,"author":{"gitId":"-"},"content":" * as {@code displayName}."},{"lineNumber":468,"author":{"gitId":"-"},"content":" *"},{"lineNumber":469,"author":{"gitId":"-"},"content":" * @return A list of paths to the JSON report files generated for this empty report."},{"lineNumber":470,"author":{"gitId":"-"},"content":" */"},{"lineNumber":471,"author":{"gitId":"-"},"content":" private List\u003cPath\u003e generateEmptyRepoReport(String repoReportDirectory, String displayName) {"},{"lineNumber":472,"author":{"gitId":"-"},"content":" CommitReportJson emptyCommitReportJson \u003d new CommitReportJson(displayName);"},{"lineNumber":473,"author":{"gitId":"-"},"content":""},{"lineNumber":474,"author":{"gitId":"-"},"content":" List\u003cPath\u003e generatedFiles \u003d new ArrayList\u003c\u003e();"},{"lineNumber":475,"author":{"gitId":"-"},"content":" FileUtil.writeJsonFile(emptyCommitReportJson, getIndividualCommitsPath(repoReportDirectory))"},{"lineNumber":476,"author":{"gitId":"-"},"content":" .ifPresent(generatedFiles::add);"},{"lineNumber":477,"author":{"gitId":"-"},"content":" FileUtil.writeJsonFile(Collections.emptyList(), getIndividualAuthorshipPath(repoReportDirectory))"},{"lineNumber":478,"author":{"gitId":"-"},"content":" .ifPresent(generatedFiles::add);"},{"lineNumber":479,"author":{"gitId":"-"},"content":""},{"lineNumber":480,"author":{"gitId":"-"},"content":" return generatedFiles;"},{"lineNumber":481,"author":{"gitId":"-"},"content":" }"},{"lineNumber":482,"author":{"gitId":"-"},"content":""},{"lineNumber":483,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":484,"author":{"gitId":"-"},"content":" * Generates a report for a single repository at {@code repoReportDirectory} based on {@code commitSummary}"},{"lineNumber":485,"author":{"gitId":"-"},"content":" * and {@code authorshipSummary}."},{"lineNumber":486,"author":{"gitId":"-"},"content":" *"},{"lineNumber":487,"author":{"gitId":"-"},"content":" * @return A list of paths to the JSON report files generated for this report."},{"lineNumber":488,"author":{"gitId":"-"},"content":" */"},{"lineNumber":489,"author":{"gitId":"-"},"content":" private List\u003cPath\u003e generateIndividualRepoReport(String repoReportDirectory,"},{"lineNumber":490,"author":{"gitId":"-"},"content":" CommitContributionSummary commitSummary, AuthorshipSummary authorshipSummary) {"},{"lineNumber":491,"author":{"gitId":"-"},"content":" CommitReportJson commitReportJson \u003d new CommitReportJson(commitSummary, authorshipSummary);"},{"lineNumber":492,"author":{"gitId":"-"},"content":""},{"lineNumber":493,"author":{"gitId":"-"},"content":" List\u003cPath\u003e generatedFiles \u003d new ArrayList\u003c\u003e();"},{"lineNumber":494,"author":{"gitId":"-"},"content":" FileUtil.writeJsonFile(commitReportJson, getIndividualCommitsPath(repoReportDirectory))"},{"lineNumber":495,"author":{"gitId":"-"},"content":" .ifPresent(generatedFiles::add);"},{"lineNumber":496,"author":{"gitId":"-"},"content":" FileUtil.writeJsonFile(authorshipSummary.getFileResults(), getIndividualAuthorshipPath(repoReportDirectory))"},{"lineNumber":497,"author":{"gitId":"-"},"content":" .ifPresent(generatedFiles::add);"},{"lineNumber":498,"author":{"gitId":"-"},"content":" return generatedFiles;"},{"lineNumber":499,"author":{"gitId":"-"},"content":" }"},{"lineNumber":500,"author":{"gitId":"-"},"content":""},{"lineNumber":501,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":502,"author":{"gitId":"-"},"content":" * Creates the .git-blame-ignore-revs file containing the contents of {@code ignoreCommitList}"},{"lineNumber":503,"author":{"gitId":"-"},"content":" * in the repo root directory of {@code config}."},{"lineNumber":504,"author":{"gitId":"-"},"content":" */"},{"lineNumber":505,"author":{"gitId":"-"},"content":" private void generateIgnoreRevsFile(RepoConfiguration config) {"},{"lineNumber":506,"author":{"gitId":"-"},"content":" List\u003cCommitHash\u003e expandedIgnoreCommitList \u003d config.getIgnoreCommitList().stream()"},{"lineNumber":507,"author":{"gitId":"-"},"content":" .map(CommitHash::toString)"},{"lineNumber":508,"author":{"gitId":"-"},"content":" .map(commitHash -\u003e {"},{"lineNumber":509,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":510,"author":{"gitId":"-"},"content":" return GitShow.getExpandedCommitHash(config.getRepoRoot(), commitHash);"},{"lineNumber":511,"author":{"gitId":"-"},"content":" } catch (CommitNotFoundException e) {"},{"lineNumber":512,"author":{"gitId":"-"},"content":" logger.warning(String.format(LOG_ERROR_EXPANDING_COMMIT, commitHash));"},{"lineNumber":513,"author":{"gitId":"-"},"content":" return new CommitHash(commitHash);"},{"lineNumber":514,"author":{"gitId":"-"},"content":" }"},{"lineNumber":515,"author":{"gitId":"-"},"content":" })"},{"lineNumber":516,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());"},{"lineNumber":517,"author":{"gitId":"-"},"content":""},{"lineNumber":518,"author":{"gitId":"-"},"content":" config.setIgnoreCommitList(expandedIgnoreCommitList);"},{"lineNumber":519,"author":{"gitId":"-"},"content":" FileUtil.writeIgnoreRevsFile(getIgnoreRevsFilePath(config.getRepoRoot()), config.getIgnoreCommitList());"},{"lineNumber":520,"author":{"gitId":"-"},"content":" }"},{"lineNumber":521,"author":{"gitId":"-"},"content":""},{"lineNumber":522,"author":{"gitId":"-"},"content":" private String getSummaryResultPath(String targetFileLocation) {"},{"lineNumber":523,"author":{"gitId":"-"},"content":" return targetFileLocation + \"/\" + SummaryJson.SUMMARY_JSON_FILE_NAME;"},{"lineNumber":524,"author":{"gitId":"-"},"content":" }"},{"lineNumber":525,"author":{"gitId":"-"},"content":""},{"lineNumber":526,"author":{"gitId":"-"},"content":" private String getIgnoreRevsFilePath(String targetFileLocation) {"},{"lineNumber":527,"author":{"gitId":"-"},"content":" return targetFileLocation + GitBlame.IGNORE_COMMIT_LIST_FILE_NAME;"},{"lineNumber":528,"author":{"gitId":"-"},"content":" }"},{"lineNumber":529,"author":{"gitId":"-"},"content":""},{"lineNumber":530,"author":{"gitId":"-"},"content":" private String getIndividualAuthorshipPath(String repoReportDirectory) {"},{"lineNumber":531,"author":{"gitId":"-"},"content":" return repoReportDirectory + \"/authorship.json\";"},{"lineNumber":532,"author":{"gitId":"-"},"content":" }"},{"lineNumber":533,"author":{"gitId":"-"},"content":""},{"lineNumber":534,"author":{"gitId":"-"},"content":" private String getIndividualCommitsPath(String repoReportDirectory) {"},{"lineNumber":535,"author":{"gitId":"-"},"content":" return repoReportDirectory + \"/commits.json\";"},{"lineNumber":536,"author":{"gitId":"-"},"content":" }"},{"lineNumber":537,"author":{"gitId":"-"},"content":""},{"lineNumber":538,"author":{"gitId":"-"},"content":" public void setEarliestSinceDate(LocalDateTime newEarliestSinceDate) {"},{"lineNumber":539,"author":{"gitId":"-"},"content":" if (earliestSinceDate \u003d\u003d null || newEarliestSinceDate.compareTo(earliestSinceDate) \u003c 0) {"},{"lineNumber":540,"author":{"gitId":"-"},"content":" earliestSinceDate \u003d newEarliestSinceDate;"},{"lineNumber":541,"author":{"gitId":"-"},"content":" }"},{"lineNumber":542,"author":{"gitId":"-"},"content":" }"},{"lineNumber":543,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"sopa301":1,"-":542}},{"path":"src/main/java/reposense/util/StringsUtil.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.util;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.util.regex.Pattern;"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Contains strings related utilities."},{"lineNumber":7,"author":{"gitId":"-"},"content":" */"},{"lineNumber":8,"author":{"gitId":"-"},"content":"public class StringsUtil {"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":" private static final Pattern SPECIAL_SYMBOLS \u003d Pattern.compile(\"[@;:\u0026/\\\\\\\\!\u003c\u003e{}%#\\\"\\\\-\u003d\u0027()\\\\[\\\\].+*?^$|]\");"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * Filters the {@code text}, returning only the lines that matches the given {@code regex}."},{"lineNumber":14,"author":{"gitId":"-"},"content":" */"},{"lineNumber":15,"author":{"gitId":"-"},"content":" public static String filterText(String text, String regex) {"},{"lineNumber":16,"author":{"gitId":"-"},"content":" String[] split \u003d text.split(\"\\n\");"},{"lineNumber":17,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();"},{"lineNumber":18,"author":{"gitId":"asdfghjkxd"},"content":" Pattern regexPattern \u003d Pattern.compile(regex);"},{"lineNumber":19,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":" for (String line: split) {"},{"lineNumber":21,"author":{"gitId":"asdfghjkxd"},"content":" if (regexPattern.matcher(line).matches()) {"},{"lineNumber":22,"author":{"gitId":"asdfghjkxd"},"content":" sb.append(line).append(\"\\n\");"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":" return sb.toString();"},{"lineNumber":27,"author":{"gitId":"-"},"content":" }"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * Converts all special symbol characters inside {@code regexString} to the {@code replacementCharacter}."},{"lineNumber":31,"author":{"gitId":"-"},"content":" */"},{"lineNumber":32,"author":{"gitId":"-"},"content":" public static String replaceSpecialSymbols(String regexString, String replacementCharacter) {"},{"lineNumber":33,"author":{"gitId":"-"},"content":" return SPECIAL_SYMBOLS.matcher(regexString).replaceAll(replacementCharacter);"},{"lineNumber":34,"author":{"gitId":"-"},"content":" }"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * Adds quotes to the string."},{"lineNumber":38,"author":{"gitId":"-"},"content":" */"},{"lineNumber":39,"author":{"gitId":"-"},"content":" public static String addQuotes(String original) {"},{"lineNumber":40,"author":{"gitId":"-"},"content":" return \"\\\"\" + original + \"\\\"\";"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }"},{"lineNumber":42,"author":{"gitId":"-"},"content":""},{"lineNumber":43,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Adds the appropriate quotation marks for a file path depending on the OS."},{"lineNumber":45,"author":{"gitId":"-"},"content":" */"},{"lineNumber":46,"author":{"gitId":"-"},"content":" public static String addQuotesForFilePath(String filePath) {"},{"lineNumber":47,"author":{"gitId":"-"},"content":" if (SystemUtil.isWindows()) {"},{"lineNumber":48,"author":{"gitId":"-"},"content":" return \"\\\"\" + filePath + \"\\\"\";"},{"lineNumber":49,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":50,"author":{"gitId":"-"},"content":" StringBuilder sb \u003d new StringBuilder();"},{"lineNumber":51,"author":{"gitId":"-"},"content":" for (int i \u003d 0; i \u003c filePath.length(); i++) {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" char c \u003d filePath.charAt(i);"},{"lineNumber":53,"author":{"gitId":"-"},"content":" if (c \u003d\u003d \u0027\\\u0027\u0027) {"},{"lineNumber":54,"author":{"gitId":"-"},"content":" sb.append(\"\u0027\\\"\u0027\\\"\u0027\");"},{"lineNumber":55,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":56,"author":{"gitId":"-"},"content":" sb.append(c);"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }"},{"lineNumber":59,"author":{"gitId":"-"},"content":" return \u0027\\\u0027\u0027 + sb.toString() + \u0027\\\u0027\u0027;"},{"lineNumber":60,"author":{"gitId":"-"},"content":" }"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }"},{"lineNumber":62,"author":{"gitId":"-"},"content":""},{"lineNumber":63,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * Removes quotes at the start and end of {@code original}, if exists."},{"lineNumber":65,"author":{"gitId":"-"},"content":" */"},{"lineNumber":66,"author":{"gitId":"-"},"content":" public static String removeQuote(String original) {"},{"lineNumber":67,"author":{"gitId":"-"},"content":" return (original.startsWith(\"\\\"\") \u0026\u0026 original.endsWith(\"\\\"\"))"},{"lineNumber":68,"author":{"gitId":"-"},"content":" ? original.substring(1, original.length() - 1)"},{"lineNumber":69,"author":{"gitId":"-"},"content":" : original;"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }"},{"lineNumber":71,"author":{"gitId":"-"},"content":""},{"lineNumber":72,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":73,"author":{"gitId":"-"},"content":" * Removes trailing backslashes from a {@code string}, if it exists."},{"lineNumber":74,"author":{"gitId":"-"},"content":" */"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public static String removeTrailingBackslash(String string) {"},{"lineNumber":76,"author":{"gitId":"-"},"content":" if (string.isEmpty()) {"},{"lineNumber":77,"author":{"gitId":"-"},"content":" return string;"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }"},{"lineNumber":79,"author":{"gitId":"-"},"content":" int lastCharIndex \u003d string.length() - 1;"},{"lineNumber":80,"author":{"gitId":"-"},"content":" String editedString \u003d string;"},{"lineNumber":81,"author":{"gitId":"-"},"content":" boolean isLastCharBackslash \u003d string.charAt(lastCharIndex) \u003d\u003d \u0027\\\\\u0027;"},{"lineNumber":82,"author":{"gitId":"-"},"content":" while (isLastCharBackslash) {"},{"lineNumber":83,"author":{"gitId":"-"},"content":" editedString \u003d editedString.substring(0, lastCharIndex--);"},{"lineNumber":84,"author":{"gitId":"-"},"content":" boolean isStringEmpty \u003d editedString.length() \u003d\u003d 0;"},{"lineNumber":85,"author":{"gitId":"-"},"content":" isLastCharBackslash \u003d !isStringEmpty \u0026\u0026 editedString.charAt(lastCharIndex) \u003d\u003d \u0027\\\\\u0027;"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }"},{"lineNumber":87,"author":{"gitId":"-"},"content":" return editedString;"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }"},{"lineNumber":89,"author":{"gitId":"-"},"content":""},{"lineNumber":90,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":91,"author":{"gitId":"-"},"content":" * Returns true iff {@code string} is purely numeric."},{"lineNumber":92,"author":{"gitId":"-"},"content":" */"},{"lineNumber":93,"author":{"gitId":"-"},"content":" public static boolean isNumeric(String string) {"},{"lineNumber":94,"author":{"gitId":"-"},"content":" return Pattern.compile(\"^\\\\d+$\").matcher(string).matches();"},{"lineNumber":95,"author":{"gitId":"-"},"content":" }"},{"lineNumber":96,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":4,"-":92}},{"path":"src/main/java/reposense/util/TimeUtil.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.util;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.time.LocalDateTime;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.time.ZoneId;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.time.format.DateTimeFormatter;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.time.format.DateTimeParseException;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.time.format.ResolverStyle;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.logging.Logger;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.regex.Matcher;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.regex.Pattern;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.SinceDateArgumentType;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import reposense.system.LogsManager;"},{"lineNumber":14,"author":{"gitId":"-"},"content":""},{"lineNumber":15,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * Contains time related functionalities."},{"lineNumber":17,"author":{"gitId":"-"},"content":" */"},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class TimeUtil {"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private static Long startTime;"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private static final String DATE_FORMAT_REGEX \u003d"},{"lineNumber":21,"author":{"gitId":"-"},"content":" \"^((0?[1-9]|[12][0-9]|3[01])\\\\/(0?[1-9]|1[012])\\\\/(19|2[0-9])[0-9]{2})\";"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":" // \"uuuu\" is used for year since \"yyyy\" does not work with ResolverStyle.STRICT"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final DateTimeFormatter CLI_ARGS_DATE_FORMAT \u003d DateTimeFormatter.ofPattern(\"d/M/uuuu HH:mm:ss\");"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final String EARLIEST_VALID_DATE \u003d \"1970-01-01T00:00:00\";"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final String LATEST_VALID_DATE \u003d \"2099-12-31T23:59:59\";"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private static final String MESSAGE_SINCE_DATE_EARLIER_THAN_EARLIEST_VALID_DATE \u003d"},{"lineNumber":29,"author":{"gitId":"-"},"content":" \"Date of %s must not be earlier than \""},{"lineNumber":30,"author":{"gitId":"-"},"content":" + String.format(\"%s, resetting it to earliest valid date\", EARLIEST_VALID_DATE);"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final String MESSAGE_UNTIL_DATE_LATER_THAN_LATEST_VALID_DATE \u003d"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \"Date of %s must not be later than \""},{"lineNumber":33,"author":{"gitId":"-"},"content":" + String.format(\"%s, resetting it to latest valid date\", LATEST_VALID_DATE);"},{"lineNumber":34,"author":{"gitId":"-"},"content":""},{"lineNumber":35,"author":{"gitId":"-"},"content":" private static final Logger logger \u003d LogsManager.getLogger(TimeUtil.class);"},{"lineNumber":36,"author":{"gitId":"-"},"content":""},{"lineNumber":37,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Sets the {@code startTime} to be the current time."},{"lineNumber":39,"author":{"gitId":"-"},"content":" */"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public static void startTimer() {"},{"lineNumber":41,"author":{"gitId":"-"},"content":" startTime \u003d System.nanoTime();"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * Returns the formatted elapsed time from {@code startTime} until current time."},{"lineNumber":46,"author":{"gitId":"-"},"content":" */"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public static String getElapsedTime() {"},{"lineNumber":48,"author":{"gitId":"-"},"content":" long endTime \u003d System.nanoTime();"},{"lineNumber":49,"author":{"gitId":"-"},"content":" double elapsedTime \u003d (double) (endTime - startTime) / 1_000_000_000.0;"},{"lineNumber":50,"author":{"gitId":"-"},"content":" int elapsedHours \u003d (int) elapsedTime / 3600;"},{"lineNumber":51,"author":{"gitId":"-"},"content":" int elapsedMinutes \u003d (int) (elapsedTime % 3600) / 60;"},{"lineNumber":52,"author":{"gitId":"-"},"content":" double elapsedSeconds \u003d elapsedTime % 60;"},{"lineNumber":53,"author":{"gitId":"-"},"content":" String formattedElapsedTime \u003d \"\";"},{"lineNumber":54,"author":{"gitId":"-"},"content":""},{"lineNumber":55,"author":{"gitId":"-"},"content":" if (elapsedHours \u003e 0) {"},{"lineNumber":56,"author":{"gitId":"-"},"content":" formattedElapsedTime +\u003d String.format(\" %d hour(s)\", elapsedHours);"},{"lineNumber":57,"author":{"gitId":"-"},"content":" }"},{"lineNumber":58,"author":{"gitId":"-"},"content":""},{"lineNumber":59,"author":{"gitId":"-"},"content":" if (elapsedMinutes \u003e 0) {"},{"lineNumber":60,"author":{"gitId":"-"},"content":" formattedElapsedTime +\u003d String.format(\" %d minute(s)\", elapsedMinutes);"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }"},{"lineNumber":62,"author":{"gitId":"-"},"content":""},{"lineNumber":63,"author":{"gitId":"-"},"content":" formattedElapsedTime +\u003d String.format(\" %.2f second(s)\", elapsedSeconds);"},{"lineNumber":64,"author":{"gitId":"-"},"content":" return formattedElapsedTime;"},{"lineNumber":65,"author":{"gitId":"-"},"content":" }"},{"lineNumber":66,"author":{"gitId":"-"},"content":""},{"lineNumber":67,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":68,"author":{"gitId":"-"},"content":" * Returns the formatted elapsed time from {@code startTime} until current time,"},{"lineNumber":69,"author":{"gitId":"-"},"content":" * with an additional explanatory string."},{"lineNumber":70,"author":{"gitId":"-"},"content":" */"},{"lineNumber":71,"author":{"gitId":"-"},"content":" public static String getElapsedTimeMessage() {"},{"lineNumber":72,"author":{"gitId":"-"},"content":" return \"Elapsed processing time:\" + getElapsedTime();"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }"},{"lineNumber":74,"author":{"gitId":"-"},"content":""},{"lineNumber":75,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":76,"author":{"gitId":"-"},"content":" * Returns a valid {@link LocalDateTime} that is set to midnight for the given {@code sinceDate}."},{"lineNumber":77,"author":{"gitId":"-"},"content":" */"},{"lineNumber":78,"author":{"gitId":"-"},"content":" public static LocalDateTime getSinceDate(LocalDateTime sinceDate) {"},{"lineNumber":79,"author":{"gitId":"-"},"content":" return getValidDate(sinceDate).withHour(0).withMinute(0).withSecond(0);"},{"lineNumber":80,"author":{"gitId":"-"},"content":" }"},{"lineNumber":81,"author":{"gitId":"-"},"content":""},{"lineNumber":82,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":83,"author":{"gitId":"-"},"content":" * Returns a valid {@link LocalDateTime} that is set to 23:59:59 for the given {@code untilDate}."},{"lineNumber":84,"author":{"gitId":"-"},"content":" */"},{"lineNumber":85,"author":{"gitId":"-"},"content":" public static LocalDateTime getUntilDate(LocalDateTime untilDate) {"},{"lineNumber":86,"author":{"gitId":"-"},"content":" return getValidDate(untilDate).withHour(23).withMinute(59).withSecond(59);"},{"lineNumber":87,"author":{"gitId":"-"},"content":" }"},{"lineNumber":88,"author":{"gitId":"-"},"content":""},{"lineNumber":89,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":90,"author":{"gitId":"-"},"content":" * Returns a valid {@link LocalDateTime} that is within {@value EARLIEST_VALID_DATE} and {@value LATEST_VALID_DATE}."},{"lineNumber":91,"author":{"gitId":"-"},"content":" * Resets {@code date} passed the closest valid date if it exceeds the date range."},{"lineNumber":92,"author":{"gitId":"-"},"content":" */"},{"lineNumber":93,"author":{"gitId":"-"},"content":" public static LocalDateTime getValidDate(LocalDateTime date) {"},{"lineNumber":94,"author":{"gitId":"-"},"content":" if (date.isBefore(LocalDateTime.parse(EARLIEST_VALID_DATE))) {"},{"lineNumber":95,"author":{"gitId":"-"},"content":" logger.warning(String.format(MESSAGE_SINCE_DATE_EARLIER_THAN_EARLIEST_VALID_DATE, date));"},{"lineNumber":96,"author":{"gitId":"-"},"content":" return LocalDateTime.parse(EARLIEST_VALID_DATE);"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }"},{"lineNumber":98,"author":{"gitId":"-"},"content":""},{"lineNumber":99,"author":{"gitId":"-"},"content":" if (date.isAfter(LocalDateTime.parse(LATEST_VALID_DATE))) {"},{"lineNumber":100,"author":{"gitId":"-"},"content":" logger.warning(String.format(MESSAGE_UNTIL_DATE_LATER_THAN_LATEST_VALID_DATE, date));"},{"lineNumber":101,"author":{"gitId":"-"},"content":" return LocalDateTime.parse(LATEST_VALID_DATE);"},{"lineNumber":102,"author":{"gitId":"-"},"content":" }"},{"lineNumber":103,"author":{"gitId":"-"},"content":" return date;"},{"lineNumber":104,"author":{"gitId":"-"},"content":" }"},{"lineNumber":105,"author":{"gitId":"-"},"content":""},{"lineNumber":106,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":107,"author":{"gitId":"-"},"content":" * Returns a {@link LocalDateTime} that is one month before {@code cliUntilDate} (if present) or one month"},{"lineNumber":108,"author":{"gitId":"-"},"content":" * before report generation date otherwise."},{"lineNumber":109,"author":{"gitId":"-"},"content":" */"},{"lineNumber":110,"author":{"gitId":"-"},"content":" public static LocalDateTime getDateMinusAMonth(LocalDateTime cliUntilDate) {"},{"lineNumber":111,"author":{"gitId":"-"},"content":" return getSinceDate(cliUntilDate.minusMonths(1));"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }"},{"lineNumber":113,"author":{"gitId":"-"},"content":""},{"lineNumber":114,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":115,"author":{"gitId":"-"},"content":" * Returns a {@link LocalDateTime} that is {@code numOfDays} before {@code cliUntilDate} (if present) or one month"},{"lineNumber":116,"author":{"gitId":"-"},"content":" * before report generation date otherwise."},{"lineNumber":117,"author":{"gitId":"-"},"content":" */"},{"lineNumber":118,"author":{"gitId":"-"},"content":" public static LocalDateTime getDateMinusNDays(LocalDateTime cliUntilDate, int numOfDays) {"},{"lineNumber":119,"author":{"gitId":"-"},"content":" return getSinceDate(cliUntilDate.minusDays(numOfDays));"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }"},{"lineNumber":121,"author":{"gitId":"-"},"content":""},{"lineNumber":122,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":123,"author":{"gitId":"-"},"content":" * Returns a {@link LocalDateTime} that is {@code numOfDays} after {@code cliSinceDate} (if present)."},{"lineNumber":124,"author":{"gitId":"-"},"content":" */"},{"lineNumber":125,"author":{"gitId":"-"},"content":" public static LocalDateTime getDatePlusNDays(LocalDateTime cliSinceDate, int numOfDays) {"},{"lineNumber":126,"author":{"gitId":"-"},"content":" return getUntilDate(cliSinceDate.plusDays(numOfDays));"},{"lineNumber":127,"author":{"gitId":"-"},"content":" }"},{"lineNumber":128,"author":{"gitId":"-"},"content":""},{"lineNumber":129,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":130,"author":{"gitId":"-"},"content":" * Returns current date with time set to 23:59:59. The time zone is adjusted to the given {@code zoneId}."},{"lineNumber":131,"author":{"gitId":"-"},"content":" */"},{"lineNumber":132,"author":{"gitId":"-"},"content":" public static LocalDateTime getCurrentDate(ZoneId zoneId) {"},{"lineNumber":133,"author":{"gitId":"-"},"content":" return LocalDateTime.now(zoneId).withHour(23).withMinute(59).withSecond(59).withNano(0);"},{"lineNumber":134,"author":{"gitId":"-"},"content":" }"},{"lineNumber":135,"author":{"gitId":"-"},"content":""},{"lineNumber":136,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":137,"author":{"gitId":"-"},"content":" * Returns the {@link LocalDateTime} of {@code ARBITRARY_FIRST_COMMIT_DATE} in the UTC time zone."},{"lineNumber":138,"author":{"gitId":"-"},"content":" */"},{"lineNumber":139,"author":{"gitId":"-"},"content":" public static LocalDateTime getArbitraryFirstCommitDateLocal() {"},{"lineNumber":140,"author":{"gitId":"-"},"content":" return SinceDateArgumentType.getArbitraryFirstCommitDateLocal();"},{"lineNumber":141,"author":{"gitId":"-"},"content":" }"},{"lineNumber":142,"author":{"gitId":"-"},"content":""},{"lineNumber":143,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":144,"author":{"gitId":"-"},"content":" * Returns the {@link LocalDateTime} of {@code ARBITRARY_FIRST_COMMIT_DATE} adjusted for the time zone based on"},{"lineNumber":145,"author":{"gitId":"-"},"content":" * {@code toZoneId}."},{"lineNumber":146,"author":{"gitId":"-"},"content":" */"},{"lineNumber":147,"author":{"gitId":"-"},"content":" public static LocalDateTime getArbitraryFirstCommitDateConverted(ZoneId toZoneId) {"},{"lineNumber":148,"author":{"gitId":"-"},"content":" return SinceDateArgumentType.getArbitraryFirstCommitDateConverted(toZoneId);"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }"},{"lineNumber":150,"author":{"gitId":"-"},"content":""},{"lineNumber":151,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":152,"author":{"gitId":"-"},"content":" * Checks whether the given {@code dateTime} is the {@code ARBITRARY_FIRST_COMMIT_DATE} in UTC time."},{"lineNumber":153,"author":{"gitId":"-"},"content":" */"},{"lineNumber":154,"author":{"gitId":"-"},"content":" public static boolean isEqualToArbitraryFirstDateUtc(LocalDateTime dateTime) {"},{"lineNumber":155,"author":{"gitId":"-"},"content":" return dateTime.equals(getArbitraryFirstCommitDateLocal());"},{"lineNumber":156,"author":{"gitId":"-"},"content":" }"},{"lineNumber":157,"author":{"gitId":"-"},"content":""},{"lineNumber":158,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":159,"author":{"gitId":"-"},"content":" * Checks whether the given {@code dateTime} is the {@code ARBITRARY_FIRST_COMMIT_DATE} in the time zone given by"},{"lineNumber":160,"author":{"gitId":"-"},"content":" * {@code zoneId}."},{"lineNumber":161,"author":{"gitId":"-"},"content":" */"},{"lineNumber":162,"author":{"gitId":"-"},"content":" public static boolean isEqualToArbitraryFirstDateConverted(LocalDateTime dateTime, ZoneId zoneId) {"},{"lineNumber":163,"author":{"gitId":"-"},"content":" return dateTime.equals(getArbitraryFirstCommitDateConverted(zoneId));"},{"lineNumber":164,"author":{"gitId":"-"},"content":" }"},{"lineNumber":165,"author":{"gitId":"-"},"content":""},{"lineNumber":166,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":167,"author":{"gitId":"-"},"content":" * Extracts the first substring of {@code date} string that matches the {@code DATE_FORMAT_REGEX}."},{"lineNumber":168,"author":{"gitId":"-"},"content":" */"},{"lineNumber":169,"author":{"gitId":"-"},"content":" public static String extractDate(String date) {"},{"lineNumber":170,"author":{"gitId":"-"},"content":" Matcher matcher \u003d Pattern.compile(DATE_FORMAT_REGEX).matcher(date);"},{"lineNumber":171,"author":{"gitId":"-"},"content":" String extractedDate \u003d date;"},{"lineNumber":172,"author":{"gitId":"-"},"content":" if (matcher.find()) {"},{"lineNumber":173,"author":{"gitId":"-"},"content":" extractedDate \u003d matcher.group(1);"},{"lineNumber":174,"author":{"gitId":"-"},"content":" }"},{"lineNumber":175,"author":{"gitId":"-"},"content":" return extractedDate;"},{"lineNumber":176,"author":{"gitId":"-"},"content":" }"},{"lineNumber":177,"author":{"gitId":"-"},"content":""},{"lineNumber":178,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":179,"author":{"gitId":"-"},"content":" * Parses the given {@code date} string as a {@link LocalDateTime} based on the {@code CLI_ARGS_DATE_FORMAT}."},{"lineNumber":180,"author":{"gitId":"-"},"content":" * Uses {@link ResolverStyle#STRICT} to avoid unexpected dates like 31/02/2020."},{"lineNumber":181,"author":{"gitId":"-"},"content":" *"},{"lineNumber":182,"author":{"gitId":"-"},"content":" * @throws java.text.ParseException if date cannot be parsed by the required format."},{"lineNumber":183,"author":{"gitId":"-"},"content":" */"},{"lineNumber":184,"author":{"gitId":"-"},"content":" public static LocalDateTime parseDate(String date) throws java.text.ParseException {"},{"lineNumber":185,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":186,"author":{"gitId":"-"},"content":" return LocalDateTime.parse(date, CLI_ARGS_DATE_FORMAT.withResolverStyle(ResolverStyle.STRICT));"},{"lineNumber":187,"author":{"gitId":"-"},"content":" } catch (DateTimeParseException e) {"},{"lineNumber":188,"author":{"gitId":"-"},"content":" throw new java.text.ParseException(String.format("},{"lineNumber":189,"author":{"gitId":"-"},"content":" \"Exception message: %s\\n\", e.getMessage()), e.getErrorIndex());"},{"lineNumber":190,"author":{"gitId":"-"},"content":" }"},{"lineNumber":191,"author":{"gitId":"-"},"content":" }"},{"lineNumber":192,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":191}},{"path":"src/systemtest/java/reposense/ConfigSystemTest.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.apache.tools.ant.types.Commandline.translateCommandline;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static reposense.util.TestUtil.loadResource;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Arrays;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.AfterEach;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.parallel.Execution;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.parallel.ExecutionMode;"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":"import reposense.model.SupportedDomainUrlMap;"},{"lineNumber":18,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.SinceDateArgumentType;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import reposense.report.ErrorSummary;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import reposense.util.FileUtil;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import reposense.util.InputBuilder;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import reposense.util.SystemTestUtil;"},{"lineNumber":23,"author":{"gitId":"-"},"content":""},{"lineNumber":24,"author":{"gitId":"-"},"content":"@Execution(ExecutionMode.SAME_THREAD)"},{"lineNumber":25,"author":{"gitId":"-"},"content":"public class ConfigSystemTest {"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e TESTING_FILE_FORMATS \u003d Arrays.asList(\"java\", \"adoc\");"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final String TEST_TIME_ZONE \u003d \"Asia/Singapore\";"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":" private static final String OUTPUT_DIRECTORY \u003d \"ft_temp\";"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final Path REPORT_DIRECTORY_PATH \u003d Paths.get(OUTPUT_DIRECTORY, \"reposense-report\");"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static boolean didNotCloneRepoNormally \u003d true;"},{"lineNumber":33,"author":{"gitId":"-"},"content":""},{"lineNumber":34,"author":{"gitId":"-"},"content":" @BeforeEach"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public void setUp() throws Exception {"},{"lineNumber":36,"author":{"gitId":"-"},"content":" SupportedDomainUrlMap.clearAccessedSet();"},{"lineNumber":37,"author":{"gitId":"-"},"content":" FileUtil.deleteDirectory(OUTPUT_DIRECTORY);"},{"lineNumber":38,"author":{"gitId":"-"},"content":" ErrorSummary.getInstance().clearErrorSet();"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }"},{"lineNumber":40,"author":{"gitId":"-"},"content":""},{"lineNumber":41,"author":{"gitId":"-"},"content":" @AfterEach"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public void tearDown() throws Exception {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" FileUtil.deleteDirectory(OUTPUT_DIRECTORY);"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }"},{"lineNumber":45,"author":{"gitId":"-"},"content":""},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * System test with a specified until date and a {@link SinceDateArgumentType#FIRST_COMMIT_DATE_SHORTHAND}"},{"lineNumber":48,"author":{"gitId":"-"},"content":" * since date to capture from the first commit."},{"lineNumber":49,"author":{"gitId":"-"},"content":" */"},{"lineNumber":50,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":51,"author":{"gitId":"-"},"content":" public void testSinceBeginningDateRange() {"},{"lineNumber":52,"author":{"gitId":"-"},"content":" InputBuilder inputBuilder \u003d initInputBuilder()"},{"lineNumber":53,"author":{"gitId":"-"},"content":" .addSinceDate(SinceDateArgumentType.FIRST_COMMIT_DATE_SHORTHAND)"},{"lineNumber":54,"author":{"gitId":"-"},"content":" .addUntilDate(\"2/3/2019\");"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":" runTest(inputBuilder, false,"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \"ConfigSystemTest/sinceBeginningDateRange/expected\");"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }"},{"lineNumber":59,"author":{"gitId":"-"},"content":""},{"lineNumber":60,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":61,"author":{"gitId":"-"},"content":" public void test30DaysFromUntilDate() {"},{"lineNumber":62,"author":{"gitId":"-"},"content":" InputBuilder inputBuilder \u003d initInputBuilder().addUntilDate(\"1/11/2017\");"},{"lineNumber":63,"author":{"gitId":"-"},"content":""},{"lineNumber":64,"author":{"gitId":"-"},"content":" runTest(inputBuilder, false,"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \"ConfigSystemTest/30daysFromUntilDate/expected\");"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }"},{"lineNumber":67,"author":{"gitId":"-"},"content":""},{"lineNumber":68,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":69,"author":{"gitId":"-"},"content":" * System test with a specified since date and until date, with the last modified date time in each"},{"lineNumber":70,"author":{"gitId":"-"},"content":" * line of code."},{"lineNumber":71,"author":{"gitId":"-"},"content":" */"},{"lineNumber":72,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":73,"author":{"gitId":"-"},"content":" public void testDateRangeWithModifiedDateTimeInLines() {"},{"lineNumber":74,"author":{"gitId":"-"},"content":" InputBuilder inputBuilder \u003d initInputBuilder()"},{"lineNumber":75,"author":{"gitId":"-"},"content":" .addSinceDate(\"1/9/2017\")"},{"lineNumber":76,"author":{"gitId":"-"},"content":" .addUntilDate(\"30/10/2017\")"},{"lineNumber":77,"author":{"gitId":"-"},"content":" .addLastModifiedDateFlags();"},{"lineNumber":78,"author":{"gitId":"-"},"content":""},{"lineNumber":79,"author":{"gitId":"-"},"content":" runTest(inputBuilder, false,"},{"lineNumber":80,"author":{"gitId":"-"},"content":" \"ConfigSystemTest/dateRangeWithModifiedDateTimeInLines/expected\");"},{"lineNumber":81,"author":{"gitId":"-"},"content":" }"},{"lineNumber":82,"author":{"gitId":"-"},"content":""},{"lineNumber":83,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":84,"author":{"gitId":"-"},"content":" * System test with a specified until date and a {@link SinceDateArgumentType#FIRST_COMMIT_DATE_SHORTHAND}"},{"lineNumber":85,"author":{"gitId":"-"},"content":" * since date to capture from the first commit, using shallow cloning."},{"lineNumber":86,"author":{"gitId":"-"},"content":" */"},{"lineNumber":87,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":88,"author":{"gitId":"-"},"content":" public void testSinceBeginningDateRangeWithShallowCloning() {"},{"lineNumber":89,"author":{"gitId":"-"},"content":" InputBuilder inputBuilder \u003d initInputBuilder()"},{"lineNumber":90,"author":{"gitId":"-"},"content":" .addSinceDate(SinceDateArgumentType.FIRST_COMMIT_DATE_SHORTHAND)"},{"lineNumber":91,"author":{"gitId":"-"},"content":" .addUntilDate(\"2/3/2019\")"},{"lineNumber":92,"author":{"gitId":"-"},"content":" .addShallowCloning();"},{"lineNumber":93,"author":{"gitId":"-"},"content":""},{"lineNumber":94,"author":{"gitId":"-"},"content":" runTest(inputBuilder, true,"},{"lineNumber":95,"author":{"gitId":"-"},"content":" \"ConfigSystemTest/sinceBeginningDateRangeWithShallowCloning/expected\");"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }"},{"lineNumber":97,"author":{"gitId":"-"},"content":""},{"lineNumber":98,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":99,"author":{"gitId":"-"},"content":" public void test30DaysFromUntilDateWithShallowCloning() {"},{"lineNumber":100,"author":{"gitId":"-"},"content":" InputBuilder inputBuilder \u003d initInputBuilder()"},{"lineNumber":101,"author":{"gitId":"-"},"content":" .addUntilDate(\"1/11/2017\")"},{"lineNumber":102,"author":{"gitId":"-"},"content":" .addShallowCloning();"},{"lineNumber":103,"author":{"gitId":"-"},"content":""},{"lineNumber":104,"author":{"gitId":"-"},"content":" runTest(inputBuilder, true,"},{"lineNumber":105,"author":{"gitId":"-"},"content":" \"ConfigSystemTest/30daysFromUntilDateWithShallowCloning/expected\");"},{"lineNumber":106,"author":{"gitId":"-"},"content":" }"},{"lineNumber":107,"author":{"gitId":"-"},"content":""},{"lineNumber":108,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":109,"author":{"gitId":"-"},"content":" * System test with a specified until date and a {@link SinceDateArgumentType#FIRST_COMMIT_DATE_SHORTHAND}"},{"lineNumber":110,"author":{"gitId":"-"},"content":" * since date to capture from the first commit, using find previous authors."},{"lineNumber":111,"author":{"gitId":"-"},"content":" */"},{"lineNumber":112,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":113,"author":{"gitId":"-"},"content":" public void testSinceBeginningDateRangeWithFindPreviousAuthors() {"},{"lineNumber":114,"author":{"gitId":"-"},"content":" InputBuilder inputBuilder \u003d initInputBuilder()"},{"lineNumber":115,"author":{"gitId":"-"},"content":" .addSinceDate(SinceDateArgumentType.FIRST_COMMIT_DATE_SHORTHAND)"},{"lineNumber":116,"author":{"gitId":"-"},"content":" .addUntilDate(\"2/3/2019\")"},{"lineNumber":117,"author":{"gitId":"-"},"content":" .addFindPreviousAuthors();"},{"lineNumber":118,"author":{"gitId":"-"},"content":""},{"lineNumber":119,"author":{"gitId":"-"},"content":" runTest(inputBuilder, true,"},{"lineNumber":120,"author":{"gitId":"-"},"content":" \"ConfigSystemTest/sinceBeginningDateRangeFindPreviousAuthors/expected\");"},{"lineNumber":121,"author":{"gitId":"-"},"content":" }"},{"lineNumber":122,"author":{"gitId":"-"},"content":""},{"lineNumber":123,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":124,"author":{"gitId":"-"},"content":" public void test30DaysFromUntilDateWithFindPreviousAuthors() {"},{"lineNumber":125,"author":{"gitId":"-"},"content":" InputBuilder inputBuilder \u003d initInputBuilder()"},{"lineNumber":126,"author":{"gitId":"-"},"content":" .addUntilDate(\"1/11/2017\")"},{"lineNumber":127,"author":{"gitId":"-"},"content":" .addFindPreviousAuthors();"},{"lineNumber":128,"author":{"gitId":"-"},"content":""},{"lineNumber":129,"author":{"gitId":"-"},"content":" runTest(inputBuilder, true,"},{"lineNumber":130,"author":{"gitId":"-"},"content":" \"ConfigSystemTest/30daysFromUntilDateFindPreviousAuthors/expected\");"},{"lineNumber":131,"author":{"gitId":"-"},"content":" }"},{"lineNumber":132,"author":{"gitId":"-"},"content":""},{"lineNumber":133,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":134,"author":{"gitId":"-"},"content":" * Returns a {@link InputBuilder} that is initialized with some default values."},{"lineNumber":135,"author":{"gitId":"-"},"content":" * \u003cbr\u003eConfig Folder Path: {@code ConfigSystemTest}"},{"lineNumber":136,"author":{"gitId":"-"},"content":" * \u003cbr\u003eFormats: {@link ConfigSystemTest#TESTING_FILE_FORMATS TESTING_FILE_FORMATS}"},{"lineNumber":137,"author":{"gitId":"-"},"content":" * \u003cbr\u003eTimezone: {@link ConfigSystemTest#TEST_TIME_ZONE TEST_TIME_ZONE}"},{"lineNumber":138,"author":{"gitId":"-"},"content":" * \u003cbr\u003eOutput Folder Path: {@link ConfigSystemTest#OUTPUT_DIRECTORY OUTPUT_DIRECTORY}"},{"lineNumber":139,"author":{"gitId":"-"},"content":" * \u003cbr\u003eTest Mode: {@code Enabled}"},{"lineNumber":140,"author":{"gitId":"-"},"content":" */"},{"lineNumber":141,"author":{"gitId":"-"},"content":" private InputBuilder initInputBuilder() {"},{"lineNumber":142,"author":{"gitId":"-"},"content":" Path configFolder \u003d loadResource(getClass(), \"ConfigSystemTest\");"},{"lineNumber":143,"author":{"gitId":"-"},"content":" String formats \u003d String.join(\" \", TESTING_FILE_FORMATS);"},{"lineNumber":144,"author":{"gitId":"-"},"content":""},{"lineNumber":145,"author":{"gitId":"-"},"content":" return new InputBuilder().addConfig(configFolder)"},{"lineNumber":146,"author":{"gitId":"-"},"content":" .addFormats(formats)"},{"lineNumber":147,"author":{"gitId":"-"},"content":" .addTimezone(TEST_TIME_ZONE)"},{"lineNumber":148,"author":{"gitId":"-"},"content":" .addTestMode()"},{"lineNumber":149,"author":{"gitId":"-"},"content":" .addOutput(OUTPUT_DIRECTORY);"},{"lineNumber":150,"author":{"gitId":"-"},"content":" }"},{"lineNumber":151,"author":{"gitId":"-"},"content":""},{"lineNumber":152,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":153,"author":{"gitId":"-"},"content":" * Generates the testing report and compares it with the expected report."},{"lineNumber":154,"author":{"gitId":"-"},"content":" * Re-generates a normal report after the testing finished if the first report is shallow-cloned."},{"lineNumber":155,"author":{"gitId":"-"},"content":" *"},{"lineNumber":156,"author":{"gitId":"-"},"content":" * @param inputBuilder The input builder that contains the command line input specified by user."},{"lineNumber":157,"author":{"gitId":"-"},"content":" * @param shouldFreshClone Boolean for whether to clone repo again if it has been cloned before."},{"lineNumber":158,"author":{"gitId":"-"},"content":" * @param pathToResource The location at which files generated during the test are stored."},{"lineNumber":159,"author":{"gitId":"-"},"content":" */"},{"lineNumber":160,"author":{"gitId":"-"},"content":" private void runTest(InputBuilder inputBuilder, boolean shouldFreshClone, String pathToResource) {"},{"lineNumber":161,"author":{"gitId":"-"},"content":" if (shouldFreshClone || didNotCloneRepoNormally) {"},{"lineNumber":162,"author":{"gitId":"-"},"content":" inputBuilder \u003d inputBuilder.addFreshCloning();"},{"lineNumber":163,"author":{"gitId":"-"},"content":" }"},{"lineNumber":164,"author":{"gitId":"-"},"content":""},{"lineNumber":165,"author":{"gitId":"-"},"content":" RepoSense.main(translateCommandline(inputBuilder.build()));"},{"lineNumber":166,"author":{"gitId":"-"},"content":""},{"lineNumber":167,"author":{"gitId":"-"},"content":" Path actualFiles \u003d loadResource(getClass(), pathToResource);"},{"lineNumber":168,"author":{"gitId":"-"},"content":" SystemTestUtil.verifyReportJsonFiles(actualFiles, REPORT_DIRECTORY_PATH);"},{"lineNumber":169,"author":{"gitId":"-"},"content":""},{"lineNumber":170,"author":{"gitId":"-"},"content":" didNotCloneRepoNormally \u003d inputBuilder.isShallowCloning();"},{"lineNumber":171,"author":{"gitId":"-"},"content":" }"},{"lineNumber":172,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":171}},{"path":"src/systemtest/java/reposense/LocalRepoSystemTest.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.apache.tools.ant.types.Commandline.translateCommandline;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static reposense.util.TestUtil.loadResource;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.AfterAll;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.AfterEach;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeAll;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.parallel.Execution;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.parallel.ExecutionMode;"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":"import reposense.model.RepoConfiguration;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import reposense.model.RepoLocation;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import reposense.model.SupportedDomainUrlMap;"},{"lineNumber":20,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.SinceDateArgumentType;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import reposense.report.ErrorSummary;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import reposense.util.FileUtil;"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import reposense.util.InputBuilder;"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import reposense.util.SystemTestUtil;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import reposense.util.TestRepoCloner;"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"-"},"content":"@Execution(ExecutionMode.SAME_THREAD)"},{"lineNumber":28,"author":{"gitId":"-"},"content":"public class LocalRepoSystemTest {"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private static final String LOCAL_DIRECTORY_ONE_PARENT \u003d \"parent1\";"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String LOCAL_DIRECTORY_TWO_PARENT \u003d \"parent2\";"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final String LOCAL_DIRECTORY_ONE \u003d \"parent1/test-repo\";"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final String LOCAL_DIRECTORY_TWO \u003d \"parent2/test-repo\";"},{"lineNumber":33,"author":{"gitId":"-"},"content":""},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final String LAST_COMMIT_DATE \u003d \"31/01/2023\";"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":" private static final String OUTPUT_DIRECTORY \u003d \"local-test\";"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private static final String TIME_ZONE \u003d \"UTC+08\";"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private static final Path REPORT_DIRECTORY_PATH \u003d Paths.get(OUTPUT_DIRECTORY, \"reposense-report\");"},{"lineNumber":39,"author":{"gitId":"-"},"content":""},{"lineNumber":40,"author":{"gitId":"-"},"content":" @BeforeAll"},{"lineNumber":41,"author":{"gitId":"-"},"content":" public static void setupLocalRepos() throws Exception {"},{"lineNumber":42,"author":{"gitId":"asdfghjkxd"},"content":" TestRepoCloner.clone("},{"lineNumber":43,"author":{"gitId":"asdfghjkxd"},"content":" new RepoConfiguration.Builder()"},{"lineNumber":44,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(\"https://github.com/reposense/testrepo-Alpha\"))"},{"lineNumber":45,"author":{"gitId":"asdfghjkxd"},"content":" .build(),"},{"lineNumber":46,"author":{"gitId":"asdfghjkxd"},"content":" Paths.get(\".\"), LOCAL_DIRECTORY_ONE"},{"lineNumber":47,"author":{"gitId":"asdfghjkxd"},"content":" );"},{"lineNumber":48,"author":{"gitId":"asdfghjkxd"},"content":" TestRepoCloner.clone("},{"lineNumber":49,"author":{"gitId":"asdfghjkxd"},"content":" new RepoConfiguration.Builder()"},{"lineNumber":50,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(\"https://github.com/reposense/testrepo-Alpha\"))"},{"lineNumber":51,"author":{"gitId":"asdfghjkxd"},"content":" .build(),"},{"lineNumber":52,"author":{"gitId":"asdfghjkxd"},"content":" Paths.get(\".\"), LOCAL_DIRECTORY_TWO"},{"lineNumber":53,"author":{"gitId":"asdfghjkxd"},"content":" );"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":" @BeforeEach"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void setupLocalTest() throws Exception {"},{"lineNumber":58,"author":{"gitId":"-"},"content":" SupportedDomainUrlMap.clearAccessedSet();"},{"lineNumber":59,"author":{"gitId":"-"},"content":" FileUtil.deleteDirectory(OUTPUT_DIRECTORY);"},{"lineNumber":60,"author":{"gitId":"-"},"content":" ErrorSummary.getInstance().clearErrorSet();"},{"lineNumber":61,"author":{"gitId":"-"},"content":" }"},{"lineNumber":62,"author":{"gitId":"-"},"content":""},{"lineNumber":63,"author":{"gitId":"-"},"content":" @AfterEach"},{"lineNumber":64,"author":{"gitId":"-"},"content":" public void deleteReportDirectory() throws Exception {"},{"lineNumber":65,"author":{"gitId":"-"},"content":" FileUtil.deleteDirectory(OUTPUT_DIRECTORY);"},{"lineNumber":66,"author":{"gitId":"-"},"content":" }"},{"lineNumber":67,"author":{"gitId":"-"},"content":""},{"lineNumber":68,"author":{"gitId":"-"},"content":" @AfterAll"},{"lineNumber":69,"author":{"gitId":"-"},"content":" public static void deleteClonedLocalRepos() throws Exception {"},{"lineNumber":70,"author":{"gitId":"-"},"content":" FileUtil.deleteDirectory(LOCAL_DIRECTORY_ONE_PARENT);"},{"lineNumber":71,"author":{"gitId":"-"},"content":" FileUtil.deleteDirectory(LOCAL_DIRECTORY_TWO_PARENT);"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }"},{"lineNumber":73,"author":{"gitId":"-"},"content":""},{"lineNumber":74,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":75,"author":{"gitId":"-"},"content":" public void testSameFinalDirectory() {"},{"lineNumber":76,"author":{"gitId":"-"},"content":" InputBuilder inputBuilder \u003d new InputBuilder()"},{"lineNumber":77,"author":{"gitId":"-"},"content":" .addRepos(LOCAL_DIRECTORY_ONE, LOCAL_DIRECTORY_TWO)"},{"lineNumber":78,"author":{"gitId":"-"},"content":" .addSinceDate(SinceDateArgumentType.FIRST_COMMIT_DATE_SHORTHAND)"},{"lineNumber":79,"author":{"gitId":"-"},"content":" .addUntilDate(LAST_COMMIT_DATE)"},{"lineNumber":80,"author":{"gitId":"-"},"content":" .addOutput(Paths.get(OUTPUT_DIRECTORY))"},{"lineNumber":81,"author":{"gitId":"-"},"content":" .addTimezone(TIME_ZONE);"},{"lineNumber":82,"author":{"gitId":"-"},"content":" runTest(inputBuilder, \"LocalRepoSystemTest/testSameFinalDirectory\");"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }"},{"lineNumber":84,"author":{"gitId":"-"},"content":""},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void testRelativePathing() {"},{"lineNumber":87,"author":{"gitId":"-"},"content":" String relativePathForTesting \u003d \"parent1/../parent1/./test-repo\";"},{"lineNumber":88,"author":{"gitId":"-"},"content":""},{"lineNumber":89,"author":{"gitId":"-"},"content":" InputBuilder inputBuilder \u003d new InputBuilder()"},{"lineNumber":90,"author":{"gitId":"-"},"content":" .addRepos(relativePathForTesting)"},{"lineNumber":91,"author":{"gitId":"-"},"content":" .addSinceDate(SinceDateArgumentType.FIRST_COMMIT_DATE_SHORTHAND)"},{"lineNumber":92,"author":{"gitId":"-"},"content":" .addUntilDate(LAST_COMMIT_DATE)"},{"lineNumber":93,"author":{"gitId":"-"},"content":" .addOutput(Paths.get(OUTPUT_DIRECTORY))"},{"lineNumber":94,"author":{"gitId":"-"},"content":" .addTimezone(TIME_ZONE);"},{"lineNumber":95,"author":{"gitId":"-"},"content":""},{"lineNumber":96,"author":{"gitId":"-"},"content":" runTest(inputBuilder, \"LocalRepoSystemTest/testRelativePathing\");"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }"},{"lineNumber":98,"author":{"gitId":"-"},"content":""},{"lineNumber":99,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":100,"author":{"gitId":"-"},"content":" * Runs RepoSense with {@code inputBuilder} and tests it against the expected"},{"lineNumber":101,"author":{"gitId":"-"},"content":" * files in {@code expectedFilesPathString}."},{"lineNumber":102,"author":{"gitId":"-"},"content":" */"},{"lineNumber":103,"author":{"gitId":"-"},"content":" private void runTest(InputBuilder inputBuilder, String expectedFilesPathString) {"},{"lineNumber":104,"author":{"gitId":"-"},"content":" RepoSense.main(translateCommandline(inputBuilder.build()));"},{"lineNumber":105,"author":{"gitId":"-"},"content":" Path expectedFilesPath \u003d loadResource(getClass(), expectedFilesPathString);"},{"lineNumber":106,"author":{"gitId":"-"},"content":" SystemTestUtil.verifyReportJsonFiles(expectedFilesPath, REPORT_DIRECTORY_PATH);"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }"},{"lineNumber":108,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":13,"-":95}},{"path":"src/systemtest/java/reposense/util/SystemTestUtil.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.util;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.io.FileReader;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.io.IOException;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.Files;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assertions;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"asdfghjkxd"},"content":"import com.google.gson.JsonElement;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import com.google.gson.JsonObject;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import com.google.gson.JsonParser;"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * Contains utility methods for system tests."},{"lineNumber":18,"author":{"gitId":"-"},"content":" */"},{"lineNumber":19,"author":{"gitId":"-"},"content":"public class SystemTestUtil {"},{"lineNumber":20,"author":{"gitId":"-"},"content":""},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final String[] JSON_FIELDS_TO_IGNORE \u003d new String[]"},{"lineNumber":22,"author":{"gitId":"-"},"content":" {\"repoSenseVersion\", \"reportGeneratedTime\", \"reportGenerationTime\"};"},{"lineNumber":23,"author":{"gitId":"-"},"content":""},{"lineNumber":24,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":25,"author":{"gitId":"-"},"content":" * Verifies that all JSON files in the {@code actualDirectory} matches those at the {@code expectedDirectory}."},{"lineNumber":26,"author":{"gitId":"-"},"content":" */"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public static void verifyReportJsonFiles(Path expectedDirectory, Path actualDirectory) {"},{"lineNumber":28,"author":{"gitId":"-"},"content":" try (Stream\u003cPath\u003e pathStream \u003d Files.list(expectedDirectory)) {"},{"lineNumber":29,"author":{"gitId":"-"},"content":" for (Path file : pathStream.collect(Collectors.toList())) {"},{"lineNumber":30,"author":{"gitId":"-"},"content":" Path expectedFilePath \u003d expectedDirectory.resolve(file.getFileName());"},{"lineNumber":31,"author":{"gitId":"-"},"content":" Path actualFilePath \u003d actualDirectory.resolve(file.getFileName());"},{"lineNumber":32,"author":{"gitId":"-"},"content":" if (Files.isDirectory(file)) {"},{"lineNumber":33,"author":{"gitId":"-"},"content":" verifyReportJsonFiles(expectedFilePath, actualFilePath);"},{"lineNumber":34,"author":{"gitId":"-"},"content":" } else if (file.toString().endsWith(\".json\")) {"},{"lineNumber":35,"author":{"gitId":"-"},"content":" if (file.getFileName().toString().equals(\"summary.json\")) {"},{"lineNumber":36,"author":{"gitId":"-"},"content":" assertSummaryJson(expectedFilePath, actualFilePath);"},{"lineNumber":37,"author":{"gitId":"-"},"content":" } else {"},{"lineNumber":38,"author":{"gitId":"-"},"content":" assertJson(expectedFilePath, actualFilePath);"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }"},{"lineNumber":41,"author":{"gitId":"-"},"content":" }"},{"lineNumber":42,"author":{"gitId":"-"},"content":" } catch (IOException ioe) {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" ioe.printStackTrace();"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }"},{"lineNumber":45,"author":{"gitId":"-"},"content":" }"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":" public static void assertSummaryJson(Path expectedSummaryJsonPath, Path actualSummaryJsonPath)"},{"lineNumber":48,"author":{"gitId":"-"},"content":" throws IOException {"},{"lineNumber":49,"author":{"gitId":"-"},"content":" try (FileReader fileReaderExpected \u003d new FileReader(expectedSummaryJsonPath.toFile());"},{"lineNumber":50,"author":{"gitId":"-"},"content":" FileReader fileReaderActual \u003d new FileReader(actualSummaryJsonPath.toFile())) {"},{"lineNumber":51,"author":{"gitId":"-"},"content":" JsonObject jsonExpected \u003d JsonParser.parseReader(fileReaderExpected).getAsJsonObject();"},{"lineNumber":52,"author":{"gitId":"-"},"content":" JsonObject jsonActual \u003d JsonParser.parseReader(fileReaderActual).getAsJsonObject();"},{"lineNumber":53,"author":{"gitId":"-"},"content":" for (String ignoredKey : JSON_FIELDS_TO_IGNORE) {"},{"lineNumber":54,"author":{"gitId":"-"},"content":" jsonExpected.remove(ignoredKey);"},{"lineNumber":55,"author":{"gitId":"-"},"content":" jsonActual.remove(ignoredKey);"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }"},{"lineNumber":57,"author":{"gitId":"-"},"content":" Assertions.assertEquals(jsonExpected, jsonActual);"},{"lineNumber":58,"author":{"gitId":"-"},"content":" }"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }"},{"lineNumber":60,"author":{"gitId":"-"},"content":""},{"lineNumber":61,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":62,"author":{"gitId":"-"},"content":" * Asserts that the contents in the given JSON file at {@code actualJsonPath} is the same as the JSON file"},{"lineNumber":63,"author":{"gitId":"-"},"content":" * at {@code expectedJsonPath}."},{"lineNumber":64,"author":{"gitId":"-"},"content":" */"},{"lineNumber":65,"author":{"gitId":"-"},"content":" public static void assertJson(Path expectedJsonPath, Path actualJsonPath) {"},{"lineNumber":66,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.exists(actualJsonPath));"},{"lineNumber":67,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":68,"author":{"gitId":"asdfghjkxd"},"content":" try (FileReader fileReaderExpected \u003d new FileReader(expectedJsonPath.toFile());"},{"lineNumber":69,"author":{"gitId":"asdfghjkxd"},"content":" FileReader fileReaderActual \u003d new FileReader(actualJsonPath.toFile())) {"},{"lineNumber":70,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":71,"author":{"gitId":"asdfghjkxd"},"content":" JsonElement jsonExpected \u003d JsonParser.parseReader(fileReaderExpected);"},{"lineNumber":72,"author":{"gitId":"asdfghjkxd"},"content":" JsonElement jsonActual \u003d JsonParser.parseReader(fileReaderActual);"},{"lineNumber":73,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":74,"author":{"gitId":"asdfghjkxd"},"content":" Assertions.assertEquals(jsonExpected, jsonActual);"},{"lineNumber":75,"author":{"gitId":"asdfghjkxd"},"content":" } catch (IOException ex) {"},{"lineNumber":76,"author":{"gitId":"asdfghjkxd"},"content":" Assertions.fail(ex.getMessage());"},{"lineNumber":77,"author":{"gitId":"-"},"content":" }"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }"},{"lineNumber":79,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":11,"-":68}},{"path":"src/test/java/reposense/git/GitBranchTest.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.git;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assertions;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"import reposense.model.FileTypeTest;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import reposense.model.RepoConfiguration;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import reposense.model.RepoLocation;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import reposense.template.GitTestTemplate;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import reposense.util.TestRepoCloner;"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"public class GitBranchTest extends GitTestTemplate {"},{"lineNumber":15,"author":{"gitId":"-"},"content":" protected static final String TEST_REPO_UNCOMMON_DEFAULT_GIT_LOCATION \u003d"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \"https://github.com/reposense/testrepo-UncommonDefaultBranch.git\";"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":" private RepoConfiguration config;"},{"lineNumber":19,"author":{"gitId":"-"},"content":""},{"lineNumber":20,"author":{"gitId":"-"},"content":" @BeforeEach"},{"lineNumber":21,"author":{"gitId":"-"},"content":" public void before() throws Exception {"},{"lineNumber":22,"author":{"gitId":"-"},"content":" super.before();"},{"lineNumber":23,"author":{"gitId":"-"},"content":" config \u003d configs.get();"},{"lineNumber":24,"author":{"gitId":"-"},"content":" }"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":27,"author":{"gitId":"-"},"content":" public void getCurrentBranch_masterBranch_success() throws Exception {"},{"lineNumber":28,"author":{"gitId":"-"},"content":" String currentBranch \u003d GitBranch.getCurrentBranch(config.getRepoRoot());"},{"lineNumber":29,"author":{"gitId":"-"},"content":" Assertions.assertEquals(\"master\", currentBranch);"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public void getCurrentBranch_uncommonDefaultBranch_success() throws Exception {"},{"lineNumber":34,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration uncommonDefaultConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":35,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_UNCOMMON_DEFAULT_GIT_LOCATION))"},{"lineNumber":36,"author":{"gitId":"asdfghjkxd"},"content":" .branch(RepoConfiguration.DEFAULT_BRANCH)"},{"lineNumber":37,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":38,"author":{"gitId":"-"},"content":" uncommonDefaultConfig.setFormats(FileTypeTest.DEFAULT_TEST_FORMATS);"},{"lineNumber":39,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(uncommonDefaultConfig);"},{"lineNumber":40,"author":{"gitId":"-"},"content":" String currentBranch \u003d GitBranch.getCurrentBranch(uncommonDefaultConfig.getRepoRoot());"},{"lineNumber":41,"author":{"gitId":"-"},"content":" Assertions.assertEquals(\"uncommon\", currentBranch);"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }"},{"lineNumber":43,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":4,"-":39}},{"path":"src/test/java/reposense/model/RepoConfigurationTest.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.model;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.apache.tools.ant.types.Commandline.translateCommandline;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static reposense.util.TestUtil.loadResource;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.lang.reflect.Method;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":8,"author":{"gitId":"asdfghjkxd"},"content":"import java.time.LocalDateTime;"},{"lineNumber":9,"author":{"gitId":"asdfghjkxd"},"content":"import java.time.ZoneId;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.ArrayList;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.Arrays;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.Collections;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":14,"author":{"gitId":"-"},"content":""},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assertions;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeAll;"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;"},{"lineNumber":18,"author":{"gitId":"-"},"content":""},{"lineNumber":19,"author":{"gitId":"-"},"content":"import reposense.parser.ArgsParser;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import reposense.parser.AuthorConfigCsvParser;"},{"lineNumber":21,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.ConfigurationBuildException;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import reposense.parser.GroupConfigCsvParser;"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import reposense.parser.RepoConfigCsvParser;"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import reposense.report.ReportGenerator;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import reposense.util.InputBuilder;"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import reposense.util.TestRepoCloner;"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import reposense.util.TestUtil;"},{"lineNumber":28,"author":{"gitId":"-"},"content":""},{"lineNumber":29,"author":{"gitId":"-"},"content":"public class RepoConfigurationTest {"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final Path IGNORE_STANDALONE_TEST_CONFIG_FILES \u003d"},{"lineNumber":31,"author":{"gitId":"-"},"content":" loadResource(RepoConfigurationTest.class, \"RepoConfigurationTest/repoconfig_ignoreStandAlone_test\");"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final Path IGNORE_STANDALONE_KEYWORD_TEST_CONFIG_FILES \u003d"},{"lineNumber":33,"author":{"gitId":"-"},"content":" loadResource(RepoConfigurationTest.class, \"RepoConfigurationTest/repoconfig_ignoreStandAloneKeyword_test\");"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final Path FORMATS_TEST_CONFIG_FILES \u003d loadResource(RepoConfigurationTest.class,"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \"RepoConfigurationTest/repoconfig_formats_test\");"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private static final Path WITHOUT_FORMATS_TEST_CONFIG_FILES \u003d loadResource(RepoConfigurationTest.class,"},{"lineNumber":37,"author":{"gitId":"-"},"content":" \"RepoConfigurationTest/repoconfig_withoutformats_test\");"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private static final Path GROUPS_TEST_CONFIG_FILES \u003d loadResource(RepoConfigurationTest.class,"},{"lineNumber":39,"author":{"gitId":"-"},"content":" \"RepoConfigurationTest/repoconfig_groups_test\");"},{"lineNumber":40,"author":{"gitId":"-"},"content":" private static final Path OVERRIDE_STANDALONE_TEST_CONFIG_FILE \u003d loadResource(RepoConfigurationTest.class,"},{"lineNumber":41,"author":{"gitId":"-"},"content":" \"RepoConfigurationTest/repoconfig_overrideStandAlone_test\");"},{"lineNumber":42,"author":{"gitId":"-"},"content":" private static final Path IGNORE_AUTHORS_TEST_CONFIG_FILE \u003d loadResource(RepoConfigurationTest.class,"},{"lineNumber":43,"author":{"gitId":"-"},"content":" \"RepoConfigurationTest/repoconfig_ignoreAuthors_test\");"},{"lineNumber":44,"author":{"gitId":"-"},"content":" private static final Path IGNORE_STANDALONE_FLAG_OVERRIDE_CSV_TEST \u003d loadResource(RepoConfigurationTest.class,"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \"RepoConfigurationTest/repoconfig_ignoreStandaloneOverrideCsv_test\");"},{"lineNumber":46,"author":{"gitId":"-"},"content":" private static final Path IGNORE_FILESIZE_LIMIT_TEST_CONFIG_FILES \u003d loadResource(RepoConfigurationTest.class,"},{"lineNumber":47,"author":{"gitId":"-"},"content":" \"RepoConfigurationTest/repoconfig_ignoreFileSizeLimit_test\");"},{"lineNumber":48,"author":{"gitId":"-"},"content":" private static final Path IGNORE_FILESIZE_LIMIT_OVERRIDE_CSV_TEST_CONFIG_FILES \u003d"},{"lineNumber":49,"author":{"gitId":"-"},"content":" loadResource(RepoConfigurationTest.class,"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \"RepoConfigurationTest/repoconfig_ignoreFileSizeLimitOverrideCsv_test\");"},{"lineNumber":51,"author":{"gitId":"-"},"content":" private static final Path SHALLOW_CLONING_TEST_CONFIG_FILES \u003d"},{"lineNumber":52,"author":{"gitId":"-"},"content":" loadResource(RepoConfigurationTest.class, \"RepoConfigurationTest/repoconfig_shallowCloning_test\");"},{"lineNumber":53,"author":{"gitId":"-"},"content":" private static final Path SHALLOW_CLONING_FLAG_OVERRIDE_TEST_CONFIG_FILES \u003d"},{"lineNumber":54,"author":{"gitId":"-"},"content":" loadResource(RepoConfigurationTest.class,"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \"RepoConfigurationTest/repoconfig_shallowCloningOverrideCsv_test\");"},{"lineNumber":56,"author":{"gitId":"-"},"content":" private static final Path FIND_PREVIOUS_AUTHORS_TEST_CONFIG_FILES \u003d"},{"lineNumber":57,"author":{"gitId":"-"},"content":" loadResource(RepoConfigurationTest.class,"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \"RepoConfigurationTest/repoconfig_findPreviousAuthors_test\");"},{"lineNumber":59,"author":{"gitId":"-"},"content":" private static final Path FIND_PREVIOUS_AUTHORS_FLAG_OVERRIDE_TEST_CONFIG_FILES \u003d"},{"lineNumber":60,"author":{"gitId":"-"},"content":" loadResource(RepoConfigurationTest.class,"},{"lineNumber":61,"author":{"gitId":"-"},"content":" \"RepoConfigurationTest/repoconfig_findPreviousAuthorsOverrideCsv_test\");"},{"lineNumber":62,"author":{"gitId":"-"},"content":""},{"lineNumber":63,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_BETA \u003d \"https://github.com/reposense/testrepo-Beta.git\";"},{"lineNumber":64,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_DELTA \u003d \"https://github.com/reposense/testrepo-Delta.git\";"},{"lineNumber":65,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_MINIMAL_STANDALONE_CONFIG \u003d"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \"https://github.com/reposense/testrepo-minimalstandaloneconfig.git\";"},{"lineNumber":67,"author":{"gitId":"-"},"content":""},{"lineNumber":68,"author":{"gitId":"-"},"content":" private static final Author FIRST_AUTHOR \u003d new Author(\"lithiumlkid\");"},{"lineNumber":69,"author":{"gitId":"-"},"content":" private static final Author SECOND_AUTHOR \u003d new Author(\"codeeong\");"},{"lineNumber":70,"author":{"gitId":"-"},"content":" private static final Author THIRD_AUTHOR \u003d new Author(\"jordancjq\");"},{"lineNumber":71,"author":{"gitId":"-"},"content":" private static final Author FOURTH_AUTHOR \u003d new Author(\"lohtianwei\");"},{"lineNumber":72,"author":{"gitId":"-"},"content":""},{"lineNumber":73,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e FIRST_AUTHOR_ALIASES \u003d Collections.singletonList(\"Ahmad Syafiq\");"},{"lineNumber":74,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e SECOND_AUTHOR_ALIASES \u003d Collections.emptyList();"},{"lineNumber":75,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e THIRD_AUTHOR_ALIASES \u003d Collections.singletonList(\"Jordan Chong\");"},{"lineNumber":76,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e FOURTH_AUTHOR_ALIASES \u003d Collections.singletonList(\"Tianwei\");"},{"lineNumber":77,"author":{"gitId":"-"},"content":""},{"lineNumber":78,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e REPO_LEVEL_GLOB_LIST \u003d Collections.singletonList(\"collated**\");"},{"lineNumber":79,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e FIRST_AUTHOR_GLOB_LIST \u003d"},{"lineNumber":80,"author":{"gitId":"-"},"content":" Arrays.asList(\"*.aa1\", \"**.aa2\", \"**.java\", \"collated**\");"},{"lineNumber":81,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e SECOND_AUTHOR_GLOB_LIST \u003d Arrays.asList(\"\", \"collated**\");"},{"lineNumber":82,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e THIRD_AUTHOR_GLOB_LIST \u003d Arrays.asList(\"**[!(.md)]\", \"collated**\");"},{"lineNumber":83,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e FOURTH_AUTHOR_GLOB_LIST \u003d Collections.singletonList(\"collated**\");"},{"lineNumber":84,"author":{"gitId":"-"},"content":""},{"lineNumber":85,"author":{"gitId":"-"},"content":" private static final List\u003cFileType\u003e CONFIG_FORMATS \u003d FileType.convertFormatStringsToFileTypes(Arrays.asList("},{"lineNumber":86,"author":{"gitId":"-"},"content":" \"java\", \"adoc\", \"md\"));"},{"lineNumber":87,"author":{"gitId":"-"},"content":" private static final List\u003cFileType\u003e FIRST_CONFIG_GROUPS \u003d Arrays.asList("},{"lineNumber":88,"author":{"gitId":"-"},"content":" new FileType(\"test\", Collections.singletonList(\"src/test**\")),"},{"lineNumber":89,"author":{"gitId":"-"},"content":" new FileType(\"code\", Collections.singletonList(\"**.java\")),"},{"lineNumber":90,"author":{"gitId":"-"},"content":" new FileType(\"docs\", Collections.singletonList(\"docs**\")));"},{"lineNumber":91,"author":{"gitId":"-"},"content":" private static final List\u003cFileType\u003e SECOND_CONFIG_GROUPS \u003d Arrays.asList("},{"lineNumber":92,"author":{"gitId":"-"},"content":" new FileType(\"docs\", Collections.singletonList(\"docs**\")));"},{"lineNumber":93,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e CLI_FORMATS \u003d Arrays.asList(\"css\", \"html\");"},{"lineNumber":94,"author":{"gitId":"-"},"content":""},{"lineNumber":95,"author":{"gitId":"-"},"content":" private static RepoConfiguration repoDeltaStandaloneConfig;"},{"lineNumber":96,"author":{"gitId":"-"},"content":" private ReportGenerator reportGenerator \u003d new ReportGenerator();"},{"lineNumber":97,"author":{"gitId":"-"},"content":""},{"lineNumber":98,"author":{"gitId":"-"},"content":" @BeforeAll"},{"lineNumber":99,"author":{"gitId":"-"},"content":" public static void setUp() throws Exception {"},{"lineNumber":100,"author":{"gitId":"-"},"content":" FIRST_AUTHOR.setAuthorAliases(FIRST_AUTHOR_ALIASES);"},{"lineNumber":101,"author":{"gitId":"-"},"content":" SECOND_AUTHOR.setAuthorAliases(SECOND_AUTHOR_ALIASES);"},{"lineNumber":102,"author":{"gitId":"-"},"content":" THIRD_AUTHOR.setAuthorAliases(THIRD_AUTHOR_ALIASES);"},{"lineNumber":103,"author":{"gitId":"-"},"content":" FOURTH_AUTHOR.setAuthorAliases(FOURTH_AUTHOR_ALIASES);"},{"lineNumber":104,"author":{"gitId":"-"},"content":""},{"lineNumber":105,"author":{"gitId":"-"},"content":" FIRST_AUTHOR.setIgnoreGlobList(FIRST_AUTHOR_GLOB_LIST);"},{"lineNumber":106,"author":{"gitId":"-"},"content":" SECOND_AUTHOR.setIgnoreGlobList(SECOND_AUTHOR_GLOB_LIST);"},{"lineNumber":107,"author":{"gitId":"-"},"content":" THIRD_AUTHOR.setIgnoreGlobList(THIRD_AUTHOR_GLOB_LIST);"},{"lineNumber":108,"author":{"gitId":"-"},"content":" FOURTH_AUTHOR.setIgnoreGlobList(FOURTH_AUTHOR_GLOB_LIST);"},{"lineNumber":109,"author":{"gitId":"-"},"content":""},{"lineNumber":110,"author":{"gitId":"-"},"content":" List\u003cAuthor\u003e expectedAuthors \u003d new ArrayList\u003c\u003e();"},{"lineNumber":111,"author":{"gitId":"-"},"content":" expectedAuthors.add(FIRST_AUTHOR);"},{"lineNumber":112,"author":{"gitId":"-"},"content":" expectedAuthors.add(SECOND_AUTHOR);"},{"lineNumber":113,"author":{"gitId":"-"},"content":" expectedAuthors.add(THIRD_AUTHOR);"},{"lineNumber":114,"author":{"gitId":"-"},"content":" expectedAuthors.add(FOURTH_AUTHOR);"},{"lineNumber":115,"author":{"gitId":"-"},"content":""},{"lineNumber":116,"author":{"gitId":"asdfghjkxd"},"content":" repoDeltaStandaloneConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":117,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":118,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":119,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":120,"author":{"gitId":"-"},"content":" repoDeltaStandaloneConfig.setAuthorList(expectedAuthors);"},{"lineNumber":121,"author":{"gitId":"-"},"content":" repoDeltaStandaloneConfig.addAuthorNamesToAuthorMapEntry(FIRST_AUTHOR, FIRST_AUTHOR_ALIASES);"},{"lineNumber":122,"author":{"gitId":"-"},"content":" repoDeltaStandaloneConfig.addAuthorNamesToAuthorMapEntry(FOURTH_AUTHOR, FOURTH_AUTHOR_ALIASES);"},{"lineNumber":123,"author":{"gitId":"-"},"content":" repoDeltaStandaloneConfig.setAuthorDisplayName(FIRST_AUTHOR, \"Ahm\");"},{"lineNumber":124,"author":{"gitId":"-"},"content":" repoDeltaStandaloneConfig.setAuthorDisplayName(SECOND_AUTHOR, \"Cod\");"},{"lineNumber":125,"author":{"gitId":"-"},"content":" repoDeltaStandaloneConfig.setAuthorDisplayName(THIRD_AUTHOR, \"Jor\");"},{"lineNumber":126,"author":{"gitId":"-"},"content":" repoDeltaStandaloneConfig.setAuthorDisplayName(FOURTH_AUTHOR, \"Loh\");"},{"lineNumber":127,"author":{"gitId":"-"},"content":""},{"lineNumber":128,"author":{"gitId":"-"},"content":" SECOND_AUTHOR.setEmails(Arrays.asList(\"codeeong@gmail.com\", \"33129797+codeeong@users.noreply.github.com\"));"},{"lineNumber":129,"author":{"gitId":"-"},"content":" for (Author author : expectedAuthors) {"},{"lineNumber":130,"author":{"gitId":"-"},"content":" repoDeltaStandaloneConfig.addAuthorEmailsToAuthorMapEntry(author, author.getEmails());"},{"lineNumber":131,"author":{"gitId":"-"},"content":" }"},{"lineNumber":132,"author":{"gitId":"-"},"content":""},{"lineNumber":133,"author":{"gitId":"-"},"content":" repoDeltaStandaloneConfig.setIgnoreGlobList(REPO_LEVEL_GLOB_LIST);"},{"lineNumber":134,"author":{"gitId":"-"},"content":" repoDeltaStandaloneConfig.setFormats(CONFIG_FORMATS);"},{"lineNumber":135,"author":{"gitId":"-"},"content":" }"},{"lineNumber":136,"author":{"gitId":"-"},"content":""},{"lineNumber":137,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":138,"author":{"gitId":"-"},"content":" public void repoConfig_usesStandaloneConfig_success() throws Exception {"},{"lineNumber":139,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration actualConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":140,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":141,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":142,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":143,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(actualConfig);"},{"lineNumber":144,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(actualConfig);"},{"lineNumber":145,"author":{"gitId":"-"},"content":""},{"lineNumber":146,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoDeltaStandaloneConfig, actualConfig);"},{"lineNumber":147,"author":{"gitId":"-"},"content":" }"},{"lineNumber":148,"author":{"gitId":"-"},"content":""},{"lineNumber":149,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":150,"author":{"gitId":"-"},"content":" public void repoConfig_ignoresStandaloneConfig_success() throws Exception {"},{"lineNumber":151,"author":{"gitId":"-"},"content":" List\u003cAuthor\u003e expectedAuthors \u003d new ArrayList\u003c\u003e();"},{"lineNumber":152,"author":{"gitId":"-"},"content":" Author author \u003d new Author(FIRST_AUTHOR);"},{"lineNumber":153,"author":{"gitId":"-"},"content":" author.setIgnoreGlobList(REPO_LEVEL_GLOB_LIST);"},{"lineNumber":154,"author":{"gitId":"-"},"content":" expectedAuthors.add(author);"},{"lineNumber":155,"author":{"gitId":"-"},"content":""},{"lineNumber":156,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration expectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":157,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":158,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":159,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":160,"author":{"gitId":"-"},"content":" expectedConfig.setAuthorList(expectedAuthors);"},{"lineNumber":161,"author":{"gitId":"-"},"content":" expectedConfig.addAuthorNamesToAuthorMapEntry(author, FIRST_AUTHOR_ALIASES);"},{"lineNumber":162,"author":{"gitId":"-"},"content":" expectedConfig.setAuthorDisplayName(author, \"Ahm\");"},{"lineNumber":163,"author":{"gitId":"-"},"content":""},{"lineNumber":164,"author":{"gitId":"-"},"content":" expectedConfig.setIgnoreGlobList(REPO_LEVEL_GLOB_LIST);"},{"lineNumber":165,"author":{"gitId":"-"},"content":" expectedConfig.setFormats(CONFIG_FORMATS);"},{"lineNumber":166,"author":{"gitId":"-"},"content":" expectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":167,"author":{"gitId":"-"},"content":""},{"lineNumber":168,"author":{"gitId":"-"},"content":" String formats \u003d String.join(\" \", CLI_FORMATS);"},{"lineNumber":169,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(IGNORE_STANDALONE_TEST_CONFIG_FILES)"},{"lineNumber":170,"author":{"gitId":"-"},"content":" .addFormats(formats)"},{"lineNumber":171,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":172,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":173,"author":{"gitId":"-"},"content":""},{"lineNumber":174,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":175,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":176,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e authorConfigs \u003d"},{"lineNumber":177,"author":{"gitId":"-"},"content":" new AuthorConfigCsvParser(cliArguments.getAuthorConfigFilePath()).parse();"},{"lineNumber":178,"author":{"gitId":"-"},"content":" RepoConfiguration.merge(actualConfigs, authorConfigs);"},{"lineNumber":179,"author":{"gitId":"-"},"content":""},{"lineNumber":180,"author":{"gitId":"-"},"content":" RepoConfiguration actualConfig \u003d actualConfigs.get(0);"},{"lineNumber":181,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(actualConfig);"},{"lineNumber":182,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(actualConfig);"},{"lineNumber":183,"author":{"gitId":"-"},"content":""},{"lineNumber":184,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(expectedConfig, actualConfig);"},{"lineNumber":185,"author":{"gitId":"-"},"content":" }"},{"lineNumber":186,"author":{"gitId":"-"},"content":""},{"lineNumber":187,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":188,"author":{"gitId":"-"},"content":" public void repoConfig_ignoresStandaloneConfigInCli_success() throws Exception {"},{"lineNumber":189,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration expectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":190,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":191,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":192,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":193,"author":{"gitId":"-"},"content":" expectedConfig.setFormats(FileType.convertFormatStringsToFileTypes(CLI_FORMATS));"},{"lineNumber":194,"author":{"gitId":"-"},"content":" expectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":195,"author":{"gitId":"-"},"content":""},{"lineNumber":196,"author":{"gitId":"-"},"content":" String formats \u003d String.join(\" \", CLI_FORMATS);"},{"lineNumber":197,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addRepos(TEST_REPO_DELTA)"},{"lineNumber":198,"author":{"gitId":"-"},"content":" .addFormats(formats)"},{"lineNumber":199,"author":{"gitId":"-"},"content":" .addIgnoreStandaloneConfig()"},{"lineNumber":200,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":201,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":202,"author":{"gitId":"-"},"content":""},{"lineNumber":203,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d RunConfigurationDecider"},{"lineNumber":204,"author":{"gitId":"-"},"content":" .getRunConfiguration(cliArguments)"},{"lineNumber":205,"author":{"gitId":"-"},"content":" .getRepoConfigurations();"},{"lineNumber":206,"author":{"gitId":"-"},"content":" RepoConfiguration.setFormatsToRepoConfigs(actualConfigs, cliArguments.getFormats());"},{"lineNumber":207,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs,"},{"lineNumber":208,"author":{"gitId":"-"},"content":" cliArguments.isStandaloneConfigIgnored());"},{"lineNumber":209,"author":{"gitId":"-"},"content":" RepoConfiguration actualConfig \u003d actualConfigs.get(0);"},{"lineNumber":210,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(actualConfig);"},{"lineNumber":211,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(actualConfig);"},{"lineNumber":212,"author":{"gitId":"-"},"content":""},{"lineNumber":213,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(expectedConfig, actualConfig);"},{"lineNumber":214,"author":{"gitId":"-"},"content":" }"},{"lineNumber":215,"author":{"gitId":"-"},"content":""},{"lineNumber":216,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":217,"author":{"gitId":"-"},"content":" public void repoConfig_ignoreStandaloneConfigInCli_overrideCsv() throws Exception {"},{"lineNumber":218,"author":{"gitId":"-"},"content":""},{"lineNumber":219,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoBetaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":220,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_BETA))"},{"lineNumber":221,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":222,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":223,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setFormats(FileType.convertFormatStringsToFileTypes(CLI_FORMATS));"},{"lineNumber":224,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":225,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoDeltaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":226,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":227,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":228,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":229,"author":{"gitId":"-"},"content":" repoDeltaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":230,"author":{"gitId":"-"},"content":""},{"lineNumber":231,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(IGNORE_STANDALONE_FLAG_OVERRIDE_CSV_TEST)"},{"lineNumber":232,"author":{"gitId":"-"},"content":" .addIgnoreStandaloneConfig()"},{"lineNumber":233,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":234,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":235,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":236,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":237,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs,"},{"lineNumber":238,"author":{"gitId":"-"},"content":" cliArguments.isStandaloneConfigIgnored());"},{"lineNumber":239,"author":{"gitId":"-"},"content":""},{"lineNumber":240,"author":{"gitId":"-"},"content":" RepoConfiguration repoBetaActualConfig \u003d actualConfigs.get(0);"},{"lineNumber":241,"author":{"gitId":"-"},"content":" RepoConfiguration repoDeltaActualConfig \u003d actualConfigs.get(1);"},{"lineNumber":242,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoBetaActualConfig);"},{"lineNumber":243,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoDeltaActualConfig);"},{"lineNumber":244,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoBetaActualConfig);"},{"lineNumber":245,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoDeltaActualConfig);"},{"lineNumber":246,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoBetaExpectedConfig, repoBetaActualConfig);"},{"lineNumber":247,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoDeltaExpectedConfig, repoDeltaActualConfig);"},{"lineNumber":248,"author":{"gitId":"-"},"content":" }"},{"lineNumber":249,"author":{"gitId":"-"},"content":""},{"lineNumber":250,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":251,"author":{"gitId":"-"},"content":" public void repoConfig_ignoreFileSizeLimit_success() throws Exception {"},{"lineNumber":252,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration expectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":253,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":254,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":255,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":256,"author":{"gitId":"-"},"content":" expectedConfig.setIgnoreGlobList(REPO_LEVEL_GLOB_LIST);"},{"lineNumber":257,"author":{"gitId":"-"},"content":" expectedConfig.setFormats(CONFIG_FORMATS);"},{"lineNumber":258,"author":{"gitId":"-"},"content":" expectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":259,"author":{"gitId":"-"},"content":" expectedConfig.setFileSizeLimitIgnored(true);"},{"lineNumber":260,"author":{"gitId":"-"},"content":""},{"lineNumber":261,"author":{"gitId":"-"},"content":" String formats \u003d String.join(\" \", CLI_FORMATS);"},{"lineNumber":262,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(IGNORE_FILESIZE_LIMIT_TEST_CONFIG_FILES)"},{"lineNumber":263,"author":{"gitId":"-"},"content":" .addFormats(formats)"},{"lineNumber":264,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":265,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":266,"author":{"gitId":"-"},"content":""},{"lineNumber":267,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":268,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":269,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs, true);"},{"lineNumber":270,"author":{"gitId":"-"},"content":""},{"lineNumber":271,"author":{"gitId":"-"},"content":" RepoConfiguration actualConfig \u003d actualConfigs.get(0);"},{"lineNumber":272,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(actualConfig);"},{"lineNumber":273,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(actualConfig);"},{"lineNumber":274,"author":{"gitId":"-"},"content":""},{"lineNumber":275,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(expectedConfig, actualConfig);"},{"lineNumber":276,"author":{"gitId":"-"},"content":" }"},{"lineNumber":277,"author":{"gitId":"-"},"content":""},{"lineNumber":278,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":279,"author":{"gitId":"-"},"content":" public void repoConfig_ignoreFileSizeLimitInCli_overrideCsv() throws Exception {"},{"lineNumber":280,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoBetaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":281,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_BETA))"},{"lineNumber":282,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":283,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":284,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setFormats(FileType.convertFormatStringsToFileTypes(CLI_FORMATS));"},{"lineNumber":285,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":286,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setFileSizeLimitIgnored(true);"},{"lineNumber":287,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoDeltaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":288,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":289,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":290,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":291,"author":{"gitId":"-"},"content":" repoDeltaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":292,"author":{"gitId":"-"},"content":" repoDeltaExpectedConfig.setFileSizeLimitIgnored(true);"},{"lineNumber":293,"author":{"gitId":"-"},"content":""},{"lineNumber":294,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(IGNORE_FILESIZE_LIMIT_OVERRIDE_CSV_TEST_CONFIG_FILES)"},{"lineNumber":295,"author":{"gitId":"-"},"content":" .addIgnoreFilesizeLimit()"},{"lineNumber":296,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":297,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":298,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":299,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":300,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs, true);"},{"lineNumber":301,"author":{"gitId":"-"},"content":" RepoConfiguration.setFileSizeLimitIgnoredToRepoConfigs(actualConfigs,"},{"lineNumber":302,"author":{"gitId":"-"},"content":" cliArguments.isFileSizeLimitIgnored());"},{"lineNumber":303,"author":{"gitId":"-"},"content":""},{"lineNumber":304,"author":{"gitId":"-"},"content":" RepoConfiguration repoBetaActualConfig \u003d actualConfigs.get(0);"},{"lineNumber":305,"author":{"gitId":"-"},"content":" RepoConfiguration repoDeltaActualConfig \u003d actualConfigs.get(1);"},{"lineNumber":306,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoBetaActualConfig);"},{"lineNumber":307,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoDeltaActualConfig);"},{"lineNumber":308,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoBetaActualConfig);"},{"lineNumber":309,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoDeltaActualConfig);"},{"lineNumber":310,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoBetaExpectedConfig, repoBetaActualConfig);"},{"lineNumber":311,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoDeltaExpectedConfig, repoDeltaActualConfig);"},{"lineNumber":312,"author":{"gitId":"-"},"content":" }"},{"lineNumber":313,"author":{"gitId":"-"},"content":""},{"lineNumber":314,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":315,"author":{"gitId":"-"},"content":" public void repoConfig_withoutIgnoreStandaloneConfigInCli_useCsv() throws Exception {"},{"lineNumber":316,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoBetaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":317,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_BETA))"},{"lineNumber":318,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":319,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":320,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setFormats(FileType.convertFormatStringsToFileTypes(CLI_FORMATS));"},{"lineNumber":321,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":322,"author":{"gitId":"-"},"content":""},{"lineNumber":323,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(IGNORE_STANDALONE_FLAG_OVERRIDE_CSV_TEST).build();"},{"lineNumber":324,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":325,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":326,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":327,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs,"},{"lineNumber":328,"author":{"gitId":"-"},"content":" cliArguments.isStandaloneConfigIgnored());"},{"lineNumber":329,"author":{"gitId":"-"},"content":""},{"lineNumber":330,"author":{"gitId":"-"},"content":" RepoConfiguration repoBetaActualConfig \u003d actualConfigs.get(0);"},{"lineNumber":331,"author":{"gitId":"-"},"content":" RepoConfiguration repoDeltaActualConfig \u003d actualConfigs.get(1);"},{"lineNumber":332,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoBetaActualConfig);"},{"lineNumber":333,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoDeltaActualConfig);"},{"lineNumber":334,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoBetaActualConfig);"},{"lineNumber":335,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoDeltaActualConfig);"},{"lineNumber":336,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoBetaExpectedConfig, repoBetaActualConfig);"},{"lineNumber":337,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoDeltaStandaloneConfig, repoDeltaActualConfig);"},{"lineNumber":338,"author":{"gitId":"-"},"content":" }"},{"lineNumber":339,"author":{"gitId":"-"},"content":""},{"lineNumber":340,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":341,"author":{"gitId":"-"},"content":" public void repoConfig_wrongKeywordUseStandaloneConfig_success() throws Exception {"},{"lineNumber":342,"author":{"gitId":"-"},"content":" String formats \u003d String.join(\" \", CLI_FORMATS);"},{"lineNumber":343,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(IGNORE_STANDALONE_KEYWORD_TEST_CONFIG_FILES)"},{"lineNumber":344,"author":{"gitId":"-"},"content":" .addFormats(formats)"},{"lineNumber":345,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":346,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":347,"author":{"gitId":"-"},"content":""},{"lineNumber":348,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":349,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":350,"author":{"gitId":"-"},"content":""},{"lineNumber":351,"author":{"gitId":"-"},"content":" RepoConfiguration actualConfig \u003d actualConfigs.get(0);"},{"lineNumber":352,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(actualConfig);"},{"lineNumber":353,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(actualConfig);"},{"lineNumber":354,"author":{"gitId":"-"},"content":""},{"lineNumber":355,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoDeltaStandaloneConfig, actualConfig);"},{"lineNumber":356,"author":{"gitId":"-"},"content":" }"},{"lineNumber":357,"author":{"gitId":"-"},"content":""},{"lineNumber":358,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":359,"author":{"gitId":"-"},"content":" public void repoConfig_shallowCloning_success() throws Exception {"},{"lineNumber":360,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration expectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":361,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":362,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":363,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":364,"author":{"gitId":"-"},"content":" expectedConfig.setIgnoreGlobList(REPO_LEVEL_GLOB_LIST);"},{"lineNumber":365,"author":{"gitId":"-"},"content":" expectedConfig.setFormats(CONFIG_FORMATS);"},{"lineNumber":366,"author":{"gitId":"-"},"content":" expectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":367,"author":{"gitId":"-"},"content":" expectedConfig.setIsShallowCloningPerformed(true);"},{"lineNumber":368,"author":{"gitId":"-"},"content":""},{"lineNumber":369,"author":{"gitId":"-"},"content":" String formats \u003d String.join(\" \", CLI_FORMATS);"},{"lineNumber":370,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(SHALLOW_CLONING_TEST_CONFIG_FILES)"},{"lineNumber":371,"author":{"gitId":"-"},"content":" .addFormats(formats)"},{"lineNumber":372,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":373,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":374,"author":{"gitId":"-"},"content":""},{"lineNumber":375,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":376,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":377,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs, true);"},{"lineNumber":378,"author":{"gitId":"-"},"content":""},{"lineNumber":379,"author":{"gitId":"-"},"content":" RepoConfiguration actualConfig \u003d actualConfigs.get(0);"},{"lineNumber":380,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(actualConfig);"},{"lineNumber":381,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(actualConfig);"},{"lineNumber":382,"author":{"gitId":"-"},"content":""},{"lineNumber":383,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(expectedConfig, actualConfig);"},{"lineNumber":384,"author":{"gitId":"-"},"content":" }"},{"lineNumber":385,"author":{"gitId":"-"},"content":""},{"lineNumber":386,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":387,"author":{"gitId":"-"},"content":" public void repoConfig_shallowCloningInCli_success() throws Exception {"},{"lineNumber":388,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration expectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":389,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":390,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":391,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":392,"author":{"gitId":"-"},"content":" expectedConfig.setFormats(FileType.convertFormatStringsToFileTypes(CLI_FORMATS));"},{"lineNumber":393,"author":{"gitId":"-"},"content":" expectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":394,"author":{"gitId":"-"},"content":" expectedConfig.setIsShallowCloningPerformed(true);"},{"lineNumber":395,"author":{"gitId":"-"},"content":""},{"lineNumber":396,"author":{"gitId":"-"},"content":" String formats \u003d String.join(\" \", CLI_FORMATS);"},{"lineNumber":397,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addRepos(TEST_REPO_DELTA)"},{"lineNumber":398,"author":{"gitId":"-"},"content":" .addFormats(formats)"},{"lineNumber":399,"author":{"gitId":"-"},"content":" .addShallowCloning()"},{"lineNumber":400,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":401,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":402,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d RunConfigurationDecider"},{"lineNumber":403,"author":{"gitId":"-"},"content":" .getRunConfiguration(cliArguments)"},{"lineNumber":404,"author":{"gitId":"-"},"content":" .getRepoConfigurations();"},{"lineNumber":405,"author":{"gitId":"-"},"content":" RepoConfiguration.setFormatsToRepoConfigs(actualConfigs, cliArguments.getFormats());"},{"lineNumber":406,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs, true);"},{"lineNumber":407,"author":{"gitId":"-"},"content":" RepoConfiguration.setIsShallowCloningPerformedToRepoConfigs(actualConfigs,"},{"lineNumber":408,"author":{"gitId":"-"},"content":" cliArguments.isShallowCloningPerformed());"},{"lineNumber":409,"author":{"gitId":"-"},"content":""},{"lineNumber":410,"author":{"gitId":"-"},"content":" RepoConfiguration actualConfig \u003d actualConfigs.get(0);"},{"lineNumber":411,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(actualConfig);"},{"lineNumber":412,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(actualConfig);"},{"lineNumber":413,"author":{"gitId":"-"},"content":""},{"lineNumber":414,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(expectedConfig, actualConfig);"},{"lineNumber":415,"author":{"gitId":"-"},"content":" }"},{"lineNumber":416,"author":{"gitId":"-"},"content":""},{"lineNumber":417,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":418,"author":{"gitId":"-"},"content":" public void repoConfig_shallowCloningInCli_overrideCsv() throws Exception {"},{"lineNumber":419,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoBetaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":420,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_BETA))"},{"lineNumber":421,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":422,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":423,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setFormats(FileType.convertFormatStringsToFileTypes(CLI_FORMATS));"},{"lineNumber":424,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":425,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setIsShallowCloningPerformed(true);"},{"lineNumber":426,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoDeltaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":427,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":428,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":429,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":430,"author":{"gitId":"-"},"content":" repoDeltaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":431,"author":{"gitId":"-"},"content":" repoDeltaExpectedConfig.setIsShallowCloningPerformed(true);"},{"lineNumber":432,"author":{"gitId":"-"},"content":""},{"lineNumber":433,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(SHALLOW_CLONING_FLAG_OVERRIDE_TEST_CONFIG_FILES)"},{"lineNumber":434,"author":{"gitId":"-"},"content":" .addShallowCloning()"},{"lineNumber":435,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":436,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":437,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":438,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":439,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs, true);"},{"lineNumber":440,"author":{"gitId":"-"},"content":" RepoConfiguration.setIsShallowCloningPerformedToRepoConfigs(actualConfigs,"},{"lineNumber":441,"author":{"gitId":"-"},"content":" cliArguments.isShallowCloningPerformed());"},{"lineNumber":442,"author":{"gitId":"-"},"content":""},{"lineNumber":443,"author":{"gitId":"-"},"content":" RepoConfiguration repoBetaActualConfig \u003d actualConfigs.get(0);"},{"lineNumber":444,"author":{"gitId":"-"},"content":" RepoConfiguration repoDeltaActualConfig \u003d actualConfigs.get(1);"},{"lineNumber":445,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoBetaActualConfig);"},{"lineNumber":446,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoDeltaActualConfig);"},{"lineNumber":447,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoBetaActualConfig);"},{"lineNumber":448,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoDeltaActualConfig);"},{"lineNumber":449,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoBetaExpectedConfig, repoBetaActualConfig);"},{"lineNumber":450,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoDeltaExpectedConfig, repoDeltaActualConfig);"},{"lineNumber":451,"author":{"gitId":"-"},"content":" }"},{"lineNumber":452,"author":{"gitId":"-"},"content":""},{"lineNumber":453,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":454,"author":{"gitId":"-"},"content":" public void repoConfig_withoutShallowCloningInInCli_useCsv() throws Exception {"},{"lineNumber":455,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoBetaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":456,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_BETA))"},{"lineNumber":457,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":458,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":459,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setFormats(FileType.convertFormatStringsToFileTypes(CLI_FORMATS));"},{"lineNumber":460,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":461,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setIsShallowCloningPerformed(true);"},{"lineNumber":462,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoDeltaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":463,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":464,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":465,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":466,"author":{"gitId":"-"},"content":" repoDeltaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":467,"author":{"gitId":"-"},"content":""},{"lineNumber":468,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(SHALLOW_CLONING_FLAG_OVERRIDE_TEST_CONFIG_FILES).build();"},{"lineNumber":469,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":470,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":471,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":472,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs, true);"},{"lineNumber":473,"author":{"gitId":"-"},"content":" RepoConfiguration.setIsShallowCloningPerformedToRepoConfigs(actualConfigs,"},{"lineNumber":474,"author":{"gitId":"-"},"content":" cliArguments.isShallowCloningPerformed());"},{"lineNumber":475,"author":{"gitId":"-"},"content":""},{"lineNumber":476,"author":{"gitId":"-"},"content":" RepoConfiguration repoBetaActualConfig \u003d actualConfigs.get(0);"},{"lineNumber":477,"author":{"gitId":"-"},"content":" RepoConfiguration repoDeltaActualConfig \u003d actualConfigs.get(1);"},{"lineNumber":478,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoBetaActualConfig);"},{"lineNumber":479,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoDeltaActualConfig);"},{"lineNumber":480,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoBetaActualConfig);"},{"lineNumber":481,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoDeltaActualConfig);"},{"lineNumber":482,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoBetaExpectedConfig, repoBetaActualConfig);"},{"lineNumber":483,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoDeltaExpectedConfig, repoDeltaActualConfig);"},{"lineNumber":484,"author":{"gitId":"-"},"content":" }"},{"lineNumber":485,"author":{"gitId":"-"},"content":""},{"lineNumber":486,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":487,"author":{"gitId":"-"},"content":" public void repoConfig_findPreviousAuthors_success() throws Exception {"},{"lineNumber":488,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration expectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":489,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":490,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":491,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":492,"author":{"gitId":"-"},"content":" expectedConfig.setIgnoreGlobList(REPO_LEVEL_GLOB_LIST);"},{"lineNumber":493,"author":{"gitId":"-"},"content":" expectedConfig.setFormats(CONFIG_FORMATS);"},{"lineNumber":494,"author":{"gitId":"-"},"content":" expectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":495,"author":{"gitId":"-"},"content":" expectedConfig.setIsFindingPreviousAuthorsPerformed(true);"},{"lineNumber":496,"author":{"gitId":"-"},"content":""},{"lineNumber":497,"author":{"gitId":"-"},"content":" String formats \u003d String.join(\" \", CLI_FORMATS);"},{"lineNumber":498,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(FIND_PREVIOUS_AUTHORS_TEST_CONFIG_FILES)"},{"lineNumber":499,"author":{"gitId":"-"},"content":" .addFormats(formats)"},{"lineNumber":500,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":501,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":502,"author":{"gitId":"-"},"content":""},{"lineNumber":503,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":504,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":505,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs, true);"},{"lineNumber":506,"author":{"gitId":"-"},"content":""},{"lineNumber":507,"author":{"gitId":"-"},"content":" RepoConfiguration actualConfig \u003d actualConfigs.get(0);"},{"lineNumber":508,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(actualConfig);"},{"lineNumber":509,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(actualConfig);"},{"lineNumber":510,"author":{"gitId":"-"},"content":""},{"lineNumber":511,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(expectedConfig, actualConfig);"},{"lineNumber":512,"author":{"gitId":"-"},"content":" }"},{"lineNumber":513,"author":{"gitId":"-"},"content":""},{"lineNumber":514,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":515,"author":{"gitId":"-"},"content":" public void repoConfig_findPreviousAuthorsInCli_success() throws Exception {"},{"lineNumber":516,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration expectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":517,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":518,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":519,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":520,"author":{"gitId":"-"},"content":" expectedConfig.setFormats(FileType.convertFormatStringsToFileTypes(CLI_FORMATS));"},{"lineNumber":521,"author":{"gitId":"-"},"content":" expectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":522,"author":{"gitId":"-"},"content":" expectedConfig.setIsFindingPreviousAuthorsPerformed(true);"},{"lineNumber":523,"author":{"gitId":"-"},"content":""},{"lineNumber":524,"author":{"gitId":"-"},"content":" String formats \u003d String.join(\" \", CLI_FORMATS);"},{"lineNumber":525,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addRepos(TEST_REPO_DELTA)"},{"lineNumber":526,"author":{"gitId":"-"},"content":" .addFormats(formats)"},{"lineNumber":527,"author":{"gitId":"-"},"content":" .addFindPreviousAuthors()"},{"lineNumber":528,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":529,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":530,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d RunConfigurationDecider"},{"lineNumber":531,"author":{"gitId":"-"},"content":" .getRunConfiguration(cliArguments)"},{"lineNumber":532,"author":{"gitId":"-"},"content":" .getRepoConfigurations();"},{"lineNumber":533,"author":{"gitId":"-"},"content":" RepoConfiguration.setFormatsToRepoConfigs(actualConfigs, cliArguments.getFormats());"},{"lineNumber":534,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs, true);"},{"lineNumber":535,"author":{"gitId":"-"},"content":" RepoConfiguration.setIsFindingPreviousAuthorsPerformedToRepoConfigs(actualConfigs,"},{"lineNumber":536,"author":{"gitId":"-"},"content":" cliArguments.isFindingPreviousAuthorsPerformed());"},{"lineNumber":537,"author":{"gitId":"-"},"content":""},{"lineNumber":538,"author":{"gitId":"-"},"content":" RepoConfiguration actualConfig \u003d actualConfigs.get(0);"},{"lineNumber":539,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(actualConfig);"},{"lineNumber":540,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(actualConfig);"},{"lineNumber":541,"author":{"gitId":"-"},"content":""},{"lineNumber":542,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(expectedConfig, actualConfig);"},{"lineNumber":543,"author":{"gitId":"-"},"content":" }"},{"lineNumber":544,"author":{"gitId":"-"},"content":""},{"lineNumber":545,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":546,"author":{"gitId":"-"},"content":" public void repoConfig_findPreviousAuthorsInCli_overrideCsv() throws Exception {"},{"lineNumber":547,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoBetaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":548,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_BETA))"},{"lineNumber":549,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":550,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":551,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setFormats(FileType.convertFormatStringsToFileTypes(CLI_FORMATS));"},{"lineNumber":552,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":553,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setIsFindingPreviousAuthorsPerformed(true);"},{"lineNumber":554,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoDeltaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":555,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":556,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":557,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":558,"author":{"gitId":"-"},"content":" repoDeltaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":559,"author":{"gitId":"-"},"content":" repoDeltaExpectedConfig.setIsFindingPreviousAuthorsPerformed(true);"},{"lineNumber":560,"author":{"gitId":"-"},"content":""},{"lineNumber":561,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(FIND_PREVIOUS_AUTHORS_FLAG_OVERRIDE_TEST_CONFIG_FILES)"},{"lineNumber":562,"author":{"gitId":"-"},"content":" .addShallowCloning()"},{"lineNumber":563,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":564,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":565,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":566,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":567,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs, true);"},{"lineNumber":568,"author":{"gitId":"-"},"content":" RepoConfiguration.setIsFindingPreviousAuthorsPerformedToRepoConfigs(actualConfigs,"},{"lineNumber":569,"author":{"gitId":"-"},"content":" cliArguments.isFindingPreviousAuthorsPerformed());"},{"lineNumber":570,"author":{"gitId":"-"},"content":""},{"lineNumber":571,"author":{"gitId":"-"},"content":" RepoConfiguration repoBetaActualConfig \u003d actualConfigs.get(0);"},{"lineNumber":572,"author":{"gitId":"-"},"content":" RepoConfiguration repoDeltaActualConfig \u003d actualConfigs.get(1);"},{"lineNumber":573,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoBetaActualConfig);"},{"lineNumber":574,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoDeltaActualConfig);"},{"lineNumber":575,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoBetaActualConfig);"},{"lineNumber":576,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoDeltaActualConfig);"},{"lineNumber":577,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoBetaExpectedConfig, repoBetaActualConfig);"},{"lineNumber":578,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoDeltaExpectedConfig, repoDeltaActualConfig);"},{"lineNumber":579,"author":{"gitId":"-"},"content":" }"},{"lineNumber":580,"author":{"gitId":"-"},"content":""},{"lineNumber":581,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":582,"author":{"gitId":"-"},"content":" public void repoConfig_withoutFindPreviousAuthorsInCli_useCsv() throws Exception {"},{"lineNumber":583,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoBetaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":584,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_BETA))"},{"lineNumber":585,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":586,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":587,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setFormats(FileType.convertFormatStringsToFileTypes(CLI_FORMATS));"},{"lineNumber":588,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":589,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setIsFindingPreviousAuthorsPerformed(true);"},{"lineNumber":590,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoDeltaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":591,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":592,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":593,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":594,"author":{"gitId":"-"},"content":" repoDeltaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":595,"author":{"gitId":"-"},"content":""},{"lineNumber":596,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(FIND_PREVIOUS_AUTHORS_FLAG_OVERRIDE_TEST_CONFIG_FILES).build();"},{"lineNumber":597,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":598,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":599,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":600,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs, true);"},{"lineNumber":601,"author":{"gitId":"-"},"content":" RepoConfiguration.setIsFindingPreviousAuthorsPerformedToRepoConfigs(actualConfigs,"},{"lineNumber":602,"author":{"gitId":"-"},"content":" cliArguments.isFindingPreviousAuthorsPerformed());"},{"lineNumber":603,"author":{"gitId":"-"},"content":""},{"lineNumber":604,"author":{"gitId":"-"},"content":" RepoConfiguration repoBetaActualConfig \u003d actualConfigs.get(0);"},{"lineNumber":605,"author":{"gitId":"-"},"content":" RepoConfiguration repoDeltaActualConfig \u003d actualConfigs.get(1);"},{"lineNumber":606,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoBetaActualConfig);"},{"lineNumber":607,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoDeltaActualConfig);"},{"lineNumber":608,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoBetaActualConfig);"},{"lineNumber":609,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoDeltaActualConfig);"},{"lineNumber":610,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoBetaExpectedConfig, repoBetaActualConfig);"},{"lineNumber":611,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoDeltaExpectedConfig, repoDeltaActualConfig);"},{"lineNumber":612,"author":{"gitId":"-"},"content":" }"},{"lineNumber":613,"author":{"gitId":"-"},"content":""},{"lineNumber":614,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":615,"author":{"gitId":"-"},"content":" public void repoConfig_userEnvironmentCannotRunFindPreviousAuthors_setFindPreviousAuthorsToFalseInAllRepoConfigs()"},{"lineNumber":616,"author":{"gitId":"-"},"content":" throws Exception {"},{"lineNumber":617,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoBetaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":618,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_BETA))"},{"lineNumber":619,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":620,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":621,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setFormats(FileType.convertFormatStringsToFileTypes(CLI_FORMATS));"},{"lineNumber":622,"author":{"gitId":"-"},"content":" repoBetaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":623,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration repoDeltaExpectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":624,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":625,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":626,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":627,"author":{"gitId":"-"},"content":" repoDeltaExpectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":628,"author":{"gitId":"-"},"content":""},{"lineNumber":629,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(FIND_PREVIOUS_AUTHORS_FLAG_OVERRIDE_TEST_CONFIG_FILES).build();"},{"lineNumber":630,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":631,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":632,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":633,"author":{"gitId":"-"},"content":" RepoConfiguration.setStandaloneConfigIgnoredToRepoConfigs(actualConfigs, true);"},{"lineNumber":634,"author":{"gitId":"-"},"content":" RepoConfiguration.setIsFindingPreviousAuthorsPerformedToRepoConfigs(actualConfigs,"},{"lineNumber":635,"author":{"gitId":"-"},"content":" cliArguments.isFindingPreviousAuthorsPerformed());"},{"lineNumber":636,"author":{"gitId":"-"},"content":""},{"lineNumber":637,"author":{"gitId":"-"},"content":" RepoConfiguration repoBetaActualConfig \u003d actualConfigs.get(0);"},{"lineNumber":638,"author":{"gitId":"-"},"content":" RepoConfiguration repoDeltaActualConfig \u003d actualConfigs.get(1);"},{"lineNumber":639,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoBetaActualConfig);"},{"lineNumber":640,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(repoDeltaActualConfig);"},{"lineNumber":641,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoBetaActualConfig);"},{"lineNumber":642,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(repoDeltaActualConfig);"},{"lineNumber":643,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoBetaExpectedConfig, repoBetaActualConfig);"},{"lineNumber":644,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(repoDeltaExpectedConfig, repoDeltaActualConfig);"},{"lineNumber":645,"author":{"gitId":"-"},"content":" }"},{"lineNumber":646,"author":{"gitId":"-"},"content":""},{"lineNumber":647,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":648,"author":{"gitId":"-"},"content":" public void repoConfig_withFormats_ignoreCliFormats() throws Exception {"},{"lineNumber":649,"author":{"gitId":"-"},"content":" String formats \u003d String.join(\" \", CLI_FORMATS);"},{"lineNumber":650,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(FORMATS_TEST_CONFIG_FILES)"},{"lineNumber":651,"author":{"gitId":"-"},"content":" .addFormats(formats)"},{"lineNumber":652,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":653,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":654,"author":{"gitId":"-"},"content":""},{"lineNumber":655,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":656,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":657,"author":{"gitId":"-"},"content":" RepoConfiguration.setFormatsToRepoConfigs(actualConfigs, cliArguments.getFormats());"},{"lineNumber":658,"author":{"gitId":"-"},"content":""},{"lineNumber":659,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, actualConfigs.size());"},{"lineNumber":660,"author":{"gitId":"-"},"content":" Assertions.assertEquals(CONFIG_FORMATS, actualConfigs.get(0).getFileTypeManager().getFormats());"},{"lineNumber":661,"author":{"gitId":"-"},"content":" }"},{"lineNumber":662,"author":{"gitId":"-"},"content":""},{"lineNumber":663,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":664,"author":{"gitId":"-"},"content":" public void repoConfig_withoutFormats_useCliFormats() throws Exception {"},{"lineNumber":665,"author":{"gitId":"-"},"content":" String formats \u003d String.join(\" \", CLI_FORMATS);"},{"lineNumber":666,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(WITHOUT_FORMATS_TEST_CONFIG_FILES)"},{"lineNumber":667,"author":{"gitId":"-"},"content":" .addFormats(formats)"},{"lineNumber":668,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":669,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":670,"author":{"gitId":"-"},"content":""},{"lineNumber":671,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":672,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":673,"author":{"gitId":"-"},"content":" RepoConfiguration.setFormatsToRepoConfigs(actualConfigs, cliArguments.getFormats());"},{"lineNumber":674,"author":{"gitId":"-"},"content":""},{"lineNumber":675,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, actualConfigs.size());"},{"lineNumber":676,"author":{"gitId":"-"},"content":""},{"lineNumber":677,"author":{"gitId":"-"},"content":" List\u003cFileType\u003e actualFormats \u003d actualConfigs.get(0).getFileTypeManager().getFormats();"},{"lineNumber":678,"author":{"gitId":"-"},"content":" Assertions.assertEquals(FileType.convertFormatStringsToFileTypes(CLI_FORMATS), actualFormats);"},{"lineNumber":679,"author":{"gitId":"-"},"content":" }"},{"lineNumber":680,"author":{"gitId":"-"},"content":""},{"lineNumber":681,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":682,"author":{"gitId":"-"},"content":" public void repoConfig_withCustomGroups_useCustomGroups() throws Exception {"},{"lineNumber":683,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(GROUPS_TEST_CONFIG_FILES).build();"},{"lineNumber":684,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":685,"author":{"gitId":"-"},"content":""},{"lineNumber":686,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":687,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":688,"author":{"gitId":"-"},"content":" List\u003cGroupConfiguration\u003e groupConfigs \u003d"},{"lineNumber":689,"author":{"gitId":"-"},"content":" new GroupConfigCsvParser(cliArguments.getGroupConfigFilePath()).parse();"},{"lineNumber":690,"author":{"gitId":"-"},"content":""},{"lineNumber":691,"author":{"gitId":"-"},"content":" RepoConfiguration.setGroupConfigsToRepos(actualConfigs, groupConfigs);"},{"lineNumber":692,"author":{"gitId":"-"},"content":""},{"lineNumber":693,"author":{"gitId":"-"},"content":" Assertions.assertEquals(2, actualConfigs.size());"},{"lineNumber":694,"author":{"gitId":"-"},"content":" Assertions.assertEquals(FIRST_CONFIG_GROUPS, actualConfigs.get(0).getFileTypeManager().getGroups());"},{"lineNumber":695,"author":{"gitId":"-"},"content":" Assertions.assertEquals(SECOND_CONFIG_GROUPS, actualConfigs.get(1).getFileTypeManager().getGroups());"},{"lineNumber":696,"author":{"gitId":"-"},"content":" }"},{"lineNumber":697,"author":{"gitId":"-"},"content":""},{"lineNumber":698,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":699,"author":{"gitId":"-"},"content":" public void repoConfig_withoutFormatsAndCliFormats_useAllFormats() throws Exception {"},{"lineNumber":700,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(WITHOUT_FORMATS_TEST_CONFIG_FILES).build();"},{"lineNumber":701,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":702,"author":{"gitId":"-"},"content":""},{"lineNumber":703,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":704,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":705,"author":{"gitId":"-"},"content":" RepoConfiguration.setFormatsToRepoConfigs(actualConfigs, cliArguments.getFormats());"},{"lineNumber":706,"author":{"gitId":"-"},"content":""},{"lineNumber":707,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, actualConfigs.size());"},{"lineNumber":708,"author":{"gitId":"-"},"content":" Assertions.assertEquals(FileTypeTest.NO_SPECIFIED_FORMATS, actualConfigs.get(0).getFileTypeManager()"},{"lineNumber":709,"author":{"gitId":"-"},"content":" .getFormats());"},{"lineNumber":710,"author":{"gitId":"-"},"content":" }"},{"lineNumber":711,"author":{"gitId":"-"},"content":""},{"lineNumber":712,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":713,"author":{"gitId":"-"},"content":" public void repoConfig_emptyLocationDifferentBranch_equal() throws Exception {"},{"lineNumber":714,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration emptyLocationEmptyBranchRepoConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":715,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(\"\"))"},{"lineNumber":716,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"\")"},{"lineNumber":717,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":718,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration emptyLocationDefaultBranchRepoConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":719,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(\"\")).build();"},{"lineNumber":720,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration emptyLocationWithBranchRepoConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":721,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(\"\"))"},{"lineNumber":722,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":723,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":724,"author":{"gitId":"-"},"content":""},{"lineNumber":725,"author":{"gitId":"-"},"content":" Assertions.assertEquals(emptyLocationDefaultBranchRepoConfig, emptyLocationEmptyBranchRepoConfig);"},{"lineNumber":726,"author":{"gitId":"-"},"content":" Assertions.assertEquals(emptyLocationWithBranchRepoConfig, emptyLocationEmptyBranchRepoConfig);"},{"lineNumber":727,"author":{"gitId":"-"},"content":" }"},{"lineNumber":728,"author":{"gitId":"-"},"content":""},{"lineNumber":729,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":730,"author":{"gitId":"-"},"content":" public void repoConfig_sameLocationDifferentBranch_notEqual() throws Exception {"},{"lineNumber":731,"author":{"gitId":"-"},"content":" RepoConfiguration validLocationValidBranchRepoConfig \u003d"},{"lineNumber":732,"author":{"gitId":"asdfghjkxd"},"content":" new RepoConfiguration.Builder()"},{"lineNumber":733,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":734,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":735,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":736,"author":{"gitId":"-"},"content":" RepoConfiguration validLocationDefaultBranchRepoConfig \u003d"},{"lineNumber":737,"author":{"gitId":"asdfghjkxd"},"content":" new RepoConfiguration.Builder().location(new RepoLocation(TEST_REPO_DELTA)).build();"},{"lineNumber":738,"author":{"gitId":"-"},"content":""},{"lineNumber":739,"author":{"gitId":"-"},"content":" Assertions.assertNotEquals(validLocationDefaultBranchRepoConfig, validLocationValidBranchRepoConfig);"},{"lineNumber":740,"author":{"gitId":"-"},"content":" }"},{"lineNumber":741,"author":{"gitId":"-"},"content":""},{"lineNumber":742,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":743,"author":{"gitId":"-"},"content":" public void repoConfig_overrideStandaloneConfig_success() throws Exception {"},{"lineNumber":744,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration expectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":745,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":746,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":747,"author":{"gitId":"asdfghjkxd"},"content":" .fileTypeManager(Collections.emptyList())"},{"lineNumber":748,"author":{"gitId":"asdfghjkxd"},"content":" .ignoreGlobList(Collections.emptyList())"},{"lineNumber":749,"author":{"gitId":"asdfghjkxd"},"content":" .fileSizeLimit(RepoConfiguration.DEFAULT_FILE_SIZE_LIMIT)"},{"lineNumber":750,"author":{"gitId":"asdfghjkxd"},"content":" .isStandaloneConfigIgnored(false)"},{"lineNumber":751,"author":{"gitId":"asdfghjkxd"},"content":" .isFileSizeLimitIgnored(false)"},{"lineNumber":752,"author":{"gitId":"asdfghjkxd"},"content":" .ignoreCommitList(Collections.emptyList())"},{"lineNumber":753,"author":{"gitId":"asdfghjkxd"},"content":" .isFormatsOverriding(true)"},{"lineNumber":754,"author":{"gitId":"asdfghjkxd"},"content":" .isIgnoreGlobListOverriding(true)"},{"lineNumber":755,"author":{"gitId":"asdfghjkxd"},"content":" .isIgnoreCommitListOverriding(true)"},{"lineNumber":756,"author":{"gitId":"asdfghjkxd"},"content":" .isFileSizeLimitOverriding(false)"},{"lineNumber":757,"author":{"gitId":"asdfghjkxd"},"content":" .isShallowCloningPerformed(false)"},{"lineNumber":758,"author":{"gitId":"asdfghjkxd"},"content":" .isFindingPreviousAuthorsPerformed(false)"},{"lineNumber":759,"author":{"gitId":"asdfghjkxd"},"content":" .isIgnoredFileAnalysisSkipped(false)"},{"lineNumber":760,"author":{"gitId":"asdfghjkxd"},"content":" .ignoredAuthorsList(Arrays.asList(\"lithiumlkid\"))"},{"lineNumber":761,"author":{"gitId":"asdfghjkxd"},"content":" .isIgnoredAuthorsListOverriding(true)"},{"lineNumber":762,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":763,"author":{"gitId":"-"},"content":""},{"lineNumber":764,"author":{"gitId":"-"},"content":" List\u003cAuthor\u003e expectedAuthorList \u003d new ArrayList\u003c\u003e();"},{"lineNumber":765,"author":{"gitId":"-"},"content":" Author[] authors \u003d new Author[]{FIRST_AUTHOR, SECOND_AUTHOR, THIRD_AUTHOR, FOURTH_AUTHOR};"},{"lineNumber":766,"author":{"gitId":"-"},"content":" for (Author author : authors) {"},{"lineNumber":767,"author":{"gitId":"-"},"content":" Author expectedAuthor \u003d new Author(author);"},{"lineNumber":768,"author":{"gitId":"-"},"content":" List\u003cString\u003e expectedAuthorIgnoreGlobList \u003d new ArrayList\u003c\u003e();"},{"lineNumber":769,"author":{"gitId":"-"},"content":" expectedAuthorIgnoreGlobList.addAll(author.getIgnoreGlobList());"},{"lineNumber":770,"author":{"gitId":"-"},"content":""},{"lineNumber":771,"author":{"gitId":"-"},"content":" // Authors\u0027 original ignoreGlobList contains values from StandaloneConfig repo level, thus need to remove"},{"lineNumber":772,"author":{"gitId":"-"},"content":" expectedAuthorIgnoreGlobList.removeAll(REPO_LEVEL_GLOB_LIST);"},{"lineNumber":773,"author":{"gitId":"-"},"content":" expectedAuthor.setIgnoreGlobList(expectedAuthorIgnoreGlobList);"},{"lineNumber":774,"author":{"gitId":"-"},"content":" expectedAuthorList.add(expectedAuthor);"},{"lineNumber":775,"author":{"gitId":"-"},"content":" }"},{"lineNumber":776,"author":{"gitId":"-"},"content":" expectedConfig.setAuthorList(expectedAuthorList);"},{"lineNumber":777,"author":{"gitId":"-"},"content":" expectedConfig.setAuthorDisplayNameMap(repoDeltaStandaloneConfig.getAuthorDisplayNameMap());"},{"lineNumber":778,"author":{"gitId":"-"},"content":" expectedConfig.setAuthorNamesToAuthorMap(repoDeltaStandaloneConfig.getAuthorNamesToAuthorMap());"},{"lineNumber":779,"author":{"gitId":"-"},"content":" expectedConfig.setAuthorEmailsToAuthorMap(repoDeltaStandaloneConfig.getAuthorEmailsToAuthorMap());"},{"lineNumber":780,"author":{"gitId":"-"},"content":""},{"lineNumber":781,"author":{"gitId":"-"},"content":" String formats \u003d String.join(\" \", CLI_FORMATS);"},{"lineNumber":782,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(OVERRIDE_STANDALONE_TEST_CONFIG_FILE)"},{"lineNumber":783,"author":{"gitId":"-"},"content":" .addFormats(formats)"},{"lineNumber":784,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":785,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":786,"author":{"gitId":"-"},"content":""},{"lineNumber":787,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":788,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":789,"author":{"gitId":"-"},"content":""},{"lineNumber":790,"author":{"gitId":"-"},"content":" RepoConfiguration actualConfig \u003d actualConfigs.get(0);"},{"lineNumber":791,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(actualConfig);"},{"lineNumber":792,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(actualConfig);"},{"lineNumber":793,"author":{"gitId":"-"},"content":""},{"lineNumber":794,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(expectedConfig, actualConfig);"},{"lineNumber":795,"author":{"gitId":"-"},"content":" }"},{"lineNumber":796,"author":{"gitId":"-"},"content":""},{"lineNumber":797,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":798,"author":{"gitId":"-"},"content":" public void repoConfig_minimalStandaloneConfig_fieldsAssignedDefaultValues() throws Exception {"},{"lineNumber":799,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration expectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":800,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_MINIMAL_STANDALONE_CONFIG))"},{"lineNumber":801,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":802,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":803,"author":{"gitId":"-"},"content":""},{"lineNumber":804,"author":{"gitId":"-"},"content":" Author firstAuthor \u003d new Author(\"bluein-green\");"},{"lineNumber":805,"author":{"gitId":"-"},"content":" Author secondAuthor \u003d new Author(\"jylee-git\");"},{"lineNumber":806,"author":{"gitId":"-"},"content":" List\u003cAuthor\u003e expectedAuthors \u003d Arrays.asList(firstAuthor, secondAuthor);"},{"lineNumber":807,"author":{"gitId":"-"},"content":" expectedConfig.setAuthorList(expectedAuthors);"},{"lineNumber":808,"author":{"gitId":"-"},"content":""},{"lineNumber":809,"author":{"gitId":"-"},"content":" expectedConfig.setIgnoreGlobList(Collections.emptyList());"},{"lineNumber":810,"author":{"gitId":"-"},"content":" expectedConfig.setFormats(Collections.emptyList());"},{"lineNumber":811,"author":{"gitId":"-"},"content":" expectedConfig.setIgnoreCommitList(Collections.emptyList());"},{"lineNumber":812,"author":{"gitId":"-"},"content":""},{"lineNumber":813,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration actualConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":814,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_MINIMAL_STANDALONE_CONFIG))"},{"lineNumber":815,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":816,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":817,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(actualConfig);"},{"lineNumber":818,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(actualConfig);"},{"lineNumber":819,"author":{"gitId":"-"},"content":""},{"lineNumber":820,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(expectedConfig, actualConfig);"},{"lineNumber":821,"author":{"gitId":"-"},"content":" }"},{"lineNumber":822,"author":{"gitId":"-"},"content":""},{"lineNumber":823,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":824,"author":{"gitId":"-"},"content":" public void repoConfig_removeIgnoredAuthors_success() throws Exception {"},{"lineNumber":825,"author":{"gitId":"-"},"content":" List\u003cAuthor\u003e expectedAuthors \u003d new ArrayList\u003c\u003e();"},{"lineNumber":826,"author":{"gitId":"-"},"content":" Author author \u003d new Author(FIRST_AUTHOR);"},{"lineNumber":827,"author":{"gitId":"-"},"content":" author.setIgnoreGlobList(REPO_LEVEL_GLOB_LIST);"},{"lineNumber":828,"author":{"gitId":"-"},"content":" expectedAuthors.add(author);"},{"lineNumber":829,"author":{"gitId":"-"},"content":""},{"lineNumber":830,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration expectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":831,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA))"},{"lineNumber":832,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":833,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":834,"author":{"gitId":"-"},"content":" expectedConfig.setAuthorList(expectedAuthors);"},{"lineNumber":835,"author":{"gitId":"-"},"content":" expectedConfig.addAuthorNamesToAuthorMapEntry(author, FIRST_AUTHOR_ALIASES);"},{"lineNumber":836,"author":{"gitId":"-"},"content":" expectedConfig.setAuthorDisplayName(author, \"Ahm\");"},{"lineNumber":837,"author":{"gitId":"-"},"content":""},{"lineNumber":838,"author":{"gitId":"-"},"content":" expectedConfig.setIgnoreGlobList(REPO_LEVEL_GLOB_LIST);"},{"lineNumber":839,"author":{"gitId":"-"},"content":" expectedConfig.setFormats(CONFIG_FORMATS);"},{"lineNumber":840,"author":{"gitId":"-"},"content":" expectedConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":841,"author":{"gitId":"-"},"content":" expectedConfig.setIgnoredAuthorsList(Arrays.asList(\"jordancjq\", \"Eugene Peh\"));"},{"lineNumber":842,"author":{"gitId":"-"},"content":""},{"lineNumber":843,"author":{"gitId":"-"},"content":" String formats \u003d String.join(\" \", CLI_FORMATS);"},{"lineNumber":844,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(IGNORE_AUTHORS_TEST_CONFIG_FILE)"},{"lineNumber":845,"author":{"gitId":"-"},"content":" .addFormats(formats)"},{"lineNumber":846,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":847,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":848,"author":{"gitId":"-"},"content":""},{"lineNumber":849,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":850,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":851,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e authorConfigs \u003d"},{"lineNumber":852,"author":{"gitId":"-"},"content":" new AuthorConfigCsvParser(cliArguments.getAuthorConfigFilePath()).parse();"},{"lineNumber":853,"author":{"gitId":"-"},"content":" RepoConfiguration.merge(actualConfigs, authorConfigs);"},{"lineNumber":854,"author":{"gitId":"-"},"content":""},{"lineNumber":855,"author":{"gitId":"-"},"content":" RepoConfiguration actualConfig \u003d actualConfigs.get(0);"},{"lineNumber":856,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(actualConfig);"},{"lineNumber":857,"author":{"gitId":"-"},"content":" reportGenerator.updateRepoConfig(actualConfig);"},{"lineNumber":858,"author":{"gitId":"-"},"content":" Method updateAuthorList \u003d ReportGenerator.class.getDeclaredMethod(\"updateAuthorList\", RepoConfiguration.class);"},{"lineNumber":859,"author":{"gitId":"-"},"content":" updateAuthorList.setAccessible(true);"},{"lineNumber":860,"author":{"gitId":"-"},"content":" updateAuthorList.invoke(reportGenerator, actualConfig);"},{"lineNumber":861,"author":{"gitId":"-"},"content":""},{"lineNumber":862,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(expectedConfig, actualConfig);"},{"lineNumber":863,"author":{"gitId":"-"},"content":" }"},{"lineNumber":864,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":865,"author":{"gitId":"asdfghjkxd"},"content":" @Test"},{"lineNumber":866,"author":{"gitId":"asdfghjkxd"},"content":" public void repoBuilder_displayName_success() throws Exception {"},{"lineNumber":867,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration actualConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":868,"author":{"gitId":"asdfghjkxd"},"content":" .displayName(\"CS3281\")"},{"lineNumber":869,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_MINIMAL_STANDALONE_CONFIG))"},{"lineNumber":870,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":871,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":872,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":873,"author":{"gitId":"asdfghjkxd"},"content":" Assertions.assertEquals(actualConfig.getDisplayName(), \"CS3281\");"},{"lineNumber":874,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":875,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":876,"author":{"gitId":"asdfghjkxd"},"content":" @Test"},{"lineNumber":877,"author":{"gitId":"asdfghjkxd"},"content":" public void repoBuilder_outputFolderName_success() throws Exception {"},{"lineNumber":878,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration actualConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":879,"author":{"gitId":"asdfghjkxd"},"content":" .outputFolderName(\"CS3281 Folder\")"},{"lineNumber":880,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_MINIMAL_STANDALONE_CONFIG))"},{"lineNumber":881,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":882,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":883,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":884,"author":{"gitId":"asdfghjkxd"},"content":" Assertions.assertEquals(actualConfig.getOutputFolderName(), \"CS3281 Folder\");"},{"lineNumber":885,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":886,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":887,"author":{"gitId":"asdfghjkxd"},"content":" @Test"},{"lineNumber":888,"author":{"gitId":"asdfghjkxd"},"content":" public void repoBuilder_repoFolderName_success() throws Exception {"},{"lineNumber":889,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration actualConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":890,"author":{"gitId":"asdfghjkxd"},"content":" .repoFolderName(\"CS3281 Folder\")"},{"lineNumber":891,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_MINIMAL_STANDALONE_CONFIG))"},{"lineNumber":892,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":893,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":894,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":895,"author":{"gitId":"asdfghjkxd"},"content":" Assertions.assertEquals(actualConfig.getRepoFolderName(), \"CS3281 Folder\");"},{"lineNumber":896,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":897,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":898,"author":{"gitId":"asdfghjkxd"},"content":" @Test"},{"lineNumber":899,"author":{"gitId":"asdfghjkxd"},"content":" public void repoBuilder_zoneID_success() throws Exception {"},{"lineNumber":900,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration actualConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":901,"author":{"gitId":"asdfghjkxd"},"content":" .zoneId(ZoneId.systemDefault())"},{"lineNumber":902,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_MINIMAL_STANDALONE_CONFIG))"},{"lineNumber":903,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":904,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":905,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":906,"author":{"gitId":"asdfghjkxd"},"content":" Assertions.assertEquals(actualConfig.getZoneId(), ZoneId.systemDefault());"},{"lineNumber":907,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":908,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":909,"author":{"gitId":"asdfghjkxd"},"content":" @Test"},{"lineNumber":910,"author":{"gitId":"asdfghjkxd"},"content":" public void repoBuilder_sinceDate_success() throws Exception {"},{"lineNumber":911,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration actualConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":912,"author":{"gitId":"asdfghjkxd"},"content":" .sinceDate(LocalDateTime.of(2024, 1, 1, 12, 0, 0))"},{"lineNumber":913,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_MINIMAL_STANDALONE_CONFIG))"},{"lineNumber":914,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":915,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":916,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":917,"author":{"gitId":"asdfghjkxd"},"content":" Assertions.assertEquals(actualConfig.getSinceDate(),"},{"lineNumber":918,"author":{"gitId":"asdfghjkxd"},"content":" LocalDateTime.of(2024, 1, 1, 12, 0, 0));"},{"lineNumber":919,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":920,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":921,"author":{"gitId":"asdfghjkxd"},"content":" @Test"},{"lineNumber":922,"author":{"gitId":"asdfghjkxd"},"content":" public void repoBuilder_untilDate_success() throws Exception {"},{"lineNumber":923,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration actualConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":924,"author":{"gitId":"asdfghjkxd"},"content":" .untilDate(LocalDateTime.of(2024, 1, 1, 12, 0, 0))"},{"lineNumber":925,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_MINIMAL_STANDALONE_CONFIG))"},{"lineNumber":926,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":927,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":928,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":929,"author":{"gitId":"asdfghjkxd"},"content":" Assertions.assertEquals(actualConfig.getUntilDate(),"},{"lineNumber":930,"author":{"gitId":"asdfghjkxd"},"content":" LocalDateTime.of(2024, 1, 1, 12, 0, 0));"},{"lineNumber":931,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":932,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":933,"author":{"gitId":"asdfghjkxd"},"content":" @Test"},{"lineNumber":934,"author":{"gitId":"asdfghjkxd"},"content":" public void repoBuilder_authorConfig_success() throws Exception {"},{"lineNumber":935,"author":{"gitId":"asdfghjkxd"},"content":" RepoLocation loc \u003d new RepoLocation(TEST_REPO_MINIMAL_STANDALONE_CONFIG);"},{"lineNumber":936,"author":{"gitId":"asdfghjkxd"},"content":" String branch \u003d \"master\";"},{"lineNumber":937,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":938,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration actualConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":939,"author":{"gitId":"asdfghjkxd"},"content":" .authorConfig(new AuthorConfiguration(loc, branch))"},{"lineNumber":940,"author":{"gitId":"asdfghjkxd"},"content":" .location(loc)"},{"lineNumber":941,"author":{"gitId":"asdfghjkxd"},"content":" .branch(branch)"},{"lineNumber":942,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":943,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":944,"author":{"gitId":"asdfghjkxd"},"content":" Assertions.assertEquals(actualConfig.getAuthorConfig(),"},{"lineNumber":945,"author":{"gitId":"asdfghjkxd"},"content":" new AuthorConfiguration(loc, branch));"},{"lineNumber":946,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":947,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":948,"author":{"gitId":"asdfghjkxd"},"content":" @Test"},{"lineNumber":949,"author":{"gitId":"asdfghjkxd"},"content":" public void repoBuilder_isLastModifiedDateIncluded_success() throws Exception {"},{"lineNumber":950,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration actualConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":951,"author":{"gitId":"asdfghjkxd"},"content":" .isLastModifiedDateIncluded(true)"},{"lineNumber":952,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_MINIMAL_STANDALONE_CONFIG))"},{"lineNumber":953,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":954,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":955,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":956,"author":{"gitId":"asdfghjkxd"},"content":" Assertions.assertTrue(actualConfig.isLastModifiedDateIncluded());"},{"lineNumber":957,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":958,"author":{"gitId":"asdfghjkxd"},"content":""},{"lineNumber":959,"author":{"gitId":"asdfghjkxd"},"content":" @Test"},{"lineNumber":960,"author":{"gitId":"asdfghjkxd"},"content":" public void repoBuilder_buildWithInvalid_failure() {"},{"lineNumber":961,"author":{"gitId":"asdfghjkxd"},"content":" Assertions.assertThrows(ConfigurationBuildException.class, () -\u003e new RepoConfiguration.Builder().build());"},{"lineNumber":962,"author":{"gitId":"asdfghjkxd"},"content":" }"},{"lineNumber":963,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":244,"-":719}},{"path":"src/test/java/reposense/model/RepoLocationTest.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.model;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static reposense.model.RepoLocation.UNSUPPORTED_DOMAIN_NAME;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static reposense.model.RepoLocation.getDomainNameFromDomain;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static reposense.model.RepoLocation.isLocalRepo;"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assertions;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assumptions;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;"},{"lineNumber":10,"author":{"gitId":"-"},"content":""},{"lineNumber":11,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidLocationException;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import reposense.util.AssertUtil;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import reposense.util.SystemUtil;"},{"lineNumber":14,"author":{"gitId":"-"},"content":""},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class RepoLocationTest {"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_VALID_WITHOUT_DOT_GIT_ONE \u003d \"repo\";"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_VALID_WITHOUT_DOT_GIT_TWO \u003d \"../path/to/repo\";"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_VALID_WITHOUT_DOT_GIT_THREE \u003d \"/path/to/repo\";"},{"lineNumber":20,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_VALID_WITH_DOT_GIT_ONE \u003d \"path/to/repo/.git\";"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_VALID_WITH_DOT_GIT_TWO \u003d \"file://path/to/repo.git\";"},{"lineNumber":22,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_FILE_URL_ONE \u003d \"file://path/to/repo\";"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_FILE_URL_TWO \u003d \"file:///path/to/repo\";"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_WINDOWS_VALID_WITHOUT_DOT_GIT_ONE \u003d \"path\\\\to\\\\repo\\\\\";"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_WINDOWS_VALID_WITHOUT_DOT_GIT_TWO \u003d \"..\\\\path\\\\to\\\\repo\";"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_WINDOWS_VALID_WITH_DOT_GIT_ONE \u003d \"path\\\\to\\\\repo\\\\.git\";"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_WINDOWS_DISK_DRIVE \u003d \"C:\\\\path\\\\to\\\\repo.git\";"},{"lineNumber":29,"author":{"gitId":"-"},"content":""},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_WINDOWS_VALID_MIXED_ONE \u003d \"..\\\\path/to\\\\repo\";"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_WINDOWS_VALID_MIXED_TWO \u003d \"file://path\\\\to\\\\repo.git\";"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final String LOCAL_REPO_WINDOWS_DISK_DRIVE_MIXED \u003d \"C:\\\\path/to/repo.git\";"},{"lineNumber":33,"author":{"gitId":"-"},"content":""},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final String EXPECTED_REPO_NAME \u003d \"repo\";"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private static final String EXPECTED_ORGANIZATION \u003d \"path-to\";"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private static final String EXPECTED_DOMAIN_NAME \u003d \"github\";"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private static final String EXPECTED_UNRECOGNISED_DOMAIN_NAME \u003d UNSUPPORTED_DOMAIN_NAME;"},{"lineNumber":38,"author":{"gitId":"-"},"content":""},{"lineNumber":39,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public void repoLocation_parseEmptyString_success() throws Exception {"},{"lineNumber":41,"author":{"gitId":"-"},"content":" RepoLocation repoLocation \u003d new RepoLocation(\"\");"},{"lineNumber":42,"author":{"gitId":"-"},"content":" }"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":45,"author":{"gitId":"-"},"content":" public void isLocalRepo_validLocalRepos_success() throws Exception {"},{"lineNumber":46,"author":{"gitId":"-"},"content":" Assertions.assertTrue(isLocalRepo(LOCAL_REPO_VALID_WITH_DOT_GIT_ONE));"},{"lineNumber":47,"author":{"gitId":"-"},"content":" Assertions.assertTrue(isLocalRepo(LOCAL_REPO_WINDOWS_VALID_MIXED_ONE));"},{"lineNumber":48,"author":{"gitId":"-"},"content":" Assertions.assertTrue(isLocalRepo(\"./abc:def\"));"},{"lineNumber":49,"author":{"gitId":"-"},"content":" }"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":52,"author":{"gitId":"-"},"content":" public void isLocalRepo_remoteRepos_returnsFalse() throws Exception {"},{"lineNumber":53,"author":{"gitId":"-"},"content":" Assertions.assertFalse(isLocalRepo(\"https://github.com/reposense/RepoSense.git/\"));"},{"lineNumber":54,"author":{"gitId":"-"},"content":" Assertions.assertFalse(isLocalRepo(\"git@github.com:reposense/RepoSense.git/\"));"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }"},{"lineNumber":56,"author":{"gitId":"-"},"content":""},{"lineNumber":57,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":58,"author":{"gitId":"-"},"content":" public void repoLocation_parseLocalRepoLocation_success() throws Exception {"},{"lineNumber":59,"author":{"gitId":"-"},"content":" // local paths not containing \".git\" should be valid"},{"lineNumber":60,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_VALID_WITHOUT_DOT_GIT_ONE,"},{"lineNumber":61,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, \"\", EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":62,"author":{"gitId":"-"},"content":" // relative pathing should be considered part of the \u0027organization\u0027 for differentiation"},{"lineNumber":63,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_VALID_WITHOUT_DOT_GIT_TWO,"},{"lineNumber":64,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, \"..-\" + EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":65,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_VALID_WITHOUT_DOT_GIT_THREE,"},{"lineNumber":66,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, \"-\" + EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":67,"author":{"gitId":"-"},"content":""},{"lineNumber":68,"author":{"gitId":"-"},"content":" // local paths containing \".git\" should also be valid"},{"lineNumber":69,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_VALID_WITH_DOT_GIT_ONE,"},{"lineNumber":70,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":71,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_VALID_WITH_DOT_GIT_TWO,"},{"lineNumber":72,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":73,"author":{"gitId":"-"},"content":""},{"lineNumber":74,"author":{"gitId":"-"},"content":" // file-type url protocol (file://) is accepted by git clone"},{"lineNumber":75,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_FILE_URL_ONE,"},{"lineNumber":76,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":77,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_FILE_URL_TWO,"},{"lineNumber":78,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, \"-\" + EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":79,"author":{"gitId":"-"},"content":" }"},{"lineNumber":80,"author":{"gitId":"-"},"content":""},{"lineNumber":81,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":82,"author":{"gitId":"-"},"content":" public void repoLocation_parseWindowsLocalRepoLocation_success() throws Exception {"},{"lineNumber":83,"author":{"gitId":"-"},"content":" Assumptions.assumeTrue(SystemUtil.isWindows());"},{"lineNumber":84,"author":{"gitId":"-"},"content":" // repeated tests but with windows file separators"},{"lineNumber":85,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_WINDOWS_VALID_WITHOUT_DOT_GIT_ONE,"},{"lineNumber":86,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":87,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_WINDOWS_VALID_WITHOUT_DOT_GIT_TWO,"},{"lineNumber":88,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, \"..-\" + EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":89,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_WINDOWS_VALID_WITH_DOT_GIT_ONE,"},{"lineNumber":90,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":91,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_WINDOWS_DISK_DRIVE,"},{"lineNumber":92,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, \"C--\" + EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":93,"author":{"gitId":"-"},"content":""},{"lineNumber":94,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_WINDOWS_VALID_MIXED_ONE,"},{"lineNumber":95,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, \"..-\" + EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":96,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_WINDOWS_VALID_MIXED_TWO,"},{"lineNumber":97,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":98,"author":{"gitId":"-"},"content":" assertParsableLocation(LOCAL_REPO_WINDOWS_DISK_DRIVE_MIXED,"},{"lineNumber":99,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, \"C--\" + EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":100,"author":{"gitId":"-"},"content":""},{"lineNumber":101,"author":{"gitId":"-"},"content":" }"},{"lineNumber":102,"author":{"gitId":"-"},"content":""},{"lineNumber":103,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":104,"author":{"gitId":"-"},"content":" public void repoLocation_parseValidRemoteRepoUrl_success() throws Exception {"},{"lineNumber":105,"author":{"gitId":"-"},"content":" // valid url without specifying branch"},{"lineNumber":106,"author":{"gitId":"-"},"content":" assertParsableLocation(\"https://github.com/reposense/testrepo-Beta.git\","},{"lineNumber":107,"author":{"gitId":"-"},"content":" \"testrepo-Beta\", \"reposense\", EXPECTED_DOMAIN_NAME);"},{"lineNumber":108,"author":{"gitId":"-"},"content":" assertParsableLocation(\"https://github.com/reposense/testrepo-Delta.git\","},{"lineNumber":109,"author":{"gitId":"-"},"content":" \"testrepo-Delta\", \"reposense\", EXPECTED_DOMAIN_NAME);"},{"lineNumber":110,"author":{"gitId":"-"},"content":" assertParsableLocation(\"https://gitlab.com/reposense/RepoSense.git\","},{"lineNumber":111,"author":{"gitId":"-"},"content":" \"RepoSense\", \"reposense\", \"gitlab\");"},{"lineNumber":112,"author":{"gitId":"-"},"content":" assertParsableLocation(\"https://github.com/reposense.git\","},{"lineNumber":113,"author":{"gitId":"-"},"content":" \"reposense\", \"\", EXPECTED_DOMAIN_NAME);"},{"lineNumber":114,"author":{"gitId":"-"},"content":" // valid url to parse for obtaining repo and organization, just not a valid git clone target"},{"lineNumber":115,"author":{"gitId":"-"},"content":" assertParsableLocation(\"https://github.com/reposense/.git\","},{"lineNumber":116,"author":{"gitId":"-"},"content":" \"reposense\", \"\", EXPECTED_DOMAIN_NAME);"},{"lineNumber":117,"author":{"gitId":"-"},"content":""},{"lineNumber":118,"author":{"gitId":"-"},"content":" // valid url from other domains"},{"lineNumber":119,"author":{"gitId":"-"},"content":" assertParsableLocation(\"https://bitbucket.org/reposense/RepoSense.git\","},{"lineNumber":120,"author":{"gitId":"-"},"content":" \"RepoSense\", \"reposense\", \"bitbucket\");"},{"lineNumber":121,"author":{"gitId":"-"},"content":" // valid url from unsupported domain with longer path to git directory than the standard organization/reponame"},{"lineNumber":122,"author":{"gitId":"-"},"content":" assertParsableLocation(\"https://opensource.ncsa.illinois.edu/bitbucket/scm/u3d/3dutilities.git\","},{"lineNumber":123,"author":{"gitId":"-"},"content":" \"3dutilities\", \"bitbucket-scm-u3d\", EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":124,"author":{"gitId":"-"},"content":""},{"lineNumber":125,"author":{"gitId":"-"},"content":" // treated as valid but will be caught when git clone fails"},{"lineNumber":126,"author":{"gitId":"-"},"content":" assertParsableLocation(\"https://github.com/reposense/testrepo-Beta/tree/add-config-json\","},{"lineNumber":127,"author":{"gitId":"-"},"content":" \"add-config-json\", \"reposense-testrepo-Beta-tree\", EXPECTED_DOMAIN_NAME);"},{"lineNumber":128,"author":{"gitId":"-"},"content":" assertParsableLocation(\"https://github.com/reposense/testrepo-Beta.git/tree/add-config-json\","},{"lineNumber":129,"author":{"gitId":"-"},"content":" \"add-config-json\", \"reposense-testrepo-Beta.git-tree\", EXPECTED_DOMAIN_NAME);"},{"lineNumber":130,"author":{"gitId":"-"},"content":""},{"lineNumber":131,"author":{"gitId":"-"},"content":" // URLs without \".git\" should be accepted as git clone works even without it"},{"lineNumber":132,"author":{"gitId":"-"},"content":" assertParsableLocation(\"https://github.com/reposense\","},{"lineNumber":133,"author":{"gitId":"-"},"content":" \"reposense\", \"\", EXPECTED_DOMAIN_NAME);"},{"lineNumber":134,"author":{"gitId":"-"},"content":" assertParsableLocation(\"https://github.com/reposense/RepoSense\","},{"lineNumber":135,"author":{"gitId":"-"},"content":" \"RepoSense\", \"reposense\", EXPECTED_DOMAIN_NAME);"},{"lineNumber":136,"author":{"gitId":"-"},"content":""},{"lineNumber":137,"author":{"gitId":"-"},"content":" // Test against other types of URL protocols that are valid for git clone"},{"lineNumber":138,"author":{"gitId":"-"},"content":" assertParsableLocation(\"ssh://git@github.com/path/to/repo.git/\","},{"lineNumber":139,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, EXPECTED_ORGANIZATION, EXPECTED_DOMAIN_NAME);"},{"lineNumber":140,"author":{"gitId":"-"},"content":" assertParsableLocation(\"git://github.com/path/to/repo.git\","},{"lineNumber":141,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, EXPECTED_ORGANIZATION, EXPECTED_DOMAIN_NAME);"},{"lineNumber":142,"author":{"gitId":"-"},"content":" assertParsableLocation(\"https://host.xz:9000/path/to/repo.git\","},{"lineNumber":143,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":144,"author":{"gitId":"-"},"content":""},{"lineNumber":145,"author":{"gitId":"-"},"content":" // Test against the conventional ssh protocol used for GitHub, e.g. git@github.com:reposense/RepoSense.git"},{"lineNumber":146,"author":{"gitId":"-"},"content":" assertParsableLocation(\"repo@organization.com:path/to/repo.git/\","},{"lineNumber":147,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":148,"author":{"gitId":"-"},"content":" assertParsableLocation(\"git@github.com:reposense/RepoSense.git\","},{"lineNumber":149,"author":{"gitId":"-"},"content":" \"RepoSense\", \"reposense\", EXPECTED_DOMAIN_NAME);"},{"lineNumber":150,"author":{"gitId":"-"},"content":" }"},{"lineNumber":151,"author":{"gitId":"-"},"content":""},{"lineNumber":152,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":153,"author":{"gitId":"-"},"content":" public void repoLocation_parseNormalizableRepoLocations_success() throws Exception {"},{"lineNumber":154,"author":{"gitId":"-"},"content":" assertParsableLocation(\"https://github.com/reposense/redundant/directories/../../RepoSense.git\","},{"lineNumber":155,"author":{"gitId":"-"},"content":" \"RepoSense\", \"reposense\", EXPECTED_DOMAIN_NAME);"},{"lineNumber":156,"author":{"gitId":"-"},"content":" assertParsableLocation(\"/path/with/redundant/directories/../.././../to/repo\","},{"lineNumber":157,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, \"-\" + EXPECTED_ORGANIZATION, EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":158,"author":{"gitId":"-"},"content":""},{"lineNumber":159,"author":{"gitId":"-"},"content":" // Tests if there is an additional \u0027../\u0027 it is not consumed by accident"},{"lineNumber":160,"author":{"gitId":"-"},"content":" assertParsableLocation(\"path/with/redundant/directories/../../../../../to/repo\","},{"lineNumber":161,"author":{"gitId":"-"},"content":" EXPECTED_REPO_NAME, \"..-to\", EXPECTED_UNRECOGNISED_DOMAIN_NAME);"},{"lineNumber":162,"author":{"gitId":"-"},"content":" }"},{"lineNumber":163,"author":{"gitId":"-"},"content":""},{"lineNumber":164,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":165,"author":{"gitId":"-"},"content":" public void repoLocation_parseInvalidRemoteRepo_throwsInvalidLocationException() throws Exception {"},{"lineNumber":166,"author":{"gitId":"-"},"content":" // Invalid URL protocol"},{"lineNumber":167,"author":{"gitId":"-"},"content":" assertUnparsableLocation(\"ttp://github.com/reposense.RepoSense.git\");"},{"lineNumber":168,"author":{"gitId":"-"},"content":" assertUnparsableLocation(\"not-valid-protocol://abc.com/reposense/RepoSense.git\");"},{"lineNumber":169,"author":{"gitId":"-"},"content":" // URL contains illegal characters"},{"lineNumber":170,"author":{"gitId":"-"},"content":" assertUnparsableLocation(\"https://github.com/contains-illegal-chars/^\\\\/\");"},{"lineNumber":171,"author":{"gitId":"-"},"content":" }"},{"lineNumber":172,"author":{"gitId":"-"},"content":""},{"lineNumber":173,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":174,"author":{"gitId":"-"},"content":" public void getDomainNameFromMatcher_parseValidDomain_success() throws Exception {"},{"lineNumber":175,"author":{"gitId":"-"},"content":" Assertions.assertEquals(\"github\", getDomainNameFromDomain(\"www.github.com\"));"},{"lineNumber":176,"author":{"gitId":"-"},"content":" Assertions.assertEquals(\"github\", getDomainNameFromDomain(\"github.com\"));"},{"lineNumber":177,"author":{"gitId":"-"},"content":" Assertions.assertEquals(\"gitlab\", getDomainNameFromDomain(\"www.gitlab.org\"));"},{"lineNumber":178,"author":{"gitId":"-"},"content":" Assertions.assertEquals(\"bitbucket\", getDomainNameFromDomain(\"ww2.bitbucket.com\"));"},{"lineNumber":179,"author":{"gitId":"-"},"content":""},{"lineNumber":180,"author":{"gitId":"-"},"content":" // valid but unsupported"},{"lineNumber":181,"author":{"gitId":"-"},"content":" Assertions.assertEquals(UNSUPPORTED_DOMAIN_NAME, getDomainNameFromDomain(\"opensource.ncsa.illinois.edu\"));"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }"},{"lineNumber":183,"author":{"gitId":"-"},"content":""},{"lineNumber":184,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":185,"author":{"gitId":"-"},"content":" public void getDomainNameFromMatcher_parseInvalidDomain_throwsInvalidLocationException() throws Exception {"},{"lineNumber":186,"author":{"gitId":"-"},"content":" // no top level domain specified"},{"lineNumber":187,"author":{"gitId":"-"},"content":" AssertUtil.assertThrows(InvalidLocationException.class, () -\u003e getDomainNameFromDomain(\"www.github\"));"},{"lineNumber":188,"author":{"gitId":"-"},"content":" AssertUtil.assertThrows(InvalidLocationException.class, () -\u003e getDomainNameFromDomain(\"github\"));"},{"lineNumber":189,"author":{"gitId":"-"},"content":" // has a dot but still no top level domain specified"},{"lineNumber":190,"author":{"gitId":"-"},"content":" AssertUtil.assertThrows(InvalidLocationException.class, () -\u003e getDomainNameFromDomain(\"github.\"));"},{"lineNumber":191,"author":{"gitId":"-"},"content":" }"},{"lineNumber":192,"author":{"gitId":"-"},"content":""},{"lineNumber":193,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":194,"author":{"gitId":"-"},"content":" * Compares the information of {@code rawLocation} parsed by the RepoLocation model with {@code expectedRepoName}"},{"lineNumber":195,"author":{"gitId":"-"},"content":" * and {@code expectedOrganization}."},{"lineNumber":196,"author":{"gitId":"-"},"content":" */"},{"lineNumber":197,"author":{"gitId":"-"},"content":" public void assertParsableLocation(String rawLocation, String expectedRepoName,"},{"lineNumber":198,"author":{"gitId":"-"},"content":" String expectedOrganization, String expectedDomainName) throws Exception {"},{"lineNumber":199,"author":{"gitId":"-"},"content":" RepoLocation repoLocation \u003d new RepoLocation(rawLocation);"},{"lineNumber":200,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedRepoName, repoLocation.getRepoName());"},{"lineNumber":201,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedOrganization, repoLocation.getOrganization());"},{"lineNumber":202,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedDomainName, repoLocation.getDomainName());"},{"lineNumber":203,"author":{"gitId":"-"},"content":" }"},{"lineNumber":204,"author":{"gitId":"-"},"content":""},{"lineNumber":205,"author":{"gitId":"-"},"content":" private void assertUnparsableLocation(String rawLocation) {"},{"lineNumber":206,"author":{"gitId":"-"},"content":" AssertUtil.assertThrows(InvalidLocationException.class, () -\u003e new RepoLocation(rawLocation));"},{"lineNumber":207,"author":{"gitId":"-"},"content":" }"},{"lineNumber":208,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":207}},{"path":"src/test/java/reposense/parser/ArgsParserTest.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.parser;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.apache.tools.ant.types.Commandline.translateCommandline;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static reposense.util.TestUtil.loadResource;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.io.File;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.io.IOException;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.nio.file.Files;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.time.LocalDateTime;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.time.Month;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import java.time.ZoneId;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import java.time.format.DateTimeFormatter;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import java.util.Arrays;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.AfterEach;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assertions;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":"import net.sourceforge.argparse4j.helper.HelpScreenException;"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import reposense.model.CliArguments;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import reposense.model.FileType;"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import reposense.model.FileTypeTest;"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import reposense.model.RepoConfiguration;"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import reposense.model.RunConfigurationDecider;"},{"lineNumber":29,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.ParseException;"},{"lineNumber":30,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.types.SinceDateArgumentType;"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import reposense.util.FileUtil;"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import reposense.util.InputBuilder;"},{"lineNumber":33,"author":{"gitId":"-"},"content":"import reposense.util.TestUtil;"},{"lineNumber":34,"author":{"gitId":"-"},"content":"import reposense.util.TimeUtil;"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":"public class ArgsParserTest {"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":" private static final Path PROJECT_DIRECTORY \u003d Paths.get(System.getProperty(\"user.dir\"));"},{"lineNumber":39,"author":{"gitId":"-"},"content":" private static final Path CONFIG_DIRECTORY \u003d Paths.get(System.getProperty(\"user.dir\")"},{"lineNumber":40,"author":{"gitId":"-"},"content":" + File.separator + \"config\" + File.separator);"},{"lineNumber":41,"author":{"gitId":"-"},"content":" private static final Path CONFIG_FOLDER_ABSOLUTE \u003d loadResource(ArgsParserTest.class, \"cli_location_test\");"},{"lineNumber":42,"author":{"gitId":"-"},"content":" private static final Path OUTPUT_DIRECTORY_ABSOLUTE \u003d loadResource(ArgsParserTest.class, \"output\");"},{"lineNumber":43,"author":{"gitId":"-"},"content":" private static final Path CONFIG_FOLDER_RELATIVE \u003d PROJECT_DIRECTORY.relativize(CONFIG_FOLDER_ABSOLUTE);"},{"lineNumber":44,"author":{"gitId":"-"},"content":" private static final Path OUTPUT_DIRECTORY_RELATIVE \u003d PROJECT_DIRECTORY.relativize(OUTPUT_DIRECTORY_ABSOLUTE);"},{"lineNumber":45,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_CSV_FILE \u003d"},{"lineNumber":46,"author":{"gitId":"-"},"content":" CONFIG_FOLDER_ABSOLUTE.resolve(RepoConfigCsvParser.REPO_CONFIG_FILENAME);"},{"lineNumber":47,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_CSV_FILE \u003d"},{"lineNumber":48,"author":{"gitId":"-"},"content":" CONFIG_FOLDER_ABSOLUTE.resolve(AuthorConfigCsvParser.AUTHOR_CONFIG_FILENAME);"},{"lineNumber":49,"author":{"gitId":"-"},"content":" private static final String NONEXISTENT_DIRECTORY \u003d \"some_non_existent_dir/\";"},{"lineNumber":50,"author":{"gitId":"-"},"content":""},{"lineNumber":51,"author":{"gitId":"-"},"content":" private static final InputBuilder DEFAULT_INPUT_BUILDER \u003d new InputBuilder();"},{"lineNumber":52,"author":{"gitId":"-"},"content":""},{"lineNumber":53,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_REPOSENSE \u003d \"https://github.com/reposense/RepoSense.git\";"},{"lineNumber":54,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_BETA \u003d \"https://github.com/reposense/testrepo-Beta.git\";"},{"lineNumber":55,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_CHARLIE \u003d \"https://github.com/reposense/testrepo-Charlie.git\";"},{"lineNumber":56,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_DELTA \u003d \"https://github.com/reposense/testrepo-Delta.git\";"},{"lineNumber":57,"author":{"gitId":"-"},"content":""},{"lineNumber":58,"author":{"gitId":"-"},"content":" private static final String DEFAULT_TIME_ZONE_STRING \u003d \"Asia/Singapore\";"},{"lineNumber":59,"author":{"gitId":"-"},"content":" private static final ZoneId DEFAULT_TIME_ZONE_ID \u003d TestUtil.getZoneId(DEFAULT_TIME_ZONE_STRING);"},{"lineNumber":60,"author":{"gitId":"-"},"content":""},{"lineNumber":61,"author":{"gitId":"-"},"content":" @BeforeEach"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public void before() {"},{"lineNumber":63,"author":{"gitId":"-"},"content":" DEFAULT_INPUT_BUILDER.reset().addConfig(CONFIG_FOLDER_ABSOLUTE);"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }"},{"lineNumber":65,"author":{"gitId":"-"},"content":""},{"lineNumber":66,"author":{"gitId":"-"},"content":" @AfterEach"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public void after() {"},{"lineNumber":68,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":69,"author":{"gitId":"-"},"content":" FileUtil.deleteDirectory(PROJECT_DIRECTORY.resolve(NONEXISTENT_DIRECTORY).toString());"},{"lineNumber":70,"author":{"gitId":"-"},"content":" } catch (IOException e) {"},{"lineNumber":71,"author":{"gitId":"-"},"content":" System.err.println(e.getMessage());"},{"lineNumber":72,"author":{"gitId":"-"},"content":" }"},{"lineNumber":73,"author":{"gitId":"-"},"content":" }"},{"lineNumber":74,"author":{"gitId":"-"},"content":""},{"lineNumber":75,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public void parse_d1CorrectTimeZone_success() throws Exception {"},{"lineNumber":77,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(CONFIG_FOLDER_ABSOLUTE)"},{"lineNumber":78,"author":{"gitId":"-"},"content":" .addSinceDate(SinceDateArgumentType.FIRST_COMMIT_DATE_SHORTHAND)"},{"lineNumber":79,"author":{"gitId":"-"},"content":" .addUntilDate(\"30/11/2017\")"},{"lineNumber":80,"author":{"gitId":"-"},"content":" .addTimezone(DEFAULT_TIME_ZONE_STRING)"},{"lineNumber":81,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":82,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":83,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":84,"author":{"gitId":"-"},"content":" REPO_CONFIG_CSV_FILE, cliArguments.getRepoConfigFilePath()));"},{"lineNumber":85,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":86,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_CSV_FILE, cliArguments.getAuthorConfigFilePath()));"},{"lineNumber":87,"author":{"gitId":"-"},"content":""},{"lineNumber":88,"author":{"gitId":"-"},"content":" LocalDateTime expectedSinceDate \u003d TimeUtil.getArbitraryFirstCommitDateConverted(DEFAULT_TIME_ZONE_ID);"},{"lineNumber":89,"author":{"gitId":"-"},"content":" LocalDateTime expectedUntilDate \u003d TestUtil.getUntilDate(2017, Month.NOVEMBER.getValue(), 30);"},{"lineNumber":90,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedSinceDate, cliArguments.getSinceDate());"},{"lineNumber":91,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedUntilDate, cliArguments.getUntilDate());"},{"lineNumber":92,"author":{"gitId":"-"},"content":""},{"lineNumber":93,"author":{"gitId":"-"},"content":" Assertions.assertEquals(DEFAULT_TIME_ZONE_ID, cliArguments.getZoneId());"},{"lineNumber":94,"author":{"gitId":"-"},"content":" }"},{"lineNumber":95,"author":{"gitId":"-"},"content":""},{"lineNumber":96,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":97,"author":{"gitId":"-"},"content":" public void parse_allCorrectInputs_success() throws Exception {"},{"lineNumber":98,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(CONFIG_FOLDER_ABSOLUTE)"},{"lineNumber":99,"author":{"gitId":"-"},"content":" .addOutput(OUTPUT_DIRECTORY_ABSOLUTE)"},{"lineNumber":100,"author":{"gitId":"-"},"content":" .addSinceDate(\"01/07/2017\")"},{"lineNumber":101,"author":{"gitId":"-"},"content":" .addUntilDate(\"30/11/2017\")"},{"lineNumber":102,"author":{"gitId":"-"},"content":" .addFormats(\"java adoc html css js\")"},{"lineNumber":103,"author":{"gitId":"-"},"content":" .addIgnoreStandaloneConfig()"},{"lineNumber":104,"author":{"gitId":"-"},"content":" .addIgnoreFilesizeLimit()"},{"lineNumber":105,"author":{"gitId":"-"},"content":" .addView()"},{"lineNumber":106,"author":{"gitId":"-"},"content":" .addTimezone(DEFAULT_TIME_ZONE_STRING)"},{"lineNumber":107,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":108,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":109,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":110,"author":{"gitId":"-"},"content":" REPO_CONFIG_CSV_FILE, cliArguments.getRepoConfigFilePath()));"},{"lineNumber":111,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":112,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_CSV_FILE, cliArguments.getAuthorConfigFilePath()));"},{"lineNumber":113,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":114,"author":{"gitId":"-"},"content":" OUTPUT_DIRECTORY_ABSOLUTE.resolve(ArgsParser.DEFAULT_REPORT_NAME), cliArguments.getOutputFilePath()));"},{"lineNumber":115,"author":{"gitId":"-"},"content":""},{"lineNumber":116,"author":{"gitId":"-"},"content":" LocalDateTime expectedSinceDate \u003d TestUtil.getSinceDate(2017, Month.JULY.getValue(), 1);"},{"lineNumber":117,"author":{"gitId":"-"},"content":" LocalDateTime expectedUntilDate \u003d TestUtil.getUntilDate(2017, Month.NOVEMBER.getValue(), 30);"},{"lineNumber":118,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedSinceDate, cliArguments.getSinceDate());"},{"lineNumber":119,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedUntilDate, cliArguments.getUntilDate());"},{"lineNumber":120,"author":{"gitId":"-"},"content":""},{"lineNumber":121,"author":{"gitId":"-"},"content":" List\u003cFileType\u003e expectedFormats \u003d FileType.convertFormatStringsToFileTypes("},{"lineNumber":122,"author":{"gitId":"-"},"content":" Arrays.asList(\"java\", \"adoc\", \"html\", \"css\", \"js\"));"},{"lineNumber":123,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedFormats, cliArguments.getFormats());"},{"lineNumber":124,"author":{"gitId":"-"},"content":""},{"lineNumber":125,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.isAutomaticallyLaunching());"},{"lineNumber":126,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.isFileSizeLimitIgnored());"},{"lineNumber":127,"author":{"gitId":"-"},"content":""},{"lineNumber":128,"author":{"gitId":"-"},"content":" Assertions.assertEquals(DEFAULT_TIME_ZONE_ID, cliArguments.getZoneId());"},{"lineNumber":129,"author":{"gitId":"-"},"content":" }"},{"lineNumber":130,"author":{"gitId":"-"},"content":""},{"lineNumber":131,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":132,"author":{"gitId":"-"},"content":" public void parse_help_throwsHelpScreenException() {"},{"lineNumber":133,"author":{"gitId":"-"},"content":" String input \u003d \"--help\";"},{"lineNumber":134,"author":{"gitId":"-"},"content":" Assertions.assertThrows(HelpScreenException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":135,"author":{"gitId":"-"},"content":" }"},{"lineNumber":136,"author":{"gitId":"-"},"content":""},{"lineNumber":137,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":138,"author":{"gitId":"-"},"content":" public void parse_allCorrectInputsAlias_success() throws Exception {"},{"lineNumber":139,"author":{"gitId":"-"},"content":" String input \u003d String.format("},{"lineNumber":140,"author":{"gitId":"-"},"content":" \"-c \\\"%s\\\" -o \\\"%s\\\" -s 01/07/2017 -u 30/11/2017 -f java adoc html css js -i -I -v -t %s\","},{"lineNumber":141,"author":{"gitId":"-"},"content":" CONFIG_FOLDER_ABSOLUTE, OUTPUT_DIRECTORY_ABSOLUTE, DEFAULT_TIME_ZONE_STRING);"},{"lineNumber":142,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":143,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":144,"author":{"gitId":"-"},"content":" REPO_CONFIG_CSV_FILE, cliArguments.getRepoConfigFilePath()));"},{"lineNumber":145,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":146,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_CSV_FILE, cliArguments.getAuthorConfigFilePath()));"},{"lineNumber":147,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":148,"author":{"gitId":"-"},"content":" OUTPUT_DIRECTORY_ABSOLUTE.resolve(ArgsParser.DEFAULT_REPORT_NAME), cliArguments.getOutputFilePath()));"},{"lineNumber":149,"author":{"gitId":"-"},"content":""},{"lineNumber":150,"author":{"gitId":"-"},"content":" LocalDateTime expectedSinceDate \u003d TestUtil.getSinceDate(2017, Month.JULY.getValue(), 1);"},{"lineNumber":151,"author":{"gitId":"-"},"content":" LocalDateTime expectedUntilDate \u003d TestUtil.getUntilDate(2017, Month.NOVEMBER.getValue(), 30);"},{"lineNumber":152,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedSinceDate, cliArguments.getSinceDate());"},{"lineNumber":153,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedUntilDate, cliArguments.getUntilDate());"},{"lineNumber":154,"author":{"gitId":"-"},"content":""},{"lineNumber":155,"author":{"gitId":"-"},"content":" List\u003cFileType\u003e expectedFormats \u003d FileType.convertFormatStringsToFileTypes("},{"lineNumber":156,"author":{"gitId":"-"},"content":" Arrays.asList(\"java\", \"adoc\", \"html\", \"css\", \"js\"));"},{"lineNumber":157,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedFormats, cliArguments.getFormats());"},{"lineNumber":158,"author":{"gitId":"-"},"content":""},{"lineNumber":159,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.isAutomaticallyLaunching());"},{"lineNumber":160,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.isFileSizeLimitIgnored());"},{"lineNumber":161,"author":{"gitId":"-"},"content":""},{"lineNumber":162,"author":{"gitId":"-"},"content":" Assertions.assertEquals(DEFAULT_TIME_ZONE_ID, cliArguments.getZoneId());"},{"lineNumber":163,"author":{"gitId":"-"},"content":" }"},{"lineNumber":164,"author":{"gitId":"-"},"content":""},{"lineNumber":165,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":166,"author":{"gitId":"-"},"content":" public void parse_withExtraWhitespaces_success() throws Exception {"},{"lineNumber":167,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(CONFIG_FOLDER_ABSOLUTE).addWhiteSpace(5)"},{"lineNumber":168,"author":{"gitId":"-"},"content":" .addOutput(OUTPUT_DIRECTORY_ABSOLUTE).addWhiteSpace(4)"},{"lineNumber":169,"author":{"gitId":"-"},"content":" .addSinceDate(\"01/07/2017\").addWhiteSpace(3)"},{"lineNumber":170,"author":{"gitId":"-"},"content":" .addUntilDate(\"30/11/2017\").addWhiteSpace(6)"},{"lineNumber":171,"author":{"gitId":"-"},"content":" .addFormats(\"java adoc html css js \")"},{"lineNumber":172,"author":{"gitId":"-"},"content":" .addIgnoreStandaloneConfig().addWhiteSpace(1)"},{"lineNumber":173,"author":{"gitId":"-"},"content":" .addIgnoreFilesizeLimit().addWhiteSpace(2)"},{"lineNumber":174,"author":{"gitId":"-"},"content":" .addView().addWhiteSpace(4)"},{"lineNumber":175,"author":{"gitId":"-"},"content":" .addTimezone(DEFAULT_TIME_ZONE_STRING).addWhiteSpace(5)"},{"lineNumber":176,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":177,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":178,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":179,"author":{"gitId":"-"},"content":" REPO_CONFIG_CSV_FILE, cliArguments.getRepoConfigFilePath()));"},{"lineNumber":180,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":181,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_CSV_FILE, cliArguments.getAuthorConfigFilePath()));"},{"lineNumber":182,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":183,"author":{"gitId":"-"},"content":" OUTPUT_DIRECTORY_ABSOLUTE.resolve(ArgsParser.DEFAULT_REPORT_NAME), cliArguments.getOutputFilePath()));"},{"lineNumber":184,"author":{"gitId":"-"},"content":""},{"lineNumber":185,"author":{"gitId":"-"},"content":" LocalDateTime expectedSinceDate \u003d TestUtil.getSinceDate(2017, Month.JULY.getValue(), 1);"},{"lineNumber":186,"author":{"gitId":"-"},"content":" LocalDateTime expectedUntilDate \u003d TestUtil.getUntilDate(2017, Month.NOVEMBER.getValue(), 30);"},{"lineNumber":187,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedSinceDate, cliArguments.getSinceDate());"},{"lineNumber":188,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedUntilDate, cliArguments.getUntilDate());"},{"lineNumber":189,"author":{"gitId":"-"},"content":""},{"lineNumber":190,"author":{"gitId":"-"},"content":" List\u003cFileType\u003e expectedFormats \u003d FileType.convertFormatStringsToFileTypes(Arrays.asList("},{"lineNumber":191,"author":{"gitId":"-"},"content":" \"java\", \"adoc\", \"html\", \"css\", \"js\"));"},{"lineNumber":192,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedFormats, cliArguments.getFormats());"},{"lineNumber":193,"author":{"gitId":"-"},"content":""},{"lineNumber":194,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.isAutomaticallyLaunching());"},{"lineNumber":195,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.isFileSizeLimitIgnored());"},{"lineNumber":196,"author":{"gitId":"-"},"content":""},{"lineNumber":197,"author":{"gitId":"-"},"content":" Assertions.assertEquals(DEFAULT_TIME_ZONE_ID, cliArguments.getZoneId());"},{"lineNumber":198,"author":{"gitId":"-"},"content":" }"},{"lineNumber":199,"author":{"gitId":"-"},"content":""},{"lineNumber":200,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":201,"author":{"gitId":"-"},"content":" public void parse_configFolderOnly_success() throws Exception {"},{"lineNumber":202,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(CONFIG_FOLDER_ABSOLUTE).build();"},{"lineNumber":203,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":204,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":205,"author":{"gitId":"-"},"content":" REPO_CONFIG_CSV_FILE, cliArguments.getRepoConfigFilePath()));"},{"lineNumber":206,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":207,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_CSV_FILE, cliArguments.getAuthorConfigFilePath()));"},{"lineNumber":208,"author":{"gitId":"-"},"content":" // Optional arguments have default values"},{"lineNumber":209,"author":{"gitId":"-"},"content":" assertDateDiffOneMonth(cliArguments.getSinceDate(), cliArguments.getUntilDate());"},{"lineNumber":210,"author":{"gitId":"-"},"content":" assertDateDiffEndOfDay(cliArguments.getUntilDate());"},{"lineNumber":211,"author":{"gitId":"-"},"content":" Assertions.assertEquals(ArgsParser.DEFAULT_REPORT_NAME,"},{"lineNumber":212,"author":{"gitId":"-"},"content":" cliArguments.getOutputFilePath().getFileName().toString());"},{"lineNumber":213,"author":{"gitId":"-"},"content":" Assertions.assertEquals(FileTypeTest.NO_SPECIFIED_FORMATS, cliArguments.getFormats());"},{"lineNumber":214,"author":{"gitId":"-"},"content":" Assertions.assertFalse(cliArguments.isAutomaticallyLaunching());"},{"lineNumber":215,"author":{"gitId":"-"},"content":""},{"lineNumber":216,"author":{"gitId":"-"},"content":" input \u003d new InputBuilder().addConfig(CONFIG_FOLDER_RELATIVE).build();"},{"lineNumber":217,"author":{"gitId":"-"},"content":" cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":218,"author":{"gitId":"-"},"content":""},{"lineNumber":219,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":220,"author":{"gitId":"-"},"content":" REPO_CONFIG_CSV_FILE, cliArguments.getRepoConfigFilePath()));"},{"lineNumber":221,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":222,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_CSV_FILE, cliArguments.getAuthorConfigFilePath()));"},{"lineNumber":223,"author":{"gitId":"-"},"content":" // Optional arguments have default values"},{"lineNumber":224,"author":{"gitId":"-"},"content":" assertDateDiffOneMonth(cliArguments.getSinceDate(), cliArguments.getUntilDate());"},{"lineNumber":225,"author":{"gitId":"-"},"content":" assertDateDiffEndOfDay(cliArguments.getUntilDate());"},{"lineNumber":226,"author":{"gitId":"-"},"content":" Assertions.assertEquals(ArgsParser.DEFAULT_REPORT_NAME,"},{"lineNumber":227,"author":{"gitId":"-"},"content":" cliArguments.getOutputFilePath().getFileName().toString());"},{"lineNumber":228,"author":{"gitId":"-"},"content":" Assertions.assertEquals(FileTypeTest.NO_SPECIFIED_FORMATS, cliArguments.getFormats());"},{"lineNumber":229,"author":{"gitId":"-"},"content":" Assertions.assertFalse(cliArguments.isAutomaticallyLaunching());"},{"lineNumber":230,"author":{"gitId":"-"},"content":" Assertions.assertEquals(ZoneId.systemDefault(), cliArguments.getZoneId());"},{"lineNumber":231,"author":{"gitId":"-"},"content":" }"},{"lineNumber":232,"author":{"gitId":"-"},"content":""},{"lineNumber":233,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":234,"author":{"gitId":"-"},"content":" public void parse_viewOnly_success() throws Exception {"},{"lineNumber":235,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addView(OUTPUT_DIRECTORY_ABSOLUTE).build();"},{"lineNumber":236,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":237,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":238,"author":{"gitId":"-"},"content":" OUTPUT_DIRECTORY_ABSOLUTE, cliArguments.getReportDirectoryPath()));"},{"lineNumber":239,"author":{"gitId":"-"},"content":" }"},{"lineNumber":240,"author":{"gitId":"-"},"content":""},{"lineNumber":241,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":242,"author":{"gitId":"-"},"content":" public void parse_withIgnore_success() throws Exception {"},{"lineNumber":243,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addRepos(TEST_REPO_REPOSENSE, TEST_REPO_DELTA)"},{"lineNumber":244,"author":{"gitId":"-"},"content":" .addIgnoreStandaloneConfig()"},{"lineNumber":245,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":246,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":247,"author":{"gitId":"-"},"content":""},{"lineNumber":248,"author":{"gitId":"-"},"content":" String inputWithAlias \u003d new InputBuilder().addRepos(TEST_REPO_REPOSENSE, TEST_REPO_DELTA)"},{"lineNumber":249,"author":{"gitId":"-"},"content":" .add(\"-i\")"},{"lineNumber":250,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":251,"author":{"gitId":"-"},"content":" CliArguments cliArgumentsWithAlias \u003d ArgsParser.parse(translateCommandline(inputWithAlias));"},{"lineNumber":252,"author":{"gitId":"-"},"content":""},{"lineNumber":253,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.isStandaloneConfigIgnored());"},{"lineNumber":254,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArgumentsWithAlias.isStandaloneConfigIgnored());"},{"lineNumber":255,"author":{"gitId":"-"},"content":""},{"lineNumber":256,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.equals(cliArgumentsWithAlias));"},{"lineNumber":257,"author":{"gitId":"-"},"content":""},{"lineNumber":258,"author":{"gitId":"-"},"content":" Assertions.assertEquals(cliArguments, cliArgumentsWithAlias);"},{"lineNumber":259,"author":{"gitId":"-"},"content":" }"},{"lineNumber":260,"author":{"gitId":"-"},"content":""},{"lineNumber":261,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":262,"author":{"gitId":"-"},"content":" public void parse_withoutIgnore_success() throws Exception {"},{"lineNumber":263,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addRepos(TEST_REPO_REPOSENSE, TEST_REPO_DELTA).build();"},{"lineNumber":264,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":265,"author":{"gitId":"-"},"content":""},{"lineNumber":266,"author":{"gitId":"-"},"content":" Assertions.assertFalse(cliArguments.isStandaloneConfigIgnored());"},{"lineNumber":267,"author":{"gitId":"-"},"content":" }"},{"lineNumber":268,"author":{"gitId":"-"},"content":""},{"lineNumber":269,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":270,"author":{"gitId":"-"},"content":" public void parse_viewOnlyWithoutArgs_returnsConfigCliArguments() throws Exception {"},{"lineNumber":271,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addView().build();"},{"lineNumber":272,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":273,"author":{"gitId":"-"},"content":""},{"lineNumber":274,"author":{"gitId":"-"},"content":" Assertions.assertEquals(CONFIG_DIRECTORY.toString(), ("},{"lineNumber":275,"author":{"gitId":"-"},"content":" cliArguments).getConfigFolderPath().toString());"},{"lineNumber":276,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.isAutomaticallyLaunching());"},{"lineNumber":277,"author":{"gitId":"-"},"content":" }"},{"lineNumber":278,"author":{"gitId":"-"},"content":""},{"lineNumber":279,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":280,"author":{"gitId":"-"},"content":" public void parse_configFolderAndOutputDirectory_success() throws Exception {"},{"lineNumber":281,"author":{"gitId":"-"},"content":" Path expectedRelativeOutputDirectoryPath \u003d OUTPUT_DIRECTORY_RELATIVE.resolve(ArgsParser.DEFAULT_REPORT_NAME);"},{"lineNumber":282,"author":{"gitId":"-"},"content":" Path expectedAbsoluteOutputDirectoryPath \u003d OUTPUT_DIRECTORY_ABSOLUTE.resolve(ArgsParser.DEFAULT_REPORT_NAME);"},{"lineNumber":283,"author":{"gitId":"-"},"content":""},{"lineNumber":284,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(CONFIG_FOLDER_ABSOLUTE)"},{"lineNumber":285,"author":{"gitId":"-"},"content":" .addOutput(OUTPUT_DIRECTORY_RELATIVE)"},{"lineNumber":286,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":287,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":288,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":289,"author":{"gitId":"-"},"content":" REPO_CONFIG_CSV_FILE, cliArguments.getRepoConfigFilePath()));"},{"lineNumber":290,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":291,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_CSV_FILE, cliArguments.getAuthorConfigFilePath()));"},{"lineNumber":292,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile(expectedRelativeOutputDirectoryPath, cliArguments.getOutputFilePath()));"},{"lineNumber":293,"author":{"gitId":"-"},"content":""},{"lineNumber":294,"author":{"gitId":"-"},"content":" input \u003d new InputBuilder().addConfig(CONFIG_FOLDER_RELATIVE)"},{"lineNumber":295,"author":{"gitId":"-"},"content":" .addOutput(OUTPUT_DIRECTORY_ABSOLUTE)"},{"lineNumber":296,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":297,"author":{"gitId":"-"},"content":" cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":298,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":299,"author":{"gitId":"-"},"content":" REPO_CONFIG_CSV_FILE, cliArguments.getRepoConfigFilePath()));"},{"lineNumber":300,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":301,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_CSV_FILE, cliArguments.getAuthorConfigFilePath()));"},{"lineNumber":302,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile(expectedAbsoluteOutputDirectoryPath, cliArguments.getOutputFilePath()));"},{"lineNumber":303,"author":{"gitId":"-"},"content":" }"},{"lineNumber":304,"author":{"gitId":"-"},"content":""},{"lineNumber":305,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":306,"author":{"gitId":"-"},"content":" public void parse_configFolderAndViewWithouthArgs_returnsConfigCliArguments() throws Exception {"},{"lineNumber":307,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(CONFIG_FOLDER_ABSOLUTE)"},{"lineNumber":308,"author":{"gitId":"-"},"content":" .addView()"},{"lineNumber":309,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":310,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":311,"author":{"gitId":"-"},"content":""},{"lineNumber":312,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":313,"author":{"gitId":"-"},"content":" REPO_CONFIG_CSV_FILE, cliArguments.getRepoConfigFilePath()));"},{"lineNumber":314,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":315,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_CSV_FILE, cliArguments.getAuthorConfigFilePath()));"},{"lineNumber":316,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.isAutomaticallyLaunching());"},{"lineNumber":317,"author":{"gitId":"-"},"content":""},{"lineNumber":318,"author":{"gitId":"-"},"content":" input \u003d new InputBuilder().addConfig(CONFIG_FOLDER_RELATIVE)"},{"lineNumber":319,"author":{"gitId":"-"},"content":" .addView()"},{"lineNumber":320,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":321,"author":{"gitId":"-"},"content":" cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":322,"author":{"gitId":"-"},"content":""},{"lineNumber":323,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":324,"author":{"gitId":"-"},"content":" REPO_CONFIG_CSV_FILE, cliArguments.getRepoConfigFilePath()));"},{"lineNumber":325,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":326,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_CSV_FILE, cliArguments.getAuthorConfigFilePath()));"},{"lineNumber":327,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.isAutomaticallyLaunching());"},{"lineNumber":328,"author":{"gitId":"-"},"content":" }"},{"lineNumber":329,"author":{"gitId":"-"},"content":""},{"lineNumber":330,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":331,"author":{"gitId":"-"},"content":" public void parse_configFolderAndViewWithArgs_returnsConfigCliArguments() throws Exception {"},{"lineNumber":332,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(CONFIG_FOLDER_ABSOLUTE)"},{"lineNumber":333,"author":{"gitId":"-"},"content":" .addView(OUTPUT_DIRECTORY_ABSOLUTE)"},{"lineNumber":334,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":335,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":336,"author":{"gitId":"-"},"content":""},{"lineNumber":337,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":338,"author":{"gitId":"-"},"content":" REPO_CONFIG_CSV_FILE, cliArguments.getRepoConfigFilePath()));"},{"lineNumber":339,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":340,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_CSV_FILE, cliArguments.getAuthorConfigFilePath()));"},{"lineNumber":341,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.isAutomaticallyLaunching());"},{"lineNumber":342,"author":{"gitId":"-"},"content":" }"},{"lineNumber":343,"author":{"gitId":"-"},"content":""},{"lineNumber":344,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":345,"author":{"gitId":"-"},"content":" public void sinceDate_correctFormat_success() throws Exception {"},{"lineNumber":346,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER"},{"lineNumber":347,"author":{"gitId":"-"},"content":" .addSinceDate(\"01/07/2017\")"},{"lineNumber":348,"author":{"gitId":"-"},"content":" .addTimezone(DEFAULT_TIME_ZONE_STRING)"},{"lineNumber":349,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":350,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":351,"author":{"gitId":"-"},"content":""},{"lineNumber":352,"author":{"gitId":"-"},"content":" LocalDateTime expectedSinceDate \u003d TestUtil.getSinceDate(2017, Month.JULY.getValue(), 1);"},{"lineNumber":353,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedSinceDate, cliArguments.getSinceDate());"},{"lineNumber":354,"author":{"gitId":"-"},"content":" }"},{"lineNumber":355,"author":{"gitId":"-"},"content":""},{"lineNumber":356,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":357,"author":{"gitId":"-"},"content":" public void untilDate_correctFormat_success() throws Exception {"},{"lineNumber":358,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER"},{"lineNumber":359,"author":{"gitId":"-"},"content":" .addUntilDate(\"30/11/2017\")"},{"lineNumber":360,"author":{"gitId":"-"},"content":" .addTimezone(DEFAULT_TIME_ZONE_STRING)"},{"lineNumber":361,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":362,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":363,"author":{"gitId":"-"},"content":""},{"lineNumber":364,"author":{"gitId":"-"},"content":" LocalDateTime expectedUntilDate \u003d TestUtil.getUntilDate(2017, Month.NOVEMBER.getValue(), 30);"},{"lineNumber":365,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedUntilDate, cliArguments.getUntilDate());"},{"lineNumber":366,"author":{"gitId":"-"},"content":" }"},{"lineNumber":367,"author":{"gitId":"-"},"content":""},{"lineNumber":368,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":369,"author":{"gitId":"-"},"content":" public void sinceDate_withExtraDate_success() throws Exception {"},{"lineNumber":370,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER"},{"lineNumber":371,"author":{"gitId":"-"},"content":" .addSinceDate(\"\\\"01/07/2017 01/07/2018\\\"\")"},{"lineNumber":372,"author":{"gitId":"-"},"content":" .addTimezone(DEFAULT_TIME_ZONE_STRING)"},{"lineNumber":373,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":374,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":375,"author":{"gitId":"-"},"content":""},{"lineNumber":376,"author":{"gitId":"-"},"content":" LocalDateTime expectedSinceDate \u003d TestUtil.getSinceDate(2017, Month.JULY.getValue(), 1);"},{"lineNumber":377,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedSinceDate, cliArguments.getSinceDate());"},{"lineNumber":378,"author":{"gitId":"-"},"content":" }"},{"lineNumber":379,"author":{"gitId":"-"},"content":""},{"lineNumber":380,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":381,"author":{"gitId":"-"},"content":" public void untilDate_withExtraTime_success() throws Exception {"},{"lineNumber":382,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER"},{"lineNumber":383,"author":{"gitId":"-"},"content":" .addUntilDate(\"\\\"30/11/2017 10:10:10\\\"\")"},{"lineNumber":384,"author":{"gitId":"-"},"content":" .addTimezone(DEFAULT_TIME_ZONE_STRING)"},{"lineNumber":385,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":386,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":387,"author":{"gitId":"-"},"content":""},{"lineNumber":388,"author":{"gitId":"-"},"content":" LocalDateTime expectedUntilDate \u003d TestUtil.getUntilDate(2017, Month.NOVEMBER.getValue(), 30);"},{"lineNumber":389,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedUntilDate, cliArguments.getUntilDate());"},{"lineNumber":390,"author":{"gitId":"-"},"content":" }"},{"lineNumber":391,"author":{"gitId":"-"},"content":""},{"lineNumber":392,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":393,"author":{"gitId":"-"},"content":" public void period_inDaysWithSinceDate_success() throws Exception {"},{"lineNumber":394,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER"},{"lineNumber":395,"author":{"gitId":"-"},"content":" .addSinceDate(\"01/07/2017\")"},{"lineNumber":396,"author":{"gitId":"-"},"content":" .addPeriod(\"2d\")"},{"lineNumber":397,"author":{"gitId":"-"},"content":" .addTimezone(DEFAULT_TIME_ZONE_STRING)"},{"lineNumber":398,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":399,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":400,"author":{"gitId":"-"},"content":""},{"lineNumber":401,"author":{"gitId":"-"},"content":" LocalDateTime expectedUntilDate \u003d TestUtil.getUntilDate(2017, Month.JULY.getValue(), 3);"},{"lineNumber":402,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedUntilDate, cliArguments.getUntilDate());"},{"lineNumber":403,"author":{"gitId":"-"},"content":" }"},{"lineNumber":404,"author":{"gitId":"-"},"content":""},{"lineNumber":405,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":406,"author":{"gitId":"-"},"content":" public void period_inWeeksWithUntilDate_success() throws Exception {"},{"lineNumber":407,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER"},{"lineNumber":408,"author":{"gitId":"-"},"content":" .addUntilDate(\"14/07/2017\")"},{"lineNumber":409,"author":{"gitId":"-"},"content":" .addTimezone(DEFAULT_TIME_ZONE_STRING)"},{"lineNumber":410,"author":{"gitId":"-"},"content":" .addPeriod(\"2w\")"},{"lineNumber":411,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":412,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":413,"author":{"gitId":"-"},"content":""},{"lineNumber":414,"author":{"gitId":"-"},"content":" LocalDateTime expectedSinceDate \u003d TestUtil.getSinceDate(2017, Month.JUNE.getValue(), 30);"},{"lineNumber":415,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedSinceDate, cliArguments.getSinceDate());"},{"lineNumber":416,"author":{"gitId":"-"},"content":" }"},{"lineNumber":417,"author":{"gitId":"-"},"content":""},{"lineNumber":418,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":419,"author":{"gitId":"-"},"content":" public void formats_inAlphanumeric_success() throws Exception {"},{"lineNumber":420,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addFormats(\"java js css 7z\").build();"},{"lineNumber":421,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":422,"author":{"gitId":"-"},"content":""},{"lineNumber":423,"author":{"gitId":"-"},"content":" List\u003cFileType\u003e expectedFormats \u003d FileType.convertFormatStringsToFileTypes("},{"lineNumber":424,"author":{"gitId":"-"},"content":" Arrays.asList(\"java\", \"js\", \"css\", \"7z\"));"},{"lineNumber":425,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedFormats, cliArguments.getFormats());"},{"lineNumber":426,"author":{"gitId":"-"},"content":" }"},{"lineNumber":427,"author":{"gitId":"-"},"content":""},{"lineNumber":428,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":429,"author":{"gitId":"-"},"content":" public void numCloningThreads_default_success() throws Exception {"},{"lineNumber":430,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.build();"},{"lineNumber":431,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":432,"author":{"gitId":"-"},"content":""},{"lineNumber":433,"author":{"gitId":"-"},"content":" int expectedNumThreads \u003d ArgsParser.DEFAULT_NUM_CLONING_THREADS;"},{"lineNumber":434,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedNumThreads, cliArguments.getNumCloningThreads());"},{"lineNumber":435,"author":{"gitId":"-"},"content":" }"},{"lineNumber":436,"author":{"gitId":"-"},"content":""},{"lineNumber":437,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":438,"author":{"gitId":"-"},"content":" public void numCloningThreads_isNumeric_success() throws Exception {"},{"lineNumber":439,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER"},{"lineNumber":440,"author":{"gitId":"-"},"content":" .addNumCloningThreads(2)"},{"lineNumber":441,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":442,"author":{"gitId":"-"},"content":" System.out.println(input);"},{"lineNumber":443,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":444,"author":{"gitId":"-"},"content":""},{"lineNumber":445,"author":{"gitId":"-"},"content":" int expectedNumThreads \u003d 2;"},{"lineNumber":446,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedNumThreads, cliArguments.getNumCloningThreads());"},{"lineNumber":447,"author":{"gitId":"-"},"content":" }"},{"lineNumber":448,"author":{"gitId":"-"},"content":""},{"lineNumber":449,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":450,"author":{"gitId":"-"},"content":" public void numAnalysisThreads_default_success() throws Exception {"},{"lineNumber":451,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.build();"},{"lineNumber":452,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":453,"author":{"gitId":"-"},"content":""},{"lineNumber":454,"author":{"gitId":"-"},"content":" int expectedNumThreads \u003d ArgsParser.DEFAULT_NUM_ANALYSIS_THREADS;"},{"lineNumber":455,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedNumThreads, cliArguments.getNumAnalysisThreads());"},{"lineNumber":456,"author":{"gitId":"-"},"content":" }"},{"lineNumber":457,"author":{"gitId":"-"},"content":""},{"lineNumber":458,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":459,"author":{"gitId":"-"},"content":" public void numAnalysisThreads_isNumeric_success() throws Exception {"},{"lineNumber":460,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER"},{"lineNumber":461,"author":{"gitId":"-"},"content":" .addNumAnalysisThreads(2)"},{"lineNumber":462,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":463,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":464,"author":{"gitId":"-"},"content":""},{"lineNumber":465,"author":{"gitId":"-"},"content":" int expectedNumThreads \u003d 2;"},{"lineNumber":466,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedNumThreads, cliArguments.getNumAnalysisThreads());"},{"lineNumber":467,"author":{"gitId":"-"},"content":" }"},{"lineNumber":468,"author":{"gitId":"-"},"content":""},{"lineNumber":469,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":470,"author":{"gitId":"-"},"content":" public void parse_validGitRepoLocations_repoConfigurationListCorrectSize() throws Exception {"},{"lineNumber":471,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addRepos(TEST_REPO_REPOSENSE, TEST_REPO_DELTA).build();"},{"lineNumber":472,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":473,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e repoConfigs \u003d RunConfigurationDecider"},{"lineNumber":474,"author":{"gitId":"-"},"content":" .getRunConfiguration(cliArguments)"},{"lineNumber":475,"author":{"gitId":"-"},"content":" .getRepoConfigurations();"},{"lineNumber":476,"author":{"gitId":"-"},"content":" Assertions.assertEquals(2, repoConfigs.size());"},{"lineNumber":477,"author":{"gitId":"-"},"content":" }"},{"lineNumber":478,"author":{"gitId":"-"},"content":""},{"lineNumber":479,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":480,"author":{"gitId":"-"},"content":" public void parse_repoLocationsAndView_returnsLocationCliArguments() throws Exception {"},{"lineNumber":481,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addRepos(TEST_REPO_REPOSENSE, TEST_REPO_DELTA)"},{"lineNumber":482,"author":{"gitId":"-"},"content":" .addView()"},{"lineNumber":483,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":484,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":485,"author":{"gitId":"-"},"content":""},{"lineNumber":486,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.isAutomaticallyLaunching());"},{"lineNumber":487,"author":{"gitId":"-"},"content":" List\u003cString\u003e expectedLocations \u003d Arrays.asList(TEST_REPO_REPOSENSE, TEST_REPO_DELTA);"},{"lineNumber":488,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedLocations, cliArguments.getLocations());"},{"lineNumber":489,"author":{"gitId":"-"},"content":" }"},{"lineNumber":490,"author":{"gitId":"-"},"content":""},{"lineNumber":491,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":492,"author":{"gitId":"-"},"content":" public void parse_repoLocationsOnly_success() throws Exception {"},{"lineNumber":493,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addRepos(TEST_REPO_REPOSENSE, TEST_REPO_DELTA).build();"},{"lineNumber":494,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":495,"author":{"gitId":"-"},"content":""},{"lineNumber":496,"author":{"gitId":"-"},"content":" Assertions.assertFalse(cliArguments.isAutomaticallyLaunching());"},{"lineNumber":497,"author":{"gitId":"-"},"content":" List\u003cString\u003e expectedLocations \u003d Arrays.asList(TEST_REPO_REPOSENSE, TEST_REPO_DELTA);"},{"lineNumber":498,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedLocations, cliArguments.getLocations());"},{"lineNumber":499,"author":{"gitId":"-"},"content":" }"},{"lineNumber":500,"author":{"gitId":"-"},"content":""},{"lineNumber":501,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":502,"author":{"gitId":"-"},"content":" public void parse_repoLocationsAndViewWithArgs_returnsLocationsCliArguments() throws Exception {"},{"lineNumber":503,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addRepos(TEST_REPO_REPOSENSE, TEST_REPO_DELTA)"},{"lineNumber":504,"author":{"gitId":"-"},"content":" .addView(OUTPUT_DIRECTORY_ABSOLUTE)"},{"lineNumber":505,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":506,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":507,"author":{"gitId":"-"},"content":""},{"lineNumber":508,"author":{"gitId":"-"},"content":" Assertions.assertTrue(cliArguments.isAutomaticallyLaunching());"},{"lineNumber":509,"author":{"gitId":"-"},"content":" List\u003cString\u003e expectedLocations \u003d Arrays.asList(TEST_REPO_REPOSENSE, TEST_REPO_DELTA);"},{"lineNumber":510,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedLocations, cliArguments.getLocations());"},{"lineNumber":511,"author":{"gitId":"-"},"content":" }"},{"lineNumber":512,"author":{"gitId":"-"},"content":""},{"lineNumber":513,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":514,"author":{"gitId":"-"},"content":" public void parse_configOrLocationsSimilar_success() throws Exception {"},{"lineNumber":515,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(CONFIG_FOLDER_ABSOLUTE).build();"},{"lineNumber":516,"author":{"gitId":"-"},"content":" CliArguments configCliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":517,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualRepoConfigs \u003d RunConfigurationDecider"},{"lineNumber":518,"author":{"gitId":"-"},"content":" .getRunConfiguration(configCliArguments)"},{"lineNumber":519,"author":{"gitId":"-"},"content":" .getRepoConfigurations();"},{"lineNumber":520,"author":{"gitId":"-"},"content":""},{"lineNumber":521,"author":{"gitId":"-"},"content":" input \u003d new InputBuilder().addRepos(TEST_REPO_BETA, TEST_REPO_CHARLIE, TEST_REPO_DELTA).build();"},{"lineNumber":522,"author":{"gitId":"-"},"content":" CliArguments locationCliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":523,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e expectedRepoConfigs \u003d RunConfigurationDecider"},{"lineNumber":524,"author":{"gitId":"-"},"content":" .getRunConfiguration(locationCliArguments)"},{"lineNumber":525,"author":{"gitId":"-"},"content":" .getRepoConfigurations();"},{"lineNumber":526,"author":{"gitId":"-"},"content":""},{"lineNumber":527,"author":{"gitId":"-"},"content":" Assertions.assertEquals(actualRepoConfigs, expectedRepoConfigs);"},{"lineNumber":528,"author":{"gitId":"-"},"content":" }"},{"lineNumber":529,"author":{"gitId":"-"},"content":""},{"lineNumber":530,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":531,"author":{"gitId":"-"},"content":" public void emptyArgs_defaultConfigFolderPath() throws Exception {"},{"lineNumber":532,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(new String[]{});"},{"lineNumber":533,"author":{"gitId":"-"},"content":""},{"lineNumber":534,"author":{"gitId":"-"},"content":" Assertions.assertEquals(CONFIG_DIRECTORY.toString(), cliArguments.getConfigFolderPath().toString());"},{"lineNumber":535,"author":{"gitId":"-"},"content":" }"},{"lineNumber":536,"author":{"gitId":"-"},"content":""},{"lineNumber":537,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":538,"author":{"gitId":"-"},"content":" public void parse_repoAliases_sameResult() throws Exception {"},{"lineNumber":539,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addRepos(TEST_REPO_BETA).build();"},{"lineNumber":540,"author":{"gitId":"-"},"content":" CliArguments repoAliasCliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":541,"author":{"gitId":"-"},"content":""},{"lineNumber":542,"author":{"gitId":"-"},"content":" input \u003d new InputBuilder().add(String.format(\"--repos %s\", TEST_REPO_BETA)).build();"},{"lineNumber":543,"author":{"gitId":"-"},"content":" CliArguments reposAliasCliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":544,"author":{"gitId":"-"},"content":""},{"lineNumber":545,"author":{"gitId":"-"},"content":" Assertions.assertEquals(repoAliasCliArguments, reposAliasCliArguments);"},{"lineNumber":546,"author":{"gitId":"-"},"content":" }"},{"lineNumber":547,"author":{"gitId":"-"},"content":""},{"lineNumber":548,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":549,"author":{"gitId":"-"},"content":" public void absoluteConfigFolder_withoutRequiredConfigFiles_throwsParseException() {"},{"lineNumber":550,"author":{"gitId":"-"},"content":" Path absDirectory \u003d PROJECT_DIRECTORY.getParent().toAbsolutePath();"},{"lineNumber":551,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(absDirectory).build();"},{"lineNumber":552,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":553,"author":{"gitId":"-"},"content":" }"},{"lineNumber":554,"author":{"gitId":"-"},"content":""},{"lineNumber":555,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":556,"author":{"gitId":"-"},"content":" public void relativeConfigFolder_withoutRequiredConfigFiles_throwsParseException() {"},{"lineNumber":557,"author":{"gitId":"-"},"content":" Path relDirectory \u003d PROJECT_DIRECTORY.getParent();"},{"lineNumber":558,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(relDirectory).build();"},{"lineNumber":559,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":560,"author":{"gitId":"-"},"content":" }"},{"lineNumber":561,"author":{"gitId":"-"},"content":""},{"lineNumber":562,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":563,"author":{"gitId":"-"},"content":" public void parse_notExistsConfigFolder_throwsParseException() {"},{"lineNumber":564,"author":{"gitId":"-"},"content":" Path absConfigFolder \u003d PROJECT_DIRECTORY.resolve(\"non_existing_random_folder\");"},{"lineNumber":565,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(absConfigFolder).build();"},{"lineNumber":566,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":567,"author":{"gitId":"-"},"content":" }"},{"lineNumber":568,"author":{"gitId":"-"},"content":""},{"lineNumber":569,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":570,"author":{"gitId":"-"},"content":" public void parse_configCsvFileAsConfigFolder_throwsParseException() {"},{"lineNumber":571,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(REPO_CONFIG_CSV_FILE).build();"},{"lineNumber":572,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":573,"author":{"gitId":"-"},"content":" }"},{"lineNumber":574,"author":{"gitId":"-"},"content":""},{"lineNumber":575,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":576,"author":{"gitId":"-"},"content":" public void parse_missingConfigValue_throwsParseException() {"},{"lineNumber":577,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(new File(\"\").toPath()).build();"},{"lineNumber":578,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":579,"author":{"gitId":"-"},"content":" }"},{"lineNumber":580,"author":{"gitId":"-"},"content":""},{"lineNumber":581,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":582,"author":{"gitId":"-"},"content":" public void outputPath_nonExistentDirectory_success() throws Exception {"},{"lineNumber":583,"author":{"gitId":"-"},"content":" Path nonExistentDirectory \u003d PROJECT_DIRECTORY.resolve(NONEXISTENT_DIRECTORY);"},{"lineNumber":584,"author":{"gitId":"-"},"content":" Path expectedRelativeOutputDirectoryPath \u003d nonExistentDirectory.resolve(ArgsParser.DEFAULT_REPORT_NAME);"},{"lineNumber":585,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addOutput(nonExistentDirectory).build();"},{"lineNumber":586,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":587,"author":{"gitId":"-"},"content":""},{"lineNumber":588,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.isSameFile("},{"lineNumber":589,"author":{"gitId":"-"},"content":" expectedRelativeOutputDirectoryPath, cliArguments.getOutputFilePath()));"},{"lineNumber":590,"author":{"gitId":"-"},"content":" }"},{"lineNumber":591,"author":{"gitId":"-"},"content":""},{"lineNumber":592,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":593,"author":{"gitId":"-"},"content":" public void sinceDate_unsupportedFormats_throwsParseException() {"},{"lineNumber":594,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addSinceDate(\"01 July 17\").build();"},{"lineNumber":595,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":596,"author":{"gitId":"-"},"content":" }"},{"lineNumber":597,"author":{"gitId":"-"},"content":""},{"lineNumber":598,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":599,"author":{"gitId":"-"},"content":" public void untilDate_unsupportedFormats_throwsParseException() {"},{"lineNumber":600,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addUntilDate(\"11/31/2017\").build();"},{"lineNumber":601,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":602,"author":{"gitId":"-"},"content":" }"},{"lineNumber":603,"author":{"gitId":"-"},"content":""},{"lineNumber":604,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":605,"author":{"gitId":"-"},"content":" public void sinceDate_laterThanUntilDate_throwsParseException() {"},{"lineNumber":606,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addSinceDate(\"01/12/2017\")"},{"lineNumber":607,"author":{"gitId":"-"},"content":" .addUntilDate(\"30/11/2017\")"},{"lineNumber":608,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":609,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":610,"author":{"gitId":"-"},"content":" }"},{"lineNumber":611,"author":{"gitId":"-"},"content":""},{"lineNumber":612,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":613,"author":{"gitId":"-"},"content":" public void sinceDate_laterThanCurrentDate_throwsParseException() {"},{"lineNumber":614,"author":{"gitId":"-"},"content":" LocalDateTime tomorrowDateTime \u003d LocalDateTime.now()"},{"lineNumber":615,"author":{"gitId":"-"},"content":" .plusDays(1L);"},{"lineNumber":616,"author":{"gitId":"-"},"content":" DateTimeFormatter formatter \u003d DateTimeFormatter.ofPattern(\"dd/MM/yyyy\");"},{"lineNumber":617,"author":{"gitId":"-"},"content":" String tomorrow \u003d tomorrowDateTime.format(formatter);"},{"lineNumber":618,"author":{"gitId":"-"},"content":""},{"lineNumber":619,"author":{"gitId":"-"},"content":""},{"lineNumber":620,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addSinceDate(tomorrow)"},{"lineNumber":621,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":622,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":623,"author":{"gitId":"-"},"content":" }"},{"lineNumber":624,"author":{"gitId":"-"},"content":""},{"lineNumber":625,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":626,"author":{"gitId":"-"},"content":" public void sinceDate_beforeUntilDateAndLaterThanCurrentDate_throwsParseException() {"},{"lineNumber":627,"author":{"gitId":"-"},"content":" LocalDateTime tomorrowDateTime \u003d LocalDateTime.now()"},{"lineNumber":628,"author":{"gitId":"-"},"content":" .plusDays(1L);"},{"lineNumber":629,"author":{"gitId":"-"},"content":" LocalDateTime dayAfterDateTime \u003d LocalDateTime.now()"},{"lineNumber":630,"author":{"gitId":"-"},"content":" .plusDays(2L);"},{"lineNumber":631,"author":{"gitId":"-"},"content":""},{"lineNumber":632,"author":{"gitId":"-"},"content":" DateTimeFormatter formatter \u003d DateTimeFormatter.ofPattern(\"dd/MM/yyyy\");"},{"lineNumber":633,"author":{"gitId":"-"},"content":" String tomorrow \u003d tomorrowDateTime.format(formatter);"},{"lineNumber":634,"author":{"gitId":"-"},"content":" String dayAfter \u003d dayAfterDateTime.format(formatter);"},{"lineNumber":635,"author":{"gitId":"-"},"content":""},{"lineNumber":636,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addSinceDate(tomorrow)"},{"lineNumber":637,"author":{"gitId":"-"},"content":" .addUntilDate(dayAfter)"},{"lineNumber":638,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":639,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":640,"author":{"gitId":"-"},"content":" }"},{"lineNumber":641,"author":{"gitId":"-"},"content":""},{"lineNumber":642,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":643,"author":{"gitId":"-"},"content":" public void period_withBothSinceDateAndUntilDate_throwsParseException() {"},{"lineNumber":644,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addPeriod(\"18d\")"},{"lineNumber":645,"author":{"gitId":"-"},"content":" .addSinceDate(\"30/11/2017\")"},{"lineNumber":646,"author":{"gitId":"-"},"content":" .addUntilDate(\"01/12/2017\")"},{"lineNumber":647,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":648,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":649,"author":{"gitId":"-"},"content":" }"},{"lineNumber":650,"author":{"gitId":"-"},"content":""},{"lineNumber":651,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":652,"author":{"gitId":"-"},"content":" public void period_notNumeric_throwsParseExcpetion() {"},{"lineNumber":653,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addPeriod(\"abcd\").build();"},{"lineNumber":654,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":655,"author":{"gitId":"-"},"content":" }"},{"lineNumber":656,"author":{"gitId":"-"},"content":""},{"lineNumber":657,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":658,"author":{"gitId":"-"},"content":" public void period_isZero_throwsParseExcpetion() {"},{"lineNumber":659,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addPeriod(\"0w\").build();"},{"lineNumber":660,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":661,"author":{"gitId":"-"},"content":" }"},{"lineNumber":662,"author":{"gitId":"-"},"content":""},{"lineNumber":663,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":664,"author":{"gitId":"-"},"content":" public void formats_notInAlphanumeric_throwsParseException() {"},{"lineNumber":665,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addFormats(\".java\").build();"},{"lineNumber":666,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":667,"author":{"gitId":"-"},"content":" }"},{"lineNumber":668,"author":{"gitId":"-"},"content":""},{"lineNumber":669,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":670,"author":{"gitId":"-"},"content":" public void parse_mutuallyExclusiveArgumentsConfigAndReposTogether_throwsParseException() {"},{"lineNumber":671,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(CONFIG_FOLDER_ABSOLUTE)"},{"lineNumber":672,"author":{"gitId":"-"},"content":" .addRepos(TEST_REPO_REPOSENSE)"},{"lineNumber":673,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":674,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":675,"author":{"gitId":"-"},"content":" }"},{"lineNumber":676,"author":{"gitId":"-"},"content":""},{"lineNumber":677,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":678,"author":{"gitId":"-"},"content":" public void parse_extraArgumentForIgnore_throwsParseException() {"},{"lineNumber":679,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addIgnoreStandaloneConfig().add(\"true\").build();"},{"lineNumber":680,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":681,"author":{"gitId":"-"},"content":" }"},{"lineNumber":682,"author":{"gitId":"-"},"content":""},{"lineNumber":683,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":684,"author":{"gitId":"-"},"content":" public void parse_withTimezone_success() throws Exception {"},{"lineNumber":685,"author":{"gitId":"-"},"content":" String zoneId \u003d \"UTC+11\";"},{"lineNumber":686,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addTimezone(zoneId).build();"},{"lineNumber":687,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":688,"author":{"gitId":"-"},"content":""},{"lineNumber":689,"author":{"gitId":"-"},"content":" Assertions.assertEquals(ZoneId.of(zoneId), cliArguments.getZoneId());"},{"lineNumber":690,"author":{"gitId":"-"},"content":""},{"lineNumber":691,"author":{"gitId":"-"},"content":" zoneId \u003d \"UTC-1030\";"},{"lineNumber":692,"author":{"gitId":"-"},"content":" input \u003d DEFAULT_INPUT_BUILDER.addTimezone(zoneId).build();"},{"lineNumber":693,"author":{"gitId":"-"},"content":" cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":694,"author":{"gitId":"-"},"content":""},{"lineNumber":695,"author":{"gitId":"-"},"content":" Assertions.assertEquals(ZoneId.of(zoneId), cliArguments.getZoneId());"},{"lineNumber":696,"author":{"gitId":"-"},"content":""},{"lineNumber":697,"author":{"gitId":"-"},"content":" zoneId \u003d \"UTC\";"},{"lineNumber":698,"author":{"gitId":"-"},"content":" input \u003d DEFAULT_INPUT_BUILDER.addTimezone(zoneId).build();"},{"lineNumber":699,"author":{"gitId":"-"},"content":" cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":700,"author":{"gitId":"-"},"content":""},{"lineNumber":701,"author":{"gitId":"-"},"content":" Assertions.assertEquals(ZoneId.of(zoneId), cliArguments.getZoneId());"},{"lineNumber":702,"author":{"gitId":"-"},"content":" }"},{"lineNumber":703,"author":{"gitId":"-"},"content":""},{"lineNumber":704,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":705,"author":{"gitId":"-"},"content":" public void parse_incorrectTimezone_throwsParseException() {"},{"lineNumber":706,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addTimezone(\"UTC+\").build();"},{"lineNumber":707,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));;"},{"lineNumber":708,"author":{"gitId":"-"},"content":" }"},{"lineNumber":709,"author":{"gitId":"-"},"content":""},{"lineNumber":710,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":711,"author":{"gitId":"-"},"content":" public void parse_timezoneWithoutArgument_throwsParseException() {"},{"lineNumber":712,"author":{"gitId":"-"},"content":" String input \u003d DEFAULT_INPUT_BUILDER.addTimezone(\"\").build();"},{"lineNumber":713,"author":{"gitId":"-"},"content":" Assertions.assertThrows(ParseException.class, () -\u003e ArgsParser.parse(translateCommandline(input)));"},{"lineNumber":714,"author":{"gitId":"-"},"content":" }"},{"lineNumber":715,"author":{"gitId":"-"},"content":""},{"lineNumber":716,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":717,"author":{"gitId":"-"},"content":" public void parse_shallowCloning_success() throws Exception {"},{"lineNumber":718,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(CONFIG_FOLDER_ABSOLUTE)"},{"lineNumber":719,"author":{"gitId":"-"},"content":" .addOutput(OUTPUT_DIRECTORY_ABSOLUTE)"},{"lineNumber":720,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":721,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":722,"author":{"gitId":"-"},"content":" Assertions.assertEquals(false, cliArguments.isShallowCloningPerformed());"},{"lineNumber":723,"author":{"gitId":"-"},"content":""},{"lineNumber":724,"author":{"gitId":"-"},"content":" String inputShallow \u003d new InputBuilder().addConfig(CONFIG_FOLDER_ABSOLUTE)"},{"lineNumber":725,"author":{"gitId":"-"},"content":" .addOutput(OUTPUT_DIRECTORY_ABSOLUTE)"},{"lineNumber":726,"author":{"gitId":"-"},"content":" .addShallowCloning()"},{"lineNumber":727,"author":{"gitId":"-"},"content":" .build();"},{"lineNumber":728,"author":{"gitId":"-"},"content":" CliArguments cliArgumentsShallow \u003d ArgsParser.parse(translateCommandline(inputShallow));"},{"lineNumber":729,"author":{"gitId":"-"},"content":" Assertions.assertEquals(true, cliArgumentsShallow.isShallowCloningPerformed());"},{"lineNumber":730,"author":{"gitId":"-"},"content":" }"},{"lineNumber":731,"author":{"gitId":"-"},"content":""},{"lineNumber":732,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":733,"author":{"gitId":"-"},"content":" * Ensures that {@code actualSinceDate} is exactly one month before {@code untilDate}."},{"lineNumber":734,"author":{"gitId":"-"},"content":" *"},{"lineNumber":735,"author":{"gitId":"-"},"content":" * @throws AssertionError if {@code actualSinceDate} is not one month before {@code untilDate}."},{"lineNumber":736,"author":{"gitId":"-"},"content":" */"},{"lineNumber":737,"author":{"gitId":"-"},"content":" private void assertDateDiffOneMonth(LocalDateTime actualSinceDate, LocalDateTime untilDate) {"},{"lineNumber":738,"author":{"gitId":"-"},"content":" LocalDateTime oneMonthBeforeUntilDate \u003d untilDate.withHour(0).withMinute(0).withSecond(0).minusMonths(1);"},{"lineNumber":739,"author":{"gitId":"-"},"content":" Assertions.assertTrue(actualSinceDate.equals(oneMonthBeforeUntilDate));"},{"lineNumber":740,"author":{"gitId":"-"},"content":" }"},{"lineNumber":741,"author":{"gitId":"-"},"content":""},{"lineNumber":742,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":743,"author":{"gitId":"-"},"content":" * Ensures that {@code actualUntilDate} falls on the date of report generation with time at 23:59:59."},{"lineNumber":744,"author":{"gitId":"-"},"content":" *"},{"lineNumber":745,"author":{"gitId":"-"},"content":" * @throws AssertionError if {@code actualUntilDate} does not fall on the date of report generation"},{"lineNumber":746,"author":{"gitId":"-"},"content":" * with time at 23:59:59."},{"lineNumber":747,"author":{"gitId":"-"},"content":" */"},{"lineNumber":748,"author":{"gitId":"-"},"content":" private void assertDateDiffEndOfDay(LocalDateTime actualUntilDate) {"},{"lineNumber":749,"author":{"gitId":"-"},"content":""},{"lineNumber":750,"author":{"gitId":"-"},"content":" LocalDateTime currentDate \u003d LocalDateTime.now().withHour(23).withMinute(59).withSecond(59).withNano(0);"},{"lineNumber":751,"author":{"gitId":"-"},"content":" Assertions.assertTrue(actualUntilDate.equals(currentDate));"},{"lineNumber":752,"author":{"gitId":"-"},"content":" }"},{"lineNumber":753,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":2,"-":751}},{"path":"src/test/java/reposense/parser/AuthorConfigParserTest.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.parser;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static reposense.util.TestUtil.loadResource;"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.AbstractMap.SimpleEntry;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Arrays;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Collections;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.Map;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.stream.Stream;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assertions;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":"import reposense.model.Author;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import reposense.model.AuthorConfiguration;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import reposense.model.RepoLocation;"},{"lineNumber":20,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidCsvException;"},{"lineNumber":21,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidHeaderException;"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":"public class AuthorConfigParserTest {"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_EMPTY_LOCATION_FILE \u003d loadResource(AuthorConfigParserTest.class,"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_emptyLocation_test.csv\");"},{"lineNumber":26,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_EMPTY_CONFIG_FILE \u003d loadResource(AuthorConfigParserTest.class,"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/require_trailing_whitespaces/authorconfig_emptyConfig_test.csv\");"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_NO_SPECIAL_CHARACTER_FILE \u003d loadResource(AuthorConfigParserTest.class,"},{"lineNumber":29,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_noSpecialCharacter_test.csv\");"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_SPECIAL_CHARACTER_FILE \u003d loadResource(AuthorConfigParserTest.class,"},{"lineNumber":31,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_specialCharacter_test.csv\");"},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_COMMAS_AND_DOUBLEQUOTES_FILE \u003d loadResource(AuthorConfigParserTest.class,"},{"lineNumber":33,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_commasAndDoubleQuotes_test.csv\");"},{"lineNumber":34,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_MULTIPLE_EMAILS_FILE \u003d loadResource(AuthorConfigParserTest.class,"},{"lineNumber":35,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_multipleEmails_test.csv\");"},{"lineNumber":36,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_DIFFERENT_COLUMN_ORDER \u003d loadResource(AuthorConfigParserTest.class,"},{"lineNumber":37,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_differentColumnOrder_test.csv\");"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_MISSING_OPTIONAL_HEADER \u003d loadResource(AuthorConfigParserTest.class,"},{"lineNumber":39,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_missingOptionalHeader_test.csv\");"},{"lineNumber":40,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_MISSING_MANDATORY_HEADER \u003d loadResource(AuthorConfigParserTest.class,"},{"lineNumber":41,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_missingMandatoryHeader_test.csv\");"},{"lineNumber":42,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_UNKNOWN_HEADER \u003d loadResource(AuthorConfigParserTest.class,"},{"lineNumber":43,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_unknownHeaders_test.csv\");"},{"lineNumber":44,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_GITHUB_ID_HEADER \u003d loadResource(AuthorConfigParserTest.class,"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_gitHubIdHeader_test.csv\");"},{"lineNumber":46,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_GIT_HOST_ID_HEADER \u003d loadResource(AuthorConfigParserTest.class,"},{"lineNumber":47,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_gitHostIdHeader_test.csv\");"},{"lineNumber":48,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_MULTIPLE_REPO_IN_ROW_FILE \u003d loadResource(AuthorConfigParserTest.class,"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_multipleReposInRow_test.csv\");"},{"lineNumber":50,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_MULTIPLE_REPO_IN_ROW_SINGLE_BRANCH_PER_REPO_FILE \u003d loadResource("},{"lineNumber":51,"author":{"gitId":"-"},"content":" AuthorConfigParserTest.class,"},{"lineNumber":52,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_multipleReposInRowSingleBranchPerRepo_test.csv\");"},{"lineNumber":53,"author":{"gitId":"-"},"content":""},{"lineNumber":54,"author":{"gitId":"-"},"content":" private static final Path AUTHOR_CONFIG_MULTIPLE_REPO_IN_ROW_MULTIPLE_BRANCH_PER_REPO_FILE \u003d loadResource("},{"lineNumber":55,"author":{"gitId":"-"},"content":" AuthorConfigParserTest.class,"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \"AuthorConfigParserTest/authorconfig_multipleReposInRowMultipleBranchPerRepo_test.csv\");"},{"lineNumber":57,"author":{"gitId":"-"},"content":""},{"lineNumber":58,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_BETA_LOCATION \u003d \"https://github.com/reposense/testrepo-Beta.git\";"},{"lineNumber":59,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_BETA_MASTER_BRANCH \u003d \"master\";"},{"lineNumber":60,"author":{"gitId":"-"},"content":""},{"lineNumber":61,"author":{"gitId":"-"},"content":" private static final Author FIRST_AUTHOR \u003d new Author(\"nbriannl\");"},{"lineNumber":62,"author":{"gitId":"-"},"content":" private static final Author SECOND_AUTHOR \u003d new Author(\"zacharytang\");"},{"lineNumber":63,"author":{"gitId":"-"},"content":" private static final List\u003cAuthor\u003e AUTHOR_CONFIG_NO_SPECIAL_CHARACTER_AUTHORS \u003d"},{"lineNumber":64,"author":{"gitId":"-"},"content":" Arrays.asList(FIRST_AUTHOR, SECOND_AUTHOR);"},{"lineNumber":65,"author":{"gitId":"-"},"content":""},{"lineNumber":66,"author":{"gitId":"-"},"content":" private static final Author FIRST_SPECIAL_CHARACTER_AUTHOR \u003d new Author(\"‘Processed�‘Cooked�\");"},{"lineNumber":67,"author":{"gitId":"-"},"content":" private static final Author SECOND_SPECIAL_CHARACTER_AUTHOR \u003d new Author(\"(codeeong)\");"},{"lineNumber":68,"author":{"gitId":"-"},"content":" private static final Author THIRD_SPECIAL_CHARACTER_AUTHOR \u003d new Author(\"^:jordancjq;$\");"},{"lineNumber":69,"author":{"gitId":"-"},"content":" private static final List\u003cAuthor\u003e AUTHOR_CONFIG_SPECIAL_CHARACTER_AUTHORS \u003d Arrays.asList("},{"lineNumber":70,"author":{"gitId":"-"},"content":" FIRST_SPECIAL_CHARACTER_AUTHOR, SECOND_SPECIAL_CHARACTER_AUTHOR, THIRD_SPECIAL_CHARACTER_AUTHOR);"},{"lineNumber":71,"author":{"gitId":"-"},"content":""},{"lineNumber":72,"author":{"gitId":"-"},"content":" private static final Author FIRST_COMMAS_AND_DOUBLEQUOTES_AUTHOR \u003d new Author(\"ProcessedCooked\");"},{"lineNumber":73,"author":{"gitId":"-"},"content":" private static final Author SECOND_COMMAS_AND_DOUBLEQUOTES_AUTHOR \u003d new Author(\"codeeong\");"},{"lineNumber":74,"author":{"gitId":"-"},"content":" private static final Author THIRD_COMMAS_AND_DOUBLEQUOTES_AUTHOR \u003d new Author(\"jordancjq\");"},{"lineNumber":75,"author":{"gitId":"-"},"content":" private static final String FIRST_COMMAS_AND_DOUBLEQUOTES_DISPLAY_NAME \u003d \"Tay Fan Gao, Douya\";"},{"lineNumber":76,"author":{"gitId":"-"},"content":" private static final String SECOND_COMMAS_AND_DOUBLEQUOTES_DISPLAY_NAME \u003d \"\\\"\\\"Tora, S/O,\\\" Doyua, T.\\\"\";"},{"lineNumber":77,"author":{"gitId":"-"},"content":" private static final String THIRD_COMMAS_AND_DOUBLEQUOTES_DISPLAY_NAME \u003d \"jordancjq\";"},{"lineNumber":78,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e FIRST_COMMAS_AND_DOUBLEQUOTES_ALIAS \u003d"},{"lineNumber":79,"author":{"gitId":"-"},"content":" Collections.singletonList(\"Tay Fan Gao, Douya \\\"SOC, Y2S1\\\"\");"},{"lineNumber":80,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e SECOND_COMMAS_AND_DOUBLEQUOTES_ALIAS \u003d Collections.emptyList();"},{"lineNumber":81,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e THIRD_COMMAS_AND_DOUBLEQUOTES_ALIAS \u003d"},{"lineNumber":82,"author":{"gitId":"-"},"content":" Arrays.asList(\"Borex T\\\"ony Tong\");"},{"lineNumber":83,"author":{"gitId":"-"},"content":" private static final Map\u003cAuthor, List\u003cString\u003e\u003e AUTHOR_ALIAS_COMMAS_AND_DOUBLE_QUOTES_MAP \u003d"},{"lineNumber":84,"author":{"gitId":"-"},"content":" Stream.of(new SimpleEntry\u003c\u003e(FIRST_COMMAS_AND_DOUBLEQUOTES_AUTHOR, FIRST_COMMAS_AND_DOUBLEQUOTES_ALIAS),"},{"lineNumber":85,"author":{"gitId":"-"},"content":" new SimpleEntry\u003c\u003e(SECOND_COMMAS_AND_DOUBLEQUOTES_AUTHOR, SECOND_COMMAS_AND_DOUBLEQUOTES_ALIAS),"},{"lineNumber":86,"author":{"gitId":"-"},"content":" new SimpleEntry\u003c\u003e(THIRD_COMMAS_AND_DOUBLEQUOTES_AUTHOR, THIRD_COMMAS_AND_DOUBLEQUOTES_ALIAS))"},{"lineNumber":87,"author":{"gitId":"-"},"content":" .collect(Collectors.toMap(entry -\u003e entry.getKey(), entry -\u003e entry.getValue()));"},{"lineNumber":88,"author":{"gitId":"-"},"content":" private static final Map\u003cAuthor, String\u003e AUTHOR_DISPLAY_NAME_COMMAS_AND_DOUBLE_QUOTES_MAP \u003d"},{"lineNumber":89,"author":{"gitId":"-"},"content":" Stream.of(new SimpleEntry\u003c\u003e(FIRST_COMMAS_AND_DOUBLEQUOTES_AUTHOR,"},{"lineNumber":90,"author":{"gitId":"-"},"content":" FIRST_COMMAS_AND_DOUBLEQUOTES_DISPLAY_NAME),"},{"lineNumber":91,"author":{"gitId":"-"},"content":" new SimpleEntry\u003c\u003e(SECOND_COMMAS_AND_DOUBLEQUOTES_AUTHOR,"},{"lineNumber":92,"author":{"gitId":"-"},"content":" SECOND_COMMAS_AND_DOUBLEQUOTES_DISPLAY_NAME),"},{"lineNumber":93,"author":{"gitId":"-"},"content":" new SimpleEntry\u003c\u003e(THIRD_COMMAS_AND_DOUBLEQUOTES_AUTHOR, THIRD_COMMAS_AND_DOUBLEQUOTES_DISPLAY_NAME))"},{"lineNumber":94,"author":{"gitId":"-"},"content":" .collect(Collectors.toMap(entry -\u003e entry.getKey(), entry -\u003e entry.getValue()));"},{"lineNumber":95,"author":{"gitId":"-"},"content":""},{"lineNumber":96,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e FIRST_AUTHOR_EMAIL_LIST \u003d"},{"lineNumber":97,"author":{"gitId":"-"},"content":" Arrays.asList(\"nbr@example.com\", \"nbriannl@test.net\", \"nbriannl@users.noreply.github.com\","},{"lineNumber":98,"author":{"gitId":"-"},"content":" \"nbriannl@users.noreply.gitlab.com\");"},{"lineNumber":99,"author":{"gitId":"-"},"content":""},{"lineNumber":100,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":101,"author":{"gitId":"-"},"content":" public void authorConfig_noSpecialCharacter_success() throws Exception {"},{"lineNumber":102,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser \u003d"},{"lineNumber":103,"author":{"gitId":"-"},"content":" new AuthorConfigCsvParser(AUTHOR_CONFIG_NO_SPECIAL_CHARACTER_FILE);"},{"lineNumber":104,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e configs \u003d authorConfigCsvParser.parse();"},{"lineNumber":105,"author":{"gitId":"-"},"content":""},{"lineNumber":106,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, configs.size());"},{"lineNumber":107,"author":{"gitId":"-"},"content":""},{"lineNumber":108,"author":{"gitId":"-"},"content":" AuthorConfiguration config \u003d configs.get(0);"},{"lineNumber":109,"author":{"gitId":"-"},"content":""},{"lineNumber":110,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_BETA_LOCATION), config.getLocation());"},{"lineNumber":111,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_MASTER_BRANCH, config.getBranch());"},{"lineNumber":112,"author":{"gitId":"-"},"content":""},{"lineNumber":113,"author":{"gitId":"-"},"content":" Assertions.assertEquals(AUTHOR_CONFIG_NO_SPECIAL_CHARACTER_AUTHORS, config.getAuthorList());"},{"lineNumber":114,"author":{"gitId":"-"},"content":" }"},{"lineNumber":115,"author":{"gitId":"-"},"content":""},{"lineNumber":116,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":117,"author":{"gitId":"-"},"content":" public void authorConfig_emptyLocation_success() throws Exception {"},{"lineNumber":118,"author":{"gitId":"-"},"content":" AuthorConfiguration expectedConfig \u003d new AuthorConfiguration(new RepoLocation(\"\"));"},{"lineNumber":119,"author":{"gitId":"-"},"content":""},{"lineNumber":120,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser \u003d new AuthorConfigCsvParser(AUTHOR_CONFIG_EMPTY_LOCATION_FILE);"},{"lineNumber":121,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e authorConfigs \u003d authorConfigCsvParser.parse();"},{"lineNumber":122,"author":{"gitId":"-"},"content":" AuthorConfiguration authorConfig \u003d authorConfigs.get(0);"},{"lineNumber":123,"author":{"gitId":"-"},"content":""},{"lineNumber":124,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, authorConfigs.size());"},{"lineNumber":125,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedConfig.getLocation(), authorConfig.getLocation());"},{"lineNumber":126,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedConfig.getBranch(), authorConfig.getBranch());"},{"lineNumber":127,"author":{"gitId":"-"},"content":" Assertions.assertEquals(AUTHOR_CONFIG_NO_SPECIAL_CHARACTER_AUTHORS, authorConfig.getAuthorList());"},{"lineNumber":128,"author":{"gitId":"-"},"content":" }"},{"lineNumber":129,"author":{"gitId":"-"},"content":""},{"lineNumber":130,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":131,"author":{"gitId":"-"},"content":" public void authorConfig_emptyConfig_throwsInvalidCsvException() throws Exception {"},{"lineNumber":132,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser \u003d new AuthorConfigCsvParser(AUTHOR_CONFIG_EMPTY_CONFIG_FILE);"},{"lineNumber":133,"author":{"gitId":"-"},"content":" Assertions.assertThrows(InvalidCsvException.class, () -\u003e authorConfigCsvParser.parse());"},{"lineNumber":134,"author":{"gitId":"-"},"content":" }"},{"lineNumber":135,"author":{"gitId":"-"},"content":""},{"lineNumber":136,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":137,"author":{"gitId":"-"},"content":" public void authorConfig_specialCharacter_success() throws Exception {"},{"lineNumber":138,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser \u003d new AuthorConfigCsvParser(AUTHOR_CONFIG_SPECIAL_CHARACTER_FILE);"},{"lineNumber":139,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e configs \u003d authorConfigCsvParser.parse();"},{"lineNumber":140,"author":{"gitId":"-"},"content":""},{"lineNumber":141,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, configs.size());"},{"lineNumber":142,"author":{"gitId":"-"},"content":""},{"lineNumber":143,"author":{"gitId":"-"},"content":" AuthorConfiguration config \u003d configs.get(0);"},{"lineNumber":144,"author":{"gitId":"-"},"content":""},{"lineNumber":145,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_BETA_LOCATION), config.getLocation());"},{"lineNumber":146,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_MASTER_BRANCH, config.getBranch());"},{"lineNumber":147,"author":{"gitId":"-"},"content":""},{"lineNumber":148,"author":{"gitId":"-"},"content":" Assertions.assertEquals(AUTHOR_CONFIG_SPECIAL_CHARACTER_AUTHORS, config.getAuthorList());"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }"},{"lineNumber":150,"author":{"gitId":"-"},"content":""},{"lineNumber":151,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":152,"author":{"gitId":"-"},"content":" public void authorConfig_multipleEmails_success() throws Exception {"},{"lineNumber":153,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser \u003d new AuthorConfigCsvParser(AUTHOR_CONFIG_MULTIPLE_EMAILS_FILE);"},{"lineNumber":154,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e configs \u003d authorConfigCsvParser.parse();"},{"lineNumber":155,"author":{"gitId":"-"},"content":""},{"lineNumber":156,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, configs.size());"},{"lineNumber":157,"author":{"gitId":"-"},"content":""},{"lineNumber":158,"author":{"gitId":"-"},"content":" AuthorConfiguration config \u003d configs.get(0);"},{"lineNumber":159,"author":{"gitId":"-"},"content":""},{"lineNumber":160,"author":{"gitId":"-"},"content":" Author actualAuthor \u003d config.getAuthorList().get(0);"},{"lineNumber":161,"author":{"gitId":"-"},"content":" Assertions.assertEquals(FIRST_AUTHOR_EMAIL_LIST.size(), actualAuthor.getEmails().size());"},{"lineNumber":162,"author":{"gitId":"-"},"content":" Assertions.assertTrue(actualAuthor.getEmails().containsAll(FIRST_AUTHOR_EMAIL_LIST));"},{"lineNumber":163,"author":{"gitId":"-"},"content":" }"},{"lineNumber":164,"author":{"gitId":"-"},"content":""},{"lineNumber":165,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":166,"author":{"gitId":"-"},"content":" public void authorConfig_differentColumnOrder_success() throws Exception {"},{"lineNumber":167,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser \u003d"},{"lineNumber":168,"author":{"gitId":"-"},"content":" new AuthorConfigCsvParser(AUTHOR_CONFIG_DIFFERENT_COLUMN_ORDER);"},{"lineNumber":169,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e configs \u003d authorConfigCsvParser.parse();"},{"lineNumber":170,"author":{"gitId":"-"},"content":""},{"lineNumber":171,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, configs.size());"},{"lineNumber":172,"author":{"gitId":"-"},"content":""},{"lineNumber":173,"author":{"gitId":"-"},"content":" AuthorConfiguration config \u003d configs.get(0);"},{"lineNumber":174,"author":{"gitId":"-"},"content":""},{"lineNumber":175,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_BETA_LOCATION), config.getLocation());"},{"lineNumber":176,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_MASTER_BRANCH, config.getBranch());"},{"lineNumber":177,"author":{"gitId":"-"},"content":""},{"lineNumber":178,"author":{"gitId":"-"},"content":" Assertions.assertEquals(AUTHOR_CONFIG_NO_SPECIAL_CHARACTER_AUTHORS, config.getAuthorList());"},{"lineNumber":179,"author":{"gitId":"-"},"content":" }"},{"lineNumber":180,"author":{"gitId":"-"},"content":""},{"lineNumber":181,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":182,"author":{"gitId":"-"},"content":" public void authorConfig_missingOptionalHeader_success() throws Exception {"},{"lineNumber":183,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser \u003d new AuthorConfigCsvParser(AUTHOR_CONFIG_MISSING_OPTIONAL_HEADER);"},{"lineNumber":184,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e configs \u003d authorConfigCsvParser.parse();"},{"lineNumber":185,"author":{"gitId":"-"},"content":""},{"lineNumber":186,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, configs.size());"},{"lineNumber":187,"author":{"gitId":"-"},"content":""},{"lineNumber":188,"author":{"gitId":"-"},"content":" AuthorConfiguration config \u003d configs.get(0);"},{"lineNumber":189,"author":{"gitId":"-"},"content":""},{"lineNumber":190,"author":{"gitId":"-"},"content":" Assertions.assertEquals(4, config.getAuthorList().size());"},{"lineNumber":191,"author":{"gitId":"-"},"content":" }"},{"lineNumber":192,"author":{"gitId":"-"},"content":""},{"lineNumber":193,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":194,"author":{"gitId":"-"},"content":" public void authorConfig_newGitHostIdHeader_success() throws Exception {"},{"lineNumber":195,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser;"},{"lineNumber":196,"author":{"gitId":"-"},"content":""},{"lineNumber":197,"author":{"gitId":"-"},"content":" authorConfigCsvParser \u003d new AuthorConfigCsvParser(AUTHOR_CONFIG_GIT_HOST_ID_HEADER);"},{"lineNumber":198,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e configsWithGitHostIdHeader \u003d authorConfigCsvParser.parse();"},{"lineNumber":199,"author":{"gitId":"-"},"content":""},{"lineNumber":200,"author":{"gitId":"-"},"content":" authorConfigCsvParser \u003d new AuthorConfigCsvParser(AUTHOR_CONFIG_GITHUB_ID_HEADER);"},{"lineNumber":201,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e configsWithGitHubIdHeader \u003d authorConfigCsvParser.parse();"},{"lineNumber":202,"author":{"gitId":"-"},"content":""},{"lineNumber":203,"author":{"gitId":"-"},"content":" Assertions.assertEquals(configsWithGitHubIdHeader, configsWithGitHostIdHeader);"},{"lineNumber":204,"author":{"gitId":"-"},"content":" }"},{"lineNumber":205,"author":{"gitId":"-"},"content":""},{"lineNumber":206,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":207,"author":{"gitId":"-"},"content":" public void authorConfig_missingMandatoryHeader_throwsInvalidCsvException() throws Exception {"},{"lineNumber":208,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser \u003d new AuthorConfigCsvParser(AUTHOR_CONFIG_MISSING_MANDATORY_HEADER);"},{"lineNumber":209,"author":{"gitId":"-"},"content":" Assertions.assertThrows(InvalidCsvException.class, () -\u003e authorConfigCsvParser.parse());"},{"lineNumber":210,"author":{"gitId":"-"},"content":" }"},{"lineNumber":211,"author":{"gitId":"-"},"content":""},{"lineNumber":212,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":213,"author":{"gitId":"-"},"content":" public void authorConfig_unknownHeaders_throwsInvalidHeaderException() throws Exception {"},{"lineNumber":214,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser \u003d new AuthorConfigCsvParser(AUTHOR_CONFIG_UNKNOWN_HEADER);"},{"lineNumber":215,"author":{"gitId":"-"},"content":" Assertions.assertThrows(InvalidHeaderException.class, () -\u003e authorConfigCsvParser.parse());"},{"lineNumber":216,"author":{"gitId":"-"},"content":" }"},{"lineNumber":217,"author":{"gitId":"-"},"content":""},{"lineNumber":218,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":219,"author":{"gitId":"-"},"content":" public void parse_multipleColumnsWithCommasAndDoubleQuotes_success() throws Exception {"},{"lineNumber":220,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser \u003d"},{"lineNumber":221,"author":{"gitId":"-"},"content":" new AuthorConfigCsvParser(AUTHOR_CONFIG_COMMAS_AND_DOUBLEQUOTES_FILE);"},{"lineNumber":222,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e configs \u003d authorConfigCsvParser.parse();"},{"lineNumber":223,"author":{"gitId":"-"},"content":""},{"lineNumber":224,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, configs.size());"},{"lineNumber":225,"author":{"gitId":"-"},"content":""},{"lineNumber":226,"author":{"gitId":"-"},"content":" AuthorConfiguration config \u003d configs.get(0);"},{"lineNumber":227,"author":{"gitId":"-"},"content":""},{"lineNumber":228,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_BETA_LOCATION), config.getLocation());"},{"lineNumber":229,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_MASTER_BRANCH, config.getBranch());"},{"lineNumber":230,"author":{"gitId":"-"},"content":" Assertions.assertEquals(AUTHOR_DISPLAY_NAME_COMMAS_AND_DOUBLE_QUOTES_MAP, config.getAuthorDisplayNameMap());"},{"lineNumber":231,"author":{"gitId":"-"},"content":""},{"lineNumber":232,"author":{"gitId":"-"},"content":" Assertions.assertEquals(AUTHOR_ALIAS_COMMAS_AND_DOUBLE_QUOTES_MAP.size(), config.getAuthorList().size());"},{"lineNumber":233,"author":{"gitId":"-"},"content":" config.getAuthorList().forEach(author -\u003e {"},{"lineNumber":234,"author":{"gitId":"-"},"content":" Assertions.assertEquals(AUTHOR_ALIAS_COMMAS_AND_DOUBLE_QUOTES_MAP.get(author), author.getAuthorAliases());"},{"lineNumber":235,"author":{"gitId":"-"},"content":" });"},{"lineNumber":236,"author":{"gitId":"-"},"content":" }"},{"lineNumber":237,"author":{"gitId":"-"},"content":""},{"lineNumber":238,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":239,"author":{"gitId":"-"},"content":" public void authorConfig_multipleReposInRow_success() throws Exception {"},{"lineNumber":240,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser \u003d new AuthorConfigCsvParser("},{"lineNumber":241,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_MULTIPLE_REPO_IN_ROW_FILE);"},{"lineNumber":242,"author":{"gitId":"-"},"content":" String defaultSpecifiedBranch \u003d \"master\";"},{"lineNumber":243,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e configs \u003d authorConfigCsvParser.parse();"},{"lineNumber":244,"author":{"gitId":"-"},"content":""},{"lineNumber":245,"author":{"gitId":"-"},"content":" Assertions.assertEquals(4, configs.size());"},{"lineNumber":246,"author":{"gitId":"-"},"content":""},{"lineNumber":247,"author":{"gitId":"-"},"content":" AuthorConfiguration config \u003d configs.get(0);"},{"lineNumber":248,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(\"https://github.com/reposense/reposense.git\"), config.getLocation());"},{"lineNumber":249,"author":{"gitId":"-"},"content":" Assertions.assertEquals(defaultSpecifiedBranch, config.getBranch());"},{"lineNumber":250,"author":{"gitId":"-"},"content":""},{"lineNumber":251,"author":{"gitId":"-"},"content":" config \u003d configs.get(1);"},{"lineNumber":252,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(\"https://github.com/markbind/markbind.git\"), config.getLocation());"},{"lineNumber":253,"author":{"gitId":"-"},"content":" Assertions.assertEquals(defaultSpecifiedBranch, config.getBranch());"},{"lineNumber":254,"author":{"gitId":"-"},"content":""},{"lineNumber":255,"author":{"gitId":"-"},"content":" config \u003d configs.get(2);"},{"lineNumber":256,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(\"https://github.com/TEAMMATES/teammates.git\"), config.getLocation());"},{"lineNumber":257,"author":{"gitId":"-"},"content":" Assertions.assertEquals(defaultSpecifiedBranch, config.getBranch());"},{"lineNumber":258,"author":{"gitId":"-"},"content":""},{"lineNumber":259,"author":{"gitId":"-"},"content":" config \u003d configs.get(3);"},{"lineNumber":260,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(\"https://github.com/CATcher-org/CATcher.git\"), config.getLocation());"},{"lineNumber":261,"author":{"gitId":"-"},"content":" Assertions.assertEquals(defaultSpecifiedBranch, config.getBranch());"},{"lineNumber":262,"author":{"gitId":"-"},"content":" }"},{"lineNumber":263,"author":{"gitId":"-"},"content":""},{"lineNumber":264,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":265,"author":{"gitId":"-"},"content":" public void authorConfig_multipleReposInRowSingleBranchPerRepo_success() throws Exception {"},{"lineNumber":266,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser \u003d new AuthorConfigCsvParser("},{"lineNumber":267,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_MULTIPLE_REPO_IN_ROW_SINGLE_BRANCH_PER_REPO_FILE);"},{"lineNumber":268,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e configs \u003d authorConfigCsvParser.parse();"},{"lineNumber":269,"author":{"gitId":"-"},"content":""},{"lineNumber":270,"author":{"gitId":"-"},"content":" Assertions.assertEquals(4, configs.size());"},{"lineNumber":271,"author":{"gitId":"-"},"content":""},{"lineNumber":272,"author":{"gitId":"-"},"content":" AuthorConfiguration config \u003d configs.get(0);"},{"lineNumber":273,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_BETA_LOCATION), config.getLocation());"},{"lineNumber":274,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_MASTER_BRANCH, config.getBranch());"},{"lineNumber":275,"author":{"gitId":"-"},"content":""},{"lineNumber":276,"author":{"gitId":"-"},"content":" config \u003d configs.get(1);"},{"lineNumber":277,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_BETA_LOCATION), config.getLocation());"},{"lineNumber":278,"author":{"gitId":"-"},"content":" Assertions.assertEquals(\"add-config-json\", config.getBranch());"},{"lineNumber":279,"author":{"gitId":"-"},"content":""},{"lineNumber":280,"author":{"gitId":"-"},"content":" config \u003d configs.get(2);"},{"lineNumber":281,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(\"https://github.com/reposense/RepoSense.git\"), config.getLocation());"},{"lineNumber":282,"author":{"gitId":"-"},"content":" Assertions.assertEquals(\"release\", config.getBranch());"},{"lineNumber":283,"author":{"gitId":"-"},"content":""},{"lineNumber":284,"author":{"gitId":"-"},"content":" config \u003d configs.get(3);"},{"lineNumber":285,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(\"/Users/sikai/RepoSense\"), config.getLocation());"},{"lineNumber":286,"author":{"gitId":"-"},"content":" Assertions.assertEquals(\"master\", config.getBranch());"},{"lineNumber":287,"author":{"gitId":"-"},"content":" }"},{"lineNumber":288,"author":{"gitId":"-"},"content":""},{"lineNumber":289,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":290,"author":{"gitId":"-"},"content":" public void authorConfig_multipleReposInRowMultipleBranchPerRepo_success() throws Exception {"},{"lineNumber":291,"author":{"gitId":"-"},"content":" AuthorConfigCsvParser authorConfigCsvParser \u003d new AuthorConfigCsvParser("},{"lineNumber":292,"author":{"gitId":"-"},"content":" AUTHOR_CONFIG_MULTIPLE_REPO_IN_ROW_MULTIPLE_BRANCH_PER_REPO_FILE);"},{"lineNumber":293,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e configs \u003d authorConfigCsvParser.parse();"},{"lineNumber":294,"author":{"gitId":"-"},"content":""},{"lineNumber":295,"author":{"gitId":"-"},"content":" Assertions.assertEquals(5, configs.size());"},{"lineNumber":296,"author":{"gitId":"-"},"content":""},{"lineNumber":297,"author":{"gitId":"-"},"content":" AuthorConfiguration config \u003d configs.get(0);"},{"lineNumber":298,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_BETA_LOCATION), config.getLocation());"},{"lineNumber":299,"author":{"gitId":"-"},"content":" Assertions.assertEquals(\"add-config-json\", config.getBranch());"},{"lineNumber":300,"author":{"gitId":"-"},"content":""},{"lineNumber":301,"author":{"gitId":"-"},"content":" config \u003d configs.get(1);"},{"lineNumber":302,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_BETA_LOCATION), config.getLocation());"},{"lineNumber":303,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_MASTER_BRANCH, config.getBranch());"},{"lineNumber":304,"author":{"gitId":"-"},"content":""},{"lineNumber":305,"author":{"gitId":"-"},"content":" config \u003d configs.get(2);"},{"lineNumber":306,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(\"/Users/sikai/RepoSense\"), config.getLocation());"},{"lineNumber":307,"author":{"gitId":"-"},"content":" Assertions.assertEquals(\"master\", config.getBranch());"},{"lineNumber":308,"author":{"gitId":"-"},"content":""},{"lineNumber":309,"author":{"gitId":"-"},"content":" config \u003d configs.get(3);"},{"lineNumber":310,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(\"/Users/sikai/RepoSense\"), config.getLocation());"},{"lineNumber":311,"author":{"gitId":"-"},"content":" Assertions.assertEquals(\"release\", config.getBranch());"},{"lineNumber":312,"author":{"gitId":"-"},"content":""},{"lineNumber":313,"author":{"gitId":"-"},"content":" config \u003d configs.get(4);"},{"lineNumber":314,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(\"/Users/sikai/RepoSense\"), config.getLocation());"},{"lineNumber":315,"author":{"gitId":"-"},"content":" Assertions.assertEquals(\"gh-pages\", config.getBranch());"},{"lineNumber":316,"author":{"gitId":"-"},"content":" }"},{"lineNumber":317,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":2,"-":315}},{"path":"src/test/java/reposense/parser/GroupConfigParserTest.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.parser;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static reposense.util.TestUtil.loadResource;"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Arrays;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Collections;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assertions;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;"},{"lineNumber":12,"author":{"gitId":"-"},"content":""},{"lineNumber":13,"author":{"gitId":"-"},"content":"import reposense.model.FileType;"},{"lineNumber":14,"author":{"gitId":"-"},"content":"import reposense.model.GroupConfiguration;"},{"lineNumber":15,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidCsvException;"},{"lineNumber":16,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidHeaderException;"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":"public class GroupConfigParserTest {"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private static final Path GROUP_CONFIG_MULTI_LOCATION_FILE \u003d loadResource(GroupConfigParserTest.class,"},{"lineNumber":20,"author":{"gitId":"-"},"content":" \"GroupConfigParserTest/groupconfig_multipleLocation_test.csv\");"},{"lineNumber":21,"author":{"gitId":"-"},"content":" private static final Path GROUP_CONFIG_EMPTY_LOCATION_FILE \u003d loadResource(GroupConfigParserTest.class,"},{"lineNumber":22,"author":{"gitId":"-"},"content":" \"GroupConfigParserTest/groupconfig_emptyLocation_test.csv\");"},{"lineNumber":23,"author":{"gitId":"-"},"content":" private static final Path GROUP_CONFIG_DIFFERENT_COLUMN_ORDER_FILE \u003d loadResource(GroupConfigParserTest.class,"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \"GroupConfigParserTest/groupconfig_differentColumnOrder_test.csv\");"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final Path GROUP_CONFIG_MISSING_OPTIONAL_HEADER_FILE \u003d loadResource(GroupConfigParserTest.class,"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \"GroupConfigParserTest/groupconfig_missingOptionalHeader_test.csv\");"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final Path GROUP_CONFIG_MISSING_MANDATORY_HEADER_FILE \u003d loadResource(GroupConfigParserTest.class,"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \"GroupConfigParserTest/groupconfig_missingMandatoryHeader_test.csv\");"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private static final Path GROUP_CONFIG_UNKNOWN_HEADER_FILE \u003d loadResource(GroupConfigParserTest.class,"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \"GroupConfigParserTest/groupconfig_unknownHeader_test.csv\");"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_BETA_LOCATION \u003d \"https://github.com/reposense/testrepo-Beta.git\";"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final List\u003cFileType\u003e TEST_REPO_BETA_GROUPS \u003d Arrays.asList("},{"lineNumber":34,"author":{"gitId":"-"},"content":" new FileType(\"Code\", Arrays.asList(\"**/*.java\", \"**/*.py\")),"},{"lineNumber":35,"author":{"gitId":"-"},"content":" new FileType(\"Docs\", Collections.singletonList(\"docs/**\")));"},{"lineNumber":36,"author":{"gitId":"-"},"content":""},{"lineNumber":37,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_DELTA_LOCATION \u003d \"https://github.com/reposense/testrepo-Delta.git\";"},{"lineNumber":38,"author":{"gitId":"-"},"content":" private static final List\u003cFileType\u003e TEST_REPO_DELTA_GROUPS \u003d Arrays.asList("},{"lineNumber":39,"author":{"gitId":"-"},"content":" new FileType(\"Main\", Collections.singletonList(\"src/main/**\")),"},{"lineNumber":40,"author":{"gitId":"-"},"content":" new FileType(\"Test\", Arrays.asList(\"src/test/**\", \"src/systest/**\")));"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":43,"author":{"gitId":"-"},"content":" public void groupConfig_emptyLocation_success() throws Exception {"},{"lineNumber":44,"author":{"gitId":"-"},"content":" GroupConfigCsvParser groupConfigCsvParser \u003d new GroupConfigCsvParser(GROUP_CONFIG_EMPTY_LOCATION_FILE);"},{"lineNumber":45,"author":{"gitId":"-"},"content":" List\u003cGroupConfiguration\u003e groupConfigs \u003d groupConfigCsvParser.parse();"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":" Assertions.assertEquals(2, groupConfigs.size());"},{"lineNumber":48,"author":{"gitId":"-"},"content":""},{"lineNumber":49,"author":{"gitId":"-"},"content":" GroupConfiguration actualReposenseConfig \u003d groupConfigs.get(0);"},{"lineNumber":50,"author":{"gitId":"-"},"content":" Assertions.assertEquals(2, actualReposenseConfig.getGroupsList().size());"},{"lineNumber":51,"author":{"gitId":"-"},"content":""},{"lineNumber":52,"author":{"gitId":"-"},"content":" GroupConfiguration actualEmptyLocationConfig \u003d groupConfigs.get(1);"},{"lineNumber":53,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, actualEmptyLocationConfig.getGroupsList().size());"},{"lineNumber":54,"author":{"gitId":"-"},"content":" }"},{"lineNumber":55,"author":{"gitId":"-"},"content":""},{"lineNumber":56,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":57,"author":{"gitId":"-"},"content":" public void groupConfig_multipleLocations_success() throws Exception {"},{"lineNumber":58,"author":{"gitId":"-"},"content":" GroupConfigCsvParser groupConfigCsvParser \u003d new GroupConfigCsvParser(GROUP_CONFIG_MULTI_LOCATION_FILE);"},{"lineNumber":59,"author":{"gitId":"-"},"content":" List\u003cGroupConfiguration\u003e groupConfigs \u003d groupConfigCsvParser.parse();"},{"lineNumber":60,"author":{"gitId":"-"},"content":""},{"lineNumber":61,"author":{"gitId":"-"},"content":" Assertions.assertEquals(2, groupConfigs.size());"},{"lineNumber":62,"author":{"gitId":"-"},"content":""},{"lineNumber":63,"author":{"gitId":"-"},"content":" GroupConfiguration actualBetaConfig \u003d groupConfigs.get(0);"},{"lineNumber":64,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_LOCATION, actualBetaConfig.getLocation().toString());"},{"lineNumber":65,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_GROUPS, actualBetaConfig.getGroupsList());"},{"lineNumber":66,"author":{"gitId":"-"},"content":""},{"lineNumber":67,"author":{"gitId":"-"},"content":" GroupConfiguration actualDeltaConfig \u003d groupConfigs.get(1);"},{"lineNumber":68,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_DELTA_LOCATION, actualDeltaConfig.getLocation().toString());"},{"lineNumber":69,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_DELTA_GROUPS, actualDeltaConfig.getGroupsList());"},{"lineNumber":70,"author":{"gitId":"-"},"content":" }"},{"lineNumber":71,"author":{"gitId":"-"},"content":""},{"lineNumber":72,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":73,"author":{"gitId":"-"},"content":" public void groupConfig_differentColumnOrder_success() throws Exception {"},{"lineNumber":74,"author":{"gitId":"-"},"content":" GroupConfigCsvParser groupConfigCsvParser \u003d new GroupConfigCsvParser(GROUP_CONFIG_DIFFERENT_COLUMN_ORDER_FILE);"},{"lineNumber":75,"author":{"gitId":"-"},"content":" List\u003cGroupConfiguration\u003e groupConfigs \u003d groupConfigCsvParser.parse();"},{"lineNumber":76,"author":{"gitId":"-"},"content":""},{"lineNumber":77,"author":{"gitId":"-"},"content":" Assertions.assertEquals(2, groupConfigs.size());"},{"lineNumber":78,"author":{"gitId":"-"},"content":""},{"lineNumber":79,"author":{"gitId":"-"},"content":" GroupConfiguration actualBetaConfig \u003d groupConfigs.get(0);"},{"lineNumber":80,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_LOCATION, actualBetaConfig.getLocation().toString());"},{"lineNumber":81,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_GROUPS, actualBetaConfig.getGroupsList());"},{"lineNumber":82,"author":{"gitId":"-"},"content":""},{"lineNumber":83,"author":{"gitId":"-"},"content":" GroupConfiguration actualDeltaConfig \u003d groupConfigs.get(1);"},{"lineNumber":84,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_DELTA_LOCATION, actualDeltaConfig.getLocation().toString());"},{"lineNumber":85,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_DELTA_GROUPS, actualDeltaConfig.getGroupsList());"},{"lineNumber":86,"author":{"gitId":"-"},"content":" }"},{"lineNumber":87,"author":{"gitId":"-"},"content":""},{"lineNumber":88,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":89,"author":{"gitId":"-"},"content":" public void groupConfig_missingOptionalHeader_success() throws Exception {"},{"lineNumber":90,"author":{"gitId":"-"},"content":" GroupConfigCsvParser groupConfigCsvParser \u003d new GroupConfigCsvParser(GROUP_CONFIG_MISSING_OPTIONAL_HEADER_FILE);"},{"lineNumber":91,"author":{"gitId":"-"},"content":" List\u003cGroupConfiguration\u003e groupConfigs \u003d groupConfigCsvParser.parse();"},{"lineNumber":92,"author":{"gitId":"-"},"content":""},{"lineNumber":93,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, groupConfigs.size());"},{"lineNumber":94,"author":{"gitId":"-"},"content":""},{"lineNumber":95,"author":{"gitId":"-"},"content":" Assertions.assertEquals(3, groupConfigs.get(0).getGroupsList().size());"},{"lineNumber":96,"author":{"gitId":"-"},"content":" }"},{"lineNumber":97,"author":{"gitId":"-"},"content":""},{"lineNumber":98,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":99,"author":{"gitId":"-"},"content":" public void groupConfig_missingMandatoryHeader_throwsInvalidCsvException() throws Exception {"},{"lineNumber":100,"author":{"gitId":"-"},"content":" GroupConfigCsvParser groupConfigCsvParser \u003d new GroupConfigCsvParser("},{"lineNumber":101,"author":{"gitId":"-"},"content":" GROUP_CONFIG_MISSING_MANDATORY_HEADER_FILE);"},{"lineNumber":102,"author":{"gitId":"-"},"content":" Assertions.assertThrows(InvalidCsvException.class, () -\u003e groupConfigCsvParser.parse());"},{"lineNumber":103,"author":{"gitId":"-"},"content":" }"},{"lineNumber":104,"author":{"gitId":"-"},"content":""},{"lineNumber":105,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":106,"author":{"gitId":"-"},"content":" public void groupConfig_unknownHeader_throwsInvalidHeaderException() throws Exception {"},{"lineNumber":107,"author":{"gitId":"-"},"content":" GroupConfigCsvParser groupConfigCsvParser \u003d new GroupConfigCsvParser("},{"lineNumber":108,"author":{"gitId":"-"},"content":" GROUP_CONFIG_UNKNOWN_HEADER_FILE);"},{"lineNumber":109,"author":{"gitId":"-"},"content":" Assertions.assertThrows(InvalidHeaderException.class, () -\u003e groupConfigCsvParser.parse());"},{"lineNumber":110,"author":{"gitId":"-"},"content":" }"},{"lineNumber":111,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":2,"-":109}},{"path":"src/test/java/reposense/parser/RepoConfigParserTest.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.parser;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.apache.tools.ant.types.Commandline.translateCommandline;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static reposense.model.RepoConfiguration.DEFAULT_FILE_SIZE_LIMIT;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import static reposense.util.TestUtil.loadResource;"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.ArrayList;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Arrays;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assertions;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;"},{"lineNumber":14,"author":{"gitId":"-"},"content":""},{"lineNumber":15,"author":{"gitId":"-"},"content":"import reposense.model.Author;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import reposense.model.AuthorConfiguration;"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import reposense.model.CliArguments;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import reposense.model.CommitHash;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import reposense.model.FileType;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import reposense.model.RepoConfiguration;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import reposense.model.RepoLocation;"},{"lineNumber":22,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidCsvException;"},{"lineNumber":23,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidHeaderException;"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import reposense.util.InputBuilder;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import reposense.util.TestUtil;"},{"lineNumber":26,"author":{"gitId":"-"},"content":""},{"lineNumber":27,"author":{"gitId":"-"},"content":"public class RepoConfigParserTest {"},{"lineNumber":28,"author":{"gitId":"-"},"content":" private static final Path TEST_CONFIG_FOLDER \u003d loadResource(RepoConfigParserTest.class, \"repoconfig_merge_test\");"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private static final Path TEST_EMPTY_BRANCH_CONFIG_FOLDER \u003d loadResource(RepoConfigParserTest.class,"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \"repoconfig_empty_branch_test\");"},{"lineNumber":31,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_NO_SPECIAL_CHARACTER_FILE \u003d loadResource(RepoConfigParserTest.class,"},{"lineNumber":32,"author":{"gitId":"-"},"content":" \"RepoConfigParserTest/repoconfig_noSpecialCharacter_test.csv\");"},{"lineNumber":33,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_OVERRIDE_KEYWORD_FILE \u003d loadResource(RepoConfigParserTest.class,"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \"RepoConfigParserTest/repoconfig_overrideKeyword_test.csv\");"},{"lineNumber":35,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_REDUNDANT_LINES_FILE \u003d loadResource(RepoConfigParserTest.class,"},{"lineNumber":36,"author":{"gitId":"-"},"content":" \"RepoConfigParserTest/require_trailing_whitespaces/repoconfig_redundantLines_test.csv\");"},{"lineNumber":37,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_UNRECOGNIZED_VALUES_FOR_YES_KEYWORD_HEADERS_FILE \u003d"},{"lineNumber":38,"author":{"gitId":"-"},"content":" loadResource(RepoConfigParserTest.class,"},{"lineNumber":39,"author":{"gitId":"-"},"content":" \"RepoConfigParserTest/repoconfig_unrecognizedValuesForYesKeywordHeaders_test.csv\");"},{"lineNumber":40,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_DUPLICATE_HEADERS_CASE_SENSITIVE_FILE \u003d"},{"lineNumber":41,"author":{"gitId":"-"},"content":" loadResource(RepoConfigParserTest.class,"},{"lineNumber":42,"author":{"gitId":"-"},"content":" \"RepoConfigParserTest/repoconfig_duplicateHeadersCaseSensitive_test.csv\");"},{"lineNumber":43,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_DUPLICATE_HEADERS_CASE_INSENSITIVE_FILE \u003d"},{"lineNumber":44,"author":{"gitId":"-"},"content":" loadResource(RepoConfigParserTest.class,"},{"lineNumber":45,"author":{"gitId":"-"},"content":" \"RepoConfigParserTest/repoconfig_duplicateHeadersCaseInsensitive_test.csv\");"},{"lineNumber":46,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_DIFFERENT_COLUMN_ORDER_FILE \u003d loadResource(RepoConfigParserTest.class,"},{"lineNumber":47,"author":{"gitId":"-"},"content":" \"RepoConfigParserTest/repoconfig_differentColumnOrder_test.csv\");"},{"lineNumber":48,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_OPTIONAL_HEADER_MISSING_FILE \u003d loadResource(RepoConfigParserTest.class,"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \"RepoConfigParserTest/repoconfig_missingOptionalHeader_test.csv\");"},{"lineNumber":50,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_MANDATORY_HEADER_MISSING_FILE \u003d loadResource(RepoConfigParserTest.class,"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \"RepoConfigParserTest/repoconfig_missingMandatoryHeader_test.csv\");"},{"lineNumber":52,"author":{"gitId":"-"},"content":" private static final Path MERGE_EMPTY_LOCATION_FOLDER \u003d loadResource(RepoConfigParserTest.class,"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \"RepoConfigParserTest/repoconfig_merge_empty_location_test\");"},{"lineNumber":54,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_UNKNOWN_HEADER_FILE \u003d loadResource(RepoConfigParserTest.class,"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \"RepoConfigParserTest/repoconfig_unknownHeaders_test.csv\");"},{"lineNumber":56,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_INVALID_FILE_SIZE_LIMIT \u003d loadResource(RepoConfigParserTest.class,"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \"RepoConfigParserTest/repoconfig_invalidFileSizeLimit_test.csv\");"},{"lineNumber":58,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_IGNORE_FILE_SIZE_LIMIT \u003d loadResource(RepoConfigParserTest.class,"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \"RepoConfigParserTest/repoconfig_ignoreFileSizeLimit_test.csv\");"},{"lineNumber":60,"author":{"gitId":"-"},"content":" private static final Path REPO_CONFIG_ZERO_VALID_RECORDS \u003d loadResource(RepoConfigParserTest.class,"},{"lineNumber":61,"author":{"gitId":"-"},"content":" \"CsvParserTest/repoconfig_zeroValidRecords_test.csv\");"},{"lineNumber":62,"author":{"gitId":"-"},"content":""},{"lineNumber":63,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_BETA_LOCATION \u003d \"https://github.com/reposense/testrepo-Beta.git\";"},{"lineNumber":64,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_BETA_MASTER_BRANCH \u003d \"master\";"},{"lineNumber":65,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_BETA_ADD_CONFIG_JSON_BRANCH \u003d \"add-config-json\";"},{"lineNumber":66,"author":{"gitId":"-"},"content":""},{"lineNumber":67,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_DELTA_LOCATION \u003d \"https://github.com/reposense/testrepo-Delta.git\";"},{"lineNumber":68,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_DELTA_BRANCH \u003d \"HEAD\";"},{"lineNumber":69,"author":{"gitId":"-"},"content":" private static final List\u003cFileType\u003e TEST_REPO_DELTA_FORMATS \u003d"},{"lineNumber":70,"author":{"gitId":"-"},"content":" FileType.convertFormatStringsToFileTypes(Arrays.asList(\"java\", \"fxml\"));"},{"lineNumber":71,"author":{"gitId":"-"},"content":""},{"lineNumber":72,"author":{"gitId":"-"},"content":" private static final List\u003cFileType\u003e TEST_REPO_BETA_CONFIG_FORMATS \u003d"},{"lineNumber":73,"author":{"gitId":"-"},"content":" FileType.convertFormatStringsToFileTypes(Arrays.asList(\"java\", \"adoc\", \"md\"));"},{"lineNumber":74,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e TEST_REPO_BETA_CONFIG_IGNORED_COMMITS \u003d"},{"lineNumber":75,"author":{"gitId":"-"},"content":" Arrays.asList(\"abcde12345\", \"67890fdecba\");"},{"lineNumber":76,"author":{"gitId":"-"},"content":""},{"lineNumber":77,"author":{"gitId":"-"},"content":" private static final int FILE_SIZE_LIMIT_VALUE \u003d 100000;"},{"lineNumber":78,"author":{"gitId":"-"},"content":""},{"lineNumber":79,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_CHARLIE_LOCATION \u003d \"https://github.com/reposense/testrepo-Charlie.git\";"},{"lineNumber":80,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_CHARLIE_BRANCH \u003d \"HEAD\";"},{"lineNumber":81,"author":{"gitId":"-"},"content":""},{"lineNumber":82,"author":{"gitId":"-"},"content":" private static final Author FIRST_AUTHOR \u003d new Author(\"nbriannl\");"},{"lineNumber":83,"author":{"gitId":"-"},"content":" private static final Author SECOND_AUTHOR \u003d new Author(\"zacharytang\");"},{"lineNumber":84,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e SECOND_AUTHOR_ALIASES \u003d Arrays.asList(\"Zachary Tang\");"},{"lineNumber":85,"author":{"gitId":"-"},"content":""},{"lineNumber":86,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e REPO_LEVEL_GLOB_LIST \u003d Arrays.asList(\"collated**\");"},{"lineNumber":87,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e FIRST_AUTHOR_GLOB_LIST \u003d Arrays.asList(\"**.java\", \"collated**\");"},{"lineNumber":88,"author":{"gitId":"-"},"content":" private static final List\u003cString\u003e SECOND_AUTHOR_GLOB_LIST \u003d Arrays.asList(\"**.doc\", \"collated**\");"},{"lineNumber":89,"author":{"gitId":"-"},"content":""},{"lineNumber":90,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":91,"author":{"gitId":"-"},"content":" public void repoConfig_noSpecialCharacter_success() throws Exception {"},{"lineNumber":92,"author":{"gitId":"-"},"content":" RepoConfigCsvParser repoConfigCsvParser \u003d new RepoConfigCsvParser(REPO_CONFIG_NO_SPECIAL_CHARACTER_FILE);"},{"lineNumber":93,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e configs \u003d repoConfigCsvParser.parse();"},{"lineNumber":94,"author":{"gitId":"-"},"content":""},{"lineNumber":95,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, configs.size());"},{"lineNumber":96,"author":{"gitId":"-"},"content":""},{"lineNumber":97,"author":{"gitId":"-"},"content":" RepoConfiguration config \u003d configs.get(0);"},{"lineNumber":98,"author":{"gitId":"-"},"content":""},{"lineNumber":99,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_BETA_LOCATION), config.getLocation());"},{"lineNumber":100,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_MASTER_BRANCH, config.getBranch());"},{"lineNumber":101,"author":{"gitId":"-"},"content":""},{"lineNumber":102,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_CONFIG_FORMATS, config.getFileTypeManager().getFormats());"},{"lineNumber":103,"author":{"gitId":"-"},"content":""},{"lineNumber":104,"author":{"gitId":"-"},"content":" Assertions.assertTrue(config.isStandaloneConfigIgnored());"},{"lineNumber":105,"author":{"gitId":"-"},"content":""},{"lineNumber":106,"author":{"gitId":"-"},"content":" Assertions.assertEquals(config.getIgnoreCommitList(),"},{"lineNumber":107,"author":{"gitId":"-"},"content":" CommitHash.convertStringsToCommits(TEST_REPO_BETA_CONFIG_IGNORED_COMMITS));"},{"lineNumber":108,"author":{"gitId":"-"},"content":" Assertions.assertEquals(config.getFileSizeLimit(), FILE_SIZE_LIMIT_VALUE);"},{"lineNumber":109,"author":{"gitId":"-"},"content":""},{"lineNumber":110,"author":{"gitId":"-"},"content":" Assertions.assertTrue(config.isShallowCloningPerformed());"},{"lineNumber":111,"author":{"gitId":"-"},"content":""},{"lineNumber":112,"author":{"gitId":"-"},"content":" Assertions.assertFalse(config.isFormatsOverriding());"},{"lineNumber":113,"author":{"gitId":"-"},"content":" Assertions.assertFalse(config.isIgnoreGlobListOverriding());"},{"lineNumber":114,"author":{"gitId":"-"},"content":" Assertions.assertFalse(config.isIgnoreCommitListOverriding());"},{"lineNumber":115,"author":{"gitId":"-"},"content":" Assertions.assertFalse(config.isFileSizeLimitOverriding());"},{"lineNumber":116,"author":{"gitId":"-"},"content":" Assertions.assertFalse(config.isFileSizeLimitIgnored());"},{"lineNumber":117,"author":{"gitId":"-"},"content":" Assertions.assertTrue(config.isIgnoredFileAnalysisSkipped());"},{"lineNumber":118,"author":{"gitId":"-"},"content":" }"},{"lineNumber":119,"author":{"gitId":"-"},"content":""},{"lineNumber":120,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":121,"author":{"gitId":"-"},"content":" public void merge_twoRepoConfigs_success() throws Exception {"},{"lineNumber":122,"author":{"gitId":"-"},"content":" FIRST_AUTHOR.setIgnoreGlobList(FIRST_AUTHOR_GLOB_LIST);"},{"lineNumber":123,"author":{"gitId":"-"},"content":" SECOND_AUTHOR.setIgnoreGlobList(SECOND_AUTHOR_GLOB_LIST);"},{"lineNumber":124,"author":{"gitId":"-"},"content":" SECOND_AUTHOR.setAuthorAliases(SECOND_AUTHOR_ALIASES);"},{"lineNumber":125,"author":{"gitId":"-"},"content":""},{"lineNumber":126,"author":{"gitId":"-"},"content":" List\u003cAuthor\u003e expectedAuthors \u003d new ArrayList\u003c\u003e();"},{"lineNumber":127,"author":{"gitId":"-"},"content":" expectedAuthors.add(FIRST_AUTHOR);"},{"lineNumber":128,"author":{"gitId":"-"},"content":" expectedAuthors.add(SECOND_AUTHOR);"},{"lineNumber":129,"author":{"gitId":"-"},"content":""},{"lineNumber":130,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration firstRepo \u003d new RepoConfiguration.Builder()"},{"lineNumber":131,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_BETA_LOCATION))"},{"lineNumber":132,"author":{"gitId":"asdfghjkxd"},"content":" .branch(TEST_REPO_BETA_MASTER_BRANCH)"},{"lineNumber":133,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":134,"author":{"gitId":"-"},"content":" firstRepo.setAuthorList(expectedAuthors);"},{"lineNumber":135,"author":{"gitId":"-"},"content":" firstRepo.setAuthorDisplayName(FIRST_AUTHOR, \"Nbr\");"},{"lineNumber":136,"author":{"gitId":"-"},"content":" firstRepo.setAuthorDisplayName(SECOND_AUTHOR, \"Zac\");"},{"lineNumber":137,"author":{"gitId":"-"},"content":" firstRepo.addAuthorNamesToAuthorMapEntry(SECOND_AUTHOR, Arrays.asList(\"Zachary Tang\"));"},{"lineNumber":138,"author":{"gitId":"-"},"content":" firstRepo.setIgnoreGlobList(REPO_LEVEL_GLOB_LIST);"},{"lineNumber":139,"author":{"gitId":"-"},"content":""},{"lineNumber":140,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration secondRepo \u003d new RepoConfiguration.Builder()"},{"lineNumber":141,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_BETA_LOCATION))"},{"lineNumber":142,"author":{"gitId":"asdfghjkxd"},"content":" .branch(TEST_REPO_BETA_ADD_CONFIG_JSON_BRANCH)"},{"lineNumber":143,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":144,"author":{"gitId":"-"},"content":" secondRepo.setAuthorList(Arrays.asList(SECOND_AUTHOR));"},{"lineNumber":145,"author":{"gitId":"-"},"content":" secondRepo.setAuthorDisplayName(SECOND_AUTHOR, \"Zac\");"},{"lineNumber":146,"author":{"gitId":"-"},"content":" secondRepo.addAuthorNamesToAuthorMapEntry(SECOND_AUTHOR, Arrays.asList(\"Zachary Tang\"));"},{"lineNumber":147,"author":{"gitId":"-"},"content":" secondRepo.setIgnoreGlobList(REPO_LEVEL_GLOB_LIST);"},{"lineNumber":148,"author":{"gitId":"-"},"content":""},{"lineNumber":149,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(TEST_CONFIG_FOLDER).build();"},{"lineNumber":150,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":151,"author":{"gitId":"-"},"content":""},{"lineNumber":152,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":153,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":154,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e authorConfigs \u003d"},{"lineNumber":155,"author":{"gitId":"-"},"content":" new AuthorConfigCsvParser(cliArguments.getAuthorConfigFilePath()).parse();"},{"lineNumber":156,"author":{"gitId":"-"},"content":" RepoConfiguration.merge(actualConfigs, authorConfigs);"},{"lineNumber":157,"author":{"gitId":"-"},"content":""},{"lineNumber":158,"author":{"gitId":"-"},"content":" Assertions.assertEquals(2, actualConfigs.size());"},{"lineNumber":159,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(firstRepo, actualConfigs.get(0));"},{"lineNumber":160,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(secondRepo, actualConfigs.get(1));"},{"lineNumber":161,"author":{"gitId":"-"},"content":" }"},{"lineNumber":162,"author":{"gitId":"-"},"content":""},{"lineNumber":163,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":164,"author":{"gitId":"-"},"content":" public void merge_emptyLocation_success() throws Exception {"},{"lineNumber":165,"author":{"gitId":"-"},"content":" FIRST_AUTHOR.setIgnoreGlobList(FIRST_AUTHOR_GLOB_LIST);"},{"lineNumber":166,"author":{"gitId":"-"},"content":" SECOND_AUTHOR.setIgnoreGlobList(REPO_LEVEL_GLOB_LIST);"},{"lineNumber":167,"author":{"gitId":"-"},"content":" SECOND_AUTHOR.setAuthorAliases(SECOND_AUTHOR_ALIASES);"},{"lineNumber":168,"author":{"gitId":"-"},"content":""},{"lineNumber":169,"author":{"gitId":"-"},"content":" List\u003cAuthor\u003e expectedBetaAuthors \u003d new ArrayList\u003c\u003e();"},{"lineNumber":170,"author":{"gitId":"-"},"content":" expectedBetaAuthors.add(FIRST_AUTHOR);"},{"lineNumber":171,"author":{"gitId":"-"},"content":" expectedBetaAuthors.add(SECOND_AUTHOR);"},{"lineNumber":172,"author":{"gitId":"-"},"content":""},{"lineNumber":173,"author":{"gitId":"-"},"content":" List\u003cAuthor\u003e expectedDeltaAuthors \u003d new ArrayList\u003c\u003e();"},{"lineNumber":174,"author":{"gitId":"-"},"content":" expectedDeltaAuthors.add(FIRST_AUTHOR);"},{"lineNumber":175,"author":{"gitId":"-"},"content":""},{"lineNumber":176,"author":{"gitId":"-"},"content":" RepoConfiguration expectedBetaConfig \u003d"},{"lineNumber":177,"author":{"gitId":"asdfghjkxd"},"content":" new RepoConfiguration.Builder()"},{"lineNumber":178,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_BETA_LOCATION))"},{"lineNumber":179,"author":{"gitId":"asdfghjkxd"},"content":" .branch(TEST_REPO_BETA_MASTER_BRANCH)"},{"lineNumber":180,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":181,"author":{"gitId":"-"},"content":" expectedBetaConfig.setAuthorList(expectedBetaAuthors);"},{"lineNumber":182,"author":{"gitId":"-"},"content":" expectedBetaConfig.setAuthorDisplayName(FIRST_AUTHOR, \"Nbr\");"},{"lineNumber":183,"author":{"gitId":"-"},"content":" expectedBetaConfig.setAuthorDisplayName(SECOND_AUTHOR, \"Zac\");"},{"lineNumber":184,"author":{"gitId":"-"},"content":" expectedBetaConfig.addAuthorNamesToAuthorMapEntry(SECOND_AUTHOR, Arrays.asList(\"Zachary Tang\"));"},{"lineNumber":185,"author":{"gitId":"-"},"content":" expectedBetaConfig.setIgnoreGlobList(REPO_LEVEL_GLOB_LIST);"},{"lineNumber":186,"author":{"gitId":"-"},"content":" expectedBetaConfig.setIsShallowCloningPerformed(true);"},{"lineNumber":187,"author":{"gitId":"-"},"content":""},{"lineNumber":188,"author":{"gitId":"-"},"content":" RepoConfiguration expectedDeltaConfig \u003d"},{"lineNumber":189,"author":{"gitId":"asdfghjkxd"},"content":" new RepoConfiguration.Builder()"},{"lineNumber":190,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_DELTA_LOCATION))"},{"lineNumber":191,"author":{"gitId":"asdfghjkxd"},"content":" .branch(TEST_REPO_DELTA_BRANCH)"},{"lineNumber":192,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":193,"author":{"gitId":"-"},"content":" expectedDeltaConfig.setAuthorList(expectedDeltaAuthors);"},{"lineNumber":194,"author":{"gitId":"-"},"content":" expectedDeltaConfig.setAuthorDisplayName(FIRST_AUTHOR, \"Nbr\");"},{"lineNumber":195,"author":{"gitId":"-"},"content":" expectedDeltaConfig.setStandaloneConfigIgnored(true);"},{"lineNumber":196,"author":{"gitId":"-"},"content":" expectedDeltaConfig.setFormats(TEST_REPO_DELTA_FORMATS);"},{"lineNumber":197,"author":{"gitId":"-"},"content":""},{"lineNumber":198,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e expectedConfigs \u003d new ArrayList\u003c\u003e();"},{"lineNumber":199,"author":{"gitId":"-"},"content":" expectedConfigs.add(expectedBetaConfig);"},{"lineNumber":200,"author":{"gitId":"-"},"content":" expectedConfigs.add(expectedDeltaConfig);"},{"lineNumber":201,"author":{"gitId":"-"},"content":""},{"lineNumber":202,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(MERGE_EMPTY_LOCATION_FOLDER).build();"},{"lineNumber":203,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":204,"author":{"gitId":"-"},"content":""},{"lineNumber":205,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":206,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":207,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e authorConfigs \u003d"},{"lineNumber":208,"author":{"gitId":"-"},"content":" new AuthorConfigCsvParser(cliArguments.getAuthorConfigFilePath()).parse();"},{"lineNumber":209,"author":{"gitId":"-"},"content":" RepoConfiguration.merge(actualConfigs, authorConfigs);"},{"lineNumber":210,"author":{"gitId":"-"},"content":""},{"lineNumber":211,"author":{"gitId":"-"},"content":" Assertions.assertEquals(2, actualConfigs.size());"},{"lineNumber":212,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedConfigs, actualConfigs);"},{"lineNumber":213,"author":{"gitId":"-"},"content":""},{"lineNumber":214,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(expectedConfigs.get(0), actualConfigs.get(0));"},{"lineNumber":215,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(expectedConfigs.get(1), actualConfigs.get(1));"},{"lineNumber":216,"author":{"gitId":"-"},"content":" }"},{"lineNumber":217,"author":{"gitId":"-"},"content":""},{"lineNumber":218,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":219,"author":{"gitId":"-"},"content":" public void repoConfig_defaultBranch_success() throws Exception {"},{"lineNumber":220,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration expectedConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":221,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_BETA_LOCATION))"},{"lineNumber":222,"author":{"gitId":"asdfghjkxd"},"content":" .branch(RepoConfiguration.DEFAULT_BRANCH)"},{"lineNumber":223,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":224,"author":{"gitId":"-"},"content":""},{"lineNumber":225,"author":{"gitId":"-"},"content":" String input \u003d new InputBuilder().addConfig(TEST_EMPTY_BRANCH_CONFIG_FOLDER).build();"},{"lineNumber":226,"author":{"gitId":"-"},"content":" CliArguments cliArguments \u003d ArgsParser.parse(translateCommandline(input));"},{"lineNumber":227,"author":{"gitId":"-"},"content":""},{"lineNumber":228,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e actualConfigs \u003d"},{"lineNumber":229,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(cliArguments.getRepoConfigFilePath()).parse();"},{"lineNumber":230,"author":{"gitId":"-"},"content":" List\u003cAuthorConfiguration\u003e authorConfigs \u003d"},{"lineNumber":231,"author":{"gitId":"-"},"content":" new AuthorConfigCsvParser(cliArguments.getAuthorConfigFilePath()).parse();"},{"lineNumber":232,"author":{"gitId":"-"},"content":" RepoConfiguration.merge(actualConfigs, authorConfigs);"},{"lineNumber":233,"author":{"gitId":"-"},"content":""},{"lineNumber":234,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, actualConfigs.size());"},{"lineNumber":235,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedConfig.getBranch(), actualConfigs.get(0).getBranch());"},{"lineNumber":236,"author":{"gitId":"-"},"content":" Assertions.assertEquals(expectedConfig.getBranch(), authorConfigs.get(0).getBranch());"},{"lineNumber":237,"author":{"gitId":"-"},"content":" }"},{"lineNumber":238,"author":{"gitId":"-"},"content":""},{"lineNumber":239,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":240,"author":{"gitId":"-"},"content":" public void repoConfig_overrideKeyword_success() throws Exception {"},{"lineNumber":241,"author":{"gitId":"-"},"content":" RepoConfigCsvParser repoConfigCsvParser \u003d new RepoConfigCsvParser(REPO_CONFIG_OVERRIDE_KEYWORD_FILE);"},{"lineNumber":242,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e configs \u003d repoConfigCsvParser.parse();"},{"lineNumber":243,"author":{"gitId":"-"},"content":" RepoConfiguration config \u003d configs.get(0);"},{"lineNumber":244,"author":{"gitId":"-"},"content":""},{"lineNumber":245,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, configs.size());"},{"lineNumber":246,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_BETA_LOCATION), config.getLocation());"},{"lineNumber":247,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_MASTER_BRANCH, config.getBranch());"},{"lineNumber":248,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_CONFIG_FORMATS, config.getFileTypeManager().getFormats());"},{"lineNumber":249,"author":{"gitId":"-"},"content":" Assertions.assertFalse(config.isStandaloneConfigIgnored());"},{"lineNumber":250,"author":{"gitId":"-"},"content":" Assertions.assertEquals(CommitHash.convertStringsToCommits(TEST_REPO_BETA_CONFIG_IGNORED_COMMITS),"},{"lineNumber":251,"author":{"gitId":"-"},"content":" config.getIgnoreCommitList());"},{"lineNumber":252,"author":{"gitId":"-"},"content":" Assertions.assertEquals(FILE_SIZE_LIMIT_VALUE, config.getFileSizeLimit());"},{"lineNumber":253,"author":{"gitId":"-"},"content":""},{"lineNumber":254,"author":{"gitId":"-"},"content":" Assertions.assertTrue(config.isFormatsOverriding());"},{"lineNumber":255,"author":{"gitId":"-"},"content":" Assertions.assertTrue(config.isIgnoreGlobListOverriding());"},{"lineNumber":256,"author":{"gitId":"-"},"content":" Assertions.assertTrue(config.isIgnoreCommitListOverriding());"},{"lineNumber":257,"author":{"gitId":"-"},"content":" Assertions.assertTrue(config.isFileSizeLimitOverriding());"},{"lineNumber":258,"author":{"gitId":"-"},"content":" }"},{"lineNumber":259,"author":{"gitId":"-"},"content":""},{"lineNumber":260,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":261,"author":{"gitId":"-"},"content":" public void repoConfig_redundantLines_success() throws Exception {"},{"lineNumber":262,"author":{"gitId":"-"},"content":" RepoConfigCsvParser repoConfigCsvParser \u003d new RepoConfigCsvParser(REPO_CONFIG_REDUNDANT_LINES_FILE);"},{"lineNumber":263,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e configs \u003d repoConfigCsvParser.parse();"},{"lineNumber":264,"author":{"gitId":"-"},"content":""},{"lineNumber":265,"author":{"gitId":"-"},"content":" Assertions.assertEquals(3, configs.size());"},{"lineNumber":266,"author":{"gitId":"-"},"content":" RepoConfiguration betaConfig \u003d configs.get(0);"},{"lineNumber":267,"author":{"gitId":"-"},"content":" RepoConfiguration charlieConfig \u003d configs.get(1);"},{"lineNumber":268,"author":{"gitId":"-"},"content":" RepoConfiguration deltaConfig \u003d configs.get(2);"},{"lineNumber":269,"author":{"gitId":"-"},"content":""},{"lineNumber":270,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_BETA_LOCATION), betaConfig.getLocation());"},{"lineNumber":271,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_MASTER_BRANCH, betaConfig.getBranch());"},{"lineNumber":272,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_CHARLIE_LOCATION), charlieConfig.getLocation());"},{"lineNumber":273,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_CHARLIE_BRANCH, charlieConfig.getBranch());"},{"lineNumber":274,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_DELTA_LOCATION), deltaConfig.getLocation());"},{"lineNumber":275,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_DELTA_BRANCH, deltaConfig.getBranch());"},{"lineNumber":276,"author":{"gitId":"-"},"content":" Assertions.assertTrue(deltaConfig.isStandaloneConfigIgnored());"},{"lineNumber":277,"author":{"gitId":"-"},"content":" }"},{"lineNumber":278,"author":{"gitId":"-"},"content":""},{"lineNumber":279,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":280,"author":{"gitId":"-"},"content":" public void repoConfig_differentColumnOrder_success() throws Exception {"},{"lineNumber":281,"author":{"gitId":"-"},"content":" RepoConfigCsvParser repoConfigCsvParser \u003d new RepoConfigCsvParser(REPO_CONFIG_DIFFERENT_COLUMN_ORDER_FILE);"},{"lineNumber":282,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e configs \u003d repoConfigCsvParser.parse();"},{"lineNumber":283,"author":{"gitId":"-"},"content":""},{"lineNumber":284,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, configs.size());"},{"lineNumber":285,"author":{"gitId":"-"},"content":""},{"lineNumber":286,"author":{"gitId":"-"},"content":" RepoConfiguration config \u003d configs.get(0);"},{"lineNumber":287,"author":{"gitId":"-"},"content":""},{"lineNumber":288,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_BETA_LOCATION), config.getLocation());"},{"lineNumber":289,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_MASTER_BRANCH, config.getBranch());"},{"lineNumber":290,"author":{"gitId":"-"},"content":""},{"lineNumber":291,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_CONFIG_FORMATS, config.getFileTypeManager().getFormats());"},{"lineNumber":292,"author":{"gitId":"-"},"content":""},{"lineNumber":293,"author":{"gitId":"-"},"content":" Assertions.assertTrue(config.isStandaloneConfigIgnored());"},{"lineNumber":294,"author":{"gitId":"-"},"content":""},{"lineNumber":295,"author":{"gitId":"-"},"content":" Assertions.assertEquals(config.getIgnoreCommitList(),"},{"lineNumber":296,"author":{"gitId":"-"},"content":" CommitHash.convertStringsToCommits(TEST_REPO_BETA_CONFIG_IGNORED_COMMITS));"},{"lineNumber":297,"author":{"gitId":"-"},"content":""},{"lineNumber":298,"author":{"gitId":"-"},"content":" Assertions.assertFalse(config.isFormatsOverriding());"},{"lineNumber":299,"author":{"gitId":"-"},"content":" Assertions.assertFalse(config.isIgnoreGlobListOverriding());"},{"lineNumber":300,"author":{"gitId":"-"},"content":" Assertions.assertFalse(config.isIgnoreCommitListOverriding());"},{"lineNumber":301,"author":{"gitId":"-"},"content":" }"},{"lineNumber":302,"author":{"gitId":"-"},"content":""},{"lineNumber":303,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":304,"author":{"gitId":"-"},"content":" public void repoConfig_missingOptionalHeader_success() throws Exception {"},{"lineNumber":305,"author":{"gitId":"-"},"content":" RepoConfigCsvParser repoConfigCsvParser \u003d new RepoConfigCsvParser(REPO_CONFIG_OPTIONAL_HEADER_MISSING_FILE);"},{"lineNumber":306,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e configs \u003d repoConfigCsvParser.parse();"},{"lineNumber":307,"author":{"gitId":"-"},"content":""},{"lineNumber":308,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, configs.size());"},{"lineNumber":309,"author":{"gitId":"-"},"content":""},{"lineNumber":310,"author":{"gitId":"-"},"content":" RepoConfiguration config \u003d configs.get(0);"},{"lineNumber":311,"author":{"gitId":"-"},"content":""},{"lineNumber":312,"author":{"gitId":"-"},"content":" Assertions.assertEquals(new RepoLocation(TEST_REPO_BETA_LOCATION), config.getLocation());"},{"lineNumber":313,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_MASTER_BRANCH, config.getBranch());"},{"lineNumber":314,"author":{"gitId":"-"},"content":""},{"lineNumber":315,"author":{"gitId":"-"},"content":" Assertions.assertEquals(TEST_REPO_BETA_CONFIG_FORMATS, config.getFileTypeManager().getFormats());"},{"lineNumber":316,"author":{"gitId":"-"},"content":" Assertions.assertEquals(DEFAULT_FILE_SIZE_LIMIT, config.getFileSizeLimit());"},{"lineNumber":317,"author":{"gitId":"-"},"content":""},{"lineNumber":318,"author":{"gitId":"-"},"content":" Assertions.assertTrue(config.isStandaloneConfigIgnored());"},{"lineNumber":319,"author":{"gitId":"-"},"content":""},{"lineNumber":320,"author":{"gitId":"-"},"content":" Assertions.assertFalse(config.isFormatsOverriding());"},{"lineNumber":321,"author":{"gitId":"-"},"content":" Assertions.assertFalse(config.isIgnoreGlobListOverriding());"},{"lineNumber":322,"author":{"gitId":"-"},"content":" Assertions.assertFalse(config.isIgnoreCommitListOverriding());"},{"lineNumber":323,"author":{"gitId":"-"},"content":" Assertions.assertFalse(config.isFileSizeLimitOverriding());"},{"lineNumber":324,"author":{"gitId":"-"},"content":" }"},{"lineNumber":325,"author":{"gitId":"-"},"content":""},{"lineNumber":326,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":327,"author":{"gitId":"-"},"content":" public void repoConfig_withUnrecognizedValuesForYesKeywordHeaders_valuesIgnored() throws Exception {"},{"lineNumber":328,"author":{"gitId":"-"},"content":" RepoConfigCsvParser repoConfigCsvParser \u003d"},{"lineNumber":329,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(REPO_CONFIG_UNRECOGNIZED_VALUES_FOR_YES_KEYWORD_HEADERS_FILE);"},{"lineNumber":330,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e configs \u003d repoConfigCsvParser.parse();"},{"lineNumber":331,"author":{"gitId":"-"},"content":""},{"lineNumber":332,"author":{"gitId":"-"},"content":" Assertions.assertFalse(configs.get(0).isStandaloneConfigIgnored());"},{"lineNumber":333,"author":{"gitId":"-"},"content":" Assertions.assertFalse(configs.get(0).isShallowCloningPerformed());"},{"lineNumber":334,"author":{"gitId":"-"},"content":" Assertions.assertFalse(configs.get(0).isFindingPreviousAuthorsPerformed());"},{"lineNumber":335,"author":{"gitId":"-"},"content":" Assertions.assertFalse(configs.get(0).isFileSizeLimitIgnored());"},{"lineNumber":336,"author":{"gitId":"-"},"content":" Assertions.assertFalse(configs.get(0).isIgnoredFileAnalysisSkipped());"},{"lineNumber":337,"author":{"gitId":"-"},"content":" }"},{"lineNumber":338,"author":{"gitId":"-"},"content":""},{"lineNumber":339,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":340,"author":{"gitId":"-"},"content":" public void repoConfig_invalidFileSizeLimit_valueIgnored() throws Exception {"},{"lineNumber":341,"author":{"gitId":"-"},"content":" RepoConfigCsvParser repoConfigCsvParser \u003d"},{"lineNumber":342,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(REPO_CONFIG_INVALID_FILE_SIZE_LIMIT);"},{"lineNumber":343,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e configs \u003d repoConfigCsvParser.parse();"},{"lineNumber":344,"author":{"gitId":"-"},"content":""},{"lineNumber":345,"author":{"gitId":"-"},"content":" Assertions.assertEquals(configs.get(0).getFileSizeLimit(), DEFAULT_FILE_SIZE_LIMIT);"},{"lineNumber":346,"author":{"gitId":"-"},"content":" Assertions.assertFalse(configs.get(0).isFileSizeLimitOverriding());"},{"lineNumber":347,"author":{"gitId":"-"},"content":" }"},{"lineNumber":348,"author":{"gitId":"-"},"content":""},{"lineNumber":349,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":350,"author":{"gitId":"-"},"content":" public void repoConfig_ignoreFileSizeLimit_ignoreFileSizeColumns() throws Exception {"},{"lineNumber":351,"author":{"gitId":"-"},"content":" RepoConfigCsvParser repoConfigCsvParser \u003d"},{"lineNumber":352,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(REPO_CONFIG_IGNORE_FILE_SIZE_LIMIT);"},{"lineNumber":353,"author":{"gitId":"-"},"content":" List\u003cRepoConfiguration\u003e configs \u003d repoConfigCsvParser.parse();"},{"lineNumber":354,"author":{"gitId":"-"},"content":""},{"lineNumber":355,"author":{"gitId":"-"},"content":" Assertions.assertTrue(configs.get(0).isFileSizeLimitIgnored());"},{"lineNumber":356,"author":{"gitId":"-"},"content":" Assertions.assertFalse(configs.get(0).isFileSizeLimitOverriding());"},{"lineNumber":357,"author":{"gitId":"-"},"content":" Assertions.assertFalse(configs.get(0).isIgnoredFileAnalysisSkipped());"},{"lineNumber":358,"author":{"gitId":"-"},"content":" }"},{"lineNumber":359,"author":{"gitId":"-"},"content":""},{"lineNumber":360,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":361,"author":{"gitId":"-"},"content":" public void repoConfig_mandatoryHeaderMissing_throwsInvalidCsvException() throws Exception {"},{"lineNumber":362,"author":{"gitId":"-"},"content":" RepoConfigCsvParser repoConfigCsvParser \u003d new RepoConfigCsvParser(REPO_CONFIG_MANDATORY_HEADER_MISSING_FILE);"},{"lineNumber":363,"author":{"gitId":"-"},"content":" Assertions.assertThrows(InvalidCsvException.class, () -\u003e repoConfigCsvParser.parse());"},{"lineNumber":364,"author":{"gitId":"-"},"content":" }"},{"lineNumber":365,"author":{"gitId":"-"},"content":""},{"lineNumber":366,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":367,"author":{"gitId":"-"},"content":" public void repoConfig_zeroValidRecords_throwsInvalidCsvException() throws Exception {"},{"lineNumber":368,"author":{"gitId":"-"},"content":" RepoConfigCsvParser repoConfigCsvParser \u003d new RepoConfigCsvParser(REPO_CONFIG_ZERO_VALID_RECORDS);"},{"lineNumber":369,"author":{"gitId":"-"},"content":" Assertions.assertThrows(InvalidCsvException.class, () -\u003e repoConfigCsvParser.parse());"},{"lineNumber":370,"author":{"gitId":"-"},"content":" }"},{"lineNumber":371,"author":{"gitId":"-"},"content":""},{"lineNumber":372,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":373,"author":{"gitId":"-"},"content":" public void repoConfig_duplicateHeadersCaseSensitive_throwsInvalidCsvException() throws Exception {"},{"lineNumber":374,"author":{"gitId":"-"},"content":" RepoConfigCsvParser repoConfigCsvParser \u003d"},{"lineNumber":375,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(REPO_CONFIG_DUPLICATE_HEADERS_CASE_SENSITIVE_FILE);"},{"lineNumber":376,"author":{"gitId":"-"},"content":" Assertions.assertThrows(InvalidCsvException.class, () -\u003e repoConfigCsvParser.parse());"},{"lineNumber":377,"author":{"gitId":"-"},"content":" }"},{"lineNumber":378,"author":{"gitId":"-"},"content":""},{"lineNumber":379,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":380,"author":{"gitId":"-"},"content":" public void repoConfig_duplicateHeadersCaseInsensitive_throwsInvalidCsvException() throws Exception {"},{"lineNumber":381,"author":{"gitId":"-"},"content":" RepoConfigCsvParser repoConfigCsvParser \u003d"},{"lineNumber":382,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(REPO_CONFIG_DUPLICATE_HEADERS_CASE_INSENSITIVE_FILE);"},{"lineNumber":383,"author":{"gitId":"-"},"content":" Assertions.assertThrows(InvalidCsvException.class, () -\u003e repoConfigCsvParser.parse());"},{"lineNumber":384,"author":{"gitId":"-"},"content":" }"},{"lineNumber":385,"author":{"gitId":"-"},"content":""},{"lineNumber":386,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":387,"author":{"gitId":"-"},"content":" public void repoConfig_unknownHeaders_throwsInvalidHeaderException() throws Exception {"},{"lineNumber":388,"author":{"gitId":"-"},"content":" RepoConfigCsvParser repoConfigCsvParser \u003d"},{"lineNumber":389,"author":{"gitId":"-"},"content":" new RepoConfigCsvParser(REPO_CONFIG_UNKNOWN_HEADER_FILE);"},{"lineNumber":390,"author":{"gitId":"-"},"content":" Assertions.assertThrows(InvalidHeaderException.class, () -\u003e repoConfigCsvParser.parse());"},{"lineNumber":391,"author":{"gitId":"-"},"content":" }"},{"lineNumber":392,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":22,"-":370}},{"path":"src/test/java/reposense/parser/StandaloneConfigJsonParserTest.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.parser;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static reposense.util.TestUtil.loadResource;"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.util.Arrays;"},{"lineNumber":7,"author":{"gitId":"-"},"content":""},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assertions;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeAll;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;"},{"lineNumber":11,"author":{"gitId":"-"},"content":""},{"lineNumber":12,"author":{"gitId":"-"},"content":"import com.google.gson.JsonSyntaxException;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"import reposense.model.Author;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import reposense.model.CommitHash;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import reposense.model.FileType;"},{"lineNumber":17,"author":{"gitId":"-"},"content":"import reposense.model.FileTypeTest;"},{"lineNumber":18,"author":{"gitId":"-"},"content":"import reposense.model.RepoConfiguration;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import reposense.model.RepoLocation;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import reposense.model.StandaloneConfig;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import reposense.util.TestUtil;"},{"lineNumber":22,"author":{"gitId":"-"},"content":""},{"lineNumber":23,"author":{"gitId":"-"},"content":"public class StandaloneConfigJsonParserTest {"},{"lineNumber":24,"author":{"gitId":"-"},"content":""},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final Path STANDALONE_MALFORMED_CONFIG \u003d loadResource("},{"lineNumber":26,"author":{"gitId":"-"},"content":" StandaloneConfigJsonParserTest.class, \"StandaloneConfigJsonParserTest/standaloneConfig_malformedJson.json\");"},{"lineNumber":27,"author":{"gitId":"-"},"content":""},{"lineNumber":28,"author":{"gitId":"-"},"content":" private static final Path STANDALONE_UNKNOWN_PROPERTY_CONFIG \u003d loadResource("},{"lineNumber":29,"author":{"gitId":"-"},"content":" StandaloneConfigJsonParserTest.class,"},{"lineNumber":30,"author":{"gitId":"-"},"content":" \"StandaloneConfigJsonParserTest/standaloneConfig_unknownPropertyInJson.json\");"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":" private static final Path STANDALONE_CONFIG_FULL \u003d loadResource("},{"lineNumber":33,"author":{"gitId":"-"},"content":" StandaloneConfigJsonParserTest.class,"},{"lineNumber":34,"author":{"gitId":"-"},"content":" \"StandaloneConfigJsonParserTest/standaloneConfig_full.json\");"},{"lineNumber":35,"author":{"gitId":"-"},"content":""},{"lineNumber":36,"author":{"gitId":"-"},"content":" private static final Path STANDALONE_CONFIG_EMPTY_TEXT_FILE \u003d loadResource("},{"lineNumber":37,"author":{"gitId":"-"},"content":" StandaloneConfigJsonParserTest.class,"},{"lineNumber":38,"author":{"gitId":"-"},"content":" \"StandaloneConfigJsonParserTest/standaloneConfig_emptyText.json\");"},{"lineNumber":39,"author":{"gitId":"-"},"content":""},{"lineNumber":40,"author":{"gitId":"-"},"content":" private static final Path STANDALONE_CONFIG_EMPTY_JSON_FILE \u003d loadResource("},{"lineNumber":41,"author":{"gitId":"-"},"content":" StandaloneConfigJsonParserTest.class,"},{"lineNumber":42,"author":{"gitId":"-"},"content":" \"StandaloneConfigJsonParserTest/standaloneConfig_emptyJson.json\");"},{"lineNumber":43,"author":{"gitId":"-"},"content":""},{"lineNumber":44,"author":{"gitId":"-"},"content":" private static final Path STANDALONE_CONFIG_GITHUBID_ONLY \u003d loadResource("},{"lineNumber":45,"author":{"gitId":"-"},"content":" StandaloneConfigJsonParserTest.class,"},{"lineNumber":46,"author":{"gitId":"-"},"content":" \"StandaloneConfigJsonParserTest/standaloneConfig_githubId_only.json\");"},{"lineNumber":47,"author":{"gitId":"-"},"content":""},{"lineNumber":48,"author":{"gitId":"-"},"content":" private static final String TEST_DUMMY_LOCATION \u003d \"https://github.com/reposense/RepoSense.git\";"},{"lineNumber":49,"author":{"gitId":"-"},"content":""},{"lineNumber":50,"author":{"gitId":"-"},"content":" private static RepoConfiguration expectedGithubIdOnlyRepoconfig;"},{"lineNumber":51,"author":{"gitId":"-"},"content":" private static RepoConfiguration expectedFullRepoConfig;"},{"lineNumber":52,"author":{"gitId":"-"},"content":""},{"lineNumber":53,"author":{"gitId":"-"},"content":" @BeforeAll"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public static void setUp() throws Exception {"},{"lineNumber":55,"author":{"gitId":"-"},"content":" Author author \u003d new Author(\"yong24s\");"},{"lineNumber":56,"author":{"gitId":"-"},"content":" author.setAuthorAliases(Arrays.asList(\"Yong Hao TENG\"));"},{"lineNumber":57,"author":{"gitId":"-"},"content":" author.setIgnoreGlobList(Arrays.asList(\"**.css\", \"**.html\", \"**.jade\", \"**.js\"));"},{"lineNumber":58,"author":{"gitId":"-"},"content":""},{"lineNumber":59,"author":{"gitId":"asdfghjkxd"},"content":" expectedGithubIdOnlyRepoconfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":60,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_DUMMY_LOCATION)).build();"},{"lineNumber":61,"author":{"gitId":"-"},"content":" expectedGithubIdOnlyRepoconfig.setFormats(FileTypeTest.NO_SPECIFIED_FORMATS);"},{"lineNumber":62,"author":{"gitId":"-"},"content":" expectedGithubIdOnlyRepoconfig.setAuthorList(Arrays.asList(new Author(\"yong24s\")));"},{"lineNumber":63,"author":{"gitId":"-"},"content":" expectedGithubIdOnlyRepoconfig.addAuthorEmailsToAuthorMapEntry(author, author.getEmails());"},{"lineNumber":64,"author":{"gitId":"-"},"content":""},{"lineNumber":65,"author":{"gitId":"asdfghjkxd"},"content":" expectedFullRepoConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":66,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_DUMMY_LOCATION)).build();"},{"lineNumber":67,"author":{"gitId":"-"},"content":" expectedFullRepoConfig.setFormats(FileType.convertFormatStringsToFileTypes("},{"lineNumber":68,"author":{"gitId":"-"},"content":" Arrays.asList(\"gradle\", \"jade\", \"java\", \"js\", \"md\", \"scss\", \"yml\")));"},{"lineNumber":69,"author":{"gitId":"-"},"content":" expectedFullRepoConfig.setIgnoreCommitList(Arrays.asList(new CommitHash("},{"lineNumber":70,"author":{"gitId":"-"},"content":" \"7b96c563eb2d3612aa5275364333664a18f01491\")));"},{"lineNumber":71,"author":{"gitId":"-"},"content":" expectedFullRepoConfig.setIgnoreGlobList(Arrays.asList(\"**.adoc\", \"collate**\"));"},{"lineNumber":72,"author":{"gitId":"-"},"content":" expectedFullRepoConfig.setIgnoredAuthorsList(Arrays.asList(\"yong24s\"));"},{"lineNumber":73,"author":{"gitId":"-"},"content":" expectedFullRepoConfig.setAuthorList(Arrays.asList(author));"},{"lineNumber":74,"author":{"gitId":"-"},"content":" expectedFullRepoConfig.setAuthorDisplayName(author, \"Yong Hao\");"},{"lineNumber":75,"author":{"gitId":"-"},"content":" expectedFullRepoConfig.addAuthorNamesToAuthorMapEntry(author, Arrays.asList(author.getGitId()));"},{"lineNumber":76,"author":{"gitId":"-"},"content":" expectedFullRepoConfig.addAuthorNamesToAuthorMapEntry(author, author.getAuthorAliases());"},{"lineNumber":77,"author":{"gitId":"-"},"content":" expectedFullRepoConfig.addAuthorEmailsToAuthorMapEntry(author, author.getEmails());"},{"lineNumber":78,"author":{"gitId":"-"},"content":" }"},{"lineNumber":79,"author":{"gitId":"-"},"content":""},{"lineNumber":80,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":81,"author":{"gitId":"-"},"content":" public void standaloneConfig_parseEmptyTextFile_success() throws Exception {"},{"lineNumber":82,"author":{"gitId":"-"},"content":" new StandaloneConfigJsonParser().parse(STANDALONE_CONFIG_EMPTY_TEXT_FILE);"},{"lineNumber":83,"author":{"gitId":"-"},"content":" }"},{"lineNumber":84,"author":{"gitId":"-"},"content":""},{"lineNumber":85,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":86,"author":{"gitId":"-"},"content":" public void standaloneConfig_parseEmptyJsonFile_success() throws Exception {"},{"lineNumber":87,"author":{"gitId":"-"},"content":" new StandaloneConfigJsonParser().parse(STANDALONE_CONFIG_EMPTY_JSON_FILE);"},{"lineNumber":88,"author":{"gitId":"-"},"content":" }"},{"lineNumber":89,"author":{"gitId":"-"},"content":""},{"lineNumber":90,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":91,"author":{"gitId":"-"},"content":" public void standaloneConfig_ignoresUnknownProperty_success() throws Exception {"},{"lineNumber":92,"author":{"gitId":"-"},"content":" new StandaloneConfigJsonParser().parse(STANDALONE_UNKNOWN_PROPERTY_CONFIG);"},{"lineNumber":93,"author":{"gitId":"-"},"content":" }"},{"lineNumber":94,"author":{"gitId":"-"},"content":""},{"lineNumber":95,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":96,"author":{"gitId":"-"},"content":" public void standaloneConfig_correctConfig_success() throws Exception {"},{"lineNumber":97,"author":{"gitId":"-"},"content":" StandaloneConfig config \u003d new StandaloneConfigJsonParser().parse(STANDALONE_CONFIG_FULL);"},{"lineNumber":98,"author":{"gitId":"-"},"content":" assertSameConfig(expectedFullRepoConfig, config);"},{"lineNumber":99,"author":{"gitId":"-"},"content":" }"},{"lineNumber":100,"author":{"gitId":"-"},"content":""},{"lineNumber":101,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":102,"author":{"gitId":"-"},"content":" public void standaloneConfig_githubIdOnlyConfig_success() throws Exception {"},{"lineNumber":103,"author":{"gitId":"-"},"content":" StandaloneConfig config \u003d new StandaloneConfigJsonParser().parse(STANDALONE_CONFIG_GITHUBID_ONLY);"},{"lineNumber":104,"author":{"gitId":"-"},"content":" assertSameConfig(expectedGithubIdOnlyRepoconfig, config);"},{"lineNumber":105,"author":{"gitId":"-"},"content":" }"},{"lineNumber":106,"author":{"gitId":"-"},"content":""},{"lineNumber":107,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":108,"author":{"gitId":"-"},"content":" public void standaloneConfig_malformedJsonFile_throwsJsonSyntaxException() {"},{"lineNumber":109,"author":{"gitId":"-"},"content":" Assertions.assertThrows(JsonSyntaxException.class, () -\u003e new StandaloneConfigJsonParser()"},{"lineNumber":110,"author":{"gitId":"-"},"content":" .parse(STANDALONE_MALFORMED_CONFIG));"},{"lineNumber":111,"author":{"gitId":"-"},"content":" }"},{"lineNumber":112,"author":{"gitId":"-"},"content":""},{"lineNumber":113,"author":{"gitId":"-"},"content":" private void assertSameConfig(RepoConfiguration expectedRepoConfig, StandaloneConfig actualStandaloneConfig)"},{"lineNumber":114,"author":{"gitId":"-"},"content":" throws Exception {"},{"lineNumber":115,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration actualRepoConfig \u003d new RepoConfiguration.Builder()"},{"lineNumber":116,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_DUMMY_LOCATION)).build();"},{"lineNumber":117,"author":{"gitId":"-"},"content":" actualRepoConfig.update(actualStandaloneConfig);"},{"lineNumber":118,"author":{"gitId":"-"},"content":" TestUtil.compareRepoConfig(expectedRepoConfig, actualRepoConfig);"},{"lineNumber":119,"author":{"gitId":"-"},"content":" }"},{"lineNumber":120,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":6,"-":114}},{"path":"src/test/java/reposense/report/ErrorSummaryTest.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.report;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assertions;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;"},{"lineNumber":5,"author":{"gitId":"-"},"content":""},{"lineNumber":6,"author":{"gitId":"-"},"content":"import reposense.model.RepoLocation;"},{"lineNumber":7,"author":{"gitId":"asdfghjkxd"},"content":"import reposense.parser.exceptions.InvalidLocationException;"},{"lineNumber":8,"author":{"gitId":"-"},"content":""},{"lineNumber":9,"author":{"gitId":"-"},"content":"public class ErrorSummaryTest {"},{"lineNumber":10,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":11,"author":{"gitId":"-"},"content":" public void errorSummary_addRepeatedErrorMessage_containsNoDuplicates() {"},{"lineNumber":12,"author":{"gitId":"-"},"content":" String invalidLocation1 \u003d \"ttp://github.com/reposense.RepoSense.git\";"},{"lineNumber":13,"author":{"gitId":"-"},"content":" String invalidLocation2 \u003d \"https://github.com/contains-illegal-chars/^\\\\/\";"},{"lineNumber":14,"author":{"gitId":"-"},"content":" String invalidLocation3 \u003d \"not-valid-protocol://abc.com/reposense/RepoSense.git\";"},{"lineNumber":15,"author":{"gitId":"-"},"content":""},{"lineNumber":16,"author":{"gitId":"-"},"content":" ErrorSummary errorSummaryInstance \u003d ErrorSummary.getInstance();"},{"lineNumber":17,"author":{"gitId":"-"},"content":" errorSummaryInstance.clearErrorSet();"},{"lineNumber":18,"author":{"gitId":"-"},"content":""},{"lineNumber":19,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":20,"author":{"gitId":"-"},"content":" new RepoLocation(invalidLocation1);"},{"lineNumber":21,"author":{"gitId":"-"},"content":" } catch (InvalidLocationException e) {"},{"lineNumber":22,"author":{"gitId":"-"},"content":" // not relevant to the test"},{"lineNumber":23,"author":{"gitId":"-"},"content":" }"},{"lineNumber":24,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, errorSummaryInstance.getErrorSet().size());"},{"lineNumber":25,"author":{"gitId":"-"},"content":""},{"lineNumber":26,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":27,"author":{"gitId":"-"},"content":" new RepoLocation(invalidLocation1);"},{"lineNumber":28,"author":{"gitId":"-"},"content":" } catch (InvalidLocationException e) {"},{"lineNumber":29,"author":{"gitId":"-"},"content":" // not relevant to the test"},{"lineNumber":30,"author":{"gitId":"-"},"content":" }"},{"lineNumber":31,"author":{"gitId":"-"},"content":" Assertions.assertEquals(1, errorSummaryInstance.getErrorSet().size());"},{"lineNumber":32,"author":{"gitId":"-"},"content":""},{"lineNumber":33,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":34,"author":{"gitId":"-"},"content":" new RepoLocation(invalidLocation2);"},{"lineNumber":35,"author":{"gitId":"-"},"content":" } catch (InvalidLocationException e) {"},{"lineNumber":36,"author":{"gitId":"-"},"content":" // not relevant to the test"},{"lineNumber":37,"author":{"gitId":"-"},"content":" }"},{"lineNumber":38,"author":{"gitId":"-"},"content":" Assertions.assertEquals(2, errorSummaryInstance.getErrorSet().size());"},{"lineNumber":39,"author":{"gitId":"-"},"content":""},{"lineNumber":40,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":41,"author":{"gitId":"-"},"content":" new RepoLocation(invalidLocation1);"},{"lineNumber":42,"author":{"gitId":"-"},"content":" } catch (InvalidLocationException e) {"},{"lineNumber":43,"author":{"gitId":"-"},"content":" // not relevant to the test"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }"},{"lineNumber":45,"author":{"gitId":"-"},"content":" Assertions.assertEquals(2, errorSummaryInstance.getErrorSet().size());"},{"lineNumber":46,"author":{"gitId":"-"},"content":""},{"lineNumber":47,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":48,"author":{"gitId":"-"},"content":" new RepoLocation(invalidLocation3);"},{"lineNumber":49,"author":{"gitId":"-"},"content":" } catch (InvalidLocationException e) {"},{"lineNumber":50,"author":{"gitId":"-"},"content":" // not relevant to the test"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }"},{"lineNumber":52,"author":{"gitId":"-"},"content":" Assertions.assertEquals(3, errorSummaryInstance.getErrorSet().size());"},{"lineNumber":53,"author":{"gitId":"-"},"content":" }"},{"lineNumber":54,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":1,"-":53}},{"path":"src/test/java/reposense/report/RepoClonerTest.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.report;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import java.nio.file.Files;"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import java.nio.file.Path;"},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.nio.file.Paths;"},{"lineNumber":6,"author":{"gitId":"-"},"content":""},{"lineNumber":7,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Assertions;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.Test;"},{"lineNumber":9,"author":{"gitId":"-"},"content":""},{"lineNumber":10,"author":{"gitId":"-"},"content":"import reposense.model.RepoConfiguration;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import reposense.model.RepoLocation;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import reposense.util.FileUtil;"},{"lineNumber":13,"author":{"gitId":"-"},"content":"import reposense.util.TestRepoCloner;"},{"lineNumber":14,"author":{"gitId":"-"},"content":""},{"lineNumber":15,"author":{"gitId":"-"},"content":"public class RepoClonerTest {"},{"lineNumber":16,"author":{"gitId":"-"},"content":""},{"lineNumber":17,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_EMPTY_GIT_LOCATION \u003d \"https://github.com/reposense/testrepo-Empty.git\";"},{"lineNumber":18,"author":{"gitId":"-"},"content":" private static final String TEST_REPO_GIT_LOCATION \u003d \"https://github.com/reposense/testrepo-Alpha.git\";"},{"lineNumber":19,"author":{"gitId":"-"},"content":" private static final Path REPOCLONE_LOCAL_TEST_PATH \u003d"},{"lineNumber":20,"author":{"gitId":"-"},"content":" Paths.get(FileUtil.REPOS_ADDRESS, \"repoclone test/dummy-repo\");"},{"lineNumber":21,"author":{"gitId":"-"},"content":""},{"lineNumber":22,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":23,"author":{"gitId":"-"},"content":" public void repoCloner_emptyRepo_failsGracefully() throws Exception {"},{"lineNumber":24,"author":{"gitId":"-"},"content":" RepoConfiguration emptyRepositoryRepoConfig \u003d"},{"lineNumber":25,"author":{"gitId":"asdfghjkxd"},"content":" new RepoConfiguration.Builder()"},{"lineNumber":26,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_EMPTY_GIT_LOCATION)).build();"},{"lineNumber":27,"author":{"gitId":"-"},"content":""},{"lineNumber":28,"author":{"gitId":"-"},"content":" RepoCloner repoCloner \u003d new RepoCloner();"},{"lineNumber":29,"author":{"gitId":"-"},"content":" repoCloner.cloneBare(emptyRepositoryRepoConfig);"},{"lineNumber":30,"author":{"gitId":"-"},"content":" RepoLocation clonedRepoLocation \u003d repoCloner.getClonedRepoLocation();"},{"lineNumber":31,"author":{"gitId":"-"},"content":""},{"lineNumber":32,"author":{"gitId":"-"},"content":" Assertions.assertNull(clonedRepoLocation);"},{"lineNumber":33,"author":{"gitId":"-"},"content":" }"},{"lineNumber":34,"author":{"gitId":"-"},"content":""},{"lineNumber":35,"author":{"gitId":"-"},"content":" @Test"},{"lineNumber":36,"author":{"gitId":"-"},"content":" public void repoCloner_validRepoLocationWithRelativePathingAndSpaces_success() throws Exception {"},{"lineNumber":37,"author":{"gitId":"-"},"content":" // Clones a test repository into the test directory for testing of relative pathing"},{"lineNumber":38,"author":{"gitId":"asdfghjkxd"},"content":" RepoConfiguration tempRemoteConfiguration \u003d new RepoConfiguration.Builder()"},{"lineNumber":39,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_GIT_LOCATION)).build();"},{"lineNumber":40,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneBare(tempRemoteConfiguration, Paths.get(\".\"), REPOCLONE_LOCAL_TEST_PATH.toString());"},{"lineNumber":41,"author":{"gitId":"-"},"content":""},{"lineNumber":42,"author":{"gitId":"-"},"content":" RepoConfiguration repoWithRelativePathingAndSpacesAndEndingBackslash \u003d"},{"lineNumber":43,"author":{"gitId":"asdfghjkxd"},"content":" new RepoConfiguration.Builder()"},{"lineNumber":44,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(REPOCLONE_LOCAL_TEST_PATH.toString())).build();"},{"lineNumber":45,"author":{"gitId":"-"},"content":" RepoCloner repoCloner \u003d new RepoCloner();"},{"lineNumber":46,"author":{"gitId":"-"},"content":" repoCloner.cloneBare(repoWithRelativePathingAndSpacesAndEndingBackslash);"},{"lineNumber":47,"author":{"gitId":"-"},"content":" Assertions.assertTrue(Files.exists(REPOCLONE_LOCAL_TEST_PATH));"},{"lineNumber":48,"author":{"gitId":"-"},"content":" }"},{"lineNumber":49,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":6,"-":43}},{"path":"src/test/java/reposense/template/GitTestTemplate.java","fileType":"java","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package reposense.template;"},{"lineNumber":2,"author":{"gitId":"-"},"content":""},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static org.junit.jupiter.api.Assertions.assertEquals;"},{"lineNumber":4,"author":{"gitId":"-"},"content":""},{"lineNumber":5,"author":{"gitId":"-"},"content":"import java.io.File;"},{"lineNumber":6,"author":{"gitId":"-"},"content":"import java.time.ZoneId;"},{"lineNumber":7,"author":{"gitId":"-"},"content":"import java.util.Arrays;"},{"lineNumber":8,"author":{"gitId":"-"},"content":"import java.util.Collections;"},{"lineNumber":9,"author":{"gitId":"-"},"content":"import java.util.Iterator;"},{"lineNumber":10,"author":{"gitId":"-"},"content":"import java.util.List;"},{"lineNumber":11,"author":{"gitId":"-"},"content":"import java.util.function.Supplier;"},{"lineNumber":12,"author":{"gitId":"-"},"content":"import java.util.stream.Collectors;"},{"lineNumber":13,"author":{"gitId":"-"},"content":""},{"lineNumber":14,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.AfterEach;"},{"lineNumber":15,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeAll;"},{"lineNumber":16,"author":{"gitId":"-"},"content":"import org.junit.jupiter.api.BeforeEach;"},{"lineNumber":17,"author":{"gitId":"-"},"content":""},{"lineNumber":18,"author":{"gitId":"-"},"content":"import reposense.authorship.FileInfoAnalyzer;"},{"lineNumber":19,"author":{"gitId":"-"},"content":"import reposense.authorship.FileInfoExtractor;"},{"lineNumber":20,"author":{"gitId":"-"},"content":"import reposense.authorship.model.FileInfo;"},{"lineNumber":21,"author":{"gitId":"-"},"content":"import reposense.authorship.model.FileResult;"},{"lineNumber":22,"author":{"gitId":"-"},"content":"import reposense.authorship.model.LineInfo;"},{"lineNumber":23,"author":{"gitId":"-"},"content":"import reposense.git.GitCheckout;"},{"lineNumber":24,"author":{"gitId":"-"},"content":"import reposense.git.GitShow;"},{"lineNumber":25,"author":{"gitId":"-"},"content":"import reposense.git.exception.CommitNotFoundException;"},{"lineNumber":26,"author":{"gitId":"-"},"content":"import reposense.model.Author;"},{"lineNumber":27,"author":{"gitId":"-"},"content":"import reposense.model.CommitHash;"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import reposense.model.FileTypeTest;"},{"lineNumber":29,"author":{"gitId":"-"},"content":"import reposense.model.RepoConfiguration;"},{"lineNumber":30,"author":{"gitId":"-"},"content":"import reposense.model.RepoLocation;"},{"lineNumber":31,"author":{"gitId":"-"},"content":"import reposense.util.FileUtil;"},{"lineNumber":32,"author":{"gitId":"-"},"content":"import reposense.util.TestRepoCloner;"},{"lineNumber":33,"author":{"gitId":"-"},"content":""},{"lineNumber":34,"author":{"gitId":"-"},"content":"/**"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Contains templates for git testing."},{"lineNumber":36,"author":{"gitId":"-"},"content":" */"},{"lineNumber":37,"author":{"gitId":"-"},"content":""},{"lineNumber":38,"author":{"gitId":"-"},"content":"public class GitTestTemplate {"},{"lineNumber":39,"author":{"gitId":"-"},"content":" protected static final String TEST_REPO_GIT_LOCATION \u003d \"https://github.com/reposense/testrepo-Alpha.git\";"},{"lineNumber":40,"author":{"gitId":"-"},"content":" protected static final String IGNORE_REVS_FILE_NAME \u003d \".git-blame-ignore-revs\";"},{"lineNumber":41,"author":{"gitId":"-"},"content":" protected static final String TEST_REPO_BLAME_WITH_PREVIOUS_AUTHORS_BRANCH \u003d \"1565-find-previous-authors\";"},{"lineNumber":42,"author":{"gitId":"-"},"content":" protected static final String FIRST_COMMIT_HASH \u003d \"7d7584f\";"},{"lineNumber":43,"author":{"gitId":"-"},"content":" protected static final String ROOT_COMMIT_HASH \u003d \"fd425072e12004b71d733a58d819d845509f8db3\";"},{"lineNumber":44,"author":{"gitId":"-"},"content":" protected static final String TEST_COMMIT_HASH \u003d \"2fb6b9b\";"},{"lineNumber":45,"author":{"gitId":"-"},"content":" protected static final String TEST_COMMIT_HASH_LONG \u003d \"2fb6b9b2dd9fa40bf0f9815da2cb0ae8731436c7\";"},{"lineNumber":46,"author":{"gitId":"-"},"content":" protected static final String TEST_COMMIT_HASH_PARENT \u003d \"c5a6dc774e22099cd9ddeb0faff1e75f9cf4f151\";"},{"lineNumber":47,"author":{"gitId":"-"},"content":" protected static final String MAIN_AUTHOR_NAME \u003d \"harryggg\";"},{"lineNumber":48,"author":{"gitId":"-"},"content":" protected static final String FAKE_AUTHOR_NAME \u003d \"fakeAuthor\";"},{"lineNumber":49,"author":{"gitId":"-"},"content":" protected static final String UNCONVENTIONAL_AUTHOR_NAME \u003d \"-unconventional_author-\";"},{"lineNumber":50,"author":{"gitId":"-"},"content":" protected static final String WHITESPACE_AUTHOR_NAME \u003d \"whitespace author\";"},{"lineNumber":51,"author":{"gitId":"-"},"content":" protected static final String IGNORED_AUTHOR_NAME \u003d \"FH-30\";"},{"lineNumber":52,"author":{"gitId":"-"},"content":" protected static final String EUGENE_AUTHOR_NAME \u003d \"eugenepeh\";"},{"lineNumber":53,"author":{"gitId":"-"},"content":" protected static final String YONG_AUTHOR_NAME \u003d \"Yong Hao TENG\";"},{"lineNumber":54,"author":{"gitId":"-"},"content":" protected static final String MINGYI_AUTHOR_NAME \u003d \"myteo\";"},{"lineNumber":55,"author":{"gitId":"-"},"content":" protected static final String JAMES_AUTHOR_NAME \u003d \"jamessspanggg\";"},{"lineNumber":56,"author":{"gitId":"-"},"content":" protected static final String JAMES_ALTERNATIVE_AUTHOR_NAME \u003d \"James Pang\";"},{"lineNumber":57,"author":{"gitId":"-"},"content":" protected static final String JINYAO_AUTHOR_NAME \u003d \"jylee-git\";"},{"lineNumber":58,"author":{"gitId":"-"},"content":" protected static final String CHENGYU_AUTHOR_NAME \u003d \"HCY123902\";"},{"lineNumber":59,"author":{"gitId":"-"},"content":" protected static final String LATEST_COMMIT_HASH \u003d \"abbd5888d5cd4e411c6a8e58e661b0eafdae1335\";"},{"lineNumber":60,"author":{"gitId":"-"},"content":" protected static final String LATEST_COMMIT_HASH_PARENT \u003d \"f768b9b1d9d1478f8ac8cf3b4c7f868479edc07a\";"},{"lineNumber":61,"author":{"gitId":"-"},"content":" protected static final String EMPTY_TREE_HASH \u003d \"4b825dc642cb6eb9a060e54bf8d69288fbee4904\";"},{"lineNumber":62,"author":{"gitId":"-"},"content":" protected static final String EUGENE_AUTHOR_README_FILE_COMMIT_07052018_STRING \u003d"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \"2d87a431fcbb8f73a731b6df0fcbee962c85c250\";"},{"lineNumber":64,"author":{"gitId":"-"},"content":" protected static final CommitHash EUGENE_AUTHOR_README_FILE_COMMIT_07052018 \u003d"},{"lineNumber":65,"author":{"gitId":"-"},"content":" new CommitHash(EUGENE_AUTHOR_README_FILE_COMMIT_07052018_STRING);"},{"lineNumber":66,"author":{"gitId":"-"},"content":" protected static final String FAKE_AUTHOR_BLAME_TEST_FILE_COMMIT_08022018_STRING \u003d"},{"lineNumber":67,"author":{"gitId":"-"},"content":" \"768015345e70f06add2a8b7d1f901dc07bf70582\";"},{"lineNumber":68,"author":{"gitId":"-"},"content":" protected static final CommitHash FAKE_AUTHOR_BLAME_TEST_FILE_COMMIT_08022018 \u003d"},{"lineNumber":69,"author":{"gitId":"-"},"content":" new CommitHash(FAKE_AUTHOR_BLAME_TEST_FILE_COMMIT_08022018_STRING);"},{"lineNumber":70,"author":{"gitId":"-"},"content":" protected static final String MAIN_AUTHOR_BLAME_TEST_FILE_COMMIT_06022018_STRING \u003d"},{"lineNumber":71,"author":{"gitId":"-"},"content":" \"8d0ac2ee20f04dce8df0591caed460bffacb65a4\";"},{"lineNumber":72,"author":{"gitId":"-"},"content":" protected static final CommitHash MAIN_AUTHOR_BLAME_TEST_FILE_COMMIT_06022018 \u003d"},{"lineNumber":73,"author":{"gitId":"-"},"content":" new CommitHash(MAIN_AUTHOR_BLAME_TEST_FILE_COMMIT_06022018_STRING);"},{"lineNumber":74,"author":{"gitId":"-"},"content":" protected static final String AUTHOR_TO_IGNORE_BLAME_TEST_FILE_COMMIT_07082021_STRING \u003d"},{"lineNumber":75,"author":{"gitId":"-"},"content":" \"1d29339e7d16eb5b2bc8fb542e08acedd3d4b0eb\";"},{"lineNumber":76,"author":{"gitId":"-"},"content":" protected static final CommitHash AUTHOR_TO_IGNORE_BLAME_TEST_FILE_COMMIT_07082021 \u003d"},{"lineNumber":77,"author":{"gitId":"-"},"content":" new CommitHash(AUTHOR_TO_IGNORE_BLAME_TEST_FILE_COMMIT_07082021_STRING);"},{"lineNumber":78,"author":{"gitId":"-"},"content":" protected static final String FAKE_AUTHOR_BLAME_RANGED_COMMIT_ONE_06022018_STRING \u003d"},{"lineNumber":79,"author":{"gitId":"-"},"content":" \"7d7584fc204922cc5ff3bd5ca073cad6bed2c46a\";"},{"lineNumber":80,"author":{"gitId":"-"},"content":" protected static final String FAKE_AUTHOR_BLAME_RANGED_COMMIT_TWO_06022018_STRING \u003d"},{"lineNumber":81,"author":{"gitId":"-"},"content":" \"8d0ac2ee20f04dce8df0591caed460bffacb65a4\";"},{"lineNumber":82,"author":{"gitId":"-"},"content":" protected static final String FAKE_AUTHOR_BLAME_RANGED_COMMIT_THREE_07022018_STRING \u003d"},{"lineNumber":83,"author":{"gitId":"-"},"content":" \"8e4ca1da5d413e9ab84a1e8d1474918afa97f7a1\";"},{"lineNumber":84,"author":{"gitId":"-"},"content":" protected static final String FAKE_AUTHOR_BLAME_RANGED_COMMIT_FOUR_08022018_STRING \u003d"},{"lineNumber":85,"author":{"gitId":"-"},"content":" \"768015345e70f06add2a8b7d1f901dc07bf70582\";"},{"lineNumber":86,"author":{"gitId":"-"},"content":" protected static final List\u003cCommitHash\u003e FAKE_AUTHOR_BLAME_RANGED_COMMIT_LIST_09022018 \u003d Arrays.asList("},{"lineNumber":87,"author":{"gitId":"-"},"content":" new CommitHash(FAKE_AUTHOR_BLAME_RANGED_COMMIT_ONE_06022018_STRING),"},{"lineNumber":88,"author":{"gitId":"-"},"content":" new CommitHash(FAKE_AUTHOR_BLAME_RANGED_COMMIT_TWO_06022018_STRING),"},{"lineNumber":89,"author":{"gitId":"-"},"content":" new CommitHash(FAKE_AUTHOR_BLAME_RANGED_COMMIT_THREE_07022018_STRING),"},{"lineNumber":90,"author":{"gitId":"-"},"content":" new CommitHash(FAKE_AUTHOR_BLAME_RANGED_COMMIT_FOUR_08022018_STRING));"},{"lineNumber":91,"author":{"gitId":"-"},"content":" protected static final List\u003cCommitHash\u003e AUTHOR_TO_IGNORE_BLAME_COMMIT_LIST_07082021 \u003d Collections.singletonList("},{"lineNumber":92,"author":{"gitId":"-"},"content":" new CommitHash(AUTHOR_TO_IGNORE_BLAME_TEST_FILE_COMMIT_07082021_STRING)"},{"lineNumber":93,"author":{"gitId":"-"},"content":" );"},{"lineNumber":94,"author":{"gitId":"-"},"content":" protected static final String NONEXISTENT_COMMIT_HASH \u003d \"nonExistentCommitHash\";"},{"lineNumber":95,"author":{"gitId":"-"},"content":" protected static final ZoneId TIME_ZONE_ID \u003d ZoneId.of(\"Asia/Singapore\");"},{"lineNumber":96,"author":{"gitId":"-"},"content":""},{"lineNumber":97,"author":{"gitId":"-"},"content":" protected static final Author MAIN_AUTHOR \u003d new Author(MAIN_AUTHOR_NAME);"},{"lineNumber":98,"author":{"gitId":"-"},"content":" protected static final Author FAKE_AUTHOR \u003d new Author(FAKE_AUTHOR_NAME);"},{"lineNumber":99,"author":{"gitId":"-"},"content":" protected static final Author UNCONVENTIONAL_AUTHOR \u003d new Author(UNCONVENTIONAL_AUTHOR_NAME);"},{"lineNumber":100,"author":{"gitId":"-"},"content":" protected static final Author WHITESPACE_AUTHOR \u003d new Author(WHITESPACE_AUTHOR_NAME);"},{"lineNumber":101,"author":{"gitId":"-"},"content":""},{"lineNumber":102,"author":{"gitId":"-"},"content":" protected static ThreadLocal\u003cRepoConfiguration\u003e configs \u003d ThreadLocal.withInitial(() -\u003e {"},{"lineNumber":103,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":104,"author":{"gitId":"-"},"content":" return newRepoConfiguration();"},{"lineNumber":105,"author":{"gitId":"-"},"content":" } catch (Exception e) {"},{"lineNumber":106,"author":{"gitId":"-"},"content":" throw new RuntimeException(e);"},{"lineNumber":107,"author":{"gitId":"-"},"content":" }"},{"lineNumber":108,"author":{"gitId":"-"},"content":" });"},{"lineNumber":109,"author":{"gitId":"-"},"content":""},{"lineNumber":110,"author":{"gitId":"-"},"content":" private static final Supplier\u003cString\u003e EXTRA_OUTPUT_FOLDER_NAME_SUPPLIER \u003d () -\u003e"},{"lineNumber":111,"author":{"gitId":"-"},"content":" String.valueOf(Thread.currentThread().getId());"},{"lineNumber":112,"author":{"gitId":"-"},"content":" private FileInfoExtractor fileInfoExtractor \u003d new FileInfoExtractor();"},{"lineNumber":113,"author":{"gitId":"-"},"content":" private FileInfoAnalyzer fileInfoAnalyzer \u003d new FileInfoAnalyzer();"},{"lineNumber":114,"author":{"gitId":"-"},"content":""},{"lineNumber":115,"author":{"gitId":"-"},"content":" @BeforeEach"},{"lineNumber":116,"author":{"gitId":"-"},"content":" public void before() throws Exception {"},{"lineNumber":117,"author":{"gitId":"-"},"content":" RepoConfiguration config \u003d newRepoConfiguration();"},{"lineNumber":118,"author":{"gitId":"-"},"content":" config.setAuthorList(Collections.singletonList(getAlphaAllAliasAuthor()));"},{"lineNumber":119,"author":{"gitId":"-"},"content":" config.setFormats(FileTypeTest.DEFAULT_TEST_FORMATS);"},{"lineNumber":120,"author":{"gitId":"-"},"content":" config.setZoneId(TIME_ZONE_ID);"},{"lineNumber":121,"author":{"gitId":"-"},"content":" config.setIsLastModifiedDateIncluded(false);"},{"lineNumber":122,"author":{"gitId":"-"},"content":""},{"lineNumber":123,"author":{"gitId":"-"},"content":" configs.set(config);"},{"lineNumber":124,"author":{"gitId":"-"},"content":" }"},{"lineNumber":125,"author":{"gitId":"-"},"content":""},{"lineNumber":126,"author":{"gitId":"-"},"content":" @BeforeAll"},{"lineNumber":127,"author":{"gitId":"-"},"content":" public static void beforeClass() throws Exception {"},{"lineNumber":128,"author":{"gitId":"-"},"content":" RepoConfiguration config \u003d newRepoConfiguration();"},{"lineNumber":129,"author":{"gitId":"-"},"content":" config.setZoneId(TIME_ZONE_ID);"},{"lineNumber":130,"author":{"gitId":"-"},"content":" configs.set(config);"},{"lineNumber":131,"author":{"gitId":"-"},"content":""},{"lineNumber":132,"author":{"gitId":"-"},"content":" TestRepoCloner.cloneAndBranch(config, EXTRA_OUTPUT_FOLDER_NAME_SUPPLIER.get());"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }"},{"lineNumber":134,"author":{"gitId":"-"},"content":""},{"lineNumber":135,"author":{"gitId":"-"},"content":" @AfterEach"},{"lineNumber":136,"author":{"gitId":"-"},"content":" public void after() {"},{"lineNumber":137,"author":{"gitId":"-"},"content":" GitCheckout.checkout(configs.get().getRepoRoot(), \"master\");"},{"lineNumber":138,"author":{"gitId":"-"},"content":" }"},{"lineNumber":139,"author":{"gitId":"-"},"content":""},{"lineNumber":140,"author":{"gitId":"-"},"content":" private static RepoConfiguration newRepoConfiguration() throws Exception {"},{"lineNumber":141,"author":{"gitId":"asdfghjkxd"},"content":" return new RepoConfiguration.Builder()"},{"lineNumber":142,"author":{"gitId":"asdfghjkxd"},"content":" .location(new RepoLocation(TEST_REPO_GIT_LOCATION))"},{"lineNumber":143,"author":{"gitId":"asdfghjkxd"},"content":" .branch(\"master\")"},{"lineNumber":144,"author":{"gitId":"asdfghjkxd"},"content":" .extraOutputFolderName(EXTRA_OUTPUT_FOLDER_NAME_SUPPLIER.get())"},{"lineNumber":145,"author":{"gitId":"asdfghjkxd"},"content":" .build();"},{"lineNumber":146,"author":{"gitId":"-"},"content":" }"},{"lineNumber":147,"author":{"gitId":"-"},"content":""},{"lineNumber":148,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":149,"author":{"gitId":"-"},"content":" * Generates the .git-blame-ignore-revs file containing {@link CommitHash}es"},{"lineNumber":150,"author":{"gitId":"-"},"content":" * from {@code toIgnore} for the test repo."},{"lineNumber":151,"author":{"gitId":"-"},"content":" */"},{"lineNumber":152,"author":{"gitId":"-"},"content":" public List\u003cCommitHash\u003e createTestIgnoreRevsFile(List\u003cCommitHash\u003e toIgnore) {"},{"lineNumber":153,"author":{"gitId":"-"},"content":" String repoRoot \u003d configs.get().getRepoRoot();"},{"lineNumber":154,"author":{"gitId":"-"},"content":" List\u003cCommitHash\u003e expandedIgnoreCommitList \u003d toIgnore.stream()"},{"lineNumber":155,"author":{"gitId":"-"},"content":" .map(CommitHash::toString)"},{"lineNumber":156,"author":{"gitId":"-"},"content":" .map(commitHash -\u003e {"},{"lineNumber":157,"author":{"gitId":"-"},"content":" try {"},{"lineNumber":158,"author":{"gitId":"-"},"content":" return GitShow.getExpandedCommitHash(repoRoot, commitHash);"},{"lineNumber":159,"author":{"gitId":"-"},"content":" } catch (CommitNotFoundException e) {"},{"lineNumber":160,"author":{"gitId":"-"},"content":" return new CommitHash(commitHash);"},{"lineNumber":161,"author":{"gitId":"-"},"content":" }"},{"lineNumber":162,"author":{"gitId":"-"},"content":" })"},{"lineNumber":163,"author":{"gitId":"-"},"content":" .collect(Collectors.toList());"},{"lineNumber":164,"author":{"gitId":"-"},"content":""},{"lineNumber":165,"author":{"gitId":"-"},"content":" String fileLocation \u003d repoRoot + IGNORE_REVS_FILE_NAME;"},{"lineNumber":166,"author":{"gitId":"-"},"content":" FileUtil.writeIgnoreRevsFile(fileLocation, expandedIgnoreCommitList);"},{"lineNumber":167,"author":{"gitId":"-"},"content":" return expandedIgnoreCommitList;"},{"lineNumber":168,"author":{"gitId":"-"},"content":" }"},{"lineNumber":169,"author":{"gitId":"-"},"content":""},{"lineNumber":170,"author":{"gitId":"-"},"content":" public void removeTestIgnoreRevsFile() {"},{"lineNumber":171,"author":{"gitId":"-"},"content":" String fileLocation \u003d configs.get().getRepoRoot() + IGNORE_REVS_FILE_NAME;"},{"lineNumber":172,"author":{"gitId":"-"},"content":" new File(fileLocation).delete();"},{"lineNumber":173,"author":{"gitId":"-"},"content":" }"},{"lineNumber":174,"author":{"gitId":"-"},"content":""},{"lineNumber":175,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":176,"author":{"gitId":"-"},"content":" * For each line in {@link FileResult}, assert that it is attributed to the expected author provided by"},{"lineNumber":177,"author":{"gitId":"-"},"content":" * {@code expectedLineAuthors}."},{"lineNumber":178,"author":{"gitId":"-"},"content":" */"},{"lineNumber":179,"author":{"gitId":"-"},"content":" public void assertFileAnalysisCorrectness(FileResult fileResult, List\u003cAuthor\u003e expectedLineAuthors) {"},{"lineNumber":180,"author":{"gitId":"-"},"content":" List\u003cLineInfo\u003e lines \u003d fileResult.getLines();"},{"lineNumber":181,"author":{"gitId":"-"},"content":" assertEquals(expectedLineAuthors.size(), lines.size());"},{"lineNumber":182,"author":{"gitId":"-"},"content":""},{"lineNumber":183,"author":{"gitId":"-"},"content":" Iterator\u003cAuthor\u003e lineAuthorsItr \u003d expectedLineAuthors.iterator();"},{"lineNumber":184,"author":{"gitId":"-"},"content":" Iterator\u003cLineInfo\u003e linesItr \u003d lines.iterator();"},{"lineNumber":185,"author":{"gitId":"-"},"content":""},{"lineNumber":186,"author":{"gitId":"-"},"content":" while (linesItr.hasNext() \u0026\u0026 lineAuthorsItr.hasNext()) {"},{"lineNumber":187,"author":{"gitId":"-"},"content":" assertEquals(lineAuthorsItr.next(), linesItr.next().getAuthor());"},{"lineNumber":188,"author":{"gitId":"-"},"content":" }"},{"lineNumber":189,"author":{"gitId":"-"},"content":" }"},{"lineNumber":190,"author":{"gitId":"-"},"content":""},{"lineNumber":191,"author":{"gitId":"-"},"content":" public FileResult getFileResult(String relativePath) {"},{"lineNumber":192,"author":{"gitId":"-"},"content":" FileInfo fileInfo \u003d fileInfoExtractor.generateFileInfo(configs.get(), relativePath);"},{"lineNumber":193,"author":{"gitId":"-"},"content":" return fileInfoAnalyzer.analyzeTextFile(configs.get(), fileInfo);"},{"lineNumber":194,"author":{"gitId":"-"},"content":" }"},{"lineNumber":195,"author":{"gitId":"-"},"content":""},{"lineNumber":196,"author":{"gitId":"-"},"content":" /**"},{"lineNumber":197,"author":{"gitId":"-"},"content":" * Returns a {@link Author} that has git id and aliases of all authors in testrepo-Alpha, so that no commits"},{"lineNumber":198,"author":{"gitId":"-"},"content":" * will be filtered out in the `git log` command."},{"lineNumber":199,"author":{"gitId":"-"},"content":" */"},{"lineNumber":200,"author":{"gitId":"-"},"content":" protected Author getAlphaAllAliasAuthor() {"},{"lineNumber":201,"author":{"gitId":"-"},"content":" Author author \u003d new Author(MAIN_AUTHOR_NAME);"},{"lineNumber":202,"author":{"gitId":"-"},"content":" author.setAuthorAliases(Arrays.asList(FAKE_AUTHOR_NAME, EUGENE_AUTHOR_NAME, YONG_AUTHOR_NAME));"},{"lineNumber":203,"author":{"gitId":"-"},"content":" return author;"},{"lineNumber":204,"author":{"gitId":"-"},"content":" }"},{"lineNumber":205,"author":{"gitId":"-"},"content":"}"}],"authorContributionMap":{"asdfghjkxd":5,"-":200}}] diff --git a/reposense_reposense_master/commits.json b/reposense_reposense_master/commits.json index e6e6a07..95ff0ed 100644 --- a/reposense_reposense_master/commits.json +++ b/reposense_reposense_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"xenosf":[],"sopa301":[{"date":"2024-01-31","commitResults":[{"hash":"19f9e6847b503b0f9028effd37b2cfab87b72af1","isMergeCommit":false,"messageTitle":"[#1980] Standardise Array Style for Frontend Files (#2084)","messageBody":"Array\u003cT\u003e and T[] can be used interchangeably in TypeScript. We can use\r\nthe same style consistently across the codebase to make it easier for\r\ndevelopers to read and understand array types.\r\n\r\nIn Vue, using T[] in defineComponent requires casting in the form of\r\n\"Array as PropType\u003cT[]\u003e\", while Array\u003cT\u003e can be used as is. Therefore,\r\nit would be more consistent to use Array\u003cT\u003e for .vue files.\r\nAdditionally, such a rule can be enforced more easily with eslint.\r\n\r\nLet\u0027s include a rule for eslint to check array usage and change the\r\ncode to follow this rule.","fileTypesAndContributionMap":{"json":{"insertions":20,"deletions":1}}},{"hash":"f5855fa68b3e23a0fed0c2e7cc94cc6401d175e3","isMergeCommit":false,"messageTitle":"[#1224] Update .stylelintrc.json to check for spacing (#2094)","messageBody":"With no current plans to update stylelint to v15 or beyond, we can\r\nstill use the current features to enforce consistent spacing in our\r\nscss files. This will make the coding style more consistent throughout\r\nthe codebase.\r\n\r\nLet\u0027s update the rules in .stylelintrc.json to enforce spacing.","fileTypesAndContributionMap":{"json":{"insertions":3,"deletions":1}}}]}],"mingyuanc":[],"jingting1412":[],"KevinEyo1":[],"LamJiuFong":[],"yiwen101":[],"jonasongg":[{"date":"2024-01-31","commitResults":[{"hash":"0f682a0c319cde9aefe268deb97e97816c1b387a","isMergeCommit":false,"messageTitle":"[#2016] Remove hash symbol from URL when decoding hash (#2086)","messageBody":"Fix bug where some params were not retained after refresh\r\n\r\nThe issue pertains to breakdown of file types disappearing after a\r\nrefresh, but it seems to apply to all params that were last in the URL\r\ndue to symbols not being filtered out correctly.\r\n\r\nLet\u0027s fix this issue to make sure the state of the report stays the\r\nsame when refreshing.","fileTypesAndContributionMap":{"js":{"insertions":156,"deletions":0}}}]},{"date":"2024-02-17","commitResults":[{"hash":"9ff7a96c6afd5b8837da8ee1ba44b263670ae391","isMergeCommit":false,"messageTitle":"[#2111] Fix failing zoomFeature cypress test (#2114)","messageBody":"Fix nondeterministically failing zoomFeature cypress test\r\n\r\nThe \"range changes in chartview should reflect in zoom\" test in\r\nchartView_zoomFeature.cy.js fails because as time passes, the\r\ncoordinates in the ramp that correspond to the desired zoom area\r\nchange.\r\n\r\nLet\u0027s add an \"until\" filter to the relevant cypress tests to stop this\r\nfrom happening","fileTypesAndContributionMap":{"js":{"insertions":11,"deletions":0}}}]}],"domoberzin":[],"asdfghjkxd":[{"date":"2024-01-18","commitResults":[{"hash":"4ef7210a06fbd6b979a648f8bdce967717a6512c","isMergeCommit":false,"messageTitle":"[#2073] Refactor `RepoConfigCsvParser::processLine` method to avoid arrowhead style code (#2080)","messageBody":"The current implementation of `RepoConfigCsvParser::processLine`\r\ncontains code that has 3 levels of indentation, making it \r\ndifficult to read and maintain.\r\n\r\nWith the proposed changes, the level of deep nesting has \r\nbeen reduced to 2 levels, making the code more \r\nreadable and maintainable.\r\n\r\nLet\u0027s move to refactor and clean up the code to avoid \r\narrowhead-style codes for better readability and \r\nmaintainability.","fileTypesAndContributionMap":{"java":{"insertions":9,"deletions":10}}}]},{"date":"2024-01-26","commitResults":[{"hash":"54ba5ecc417097134c83e7d9dc80b925598cb9ef","isMergeCommit":false,"messageTitle":"[#2091] Improve memory usage by refactoring Regex compilation (#2092)","messageBody":"Improve memory usage by refactoring Regex compilation\r\n\r\nCurrently, Regex checking is used in conjunction with iteration. This\r\npattern of coding is frowned upon due to the excessive Regex pattern\r\ncompilation, causing the program to run slower and consume more\r\nmemory.\r\n\r\nBy moving the Regex pattern compilation outside of the iteration, and\r\nby using `Matcher` objects to check if the strings match the Regex\r\nperformance, we can potentially remove this performance bottleneck.\r\n\r\nLet\u0027s move to refactor the code and remove such instances of Regex use\r\nin iterative loops.","fileTypesAndContributionMap":{"java":{"insertions":11,"deletions":4}}}]},{"date":"2024-01-31","commitResults":[{"hash":"7977382dfeb3f8559ebb85028a510c8bbc23b58e","isMergeCommit":false,"messageTitle":"[#1958] Use syntax coloring for code blocks in docs (#2099)","messageBody":"Current code blocks do not use the built-in syntax highlighting\r\nfeature offered by Markbind/Markdown.\r\n\r\nThis impedes the readability of the code within the code blocks.\r\n\r\nLet\u0027s update the code blocks in the documentation to enable\r\nsyntax highlighting to further enhance readability of the documentation\r\nand the code.","fileTypesAndContributionMap":{"md":{"insertions":26,"deletions":26}}}]},{"date":"2024-02-06","commitResults":[{"hash":"30ef45089c9d959c3d667519f56197b01690d38b","isMergeCommit":false,"messageTitle":"[#1878] Update `SystemTestUtil::assertJson` to compare Json objects instead of line-by-line analysis (#2087)","messageBody":"`SystemTestUtil::assertJson` currently checks if two JSON files are\r\nequal by comparing the file contents line by line rather than by\r\nconverting the files directly into JSON objects, which can then be\r\ndirectly compared using the built-in `equals` methods for\r\n`JsonElement`.\r\n\r\nThis process also does not automatically check if the file is indeed a\r\nJSON file, and implicitly assumes that the input paths are paths to\r\nJSON files. This may cause expected behaviours if a user accidentally\r\nor intentionally includes a path to a non-JSON file within the method\r\ncalls.\r\n\r\nLet\u0027s move to refactor the code, and utilise the built-in methods for\r\n`JsonElement` objects to check for the equality of JSON objects.","fileTypesAndContributionMap":{"java":{"insertions":11,"deletions":4}}}]},{"date":"2024-02-07","commitResults":[{"hash":"29903e31243225f4f4c3c4ad523f2298d2b8e70d","isMergeCommit":false,"messageTitle":"[#2103] Refactor `parser` package for greater organisation of classes (#2104)","messageBody":"Classes in the `parser` package as of now are not properly organised,\r\nwith exceptions, types and parser classes being found in the same\r\ndirectory level.\r\n\r\nThis does not follow the convention established by other packages,\r\nwhereby logically similar classes are further grouped into\r\nsub-packages.\r\n\r\nLet\u0027s move to refactor the `parser` package to ensure that it follows\r\nthe overall structure of the other packages and to increase the level\r\nof organisation within the `parser` package.","fileTypesAndContributionMap":{"java":{"insertions":62,"deletions":32}}}]},{"date":"2024-02-17","commitResults":[{"hash":"d2018d246e74fa04ae70d2f1f0f16c9e8e29e187","isMergeCommit":false,"messageTitle":"[#2076] Refactor RepoConfiguration to simplify constructor complexity (#2078)","messageBody":"Refactor RepoConfiguration to simplify constructor complexity.\r\n\r\nCurrently, the constructors for the `RepoConfiguration` class is \r\nvery complex, involving up to 18 parameters at once, and is \r\nnot easily extensible.\r\n\r\nWith the proposed changes, the constructor now follows the \r\nBuilder pattern, by using a nested class `Builder` that \r\nhelps to compose config parameters in a way that is much more \r\nmodular and comprehensible, enhancing code quality and \r\nreducing confusion among developers.\r\n\r\nHowever, it must be noted that `Builder` objects are not reusable as of\r\nnow, and that more combinations of arguments are permitted due to the\r\nremoval of constructors for `RepoBuilder`, which previously helped to\r\nensure the correctness of parameter combinations.\r\n\r\nLet\u0027s refactor `RepoConfiguration` to simplify the \r\ncomplexity of the constructor and increase modularity \r\nof the code.","fileTypesAndContributionMap":{"java":{"insertions":734,"deletions":158}}}]}],"yuanxi1":[],"supermii2":[{"date":"2024-01-26","commitResults":[{"hash":"3cd680c3ddfa5a96f9168d3ab411d0cccfc3c52f","isMergeCommit":false,"messageTitle":"[#2082] Fix typo in command in Setting Up page (#2083)","messageBody":"Fix typo in Setting Up page\r\n\r\nThe command given in the developer guide for checking the local Node.js\r\nversion is `npm -v`, which displays the version of npm instead.\r\n\r\nLet\u0027s replace the command with `node -v`, which correctly displays the\r\nNode.js version.","fileTypesAndContributionMap":{"md":{"insertions":1,"deletions":1}}}]},{"date":"2024-02-11","commitResults":[{"hash":"945405a6c5786c72e11b23da7c452bb9568b03b6","isMergeCommit":false,"messageTitle":"[#1933] Fix broken DevOps Guide link in Learning Basics (#2107)","messageBody":"Fix broken link to DevOps Guide in Learning Basics page.\r\n\r\nUnder the DevOps section in the developer guide,\r\nthe link to DevOps guide leads a Wiki link instead of redirecting to\r\nthe DevOps guide on the actual Reposense website.\r\n\r\nLet\u0027s fix the broken link by changing the address to the correct page.","fileTypesAndContributionMap":{"md":{"insertions":1,"deletions":1}}}]}],"marquestye":[],"nknguyenhc":[],"Arif-Khalid":[],"NereusWB922":[],"dishenggg":[],"MadLamprey":[],"Tim-Siu":[]},"authorFileTypeContributionMap":{"xenosf":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"sopa301":{"java":0,"js":0,"scss":0,"json":23,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"mingyuanc":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"jingting1412":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"KevinEyo1":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"LamJiuFong":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"yiwen101":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"jonasongg":{"java":0,"js":167,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"domoberzin":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"asdfghjkxd":{"java":817,"js":0,"scss":0,"json":0,"md":26,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"yuanxi1":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"supermii2":{"java":0,"js":0,"scss":0,"json":0,"md":2,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"marquestye":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"nknguyenhc":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"Arif-Khalid":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"NereusWB922":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"dishenggg":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"MadLamprey":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"Tim-Siu":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0}},"authorContributionVariance":{"xenosf":0.0,"sopa301":7.8112516,"mingyuanc":0.0,"jingting1412":0.0,"KevinEyo1":0.0,"LamJiuFong":0.0,"yiwen101":0.0,"jonasongg":305.11362,"domoberzin":0.0,"asdfghjkxd":10038.714,"yuanxi1":0.0,"supermii2":0.09870211,"marquestye":0.0,"nknguyenhc":0.0,"Arif-Khalid":0.0,"NereusWB922":0.0,"dishenggg":0.0,"MadLamprey":0.0,"Tim-Siu":0.0},"authorDisplayNameMap":{"xenosf":"XENO..NONG","sopa301":"POON..RYAN","mingyuanc":"CHIN..YUAN","jingting1412":"WANG..TING","KevinEyo1":"EYO ..EVIN","LamJiuFong":"LAM ..FONG","yiwen101":"WANG..IWEN","jonasongg":"JONA.. WEI","domoberzin":"DOMI.. GIN","asdfghjkxd":"GEOR.. YAO","yuanxi1":"ZHU ..ANXI","supermii2":"ALVI..S NG","marquestye":"TYE ..QUES","nknguyenhc":"NGUY..UYEN","Arif-Khalid":"ARIF..ALID","NereusWB922":"NERE.. BIN","dishenggg":"YEO ..HENG","MadLamprey":"MISR..ITYA","Tim-Siu":"XU S..UYAO"}} +{"authorDailyContributionsMap":{"xenosf":[],"sopa301":[{"date":"2024-01-31","commitResults":[{"hash":"19f9e6847b503b0f9028effd37b2cfab87b72af1","isMergeCommit":false,"messageTitle":"[#1980] Standardise Array Style for Frontend Files (#2084)","messageBody":"Array\u003cT\u003e and T[] can be used interchangeably in TypeScript. We can use\r\nthe same style consistently across the codebase to make it easier for\r\ndevelopers to read and understand array types.\r\n\r\nIn Vue, using T[] in defineComponent requires casting in the form of\r\n\"Array as PropType\u003cT[]\u003e\", while Array\u003cT\u003e can be used as is. Therefore,\r\nit would be more consistent to use Array\u003cT\u003e for .vue files.\r\nAdditionally, such a rule can be enforced more easily with eslint.\r\n\r\nLet\u0027s include a rule for eslint to check array usage and change the\r\ncode to follow this rule.","fileTypesAndContributionMap":{"json":{"insertions":20,"deletions":1}}},{"hash":"f5855fa68b3e23a0fed0c2e7cc94cc6401d175e3","isMergeCommit":false,"messageTitle":"[#1224] Update .stylelintrc.json to check for spacing (#2094)","messageBody":"With no current plans to update stylelint to v15 or beyond, we can\r\nstill use the current features to enforce consistent spacing in our\r\nscss files. This will make the coding style more consistent throughout\r\nthe codebase.\r\n\r\nLet\u0027s update the rules in .stylelintrc.json to enforce spacing.","fileTypesAndContributionMap":{"json":{"insertions":3,"deletions":1}}}]},{"date":"2024-02-19","commitResults":[{"hash":"b103e286bca0d52b5b539b3ec4a9012ecef980bd","isMergeCommit":false,"messageTitle":"[#467] Add Title Component (#2102)","messageBody":"Implement Title Component\r\n\r\nWith a new focus on allowing users to use RepoSense as a portfolio\r\ntool, more functionality supporting this focus is needed.\r\n\r\nLet\u0027s allow users to add customizable content in Markdown/HTML format \r\nat the top of the report for a personalized introduction.","fileTypesAndContributionMap":{"java":{"insertions":1,"deletions":1},"scss":{"insertions":0,"deletions":1},"md":{"insertions":2,"deletions":1},"js":{"insertions":8,"deletions":0},"json":{"insertions":272,"deletions":233}}}]}],"mingyuanc":[],"jingting1412":[],"KevinEyo1":[],"LamJiuFong":[],"yiwen101":[],"jonasongg":[{"date":"2024-01-31","commitResults":[{"hash":"0f682a0c319cde9aefe268deb97e97816c1b387a","isMergeCommit":false,"messageTitle":"[#2016] Remove hash symbol from URL when decoding hash (#2086)","messageBody":"Fix bug where some params were not retained after refresh\r\n\r\nThe issue pertains to breakdown of file types disappearing after a\r\nrefresh, but it seems to apply to all params that were last in the URL\r\ndue to symbols not being filtered out correctly.\r\n\r\nLet\u0027s fix this issue to make sure the state of the report stays the\r\nsame when refreshing.","fileTypesAndContributionMap":{"js":{"insertions":156,"deletions":0}}}]},{"date":"2024-02-17","commitResults":[{"hash":"9ff7a96c6afd5b8837da8ee1ba44b263670ae391","isMergeCommit":false,"messageTitle":"[#2111] Fix failing zoomFeature cypress test (#2114)","messageBody":"Fix nondeterministically failing zoomFeature cypress test\r\n\r\nThe \"range changes in chartview should reflect in zoom\" test in\r\nchartView_zoomFeature.cy.js fails because as time passes, the\r\ncoordinates in the ramp that correspond to the desired zoom area\r\nchange.\r\n\r\nLet\u0027s add an \"until\" filter to the relevant cypress tests to stop this\r\nfrom happening","fileTypesAndContributionMap":{"js":{"insertions":11,"deletions":0}}}]}],"domoberzin":[],"asdfghjkxd":[{"date":"2024-01-18","commitResults":[{"hash":"4ef7210a06fbd6b979a648f8bdce967717a6512c","isMergeCommit":false,"messageTitle":"[#2073] Refactor `RepoConfigCsvParser::processLine` method to avoid arrowhead style code (#2080)","messageBody":"The current implementation of `RepoConfigCsvParser::processLine`\r\ncontains code that has 3 levels of indentation, making it \r\ndifficult to read and maintain.\r\n\r\nWith the proposed changes, the level of deep nesting has \r\nbeen reduced to 2 levels, making the code more \r\nreadable and maintainable.\r\n\r\nLet\u0027s move to refactor and clean up the code to avoid \r\narrowhead-style codes for better readability and \r\nmaintainability.","fileTypesAndContributionMap":{"java":{"insertions":9,"deletions":10}}}]},{"date":"2024-01-26","commitResults":[{"hash":"54ba5ecc417097134c83e7d9dc80b925598cb9ef","isMergeCommit":false,"messageTitle":"[#2091] Improve memory usage by refactoring Regex compilation (#2092)","messageBody":"Improve memory usage by refactoring Regex compilation\r\n\r\nCurrently, Regex checking is used in conjunction with iteration. This\r\npattern of coding is frowned upon due to the excessive Regex pattern\r\ncompilation, causing the program to run slower and consume more\r\nmemory.\r\n\r\nBy moving the Regex pattern compilation outside of the iteration, and\r\nby using `Matcher` objects to check if the strings match the Regex\r\nperformance, we can potentially remove this performance bottleneck.\r\n\r\nLet\u0027s move to refactor the code and remove such instances of Regex use\r\nin iterative loops.","fileTypesAndContributionMap":{"java":{"insertions":11,"deletions":4}}}]},{"date":"2024-01-31","commitResults":[{"hash":"7977382dfeb3f8559ebb85028a510c8bbc23b58e","isMergeCommit":false,"messageTitle":"[#1958] Use syntax coloring for code blocks in docs (#2099)","messageBody":"Current code blocks do not use the built-in syntax highlighting\r\nfeature offered by Markbind/Markdown.\r\n\r\nThis impedes the readability of the code within the code blocks.\r\n\r\nLet\u0027s update the code blocks in the documentation to enable\r\nsyntax highlighting to further enhance readability of the documentation\r\nand the code.","fileTypesAndContributionMap":{"md":{"insertions":26,"deletions":26}}}]},{"date":"2024-02-06","commitResults":[{"hash":"30ef45089c9d959c3d667519f56197b01690d38b","isMergeCommit":false,"messageTitle":"[#1878] Update `SystemTestUtil::assertJson` to compare Json objects instead of line-by-line analysis (#2087)","messageBody":"`SystemTestUtil::assertJson` currently checks if two JSON files are\r\nequal by comparing the file contents line by line rather than by\r\nconverting the files directly into JSON objects, which can then be\r\ndirectly compared using the built-in `equals` methods for\r\n`JsonElement`.\r\n\r\nThis process also does not automatically check if the file is indeed a\r\nJSON file, and implicitly assumes that the input paths are paths to\r\nJSON files. This may cause expected behaviours if a user accidentally\r\nor intentionally includes a path to a non-JSON file within the method\r\ncalls.\r\n\r\nLet\u0027s move to refactor the code, and utilise the built-in methods for\r\n`JsonElement` objects to check for the equality of JSON objects.","fileTypesAndContributionMap":{"java":{"insertions":11,"deletions":4}}}]},{"date":"2024-02-07","commitResults":[{"hash":"29903e31243225f4f4c3c4ad523f2298d2b8e70d","isMergeCommit":false,"messageTitle":"[#2103] Refactor `parser` package for greater organisation of classes (#2104)","messageBody":"Classes in the `parser` package as of now are not properly organised,\r\nwith exceptions, types and parser classes being found in the same\r\ndirectory level.\r\n\r\nThis does not follow the convention established by other packages,\r\nwhereby logically similar classes are further grouped into\r\nsub-packages.\r\n\r\nLet\u0027s move to refactor the `parser` package to ensure that it follows\r\nthe overall structure of the other packages and to increase the level\r\nof organisation within the `parser` package.","fileTypesAndContributionMap":{"java":{"insertions":62,"deletions":32}}}]},{"date":"2024-02-17","commitResults":[{"hash":"d2018d246e74fa04ae70d2f1f0f16c9e8e29e187","isMergeCommit":false,"messageTitle":"[#2076] Refactor RepoConfiguration to simplify constructor complexity (#2078)","messageBody":"Refactor RepoConfiguration to simplify constructor complexity.\r\n\r\nCurrently, the constructors for the `RepoConfiguration` class is \r\nvery complex, involving up to 18 parameters at once, and is \r\nnot easily extensible.\r\n\r\nWith the proposed changes, the constructor now follows the \r\nBuilder pattern, by using a nested class `Builder` that \r\nhelps to compose config parameters in a way that is much more \r\nmodular and comprehensible, enhancing code quality and \r\nreducing confusion among developers.\r\n\r\nHowever, it must be noted that `Builder` objects are not reusable as of\r\nnow, and that more combinations of arguments are permitted due to the\r\nremoval of constructors for `RepoBuilder`, which previously helped to\r\nensure the correctness of parameter combinations.\r\n\r\nLet\u0027s refactor `RepoConfiguration` to simplify the \r\ncomplexity of the constructor and increase modularity \r\nof the code.","fileTypesAndContributionMap":{"java":{"insertions":734,"deletions":158}}}]}],"yuanxi1":[],"supermii2":[{"date":"2024-01-26","commitResults":[{"hash":"3cd680c3ddfa5a96f9168d3ab411d0cccfc3c52f","isMergeCommit":false,"messageTitle":"[#2082] Fix typo in command in Setting Up page (#2083)","messageBody":"Fix typo in Setting Up page\r\n\r\nThe command given in the developer guide for checking the local Node.js\r\nversion is `npm -v`, which displays the version of npm instead.\r\n\r\nLet\u0027s replace the command with `node -v`, which correctly displays the\r\nNode.js version.","fileTypesAndContributionMap":{"md":{"insertions":1,"deletions":1}}}]},{"date":"2024-02-11","commitResults":[{"hash":"945405a6c5786c72e11b23da7c452bb9568b03b6","isMergeCommit":false,"messageTitle":"[#1933] Fix broken DevOps Guide link in Learning Basics (#2107)","messageBody":"Fix broken link to DevOps Guide in Learning Basics page.\r\n\r\nUnder the DevOps section in the developer guide,\r\nthe link to DevOps guide leads a Wiki link instead of redirecting to\r\nthe DevOps guide on the actual Reposense website.\r\n\r\nLet\u0027s fix the broken link by changing the address to the correct page.","fileTypesAndContributionMap":{"md":{"insertions":1,"deletions":1}}}]}],"marquestye":[],"nknguyenhc":[],"Arif-Khalid":[],"NereusWB922":[],"dishenggg":[],"MadLamprey":[],"Tim-Siu":[]},"authorFileTypeContributionMap":{"xenosf":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"sopa301":{"java":1,"js":8,"scss":0,"json":295,"md":2,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"mingyuanc":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"jingting1412":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"KevinEyo1":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"LamJiuFong":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"yiwen101":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"jonasongg":{"java":0,"js":167,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"domoberzin":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"asdfghjkxd":{"java":817,"js":0,"scss":0,"json":0,"md":26,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"yuanxi1":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"supermii2":{"java":0,"js":0,"scss":0,"json":0,"md":2,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"marquestye":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"nknguyenhc":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"Arif-Khalid":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"NereusWB922":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"dishenggg":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"MadLamprey":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0},"Tim-Siu":{"java":0,"js":0,"scss":0,"json":0,"md":0,"py":0,"pug":0,"gradle":0,"sh":0,"yml":0}},"authorContributionVariance":{"xenosf":0.0,"sopa301":3288.0547,"mingyuanc":0.0,"jingting1412":0.0,"KevinEyo1":0.0,"LamJiuFong":0.0,"yiwen101":0.0,"jonasongg":297.6874,"domoberzin":0.0,"asdfghjkxd":9795.403,"yuanxi1":0.0,"supermii2":0.09632675,"marquestye":0.0,"nknguyenhc":0.0,"Arif-Khalid":0.0,"NereusWB922":0.0,"dishenggg":0.0,"MadLamprey":0.0,"Tim-Siu":0.0},"authorDisplayNameMap":{"xenosf":"XENO..NONG","sopa301":"POON..RYAN","mingyuanc":"CHIN..YUAN","jingting1412":"WANG..TING","KevinEyo1":"EYO ..EVIN","LamJiuFong":"LAM ..FONG","yiwen101":"WANG..IWEN","jonasongg":"JONA.. WEI","domoberzin":"DOMI.. GIN","asdfghjkxd":"GEOR.. YAO","yuanxi1":"ZHU ..ANXI","supermii2":"ALVI..S NG","marquestye":"TYE ..QUES","nknguyenhc":"NGUY..UYEN","Arif-Khalid":"ARIF..ALID","NereusWB922":"NERE.. BIN","dishenggg":"YEO ..HENG","MadLamprey":"MISR..ITYA","Tim-Siu":"XU S..UYAO"}} diff --git a/summary.json b/summary.json index 332d087..d0f8a15 100644 --- a/summary.json +++ b/summary.json @@ -1 +1 @@ -{"repoSenseVersion":"5cd529fb46","reportGeneratedTime":"Mon Feb 19 08:02:25 2024 UTC+08:00","reportGenerationTime":" 37.96 second(s)","zoneId":"UTC+08:00","reportTitle":"RepoSense Report","repos":[{"location":{"location":"https://github.com/markbind/markbind.git","repoName":"markbind","organization":"markbind","domainName":"github"},"branch":"master","displayName":"markbind/markbind[master]","outputFolderName":"markbind_markbind_master"},{"location":{"location":"https://github.com/reposense/reposense.git","repoName":"reposense","organization":"reposense","domainName":"github"},"branch":"master","displayName":"reposense/reposense[master]","outputFolderName":"reposense_reposense_master"},{"location":{"location":"https://github.com/se-edu/addressbook-level3.git","repoName":"addressbook-level3","organization":"se-edu","domainName":"github"},"branch":"master","displayName":"se-edu/addressbook-level3[master]","outputFolderName":"se-edu_addressbook-level3_master"},{"location":{"location":"https://github.com/TEAMMATES/teammates.git","repoName":"teammates","organization":"TEAMMATES","domainName":"github"},"branch":"master","displayName":"TEAMMATES/teammates[master]","outputFolderName":"TEAMMATES_teammates_master"},{"location":{"location":"https://github.com/CATcher-org/CATcher.git","repoName":"CATcher","organization":"CATcher-org","domainName":"github"},"branch":"master","displayName":"CATcher-org/CATcher[master]","outputFolderName":"CATcher-org_CATcher_master"},{"location":{"location":"https://github.com/CATcher-org/WATcher.git","repoName":"WATcher","organization":"CATcher-org","domainName":"github"},"branch":"main","displayName":"CATcher-org/WATcher[main]","outputFolderName":"CATcher-org_WATcher_main"}],"errorSet":[],"sinceDate":"2023-12-01","untilDate":"2024-02-19","isSinceDateProvided":true,"isUntilDateProvided":false,"supportedDomainUrlMap":{"NOT_RECOGNIZED":{"BRANCH":"","REPO_URL":"UNSUPPORTED","BASE_URL":"UNSUPPORTED","HISTORY_PATH":"","COMMIT_PATH":"","BLAME_PATH":""},"github":{"BRANCH":"tree/$BRANCH","REPO_URL":"https://github.com/$ORGANIZATION/$REPO_NAME/","BASE_URL":"https://github.com/","HISTORY_PATH":"commits/$BRANCH/$FILE_PATH","COMMIT_PATH":"commit/$COMMIT_HASH","BLAME_PATH":"blame/$BRANCH/$FILE_PATH"}}} +{"repoSenseVersion":"5cd529fb46","reportGeneratedTime":"Tue Feb 20 08:02:06 2024 UTC+08:00","reportGenerationTime":" 38.76 second(s)","zoneId":"UTC+08:00","reportTitle":"RepoSense Report","repos":[{"location":{"location":"https://github.com/markbind/markbind.git","repoName":"markbind","organization":"markbind","domainName":"github"},"branch":"master","displayName":"markbind/markbind[master]","outputFolderName":"markbind_markbind_master"},{"location":{"location":"https://github.com/reposense/reposense.git","repoName":"reposense","organization":"reposense","domainName":"github"},"branch":"master","displayName":"reposense/reposense[master]","outputFolderName":"reposense_reposense_master"},{"location":{"location":"https://github.com/se-edu/addressbook-level3.git","repoName":"addressbook-level3","organization":"se-edu","domainName":"github"},"branch":"master","displayName":"se-edu/addressbook-level3[master]","outputFolderName":"se-edu_addressbook-level3_master"},{"location":{"location":"https://github.com/TEAMMATES/teammates.git","repoName":"teammates","organization":"TEAMMATES","domainName":"github"},"branch":"master","displayName":"TEAMMATES/teammates[master]","outputFolderName":"TEAMMATES_teammates_master"},{"location":{"location":"https://github.com/CATcher-org/CATcher.git","repoName":"CATcher","organization":"CATcher-org","domainName":"github"},"branch":"master","displayName":"CATcher-org/CATcher[master]","outputFolderName":"CATcher-org_CATcher_master"},{"location":{"location":"https://github.com/CATcher-org/WATcher.git","repoName":"WATcher","organization":"CATcher-org","domainName":"github"},"branch":"main","displayName":"CATcher-org/WATcher[main]","outputFolderName":"CATcher-org_WATcher_main"}],"errorSet":[],"sinceDate":"2023-12-01","untilDate":"2024-02-20","isSinceDateProvided":true,"isUntilDateProvided":false,"supportedDomainUrlMap":{"NOT_RECOGNIZED":{"BRANCH":"","REPO_URL":"UNSUPPORTED","BASE_URL":"UNSUPPORTED","HISTORY_PATH":"","COMMIT_PATH":"","BLAME_PATH":""},"github":{"BRANCH":"tree/$BRANCH","REPO_URL":"https://github.com/$ORGANIZATION/$REPO_NAME/","BASE_URL":"https://github.com/","HISTORY_PATH":"commits/$BRANCH/$FILE_PATH","COMMIT_PATH":"commit/$COMMIT_HASH","BLAME_PATH":"blame/$BRANCH/$FILE_PATH"}}}