- /**
- Empty package initialization code.
-
- Copyright: © 2013-2015 rejectedsoftware e.K.
- License: Subject to the terms of the MIT license, as written in the included LICENSE.txt file.
- Authors: Sönke Ludwig
- */
- module dub.init;
-
- import dub.internal.vibecompat.core.file;
- import dub.internal.vibecompat.core.log;
- import dub.package_ : PackageFormat, packageInfoFiles, defaultPackageFilename;
- import dub.recipe.packagerecipe;
- import dub.dependency;
-
- import std.datetime;
- import std.exception;
- import std.file;
- import std.format;
- import std.process;
- import std.string;
-
- void initPackage(Path root_path, string[string] deps, string type, PackageFormat format, scope void delegate(ref PackageRecipe, ref PackageFormat) recipe_callback = null)
- {
- import std.conv : to;
- import dub.recipe.io : writePackageRecipe;
-
- void enforceDoesNotExist(string filename) {
- enforce(!existsFile(root_path ~ filename), "The target directory already contains a '"~filename~"' file. Aborting.");
- }
-
- string username = getUserName();
-
- PackageRecipe p;
- p.name = root_path.head.toString().toLower();
- p.authors ~= username;
- p.license = "proprietary";
- p.copyright = .format("Copyright © %s, %s", Clock.currTime().year, username);
- foreach (pack, v; deps) {
- import std.ascii : isDigit;
- p.buildSettings.dependencies[pack] = Dependency(v);
- }
-
- //Check to see if a target directory needs to be created
- if( !root_path.empty ){
- if( !existsFile(root_path) )
- createDirectory(root_path);
- }
-
- //Make sure we do not overwrite anything accidentally
- foreach (fil; packageInfoFiles)
- enforceDoesNotExist(fil.filename);
-
- auto files = ["source/", "views/", "public/", "dub.json", ".gitignore"];
- foreach (fil; files)
- enforceDoesNotExist(fil);
-
- switch (type) {
- default: throw new Exception("Unknown package init type: "~type);
- case "minimal": initMinimalPackage(root_path, p); break;
- case "vibe.d": initVibeDPackage(root_path, p); break;
- case "deimos": initDeimosPackage(root_path, p); break;
- }
-
- if (recipe_callback) recipe_callback(p, format);
- writePackageRecipe(root_path ~ ("dub."~format.to!string), p);
- writeGitignore(root_path);
- }
-
- private void initMinimalPackage(Path root_path, ref PackageRecipe p)
- {
- p.description = "A minimal D application.";
- createDirectory(root_path ~ "source");
- write((root_path ~ "source/app.d").toNativeString(),
- q{import std.stdio;
-
- void main()
- {
- writeln("Edit source/app.d to start your project.");
- }
- });
- }
-
- private void initVibeDPackage(Path root_path, ref PackageRecipe p)
- {
- if("vibe-d" !in p.dependencies)
- p.buildSettings.dependencies["vibe-d"] = Dependency("~>0.7.26");
- p.description = "A simple vibe.d server application.";
- p.buildSettings.versions[""] ~= "VibeDefaultMain";
-
- createDirectory(root_path ~ "source");
- createDirectory(root_path ~ "views");
- createDirectory(root_path ~ "public");
- write((root_path ~ "source/app.d").toNativeString(),
- q{import vibe.d;
-
- shared static this()
- {
- auto settings = new HTTPServerSettings;
- settings.port = 8080;
- settings.bindAddresses = ["::1", "127.0.0.1"];
- listenHTTP(settings, &hello);
-
- logInfo("Please open http://127.0.0.1:8080/ in your browser.");
- }
-
- void hello(HTTPServerRequest req, HTTPServerResponse res)
- {
- res.writeBody("Hello, World!");
- }
- });
- }
-
- private void initDeimosPackage(Path root_path, ref PackageRecipe p)
- {
- import dub.compilers.buildsettings : TargetType;
-
- auto name = root_path.head.toString().toLower();
- p.description = format("Deimos Bindings for "~p.name~".");
- p.buildSettings.importPaths[""] ~= ".";
- p.buildSettings.targetType = TargetType.sourceLibrary;
- createDirectory(root_path ~ "C");
- createDirectory(root_path ~ "deimos");
- }
-
- void writeGitignore(Path root_path)
- {
- write((root_path ~ ".gitignore").toNativeString(),
- ".dub\ndocs.json\n__dummy.html\n*.o\n*.obj\n");
- }
-
- private string getUserName()
- {
- version (Windows)
- return environment.get("USERNAME", "Peter Parker");
- else version (Posix)
- {
- import core.sys.posix.pwd, core.sys.posix.unistd, core.stdc.string : strlen;
- import std.algorithm : splitter;
-
- if (auto pw = getpwuid(getuid))
- {
- auto uinfo = pw.pw_gecos[0 .. strlen(pw.pw_gecos)].splitter(',');
- if (!uinfo.empty && uinfo.front.length)
- return uinfo.front.idup;
- }
- return environment.get("USER", "Peter Parker");
- }
- else
- static assert(0);
- }