Skip to content

Commit c628b5e

Browse files
tmkxsergeibbb
authored andcommitted
Add custom avatar
(#1636, #5155)
1 parent 1a09ed9 commit c628b5e

5 files changed

Lines changed: 38 additions & 1 deletion

File tree

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4102,6 +4102,10 @@
41024102
"fileRange": {
41034103
"type": "string",
41044104
"markdownDescription": "Specifies the format of a range in a file URL for the custom remote service\n\nAvailable tokens\\\n`${start}` — starting line\\\n`${end}` — ending line"
4105+
},
4106+
"avatar": {
4107+
"type": "string",
4108+
"markdownDescription": "Specifies the format of a avatar url for the custom remote service\n\nAvailable tokens\\\n`${email}` — contributor email\\\n`${name}` — email local-part\\\n`${domain}` — email domain\\\n`${size}` — avatar size"
41054109
}
41064110
},
41074111
"additionalProperties": false

packages/git/src/models/remoteProvider.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ export interface RemotesUrlsConfig {
7474
readonly fileInCommit: string;
7575
readonly fileLine: string;
7676
readonly fileRange: string;
77+
readonly avatar?: string;
7778
}
7879

7980
export abstract class RemoteProvider<T extends ResourceDescriptor = ResourceDescriptor> implements ProviderReference {

packages/git/src/remotes/custom.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,19 @@ export class CustomRemoteProvider extends RemoteProvider {
3535
return [];
3636
}
3737

38+
getUrlForAvatar(email: string, size: number): string | undefined {
39+
if (this.urls.avatar != null) {
40+
const [name, domain] = email.split('@');
41+
return this.encodeUrl(
42+
interpolate(
43+
this.urls.avatar,
44+
this.getContext({ name: name, domain: domain, email: email, size: String(size) }),
45+
),
46+
);
47+
}
48+
return undefined;
49+
}
50+
3851
protected override getUrlForRepository(): string {
3952
return this.getUrl(this.urls.repository, this.getContext());
4053
}

src/avatars.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { EventEmitter, Uri } from 'vscode';
22
import type { CommitAuthor } from '@gitlens/git/models/author.js';
3+
import { CustomRemoteProvider } from '@gitlens/git/remotes/custom.js';
34
import { getGitHubNoReplyAddressParts } from '@gitlens/git/remotes/github.js';
45
import { base64 } from '@gitlens/utils/base64.js';
56
import { md5 } from '@gitlens/utils/crypto.js';
@@ -135,7 +136,7 @@ function getAvatarUriCore(
135136
if (
136137
!options?.cached &&
137138
repoPathOrCommit != null &&
138-
getContext('gitlens:repos:withHostingIntegrationsConnected')?.includes(
139+
getContext('gitlens:repos:withRemotes')?.includes(
139140
typeof repoPathOrCommit === 'string' ? repoPathOrCommit : repoPathOrCommit.repoPath,
140141
)
141142
) {
@@ -245,6 +246,23 @@ async function getAvatarUriFromRemoteProvider(
245246
avatarSize: size,
246247
});
247248
}
249+
250+
if (!account) {
251+
const remoteWithProvider = await Container.instance.git
252+
.getRepositoryService(repoPathOrCommit.repoPath)
253+
.remotes.getBestRemoteWithProvider();
254+
255+
if (remoteWithProvider?.provider instanceof CustomRemoteProvider) {
256+
const avatarUrl = remoteWithProvider.provider.getUrlForAvatar(email, size);
257+
if (avatarUrl != null) {
258+
avatar.uri = Uri.parse(avatarUrl);
259+
avatar.timestamp = Date.now();
260+
avatar.retries = 0;
261+
avatarCache.set(`${md5(email.trim().toLowerCase())}:${size}`, { ...avatar });
262+
return avatar.uri;
263+
}
264+
}
265+
}
248266
}
249267

250268
if (account?.avatarUrl == null) {

src/config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -699,6 +699,7 @@ export interface RemotesUrlsConfig {
699699
readonly fileInCommit: string;
700700
readonly fileLine: string;
701701
readonly fileRange: string;
702+
readonly avatar?: string;
702703
}
703704

704705
interface SigningConfig {

0 commit comments

Comments
 (0)