Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,9 @@ See the [development guide](docs/development.md) to run GitHub1s locally. Report

[conwnet](https://github.com/conwnet) · [xcv58](https://github.com/xcv58) · [Siddhant Khare](https://github.com/Siddhant-K-code)

## 💖 Acknowledgments
## 💖 Thanks

Thanks to everyone who has contributed to GitHub1s, and to [Sourcegraph](https://sourcegraph.com/), [searchcode](https://searchcode.com/), and [OSS Insight](https://ossinsight.io/) for their support of the project.
Thanks to everyone who has contributed to GitHub1s, and to [Sourcegraph](https://sourcegraph.com/), [searchcode](https://searchcode.com/), and [OSS Insight](https://ossinsight.io/) for the tools and services used by GitHub1s.

## 📄 License

Expand Down
5 changes: 3 additions & 2 deletions docs/usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,9 @@ For branches or tags, you can also run **GitHub1s: Checkout to...**. Its **Check

- Use **Explorer** to browse files and directories, or **Go to File** to find a file by name.
- Use **Search** for text across the repository and the editor's **Find** action for the open file.
- Open **Source Control** to inspect **Commits**, **File History**, and **Code Reviews** where the platform supports them.
- Select a commit or pull/merge request to inspect its changed files and diffs.
- Open a file and expand **Timeline** in **Explorer** to inspect its history. Select a commit entry to open that file's diff.
- In **Source Control**, use the built-in **Graph** view to browse commits for the current ref and inspect their changed files and diffs.
- In **Source Control**, select a pull/merge request from **Pull Requests** (GitHub) or **Merge Requests** (GitLab) to inspect its changed files and diffs.
- Run **GitHub1s: Toggle File Blame** to display revision information beside file lines where available.

Open the Command Palette with `F1`, `Ctrl+Shift+P`, or `Cmd+Shift+P` on macOS. Browser and operating-system shortcuts can take precedence.
Expand Down
11 changes: 0 additions & 11 deletions extensions/github1s/src/adapters/bitbucket1s/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import { BitbucketRouterParser } from './router-parser';
import { SourcegraphDataSource } from '../sourcegraph/data-source';
import { Adapter, CodeReviewType, PlatformName } from '../types';
import { setVSCodeContext } from '@/helpers/vscode';

export class BitbucketAdapter implements Adapter {
public scheme: string = 'bitbucket1s';
Expand All @@ -20,14 +19,4 @@ export class BitbucketAdapter implements Adapter {
resolveRouterParser() {
return Promise.resolve(BitbucketRouterParser.getInstance());
}

activateAsDefault() {
setVSCodeContext('github1s:views:commitList:visible', true);
setVSCodeContext('github1s:features:gutterBlame:enabled', true);
}

deactivateAsDefault() {
setVSCodeContext('github1s:views:commitList:visible', false);
setVSCodeContext('github1s:features:gutterBlame:enabled', false);
}
}
6 changes: 0 additions & 6 deletions extensions/github1s/src/adapters/github1s/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,6 @@ export class GitHub1sAdapter implements Adapter {
activateAsDefault() {
// register settings view and show it in activity bar
setVSCodeContext('github1s:views:settings:visible', true);
setVSCodeContext('github1s:views:codeReviewList:visible', true);
setVSCodeContext('github1s:views:commitList:visible', true);
setVSCodeContext('github1s:features:gutterBlame:enabled', true);

vscode.window.registerWebviewViewProvider(
GitHub1sSettingsViewProvider.viewType,
Expand All @@ -51,8 +48,5 @@ export class GitHub1sAdapter implements Adapter {

deactivateAsDefault() {
setVSCodeContext('github1s:views:settings:visible', false);
setVSCodeContext('github1s:views:codeReviewList:visible', false);
setVSCodeContext('github1s:views:commitList:visible', false);
setVSCodeContext('github1s:features:gutterBlame:enabled', false);
}
}
6 changes: 0 additions & 6 deletions extensions/github1s/src/adapters/gitlab1s/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,6 @@ export class GitLab1sAdapter implements Adapter {
activateAsDefault() {
// register settings view and show it in activity bar
setVSCodeContext('github1s:views:settings:visible', true);
setVSCodeContext('github1s:views:codeReviewList:visible', true);
setVSCodeContext('github1s:views:commitList:visible', true);
setVSCodeContext('github1s:features:gutterBlame:enabled', true);

vscode.window.registerWebviewViewProvider(
GitLab1sSettingsViewProvider.viewType,
Expand All @@ -49,8 +46,5 @@ export class GitLab1sAdapter implements Adapter {

deactivateAsDefault() {
setVSCodeContext('github1s:views:settings:visible', false);
setVSCodeContext('github1s:views:codeReviewList:visible', false);
setVSCodeContext('github1s:views:commitList:visible', false);
setVSCodeContext('github1s:features:gutterBlame:enabled', false);
}
}
31 changes: 31 additions & 0 deletions extensions/github1s/src/adapters/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { BitbucketAdapter } from './bitbucket1s';
import { Npmjs1sAdapter } from './npmjs1s';
import { DiscoveryAdapter } from './discovery';
import { Adapter, DataSource, PlatformName, RouterParser } from './types';
import { setVSCodeContext } from '@/helpers/vscode';

const emptyAdapter = {
scheme: 'empty',
Expand All @@ -27,6 +28,8 @@ export const registerAdapters = async (): Promise<void> => {
adapterManager.registerAdapter(new Npmjs1sAdapter()),
adapterManager.registerAdapter(new DiscoveryAdapter()),
]);
await setVSCodeContext('github1s:views:codeReviewList:visible', await supportsCodeReviewFeatures());
await setVSCodeContext('github1s:features:gutterBlame:enabled', await supportsGutterBlameFeatures());
};

export const getAdapter = (scheme?: string): Adapter => {
Expand All @@ -36,3 +39,31 @@ export const getAdapter = (scheme?: string): Adapter => {
export const getAllAdapters = (): Adapter[] => {
return adapterManager.getAllAdapters();
};

export const supportsDataSourceMethods = async (
methods: (keyof DataSource)[],
scheme: string = getAdapter().scheme,
): Promise<boolean> => {
const adapter = getAllAdapters().find((adapter) => adapter.scheme === scheme);
if (!adapter) {
return false;
}
const dataSource = await adapter.resolveDataSource();
// Inherited default methods return empty results and do not indicate support.
return methods.every((method) => dataSource[method] !== DataSource.prototype[method]);
};

export const supportsCommitFeatures = (scheme?: string): Promise<boolean> => {
return supportsDataSourceMethods(['provideCommits', 'provideCommit', 'provideCommitChangedFiles'], scheme);
};

export const supportsCodeReviewFeatures = (scheme?: string): Promise<boolean> => {
return supportsDataSourceMethods(
['provideCodeReviews', 'provideCodeReview', 'provideCodeReviewChangedFiles'],
scheme,
);
};

export const supportsGutterBlameFeatures = (scheme?: string): Promise<boolean> => {
return supportsDataSourceMethods(['provideFileBlameRanges'], scheme);
};
9 changes: 7 additions & 2 deletions extensions/github1s/src/changes/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

import * as vscode from 'vscode';
import * as adapterTypes from '@/adapters/types';
import { supportsCommitFeatures } from '@/adapters';
import { getExtensionContext } from '@/helpers/context';
import { GitHub1sQuickDiffProvider } from './quick-diff';
import { getChangedFileDiffCommand, getChangedFiles } from './files';
Expand All @@ -14,11 +15,15 @@ const sourceControl = vscode.scm.createSourceControl('github1s', 'GitHub1s');
const changesGroup = sourceControl.createResourceGroup('changes', 'Changes');
sourceControl.quickDiffProvider = new GitHub1sQuickDiffProvider();

export const registerSourceControlHistory = () => {
export const registerSourceControlHistory = async () => {
const context = getExtensionContext();
context.subscriptions.push(sourceControl);
if (!(await supportsCommitFeatures())) {
return;
}
const historyProvider = GitHub1sHistoryProvider.getInstance();
sourceControl.historyProvider = historyProvider;
context.subscriptions.push(sourceControl, historyProvider);
context.subscriptions.push(historyProvider);
historyProvider.refresh();
};

Expand Down
13 changes: 8 additions & 5 deletions extensions/github1s/src/commands/editor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import * as vscode from 'vscode';
import queryString from 'query-string';
import router from '@/router';
import { emptyFileUri } from '@/providers';
import { supportsCommitFeatures } from '@/adapters';
import { FileChangeStatus } from '@/adapters/types';
import { Repository } from '@/repository';
import { getChangedFiles, getChangedFileDiffCommand, getChangedFileDiffTitle } from '@/changes/files';
Expand Down Expand Up @@ -36,8 +37,8 @@ const commandDiffChangedFile = async (fileUri: vscode.Uri) => {
vscode.commands.executeCommand(command.command, ...(command.arguments || []));
};

const isRepositoryFileUri = (uri: vscode.Uri | undefined): uri is vscode.Uri => {
return !!uri && /^(github1s|gitlab1s|bitbucket1s)$/.test(uri.scheme);
const isRepositoryFileUri = async (uri: vscode.Uri | undefined): Promise<boolean> => {
return !!uri && supportsCommitFeatures(uri.scheme);
};

const getActiveDiffInput = (resource?: vscode.Uri): vscode.TabInputTextDiff | undefined => {
Expand Down Expand Up @@ -74,8 +75,10 @@ const resolveOpenFileRevisionArgs = async (
if (textDiffInput) {
// this is a diff editor
const { original, modified } = textDiffInput;
const hasLeftFile = isRepositoryFileUri(original);
const hasRightFile = isRepositoryFileUri(modified);
const [hasLeftFile, hasRightFile] = await Promise.all([
isRepositoryFileUri(original),
isRepositoryFileUri(modified),
]);

if (direction === 'previous' && hasLeftFile) {
baseUri = original;
Expand All @@ -86,7 +89,7 @@ const resolveOpenFileRevisionArgs = async (
if (hasRightFile) {
from = getQueryFrom(modified);
}
} else if (isRepositoryFileUri(fileUri)) {
} else if (fileUri && (await isRepositoryFileUri(fileUri))) {
// this is a single file editor
from = getQueryFrom(fileUri);
baseUri = fileUri;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ const selectedViewItemDecoration: FileDecoration = {

export class GitHub1sSourceControlDecorationProvider implements FileDecorationProvider, Disposable {
public static codeReviewSchema: string = 'github1s-source-control-code-review';
public static commitSchema: string = 'github1s-source-control-commit';
private static instance: GitHub1sSourceControlDecorationProvider | null = null;

private readonly disposable: Disposable;
Expand Down Expand Up @@ -60,11 +59,5 @@ export class GitHub1sSourceControlDecorationProvider implements FileDecorationPr
const query = queryString.parse(uri.query);
return +(routerState as any).codeReviewId === +query.id! ? selectedViewItemDecoration : null;
}

if (uri.scheme === GitHub1sSourceControlDecorationProvider.commitSchema) {
const routerState = router.getState();
const query = queryString.parse(uri.query);
return (routerState as any).commitSha === query.sha ? selectedViewItemDecoration : null;
}
}
}
9 changes: 6 additions & 3 deletions extensions/github1s/src/providers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
*/

import * as vscode from 'vscode';
import { getAllAdapters } from '@/adapters';
import { getAllAdapters, supportsCommitFeatures } from '@/adapters';
import { getExtensionContext } from '@/helpers/context';
import { GitHub1sFileSystemProvider } from './file-system';
import { GitHub1sFileSearchProvider } from './file-search';
Expand All @@ -20,7 +20,7 @@ import { FileHistoryTimelineProvider } from './timeline';
export const EMPTY_FILE_SCHEME = 'github1s-empty-file';
export const emptyFileUri = vscode.Uri.from({ scheme: EMPTY_FILE_SCHEME });

export const registerVSCodeProviders = () => {
export const registerVSCodeProviders = async () => {
const context = getExtensionContext();
const fileHistoryProvider = FileHistoryTimelineProvider.getInstance();
const allSchemes = getAllAdapters().map((item) => item.scheme);
Expand All @@ -39,9 +39,12 @@ export const registerVSCodeProviders = () => {
);
});

const timelineSupport = await Promise.all(allSchemes.map(supportsCommitFeatures));
const timelineSchemes = allSchemes.filter((_, index) => timelineSupport[index]);

context.subscriptions.push(
fileHistoryProvider,
vscode.workspace.registerTimelineProvider(FileHistoryTimelineProvider.schemes, fileHistoryProvider),
vscode.workspace.registerTimelineProvider(timelineSchemes, fileHistoryProvider),
vscode.window.registerFileDecorationProvider(GitHub1sSubmoduleDecorationProvider.getInstance()),
vscode.window.registerFileDecorationProvider(GitHub1sChangedFileDecorationProvider.getInstance()),
vscode.window.registerFileDecorationProvider(GitHub1sSourceControlDecorationProvider.getInstance()),
Expand Down
8 changes: 2 additions & 6 deletions extensions/github1s/src/providers/timeline.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ import router, { UriState } from '@/router';
import { Repository } from '@/repository';
import { getCommitTooltip } from '@/helpers/commit';
import { Commit } from '@/adapters/types';
import { supportsCommitFeatures } from '@/adapters';

export class FileHistoryTimelineProvider implements vscode.TimelineProvider, vscode.Disposable {
private static instance: FileHistoryTimelineProvider | null = null;
public static readonly schemes = ['github1s', 'gitlab1s', 'bitbucket1s'];
readonly id = 'github1s.fileHistory';
readonly label = 'Git History';

Expand Down Expand Up @@ -43,11 +43,7 @@ export class FileHistoryTimelineProvider implements vscode.TimelineProvider, vsc
options: vscode.TimelineOptions,
token: vscode.CancellationToken,
): Promise<vscode.Timeline | undefined> {
if (
!FileHistoryTimelineProvider.schemes.includes(uri.scheme) ||
uri.path === '/' ||
token.isCancellationRequested
) {
if (uri.path === '/' || token.isCancellationRequested || !(await supportsCommitFeatures(uri.scheme))) {
return undefined;
}

Expand Down
4 changes: 2 additions & 2 deletions extensions/github1s/src/statusbar/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
*/

import { updateCheckoutTo } from './checkout';
import { showSponsors } from './sponsors';
import { showThanks } from './thanks';

export const decorateStatusBar = () => {
updateCheckoutTo();
showSponsors();
showThanks();
};
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* @file Show Sponsors In Status Bar
* @file Show Thanks In Status Bar
* @author netcon
*/

Expand All @@ -22,7 +22,7 @@ const resolveSourcegraphLink = async () => {
}
};

const resolveSponsors = async () => {
const resolveThanks = async () => {
return [
{
name: 'Sourcegraph',
Expand All @@ -32,20 +32,20 @@ const resolveSponsors = async () => {
];
};

export const showSponsors = async () => {
export const showThanks = async () => {
const titleItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 0);
titleItem.text = ' $(heart) Sponsors:';
titleItem.text = ' $(heart) Thanks:';
titleItem.show();

(await resolveSponsors()).forEach((sponsor) => {
const sponsorItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 0);
sponsorItem.text = sponsor.name;
sponsorItem.tooltip = sponsor.description;
sponsorItem.command = {
title: `Visit ${sponsor.name}`,
(await resolveThanks()).forEach((service) => {
const serviceItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 0);
serviceItem.text = service.name;
serviceItem.tooltip = service.description;
serviceItem.command = {
title: `Visit ${service.name}`,
command: 'vscode.open',
arguments: [vscode.Uri.parse(sponsor.link)],
arguments: [vscode.Uri.parse(service.link)],
};
sponsorItem.show();
serviceItem.show();
});
};
2 changes: 1 addition & 1 deletion workers/discovery/src/snapshots.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { DiscoverySnapshot } from './types.ts';

export const LATEST_KEY = 'latest';
export const LATEST_KEY = 'github:latest';
export const SNAPSHOT_RETENTION_SECONDS = 90 * 24 * 60 * 60;

// Use the scheduled UTC date so execution delays cannot change the archive day.
Expand Down
Loading