@@ -96,28 +96,6 @@ func parsePRURL(prURL string) (owner, repo string, prNumber int, err error) {
9696 return parser .ParsePRURL (prURL )
9797}
9898
99- // getCurrentRepo gets the current repository information using gh CLI
100- func getCurrentRepo () (owner , repo string , err error ) {
101- cmd := exec .Command ("gh" , "repo" , "view" , "--json" , "owner,name" )
102- output , err := cmd .Output ()
103- if err != nil {
104- return "" , "" , fmt .Errorf ("failed to get current repository info: %w" , err )
105- }
106-
107- var repoInfo struct {
108- Owner struct {
109- Login string `json:"login"`
110- } `json:"owner"`
111- Name string `json:"name"`
112- }
113-
114- if err := json .Unmarshal (output , & repoInfo ); err != nil {
115- return "" , "" , fmt .Errorf ("failed to parse repository info: %w" , err )
116- }
117-
118- return repoInfo .Owner .Login , repoInfo .Name , nil
119- }
120-
12199// checkRepositoryAccess checks if the current user has write access to the target repository
122100func checkRepositoryAccess (owner , repo string ) (bool , error ) {
123101 // Get current user
@@ -593,10 +571,14 @@ func transferPR(prURL, targetRepo string, verbose bool) error {
593571 targetOwner , targetRepoName = parts [0 ], parts [1 ]
594572 } else {
595573 // Use current repository as target
596- targetOwner , targetRepoName , err = getCurrentRepo ()
574+ slug , err := GetCurrentRepoSlug ()
597575 if err != nil {
598576 return fmt .Errorf ("failed to determine target repository: %w" , err )
599577 }
578+ targetOwner , targetRepoName , err = SplitRepoSlug (slug )
579+ if err != nil {
580+ return fmt .Errorf ("failed to parse target repository: %w" , err )
581+ }
600582 }
601583
602584 if verbose {
@@ -615,12 +597,39 @@ func transferPR(prURL, targetRepo string, verbose bool) error {
615597 if targetRepo != "" {
616598 // Check if we're already in the target repository
617599 if isGitRepo () {
618- currentOwner , currentRepoName , err := getCurrentRepo ()
619- if err == nil && currentOwner == targetOwner && currentRepoName == targetRepoName {
620- // We're already in the target repo
621- workingDir = "."
600+ slug , err := GetCurrentRepoSlug ()
601+ if err == nil {
602+ currentOwner , currentRepoName , err := SplitRepoSlug (slug )
603+ if err == nil && currentOwner == targetOwner && currentRepoName == targetRepoName {
604+ // We're already in the target repo
605+ workingDir = "."
606+ } else {
607+ // We need to clone the target repository
608+ if verbose {
609+ fmt .Fprintln (os .Stderr , console .FormatInfoMessage (fmt .Sprintf ("Cloning target repository %s/%s..." , targetOwner , targetRepoName )))
610+ }
611+ tempDir , err := os .MkdirTemp ("" , "gh-aw-pr-transfer-repo-" )
612+ if err != nil {
613+ return fmt .Errorf ("failed to create temp directory for repo: %w" , err )
614+ }
615+
616+ cloneCmd := exec .Command ("gh" , "repo" , "clone" , fmt .Sprintf ("%s/%s" , targetOwner , targetRepoName ), tempDir )
617+ if err := cloneCmd .Run (); err != nil {
618+ os .RemoveAll (tempDir )
619+ return fmt .Errorf ("failed to clone target repository: %w" , err )
620+ }
621+
622+ workingDir = tempDir
623+ needsCleanup = true
624+
625+ // Change to the cloned repository directory
626+ if err := os .Chdir (tempDir ); err != nil {
627+ os .RemoveAll (tempDir )
628+ return fmt .Errorf ("failed to change to cloned repository directory: %w" , err )
629+ }
630+ }
622631 } else {
623- // We need to clone the target repository
632+ // Error getting current repo, clone anyway
624633 if verbose {
625634 fmt .Fprintln (os .Stderr , console .FormatInfoMessage (fmt .Sprintf ("Cloning target repository %s/%s..." , targetOwner , targetRepoName )))
626635 }
0 commit comments