예제 #1
0
        private void UpdateIcon(BambooPlan plan)
        {
            switch (plan.BuildState)
            {
            case BuildState.Failed:
                IconSource = new Uri("pack://application:,,,/Images/bamboo-failed.ico");
                break;

            case BuildState.Successful:
                if (_bambooPlans.All(x => x.Value.BuildState == BuildState.Successful))
                {
                    IconSource = new Uri("pack://application:,,,/Images/bamboo-successful.ico");
                }
                break;

            case BuildState.Unknown:
                if (_bambooPlans.All(x => x.Value.BuildState == BuildState.Unknown))
                {
                    IconSource = new Uri("pack://application:,,,/Images/bamboo.ico");
                }
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
예제 #2
0
        private async Task UpdatePlans(Session session, CancellationToken token)
        {
            Dictionary <string, Result> oldResults = new Dictionary <string, Result>();

            while (!token.IsCancellationRequested)
            {
                Plans plans = await GetFavouritePlans(session).ConfigureAwait(false);

                if (plans != null)
                {
                    IEnumerable <Task <Result> > resultTasks = plans.PlanList.Select(plan => GetLatestBuild(session, plan.PlanKey.Key));
                    Result[] results = await Task.WhenAll(resultTasks);

                    if (plans.PlanList.Count < oldResults.Count)
                    {
                        string removedPlanKey = oldResults.First(x => !plans.PlanList.Any(y => y.PlanKey.Key == x.Key)).Key;
                        oldResults.Remove(removedPlanKey);
                        _bambooPlanPublisher.FirePlanRemoved(new BambooPlan {
                            PlanKey = removedPlanKey
                        });
                    }

                    foreach (PlanResult planResult in plans.PlanList.Zip(results, (plan, result) => new PlanResult(plan, result)))
                    {
                        BambooPlan bambooPlan = new BambooPlan();
                        if (planResult.Plan.IsBuilding)
                        {
                            bambooPlan.RemainingTime = planResult.Result.Progress.PrettyTimeRamaining;
                        }

                        if (oldResults.Values.Contains(planResult.Result))
                        {
                            continue;
                        }

                        oldResults[planResult.Plan.PlanKey.Key] = planResult.Result;
                        bambooPlan.BuildName   = planResult.Plan.BuildName;
                        bambooPlan.PlanKey     = planResult.Plan.PlanKey.Key;
                        bambooPlan.BuildState  = planResult.Result.BuildState;
                        bambooPlan.ProjectKey  = planResult.Plan.ProjectKey;
                        bambooPlan.ProjectName = planResult.Plan.ProjectName;
                        bambooPlan.IsBuilding  = planResult.Plan.IsBuilding;
                        bambooPlan.IsQueuing   = planResult.Plan.IsActive && planResult.Plan.IsBuilding == false;
                        bambooPlan.IsEnabled   = planResult.Plan.Enabled;
                        _bambooPlanPublisher.FirePlanChanged(bambooPlan);
                    }
                }

                Thread.Sleep(Timeout);
            }
        }
예제 #3
0
        private void fillPlanList(IEnumerable <BambooPlan> plans)
        {
            if (plans == null)
            {
                return;
            }
            checkedListBuilds.Items.Clear();
            int i = 0;

            foreach (var plan in plans)
            {
                checkedListBuilds.Items.Add(plan);
                BambooPlan planCopy = plan;
                if (planKeys.Any(key => planCopy.Key.Equals(key)))
                {
                    checkedListBuilds.SetItemChecked(i, true);
                }
                ++i;
            }
        }
예제 #4
0
 public void FirePlanChanged(BambooPlan plan)
 {
     PlanChanged?.Invoke(this, new PlanEventArgs(plan));
 }
        private ICollection <BambooPlan> getPlansFromUrlWithStartIndex(string endpoint, int start)
        {
            using (Stream stream = getQueryResultStream(endpoint + getBasicAuthParameter(endpoint) + "&start-index=" + start, true)) {
                XPathDocument doc = XPathUtils.getXmlDocument(stream);

                string code = getRestErrorStatusCode(doc);
                if (code != null)
                {
                    throw new Exception(code);
                }

                XPathNavigator nav = doc.CreateNavigator();

                XPathExpression   expr = nav.Compile("/plans/plans");
                XPathNodeIterator it   = nav.Select(expr);
                int totalPlansCount    = 0;
                int maxResult          = 0;
                int startIndex         = 0;
                if (it.MoveNext())
                {
                    totalPlansCount = int.Parse(XPathUtils.getAttributeSafely(it.Current, "size", "0"));
                    maxResult       = int.Parse(XPathUtils.getAttributeSafely(it.Current, "max-result", "0"));
                    startIndex      = int.Parse(XPathUtils.getAttributeSafely(it.Current, "start-index", "0"));
                }

                expr = nav.Compile("/plans/plans/plan");
                it   = nav.Select(expr);

                List <BambooPlan> plans = new List <BambooPlan>();

                while (it.MoveNext())
                {
                    string enabledValue = XPathUtils.getAttributeSafely(it.Current, "enabled", "true");
                    string key          = XPathUtils.getAttributeSafely(it.Current, "key", null);
                    string name         = XPathUtils.getAttributeSafely(it.Current, "name", null);
                    bool   enabled      = true;
                    if (enabledValue != null)
                    {
                        enabled = Boolean.Parse(enabledValue);
                    }
                    it.Current.MoveToFirstChild();
                    bool favourite = false;
                    do
                    {
                        switch (it.Current.Name)
                        {
                        case "isFavourite":
                            favourite = it.Current.Value.Equals("true");
                            break;
                        }
                    } while (it.Current.MoveToNext());
                    if (key == null || name == null)
                    {
                        continue;
                    }
                    BambooPlan plan = new BambooPlan(key, name, enabled, favourite);
                    plans.Add(plan);
                }

                // Yes, recursion here. I hope it works as I think it should. If not, we are all doomed
                if (totalPlansCount > maxResult + startIndex)
                {
                    plans.AddRange(getPlansFromUrlWithStartIndex(endpoint, startIndex + maxResult));
                }

                return(plans);
            }
        }
예제 #6
0
 public PlanEventArgs(BambooPlan plan)
 {
     Plan = plan;
 }