UNPKG

atom-nuclide

Version:

A unified developer experience for web and mobile development, built as a suite of features on top of Atom to provide hackability and the support of an active community.

137 lines (108 loc) 4.75 kB
var doGetBlameForEditor = _asyncToGenerator(function* (editor) { var path = editor.getPath(); if (!path) { return Promise.resolve(new Map()); } var repo = (0, (_common2 || _common()).hgRepositoryForEditor)(editor); if (!repo) { var message = 'HgBlameProvider could not fetch blame for ' + path + ': no Hg repo found.'; logger.error(message); throw new Error(message); } var blameInfo = yield repo.getBlameAtHead(path); // TODO (t8045823) Convert the return type of ::getBlameAtHead to a Map when // the service framework supports a Map return type. var useShortName = !(_commonsAtomFeatureConfig2 || _commonsAtomFeatureConfig()).default.get('nuclide-blame-provider-hg.showVerboseBlame'); return formatBlameInfo(blameInfo, useShortName); } /** * Takes a map returned by HgRepositoryClient.getBlameAtHead() and reformats it as a Map of * line numbers to blame info to display in the blame gutter. If `useShortName` is false, * The blame info is of the form: "Firstname Lastname <username@email.com> ChangeSetID". * (The Firstname Lastname may not appear sometimes.) If `useShortName` is true, then the * author portion will contain only the username. */ ); function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { var callNext = step.bind(null, 'next'); var callThrow = step.bind(null, 'throw'); function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(callNext, callThrow); } } callNext(); }); }; } /* * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. */ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _commonsAtomFeatureConfig2; function _commonsAtomFeatureConfig() { return _commonsAtomFeatureConfig2 = _interopRequireDefault(require('../../commons-atom/featureConfig')); } var _common2; function _common() { return _common2 = require('./common'); } var _nuclideAnalytics2; function _nuclideAnalytics() { return _nuclideAnalytics2 = require('../../nuclide-analytics'); } // eslint-disable-next-line nuclide-internal/no-cross-atom-imports var _nuclideVcsLog2; function _nuclideVcsLog() { return _nuclideVcsLog2 = require('../../nuclide-vcs-log'); } var _nuclideLogging2; function _nuclideLogging() { return _nuclideLogging2 = require('../../nuclide-logging'); } var logger = (0, (_nuclideLogging2 || _nuclideLogging()).getLogger)(); function canProvideBlameForEditor(editor) { if (editor.isModified()) { atom.notifications.addInfo('There is Hg blame information for this file, but only for saved changes. ' + 'Save, then try again.'); logger.info('nuclide-blame: Could not open Hg blame due to unsaved changes in file: ' + String(editor.getPath())); return false; } var repo = (0, (_common2 || _common()).hgRepositoryForEditor)(editor); return Boolean(repo); } function getBlameForEditor(editor) { return (0, (_nuclideAnalytics2 || _nuclideAnalytics()).trackOperationTiming)('blame-provider-hg:getBlameForEditor', function () { return doGetBlameForEditor(editor); }); } function formatBlameInfo(rawBlameData, useShortName) { var extractAuthor = useShortName ? (_nuclideVcsLog2 || _nuclideVcsLog()).shortNameForAuthor : identity; var blameForEditor = new Map(); rawBlameData.forEach(function (blameName, serializedLineNumber) { var lineNumber = parseInt(serializedLineNumber, 10); var index = blameName.lastIndexOf(' '); var changeSetId = blameName.substring(index + 1); var fullAuthor = blameName.substring(0, index); // The ChangeSet ID will be null for uncommitted local changes. var blameInfo = { author: extractAuthor(fullAuthor), changeset: changeSetId !== 'null' ? changeSetId : null }; blameForEditor.set(lineNumber, blameInfo); }); return blameForEditor; } /** @return The input value. */ function identity(anything) { return anything; } var getUrlForRevision = undefined; try { // $FlowFB var _require = require('./fb/FbHgBlameProvider'); var getPhabricatorUrlForRevision = _require.getPhabricatorUrlForRevision; getUrlForRevision = getPhabricatorUrlForRevision; } catch (e) { // Ignore case where FbHgBlameProvider is unavailable. } module.exports = { canProvideBlameForEditor: canProvideBlameForEditor, getBlameForEditor: getBlameForEditor, getUrlForRevision: getUrlForRevision, __test__: { formatBlameInfo: formatBlameInfo } };