Skip to content
This repository has been archived by the owner on Dec 18, 2017. It is now read-only.

Enabling implicit appbase (dnx . run -> dnx run) #2263

Merged
merged 2 commits into from Jul 22, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 0 additions & 2 deletions makefile.shade
Expand Up @@ -364,7 +364,6 @@ var CAN_BUILD_ONECORE = '${Directory.Exists(WIN10_SDK_LIB) && Directory.GetFiles
Path.Combine("src", BOOTSTRAPPER_FOLDER_NAME, "pal.unix.cpp"),
Path.Combine("src", BOOTSTRAPPER_FOLDER_NAME, "pal.linux.cpp"),
Path.Combine("src", BOOTSTRAPPER_COMMON_FOLDER_NAME, "utils.cpp"),
Path.Combine("src", BOOTSTRAPPER_FOLDER_NAME, "tchar.cpp"),
};

Directory.CreateDirectory(soOutputDir);
Expand Down Expand Up @@ -405,7 +404,6 @@ var CAN_BUILD_ONECORE = '${Directory.Exists(WIN10_SDK_LIB) && Directory.GetFiles
Path.Combine("src", BOOTSTRAPPER_FOLDER_NAME, "pal.unix.cpp"),
Path.Combine("src", BOOTSTRAPPER_FOLDER_NAME, "pal.darwin.cpp"),
Path.Combine("src", BOOTSTRAPPER_COMMON_FOLDER_NAME, "utils.cpp"),
Path.Combine("src", BOOTSTRAPPER_FOLDER_NAME, "tchar.cpp"),
};

Directory.CreateDirectory(soOutputDir);
Expand Down
2 changes: 0 additions & 2 deletions src/dnx.common/include/utils.h
Expand Up @@ -16,8 +16,6 @@ namespace dnx
dnx::xstring_t to_xstring_t(const std::wstring& s);
std::wstring to_wstring(const std::string& s);

bool strings_equal_ignore_case(const char_t* s1, const char_t* s2);

dnx::xstring_t path_combine(const dnx::xstring_t& path1, const dnx::xstring_t& path2);
bool file_exists(const dnx::xstring_t& path);
dnx::xstring_t remove_file_from_path(const dnx::xstring_t& path);
Expand Down
4 changes: 4 additions & 0 deletions src/dnx.common/include/xplat.h
Expand Up @@ -18,6 +18,8 @@ typedef std::wstring xstring_t;

#define PATH_SEPARATOR L"\\"

#define x_strlen wcslen

#else // non-windows

typedef char char_t;
Expand All @@ -27,5 +29,7 @@ typedef std::string xstring_t;

#define PATH_SEPARATOR "/"

#define x_strlen strlen

#endif
}
11 changes: 0 additions & 11 deletions src/dnx.common/utils.cpp
Expand Up @@ -11,8 +11,6 @@
#if defined(_WIN32)
#include <locale>
#include <codecvt>
#else
#include <string.h>
#endif

namespace dnx
Expand Down Expand Up @@ -53,15 +51,6 @@ namespace dnx
}
#endif

bool strings_equal_ignore_case(const char_t* s1, const char_t* s2)
{
#if defined(_WIN32)
return _wcsicmp(s1, s2) == 0;
#else
return strcasecmp(s1, s2) == 0;
#endif
}

bool ends_with_slash(const xstring_t& path)
{
if (path.length() > 0)
Expand Down
97 changes: 53 additions & 44 deletions src/dnx.mono.managed/EntryPoint.cs
Expand Up @@ -6,7 +6,6 @@
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.Versioning;
using System.Threading;
using dnx.host;
Expand Down Expand Up @@ -75,82 +74,92 @@ public static int Main(string[] arguments)
Environment.SetEnvironmentVariable(EnvironmentNames.AppBase, arguments[appbaseIndex + 1]);
}

return RuntimeBootstrapper.Execute(arguments,
return RuntimeBootstrapper.Execute(arguments,
// NOTE(anurse): Mono is always "dnx451" (for now).
new FrameworkName("DNX", new Version(4, 5, 1)));
}

private static string[] ExpandCommandLineArguments(string[] arguments)
{
// If '--appbase' is already given and it has a value, don't need to expand
var appbaseIndex = arguments.ToList().FindIndex(arg =>
string.Equals(arg, "--appbase", StringComparison.OrdinalIgnoreCase));
if (appbaseIndex >= 0 && (appbaseIndex < arguments.Length - 1))
var parameterIdx = FindAppBaseOrNonHostOption(arguments);

// no non-bootstrapper parameters found or --appbase was found
if (parameterIdx < 0 || string.Equals(arguments[parameterIdx], "--appbase", StringComparison.OrdinalIgnoreCase))
{
return arguments;
}

var expandedArgs = new List<string>();

// Copy all arguments (options & values) as is before the project.json/assembly path
var pathArgIndex = -1;
while (++pathArgIndex < arguments.Length)
for (var i = 0; i < arguments.Count(); i++)
{
var optionValNum = BootstrapperOptionValueNum(arguments[pathArgIndex]);

// It isn't a bootstrapper option, we treat it as the project.json/assembly path
if (optionValNum < 0)
if (i == parameterIdx)
{
break;
ExpandArgument(arguments[i], expandedArgs);
}

// Copy the option
expandedArgs.Add(arguments[pathArgIndex]);

// Copy the value if the option has one
if (optionValNum > 0 && (++pathArgIndex < arguments.Length))
else
{
expandedArgs.Add(arguments[pathArgIndex]);
expandedArgs.Add(arguments[i]);
}
}

// No path argument was found, no expansion is needed
if (pathArgIndex >= arguments.Length)
{
return arguments;
}
return expandedArgs.ToArray();
}

// Start to expand appbase option from path
private static void ExpandArgument(string argument, List<string> expandedArgs)
{
expandedArgs.Add("--appbase");

var pathArg = arguments[pathArgIndex];
if (pathArg.EndsWith(".exe", StringComparison.OrdinalIgnoreCase) ||
pathArg.EndsWith(".dll", StringComparison.OrdinalIgnoreCase))
if (argument.EndsWith(".dll", StringComparison.OrdinalIgnoreCase) ||
argument.EndsWith(".exe", StringComparison.OrdinalIgnoreCase))
{
// "dnx /path/App.dll arg1" --> "dnx --appbase /path/ /path/App.dll arg1"
// "dnx /path/App.exe arg1" --> "dnx --appbase /path/ /path/App.exe arg1"
expandedArgs.Add(Path.GetDirectoryName(Path.GetFullPath(pathArg)));
expandedArgs.AddRange(arguments.Skip(pathArgIndex));
expandedArgs.Add(Path.GetDirectoryName(Path.GetFullPath(argument)));
expandedArgs.Add(argument);

return;
}
else

if (argument.Equals(".", StringComparison.Ordinal))
{
// "dnx . run" --> "dnx --appbase . Microsoft.Framework.ApplicationHost run"
expandedArgs.Add(argument);
expandedArgs.Add("Microsoft.Framework.ApplicationHost");
return;
}

if (string.Equals(Path.GetFileName(argument), "project.json", StringComparison.OrdinalIgnoreCase))
{
var fileName = Path.GetFileName(pathArg);
if (string.Equals(fileName, "project.json", StringComparison.OrdinalIgnoreCase))
expandedArgs.Add(Path.GetDirectoryName(Path.GetFullPath(argument)));
expandedArgs.Add("Microsoft.Framework.ApplicationHost");
return;
}

// "dnx run" --> "dnx --appbase . Microsoft.Framework.ApplicationHost run"
expandedArgs.Add(".");
expandedArgs.Add("Microsoft.Framework.ApplicationHost");
expandedArgs.Add(argument);
}

private static int FindAppBaseOrNonHostOption(string[] arguments)
{
for (var i = 0; i < arguments.Length; i++)
{
if (string.Equals(arguments[i], "--appbase", StringComparison.OrdinalIgnoreCase))
{
// "dnx /path/project.json run" --> "dnx --appbase /path/ Microsoft.Framework.ApplicationHost run"
expandedArgs.Add(Path.GetDirectoryName(Path.GetFullPath(pathArg)));
return i;
}
else

var option_arg_count = BootstrapperOptionValueNum(arguments[i]);
if (option_arg_count < 0)
{
// "dnx /path/ run" --> "dnx --appbase /path/ Microsoft.Framework.ApplicationHost run"
expandedArgs.Add(pathArg);
return i;
}

expandedArgs.Add("Microsoft.Framework.ApplicationHost");
expandedArgs.AddRange(arguments.Skip(pathArgIndex + 1));
i += option_arg_count;
}

return expandedArgs.ToArray();
return -1;
}

private static int BootstrapperOptionValueNum(string candidate)
Expand Down