protected static void CreateFileSystemObservable() { _observable = new FileSystemObservable(SourceDirectory); _subscription = _observable.Subscribe(change => Changes.Add(change)); Wait.Until(() => _observable.IsAlive); }
public Duplicator(string sourceDirectory, string targetDirectory, IConfigurator config) { if (string.IsNullOrWhiteSpace(sourceDirectory)) throw new ArgumentNullException("sourceDirectory"); if (string.IsNullOrWhiteSpace(targetDirectory)) throw new ArgumentNullException("targetDirectory"); if (!Directory.Exists(sourceDirectory)) throw new DirectoryNotFoundException(); if (!Directory.Exists(targetDirectory)) throw new DirectoryNotFoundException(); if (sourceDirectory == targetDirectory) throw new ArgumentException("Cannot duplicate the source directory to itself"); _handlerFactory = new DuplicationHandlerFactory(sourceDirectory, targetDirectory); _observable = new FileSystemObservable(sourceDirectory); _subscription = config.Configure(_observable).Subscribe(OnFileSystemChange); }
public ModificationViewModel(IScreen screen, ICredentialStore store, IObservable<RepositoryModel> repository) { this.disposables = new List<IDisposable>(); this.fileSystem = new FileSystemObservable(); this.refreshCommand = ReactiveCommand.Create(); var samples = Observable.Interval(TimeSpan.FromSeconds(60)) .Select(i => new object()) .Merge(this.refreshCommand.Select(i => new object())) .Merge(repository.Delay(TimeSpan.FromSeconds(1)).Select(i => new object())); var distinctRepository = repository.DistinctUntilChanged(r => r.Path); distinctRepository.MapToMember(this, vm => vm.currentRepositoryModel); distinctRepository.Select(_ => _.Path).MapToMember(this, vm => vm.fileSystem.Path); var activeBranch = repository .SelectMany(rm => rm.WhenAny(vm => vm.CurrentBranch, change => change.GetValue())) .SampleEx(samples); activeBranch .ObserveOn(System.Reactive.Concurrency.TaskPoolScheduler.Default) .SubscribeOn(System.Reactive.Concurrency.TaskPoolScheduler.Default) .Subscribe(branch => { if (branch.IsTracking) { //Fetch repository status. var currentRemote = branch.Remote; var refSpecs = this.currentRepositoryModel.Repository.Network.Remotes.Select(r => new { FetchRefSpecs = r.FetchRefSpecs .Where(frs => frs.Direction == RefSpecDirection.Fetch) .Select(frs => frs.Specification), Remote = r } ); var credentialProvider = new CredentialProvider(screen, store); foreach (var item in refSpecs) { FetchOptions options = new FetchOptions() { CredentialsProvider = credentialProvider.CredentialHandler }; try { this.currentRepositoryModel.Repository.Network.Fetch(item.Remote, item.FetchRefSpecs, options); } catch { } } } }); activeBranch .Select(b => b.TrackingDetails).Subscribe(_ => { this.Ahead = (_.AheadBy.HasValue) ? _.AheadBy.Value : 0; this.Behind = (_.BehindBy.HasValue) ? _.BehindBy.Value : 0; }); var activeBranchFileStatus = activeBranch.AnonymousMerge(fileSystem, 0) .AnonymousMerge(this.refreshCommand.AsObservable(), 0) .Throttle(TimeSpan.FromSeconds(5)) .Select(branch => { var opts = new LibGit2Sharp.StatusOptions(); opts.DetectRenamesInIndex = true; opts.DetectRenamesInWorkDir = true; opts.Show = StatusShowOption.IndexAndWorkDir; return this.currentRepositoryModel.Repository.RetrieveStatus(opts); }); this.files = new DeltaViewModel<int> ( activeBranchFileStatus.Select(s => s.Modified.Count()), activeBranchFileStatus.Select(s => s.Added.Count() + s.Untracked.Count()), activeBranchFileStatus.Select(s => s.Removed.Count()) ); ConfigureLineChanges(activeBranch); ConfigureCommitCommands(); this.thresholds = new Thresholds( this.ObservableForProperty(vm => vm.Behind, false, false).Select(change => change.GetValue()), this.ObservableForProperty(vm => vm.Ahead).Select(change => change.GetValue()), this.ObservableForProperty(vm => vm.LinesAdded).Select(change => change.GetValue()), this.ObservableForProperty(vm => vm.LinesRemoved).Select(change => change.GetValue()), this.Files.ObservableForProperty(vm => vm.Added).Select(change => change.GetValue()), this.Files.ObservableForProperty(vm => vm.Removed).Select(change => change.GetValue())); }