IDEA-131688 Settings repository plugin: more descriptive commit message

This commit is contained in:
Vladimir Krivosheev
2015-07-24 13:30:12 +02:00
parent 1008831a93
commit 7bc3dd406e
7 changed files with 64 additions and 59 deletions
@@ -262,7 +262,7 @@ class IcsApplicationLoadListener : ApplicationLoadListener {
}
val repositoryManager = icsManager.repositoryManager
if (repositoryManager.isRepositoryExists()) {
if (repositoryManager.isRepositoryExists() && repositoryManager is GitRepositoryManager) {
repositoryManager.renameDirectory(linkedMapOf(
Pair("\$ROOT_CONFIG$", null),
Pair("_mac/\$ROOT_CONFIG$", "_mac"),
@@ -57,11 +57,6 @@ public interface RepositoryManager {
public fun canCommit(): Boolean
/**
* Think twice before use
*/
public fun renameDirectory(pairs: Map<String, String?>)
public interface Updater {
fun merge(): UpdateResult?
@@ -0,0 +1,47 @@
package org.jetbrains.settingsRepository.git
import com.intellij.openapi.application.ex.ApplicationInfoEx
import org.eclipse.jgit.lib.Ref
import org.eclipse.jgit.merge.MergeMessageFormatter
import java.net.InetAddress
public interface CommitMessageFormatter {
public fun message(text: String): String = text
public fun prependMessage(builder: StringBuilder = StringBuilder()): StringBuilder = builder
public fun mergeMessage(refsToMerge: List<Ref>, target: Ref): String = MergeMessageFormatter().format(refsToMerge, target)
}
class IdeaCommitMessageFormatter : CommitMessageFormatter {
override fun message(text: String) = StringBuilder().appendCommitOwnerInfo().append(text).toString()
override fun prependMessage(builder: StringBuilder) = builder.appendCommitOwnerInfo()
override fun mergeMessage(refsToMerge: List<Ref>, target: Ref) = StringBuilder().appendCommitOwnerInfo().append(super.mergeMessage(refsToMerge, target)).toString()
fun StringBuilder.appendCommitOwnerInfo(): StringBuilder {
appendAppName()
append(' ').append('<').append(System.getProperty("user.name", "unknown-user")).append('@').append(InetAddress.getLocalHost().getHostName())
append(' ')
return this
}
fun StringBuilder.appendAppName() {
val appInfo = ApplicationInfoEx.getInstanceEx()
if (appInfo != null) {
val build = appInfo.getBuild()
append(build.getProductCode()).append('-')
if (appInfo.getMajorVersion() != null && !appInfo.isEAP()) {
append(appInfo.getFullVersion())
}
else {
var buildString = build.asStringWithoutProductCode()
if (build.getBuildNumber() == Integer.MAX_VALUE) {
buildString = buildString.replace(".SNAPSHOT", "")
}
append(buildString)
}
}
}
}
@@ -16,7 +16,6 @@
package org.jetbrains.settingsRepository.git
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.ex.ApplicationInfoEx
import com.intellij.openapi.progress.EmptyProgressIndicator
import com.intellij.openapi.progress.ProgressIndicator
import com.intellij.openapi.util.NotNullLazyValue
@@ -43,7 +42,6 @@ import org.jetbrains.settingsRepository.RepositoryManager.Updater
import org.jetbrains.settingsRepository.RepositoryService
import java.io.File
import java.io.IOException
import java.net.InetAddress
import kotlin.concurrent.write
import kotlin.properties.Delegates
@@ -195,7 +193,7 @@ class GitRepositoryManager(private val credentialsStore: NotNullLazyValue<Creden
override fun canCommit() = repository.getRepositoryState().canCommit()
override fun renameDirectory(pairs: Map<String, String?>) {
fun renameDirectory(pairs: Map<String, String?>) {
val addCommand = AddCommand(repository)
val toDelete = SmartList<DeleteDirectory>()
var added = false
@@ -245,13 +243,7 @@ class GitRepositoryManager(private val credentialsStore: NotNullLazyValue<Creden
return
}
val builder = StringBuilder()
builder.append(ApplicationInfoEx.getInstanceEx()!!.getFullApplicationName())
builder.append(' ').append('<').append(System.getProperty("user.name", "unknown-user")).append('@').append(InetAddress.getLocalHost().getHostName())
builder.append(' ')
builder.append("Get rid of \$ROOT_CONFIG$")
repository.commit(builder.toString())
repository.commit(IdeaCommitMessageFormatter().prependMessage().append("Get rid of \$ROOT_CONFIG$").toString())
}
}
@@ -1,6 +1,5 @@
package org.jetbrains.settingsRepository.git
import com.intellij.openapi.application.ex.ApplicationInfoEx
import com.intellij.openapi.progress.ProgressIndicator
import com.intellij.util.PathUtilRt
import com.intellij.util.SmartList
@@ -11,9 +10,8 @@ import org.jetbrains.jgit.dirCache.PathEdit
import org.jetbrains.jgit.dirCache.edit
import org.jetbrains.settingsRepository.LOG
import org.jetbrains.settingsRepository.PROJECTS_DIR_NAME
import java.net.InetAddress
fun commit(manager: GitRepositoryManager, indicator: ProgressIndicator?): Boolean {
fun commit(manager: GitRepositoryManager, indicator: ProgressIndicator?, commitMessageFormatter: CommitMessageFormatter = IdeaCommitMessageFormatter()): Boolean {
indicator?.checkCanceled()
val diff = manager.repository.computeIndexDiff()
@@ -47,9 +45,7 @@ fun commit(manager: GitRepositoryManager, indicator: ProgressIndicator?): Boolea
indicator?.checkCanceled()
val builder = StringBuilder()
builder.append(ApplicationInfoEx.getInstanceEx()!!.getFullApplicationName())
builder.append(' ' ).append('<').append(System.getProperty("user.name", "unknown-user")).append('@').append(InetAddress.getLocalHost().getHostName())
builder.append(' ')
commitMessageFormatter.prependMessage(builder)
// we use Github (edit via web UI) terms here
builder.appendCompactList("Update", diff.getChanged())
+11 -36
View File
@@ -25,7 +25,7 @@ import java.io.IOException
import java.text.MessageFormat
import java.util.ArrayList
open class Pull(val manager: GitRepositoryManager, val indicator: ProgressIndicator) {
open class Pull(val manager: GitRepositoryManager, val indicator: ProgressIndicator, val commitMessageFormatter: CommitMessageFormatter = IdeaCommitMessageFormatter()) {
val repository = manager.repository
// we must use the same StoredConfig instance during the operation
@@ -176,7 +176,6 @@ open class Pull(val manager: GitRepositoryManager, val indicator: ProgressIndica
throw NoHeadException(JGitText.get().commitOnRepoWithoutHEADCurrentlyNotSupported)
}
return MergeResultEx(srcCommit, MergeStatus.FAST_FORWARD, arrayOf<ObjectId?>(null, srcCommit), ImmutableUpdateResult(dirCacheCheckout.getUpdated().keySet(), dirCacheCheckout.getRemoved()))
//return MergeResult(srcCommit, srcCommit, array(null, srcCommit), MergeStatus.FAST_FORWARD, mergeStrategy, null)
}
val refLogMessage = StringBuilder("merge ")
@@ -193,13 +192,9 @@ open class Pull(val manager: GitRepositoryManager, val indicator: ProgressIndica
dirCacheCheckout = DirCacheCheckout(repository, headCommit.getTree(), repository.lockDirCache(), srcCommit.getTree())
dirCacheCheckout.setFailOnConflict(true)
dirCacheCheckout.checkout()
// var msg: String? = null
val newHead: ObjectId
// val base: ObjectId
val mergeStatus: MergeStatus
if (squash) {
// msg = JGitText.get().squashCommitNotUpdatingHEAD
// base = headId
newHead = headId
mergeStatus = MergeStatus.FAST_FORWARD_SQUASHED
val squashedCommits = RevWalkUtils.find(revWalk, srcCommit, headCommit)
@@ -207,17 +202,14 @@ open class Pull(val manager: GitRepositoryManager, val indicator: ProgressIndica
}
else {
updateHead(refLogMessage, srcCommit, headId, repository)
// base = srcCommit
newHead = srcCommit
mergeStatus = MergeStatus.FAST_FORWARD
}
return MergeResultEx(newHead, mergeStatus, arrayOf<ObjectId?>(headCommit, srcCommit), ImmutableUpdateResult(dirCacheCheckout.getUpdated().keySet(), dirCacheCheckout.getRemoved()))
//return MergeResult(newHead, base, array(headCommit, srcCommit), mergeStatus, mergeStrategy, null, msg)
}
else {
if (fastForwardMode == FastForwardMode.FF_ONLY) {
return MergeResultEx(headCommit, MergeStatus.ABORTED, arrayOf<ObjectId?>(headCommit, srcCommit), EMPTY_UPDATE_RESULT)
// return MergeResult(headCommit, srcCommit, array(headCommit, srcCommit), MergeStatus.ABORTED, mergeStrategy, null)
}
val mergeMessage: String
@@ -226,7 +218,7 @@ open class Pull(val manager: GitRepositoryManager, val indicator: ProgressIndica
repository.writeSquashCommitMsg(SquashMessageFormatter().format(RevWalkUtils.find(revWalk, srcCommit, headCommit), head))
}
else {
mergeMessage = MergeMessageFormatter().format(listOf(ref), head)
mergeMessage = commitMessageFormatter.mergeMessage(listOf(ref), head)
repository.writeMergeCommitMsg(mergeMessage)
repository.writeMergeHeads(arrayListOf(ref.getObjectId()))
}
@@ -247,19 +239,10 @@ open class Pull(val manager: GitRepositoryManager, val indicator: ProgressIndica
noProblems = merger.merge(headCommit, srcCommit)
}
refLogMessage.append(": Merge made by ")
if (revWalk.isMergedInto(headCommit, srcCommit)) {
refLogMessage.append("recursive")
}
else {
refLogMessage.append(mergeStrategy.getName())
}
refLogMessage.append(if (revWalk.isMergedInto(headCommit, srcCommit)) "recursive" else mergeStrategy.getName())
refLogMessage.append('.')
var result: ImmutableUpdateResult? = null
if (merger is ResolveMerger) {
result = ImmutableUpdateResult(merger.getToBeCheckedOut().keySet(), merger.getToBeDeleted())
}
var result = if (merger is ResolveMerger) ImmutableUpdateResult(merger.getToBeCheckedOut().keySet(), merger.getToBeDeleted()) else null
if (noProblems) {
// ResolveMerger does checkout
if (merger !is ResolveMerger) {
@@ -269,7 +252,6 @@ open class Pull(val manager: GitRepositoryManager, val indicator: ProgressIndica
result = ImmutableUpdateResult(dirCacheCheckout.getUpdated().keySet(), dirCacheCheckout.getRemoved())
}
// var msg: String? = null
var newHeadId: ObjectId? = null
var mergeStatus: MergeResult.MergeStatus? = null
if (!commit && squash) {
@@ -283,26 +265,19 @@ open class Pull(val manager: GitRepositoryManager, val indicator: ProgressIndica
mergeStatus = MergeResult.MergeStatus.MERGED
}
if (commit && squash) {
// msg = JGitText.get().squashCommitNotUpdatingHEAD
newHeadId = headCommit.getId()
mergeStatus = MergeResult.MergeStatus.MERGED_SQUASHED
}
return MergeResultEx(newHeadId, mergeStatus!!, arrayOf(headCommit.getId(), srcCommit.getId()), result!!)
// return MergeResult(newHeadId, null, array(headCommit.getId(), srcCommit.getId()), mergeStatus, mergeStrategy, null, msg)
}
else if (failingPaths == null) {
repository.writeMergeCommitMsg(MergeMessageFormatter().formatWithConflicts(mergeMessage, unmergedPaths))
return MergeResultEx(null, MergeResult.MergeStatus.CONFLICTING, arrayOf(headCommit.getId(), srcCommit.getId()), result!!, lowLevelResults)
}
else {
if (failingPaths == null) {
val mergeMessageWithConflicts = MergeMessageFormatter().formatWithConflicts(mergeMessage, unmergedPaths)
repository.writeMergeCommitMsg(mergeMessageWithConflicts)
return MergeResultEx(null, MergeResult.MergeStatus.CONFLICTING, arrayOf(headCommit.getId(), srcCommit.getId()), result!!, lowLevelResults)
//return MergeResult(null, merger.getBaseCommitId(), array(headCommit.getId(), srcCommit.getId()), MergeResult.MergeStatus.CONFLICTING, mergeStrategy, lowLevelResults)
}
else {
repository.writeMergeCommitMsg(null)
repository.writeMergeHeads(null)
return MergeResultEx(null, MergeResult.MergeStatus.FAILED, arrayOf(headCommit.getId(), srcCommit.getId()), result!!, lowLevelResults)
//return MergeResult(null, merger.getBaseCommitId(), array(headCommit.getId(), srcCommit.getId()), MergeResult.MergeStatus.FAILED, mergeStrategy, lowLevelResults, failingPaths, null)
}
repository.writeMergeCommitMsg(null)
repository.writeMergeHeads(null)
return MergeResultEx(null, MergeResult.MergeStatus.FAILED, arrayOf(headCommit.getId(), srcCommit.getId()), result!!, lowLevelResults)
}
}
}
+1 -1
View File
@@ -18,7 +18,7 @@ class Reset(manager: GitRepositoryManager, indicator: ProgressIndicator) : Pull(
indicator.checkCanceled()
val commitMessage = "Reset to ${if (toTheirs) manager.getUpstream() else "my"}"
val commitMessage = commitMessageFormatter.message(if (toTheirs) "Overwrite local to ${manager.getUpstream()}" else "Overwrite remote ${manager.getUpstream()} to local")
// grab added/deleted/renamed/modified files
val mergeStrategy = if (toTheirs) MergeStrategy.THEIRS else MergeStrategy.OURS
val firstMergeResult = pull(mergeStrategy, commitMessage)