kopia lustrzana https://github.com/c9/core
291 wiersze
10 KiB
JavaScript
291 wiersze
10 KiB
JavaScript
|
define(function(require, exports, module) {
|
||
|
main.consumes = [
|
||
|
"Plugin", "Menu", "MenuItem", "Divider", "settings", "ui", "c9",
|
||
|
"watcher", "panels", "util", "save", "preferences", "commands", "Tree",
|
||
|
"Datagrid", "tabManager", "layout", "preferences.experimental"
|
||
|
];
|
||
|
main.provides = ["scm"];
|
||
|
return main;
|
||
|
|
||
|
/*
|
||
|
LEGEND:
|
||
|
* = done (item should be removed)
|
||
|
/ = half done
|
||
|
- = not done
|
||
|
|
||
|
# LOW HANGING FRUIT
|
||
|
- conflicts
|
||
|
- save
|
||
|
- tree
|
||
|
- add watcher to .git/HEAD
|
||
|
- fix errors with added/removed files
|
||
|
|
||
|
# TODO
|
||
|
- commit
|
||
|
- do dry-run
|
||
|
- add status message for ammend
|
||
|
- display branch to commit to
|
||
|
- amend doesnt work
|
||
|
- pull
|
||
|
- pull --rebase
|
||
|
- detail
|
||
|
- afterChoose should stage/unstage files instead of opening diff view
|
||
|
- drag to staged doesnt work sometimes (rowheight issue?)
|
||
|
- conflicts
|
||
|
- add commands? detect, next, prev, use 1/ 2
|
||
|
- branches
|
||
|
- Harutyun: Resize properly when expanding/collapsing
|
||
|
- Harutyun: scrollMargin for left, right and bottom doesn't work (same for log, detail)
|
||
|
- Use icon
|
||
|
- log
|
||
|
- Setting indent to 0 doesn't work
|
||
|
- Remove arrow in title
|
||
|
- add discard changes to context menu
|
||
|
- resize issues
|
||
|
- hotkeys should show bars in dialog
|
||
|
- conflicts
|
||
|
- dark theme (Ruben)
|
||
|
- toolbar
|
||
|
/ pull (or fetch - split button
|
||
|
/ add fetch dialog (Ruben)
|
||
|
/ dropdown for remotes
|
||
|
- output
|
||
|
- Merge doesn't work (no UI for merge message)
|
||
|
- Handle error states
|
||
|
- Change to splitbutton with form only shown on arrow
|
||
|
- reload of log doesn't work after pull
|
||
|
/ push button - split button
|
||
|
/ add push dialog (Ruben)
|
||
|
/ dropdown for remotes/branches
|
||
|
- output
|
||
|
- Handle error states
|
||
|
- Change to splitbutton with form only shown on arrow
|
||
|
- reload of log doesn't work after push
|
||
|
|
||
|
# LATER
|
||
|
# Ruben
|
||
|
- Choose Git Path - use file dialog
|
||
|
- support multiple git roots
|
||
|
- Add setting to collapse tree to only see roots
|
||
|
- tree
|
||
|
- solve edge line cases
|
||
|
- Compare view
|
||
|
- save the right file (use ace session clone)
|
||
|
- git add the left file
|
||
|
- undo doesn't work
|
||
|
- scrolling doesn't work well. It should scroll the sides as
|
||
|
slowly as the side with most lines would go when scrolling there
|
||
|
- conflicts
|
||
|
- automatically add to staging on save
|
||
|
- dialog for one deleted and one saved file
|
||
|
- undo
|
||
|
- branches
|
||
|
- When updating, only do a partial update (maintain selection, expanded state - see test/data/data.js)
|
||
|
- make a datagrid?
|
||
|
*/
|
||
|
|
||
|
function main(options, imports, register) {
|
||
|
var Plugin = imports.Plugin;
|
||
|
var Tree = imports.Tree;
|
||
|
var Menu = imports.Menu;
|
||
|
var Datagrid = imports.Datagrid;
|
||
|
var MenuItem = imports.MenuItem;
|
||
|
var Divider = imports.Divider;
|
||
|
var settings = imports.settings;
|
||
|
var ui = imports.ui;
|
||
|
var c9 = imports.c9;
|
||
|
var tabManager = imports.tabManager;
|
||
|
var watcher = imports.watcher;
|
||
|
var panels = imports.panels;
|
||
|
var util = imports.util;
|
||
|
var save = imports.save;
|
||
|
var layout = imports.layout;
|
||
|
var prefs = imports.preferences;
|
||
|
var commands = imports.commands;
|
||
|
var experimental = imports["preferences.experimental"];
|
||
|
|
||
|
// var Tooltip = require("ace_tree/tooltip");
|
||
|
var DataProvider = require("ace_tree/data_provider");
|
||
|
var escapeHTML = require("ace/lib/lang").escapeHTML;
|
||
|
|
||
|
/***** Initialization *****/
|
||
|
|
||
|
var ENABLED = experimental.addExperiment("git", !c9.hosted, "Panels/Source Control Management");
|
||
|
if (!ENABLED)
|
||
|
return register(null, { "scm": { on: function() {} }});
|
||
|
|
||
|
var plugin = new Plugin("Ajax.org", main.consumes);
|
||
|
var emit = plugin.getEmitter();
|
||
|
|
||
|
var scms = {};
|
||
|
var scm;
|
||
|
|
||
|
var workspaceDir = c9.workspaceDir; // + "/plugins/c9.ide.scm/mock/git";
|
||
|
|
||
|
var loaded = false;
|
||
|
function load() {
|
||
|
if (loaded) return false;
|
||
|
loaded = true;
|
||
|
|
||
|
commands.addCommand({
|
||
|
name: "blame",
|
||
|
group: "scm",
|
||
|
exec: function() {
|
||
|
var tab = tabManager.focussedTab || tabManager.getPanes()[0].activeTab;
|
||
|
if (!tab || !tab.path || tab.editorType != "ace")
|
||
|
return;
|
||
|
var blameAnnotation, err, data;
|
||
|
var ace = tab.editor.ace;
|
||
|
var session = ace.session;
|
||
|
require(["./blame"], function(blameModule) {
|
||
|
if (ace.session != session)
|
||
|
return;
|
||
|
blameAnnotation = blameModule.annotate(ace);
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
var path = tab.path;
|
||
|
scm.getBlame(path, function(err, blameInfo) {
|
||
|
if (err) return console.error(err);
|
||
|
data = blameInfo;
|
||
|
done();
|
||
|
});
|
||
|
|
||
|
function done() {
|
||
|
if (!blameAnnotation) return;
|
||
|
if (data === null) return;
|
||
|
|
||
|
blameAnnotation.setData(data);
|
||
|
}
|
||
|
},
|
||
|
isAvailable: function() {
|
||
|
var tab = tabManager.focussedTab || tabManager.getPanes()[0].activeTab;
|
||
|
if (!tab || !tab.path || tab.editorType != "ace")
|
||
|
return false;
|
||
|
return true;
|
||
|
}
|
||
|
}, plugin);
|
||
|
|
||
|
// commands.addCommand({
|
||
|
// name: "addall",
|
||
|
// group: "scm",
|
||
|
// exec: function(){ addAll(); }
|
||
|
// }, plugin);
|
||
|
|
||
|
// commands.addCommand({
|
||
|
// name: "unstageall",
|
||
|
// group: "scm",
|
||
|
// exec: function(){ unstageAll(); }
|
||
|
// }, plugin);
|
||
|
|
||
|
// commands.addCommand({
|
||
|
// name: "fetch",
|
||
|
// group: "scm",
|
||
|
// exec: function(){ fetch(); }
|
||
|
// }, plugin);
|
||
|
|
||
|
// commands.addCommand({
|
||
|
// name: "push",
|
||
|
// group: "scm",
|
||
|
// exec: function(){ push({}); }
|
||
|
// }, plugin);
|
||
|
|
||
|
// commands.addCommand({
|
||
|
// name: "pull",
|
||
|
// group: "scm",
|
||
|
// exec: function(){ pull({}); }
|
||
|
// }, plugin);
|
||
|
|
||
|
c9.on("ready", function _() {
|
||
|
if (scm) return;
|
||
|
|
||
|
if (!isDetecting)
|
||
|
emit.sticky("scm", null);
|
||
|
else
|
||
|
setTimeout(_, 100);
|
||
|
}, plugin);
|
||
|
}
|
||
|
|
||
|
/***** Methods *****/
|
||
|
|
||
|
var isDetecting = 0;
|
||
|
function registerSCM(name, scmPlugin) {
|
||
|
scms[name] = scmPlugin;
|
||
|
if (!scm) scm = scmPlugin;
|
||
|
|
||
|
emit("register", { plugin: scmPlugin });
|
||
|
|
||
|
isDetecting++;
|
||
|
scmPlugin.detect("/", function(err, active) {
|
||
|
isDetecting--;
|
||
|
if (err || !active) return;
|
||
|
emit.sticky("scm", scmPlugin);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function unregisterSCM(name, scmPlugin) {
|
||
|
delete scms[name];
|
||
|
|
||
|
emit("unregister", { plugin: scmPlugin });
|
||
|
}
|
||
|
|
||
|
function openDiff(options, callback) {
|
||
|
var found;
|
||
|
if (tabManager.getTabs().some(function(tab) {
|
||
|
if (tab.editorType == "diff.unified") {
|
||
|
if (tab.document.getSession().isEqual(options)) {
|
||
|
found = tab;
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
})) return tabManager.focusTab(found);
|
||
|
|
||
|
tabManager[options.preview ? "preview" : "open"]({
|
||
|
newfile: true,
|
||
|
editorType: "diff.unified",
|
||
|
focus: true,
|
||
|
document: {
|
||
|
"title": "Compare View",
|
||
|
"diff.unified": options
|
||
|
}
|
||
|
// path: "/compare.diff"
|
||
|
}, function(err, tab) {
|
||
|
callback && callback(err, tab);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
/***** Lifecycle *****/
|
||
|
|
||
|
plugin.on("load", function() {
|
||
|
load();
|
||
|
});
|
||
|
plugin.on("unload", function() {
|
||
|
loaded = false;
|
||
|
});
|
||
|
|
||
|
/***** Register and define API *****/
|
||
|
|
||
|
plugin.freezePublicAPI({
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
register: registerSCM,
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
unregister: unregisterSCM,
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
openDiff: openDiff
|
||
|
});
|
||
|
|
||
|
register(null, {
|
||
|
"scm": plugin
|
||
|
});
|
||
|
}
|
||
|
});
|