import { Event, TreeDataProvider, TreeItem, TreeItemCollapsibleState } from 'vscode'; import { PijulRemote, Repository } from '../pijul'; /** * The Changelog provider class is a Treedata provider which provides * TreeData for the `pijul.views.changelog` TreeView */ export class RemotesViewProvider implements TreeDataProvider<PijulRemote> { /** * Create a new ChangelogViewProvider instance * @param repository */ constructor ( private readonly repository: Repository, public readonly onDidChangeTreeData?: Event<void> ) {} /** * Convert a PijulRemote into a TreeItem * @param element */ getTreeItem (element: PijulRemote): TreeItem | Thenable<TreeItem> { return { label: element.url, collapsibleState: TreeItemCollapsibleState.None, contextValue: 'pijulRemote' }; } /** * Get the children of the element or the root if no element is passed * @param element An optional element to get the children of */ async getChildren (element?: PijulRemote): Promise<PijulRemote[] | null | undefined> { if (element) { // Remotes don't have children return null; } else { let children; // Retry if the pristine is locked. TODO: More robust solution while (!children) { try { children = await this.repository.getRemotes(); } catch (err) { if (!(err instanceof Error) || !err.message.includes('Pristine locked')) { throw err; } } } return children; } } }