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;
}
}
}