UNPKG

@jupyterlab/git

Version:

A JupyterLab extension for version control using git

80 lines (79 loc) 4.24 kB
import { Notification } from '@jupyterlab/apputils'; import { caretDownIcon, caretRightIcon, closeIcon } from '@jupyterlab/ui-components'; import * as React from 'react'; import { showError } from '../notifications'; import { commitComparisonBoxStyle, commitComparisonDiffStyle } from '../style/CommitComparisonBox'; import { changeStageButtonStyle, sectionAreaStyle, sectionHeaderLabelStyle } from '../style/GitStageStyle'; import { ActionButton } from './ActionButton'; import { CommitDiff } from './CommitDiff'; /** * A component which displays a comparison between two commits. */ export function CommitComparisonBox(props) { var _a; const [collapsed, setCollapsed] = React.useState(false); const [files, setFiles] = React.useState([]); const { referenceCommit, challengerCommit, model } = props; const hasDiff = referenceCommit !== null && challengerCommit !== null; const totalInsertions = files.reduce((acc, file) => { const insertions = Number.parseInt(file.insertion, 10); return acc + (Number.isNaN(insertions) ? 0 : insertions); }, 0); const totalDeletions = files.reduce((acc, file) => { const deletions = Number.parseInt(file.deletion, 10); return acc + (Number.isNaN(deletions) ? 0 : deletions); }, 0); React.useEffect(() => { (async () => { var _a; if (referenceCommit === null || challengerCommit === null) { setFiles([]); return; } let diffResult = null; try { diffResult = await model.diff(referenceCommit.commit, challengerCommit.commit); if (diffResult.code !== 0) { throw new Error(diffResult.message); } } catch (err) { const msg = `Failed to get the diff for ${referenceCommit.commit} and ${challengerCommit.commit}.`; console.error(msg, err); Notification.error(msg, showError(err, props.trans)); return; } if (diffResult) { setFiles(((_a = diffResult.result) !== null && _a !== void 0 ? _a : []).map(changedFile => { const pathParts = changedFile.filename.split('/'); const fileName = pathParts[pathParts.length - 1]; const filePath = changedFile.filename; return { deletion: changedFile.deletions, insertion: changedFile.insertions, is_binary: changedFile.deletions === '-' || changedFile.insertions === '-', modified_file_name: fileName, modified_file_path: filePath, type: changedFile.filetype }; })); } else { setFiles([]); } })(); }, [referenceCommit, challengerCommit]); return (React.createElement("div", { className: commitComparisonBoxStyle }, React.createElement("div", { className: sectionAreaStyle, onClick: () => setCollapsed(!collapsed) }, React.createElement("button", { className: changeStageButtonStyle }, collapsed ? (React.createElement(caretRightIcon.react, { tag: "span" })) : (React.createElement(caretDownIcon.react, { tag: "span" }))), React.createElement("span", { className: sectionHeaderLabelStyle }, props.header), React.createElement(ActionButton, { title: props.trans.__('Close'), icon: closeIcon, onClick: (event) => { props.onClose(event); } })), !collapsed && (files.length ? (React.createElement(CommitDiff, { className: commitComparisonDiffStyle, deletions: `${totalDeletions}`, files: files, insertions: `${totalInsertions}`, numFiles: `${files.length}`, onOpenDiff: (_a = props.onOpenDiff) !== null && _a !== void 0 ? _a : (() => () => { /* no-op */ }), trans: props.trans })) : (React.createElement("p", null, hasDiff ? props.trans.__('No changes') : props.trans.__('No challenger commit selected.')))))); }