Make bisect playable and validate commit_in_future using Git author timestamps
This commit is contained in:
@@ -8,7 +8,7 @@ val RepoStateSaver = listSaver<RepoState, Any>(
|
||||
state.initialized,
|
||||
state.headBranch,
|
||||
state.files.flatMap { listOf(it.name, it.content, it.staged.toString(), it.tracked.toString(), it.deleted.toString()) },
|
||||
state.commits.flatMap { listOf(it.id, it.message) },
|
||||
state.commits.flatMap { listOf(it.id, it.message, it.authorTimestampSeconds?.toString().orEmpty()) },
|
||||
state.branches.flatMap { listOf(it.key, it.value.toString()) },
|
||||
state.currentDir,
|
||||
state.tags,
|
||||
@@ -53,9 +53,7 @@ val RepoStateSaver = listSaver<RepoState, Any>(
|
||||
deleted = (it.getOrNull(4) as? String)?.toBoolean() ?: false,
|
||||
)
|
||||
},
|
||||
commits = commitParts.chunked(2).map {
|
||||
CommitNode(it[0] as String, it[1] as String)
|
||||
},
|
||||
commits = commitParts.restoreCommitNodes(),
|
||||
branches = branchParts.chunked(2).associate { (it[0] as String) to (it[1] as String).toInt() },
|
||||
currentDir = saved[5] as String,
|
||||
tags = tags.filterIsInstance<String>(),
|
||||
@@ -77,3 +75,21 @@ val RepoStateSaver = listSaver<RepoState, Any>(
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
private fun List<*>.restoreCommitNodes(): List<CommitNode> {
|
||||
val hasTimestampColumn = size % 3 == 0 && chunked(3).all { chunk ->
|
||||
val timestamp = chunk.getOrNull(2) as? String
|
||||
timestamp.isNullOrEmpty() || timestamp.toLongOrNull()?.let { it >= 100_000_000L } == true
|
||||
}
|
||||
val width = if (hasTimestampColumn) 3 else 2
|
||||
|
||||
return chunked(width).mapNotNull { chunk ->
|
||||
val id = chunk.getOrNull(0) as? String ?: return@mapNotNull null
|
||||
val message = chunk.getOrNull(1) as? String ?: ""
|
||||
CommitNode(
|
||||
id = id,
|
||||
message = message,
|
||||
authorTimestampSeconds = if (hasTimestampColumn) (chunk.getOrNull(2) as? String)?.toLongOrNull() else null,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user