Skip to content

Commit

Permalink
online-commit: Fix for Windows OS
Browse files Browse the repository at this point in the history
This commit resolves problems with online commits
in Windows OS.

Currently affected features are
online README create/edit and
online ISSUE_TEMPLATE create/edit.

See: Yona Github issue #132 #67
  • Loading branch information
doortts committed Feb 15, 2017
1 parent 450de17 commit a1ed849
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 45 deletions.
9 changes: 6 additions & 3 deletions app/controllers/BoardApp.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import models.enumeration.ResourceType;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.jgit.lib.ObjectId;
import play.api.data.validation.ValidationError;
import play.data.Form;
import play.db.ebean.Transactional;
Expand Down Expand Up @@ -237,7 +238,8 @@ public static Result newPost(String userName, String projectName) {
private static void commitReadmeFile(Project project, Posting post){
BareCommit bare = new BareCommit(project, UserApp.currentUser());
try{
bare.commitTextFile("README.md", post.body, post.title);
ObjectId objectId = bare.commitTextFile("README.md", post.body, post.title);
play.Logger.debug("Online Commit: README " + project.name + ":" + objectId);
} catch (IOException e) {
e.printStackTrace();
play.Logger.error(e.getMessage());
Expand All @@ -247,7 +249,8 @@ private static void commitReadmeFile(Project project, Posting post){
private static void commitIssueTemplateFile(Project project, Posting post){
BareCommit bare = new BareCommit(project, UserApp.currentUser());
try{
bare.commitTextFile("ISSUE_TEMPLATE.md", post.body, post.title);
ObjectId objectId = bare.commitTextFile("ISSUE_TEMPLATE.md", post.body, post.title);
play.Logger.debug("Online Commit: ISSUE_TEMPLATE " + project.name + ":" + objectId);
} catch (IOException e) {
e.printStackTrace();
play.Logger.error(e.getMessage());
Expand All @@ -260,7 +263,7 @@ public static Result post(String userName, String projectName, Long number) {
Posting post = Posting.findByNumber(project, number);

if(post.readme && RepositoryService.VCS_GIT.equals(project.vcs)){
post.body = BareRepository.readREADME(project);
post.body = StringUtils.defaultString(BareRepository.readREADME(project));
}

if (request().getHeader("Accept").contains("application/json")) {
Expand Down
50 changes: 8 additions & 42 deletions app/playRepository/BareCommit.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,6 @@

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.channels.OverlappingFileLockException;

import static org.eclipse.jgit.lib.Constants.HEAD;
Expand Down Expand Up @@ -79,19 +76,18 @@ public ObjectId commitTextFile(
setRefName(HEAD);
}

RefHeadFileLock refHeadFileLock = new RefHeadFileLock().invoke(this.refName);
ObjectId commitId = null;
try {
this.objectInserter = this.repository.newObjectInserter();
contents = addEOL(changeLineEnding(contents, findFileLineEnding(repository, fileNameWithPath)));
setHeadObjectId(this.refName);
commitId = createCommitWithNewTree(createGitObjectWithText(contents));
refUpdate(commitId, refName);
RefUpdate.Result result = refUpdate(commitId, refName);
} catch (OverlappingFileLockException e) {
play.Logger.error("Overlapping File Lock Error: " + e.getMessage());
} finally {
objectInserter.close();
repository.close();
refHeadFileLock.release();
}

return commitId;
Expand Down Expand Up @@ -180,16 +176,19 @@ private ObjectId createGitObjectWithText(String contents) throws IOException {
return objectInserter.insert(OBJ_BLOB, bytes, 0, bytes.length);
}

private void refUpdate(ObjectId commitId, String refName) throws IOException {
private RefUpdate.Result refUpdate(ObjectId commitId, String refName) throws IOException {
RefUpdate ru = this.repository.updateRef(refName);
ru.setForceUpdate(false);
ru.setRefLogIdent(getPersonIdent());
ru.setNewObjectId(commitId);
if(hasOldCommit(refName)){
ru.setExpectedOldObjectId(getCurrentMomentHeadObjectId());
}
ru.setRefLogMessage(getCommitMessage(), false);
ru.update();
ru.setRefLogMessage(getCommitMessage(), true);

RefUpdate.Result result = ru.update();
play.Logger.debug("Online commit: HEAD[" + this.headObjectId + "]:" + result + " New:" + commitId);
return result;
}

private boolean hasOldCommit(String refName) throws IOException {
Expand Down Expand Up @@ -233,37 +232,4 @@ public ObjectId getCurrentMomentHeadObjectId() throws IOException {
public void setRefName(String refName){
this.refName = refName;
}

private class RefHeadFileLock {
private FileChannel channel;
private FileLock lock;
private File refHeadFile;

public RefHeadFileLock invoke(String refName) throws IOException {
if (!repository.getDirectory().exists()) {
throw new IllegalStateException("The repository seems not to be created");
}

refHeadFile = new File(repository.getDirectory().getPath(),
repository.findRef(refName).getLeaf().getName());
if(refHeadFile.exists()){
channel = new RandomAccessFile(refHeadFile, "rw").getChannel();
lock = channel.lock();
}
setHeadObjectId(refName);
return this;
}

public void release() {
try {
if(refHeadFile.exists()) {
if(lock != null) lock.release();
if(channel != null) channel.close();
}
} catch (IOException e) {
e.printStackTrace();
play.Logger.error(e.getMessage());
}
}
}
}

0 comments on commit a1ed849

Please sign in to comment.