@@ -2,6 +2,8 @@ var assert = require("assert");
22var path = require ( "path" ) ;
33var local = path . join . bind ( path , __dirname ) ;
44
5+ var garbageCollect = require ( "../utils/garbage_collect.js" ) ;
6+
57describe ( "Remote" , function ( ) {
68 var NodeGit = require ( "../../" ) ;
79 var Repository = NodeGit . Repository ;
@@ -379,4 +381,48 @@ describe("Remote", function() {
379381 }
380382 } ) ;
381383 } ) ;
384+
385+ it ( "is kept alive by refspec" , function ( ) {
386+ var repo = this . repository ;
387+ var Remote = NodeGit . Remote ;
388+
389+ garbageCollect ( ) ;
390+ var startSelfFreeingCount = Remote . getSelfFreeingInstanceCount ( ) ;
391+ var startNonSelfFreeingCount = Remote . getNonSelfFreeingConstructedCount ( ) ;
392+
393+ var resolve ;
394+ var promise = new Promise ( function ( _resolve ) { resolve = _resolve ; } ) ;
395+
396+ var remote ;
397+
398+ repo . getRemote ( "origin" )
399+ . then ( function ( _remote ) {
400+ remote = _remote ;
401+ setTimeout ( resolve , 0 ) ;
402+ } ) ;
403+
404+ return promise
405+ . then ( function ( ) {
406+ // make sure we have created one self-freeing remote
407+ assert . equal ( startSelfFreeingCount + 1 ,
408+ Remote . getSelfFreeingInstanceCount ( ) ) ;
409+ assert . equal ( startNonSelfFreeingCount ,
410+ Remote . getNonSelfFreeingConstructedCount ( ) ) ;
411+ var refspec = remote . getRefspec ( 0 ) ;
412+ assert . equal ( "refs/heads/*" , refspec . src ( ) ) ;
413+ remote = null ;
414+ garbageCollect ( ) ;
415+ // the refspec should be holding on to the remote
416+ assert . equal ( startSelfFreeingCount + 1 ,
417+ Remote . getSelfFreeingInstanceCount ( ) ) ;
418+
419+ assert . equal ( "refs/heads/*" , refspec . src ( ) ) ;
420+
421+ refspec = null ;
422+ garbageCollect ( ) ;
423+ // the remote should be freed now
424+ assert . equal ( startSelfFreeingCount ,
425+ Remote . getSelfFreeingInstanceCount ( ) ) ;
426+ } ) ;
427+ } ) ;
382428} ) ;
0 commit comments