@@ -442,6 +442,69 @@ it.layer(TestLayer)("GitVcsDriver core integration", (it) => {
442442 } ) ;
443443
444444 describe ( "remote operations" , ( ) => {
445+ it . effect ( "creates a worktree from the latest fetched remote commit" , ( ) =>
446+ Effect . gen ( function * ( ) {
447+ const cwd = yield * makeTmpDir ( ) ;
448+ const remote = yield * makeTmpDir ( "git-remote-" ) ;
449+ const peer = yield * makeTmpDir ( "git-peer-" ) ;
450+ const { initialBranch } = yield * initRepoWithCommit ( cwd ) ;
451+ yield * git ( remote , [ "init" , "--bare" ] ) ;
452+ yield * git ( cwd , [ "remote" , "add" , "origin" , remote ] ) ;
453+ yield * git ( cwd , [ "push" , "-u" , "origin" , initialBranch ] ) ;
454+ yield * git ( remote , [ "symbolic-ref" , "HEAD" , `refs/heads/${ initialBranch } ` ] ) ;
455+ const beforeFetch = yield * git ( cwd , [ "rev-parse" , `refs/remotes/origin/${ initialBranch } ` ] ) ;
456+
457+ yield * git ( peer , [ "clone" , remote , "." ] ) ;
458+ yield * git ( peer , [ "config" , "user.email" , "test@test.com" ] ) ;
459+ yield * git ( peer , [ "config" , "user.name" , "Test" ] ) ;
460+ yield * writeTextFile ( peer , "remote-change.txt" , "remote\n" ) ;
461+ yield * git ( peer , [ "add" , "remote-change.txt" ] ) ;
462+ yield * git ( peer , [ "commit" , "-m" , "remote change" ] ) ;
463+ yield * git ( peer , [ "push" , "origin" , initialBranch ] ) ;
464+ const remoteHead = yield * git ( peer , [ "rev-parse" , "HEAD" ] ) ;
465+ assert . notEqual ( beforeFetch , remoteHead ) ;
466+
467+ const driver = yield * GitVcsDriver . GitVcsDriver ;
468+ yield * driver . fetchRemote ( { cwd, remoteName : "origin" } ) ;
469+
470+ const resolvedBase = yield * driver . resolveRemoteTrackingCommit ( {
471+ cwd,
472+ refName : initialBranch ,
473+ fallbackRemoteName : "origin" ,
474+ } ) ;
475+ const explicitlyResolvedBase = yield * driver . resolveRemoteTrackingCommit ( {
476+ cwd,
477+ refName : `origin/${ initialBranch } ` ,
478+ fallbackRemoteName : "origin" ,
479+ } ) ;
480+
481+ assert . deepEqual ( resolvedBase , {
482+ commitSha : remoteHead ,
483+ remoteRefName : `origin/${ initialBranch } ` ,
484+ } ) ;
485+ assert . deepEqual ( explicitlyResolvedBase , resolvedBase ) ;
486+ assert . equal ( yield * git ( cwd , [ "rev-parse" , initialBranch ] ) , beforeFetch ) ;
487+
488+ const pathService = yield * Path . Path ;
489+ const worktreePath = pathService . join (
490+ yield * makeTmpDir ( "git-fetched-worktrees-" ) ,
491+ "fetched-origin" ,
492+ ) ;
493+ yield * driver . createWorktree ( {
494+ cwd,
495+ path : worktreePath ,
496+ refName : resolvedBase . commitSha ,
497+ newRefName : "t3code/fetched-origin" ,
498+ } ) ;
499+
500+ assert . equal ( yield * git ( worktreePath , [ "rev-parse" , "HEAD" ] ) , remoteHead ) ;
501+ assert . equal (
502+ yield * driver . readConfigValue ( worktreePath , "branch.t3code/fetched-origin.remote" ) ,
503+ null ,
504+ ) ;
505+ } ) ,
506+ ) ;
507+
445508 it . effect ( "pushes with upstream setup and skips when already up to date" , ( ) =>
446509 Effect . gen ( function * ( ) {
447510 const cwd = yield * makeTmpDir ( ) ;
0 commit comments