110 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			110 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|  | import {IGitCommandManager} from './git-command-manager' | ||
|  | 
 | ||
|  | export interface ICheckoutInfo { | ||
|  |   ref: string | ||
|  |   startPoint: string | ||
|  | } | ||
|  | 
 | ||
|  | export async function getCheckoutInfo( | ||
|  |   git: IGitCommandManager, | ||
|  |   ref: string, | ||
|  |   commit: string | ||
|  | ): Promise<ICheckoutInfo> { | ||
|  |   if (!git) { | ||
|  |     throw new Error('Arg git cannot be empty') | ||
|  |   } | ||
|  | 
 | ||
|  |   if (!ref && !commit) { | ||
|  |     throw new Error('Args ref and commit cannot both be empty') | ||
|  |   } | ||
|  | 
 | ||
|  |   const result = ({} as unknown) as ICheckoutInfo | ||
|  |   const upperRef = (ref || '').toUpperCase() | ||
|  | 
 | ||
|  |   // SHA only
 | ||
|  |   if (!ref) { | ||
|  |     result.ref = commit | ||
|  |   } | ||
|  |   // refs/heads/
 | ||
|  |   else if (upperRef.startsWith('REFS/HEADS/')) { | ||
|  |     const branch = ref.substring('refs/heads/'.length) | ||
|  |     result.ref = branch | ||
|  |     result.startPoint = `refs/remotes/origin/${branch}` | ||
|  |   } | ||
|  |   // refs/pull/
 | ||
|  |   else if (upperRef.startsWith('REFS/PULL/')) { | ||
|  |     const branch = ref.substring('refs/pull/'.length) | ||
|  |     result.ref = `refs/remotes/pull/${branch}` | ||
|  |   } | ||
|  |   // refs/tags/
 | ||
|  |   else if (upperRef.startsWith('REFS/')) { | ||
|  |     result.ref = ref | ||
|  |   } | ||
|  |   // Unqualified ref, check for a matching branch or tag
 | ||
|  |   else { | ||
|  |     if (await git.branchExists(true, `origin/${ref}`)) { | ||
|  |       result.ref = ref | ||
|  |       result.startPoint = `refs/remotes/origin/${ref}` | ||
|  |     } else if (await git.tagExists(`${ref}`)) { | ||
|  |       result.ref = `refs/tags/${ref}` | ||
|  |     } else { | ||
|  |       throw new Error( | ||
|  |         `A branch or tag with the name '${ref}' could not be found` | ||
|  |       ) | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   return result | ||
|  | } | ||
|  | 
 | ||
|  | export function getRefSpec(ref: string, commit: string): string[] { | ||
|  |   if (!ref && !commit) { | ||
|  |     throw new Error('Args ref and commit cannot both be empty') | ||
|  |   } | ||
|  | 
 | ||
|  |   const upperRef = (ref || '').toUpperCase() | ||
|  | 
 | ||
|  |   // SHA
 | ||
|  |   if (commit) { | ||
|  |     // refs/heads
 | ||
|  |     if (upperRef.startsWith('REFS/HEADS/')) { | ||
|  |       const branch = ref.substring('refs/heads/'.length) | ||
|  |       return [`+${commit}:refs/remotes/origin/${branch}`] | ||
|  |     } | ||
|  |     // refs/pull/
 | ||
|  |     else if (upperRef.startsWith('REFS/PULL/')) { | ||
|  |       const branch = ref.substring('refs/pull/'.length) | ||
|  |       return [`+${commit}:refs/remotes/pull/${branch}`] | ||
|  |     } | ||
|  |     // refs/tags/
 | ||
|  |     else if (upperRef.startsWith('REFS/TAGS/')) { | ||
|  |       return [`+${commit}:${ref}`] | ||
|  |     } | ||
|  |     // Otherwise no destination ref
 | ||
|  |     else { | ||
|  |       return [commit] | ||
|  |     } | ||
|  |   } | ||
|  |   // Unqualified ref, check for a matching branch or tag
 | ||
|  |   else if (!upperRef.startsWith('REFS/')) { | ||
|  |     return [ | ||
|  |       `+refs/heads/${ref}*:refs/remotes/origin/${ref}*`, | ||
|  |       `+refs/tags/${ref}*:refs/tags/${ref}*` | ||
|  |     ] | ||
|  |   } | ||
|  |   // refs/heads/
 | ||
|  |   else if (upperRef.startsWith('REFS/HEADS/')) { | ||
|  |     const branch = ref.substring('refs/heads/'.length) | ||
|  |     return [`+${ref}:refs/remotes/origin/${branch}`] | ||
|  |   } | ||
|  |   // refs/pull/
 | ||
|  |   else if (upperRef.startsWith('REFS/PULL/')) { | ||
|  |     const branch = ref.substring('refs/pull/'.length) | ||
|  |     return [`+${ref}:refs/remotes/pull/${branch}`] | ||
|  |   } | ||
|  |   // refs/tags/
 | ||
|  |   else { | ||
|  |     return [`+${ref}:${ref}`] | ||
|  |   } | ||
|  | } |