Spaces:
Running
Running
const { execSync, exec } = require('child_process'); | |
const fs = require('fs'); | |
const path = require('path'); | |
const cron = require('node-cron'); | |
const WATCH_DIR = path.join(__dirname, 'notes'); | |
function gitPull() { | |
try { | |
console.log('Đang thực hiện git pull...'); | |
execSync('git pull', { cwd: WATCH_DIR, stdio: 'inherit' }); | |
console.log('Git pull hoàn tất.'); | |
} catch (error) { | |
console.error('Lỗi khi thực hiện git pull:', error.message); | |
// Có thể xử lý lỗi ở đây, ví dụ: cố gắng merge hoặc reset | |
} | |
} | |
function gitStatusHasChanges(callback) { | |
exec('git status --porcelain', { cwd: WATCH_DIR }, (err, stdout, stderr) => { | |
if (err) { | |
console.error('Lỗi khi chạy git status:', err); | |
callback(false); | |
return; | |
} | |
callback(stdout.trim().length > 0); | |
}); | |
} | |
function gitCommitAndPush(callback) { | |
const now = new Date(); | |
const timeString = now.toISOString(); | |
exec('git add .', { cwd: WATCH_DIR }, (err, stdout, stderr) => { | |
if (err) { | |
console.error('Lỗi khi chạy git add:', err); | |
callback(false); | |
return; | |
} | |
exec(`git commit -m "Database Sync - ${timeString}"`, { cwd: WATCH_DIR }, (err2, stdout2, stderr2) => { | |
if (err2) { | |
if (stderr2.includes('nothing to commit')) { | |
console.log('Không có thay đổi để commit.'); | |
callback(true); // Coi như thành công vì không có gì để commit | |
} else { | |
console.error('Lỗi khi chạy git commit:', err2); | |
callback(false); | |
} | |
return; | |
} | |
exec('git push', { cwd: WATCH_DIR }, (err3, stdout3, stderr3) => { | |
if (err3) { | |
console.error('Lỗi khi chạy git push:', err3); | |
callback(false); | |
return; | |
} | |
console.log('Thay đổi đã được đẩy thành công vào lúc', timeString); | |
callback(true); | |
}); | |
}); | |
}); | |
} | |
function initialSync() { | |
console.log('Đang thực hiện đồng bộ hóa ban đầu...'); | |
gitStatusHasChanges((hasChanges) => { | |
if (hasChanges) { | |
console.log('Phát hiện thay đổi cục bộ, đang commit và đẩy...'); | |
gitCommitAndPush((success) => { | |
if (success) { | |
gitPull(); | |
} else { | |
console.error('Không thể đẩy thay đổi cục bộ. Bỏ qua git pull.'); | |
} | |
}); | |
} else { | |
console.log('Không có thay đổi cục bộ. Đang thực hiện git pull.'); | |
gitPull(); | |
} | |
}); | |
} | |
function startWatching() { | |
console.log(`Bắt đầu theo dõi thư mục: ${WATCH_DIR}`); | |
// Lên lịch chạy mỗi phút | |
cron.schedule('* * * * *', () => { | |
gitStatusHasChanges((hasChanges) => { | |
if (hasChanges) { | |
console.log('Phát hiện thay đổi, đang commit và đẩy...'); | |
gitCommitAndPush((success) => { | |
if (success) { | |
gitPull(); | |
} | |
}); | |
} else { | |
console.log('Không phát hiện thay đổi.'); | |
gitPull(); // Vẫn pull định kỳ để đảm bảo cập nhật từ xa | |
} | |
}); | |
}); | |
} | |
// Thực hiện đồng bộ hóa ban đầu một lần khi script khởi động | |
initialSync(); | |
// Sau đó bắt đầu theo dõi định kỳ | |
startWatching(); | |