mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-15 14:54:09 +02:00
Enhanced var capabilities for scripts and building
This commit is contained in:
parent
38551d7a1d
commit
f8b27c13a2
4 changed files with 171 additions and 12 deletions
|
@ -47,6 +47,16 @@ namespace System
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void ReleaseLastRef()
|
||||||
|
{
|
||||||
|
int refCount = Interlocked.Decrement(ref mRefCount);
|
||||||
|
Debug.Assert(refCount == 0);
|
||||||
|
if (refCount == 0)
|
||||||
|
{
|
||||||
|
delete this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public int ReleaseRefNoDelete()
|
public int ReleaseRefNoDelete()
|
||||||
{
|
{
|
||||||
int refCount = Interlocked.Decrement(ref mRefCount);
|
int refCount = Interlocked.Decrement(ref mRefCount);
|
||||||
|
|
|
@ -35,6 +35,7 @@ namespace IDE
|
||||||
delete val;
|
delete val;
|
||||||
delete _;
|
delete _;
|
||||||
};
|
};
|
||||||
|
public ScriptManager.Context mScriptContext = new .() ~ _.ReleaseLastRef();
|
||||||
public ScriptManager mScriptManager ~ delete _;
|
public ScriptManager mScriptManager ~ delete _;
|
||||||
|
|
||||||
public bool Failed
|
public bool Failed
|
||||||
|
@ -152,7 +153,7 @@ namespace IDE
|
||||||
|
|
||||||
if (mScriptManager == null)
|
if (mScriptManager == null)
|
||||||
{
|
{
|
||||||
mScriptManager = new .();
|
mScriptManager = new .(mScriptContext);
|
||||||
mScriptManager.mProjectName = new String(project.mProjectName);
|
mScriptManager.mProjectName = new String(project.mProjectName);
|
||||||
mScriptManager.mIsBuildScript = true;
|
mScriptManager.mIsBuildScript = true;
|
||||||
mScriptManager.mSoftFail = true;
|
mScriptManager.mSoftFail = true;
|
||||||
|
|
|
@ -7459,6 +7459,7 @@ namespace IDE
|
||||||
startInfo.SetFileName(fileName);
|
startInfo.SetFileName(fileName);
|
||||||
startInfo.SetWorkingDirectory(workingDir);
|
startInfo.SetWorkingDirectory(workingDir);
|
||||||
startInfo.SetArguments(args);
|
startInfo.SetArguments(args);
|
||||||
|
|
||||||
if ((!runFlags.HasFlag(.NoRedirect)) && (!runFlags.HasFlag(.NoWait)))
|
if ((!runFlags.HasFlag(.NoRedirect)) && (!runFlags.HasFlag(.NoWait)))
|
||||||
{
|
{
|
||||||
startInfo.RedirectStandardOutput = true;
|
startInfo.RedirectStandardOutput = true;
|
||||||
|
@ -7848,6 +7849,16 @@ namespace IDE
|
||||||
else if (next is ExecutionQueueCmd)
|
else if (next is ExecutionQueueCmd)
|
||||||
{
|
{
|
||||||
var executionQueueCmd = (ExecutionQueueCmd)next;
|
var executionQueueCmd = (ExecutionQueueCmd)next;
|
||||||
|
|
||||||
|
ReplaceVariables(executionQueueCmd.mFileName);
|
||||||
|
ReplaceVariables(executionQueueCmd.mArgs);
|
||||||
|
ReplaceVariables(executionQueueCmd.mWorkingDir);
|
||||||
|
if (executionQueueCmd.mEnvVars != null)
|
||||||
|
{
|
||||||
|
for (let kv in executionQueueCmd.mEnvVars)
|
||||||
|
ReplaceVariables(kv.value);
|
||||||
|
}
|
||||||
|
|
||||||
var executionInstance = DoRun(executionQueueCmd.mFileName, executionQueueCmd.mArgs, executionQueueCmd.mWorkingDir, executionQueueCmd.mUseArgsFile, executionQueueCmd.mEnvVars, executionQueueCmd.mStdInData, executionQueueCmd.mRunFlags);
|
var executionInstance = DoRun(executionQueueCmd.mFileName, executionQueueCmd.mArgs, executionQueueCmd.mWorkingDir, executionQueueCmd.mUseArgsFile, executionQueueCmd.mEnvVars, executionQueueCmd.mStdInData, executionQueueCmd.mRunFlags);
|
||||||
if (executionInstance != null)
|
if (executionInstance != null)
|
||||||
{
|
{
|
||||||
|
@ -8724,6 +8735,8 @@ namespace IDE
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
cmdErr = "Invalid number of arguments";
|
cmdErr = "Invalid number of arguments";
|
||||||
|
case "Var":
|
||||||
|
break ReplaceBlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newString == null)
|
if (newString == null)
|
||||||
|
@ -8962,6 +8975,98 @@ namespace IDE
|
||||||
return !hadError;
|
return !hadError;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void ReplaceVariables(String result)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
for ( ; i < result.Length - 2; i++)
|
||||||
|
{
|
||||||
|
if ((result[i] == '$') && (result[i + 1] == '('))
|
||||||
|
{
|
||||||
|
int parenPos = -1;
|
||||||
|
int openCount = 1;
|
||||||
|
bool inString = false;
|
||||||
|
char8 prevC = 0;
|
||||||
|
for (int checkIdx = i + 2; checkIdx < result.Length; checkIdx++)
|
||||||
|
{
|
||||||
|
char8 c = result[checkIdx];
|
||||||
|
if (inString)
|
||||||
|
{
|
||||||
|
if (prevC == '\\')
|
||||||
|
{
|
||||||
|
// Slashed char
|
||||||
|
prevC = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c == '"')
|
||||||
|
inString = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (c == '"')
|
||||||
|
inString = true;
|
||||||
|
else if (c == '(')
|
||||||
|
openCount++;
|
||||||
|
else if (c == ')')
|
||||||
|
{
|
||||||
|
openCount--;
|
||||||
|
if (openCount == 0)
|
||||||
|
{
|
||||||
|
parenPos = checkIdx;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
prevC = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parenPos != -1)
|
||||||
|
ReplaceBlock:
|
||||||
|
do
|
||||||
|
{
|
||||||
|
String replaceStr = scope String(result, i + 2, parenPos - i - 2);
|
||||||
|
|
||||||
|
if (!replaceStr.StartsWith("Var "))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
String varName = scope String(replaceStr, 4);
|
||||||
|
String newString = null;
|
||||||
|
|
||||||
|
if (mScriptManager.mContext.mVars.TryGetValue(varName, var value))
|
||||||
|
{
|
||||||
|
if (value.VariantType == typeof(String))
|
||||||
|
{
|
||||||
|
newString = scope:ReplaceBlock String(value.Get<String>());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newString == null)
|
||||||
|
{
|
||||||
|
if (mBuildContext != null)
|
||||||
|
{
|
||||||
|
if (mBuildContext.mScriptContext.mVars.TryGetValue(varName, var value))
|
||||||
|
{
|
||||||
|
if (value.VariantType == typeof(String))
|
||||||
|
{
|
||||||
|
newString = scope:ReplaceBlock String(value.Get<String>());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newString != null)
|
||||||
|
{
|
||||||
|
result.Remove(i, parenPos - i + 1);
|
||||||
|
result.Insert(i, newString);
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public bool ResolveConfigString(String platformName, Workspace.Options workspaceOptions, Project project, Project.Options options, StringView configString, String errorContext, String outResult)
|
public bool ResolveConfigString(String platformName, Workspace.Options workspaceOptions, Project project, Project.Options options, StringView configString, String errorContext, String outResult)
|
||||||
{
|
{
|
||||||
String errorString = scope String();
|
String errorString = scope String();
|
||||||
|
|
|
@ -17,6 +17,19 @@ namespace IDE
|
||||||
{
|
{
|
||||||
public static ScriptManager sActiveManager;
|
public static ScriptManager sActiveManager;
|
||||||
|
|
||||||
|
public class Context : RefCounted
|
||||||
|
{
|
||||||
|
public Dictionary<String, Variant> mVars = new .() ~
|
||||||
|
{
|
||||||
|
for (var kv in _)
|
||||||
|
{
|
||||||
|
delete kv.key;
|
||||||
|
kv.value.Dispose();
|
||||||
|
}
|
||||||
|
delete _;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
class Target
|
class Target
|
||||||
{
|
{
|
||||||
public class Cmd
|
public class Cmd
|
||||||
|
@ -54,15 +67,8 @@ namespace IDE
|
||||||
|
|
||||||
ScriptHelper mScriptHelper = new ScriptHelper(this) ~ delete _;
|
ScriptHelper mScriptHelper = new ScriptHelper(this) ~ delete _;
|
||||||
Target mRoot = new Target() ~ delete _;
|
Target mRoot = new Target() ~ delete _;
|
||||||
Dictionary<String, Variant> mVars = new .() ~
|
public Context mContext ~ _.ReleaseRef();
|
||||||
{
|
|
||||||
for (var kv in _)
|
|
||||||
{
|
|
||||||
delete kv.key;
|
|
||||||
kv.value.Dispose();
|
|
||||||
}
|
|
||||||
delete _;
|
|
||||||
};
|
|
||||||
List<QueuedCmd> mCmdList = new .() ~ DeleteContainerAndItems!(_);
|
List<QueuedCmd> mCmdList = new .() ~ DeleteContainerAndItems!(_);
|
||||||
public bool mFailed;
|
public bool mFailed;
|
||||||
public bool mCancelled;
|
public bool mCancelled;
|
||||||
|
@ -93,8 +99,16 @@ namespace IDE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public this()
|
public this(Context context = null)
|
||||||
{
|
{
|
||||||
|
if (context != null)
|
||||||
|
{
|
||||||
|
context.AddRef();
|
||||||
|
mContext = context;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
mContext = new Context();
|
||||||
|
|
||||||
AddTarget(mScriptHelper);
|
AddTarget(mScriptHelper);
|
||||||
|
|
||||||
//Exec("OutputLine(\"Hey bro!\", 2)");
|
//Exec("OutputLine(\"Hey bro!\", 2)");
|
||||||
|
@ -520,7 +534,7 @@ namespace IDE
|
||||||
{
|
{
|
||||||
String* keyPtr;
|
String* keyPtr;
|
||||||
Variant* valuePtr;
|
Variant* valuePtr;
|
||||||
if (mVars.TryAdd(scope String(varName), out keyPtr, out valuePtr))
|
if (mContext.mVars.TryAdd(scope String(varName), out keyPtr, out valuePtr))
|
||||||
*keyPtr = new String(varName);
|
*keyPtr = new String(varName);
|
||||||
else
|
else
|
||||||
valuePtr.Dispose();
|
valuePtr.Dispose();
|
||||||
|
@ -2451,5 +2465,34 @@ namespace IDE
|
||||||
Windows.MessageBoxA((Windows.HWnd)0, "Waiting for user input", "Beef IDE", 0);
|
Windows.MessageBoxA((Windows.HWnd)0, "Waiting for user input", "Beef IDE", 0);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[IDECommand]
|
||||||
|
public void SetVal(String valName, String value)
|
||||||
|
{
|
||||||
|
bool added = mScriptManager.mContext.mVars.TryAdd(valName, var keyPtr, var valuePtr);
|
||||||
|
if (added)
|
||||||
|
*keyPtr = new String(valName);
|
||||||
|
else
|
||||||
|
valuePtr.Dispose();
|
||||||
|
*valuePtr = Variant.Create<String>(new String(value), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
[IDECommand]
|
||||||
|
public void ReadFile(String filePath, String valName)
|
||||||
|
{
|
||||||
|
String value = scope .();
|
||||||
|
if (File.ReadAllText(filePath, value) case .Err)
|
||||||
|
{
|
||||||
|
mScriptManager.Fail(scope String()..AppendF("Failed to read file '{}'", filePath));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool added = mScriptManager.mContext.mVars.TryAdd(valName, var keyPtr, var valuePtr);
|
||||||
|
if (added)
|
||||||
|
*keyPtr = new String(valName);
|
||||||
|
else
|
||||||
|
valuePtr.Dispose();
|
||||||
|
*valuePtr = Variant.Create<String>(new String(value), true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue