@@ -214,5 +214,95 @@ public void CanDeleteNonExistingRemote()
214214 repo . Network . Remotes . Remove ( "i_dont_exist" ) ;
215215 }
216216 }
217+
218+ [ Fact ]
219+ public void CanRenameExistingRemote ( )
220+ {
221+ var path = CloneStandardTestRepo ( ) ;
222+ using ( var repo = new Repository ( path ) )
223+ {
224+ Assert . NotNull ( repo . Network . Remotes [ "origin" ] ) ;
225+ Assert . Null ( repo . Network . Remotes [ "renamed" ] ) ;
226+ Assert . NotEmpty ( repo . Refs . FromGlob ( "refs/remotes/origin/*" ) ) ;
227+ Assert . Empty ( repo . Refs . FromGlob ( "refs/remotes/renamed/*" ) ) ;
228+
229+ repo . Network . Remotes . Rename ( "origin" , "renamed" , problem => Assert . True ( false ) ) ;
230+ Assert . Null ( repo . Network . Remotes [ "origin" ] ) ;
231+ Assert . Empty ( repo . Refs . FromGlob ( "refs/remotes/origin/*" ) ) ;
232+
233+ Assert . NotNull ( repo . Network . Remotes [ "renamed" ] ) ;
234+ Assert . NotEmpty ( repo . Refs . FromGlob ( "refs/remotes/renamed/*" ) ) ;
235+ }
236+ }
237+
238+ [ Fact ]
239+ public void CanRenameNonExistingRemote ( )
240+ {
241+ using ( var repo = new Repository ( StandardTestRepoPath ) )
242+ {
243+ Assert . Null ( repo . Network . Remotes [ "i_dont_exist" ] ) ;
244+
245+ repo . Network . Remotes . Rename ( "i_dont_exist" , "i_dont_either" , problem => Assert . True ( false ) ) ;
246+ Assert . Null ( repo . Network . Remotes [ "i_dont_either" ] ) ;
247+ }
248+ }
249+
250+ [ Fact ]
251+ public void ReportsRemotesWithNonDefaultRefSpecs ( )
252+ {
253+ var path = CloneStandardTestRepo ( ) ;
254+ using ( var repo = new Repository ( path ) )
255+ {
256+ Assert . NotNull ( repo . Network . Remotes [ "origin" ] ) ;
257+
258+ repo . Network . Remotes . Update (
259+ repo . Network . Remotes [ "origin" ] ,
260+ r => r . FetchRefSpecs = new [ ] { "+refs/heads/*:refs/remotes/upstream/*" } ) ;
261+
262+ repo . Network . Remotes . Rename ( "origin" , "nondefault" , problem => Assert . Equal ( "+refs/heads/*:refs/remotes/upstream/*" , problem ) ) ;
263+
264+ Assert . NotEmpty ( repo . Refs . FromGlob ( "refs/remotes/nondefault/*" ) ) ;
265+ Assert . Empty ( repo . Refs . FromGlob ( "refs/remotes/upstream/*" ) ) ;
266+
267+ Assert . Null ( repo . Network . Remotes [ "origin" ] ) ;
268+ Assert . NotNull ( repo . Network . Remotes [ "nondefault" ] ) ;
269+ }
270+ }
271+
272+ [ Fact ]
273+ public void DoesNotReportRemotesWithAlreadyExistingRefSpec ( )
274+ {
275+ var path = CloneStandardTestRepo ( ) ;
276+ using ( var repo = new Repository ( path ) )
277+ {
278+ Assert . NotNull ( repo . Network . Remotes [ "origin" ] ) ;
279+
280+ repo . Refs . Add ( "refs/remotes/renamed/master" , "32eab9cb1f450b5fe7ab663462b77d7f4b703344" ) ;
281+
282+ repo . Network . Remotes . Rename ( "origin" , "renamed" , problem => Assert . True ( false ) ) ;
283+
284+ Assert . NotEmpty ( repo . Refs . FromGlob ( "refs/remotes/renamed/*" ) ) ;
285+ Assert . Empty ( repo . Refs . FromGlob ( "refs/remotes/origin/*" ) ) ;
286+
287+ Assert . Null ( repo . Network . Remotes [ "origin" ] ) ;
288+ Assert . NotNull ( repo . Network . Remotes [ "renamed" ] ) ;
289+ }
290+ }
291+
292+ [ Fact ]
293+ public void CanNotRenameWhenRemoteWithSameNameExists ( )
294+ {
295+ const string name = "upstream" ;
296+ const string url = "https://github.com/libgit2/libgit2sharp.git" ;
297+
298+ var path = CloneStandardTestRepo ( ) ;
299+ using ( var repo = new Repository ( path ) )
300+ {
301+ Assert . NotNull ( repo . Network . Remotes [ "origin" ] ) ;
302+ repo . Network . Remotes . Add ( name , url ) ;
303+
304+ Assert . Throws < NameConflictException > ( ( ) => repo . Network . Remotes . Rename ( "origin" , "upstream" ) ) ;
305+ }
306+ }
217307 }
218308}
0 commit comments