diff --git a/src/git/git.ts b/src/git/git.ts index c565f2a..3983e4a 100644 --- a/src/git/git.ts +++ b/src/git/git.ts @@ -23,7 +23,7 @@ export * from './remotes/provider'; let git: IGit; const defaultBlameParams = ['blame', '--root', '--incremental']; -const defaultLogParams = ['log', '--name-status', '--full-history', '-M', '--format=%H -%nauthor %an%nauthor-email %ae%nauthor-date %at%nparents %P%nsummary %B%nfilename ?']; +const defaultLogParams = ['log', '--name-status', '--full-history', '-M', '--format=%H -%nauthor %an%nauthor-mail %ae%nauthor-date %at%nparents %P%nsummary %B%nfilename ?']; const defaultStashParams = ['stash', 'list', '--name-status', '--full-history', '-M', '--format=%H -%nauthor-date %at%nreflog-selector %gd%nsummary %B%nfilename ?']; const GitWarnings = [ diff --git a/src/git/models/blameCommit.ts b/src/git/models/blameCommit.ts index 28469ea..2b84f50 100644 --- a/src/git/models/blameCommit.ts +++ b/src/git/models/blameCommit.ts @@ -7,6 +7,7 @@ export class GitBlameCommit extends GitCommit { repoPath: string, sha: string, author: string, + email: string | undefined, date: Date, message: string, fileName: string, @@ -20,6 +21,7 @@ export class GitBlameCommit extends GitCommit { repoPath, sha, author, + email, date, message, fileName, @@ -40,6 +42,7 @@ export class GitBlameCommit extends GitCommit { this.repoPath, changes.sha || this.sha, this.author, + this.email, this.date, this.message, changes.fileName || this.fileName, diff --git a/src/git/models/commit.ts b/src/git/models/commit.ts index 5baf36f..e402c4e 100644 --- a/src/git/models/commit.ts +++ b/src/git/models/commit.ts @@ -1,13 +1,18 @@ 'use strict'; import { Dates, Strings } from '../../system'; import { Uri } from 'vscode'; -import { configuration, DateStyle } from '../../configuration'; +import { configuration, DateStyle, GravatarDefault } from '../../configuration'; import { GlyphChars } from '../../constants'; import { Container } from '../../container'; import { Git } from '../git'; import { GitUri } from '../gitUri'; import * as path from 'path'; +const gravatarCache: Map = new Map(); +export function clearGravatarCache() { + gravatarCache.clear(); +} + export interface GitAuthor { name: string; lineCount: number; @@ -58,6 +63,7 @@ export abstract class GitCommit { public readonly repoPath: string, public readonly sha: string, public readonly author: string, + public readonly email: string | undefined, public readonly date: Date, public readonly message: string, fileName: string, @@ -165,6 +171,27 @@ export abstract class GitCommit { return GitUri.getFormattedPath(this.fileName, separator); } + getGravatarUri(fallback: GravatarDefault): Uri { + const key = this.email + ? `${ this.email.trim().toLowerCase() }` + : ''; + + let gravatar = gravatarCache.get(key); + if (gravatar !== undefined) return gravatar; + + gravatar = Uri.parse(`https://www.gravatar.com/avatar/${this.email ? Strings.md5(this.email, 'hex') : '00000000000000000000000000000000'}.jpg?s=22&d=${fallback}`); + + // HACK: Monkey patch Uri.toString to avoid the unwanted query string encoding + const originalToStringFn = gravatar.toString; + gravatar.toString = function(skipEncoding?: boolean | undefined) { + return originalToStringFn.call(gravatar, true); + }; + + gravatarCache.set(key, gravatar); + + return gravatar; + } + async resolvePreviousFileSha(): Promise { if (this._resolvedPreviousFileSha !== undefined) return; diff --git a/src/git/models/logCommit.ts b/src/git/models/logCommit.ts index 3e3bd8c..8b92a6c 100644 --- a/src/git/models/logCommit.ts +++ b/src/git/models/logCommit.ts @@ -2,17 +2,10 @@ import { Strings } from '../../system'; import { Uri } from 'vscode'; import { GitCommit, GitCommitType } from './commit'; -import { GravatarDefault } from '../../configuration'; import { Git } from '../git'; import { GitStatusFileStatus, IGitStatusFile } from './status'; import * as path from 'path'; -const gravatarCache: Map = new Map(); - -export function clearGravatarCache() { - gravatarCache.clear(); -} - export class GitLogCommit extends GitCommit { nextSha?: string; @@ -23,7 +16,7 @@ export class GitLogCommit extends GitCommit { repoPath: string, sha: string, author: string, - public readonly email: string | undefined, + email: string | undefined, date: Date, message: string, fileName: string, @@ -39,6 +32,7 @@ export class GitLogCommit extends GitCommit { repoPath, sha, author, + email, date, message, fileName, @@ -91,27 +85,6 @@ export class GitLogCommit extends GitCommit { return `+${added} ~${changed} -${deleted}`; } - getGravatarUri(fallback: GravatarDefault): Uri { - const key = this.email - ? `${ this.email.trim().toLowerCase() }` - : ''; - - let gravatar = gravatarCache.get(key); - if (gravatar !== undefined) return gravatar; - - gravatar = Uri.parse(`https://www.gravatar.com/avatar/${this.email ? Strings.md5(this.email, 'hex') : '00000000000000000000000000000000'}.jpg?s=22&d=${fallback}`); - - // HACK: Monkey patch Uri.toString to avoid the unwanted query string encoding - const originalToStringFn = gravatar.toString; - gravatar.toString = function(skipEncoding?: boolean | undefined) { - return originalToStringFn.call(gravatar, true); - }; - - gravatarCache.set(key, gravatar); - - return gravatar; - } - toFileCommit(fileName: string): GitLogCommit | undefined; toFileCommit(status: IGitStatusFile): GitLogCommit; toFileCommit(fileNameOrStatus: string | IGitStatusFile): GitLogCommit | undefined { diff --git a/src/git/parsers/blameParser.ts b/src/git/parsers/blameParser.ts index 53c3ea6..590530f 100644 --- a/src/git/parsers/blameParser.ts +++ b/src/git/parsers/blameParser.ts @@ -13,6 +13,7 @@ interface BlameEntry { author: string; authorDate?: string; authorTimeZone?: string; + authorEmail?: string; previousSha?: string; previousFileName?: string; @@ -61,6 +62,21 @@ export class GitBlameParser { : lineParts.slice(1).join(' ').trim(); break; + case 'author-mail': + entry.authorEmail = lineParts.slice(1).join(' ').trim(); + const start = entry.authorEmail.indexOf('<'); + if (start >= 0) { + const end = entry.authorEmail.indexOf('>', start); + if (end > start) { + entry.authorEmail = entry.authorEmail.substring(start + 1, end); + } + else { + entry.authorEmail = entry.authorEmail.substring(start + 1); + } + } + + break; + case 'author-time': entry.authorDate = lineParts[1]; break; @@ -135,6 +151,7 @@ export class GitBlameParser { repoPath!, entry.sha, entry.author, + entry.authorEmail, new Date(entry.authorDate as any * 1000), entry.summary!, fileName!, diff --git a/src/git/parsers/logParser.ts b/src/git/parsers/logParser.ts index 7176801..d2e9d6d 100644 --- a/src/git/parsers/logParser.ts +++ b/src/git/parsers/logParser.ts @@ -9,8 +9,8 @@ interface LogEntry { sha: string; author: string; - authorEmail?: string; authorDate?: string; + authorEmail?: string; parentShas?: string[]; @@ -84,7 +84,7 @@ export class GitLogParser { : lineParts.slice(1).join(' ').trim(); break; - case 'author-email': + case 'author-mail': entry.authorEmail = lineParts.slice(1).join(' ').trim(); break;