33using System . Linq ;
44using System . Reactive ;
55using System . Reactive . Linq ;
6+ using System . Threading . Tasks ;
67using GitHub . Extensions ;
78using GitHub . Primitives ;
89using LibGit2Sharp ;
@@ -23,78 +24,91 @@ 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+ return Task . Factory . StartNew ( ( ) =>
3233 {
3334 if ( repository . Head ? . Commits != null && repository . Head . Commits . Any ( ) )
3435 {
3536 var remote = repository . Network . Remotes [ remoteName ] ;
3637 repository . Network . Push ( remote , "HEAD" , @"refs/heads/" + branchName , pushOptions ) ;
3738 }
38- return Observable . Return ( Unit . Default ) ;
3939 } ) ;
4040 }
4141
42- public IObservable < Unit > Fetch ( IRepository repository , string remoteName )
42+ public Task Fetch ( IRepository repository , string remoteName )
4343 {
4444 Guard . ArgumentNotEmptyString ( remoteName , nameof ( remoteName ) ) ;
4545
46- return Observable . Defer ( ( ) =>
46+ return Task . Factory . StartNew ( ( ) =>
4747 {
4848 var remote = repository . Network . Remotes [ remoteName ] ;
4949 repository . Network . Fetch ( remote , fetchOptions ) ;
50- return Observable . Return ( Unit . Default ) ;
5150 } ) ;
5251 }
5352
54- public IObservable < Unit > SetRemote ( IRepository repository , string remoteName , Uri url )
53+ public Task Fetch ( IRepository repository , string remoteName , params string [ ] refspecs )
5554 {
5655 Guard . ArgumentNotEmptyString ( remoteName , nameof ( remoteName ) ) ;
5756
58- return Observable . Defer ( ( ) =>
57+ return Task . Factory . StartNew ( ( ) =>
5958 {
59+ var remote = repository . Network . Remotes [ remoteName ] ;
60+ repository . Network . Fetch ( remote , refspecs , fetchOptions ) ;
61+ } ) ;
62+ }
63+
64+ public Task SetRemote ( IRepository repository , string remoteName , Uri url )
65+ {
66+ Guard . ArgumentNotEmptyString ( remoteName , nameof ( remoteName ) ) ;
67+
68+ return Task . Factory . StartNew ( ( ) =>
69+ {
70+
6071 repository . Config . Set ( "remote." + remoteName + ".url" , url . ToString ( ) ) ;
6172 repository . Config . Set ( "remote." + remoteName + ".fetch" , "+refs/heads/*:refs/remotes/" + remoteName + "/*" ) ;
62-
63- return Observable . Return ( Unit . Default ) ;
6473 } ) ;
6574 }
6675
67- public IObservable < Unit > SetTrackingBranch ( IRepository repository , string branchName , string remoteName )
76+ public Task SetTrackingBranch ( IRepository repository , string branchName , string remoteName )
6877 {
6978 Guard . ArgumentNotEmptyString ( branchName , nameof ( branchName ) ) ;
7079 Guard . ArgumentNotEmptyString ( remoteName , nameof ( remoteName ) ) ;
7180
72- return Observable . Defer ( ( ) =>
81+ return Task . Factory . StartNew ( ( ) =>
7382 {
74- var remoteBranchName = "refs/remotes/" + remoteName + "/" + branchName ;
83+ var remoteBranchName = IsCanonical ( remoteName ) ? remoteName : "refs/remotes/" + remoteName + "/" + branchName ;
7584 var remoteBranch = repository . Branches [ remoteBranchName ] ;
7685 // if it's null, it's because nothing was pushed
7786 if ( remoteBranch != null )
7887 {
79- var localBranchName = "refs/heads/" + branchName ;
88+ var localBranchName = IsCanonical ( branchName ) ? branchName : "refs/heads/" + branchName ;
8089 var localBranch = repository . Branches [ localBranchName ] ;
8190 repository . Branches . Update ( localBranch , b => b . TrackedBranch = remoteBranch . CanonicalName ) ;
8291 }
83- return Observable . Return ( Unit . Default ) ;
8492 } ) ;
8593 }
8694
87- public IObservable < Remote > GetHttpRemote ( IRepository repo , string remote )
95+ public Task < Remote > GetHttpRemote ( IRepository repo , string remote )
8896 {
89- return Observable . Defer ( ( ) => Observable . Return ( GitService . GitServiceHelper . GetRemoteUri ( repo , remote ) ) )
90- . Select ( uri => new { Remote = uri . IsHypertextTransferProtocol ? remote : remote + "-http" , Uri = uri } )
91- . Select ( r =>
92- {
93- var ret = repo . Network . Remotes [ r . Remote ] ;
94- if ( ret == null )
95- ret = repo . Network . Remotes . Add ( r . Remote , UriString . ToUriString ( r . Uri . ToRepositoryUrl ( ) ) ) ;
96- return ret ;
97- } ) ;
97+ return Task . Factory . StartNew ( ( ) =>
98+ {
99+
100+ var uri = GitService . GitServiceHelper . GetRemoteUri ( repo , remote ) ;
101+ var remoteName = uri . IsHypertextTransferProtocol ? remote : remote + "-http" ;
102+ var ret = repo . Network . Remotes [ remoteName ] ;
103+ if ( ret == null )
104+ ret = repo . Network . Remotes . Add ( remoteName , UriString . ToUriString ( uri . ToRepositoryUrl ( ) ) ) ;
105+ return ret ;
106+ } ) ;
107+ }
108+
109+ static bool IsCanonical ( string s )
110+ {
111+ return s . StartsWith ( "refs/" , StringComparison . Ordinal ) ;
98112 }
99113 }
100114}
0 commit comments