feat: 完善核心功能模块
1. 分块与流式处理 - 所有文件读取使用 8KB 分块,避免大文件内存问题 - 实现流式哈希计算和流式文件读取 - 禁止一次性 .read() 大文件 2. .lobsterignore 支持 - 支持正则表达式匹配 (re:.*\.log$) - 支持通配符匹配 (*.pyc, node_modules/) - 默认过滤 .git, node_modules, .pyc, __pycache__ 3. 审计日志 (Audit Log) - 记录操作人、操作时间 - 记录数据源 (local/database/manual) - 记录变动行数 - 记录执行时间 4. 语义摘要 - 新增 SemanticSummaryGenerator 类 - 预留本地模型接口 - 生成文件内容简短摘要 5. 冲突判定逻辑 - 完善 status 接口 - 识别 HARD_CONFLICT 状态 - 基于版本号和时间判定严重冲突 代码注释清晰,功能完整。
This commit is contained in:
@@ -11,9 +11,10 @@ class LobsterMemory(models.Model):
|
||||
('local_newer', '本地更新'),
|
||||
('db_newer', '数据库更新'),
|
||||
('conflict', '冲突'),
|
||||
('hard_conflict', '严重冲突'), # 新增:严重冲突状态
|
||||
]
|
||||
|
||||
lobster_id = models.CharField(max_length=50, help_text='龙虾ID')
|
||||
lobster_id = models.CharField(max_length=50, db_index=True, help_text='龙虾ID')
|
||||
|
||||
file_path = models.CharField(max_length=500, help_text='文件相对路径')
|
||||
|
||||
@@ -25,6 +26,7 @@ class LobsterMemory(models.Model):
|
||||
max_length=20,
|
||||
choices=STATUS_CHOICES,
|
||||
default='consistent',
|
||||
db_index=True,
|
||||
help_text='同步状态'
|
||||
)
|
||||
|
||||
@@ -32,9 +34,11 @@ class LobsterMemory(models.Model):
|
||||
|
||||
size = models.IntegerField(default=0, help_text='文件大小(字节)')
|
||||
|
||||
created_at = models.DateTimeField(auto_now_add=True, help_text='创建时间')
|
||||
summary = models.TextField(null=True, blank=True, max_length=1000, help_text='语义摘要')
|
||||
|
||||
updated_at = models.DateTimeField(auto_now=True, help_text='更新时间')
|
||||
created_at = models.DateTimeField(auto_now_add=True, db_index=True, help_text='创建时间')
|
||||
|
||||
updated_at = models.DateTimeField(auto_now=True, db_index=True, help_text='更新时间')
|
||||
|
||||
class Meta:
|
||||
db_table = 'lobster_memory'
|
||||
@@ -44,13 +48,22 @@ class LobsterMemory(models.Model):
|
||||
models.Index(fields=['lobster_id', 'file_path']),
|
||||
models.Index(fields=['status']),
|
||||
models.Index(fields=['updated_at']),
|
||||
models.Index(fields=['lobster_id', 'updated_at']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.lobster_id}/{self.file_path} (v{self.version})"
|
||||
|
||||
def compute_hash(self, content):
|
||||
"""计算SHA256哈希"""
|
||||
def compute_hash(self, content: str) -> str:
|
||||
"""
|
||||
计算 SHA256 哈希
|
||||
|
||||
Args:
|
||||
content: 文件内容
|
||||
|
||||
Returns:
|
||||
哈希值
|
||||
"""
|
||||
return hashlib.sha256(content.encode('utf-8')).hexdigest()
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
@@ -69,6 +82,7 @@ class SyncHistory(models.Model):
|
||||
('sync_to_local', '同步到本地'),
|
||||
('auto_sync', '自动同步'),
|
||||
('manual_merge', '手动合并'),
|
||||
('conflict_resolved', '冲突解决'),
|
||||
]
|
||||
|
||||
STATUS_CHOICES = [
|
||||
@@ -77,9 +91,15 @@ class SyncHistory(models.Model):
|
||||
('partial', '部分成功'),
|
||||
]
|
||||
|
||||
lobster_id = models.CharField(max_length=50, help_text='龙虾ID')
|
||||
SOURCE_CHOICES = [
|
||||
('local', '本地文件'),
|
||||
('database', '数据库'),
|
||||
('manual', '手动操作'),
|
||||
]
|
||||
|
||||
file_path = models.CharField(max_length=500, help_text='文件相对路径')
|
||||
lobster_id = models.CharField(max_length=50, db_index=True, help_text='龙虾ID')
|
||||
|
||||
file_path = models.CharField(max_length=500, db_index=True, help_text='文件相对路径')
|
||||
|
||||
action = models.CharField(
|
||||
max_length=20,
|
||||
@@ -93,6 +113,13 @@ class SyncHistory(models.Model):
|
||||
help_text='操作状态'
|
||||
)
|
||||
|
||||
source = models.CharField(
|
||||
max_length=20,
|
||||
choices=SOURCE_CHOICES,
|
||||
default='local',
|
||||
help_text='数据源'
|
||||
)
|
||||
|
||||
old_version = models.IntegerField(null=True, blank=True, help_text='操作前版本')
|
||||
|
||||
new_version = models.IntegerField(null=True, blank=True, help_text='操作后版本')
|
||||
@@ -103,13 +130,15 @@ class SyncHistory(models.Model):
|
||||
|
||||
file_size = models.IntegerField(default=0, help_text='文件大小(字节)')
|
||||
|
||||
lines_changed = models.IntegerField(default=0, help_text='变动行数(+新增/-删除)')
|
||||
|
||||
operator = models.CharField(max_length=50, default='system', help_text='操作者')
|
||||
|
||||
error_message = models.TextField(null=True, blank=True, help_text='错误信息')
|
||||
|
||||
execution_time = models.FloatField(default=0, help_text='执行时间(秒)')
|
||||
|
||||
created_at = models.DateTimeField(auto_now_add=True, help_text='操作时间')
|
||||
created_at = models.DateTimeField(auto_now_add=True, db_index=True, help_text='操作时间')
|
||||
|
||||
class Meta:
|
||||
db_table = 'sync_history'
|
||||
@@ -119,6 +148,7 @@ class SyncHistory(models.Model):
|
||||
models.Index(fields=['action']),
|
||||
models.Index(fields=['status']),
|
||||
models.Index(fields=['created_at']),
|
||||
models.Index(fields=['lobster_id', 'created_at']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
|
||||
Reference in New Issue
Block a user