diff options
Diffstat (limited to 'src/ref-helper.ts')
| -rw-r--r-- | src/ref-helper.ts | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/src/ref-helper.ts b/src/ref-helper.ts new file mode 100644 index 0000000..ff256af --- /dev/null +++ b/src/ref-helper.ts @@ -0,0 +1,109 @@ +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}`] + } +} |
