@jupyterlab/git
Version:
A JupyterLab extension for version control using git
80 lines (79 loc) • 4.24 kB
JavaScript
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.'))))));
}