Skip to content
This repository was archived by the owner on Jun 21, 2023. It is now read-only.

Commit d932ee6

Browse files
committed
Convert GitClient methods to use Tasks.
1 parent b5cdef1 commit d932ee6

File tree

4 files changed

+53
-65
lines changed

4 files changed

+53
-65
lines changed

src/GitHub.App/Services/GitClient.cs

Lines changed: 40 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Linq;
44
using System.Reactive;
55
using System.Reactive.Linq;
6+
using System.Threading.Tasks;
67
using GitHub.Extensions;
78
using GitHub.Primitives;
89
using LibGit2Sharp;
@@ -23,90 +24,76 @@ public GitClient(IGitHubCredentialProvider credentialProvider)
2324
fetchOptions = new FetchOptions { CredentialsProvider = credentialProvider.HandleCredentials };
2425
}
2526

26-
public IObservable<Unit> Push(IRepository repository, string branchName, string remoteName)
27+
public Task Push(IRepository repository, string branchName, string remoteName)
2728
{
2829
Guard.ArgumentNotEmptyString(branchName, nameof(branchName));
2930
Guard.ArgumentNotEmptyString(remoteName, nameof(remoteName));
3031

31-
return Observable.Defer(() =>
32+
if (repository.Head?.Commits != null && repository.Head.Commits.Any())
3233
{
33-
if (repository.Head?.Commits != null && repository.Head.Commits.Any())
34-
{
35-
var remote = repository.Network.Remotes[remoteName];
36-
repository.Network.Push(remote, "HEAD", @"refs/heads/" + branchName, pushOptions);
37-
}
38-
return Observable.Return(Unit.Default);
39-
});
34+
var remote = repository.Network.Remotes[remoteName];
35+
repository.Network.Push(remote, "HEAD", @"refs/heads/" + branchName, pushOptions);
36+
}
37+
38+
return Task.FromResult<object>(null);
4039
}
4140

42-
public IObservable<Unit> Fetch(IRepository repository, string remoteName)
41+
public Task Fetch(IRepository repository, string remoteName)
4342
{
4443
Guard.ArgumentNotEmptyString(remoteName, nameof(remoteName));
4544

46-
return Observable.Defer(() =>
47-
{
48-
var remote = repository.Network.Remotes[remoteName];
49-
repository.Network.Fetch(remote, fetchOptions);
50-
return Observable.Return(Unit.Default);
51-
});
45+
var remote = repository.Network.Remotes[remoteName];
46+
repository.Network.Fetch(remote, fetchOptions);
47+
48+
return Task.FromResult<object>(null);
5249
}
5350

54-
public IObservable<Unit> Fetch(IRepository repository, string remoteName, params string[] refspecs)
51+
public Task Fetch(IRepository repository, string remoteName, params string[] refspecs)
5552
{
5653
Guard.ArgumentNotEmptyString(remoteName, nameof(remoteName));
5754

58-
return Observable.Defer(() =>
59-
{
60-
var remote = repository.Network.Remotes[remoteName];
61-
repository.Network.Fetch(remote, refspecs, fetchOptions);
62-
return Observable.Return(Unit.Default);
63-
});
55+
var remote = repository.Network.Remotes[remoteName];
56+
repository.Network.Fetch(remote, refspecs, fetchOptions);
57+
58+
return Task.FromResult<object>(null);
6459
}
6560

66-
public IObservable<Unit> SetRemote(IRepository repository, string remoteName, Uri url)
61+
public Task SetRemote(IRepository repository, string remoteName, Uri url)
6762
{
6863
Guard.ArgumentNotEmptyString(remoteName, nameof(remoteName));
6964

70-
return Observable.Defer(() =>
71-
{
72-
repository.Config.Set("remote." + remoteName + ".url", url.ToString());
73-
repository.Config.Set("remote." + remoteName + ".fetch", "+refs/heads/*:refs/remotes/" + remoteName + "/*");
65+
repository.Config.Set("remote." + remoteName + ".url", url.ToString());
66+
repository.Config.Set("remote." + remoteName + ".fetch", "+refs/heads/*:refs/remotes/" + remoteName + "/*");
7467

75-
return Observable.Return(Unit.Default);
76-
});
68+
return Task.FromResult<object>(null);
7769
}
7870

79-
public IObservable<Unit> SetTrackingBranch(IRepository repository, string branchName, string remoteName)
71+
public Task SetTrackingBranch(IRepository repository, string branchName, string remoteName)
8072
{
8173
Guard.ArgumentNotEmptyString(branchName, nameof(branchName));
8274
Guard.ArgumentNotEmptyString(remoteName, nameof(remoteName));
8375

84-
return Observable.Defer(() =>
76+
var remoteBranchName = IsCanonical(remoteName) ? remoteName : "refs/remotes/" + remoteName + "/" + branchName;
77+
var remoteBranch = repository.Branches[remoteBranchName];
78+
// if it's null, it's because nothing was pushed
79+
if (remoteBranch != null)
8580
{
86-
var remoteBranchName = IsCanonical(remoteName) ? remoteName : "refs/remotes/" + remoteName + "/" + branchName;
87-
var remoteBranch = repository.Branches[remoteBranchName];
88-
// if it's null, it's because nothing was pushed
89-
if (remoteBranch != null)
90-
{
91-
var localBranchName = IsCanonical(branchName) ? branchName : "refs/heads/" + branchName;
92-
var localBranch = repository.Branches[localBranchName];
93-
repository.Branches.Update(localBranch, b => b.TrackedBranch = remoteBranch.CanonicalName);
94-
}
95-
return Observable.Return(Unit.Default);
96-
});
81+
var localBranchName = IsCanonical(branchName) ? branchName : "refs/heads/" + branchName;
82+
var localBranch = repository.Branches[localBranchName];
83+
repository.Branches.Update(localBranch, b => b.TrackedBranch = remoteBranch.CanonicalName);
84+
}
85+
86+
return Task.FromResult<object>(null);
9787
}
9888

99-
public IObservable<Remote> GetHttpRemote(IRepository repo, string remote)
89+
public Task<Remote> GetHttpRemote(IRepository repo, string remote)
10090
{
101-
return Observable.Defer(() => Observable.Return(GitService.GitServiceHelper.GetRemoteUri(repo, remote)))
102-
.Select(uri => new { Remote = uri.IsHypertextTransferProtocol ? remote : remote + "-http", Uri = uri })
103-
.Select(r =>
104-
{
105-
var ret = repo.Network.Remotes[r.Remote];
106-
if (ret == null)
107-
ret = repo.Network.Remotes.Add(r.Remote, UriString.ToUriString(r.Uri.ToRepositoryUrl()));
108-
return ret;
109-
});
91+
var uri = GitService.GitServiceHelper.GetRemoteUri(repo, remote);
92+
var remoteName = uri.IsHypertextTransferProtocol ? remote : remote + "-http";
93+
var ret = repo.Network.Remotes[remoteName];
94+
if (ret == null)
95+
ret = repo.Network.Remotes.Add(remoteName, UriString.ToUriString(uri.ToRepositoryUrl()));
96+
return Task.FromResult(ret);
11097
}
11198

11299
static bool IsCanonical(string s)

src/GitHub.App/Services/RepositoryPublishService.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.ComponentModel.Composition;
33
using System.IO;
44
using System.Reactive.Linq;
5+
using System.Reactive.Threading.Tasks;
56
using GitHub.Api;
67
using GitHub.Models;
78
using LibGit2Sharp;
@@ -39,10 +40,10 @@ public string LocalRepositoryName
3940
{
4041
return Observable.Defer(() => apiClient.CreateRepository(newRepository, account.Login, account.IsUser)
4142
.Select(remoteRepo => new { RemoteRepo = remoteRepo, LocalRepo = activeRepository }))
42-
.SelectMany(repo => gitClient.SetRemote(repo.LocalRepo, "origin", new Uri(repo.RemoteRepo.CloneUrl)).Select(_ => repo))
43-
.SelectMany(repo => gitClient.Push(repo.LocalRepo, "master", "origin").Select(_ => repo))
44-
.SelectMany(repo => gitClient.Fetch(repo.LocalRepo, "origin").Select(_ => repo))
45-
.SelectMany(repo => gitClient.SetTrackingBranch(repo.LocalRepo, "master", "origin").Select(_ => repo.RemoteRepo));
43+
.SelectMany(repo => gitClient.SetRemote(repo.LocalRepo, "origin", new Uri(repo.RemoteRepo.CloneUrl)).ToObservable().Select(_ => repo))
44+
.SelectMany(repo => gitClient.Push(repo.LocalRepo, "master", "origin").ToObservable().Select(_ => repo))
45+
.SelectMany(repo => gitClient.Fetch(repo.LocalRepo, "origin").ToObservable().Select(_ => repo))
46+
.SelectMany(repo => gitClient.SetTrackingBranch(repo.LocalRepo, "master", "origin").ToObservable().Select(_ => repo.RemoteRepo));
4647
}
4748
}
4849
}

src/GitHub.Exports.Reactive/Services/IGitClient.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
using System;
2-
using System.Reactive;
2+
using System.Threading.Tasks;
33
using LibGit2Sharp;
44

55
namespace GitHub.Services
@@ -13,15 +13,15 @@ public interface IGitClient
1313
/// <param name="remoteName">The name of the remote</param>
1414
/// <param name="branchName">the branch to pull</param>
1515
/// <returns></returns>
16-
IObservable<Unit> Push(IRepository repository, string branchName, string remoteName);
16+
Task Push(IRepository repository, string branchName, string remoteName);
1717

1818
/// <summary>
1919
/// Fetches the remote.
2020
/// </summary>
2121
/// <param name="repository">The repository to pull</param>
2222
/// <param name="remoteName">The name of the remote</param>
2323
/// <returns></returns>
24-
IObservable<Unit> Fetch(IRepository repository, string remoteName);
24+
Task Fetch(IRepository repository, string remoteName);
2525

2626
/// <summary>
2727
/// Fetches from the remote, using custom refspecs.
@@ -30,7 +30,7 @@ public interface IGitClient
3030
/// <param name="remoteName">The name of the remote</param>
3131
/// <param name="refspecs">The custom refspecs</param>
3232
/// <returns></returns>
33-
IObservable<Unit> Fetch(IRepository repository, string remoteName, params string[] refspecs);
33+
Task Fetch(IRepository repository, string remoteName, params string[] refspecs);
3434

3535
/// <summary>
3636
/// Sets the specified remote to the specified URL.
@@ -39,7 +39,7 @@ public interface IGitClient
3939
/// <param name="remoteName">The name of the remote</param>
4040
/// <param name="url">The URL to set as the remote</param>
4141
/// <returns></returns>
42-
IObservable<Unit> SetRemote(IRepository repository, string remoteName, Uri url);
42+
Task SetRemote(IRepository repository, string remoteName, Uri url);
4343

4444
/// <summary>
4545
/// Sets the remote branch that the local branch tracks
@@ -48,8 +48,8 @@ public interface IGitClient
4848
/// <param name="branchName">The name of the local remote</param>
4949
/// <param name="remoteName">The name of the remote branch</param>
5050
/// <returns></returns>
51-
IObservable<Unit> SetTrackingBranch(IRepository repository, string branchName, string remoteName);
51+
Task SetTrackingBranch(IRepository repository, string branchName, string remoteName);
5252

53-
IObservable<Remote> GetHttpRemote(IRepository repo, string remote);
53+
Task<Remote> GetHttpRemote(IRepository repo, string remote);
5454
}
5555
}

src/UnitTests/GitHub.App/ViewModels/PullRequestCreationViewModelTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ static LibGit2Sharp.IRepository SetupLocalRepoMock(IGitClient gitClient, IGitSer
2323
{
2424
var l2remote = Substitute.For<LibGit2Sharp.Remote>();
2525
l2remote.Name.Returns(remote);
26-
gitClient.GetHttpRemote(Args.LibGit2Repo, Args.String).Returns(Observable.Return(l2remote));
26+
gitClient.GetHttpRemote(Args.LibGit2Repo, Args.String).Returns(Task.FromResult(l2remote));
2727

2828
var l2repo = Substitute.For<LibGit2Sharp.IRepository>();
2929
var l2branchcol = Substitute.For<LibGit2Sharp.BranchCollection>();

0 commit comments

Comments
 (0)