(refs #445)Keep line separator in online file editing

This commit is contained in:
Naoki Takezoe
2014-07-26 23:15:47 +09:00
parent 0822b7b5f3
commit 34e299bf52
4 changed files with 37 additions and 11 deletions

View File

@@ -15,7 +15,7 @@ import org.eclipse.jgit.treewalk._
import java.util.zip.{ZipEntry, ZipOutputStream} import java.util.zip.{ZipEntry, ZipOutputStream}
import jp.sf.amateras.scalatra.forms._ import jp.sf.amateras.scalatra.forms._
import org.eclipse.jgit.dircache.DirCache import org.eclipse.jgit.dircache.DirCache
import org.eclipse.jgit.revwalk.{RevCommit, RevWalk} import org.eclipse.jgit.revwalk.RevCommit
import service.WebHookService.WebHookPayload import service.WebHookService.WebHookPayload
class RepositoryViewerController extends RepositoryViewerControllerBase class RepositoryViewerController extends RepositoryViewerControllerBase
@@ -35,6 +35,7 @@ trait RepositoryViewerControllerBase extends ControllerBase {
content: String, content: String,
message: Option[String], message: Option[String],
charset: String, charset: String,
lineSeparator: String,
newFileName: String, newFileName: String,
oldFileName: Option[String] oldFileName: Option[String]
) )
@@ -47,13 +48,14 @@ trait RepositoryViewerControllerBase extends ControllerBase {
) )
val editorForm = mapping( val editorForm = mapping(
"branch" -> trim(label("Branch", text(required))), "branch" -> trim(label("Branch", text(required))),
"path" -> trim(label("Path", text())), "path" -> trim(label("Path", text())),
"content" -> trim(label("Content", text(required))), "content" -> trim(label("Content", text(required))),
"message" -> trim(label("Message", optional(text()))), "message" -> trim(label("Message", optional(text()))),
"charset" -> trim(label("Charset", text(required))), "charset" -> trim(label("Charset", text(required))),
"newFileName" -> trim(label("Filename", text(required))), "lineSeparator" -> trim(label("Line Separator", text(required))),
"oldFileName" -> trim(label("Old filename", optional(text()))) "newFileName" -> trim(label("Filename", text(required))),
"oldFileName" -> trim(label("Old filename", optional(text())))
)(EditorForm.apply) )(EditorForm.apply)
val deleteForm = mapping( val deleteForm = mapping(
@@ -145,7 +147,8 @@ trait RepositoryViewerControllerBase extends ControllerBase {
}) })
post("/:owner/:repository/create", editorForm)(collaboratorsOnly { (form, repository) => post("/:owner/:repository/create", editorForm)(collaboratorsOnly { (form, repository) =>
commitFile(repository, form.branch, form.path, Some(form.newFileName), None, form.content, form.charset, commitFile(repository, form.branch, form.path, Some(form.newFileName), None,
StringUtil.convertLineSeparator(form.content, form.lineSeparator), form.charset,
form.message.getOrElse(s"Create ${form.newFileName}")) form.message.getOrElse(s"Create ${form.newFileName}"))
redirect(s"/${repository.owner}/${repository.name}/blob/${form.branch}/${ redirect(s"/${repository.owner}/${repository.name}/blob/${form.branch}/${
@@ -154,7 +157,8 @@ trait RepositoryViewerControllerBase extends ControllerBase {
}) })
post("/:owner/:repository/update", editorForm)(collaboratorsOnly { (form, repository) => post("/:owner/:repository/update", editorForm)(collaboratorsOnly { (form, repository) =>
commitFile(repository, form.branch, form.path, Some(form.newFileName), form.oldFileName, form.content, form.charset, commitFile(repository, form.branch, form.path, Some(form.newFileName), form.oldFileName,
StringUtil.convertLineSeparator(form.content, form.lineSeparator), form.charset,
if(form.oldFileName.exists(_ == form.newFileName)){ if(form.oldFileName.exists(_ == form.newFileName)){
form.message.getOrElse(s"Update ${form.newFileName}") form.message.getOrElse(s"Update ${form.newFileName}")
} else { } else {

View File

@@ -98,7 +98,12 @@ object JGitUtil {
* @param content the string content * @param content the string content
* @param charset the character encoding * @param charset the character encoding
*/ */
case class ContentInfo(viewType: String, content: Option[String], charset: Option[String]) case class ContentInfo(viewType: String, content: Option[String], charset: Option[String]){
/**
* the line separator of this content ("LF" or "CRLF")
*/
val lineSeparator: String = if(content.exists(_.indexOf("¥r¥n") >= 0)) "CRLF" else "LF"
}
/** /**
* The tag data. * The tag data.

View File

@@ -46,6 +46,22 @@ object StringUtil {
} }
} }
/**
* Converts line separator in the given content.
*
* @param content the content
* @param lineSeparator "LF" or "CRLF"
* @return the converted content
*/
def convertLineSeparator(content: String, lineSeparator: String): String = {
val lf = content.replaceAll("¥r¥n", "¥n").replaceAll("¥r", "¥n")
if(lineSeparator == "CRLF"){
lf.replaceAll("¥n", "¥r¥n")
} else {
lf
}
}
/** /**
* Extract issue id like ```#issueId``` from the given message. * Extract issue id like ```#issueId``` from the given message.
* *

View File

@@ -60,6 +60,7 @@
} }
<input type="submit" id="commit" class="btn btn-success" value="Commit changes" disabled="true"/> <input type="submit" id="commit" class="btn btn-success" value="Commit changes" disabled="true"/>
<input type="hidden" id="charset" name="charset" value="@content.charset"/> <input type="hidden" id="charset" name="charset" value="@content.charset"/>
<input type="hidden" id="lineSeparator" name="lineSeparator" value="@content.lineSeparator"/>
<input type="hidden" id="content" name="content" value=""/> <input type="hidden" id="content" name="content" value=""/>
<input type="hidden" id="initial" value="@content.content"/> <input type="hidden" id="initial" value="@content.content"/>
</div> </div>