Exemplo n.º 1
0
        public void LaunchBuildServerInfoFetchOperation()
        {
            CancelBuildStatusFetchOperation();

            DisposeBuildServerAdapter();

            GetBuildServerAdapter().ContinueWith((Task <IBuildServerAdapter> task) =>
            {
                if (_revisions.IsDisposed)
                {
                    return;
                }

                _buildServerAdapter = task.Result;

                UpdateUI();

                if (_buildServerAdapter == null)
                {
                    return;
                }

                var scheduler = NewThreadScheduler.Default;

                // Run this first as it (may) force start queries
                var runningBuildsObservable = _buildServerAdapter.GetRunningBuilds(scheduler);

                var fullDayObservable = _buildServerAdapter.GetFinishedBuildsSince(scheduler, DateTime.Today - TimeSpan.FromDays(3));
                var fullObservable    = _buildServerAdapter.GetFinishedBuildsSince(scheduler);
                var fromNowObservable = _buildServerAdapter.GetFinishedBuildsSince(scheduler, DateTime.Now);

                var cancellationToken = new CompositeDisposable
                {
                    fullDayObservable.OnErrorResumeNext(fullObservable)
                    .OnErrorResumeNext(Observable.Empty <BuildInfo>()
                                       .DelaySubscription(TimeSpan.FromMinutes(1))
                                       .OnErrorResumeNext(fromNowObservable)
                                       .Retry()
                                       .Repeat())
                    .ObserveOn(SynchronizationContext.Current)
                    .Subscribe(OnBuildInfoUpdate),

                    runningBuildsObservable.OnErrorResumeNext(Observable.Empty <BuildInfo>()
                                                              .DelaySubscription(TimeSpan.FromSeconds(10)))
                    .Retry()
                    .Repeat()
                    .ObserveOn(SynchronizationContext.Current)
                    .Subscribe(OnBuildInfoUpdate)
                };

                _buildStatusCancellationToken = cancellationToken;
            },
                                                 TaskScheduler.FromCurrentSynchronizationContext());
        }
        public void LaunchBuildServerInfoFetchOperation()
        {
            ThreadHelper.ThrowIfNotOnUIThread();

            CancelBuildStatusFetchOperation();

            DisposeBuildServerAdapter();

            ThreadHelper.JoinableTaskFactory.RunAsync(
                async() =>
            {
                _buildServerAdapter = await GetBuildServerAdapterAsync();

                await _revisions.SwitchToMainThreadAsync();

                UpdateUI();

                if (_buildServerAdapter == null)
                {
                    return;
                }

                var scheduler = NewThreadScheduler.Default;

                // Run this first as it (may) force start queries
                var runningBuildsObservable = _buildServerAdapter.GetRunningBuilds(scheduler);

                var fullDayObservable = _buildServerAdapter.GetFinishedBuildsSince(scheduler, DateTime.Today - TimeSpan.FromDays(3));
                var fullObservable    = _buildServerAdapter.GetFinishedBuildsSince(scheduler);
                var fromNowObservable = _buildServerAdapter.GetFinishedBuildsSince(scheduler, DateTime.Now);

                var cancellationToken = new CompositeDisposable
                {
                    fullDayObservable.OnErrorResumeNext(fullObservable)
                    .OnErrorResumeNext(Observable.Empty <BuildInfo>()
                                       .DelaySubscription(TimeSpan.FromMinutes(1))
                                       .OnErrorResumeNext(fromNowObservable)
                                       .Retry()
                                       .Repeat())
                    .ObserveOn(MainThreadScheduler.Instance)
                    .Subscribe(OnBuildInfoUpdate),

                    runningBuildsObservable.OnErrorResumeNext(Observable.Empty <BuildInfo>()
                                                              .DelaySubscription(TimeSpan.FromSeconds(10)))
                    .Retry()
                    .Repeat()
                    .ObserveOn(MainThreadScheduler.Instance)
                    .Subscribe(OnBuildInfoUpdate)
                };

                _buildStatusCancellationToken = cancellationToken;
            });
        }
Exemplo n.º 3
0
        public void LaunchBuildServerInfoFetchOperation()
        {
            CancelBuildStatusFetchOperation();

            DisposeBuildServerAdapter();

            // Extract the project name from the last part of the directory path. It is assumed that it matches the project name in the CI build server.
            GetBuildServerAdapter().ContinueWith((Task <IBuildServerAdapter> task) =>
            {
                if (revisions.IsDisposed)
                {
                    return;
                }

                buildServerAdapter = task.Result;

                UpdateUI();

                if (buildServerAdapter == null)
                {
                    return;
                }

                var scheduler               = NewThreadScheduler.Default;
                var fullDayObservable       = buildServerAdapter.GetFinishedBuildsSince(scheduler, DateTime.Today - TimeSpan.FromDays(3));
                var fullObservable          = buildServerAdapter.GetFinishedBuildsSince(scheduler);
                var fromNowObservable       = buildServerAdapter.GetFinishedBuildsSince(scheduler, DateTime.Now);
                var runningBuildsObservable = buildServerAdapter.GetRunningBuilds(scheduler);

                var cancellationToken = new CompositeDisposable
                {
                    fullDayObservable.OnErrorResumeNext(fullObservable)
                    .OnErrorResumeNext(Observable.Empty <BuildInfo>()
                                       .DelaySubscription(TimeSpan.FromMinutes(1))
                                       .OnErrorResumeNext(fromNowObservable)
                                       .Retry()
                                       .Repeat())
                    .ObserveOn(SynchronizationContext.Current)
                    .Subscribe(OnBuildInfoUpdate),

                    runningBuildsObservable.OnErrorResumeNext(Observable.Empty <BuildInfo>()
                                                              .DelaySubscription(TimeSpan.FromSeconds(10)))
                    .Retry()
                    .Repeat()
                    .ObserveOn(SynchronizationContext.Current)
                    .Subscribe(OnBuildInfoUpdate)
                };

                buildStatusCancellationToken = cancellationToken;
            },
                                                 TaskScheduler.FromCurrentSynchronizationContext());
        }
Exemplo n.º 4
0
        public void LaunchBuildServerInfoFetchOperation()
        {
            CancelBuildStatusFetchOperation();

            DisposeBuildServerAdapter();

            // Extract the project name from the last part of the directory path. It is assumed that it matches the project name in the CI build server.
            GetBuildServerAdapter().ContinueWith((Task<IBuildServerAdapter> task) =>
            {
                if (revisions.IsDisposed)
                {
                    return;
                }

                buildServerAdapter = task.Result;

                UpdateUI();

                if (buildServerAdapter == null)
                    return;

                var scheduler = NewThreadScheduler.Default;
                var fullDayObservable = buildServerAdapter.GetFinishedBuildsSince(scheduler, DateTime.Today - TimeSpan.FromDays(3));
                var fullObservable = buildServerAdapter.GetFinishedBuildsSince(scheduler);
                var fromNowObservable = buildServerAdapter.GetFinishedBuildsSince(scheduler, DateTime.Now);
                var runningBuildsObservable = buildServerAdapter.GetRunningBuilds(scheduler);

                var cancellationToken = new CompositeDisposable
                {
                    fullDayObservable.OnErrorResumeNext(fullObservable)
                                     .OnErrorResumeNext(Observable.Empty<BuildInfo>()
                                                                  .DelaySubscription(TimeSpan.FromMinutes(1))
                                                                  .OnErrorResumeNext(fromNowObservable)
                                                                  .Retry()
                                                                  .Repeat())
                                     .ObserveOn(SynchronizationContext.Current)
                                     .Subscribe(OnBuildInfoUpdate),

                    runningBuildsObservable.OnErrorResumeNext(Observable.Empty<BuildInfo>()
                                                                        .DelaySubscription(TimeSpan.FromSeconds(10)))
                                           .Retry()
                                           .Repeat()
                                           .ObserveOn(SynchronizationContext.Current)
                                           .Subscribe(OnBuildInfoUpdate)
                };

                buildStatusCancellationToken = cancellationToken;
            },
            TaskScheduler.FromCurrentSynchronizationContext());
        }
Exemplo n.º 5
0
        public IBuildServerCredentials GetBuildServerCredentials(IBuildServerAdapter buildServerAdapter, bool useStoredCredentialsIfExisting)
        {
            lock (buildServerCredentialsLock)
            {
                IBuildServerCredentials buildServerCredentials = new BuildServerCredentials { UseGuestAccess = true };

                const string CredentialsConfigName = "Credentials";
                const string UseGuestAccessKey = "UseGuestAccess";
                const string UsernameKey = "Username";
                const string PasswordKey = "Password";
                using (var stream = GetBuildServerOptionsIsolatedStorageStream(buildServerAdapter, FileAccess.Read, FileShare.Read))
                {
                    if (stream.Position < stream.Length)
                    {
                        var protectedData = new byte[stream.Length];

                        stream.Read(protectedData, 0, (int)stream.Length);
                        try
                        {
                            byte[] unprotectedData = ProtectedData.Unprotect(protectedData, null,
                                DataProtectionScope.CurrentUser);
                            using (var memoryStream = new MemoryStream(unprotectedData))
                            {
                                ConfigFile credentialsConfig = new ConfigFile("", false);

                                using (var textReader = new StreamReader(memoryStream, Encoding.UTF8))
                                {
                                    credentialsConfig.LoadFromString(textReader.ReadToEnd());
                                }

                                ConfigSection section = credentialsConfig.FindConfigSection(CredentialsConfigName);

                                if (section != null)
                                {
                                    buildServerCredentials.UseGuestAccess = section.GetValueAsBool(UseGuestAccessKey,
                                        true);
                                    buildServerCredentials.Username = section.GetValue(UsernameKey);
                                    buildServerCredentials.Password = section.GetValue(PasswordKey);

                                    if (useStoredCredentialsIfExisting)
                                    {
                                        return buildServerCredentials;
                                    }
                                }
                            }
                        }
                        catch (CryptographicException)
                        {
                            // As per MSDN, the ProtectedData.Unprotect method is per user,
                            // it will throw the CryptographicException if the current user
                            // is not the one who protected the data.

                            // Set this variable to false so the user can reset the credentials.
                            useStoredCredentialsIfExisting = false;
                        }
                    }
                }

                if (!useStoredCredentialsIfExisting)
                {
                    buildServerCredentials = ShowBuildServerCredentialsForm(buildServerAdapter.UniqueKey, buildServerCredentials);

                    if (buildServerCredentials != null)
                    {
                        ConfigFile credentialsConfig = new ConfigFile("", true);

                        ConfigSection section = credentialsConfig.FindOrCreateConfigSection(CredentialsConfigName);

                        section.SetValueAsBool(UseGuestAccessKey, buildServerCredentials.UseGuestAccess);
                        section.SetValue(UsernameKey, buildServerCredentials.Username);
                        section.SetValue(PasswordKey, buildServerCredentials.Password);

                        using (var stream = GetBuildServerOptionsIsolatedStorageStream(buildServerAdapter, FileAccess.Write, FileShare.None))
                        {
                            using (var memoryStream = new MemoryStream())
                            {
                                using (var textWriter = new StreamWriter(memoryStream, Encoding.UTF8))
                                {
                                    textWriter.Write(credentialsConfig.GetAsString());
                                }

                                var protectedData = ProtectedData.Protect(memoryStream.ToArray(), null, DataProtectionScope.CurrentUser);
                                stream.Write(protectedData, 0, protectedData.Length);
                            }
                        }

                        return buildServerCredentials;
                    }
                }

                return null;
            }
        }
Exemplo n.º 6
0
 private void DisposeBuildServerAdapter()
 {
     if (buildServerAdapter != null)
     {
         buildServerAdapter.Dispose();
         buildServerAdapter = null;
     }
 }
Exemplo n.º 7
0
 private static IsolatedStorageFileStream GetBuildServerOptionsIsolatedStorageStream(IBuildServerAdapter buildServerAdapter, FileAccess fileAccess, FileShare fileShare)
 {
     var fileName = string.Format("BuildServer-{0}.options", Convert.ToBase64String(Encoding.UTF8.GetBytes(buildServerAdapter.UniqueKey)));
     return new IsolatedStorageFileStream(fileName, FileMode.OpenOrCreate, fileAccess, fileShare);
 }
Exemplo n.º 8
0
        private static IsolatedStorageFileStream GetBuildServerOptionsIsolatedStorageStream(IBuildServerAdapter buildServerAdapter, FileAccess fileAccess, FileShare fileShare)
        {
            var fileName = string.Format("BuildServer-{0}.options", Convert.ToBase64String(Encoding.UTF8.GetBytes(buildServerAdapter.UniqueKey)));

            return(new IsolatedStorageFileStream(fileName, FileMode.OpenOrCreate, fileAccess, fileShare));
        }
Exemplo n.º 9
0
        public IBuildServerCredentials GetBuildServerCredentials(IBuildServerAdapter buildServerAdapter, bool useStoredCredentialsIfExisting)
        {
            lock (buildServerCredentialsLock)
            {
                IBuildServerCredentials buildServerCredentials = new BuildServerCredentials {
                    UseGuestAccess = true
                };
                var foundInConfig = false;

                const string CredentialsConfigName = "Credentials";
                const string UseGuestAccessKey     = "UseGuestAccess";
                const string UsernameKey           = "Username";
                const string PasswordKey           = "Password";
                using (var stream = GetBuildServerOptionsIsolatedStorageStream(buildServerAdapter, FileAccess.Read, FileShare.Read))
                {
                    if (stream.Position < stream.Length)
                    {
                        var protectedData = new byte[stream.Length];

                        stream.Read(protectedData, 0, (int)stream.Length);
                        try
                        {
                            byte[] unprotectedData = ProtectedData.Unprotect(protectedData, null,
                                                                             DataProtectionScope.CurrentUser);
                            using (var memoryStream = new MemoryStream(unprotectedData))
                            {
                                ConfigFile credentialsConfig = new ConfigFile("", false);

                                using (var textReader = new StreamReader(memoryStream, Encoding.UTF8))
                                {
                                    credentialsConfig.LoadFromString(textReader.ReadToEnd());
                                }

                                var section = credentialsConfig.FindConfigSection(CredentialsConfigName);

                                if (section != null)
                                {
                                    buildServerCredentials.UseGuestAccess = section.GetValueAsBool(UseGuestAccessKey,
                                                                                                   true);
                                    buildServerCredentials.Username = section.GetValue(UsernameKey);
                                    buildServerCredentials.Password = section.GetValue(PasswordKey);
                                    foundInConfig = true;

                                    if (useStoredCredentialsIfExisting)
                                    {
                                        return(buildServerCredentials);
                                    }
                                }
                            }
                        }
                        catch (CryptographicException)
                        {
                            // As per MSDN, the ProtectedData.Unprotect method is per user,
                            // it will throw the CryptographicException if the current user
                            // is not the one who protected the data.

                            // Set this variable to false so the user can reset the credentials.
                            useStoredCredentialsIfExisting = false;
                        }
                    }
                }

                if (!useStoredCredentialsIfExisting || !foundInConfig)
                {
                    buildServerCredentials = ShowBuildServerCredentialsForm(buildServerAdapter.UniqueKey, buildServerCredentials);

                    if (buildServerCredentials != null)
                    {
                        ConfigFile credentialsConfig = new ConfigFile("", true);

                        var section = credentialsConfig.FindOrCreateConfigSection(CredentialsConfigName);

                        section.SetValueAsBool(UseGuestAccessKey, buildServerCredentials.UseGuestAccess);
                        section.SetValue(UsernameKey, buildServerCredentials.Username);
                        section.SetValue(PasswordKey, buildServerCredentials.Password);

                        using (var stream = GetBuildServerOptionsIsolatedStorageStream(buildServerAdapter, FileAccess.Write, FileShare.None))
                        {
                            using (var memoryStream = new MemoryStream())
                            {
                                using (var textWriter = new StreamWriter(memoryStream, Encoding.UTF8))
                                {
                                    textWriter.Write(credentialsConfig.GetAsString());
                                }

                                var protectedData = ProtectedData.Protect(memoryStream.ToArray(), null, DataProtectionScope.CurrentUser);
                                stream.Write(protectedData, 0, protectedData.Length);
                            }
                        }

                        return(buildServerCredentials);
                    }
                }

                return(null);
            }
        }
Exemplo n.º 10
0
        public async Task LaunchBuildServerInfoFetchOperationAsync()
        {
            await TaskScheduler.Default;

            CancelBuildStatusFetchOperation();

            var launchToken = _launchCancellation.Next();

            var buildServerAdapter = await GetBuildServerAdapterAsync().ConfigureAwait(false);

            await _revisionGridView.SwitchToMainThreadAsync(launchToken);

            _buildServerAdapter?.Dispose();
            _buildServerAdapter = buildServerAdapter;

            await TaskScheduler.Default;

            if (buildServerAdapter == null || launchToken.IsCancellationRequested)
            {
                return;
            }

            var scheduler = NewThreadScheduler.Default;

            // Run this first as it (may) force start queries
            var runningBuildsObservable = buildServerAdapter.GetRunningBuilds(scheduler);

            var fullDayObservable = buildServerAdapter.GetFinishedBuildsSince(scheduler, DateTime.Today - TimeSpan.FromDays(3));
            var fullObservable    = buildServerAdapter.GetFinishedBuildsSince(scheduler);

            bool anyRunningBuilds = false;
            var  delayObservable  = Observable.Defer(() => Observable.Empty <BuildInfo>()
                                                     .DelaySubscription(anyRunningBuilds ? ShortPollInterval : LongPollInterval));

            var      shouldLookForNewlyFinishedBuilds = false;
            DateTime nowFrozen = DateTime.Now;

            // All finished builds have already been retrieved,
            // so looking for new finished builds make sense only if running builds have been found previously
            var fromNowObservable = Observable.If(() => shouldLookForNewlyFinishedBuilds,
                                                  buildServerAdapter.GetFinishedBuildsSince(scheduler, nowFrozen)
                                                  .Finally(() => shouldLookForNewlyFinishedBuilds = false));

            var cancellationToken = new CompositeDisposable
            {
                fullDayObservable.OnErrorResumeNext(fullObservable)
                .OnErrorResumeNext(Observable.Empty <BuildInfo>()
                                   .DelaySubscription(TimeSpan.FromMinutes(1))
                                   .OnErrorResumeNext(fromNowObservable)
                                   .Retry()
                                   .Repeat())
                .ObserveOn(MainThreadScheduler.Instance)
                .Subscribe(OnBuildInfoUpdate),

                runningBuildsObservable.Do(buildInfo =>
                {
                    anyRunningBuilds = true;
                    shouldLookForNewlyFinishedBuilds = true;
                })
                .Retry()
                .Concat(delayObservable)
                .Finally(() => anyRunningBuilds = false)
                .Repeat()
                .ObserveOn(MainThreadScheduler.Instance)
                .Subscribe(OnBuildInfoUpdate)
            };

            await _revisionGridView.SwitchToMainThreadAsync(launchToken);

            CancelBuildStatusFetchOperation();
            _buildStatusCancellationToken = cancellationToken;
        }
Exemplo n.º 11
0
        public IBuildServerCredentials GetBuildServerCredentials(IBuildServerAdapter buildServerAdapter, bool useStoredCredentialsIfExisting)
        {
            lock (buildServerCredentialsLock)
            {
                IBuildServerCredentials buildServerCredentials = new BuildServerCredentials {
                    UseGuestAccess = true
                };

                const string CredentialsConfigName = "Credentials";
                const string UseGuestAccessKey     = "UseGuestAccess";
                const string UsernameKey           = "Username";
                const string PasswordKey           = "Password";
                using (var stream = GetBuildServerOptionsIsolatedStorageStream(buildServerAdapter, FileAccess.Read, FileShare.Read))
                {
                    if (stream.Position < stream.Length)
                    {
                        var protectedData = new byte[stream.Length];

                        stream.Read(protectedData, 0, (int)stream.Length);

                        byte[] unprotectedData = ProtectedData.Unprotect(protectedData, null, DataProtectionScope.CurrentUser);
                        using (var memoryStream = new MemoryStream(unprotectedData))
                        {
                            ConfigFile credentialsConfig = new ConfigFile("", false);

                            using (var textReader = new StreamReader(memoryStream, Encoding.UTF8))
                            {
                                credentialsConfig.LoadFromString(textReader.ReadToEnd());
                            }

                            ConfigSection section = credentialsConfig.FindConfigSection(CredentialsConfigName);

                            if (section != null)
                            {
                                buildServerCredentials.UseGuestAccess = section.GetValueAsBool(UseGuestAccessKey, true);
                                buildServerCredentials.Username       = section.GetValue(UsernameKey);
                                buildServerCredentials.Password       = section.GetValue(PasswordKey);

                                if (useStoredCredentialsIfExisting)
                                {
                                    return(buildServerCredentials);
                                }
                            }
                        }
                    }
                }

                if (!useStoredCredentialsIfExisting)
                {
                    buildServerCredentials = ShowBuildServerCredentialsForm(buildServerAdapter.UniqueKey, buildServerCredentials);

                    if (buildServerCredentials != null)
                    {
                        ConfigFile credentialsConfig = new ConfigFile("", true);

                        ConfigSection section = credentialsConfig.FindOrCreateConfigSection(CredentialsConfigName);

                        section.SetValueAsBool(UseGuestAccessKey, buildServerCredentials.UseGuestAccess);
                        section.SetValue(UsernameKey, buildServerCredentials.Username);
                        section.SetValue(PasswordKey, buildServerCredentials.Password);

                        using (var stream = GetBuildServerOptionsIsolatedStorageStream(buildServerAdapter, FileAccess.Write, FileShare.None))
                        {
                            using (var memoryStream = new MemoryStream())
                            {
                                using (var textWriter = new StreamWriter(memoryStream, Encoding.UTF8))
                                {
                                    textWriter.Write(credentialsConfig.GetAsString());
                                }

                                var protectedData = ProtectedData.Protect(memoryStream.ToArray(), null, DataProtectionScope.CurrentUser);
                                stream.Write(protectedData, 0, protectedData.Length);
                            }
                        }

                        return(buildServerCredentials);
                    }
                }

                return(null);
            }
        }