public PropBuildEventBuildChain(ProjectElement Element, StudioCore Core, BuildChain BuildChain, string CurrentBuildConfig) { this.Element = Element; this.Core = Core; this.BuildChain = BuildChain; this.CurrentBuildConfig = CurrentBuildConfig; TopLevel = false; InitializeComponent(); // Build Chains if (Core.MainForm.m_Solution != null) { foreach (var project in Core.MainForm.m_Solution.Projects) { comboBuildChainProject.Items.Add(project.Settings.Name); } if (comboBuildChainProject.Items.Count > 0) { comboBuildChainProject.SelectedIndex = 0; } foreach (var entry in BuildChain.Entries) { var item = new ArrangedItemEntry(); item.Text = entry.ProjectName + " - " + entry.Config; item.Tag = entry; listBuildChainProjects.Items.Add(item); } } checkBuildChainActive.Checked = BuildChain.Active; }
/// <summary> /// Moves along the build chain skipping units until it finds the matching unit. /// If it is the target unit, returns build actions for it, if no, pass the rest of the chain to each child and returns merged actions. /// </summary> public override bool GatherBuildActions(BuildChain buildChain, out WeightedBuildActionBag?actionBag, int inputWeight) { var hasActions = false; // ReSharper disable once AccessToModifiedClosure - yes, I need it to be captured using (Log.ConditionalMode(LogLevel.Verbose, () => hasActions)) using (Log.NamedBlock(LogLevel.Verbose, nameof(SkipTillUnit))) { Log.WriteLine(LogLevel.Verbose, () => $"Pattern = {UnitPattern.ToHoconString()}, Weight = {Weight.ToHoconString()}"); for (var i = 0; i < buildChain.Length; i++) { var unitInfo = buildChain[i]; var isPatternMatches = UnitPattern.Matches(unitInfo); if (isPatternMatches) { Log.WriteLine(LogLevel.Verbose, LogConst.Matched, true); hasActions = GetOwnOrChildrenBuildActions(buildChain.GetTail(i), inputWeight, out actionBag); return(hasActions); } } Log.WriteLine(LogLevel.Trace, LogConst.Matched, false); } actionBag = null; return(false); }
public int GetHashCode(BuildChain array) { var hash = HashCode.Combine(array.GetHashCode()); foreach (var item in array) { hash = HashCode.Combine(hash, item.GetHashCode()); } return(hash); }
public async Task Execute(long sourceBuildId, string newNameSuffix, bool simulate) { Log.InfoFormat("Deep Clone Build Config. sourceBuildId: {0}, newNameSuffix: {1}", sourceBuildId, newNameSuffix); var sourceBuild = await _client.Builds.ById(sourceBuildId); _buildConfigXmlClient.Simulate = simulate; _simulate = simulate; _sourceBuildConfig = await _client.BuildConfigs.GetByConfigurationId(sourceBuild.BuildTypeId); _newNameSuffix = newNameSuffix; _newBranchName = VcsRootHelper.ToValidGitBranchName(_newNameSuffix); _buildChainId = Guid.NewGuid().ToString(); _buildChain = new BuildChain(_client.Builds, sourceBuild); var buildConfigsToClone = await GetBuildsToClone(); foreach (var b in buildConfigsToClone) { Log.Info($"==== Branch {b.HistoricBuild.BuildTypeId} from Build #{b.HistoricBuild.Number} (id: {b.HistoricBuild.Id}) ===="); if (!_simulate) { await _vcsRootHelper.BranchUsingGitLabApi(b.HistoricBuild.Id, _newBranchName); } } var cloneBuildConfigCommands = GetCloneBuildConfigsCommands(buildConfigsToClone.ToList()); foreach (var c in cloneBuildConfigCommands) { Log.Info($"==== {c} ===="); if (!_simulate) { c.Execute(); } } var swapDependencyCommands = GetSwapDependenciesCommands(buildConfigsToClone); foreach (var c in swapDependencyCommands) { Log.Info($"==== {c} ===="); if (!_simulate) { c.Execute(); } } if (!_simulate) { _buildConfigXmlClient.Push(); } }
public async Task Execute(long newBuildId, long oldBuildId, bool bCompare, bool dump) { Log.Info("================Compare Builds: start ================"); var build1 = await _client.Builds.ById(newBuildId); var build2 = await _client.Builds.ById(oldBuildId); var buildChain1 = new BuildChain(_client.Builds, build1); var buildChain2 = new BuildChain(_client.Builds, build2); CompareBuilds(buildChain1, buildChain2, bCompare, dump); }
public override bool GatherBuildActions(BuildChain buildChain, out WeightedBuildActionBag?actionBag, int inputWeight) { var hasActions = false; // ReSharper disable once AccessToModifiedClosure - yes, that's the point using (Log.ConditionalMode(LogLevel.Verbose, () => hasActions)) using (Log.NamedBlock(LogLevel.Verbose, nameof(SkipAllUnits))) { Log.WriteLine(LogLevel.Verbose, () => $"Weight = {Weight.ToHoconString()}"); var targetUnit = buildChain.GetTail(buildChain.Length - 1); var decreaseWeight = (buildChain.Length - 1) * Weight; hasActions = GetChildrenActions(targetUnit, inputWeight + decreaseWeight, out actionBag); return(hasActions); } }
public bool Equals(BuildChain x, BuildChain y) { if (x.Length != y.Length) { return(false); } for (var i = 0; i < x.Length; i++) { if (!Equals(x[i], y[i])) { return(false); } } return(true); }
/// <summary> /// Common logic to build one or all units /// </summary> private T Build <T>(UnitId unitId, Func <BuildChain, WeightedBuildActionBag?, T> build) { Log.WriteLine(LogLevel.Info, () => $"Time: \"{DateTime.Now:yyyy-mm-dd HH:mm:ss.fff}\""); Log.WriteLine(LogLevel.Info, () => $"Thread: {Environment.CurrentManagedThreadId.ToHoconString()} "); T result; _buildChainList.Add(unitId); var buildChain = new BuildChain(_buildChainList, 0); Log.WriteLine(LogLevel.Info, () => $"Chain = {Enumerable.Reverse(_buildChainList).ToHoconString()}"); try { WeightedBuildActionBag?actions; WeightedBuildActionBag?auxActions = null; Log.WriteLine(LogLevel.Verbose, ""); using (Log.NamedBlock(LogLevel.Verbose, GatherBuildActions)) { _mainBuildChainPatternTree.GatherBuildActions(buildChain, out actions); _auxPatternTree?.GatherBuildActions(buildChain, out auxActions); } var actionBag = actions.Merge(auxActions); Log_GatheredActions(actionBag); result = build(buildChain, actionBag); } catch (Exception exception) { if (!exception.Data.Contains(ExceptionConst.BuildChain)) { exception.AddData(ExceptionConst.BuildChain, Enumerable.Reverse(_buildChainList).ToHoconString()); } throw; } finally { _buildChainList.RemoveAt(_buildChainList.Count - 1); } return(result); }
public override bool GatherBuildActions(BuildChain buildChain, out WeightedBuildActionBag?actionBag, int inputWeight) { actionBag = null; if (RawChildren is null) { return(false); } foreach (var child in RawChildren) { if (child.GatherBuildActions(buildChain, out var childBag, inputWeight)) { actionBag = actionBag.Merge(childBag); } } return(true); }
protected bool GetOwnOrChildrenBuildActions(BuildChain buildChain, int inputWeight, out WeightedBuildActionBag?actionBag) { var result = false; actionBag = null; if (buildChain.Length > 1) { // pass the rest of the chain to children and return their actions result = GetChildrenActions(buildChain.GetTail(1), inputWeight, out actionBag); } else { // this patterns matches the target unit, return actions for it result = GetOwnBuildActions(inputWeight, out actionBag); actionBag.WriteToLog(LogLevel.Verbose, "Actions: "); } return(result); }
/// <summary> /// Checks if the first unit in the build chain matches the specified patter. /// If it is the target unit, returns build actions for it, if no, pass the rest of the build chain to each child and returns all actions from children merged /// </summary> public override bool GatherBuildActions(BuildChain buildChain, out WeightedBuildActionBag?actionBag, int inputWeight) { actionBag = null; var hasActions = false; // ReSharper disable once AccessToModifiedClosure - yes, I need it to be captured using (Log.ConditionalMode(LogLevel.Verbose, () => hasActions)) using (Log.NamedBlock(LogLevel.Verbose, nameof(IfFirstUnit))) { Log.WriteLine(LogLevel.Verbose, () => $"Pattern = {UnitPattern.ToHoconString()}, Weight = {Weight.ToHoconString()}"); var isPatternMatches = UnitPattern.Matches(buildChain[0]); Log.WriteLine(LogLevel.Verbose, LogConst.Matched, isPatternMatches); hasActions = isPatternMatches && GetOwnOrChildrenBuildActions(buildChain, inputWeight, out actionBag); return(hasActions); } }
private List <Weighted <BuildResult> > BuildAllUnits(BuildChain buildChain, WeightedBuildActionBag?buildActionBag) { if (buildActionBag is null) { return(Empty <Weighted <BuildResult> > .List); } if (buildActionBag.Keys.Count > 1) { var exception = new ArmatureException($"Actions only for one stage should be provided for {nameof(BuildAllUnits)}"); var number = 1; foreach (var pair in buildActionBag) { exception.AddData($"Stage #{number++}", pair.Key); } throw exception; } var buildResultList = new List <Weighted <BuildResult> >(); foreach (var weightedBuildAction in buildActionBag.Values.Single()) { var buildSession = new Interface(this, buildChain); var buildAction = weightedBuildAction.Entity; BuildActionProcess(buildAction, buildSession); Log_BuildActionResult(buildAction, buildSession.BuildResult); BuildActionPostProcess(buildAction, buildSession); Log.WriteLine(LogLevel.Info, ""); if (buildSession.BuildResult.HasValue) { buildResultList.Add(buildSession.BuildResult.WithWeight(weightedBuildAction.Weight)); } } Log_BuildAllResult(buildResultList); return(buildResultList); }
private BuildResult BuildUnit(BuildChain buildChain, WeightedBuildActionBag?buildActionBag) { if (buildActionBag is null) { return(BuildViaParentBuilder(buildChain.TargetUnit)); } // builder to pass into IBuildActon.Execute var buildSession = new Interface(this, buildChain); var performedActions = new Stack <IBuildAction>(); foreach (var stage in _buildStages) { var buildAction = buildActionBag.GetTopmostAction(stage); if (buildAction is null) { continue; } performedActions.Push(buildAction); BuildActionProcess(buildAction, buildSession); if (buildSession.BuildResult.HasValue) { break; // object is built, unwind called actions in reverse orders } } Log_BuildResult(buildSession.BuildResult); foreach (var buildAction in performedActions) { BuildActionPostProcess(buildAction, buildSession); } return(buildSession.BuildResult.HasValue ? buildSession.BuildResult : BuildViaParentBuilder(buildChain.TargetUnit)); }
private void CompareBuilds(BuildChain buildChain1, BuildChain buildChain2, bool bCompare, bool dump) { var build1List = buildChain1.Nodes.Select(node => node.Value.Properties.Property["project.name"]?.Value + " (" + node.Value.BuildConfig.ProjectName + ") - " + node.Value.Number).ToList(); var build2List = buildChain2.Nodes.Select(node => node.Value.Properties.Property["project.name"]?.Value + " (" + node.Value.BuildConfig.ProjectName + ") - " + node.Value.Number).ToList(); var build1Text = build1List.OrderBy(b => b).Aggregate("", (current, build) => current + (build + "\r\n")); var build2Text = build2List.OrderBy(b => b).Aggregate("", (current, build) => current + (build + "\r\n")); if (dump) { DumpTextToConsole(build1Text, build2Text); } else if (bCompare) { ShowDifferencesInBCompare(build1Text, build2Text); } else { ShowDifferencesInBrowser(build1Text, build2Text); } }
public override bool GatherBuildActions(BuildChain buildChain, out WeightedBuildActionBag?actionBag, int inputWeight) { var hasActions = false; // ReSharper disable once AccessToModifiedClosure - yes, I need it to be captured using (Log.ConditionalMode(LogLevel.Verbose, () => hasActions)) using (Log.NamedBlock(LogLevel.Verbose, nameof(SkipWhileUnit))) { Log.WriteLine(LogLevel.Verbose, () => $"Pattern = {UnitPattern.ToHoconString()}, Weight = {Weight.ToHoconString()}"); var i = 0; for (; i < buildChain.Length - 1; i++) // target unit is not the subject of skipping { if (!UnitPattern.Matches(buildChain[i])) { break; } } hasActions = GetChildrenActions(buildChain.GetTail(i), inputWeight, out actionBag); return(hasActions); } }
public CreateTree(BuildChain successor) : base(successor) { }
public TransformTree(BuildChain successor) : base(successor) { }
public TurnQueryIntoRunnableCode(BuildChain successor) : base(successor) { }
public override bool GatherBuildActions(BuildChain buildChain, out WeightedBuildActionBag?actionBag, int inputWeight) => GetOwnBuildActions(inputWeight, out actionBag);
public TransformToQueryableStreamTree(BuildChain successor) : base(successor) { }
public Interface(BuildSession buildSession, BuildChain buildChain) { BuildChain = buildChain; _buildSession = buildSession ?? throw new ArgumentNullException(nameof(buildSession)); }