Skip to content

Commit a98b182

Browse files
committed
Adds custom avatar
1 parent eb3b9c8 commit a98b182

5 files changed

Lines changed: 34 additions & 1 deletion

File tree

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3086,6 +3086,10 @@
30863086
"fileRange": {
30873087
"type": "string",
30883088
"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"
3089+
},
3090+
"avatar": {
3091+
"type": "string",
3092+
"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"
30893093
}
30903094
},
30913095
"additionalProperties": false

src/avatars.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ function getAvatarUriCore(
125125
const avatar = createOrUpdateAvatar(key, email, size, hash, options?.defaultStyle);
126126
if (avatar.uri != null) return avatar.uri;
127127

128-
if (!options?.cached && repoPathOrCommit != null && getContext('gitlens:hasConnectedRemotes')) {
128+
if (!options?.cached && repoPathOrCommit != null && getContext('gitlens:hasRemotes')) {
129129
let query = avatarQueue.get(key);
130130
if (query == null && hasAvatarExpired(avatar)) {
131131
query = getAvatarUriFromRemoteProvider(avatar, key, email, repoPathOrCommit, { size: size }).then(
@@ -213,6 +213,19 @@ async function getAvatarUriFromRemoteProvider(
213213
) {
214214
ensureAvatarCache(avatarCache);
215215

216+
if (!getContext('gitlens:hasConnectedRemotes')) {
217+
const remote = await Container.instance.git.getBestRemoteWithProvider(
218+
typeof repoPathOrCommit !== 'string' ? repoPathOrCommit.repoPath : repoPathOrCommit,
219+
);
220+
const avatarUrl = remote?.provider.getUrlForAvatar?.(email, size);
221+
if (avatarUrl) {
222+
avatar.uri = Uri.parse(avatarUrl);
223+
avatar.timestamp = Date.now();
224+
avatar.retries = 0;
225+
}
226+
return avatar.uri ?? avatar.fallback;
227+
}
228+
216229
try {
217230
let account;
218231
// if (typeof repoPathOrCommit === 'string') {

src/config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,7 @@ export interface RemotesUrlsConfig {
522522
readonly fileInCommit: string;
523523
readonly fileLine: string;
524524
readonly fileRange: string;
525+
readonly avatar?: string;
525526
}
526527

527528
// NOTE: Must be kept in sync with `gitlens.advanced.messages` setting in the package.json

src/git/remotes/custom.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,19 @@ export class CustomRemote extends RemoteProvider {
3333
return Promise.resolve(undefined);
3434
}
3535

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

src/git/remotes/remoteProvider.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,8 @@ export abstract class RemoteProvider<T extends RepositoryDescriptor = Repository
153153

154154
protected abstract getUrlForCommit(sha: string): string;
155155

156+
getUrlForAvatar?(email: string, size: number): string | undefined;
157+
156158
protected getUrlForComparison?(base: string, compare: string, notation: '..' | '...'): string | undefined;
157159

158160
protected getUrlForCreatePullRequest?(

0 commit comments

Comments
 (0)