c9-core/plugins/c9.ide.scm/scm.js

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