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;
        }
예제 #2
0
    /// <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);
    }
예제 #4
0
        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();
            }
        }
예제 #5
0
        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);
        }
예제 #6
0
    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);
    }
예제 #8
0
    /// <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);
    }
예제 #9
0
        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);
        }
예제 #10
0
    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);
    }
예제 #11
0
    /// <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);
            }
    }
예제 #12
0
    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);
    }
예제 #13
0
    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));
    }
예제 #14
0
        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);
            }
        }
예제 #15
0
    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);
            }
    }
예제 #16
0
파일: CreateTree.cs 프로젝트: xet7/Musoq
 public CreateTree(BuildChain successor)
     : base(successor)
 {
 }
예제 #17
0
 public TransformTree(BuildChain successor)
     : base(successor)
 {
 }
예제 #18
0
 public TurnQueryIntoRunnableCode(BuildChain successor)
     : base(successor)
 {
 }
예제 #19
0
 public override bool GatherBuildActions(BuildChain buildChain, out WeightedBuildActionBag?actionBag, int inputWeight) => GetOwnBuildActions(inputWeight, out actionBag);
 public TransformToQueryableStreamTree(BuildChain successor)
     : base(successor)
 {
 }
예제 #21
0
 public Interface(BuildSession buildSession, BuildChain buildChain)
 {
     BuildChain    = buildChain;
     _buildSession = buildSession ?? throw new ArgumentNullException(nameof(buildSession));
 }