( client: GitClient, args: string[], input: GitCliInput, )
| 1439 | // --------------------------------------------------------------- |
| 1440 | |
| 1441 | async function runPush( |
| 1442 | client: GitClient, |
| 1443 | args: string[], |
| 1444 | input: GitCliInput, |
| 1445 | ): Promise<GitCliResult> { |
| 1446 | // `git push [<remote>] [<ref>] [--force] [--delete]` |
| 1447 | const parsed = parseFlags(args, { |
| 1448 | force: { kind: "bool", alias: ["f"] }, |
| 1449 | delete: { kind: "bool", alias: ["d"] }, |
| 1450 | }); |
| 1451 | if ("error" in parsed) { |
| 1452 | return { stdout: "", stderr: `git push: ${parsed.error}\n`, exitCode: 129 }; |
| 1453 | } |
| 1454 | if (parsed.positional.length > 2) { |
| 1455 | return { |
| 1456 | stdout: "", |
| 1457 | stderr: `git push: unexpected argument '${parsed.positional[2]}'\n`, |
| 1458 | exitCode: 129, |
| 1459 | }; |
| 1460 | } |
| 1461 | const [first, second] = parsed.positional; |
| 1462 | const looksLikeUrl = first !== undefined && /^[a-z][a-z0-9+.-]*:\/\//.test(first); |
| 1463 | const url = looksLikeUrl ? first : undefined; |
| 1464 | const remote = looksLikeUrl ? undefined : first; |
| 1465 | const refspec = parsePushRefspec(looksLikeUrl ? second : (second ?? undefined)); |
| 1466 | |
| 1467 | if (url !== undefined && !isSupportedRemoteUrl(url)) { |
| 1468 | return { |
| 1469 | stdout: "", |
| 1470 | stderr: `git push: unsupported transport for '${url}'. Only https://, http://, and file:// are supported.\n`, |
| 1471 | exitCode: 1, |
| 1472 | }; |
| 1473 | } |
| 1474 | |
| 1475 | const dir = resolveDir(undefined, input.cwd); |
| 1476 | try { |
| 1477 | const result = await client.push({ |
| 1478 | dir, |
| 1479 | url, |
| 1480 | remote, |
| 1481 | ref: refspec.ref, |
| 1482 | remoteRef: refspec.remoteRef, |
| 1483 | force: parsed.flags.force === true, |
| 1484 | delete: parsed.flags.delete === true, |
| 1485 | }); |
| 1486 | if (!result.ok) { |
| 1487 | const err = result.error ?? "push rejected"; |
| 1488 | return { stdout: "", stderr: `git push: ${err}\n`, exitCode: 1 }; |
| 1489 | } |
| 1490 | return { stdout: "", stderr: "", exitCode: 0 }; |
| 1491 | } catch (cause) { |
| 1492 | return mapGitError("push", cause); |
| 1493 | } |
| 1494 | } |
| 1495 | |
| 1496 | function parsePushRefspec(ref: string | undefined): { ref?: string; remoteRef?: string } { |
| 1497 | if (ref === undefined) return {}; |
no test coverage detected