From cadd2abf84a684812e916f3fbe7d054bea414e0a Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Thu, 26 Feb 2015 17:43:12 +0300 Subject: [PATCH] show project dependencies --- src/ddebug/windows/mago.d | 7 +- src/dlangide/ui/frame.d | 20 +++-- src/dlangide/ui/wspanel.d | 2 +- src/dlangide/workspace/project.d | 95 +++++++++++++++++++++++- src/dlangide/workspace/workspace.d | 15 +++- views/res/mdpi/project-d-dependency.png | Bin 0 -> 330 bytes views/resources.list | 1 + 7 files changed, 127 insertions(+), 13 deletions(-) create mode 100644 views/res/mdpi/project-d-dependency.png diff --git a/src/ddebug/windows/mago.d b/src/ddebug/windows/mago.d index e699369..4e5aa1b 100644 --- a/src/ddebug/windows/mago.d +++ b/src/ddebug/windows/mago.d @@ -79,6 +79,9 @@ void testMago() { Log.e("OLE 2 failed to initialize"); return; } + + IDebugCoreServer2 coreServer = null; + //hr = CoCreateInstance(&CLSID_MAGO, null, CLSCTX_ALL, &IID_IDebugEngine2, cast(void**)&piUnknown); hr = CoCreateInstance(&IID_MAGO_NATIVE_ENGINE, //CLSID_MAGO, null, @@ -118,10 +121,10 @@ void testMago() { envblock ~= 0; opts ~= 0; - + IDebugPort2 port; hr = debugEngineLaunch.LaunchSuspended ( null, - null, + port, exe.ptr,//LPCOLESTR args.ptr, dir.ptr, diff --git a/src/dlangide/ui/frame.d b/src/dlangide/ui/frame.d index 67ea836..43c702b 100644 --- a/src/dlangide/ui/frame.d +++ b/src/dlangide/ui/frame.d @@ -591,6 +591,16 @@ class IDEFrame : AppFrame { return false; } + private bool loadProject(Project project) { + if (!project.load()) { + _logPanel.logLine("Cannot read project " ~ project.filename); + window.showMessageBox(UIString("Cannot open project"d), UIString("Error occured while opening project "d ~ toUTF32(project.filename))); + return false; + } + _logPanel.logLine(toUTF32("Project file " ~ project.filename ~ " is opened ok")); + return true; + } + void openFileOrWorkspace(string filename) { if (filename.isWorkspaceFile) { Workspace ws = new Workspace(); @@ -605,13 +615,7 @@ class IDEFrame : AppFrame { } else if (filename.isProjectFile) { _logPanel.clear(); _logPanel.logLine("Trying to open project from " ~ filename); - Project project = new Project(); - if (!project.load(filename)) { - _logPanel.logLine("Cannot read project file " ~ filename); - window.showMessageBox(UIString("Cannot open project"d), UIString("Error occured while opening project"d)); - return; - } - _logPanel.logLine("Project file is opened ok"); + Project project = new Project(currentWorkspace, filename); string defWsFile = project.defWorkspaceFile; if (currentWorkspace) { Project existing = currentWorkspace.findProject(project.filename); @@ -628,6 +632,7 @@ class IDEFrame : AppFrame { } else if (result.id == IDEActions.AddToCurrentWorkspace) { // add to current currentWorkspace.addProject(project); + loadProject(project); currentWorkspace.save(); refreshWorkspace(); } @@ -656,6 +661,7 @@ class IDEFrame : AppFrame { ws.name = project.name; ws.description = project.description; ws.addProject(project); + loadProject(project); ws.save(defWsFile); setWorkspace(ws); _logPanel.logLine("Done"); diff --git a/src/dlangide/ui/wspanel.d b/src/dlangide/ui/wspanel.d index 934d157..6f9311b 100644 --- a/src/dlangide/ui/wspanel.d +++ b/src/dlangide/ui/wspanel.d @@ -147,7 +147,7 @@ class WorkspacePanel : DockWindow { TreeItem root = _tree.items.newChild(_workspace.filename, _workspace.name, "project-development"); root.intParam = ProjectItemType.Workspace; foreach(project; _workspace.projects) { - TreeItem p = root.newChild(project.filename, project.name, "project-d"); + TreeItem p = root.newChild(project.filename, project.name, project.isDependency ? "project-d-dependency" : "project-d"); p.intParam = ProjectItemType.Project; addProjectItems(p, project.items); } diff --git a/src/dlangide/workspace/project.d b/src/dlangide/workspace/project.d index 19977c1..7d741fa 100644 --- a/src/dlangide/workspace/project.d +++ b/src/dlangide/workspace/project.d @@ -9,6 +9,7 @@ import std.file; import std.json; import std.utf; import std.algorithm; +import std.process; /// return true if filename matches rules for workspace file names bool isProjectFile(string filename) { @@ -230,16 +231,24 @@ class Project : WorkspaceItem { protected ProjectFolder _items; protected ProjectSourceFile _mainSourceFile; protected SettingsFile _projectFile; + protected bool _isDependency; + protected string _dependencyVersion; protected string[] _sourcePaths; protected string[] _builderSourcePaths; - this(string fname = null) { + this(Workspace ws, string fname = null, string dependencyVersion = null) { super(fname); + _workspace = ws; _items = new ProjectFolder(fname); + _dependencyVersion = dependencyVersion; + _isDependency = _dependencyVersion.length > 0; } + @property bool isDependency() { return _isDependency; } + @property string dependencyVersion() { return _dependencyVersion; } + /// returns project's own source paths @property string[] sourcePaths() { return _sourcePaths; } /// returns project's own source paths @@ -346,6 +355,10 @@ class Project : WorkspaceItem { try { _name = toUTF32(_projectFile.getString("name")); + if (_isDependency) { + _name ~= "-"d; + _name ~= toUTF32(_dependencyVersion.startsWith("~") ? _dependencyVersion[1..$] : _dependencyVersion); + } _description = toUTF32(_projectFile.getString("description")); Log.d(" project name: ", _name); Log.d(" project description: ", _description); @@ -355,7 +368,8 @@ class Project : WorkspaceItem { Log.i("Project source paths: ", sourcePaths); Log.i("Builder source paths: ", builderSourcePaths); - + if (!_isDependency) + loadSelections(); } catch (JSONException e) { Log.e("Cannot parse json", e); return false; @@ -365,5 +379,82 @@ class Project : WorkspaceItem { } return true; } + + protected Project[] _dependencies; + @property Project[] dependencies() { return _dependencies; } + protected bool addDependency(Project dep) { + if (_workspace) + _workspace.addDependencyProject(dep); + _dependencies ~= dep; + return true; + } + bool loadSelections() { + _dependencies.length = 0; + DubPackageFinder finder = new DubPackageFinder(); + scope(exit) destroy(finder); + SettingsFile selectionsFile = new SettingsFile(buildNormalizedPath(_dir, "dub.selections.json")); + if (!selectionsFile.load()) + return false; + Setting versions = selectionsFile.objectByPath("versions"); + if (!versions) + return false; + string[string] versionMap = versions.strMap; + foreach(packageName, packageVersion; versionMap) { + string fn = finder.findPackage(packageName, packageVersion); + Log.d("dependency ", packageName, " ", packageVersion, " : ", fn ? fn : "NOT FOUND"); + if (fn) { + Project p = new Project(_workspace, fn, packageVersion); + if (p.load()) { + addDependency(p); + } else { + Log.e("cannot load dependency package ", packageName, " ", packageVersion, " from file ", fn); + destroy(p); + } + } + } + return true; + } +} + +class DubPackageFinder { + string systemDubPath; + string userDubPath; + string tempPath; + this() { + version(Windows){ + systemDubPath = buildNormalizedPath(environment.get("ProgramData"), "dub", "packages"); + userDubPath = buildNormalizedPath(environment.get("APPDATA"), "dub", "packages"); + tempPath = buildNormalizedPath(environment.get("TEMP"), "dub", "packages"); + } else version(Posix){ + systemDubPath = "/var/lib/dub/packages"; + userDubPath = buildNormalizedPath(environment.get("HOME"), ".dub", "packages"); + if(!userDubPath.isAbsolute) + userDubPath = buildNormalizedPath(getcwd(), userDubPath); + tempPath = "/tmp/packages"; + } + } + + protected string findPackage(string packageDir, string packageName, string packageVersion) { + string fullName = packageVersion.startsWith("~") ? packageName ~ "-" ~ packageVersion[1..$] : packageName ~ "-" ~ packageVersion; + string pathName = absolutePath(buildNormalizedPath(packageDir, fullName)); + if (pathName.exists && pathName.isDir) { + string fn = buildNormalizedPath(pathName, "dub.json"); + if (fn.exists && fn.isFile) + return fn; + fn = buildNormalizedPath(pathName, "package.json"); + if (fn.exists && fn.isFile) + return fn; + } + return null; + } + + string findPackage(string packageName, string packageVersion) { + string res = null; + res = findPackage(userDubPath, packageName, packageVersion); + if (res) + return res; + res = findPackage(systemDubPath, packageName, packageVersion); + return res; + } } diff --git a/src/dlangide/workspace/workspace.d b/src/dlangide/workspace/workspace.d index 02244f2..f219482 100644 --- a/src/dlangide/workspace/workspace.d +++ b/src/dlangide/workspace/workspace.d @@ -93,6 +93,17 @@ class Workspace : WorkspaceItem { fillStartupProject(); } + bool addDependencyProject(Project p) { + for (int i = 0; i < _projects.length; i++) { + if (_projects[i].filename.equal(p.filename)) { + _projects[i] = p; + return false; + } + } + addProject(p); + return true; + } + string absoluteToRelativePath(string path) { return toForwardSlashSeparator(relativePath(path, _dir)); } @@ -108,6 +119,8 @@ class Workspace : WorkspaceItem { json["description"] = JSONValue(toUTF8(_description)); JSONValue[string] projects; foreach (Project p; _projects) { + if (p.isDependency) + continue; // don't save dependency string pname = toUTF8(p.name); string ppath = absoluteToRelativePath(p.filename); projects[pname] = JSONValue(ppath); @@ -147,7 +160,7 @@ class Workspace : WorkspaceItem { Log.d("project: ", key, " path:", path); if (!isAbsolute(path)) path = buildNormalizedPath(_dir, path); //, "dub.json" - Project project = new Project(path); + Project project = new Project(this, path); _projects ~= project; project.load(); diff --git a/views/res/mdpi/project-d-dependency.png b/views/res/mdpi/project-d-dependency.png new file mode 100644 index 0000000000000000000000000000000000000000..5e7bfcc896bf4cce8f8bb34fb1cb3d2bbc48a397 GIT binary patch literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4Pvb__>W@|Vg3MK}vQ zB8wRqxP?KOkzv*x37{Z*iKnkC`+X)UK1~JryrLICq3fP5jv*GO_Xaz19WoG@qw|&7 zZUIaDh3u~jY8$89Eor=0b>$w{*Jnp}|LA(<_}BHM`>d)7N0u$*V2g<`^Vu}{q)y`T z%aV2ncdfhqTY!Z@!6od^rI_pOlO9OkV>#$>?u)KVfLG)UftkJw`1_jIzfZes_Hhdn z!;RL3TO&O4D)9YNld0}KI-!_kVYWsz3KHWKZOU>+Mg@em6X5Co( z%oPsD&7=f1md;`86`p9!sHkVwIPdj+dtv7L44-~EJ`)r;v!$-##%?3F1?&=xd)FP{ YUXkFnvyYoi9q2^{Pgg&ebxsLQ09J>2%m4rY literal 0 HcmV?d00001 diff --git a/views/resources.list b/views/resources.list index 5d7ee6b..2d7728f 100644 --- a/views/resources.list +++ b/views/resources.list @@ -17,6 +17,7 @@ res/mdpi/edit-redo.png res/mdpi/edit-undo.png res/mdpi/edit-unindent.png res/mdpi/project-d.png +res/mdpi/project-d-dependency.png res/mdpi/project-development.png res/mdpi/project-open.png res/mdpi/run-build.png