89 lines · 2.3 KB · TypeScript
RawDownload
// Clone a local repository while its feature branch is the source HEAD. import { createRequire } from "node:module";import { dirname, resolve } from "node:path";import { AgentOs } from "@rivet-dev/agentos-core";import git from "@agentos-software/git"; type ExecResult = {	stdout: string;	stderr: string;	exitCode: number;}; const require = createRequire(import.meta.url);const MODULE_ACCESS_CWD = resolve(	dirname(require.resolve("@rivet-dev/agentos-core")),	"..",);const GIT_QUICKSTART_PERMISSIONS = {	fs: "allow",	childProcess: "allow",	env: "allow",} as const; function parseCurrentBranch(output: string): string {	const branch = output		.split("\n")		.map((line) => line.trim())		.find((line) => line.startsWith("* "))		?.slice(2)		.trim(); 	if (!branch) {		throw new Error(`could not determine current branch from:\n${output}`);	} 	return branch;} function parseHeadRef(content: string): string {	const branch = content.trim().match(/^ref: refs\/heads\/(.+)$/)?.[1];	if (!branch) {		throw new Error(`could not determine HEAD ref from:\n${content}`);	}	return branch;} const vm = await AgentOs.create({	permissions: GIT_QUICKSTART_PERMISSIONS,	software: [git],}); async function run(command: string): Promise<ExecResult> {	const result = await vm.exec(command);	if (result.exitCode !== 0) {		throw new Error(			`command failed: ${command}\n${result.stderr || result.stdout}`,		);	}	return result;} await run("git init /tmp/origin");await vm.writeFile("/tmp/origin/README.md", "# demo repo\n");await run("git -C /tmp/origin add README.md");await run("git -C /tmp/origin commit -m 'initial commit'"); const defaultBranch = parseCurrentBranch(	(await run("git -C /tmp/origin branch")).stdout,); await run("git -C /tmp/origin checkout -b feature");await vm.writeFile("/tmp/origin/feature.txt", "checked out from feature\n");await run("git -C /tmp/origin add feature.txt");await run("git -C /tmp/origin commit -m 'add feature file'"); await run("git clone /tmp/origin /tmp/clone");console.log("origin default branch:", defaultBranch);console.log(	"clone HEAD:",	parseHeadRef(		new TextDecoder().decode(await vm.readFile("/tmp/clone/.git/HEAD")),	),); const featureFile = await vm.readFile("/tmp/clone/feature.txt");console.log("feature.txt:", new TextDecoder().decode(featureFile).trim()); process.exit(0);

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t