@@ -260,6 +260,7 @@ export const make = Effect.gen(function* () {
260260 PubSub . unbounded < {
261261 readonly cwd : string ;
262262 readonly refName : string | null ;
263+ readonly isRepo : boolean ;
263264 readonly revision : number ;
264265 } > ( ) ,
265266 ( pubsub ) => PubSub . shutdown ( pubsub ) ,
@@ -270,17 +271,18 @@ export const make = Effect.gen(function* () {
270271 const detailedSubscribers = new Map < string , number > ( ) ;
271272 const branches = new Map <
272273 string ,
273- { readonly refName : string | null ; readonly revision : number }
274+ { readonly refName : string | null ; readonly isRepo : boolean ; readonly revision : number }
274275 > ( ) ;
275276 let branchRevision = 0 ;
276277 const publishBranch = Effect . fn ( "VcsStatusBroadcaster.publishBranch" ) ( function * (
277278 cwd : string ,
278- refName : string | null ,
279+ { refName, isRepo } : { readonly refName : string | null ; readonly isRepo : boolean } ,
279280 ) {
280- if ( branches . get ( cwd ) ?. refName === refName ) return ;
281+ const previous = branches . get ( cwd ) ;
282+ if ( previous ?. refName === refName && previous . isRepo === isRepo ) return ;
281283 const revision = ++ branchRevision ;
282- branches . set ( cwd , { refName, revision } ) ;
283- yield * PubSub . publish ( branchChangesPubSub , { cwd, refName, revision } ) ;
284+ branches . set ( cwd , { refName, isRepo , revision } ) ;
285+ yield * PubSub . publish ( branchChangesPubSub , { cwd, refName, isRepo , revision } ) ;
284286 } ) ;
285287 const localRefreshLocks = yield * KeyedLock . make < string > ( ) ;
286288 const cacheRef = yield * Ref . make ( new Map < string , CachedVcsStatus > ( ) ) ;
@@ -309,7 +311,7 @@ export const make = Effect.gen(function* () {
309311 new Map ( cache ) . set ( cwd , { local : nextLocal , remote } ) ,
310312 ] as const ;
311313 } ) ;
312- yield * publishBranch ( cwd , local . refName ) ;
314+ yield * publishBranch ( cwd , local ) ;
313315 if ( options ?. publish && remoteCleared ) {
314316 yield * PubSub . publish ( changesPubSub , {
315317 cwd,
@@ -801,9 +803,15 @@ export const make = Effect.gen(function* () {
801803 Effect . gen ( function * ( ) {
802804 if ( detailedSubscribers . has ( cwd ) ) {
803805 const local = yield * getOrLoadLocalStatusUnlocked ( cwd ) ;
804- return { refName : local . refName , revision : branches . get ( cwd ) ?. revision ?? 0 } ;
806+ return {
807+ refName : local . refName ,
808+ isRepo : local . isRepo ,
809+ revision : branches . get ( cwd ) ?. revision ?? 0 ,
810+ } ;
805811 }
806812 const refName = yield * workflow . currentBranch ( cwd ) ;
813+ // A null branch is either a detached HEAD or a checkout that is no longer a repository.
814+ const isRepo = refName !== null || ( yield * workflow . repositoryRoot ( cwd ) ) !== null ;
807815 // HEAD cannot certify working-tree totals, even when it has not moved.
808816 localRefreshResults . delete ( cwd ) ;
809817 yield * workflow . invalidateLocalStatus ( cwd ) ;
@@ -814,21 +822,25 @@ export const make = Effect.gen(function* () {
814822 if ( detailedSubscribers . has ( cwd ) ) {
815823 const local = yield * workflow . localStatus ( { cwd } ) ;
816824 yield * updateCachedLocalStatus ( cwd , local , { publish : true } ) ;
817- return { refName : local . refName , revision : branches . get ( cwd ) ?. revision ?? 0 } ;
825+ return {
826+ refName : local . refName ,
827+ isRepo : local . isRepo ,
828+ revision : branches . get ( cwd ) ?. revision ?? 0 ,
829+ } ;
818830 }
819- yield * publishBranch ( cwd , refName ) ;
820- return { refName, revision : branches . get ( cwd ) ?. revision ?? 0 } ;
831+ yield * publishBranch ( cwd , { refName, isRepo } ) ;
832+ return { refName, isRepo , revision : branches . get ( cwd ) ?. revision ?? 0 } ;
821833 } ) ,
822834 ) ,
823835 ) ;
824836
825837 const refreshBranchStatus : VcsStatusBroadcaster [ "Service" ] [ "refreshBranchStatus" ] = Effect . fn (
826838 "VcsStatusBroadcaster.refreshBranchStatus" ,
827839 ) ( function * ( input ) {
828- const { refName } = yield * refreshBranchStatusCore (
840+ const { refName, isRepo } = yield * refreshBranchStatusCore (
829841 yield * withFileSystem ( normalizeCwd ( input . cwd ) ) ,
830842 ) ;
831- return { refName } ;
843+ return { refName, isRepo } ;
832844 } ) ;
833845
834846 const streamBranchStatus : VcsStatusBroadcaster [ "Service" ] [ "streamBranchStatus" ] = ( input ) =>
@@ -838,12 +850,16 @@ export const make = Effect.gen(function* () {
838850 const subscription = yield * PubSub . subscribe ( branchChangesPubSub ) ;
839851 const branch = yield * refreshBranchStatusCore ( cwd ) ;
840852 return Stream . concat (
841- Stream . make ( { refName : branch . refName } ) ,
853+ Stream . make ( { refName : branch . refName , isRepo : branch . isRepo } ) ,
842854 Stream . fromSubscription ( subscription ) . pipe (
843855 Stream . filter ( ( event ) => event . cwd === cwd && event . revision > branch . revision ) ,
844- Stream . map ( ( { refName } ) => ( { refName } ) ) ,
856+ Stream . map ( ( { refName, isRepo } ) => ( { refName, isRepo } ) ) ,
845857 ) ,
846- ) . pipe ( Stream . changesWith ( ( left , right ) => left . refName === right . refName ) ) ;
858+ ) . pipe (
859+ Stream . changesWith (
860+ ( left , right ) => left . refName === right . refName && left . isRepo === right . isRepo ,
861+ ) ,
862+ ) ;
847863 } ) ,
848864 ) ;
849865
0 commit comments