Просмотр исходного кода

Merge pull request #893 from RooVetGit/cte/safer-git-config

Don't clobber existing user.name and user.email git config values
Matt Rubens 10 месяцев назад
Родитель
Сommit
ec527f79e6

+ 11 - 2
src/services/checkpoints/CheckpointService.ts

@@ -284,8 +284,17 @@ export class CheckpointService {
 			log(`[initRepo] Initialized new Git repository at ${baseDir}`)
 		}
 
-		await git.addConfig("user.name", "Roo Code")
-		await git.addConfig("user.email", "[email protected]")
+		// Only set user config if not already configured
+		const userName = await git.getConfig("user.name")
+		const userEmail = await git.getConfig("user.email")
+
+		if (!userName.value) {
+			await git.addConfig("user.name", "Roo Code")
+		}
+
+		if (!userEmail.value) {
+			await git.addConfig("user.email", "[email protected]")
+		}
 
 		if (!isExistingRepo) {
 			// We need at least one file to commit, otherwise the initial

+ 44 - 10
src/services/checkpoints/__tests__/CheckpointService.test.ts

@@ -10,32 +10,51 @@ import { CheckpointService } from "../CheckpointService"
 
 describe("CheckpointService", () => {
 	const taskId = "test-task"
+
 	let git: SimpleGit
 	let testFile: string
 	let service: CheckpointService
 
-	beforeEach(async () => {
+	const initRepo = async ({
+		baseDir,
+		userName = "Roo Code",
+		userEmail = "[email protected]",
+		testFileName = "test.txt",
+		textFileContent = "Hello, world!",
+	}: {
+		baseDir: string
+		userName?: string
+		userEmail?: string
+		testFileName?: string
+		textFileContent?: string
+	}) => {
 		// Create a temporary directory for testing.
-		const baseDir = path.join(os.tmpdir(), `checkpoint-service-test-${Date.now()}`)
 		await fs.mkdir(baseDir)
 
 		// Initialize git repo.
-		git = simpleGit(baseDir)
+		const git = simpleGit(baseDir)
 		await git.init()
-		await git.addConfig("user.name", "Roo Code")
-		await git.addConfig("user.email", "[email protected]")
+		await git.addConfig("user.name", userName)
+		await git.addConfig("user.email", userEmail)
 
 		// Create test file.
-		testFile = path.join(baseDir, "test.txt")
-		await fs.writeFile(testFile, "Hello, world!")
+		const testFile = path.join(baseDir, testFileName)
+		await fs.writeFile(testFile, textFileContent)
 
 		// Create initial commit.
 		await git.add(".")
 		await git.commit("Initial commit")!
 
-		// Create service instance.
-		const log = () => {}
-		service = await CheckpointService.create({ taskId, git, baseDir, log })
+		return { git, testFile }
+	}
+
+	beforeEach(async () => {
+		const baseDir = path.join(os.tmpdir(), `checkpoint-service-test-${Date.now()}`)
+		const repo = await initRepo({ baseDir })
+
+		git = repo.git
+		testFile = repo.testFile
+		service = await CheckpointService.create({ taskId, git, baseDir, log: () => {} })
 	})
 
 	afterEach(async () => {
@@ -333,5 +352,20 @@ describe("CheckpointService", () => {
 
 			await fs.rm(newService.baseDir, { recursive: true, force: true })
 		})
+
+		it("respects existing git user configuration", async () => {
+			const baseDir = path.join(os.tmpdir(), `checkpoint-service-test-config2-${Date.now()}`)
+			const userName = "Custom User"
+			const userEmail = "[email protected]"
+			const repo = await initRepo({ baseDir, userName, userEmail })
+			const newGit = repo.git
+
+			await CheckpointService.create({ taskId, git: newGit, baseDir, log: () => {} })
+
+			expect((await newGit.getConfig("user.name")).value).toBe(userName)
+			expect((await newGit.getConfig("user.email")).value).toBe(userEmail)
+
+			await fs.rm(baseDir, { recursive: true, force: true })
+		})
 	})
 })