Yi EungJun 2014-07-07
Sync 'next' with v0.5.6
Reviewed-by: Suwon Chae 
@f1fd23605669fee35ca74cb55f4574172966661f
README.md
--- README.md
+++ README.md
@@ -2,31 +2,35 @@
 [[한국어]](#korean)
 Yobi
 =======
-[![Build Status](https://travis-ci.org/nforge/yobi.png?branch=master)](https://travis-ci.org/nforge/yobi)
+[![Build Status](https://travis-ci.org/naver/yobi.png?branch=master)](https://travis-ci.org/naver/yobi)
 
-
-Yobi, collaborative SW development platform.<br/>
+Yobi is a web-based project hosting software.
 
 
 What is Yobi?
 --
 
-Yobi, a brand new version of nFORGE, is a web-based collaborative platform for software development.
-Yobi offers many features to increase productivity and quality of your software: a issue tracker to manage bugs and issue, a wiki style board to share documents, a configuration management tool to control software version and so on.
+Yobi is a web-based project hosting software.
+To increase productivity and quality of your software Yobi offers many features including
+
+- Issue tracker to manage bugs and issues
+- Bulletin board to share documents
+- Git/SVN support embedded
+- Pull-request for collaborative coding
 
 License
 --
-Copyright 2014 NAVER Corp, under the Apache 2.0 license.
+Copyright 2014 NAVER Corp. under the Apache License, Version 2.0
 
-## Installation
+## How to install
 
-### check java version
+### Check java version
 
     java -version
 
-Required minimum java version is 7(1.7)
+Java version 7(1.7) or above is required.
 
-### download playframework
+### Download playframework
 
     curl -O http://downloads.typesafe.com/play/2.1.0/play-2.1.0.zip
 
@@ -38,30 +42,36 @@
 
     http://downloads.typesafe.com/play/2.1.0/play-2.1.0.zip
 
-### unzip
+### Unzip
 
     unzip play-2.1.0.zip
 
-### cd to unzipped directory
+### Change directory to unzipped directory
 
     cd play-2.1.0
 
-### download yobi
+### Download Yobi
 
-    git clone https://github.com/nforge/yobi.git -b maint yobi
+Case1. using [git client](http://git-scm.com/) (recommended)
+    
+    git clone https://github.com/naver/yobi.git
 
-**You can change branch to master or an other branch. But never install master or an other branch a production server.**
+or 
 
+Case2. Just download latest stable release
+If you want to download one of the stable releases, you can download a compressed file by clicking the URL below. And then name it a yobi and unzip it.
 
-You can also make your own yobi directory in any other place. But in that case, you should add playframework home path to $PATH environment.
+    https://github.com/naver/yobi/archive/master.zip
+    
+**Caution! in case2, You might come across troubles when you try to upgrade Yobi.**
 
+> You can locate your own Yobi directory in any other place. Please note that you must add playframework home path to $PATH environment in that case.
 
-### cd to cloned yobi directory
+### Change directory to cloned Yobi directory (or cd to your unzipped file directory)
 
     cd yobi
 
-
-### run play framework
+### Run play framework
 
     ../play
 
@@ -72,28 +82,48 @@
 Required files will be download automatically. In the first time, it may take about 10 min or more.
 
 
-### type start command in console
+### Type start command in console
 
     start -DapplyEvolutions.default=true -Dhttp.port=9000
 
 It will downloaded addtional files and compile sources.
 
-If you want to run yobi in development mode, use **run**. You can see more detailed errors and can use dynamic compilation.
+If you want to run Yobi in development mode, use **run**. You can see more detailed errors and can use dynamic compilation.
 
 Also, you can configure start options.
 If your system's memory is over than 4G, we recommend to use follow options.
 
-
     _JAVA_OPTIONS="-Xmx2048m -Xms1024m" play "start -DapplyEvolutions.default=true -Dhttp.port=9000"
 
-
-### connect with browser
+### Connect with browser
 
     http://127.0.0.1:9000
 
 If you want to change port, check your permission to use 80 port
 
-see [http://www.playframework.com/documentation/2.1.1/Production](http://www.playframework.com/documentation/2.1.1/Production)
+See [http://www.playframework.com/documentation/2.1.1/Production](http://www.playframework.com/documentation/2.1.1/Production)
+
+### Upgrade Yobi
+
+Case1. using git client (recommended)
+In installed directory, just type git update command.
+
+	git pull https://github.com/naver/yobi.git master
+
+Case2. download zip file
+
+In installed directory, download latest release file and unzip it.
+
+	https://github.com/naver/yobi/archive/master.zip
+
+** Be careful! Don't overwrite or delete `yobi.h2.db` file, `repo` & `uploads` directory! **
+
+### Backup
+
+Copy the below file and directories to another place.
+
+	file: yobi.h2.db
+	directory: repo, uploads
 
 <br/>
 <br/>
@@ -112,10 +142,17 @@
 
 Yobi 소개
 --
-Yobi (구 nFORGE)는 소프트웨어 개발에 필요한 기능들을 사용하기 편리하게 웹으로 묶은 협업 개발 플랫폼입니다. 버그나 이슈을 관리할 수 있는 이슈 트래커, 각종 문서와 정보를 간편하게 공유할 수 있는 게시판, 소스코드의 변경내역을 편리하게 관리할 수 있는 형상관리 툴을 비롯하여 팀 개발을 위한 다양한 기능을 포함하고 있습니다.
+Yobi (구 nFORGE)는 협업 개발을 위한 프로젝트 호스팅 SW입니다. 
+
+- 버그나 이슈을 관리할 수 있는 이슈 트래커
+- 각종 문서와 정보를 간편하게 공유할 수 있는 게시판
+- 소스코드의 변경내역을 편리하게 관리할 수 있는 형상관리 도구 git/svn 기본 내장
+- 협업개발을 위한 코드 주고받기
+
+등을 비롯하여 팀 개발을 위한 다양한 기능을 포함하고 있습니다.
 
 
-라이센스
+라이선스
 --
 Yobi는 Apache 2.0 라이선스로 제공됩니다.
 
@@ -148,13 +185,22 @@
 
     cd play-2.1.0
 
-### yobi 소스 내려 받기
+### Yobi 소스 내려 받기
 
-    git clone https://github.com/nforge/yobi.git -b maint yobi
+case1. [git 클라이언트](http://git-scm.com)를 이용한 다운로드 (추천)
+    
+    git clone https://github.com/naver/yobi.git
+    
+case2. 단순히 최신 안정버전을 내려받고자 할 때는 아래 링크를 이용해서 압축파일을 내려받은 다음 yobi를 폴더이름으로해서 해제합니다.
 
-**Production Server 에 설치하시는 경우 반드시 `maint` branch 를 사용하거나 최신 realese 버전을 사용하시기 바랍니다.**
+    https://github.com/naver/yobi/archive/master.zip
+    
+주의! case2의 경우, 업그레이드를 할 때 문제가 생길 수 있습니다.
 
-### clone 받은 yobi 디렉터리로 이동
+> 임의의 장소에 Yobi 디렉터리를 위치시킬 경우에는 play 실행파일이 있는 playframework 디렉터리를 $PATH 환경변수에 추가해 주세요.
+
+### clone 받은 Yobi 디렉터리로 이동 
+(혹은 압축을 해제한 디렉터리로 이동)
 
     cd yobi
 
@@ -178,9 +224,8 @@
 시작 옵션은 조정가능합니다. 만약 시스템 메모리가 4기가 이상이라면
 아래 옵션으로 실행하는걸 권장합니다.
 
-
     _JAVA_OPTIONS="-Xmx2048m -Xms1024m" play "start -DapplyEvolutions.default=true -Dhttp.port=9000"
-
+    
 
 ### 브라우저로 접속
 
@@ -188,3 +233,26 @@
 
 80 포트 등으로 포트를 변경하고 싶을 경우에는 해당 포트가 사용가능한지 확인 한 다음 80 포트를 사용할 수 있는 계정으로 실행합니다.
 관련해서는 [http://www.playframework.com/documentation/2.1.1/Production](http://www.playframework.com/documentation/2.1.1/Production) 부분을 확인해 주세요.
+
+### 업그레이드 하기
+
+case1. git 클라이언트를 이용 (추천)
+설치된 디렉터리에서, 아래와 같은 git 명령어를 이용합니다
+
+	git pull https://github.com/naver/yobi.git master
+
+case2. 압축파일을 내려받을 경우
+
+설치된 디렉터리에서, 최신 릴리즈의 압축파일을 내려받아 Yobi가 설치된 디렉터리에 압축파일을 풉니다.
+
+	https://github.com/naver/yobi/archive/master.zip
+
+**주의사항! `yobi.h2.db` 파일, `repo`와 `uploads` 디렉터리를 삭제하거나 덮어쓰지 않도록 주의하세요!**
+
+
+### 백업하기
+
+특별히 외부 DB를 사용하지 않는다면 아래 내용을 잘 백업해서 보관해 주시면 됩니다.
+
+	file: yobi.h2.db
+	directory: repo, uploads
app/models/CodeCommentThread.java
--- app/models/CodeCommentThread.java
+++ app/models/CodeCommentThread.java
@@ -30,6 +30,7 @@
 
 import java.io.IOException;
 import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.errors.MissingObjectException;
 import org.eclipse.jgit.lib.Repository;
 
 import static models.CodeRange.Side;
@@ -103,17 +104,22 @@
 
         Repository mergedRepository = pullRequest.getMergedRepository();
 
-        if (StringUtils.isNotEmpty(prevCommitId)) {
+        try {
+            if (StringUtils.isNotEmpty(prevCommitId)) {
+                _isOutdated = !PullRequest.noChangesBetween(mergedRepository,
+                    pullRequest.mergedCommitIdFrom, mergedRepository, prevCommitId, path);
+            }
+
+            if (_isOutdated) {
+                return _isOutdated;
+            }
+
             _isOutdated = !PullRequest.noChangesBetween(mergedRepository,
-                pullRequest.mergedCommitIdFrom, mergedRepository, prevCommitId, path);
+                pullRequest.mergedCommitIdTo, mergedRepository, commitId, path);
+        } catch (MissingObjectException e) {
+            play.Logger.warn("Possible false positive of outdated detection because of missing git object: " + e.getMessage());
+            return true;
         }
-
-        if (_isOutdated) {
-            return _isOutdated;
-        }
-
-        _isOutdated = !PullRequest.noChangesBetween(mergedRepository,
-            pullRequest.mergedCommitIdTo, mergedRepository, commitId, path);
 
         return _isOutdated;
     }
app/playRepository/RepositoryService.java
--- app/playRepository/RepositoryService.java
+++ app/playRepository/RepositoryService.java
@@ -200,13 +200,13 @@
         packetLineOut.end();
         PacketLineOutRefAdvertiser packetLineOutRefAdvertiser = new PacketLineOutRefAdvertiser(packetLineOut);
 
-        Repository repository = GitRepository.buildGitRepository(project);
-
         if (service.equals("git-upload-pack")) {
+            Repository repository = GitRepository.buildGitRepository(project);
             UploadPack uploadPack = new UploadPack(repository);
             uploadPack.setBiDirectionalPipe(false);
             uploadPack.sendAdvertisedRefs(packetLineOutRefAdvertiser);
         } else if (service.equals("git-receive-pack")) {
+            Repository repository = GitRepository.buildGitRepository(project, false);
             ReceivePack receivePack = new ReceivePack(repository);
             receivePack.sendAdvertisedRefs(packetLineOutRefAdvertiser);
         }
conf/application.conf.default
--- conf/application.conf.default
+++ conf/application.conf.default
@@ -84,7 +84,7 @@
 # application.port="8080"
 
 # Application feedback url at top layout menu. You can remove feedback menu by commenting it.
-application.feedback.url="https://github.com/nforge/yobi/issues"
+application.feedback.url="https://github.com/naver/yobi/issues"
 
 # Mailer
 # ~~~~~~
 
conf/evolutions/default/80.sql (added)
+++ conf/evolutions/default/80.sql
@@ -0,0 +1,32 @@
+# --- !Ups
+
+UPDATE user_project_notification
+SET notification_type = 'PULL_REQUEST_REVIEW_STATE_CHANGED', allowed = 'TRUE'
+WHERE notification_type IN ('PULL_REQUEST_REVIEWED', 'PULL_REQUEST_UNREVIEWED');
+
+DELETE
+FROM user_project_notification
+WHERE id NOT IN
+(
+    SELECT MIN(id)
+    FROM user_project_notification
+    GROUP BY user_id, project_id, notification_type
+);
+
+
+# --- !Downs
+
+INSERT INTO user_project_notification(id, user_id, project_id, notification_type, allowed)
+SELECT nextval('user_project_notification_seq'), user_id, project_id, 'PULL_REQUEST_REVIEWED', 'TRUE'
+FROM (SELECT user_id, project_id
+      FROM user_project_notification
+      WHERE notification_type = 'PULL_REQUEST_REVIEW_STATE_CHANGED');
+
+INSERT INTO user_project_notification(id, user_id, project_id, notification_type, allowed)
+SELECT nextval('user_project_notification_seq'), user_id, project_id, 'PULL_REQUEST_UNREVIEWED', 'TRUE'
+FROM (SELECT user_id, project_id
+      FROM user_project_notification
+      WHERE notification_type = 'PULL_REQUEST_REVIEW_STATE_CHANGED');
+
+DELETE FROM user_project_notification
+WHERE notification_type = 'PULL_REQUEST_REVIEW_STATE_CHANGED';
conf/messages
--- conf/messages
+++ conf/messages
@@ -130,6 +130,7 @@
 common.attach.pastehere = Paste the clipboard image
 common.attachment= Attachment
 common.comment = Comment
+common.comment.beforeunload.confirm =  Would you like to exit this page without submitting comment?
 common.comment.delete = Delete comment
 common.comment.delete.confirm = Once you delete this comment, you won''t be able to recover it. Are you sure you want to delete this comment?
 common.comment.edit = Edit comment
conf/messages.ja
--- conf/messages.ja
+++ conf/messages.ja
@@ -109,6 +109,7 @@
 common.attach.pastehere = . クリップボードからの画像を貼り付けることもできます。
 common.attachment= 添付ファイル
 common.comment = コメント
+common.comment.beforeunload.confirm = コメントを投稿しないままこのページから脱しますか?
 common.experimental = 実験的な機能
 common.experimental.description = それは機能の変更、開発の中断などの可能性がいつもあるという意味です。<br>温かい目で見守ってください。
 common.experimental.title = 実験的な機能:この機能は開発中です
conf/messages.ko
--- conf/messages.ko
+++ conf/messages.ko
@@ -130,6 +130,7 @@
 common.attach.pastehere = . 클립보드 이미지를 붙여 넣을 수도 있습니다
 common.attachment = 첨부파일
 common.comment = 댓글
+common.comment.beforeunload.confirm = 입력 중인 댓글이 있습니다. 저장하지 않은 채로 다른 페이지로 이동하시겠습니까?
 common.comment.delete = 댓글 삭제
 common.comment.delete.confirm = 해당 댓글이 삭제되면 영원히 복구할 수 없습니다. 그래도 삭제하시겠습니까?
 common.comment.edit = 댓글 수정
@@ -215,7 +216,7 @@
 issue.createdDate = 작성일
 issue.delete = 이슈 삭제
 issue.downloadAsExcel = 엑셀파일로 다운받기
-issue.error.beforeunload = 아직 이슈를 저장하지 않았습니다. 저장하지 않은 채로 다른 페이지로 가시겠어요?
+issue.error.beforeunload = 아직 이슈를 저장하지 않았습니다. 저장하지 않은 채로 다른 페이지로 이동하시겠습니까?
 issue.error.emptyBody = 이슈 내용을 입력해주세요
 issue.error.emptyTitle = 이슈 제목을 입력해주세요
 issue.event.assigned = {0}님이 {1}님을 이 이슈의 담당자로 지정하였습니다.
@@ -386,7 +387,7 @@
 post.comment.empty = 댓글 내용은 반드시 입력해야 합니다.
 post.createdDate = 작성일
 post.delete.confirm = 해당 게시물이 삭제되면 영원히 복구할 수 없습니다. 그래도 삭제하시겠습니까?
-post.error.beforeunload = 아직 글을 저장하지 않았습니다. 저장하지 않은 채로 다른 페이지로 가시겠어요?
+post.error.beforeunload = 아직 글을 저장하지 않았습니다. 저장하지 않은 채로 다른 페이지로 이동하시겠습니까?
 post.error.emptyBody = 글 내용을 입력해주세요
 post.error.emptyTitle = 글 제목을 입력해주세요
 post.is.empty = 등록된 게시물이 없습니다.
conf/version.conf
--- conf/version.conf
+++ conf/version.conf
@@ -1,1 +1,1 @@
-app.version="0.5.5"
+app.version="0.5.6"
 
docs/ko/relnotes/0.5.6.txt (added)
+++ docs/ko/relnotes/0.5.6.txt
@@ -0,0 +1,38 @@
+Yobi v0.5.6 릴리즈 노트
+=======================
+
+v0.5.5 이후 변경점
+------------------
+
+UI/UX
+
+* 프로젝트 멤버 추가 UI 변경
+* 프로젝트 멤버 목록에서 프로젝트 멤버 탈퇴 위치를 하단으로
+* 로그인 폼 변경 (AJAX 적용)
+* 지켜보기 버튼에서 눌림 효과 제거
+* 프로젝트나 멤버를 추가하는 폼에서 로그인 아이디를 반드시 입력하도록 요구
+* 403 Forbidden 화면을 보여줄때 로그인 버튼을 표시하도록 변경
+* 로그인 하지 않은 사용자가 댓글이나 공감 버튼을 누를때 로그인 창을 표시하도록 변경
+* 댓글 입력도중 화면이동을 하게 되면 경고 메시지를 보여줌
+
+기타
+
+* Ace 에디터 버전업 (v1.1.3)
+* 사이트 메인이 좀 더 빨라짐
+* 첨부파일 삭제가 실패하면 로그에 남기도록 변경
+* README에 설명이 추가되었습니다.
+
+v0.5.5 이후 버그수정
+--------------------
+
+* 리뷰 테이블에서 일부 컬럼이 존재하지 않아서 발생하던 SqlException 문제
+* 요청에 Accept 헤더가 없는 경우 NPE(Null Pointer Exception)가 발생하는 문제
+* 이슈 화면에서 닫기 버튼이 정상동작하지 않았던 문제
+* 억세스로그에 응답시간이 비정상적으로 기록되던 문제
+* 코드주고받기: 같은 브랜치에서 코드를 주고 받을때 잘못된 요약 메시지가 출력되던 문제
+* 코멘트 수정시 멘션 기능이 동작 하지 않던 문제
+* 코드 주고받기 수정화면에서 불필요한 도움말이 표시되던 문제
+* 코드 메뉴에서 커밋 날짜 표시가 영역을 벗어나서 줄바꿈이 일어나는 문제
+* 사용자 설정 페이지에서 IllegalArgumentException이 발생할 수 있는 문제
+* Git 저장소에 push 할 때 몇몇 object를 빠뜨릴 수 있는 문제 (08420e5에서 고쳤어야 했는데 빠뜨림)
+* 리뷰 목록을 볼 때 MissingObjectException이 발생할 수 있는 문제
 
docs/relnotes/0.5.6.txt (added)
+++ docs/relnotes/0.5.6.txt
@@ -0,0 +1,42 @@
+Yobi v0.5.6 Release Notes
+=========================
+
+Updates since v0.5.5
+--------------------
+
+UI/UX
+
+* Adding new project member works with AJAX.
+* Leave Project is on the bottom layer of Project Members.
+* Login Form works with AJAX.
+* Pressed effect is removed from Watching button.
+* The forms to add project or organization member requires loginId.
+* 403 Forbidden Error Page shows login button.
+* Show Login dialog if anonymous clicks comment or vote button.
+* Warn user of possible loss of a comment in progress by leaving the editing
+  page.
+
+Etc
+
+* Ace has been upgraded to v1.1.3.
+* Listing events in site main is faster.
+* Log if deleting of attachment is failed.
+* README describes better about Yobi.
+
+Fixes since v0.5.5
+------------------
+
+* SqlException occurred because the 'review_comment' table doesn't have columns
+  like 'commitId', 'project.id' and 'pullRequest.id'.
+* NPE may occur when `Accept` header doesn't exists.
+* On issue view, Close Button didn't work.
+* In access log, time to taken process a request was incorrect.
+* PullRequest: When the sending and receiving branch are same, the summary
+  message showed wrong messages. 'Safe to Merge' showed "Conflict" even if not
+  and 'Commits' showed -1 for 0.
+* Mention didn't work correctly for comment editing.
+* PullRequest Edit form showed unnecessary help.
+* The contents of Commit Date column in Code menu might overflow.
+* Account Setting page might throw IllegalArgumentException.
+* While git pushing, git objects might be omitted. (08420e5 has defect)
+* Review List page might throw MissingObjectException.
public/javascripts/common/yobi.CommentForm.js
--- public/javascripts/common/yobi.CommentForm.js
+++ public/javascripts/common/yobi.CommentForm.js
@@ -47,6 +47,7 @@
     function _attachEvent(){
         elements.commentForm.on("submit", onSubmitCommentForm);
         $(window).on("keydown",  onKeydownWindow);
+        $(window).on("beforeunload", onBeforeUnloadWindow);
     }
 
     /**
@@ -103,6 +104,17 @@
     }
 
     /**
+     * Handles beforeunload event of window
+     * In case of commentBody is not empty, show confirm to exit page.
+     * Browser will shows confirm dialog with returned message string.
+     */
+    function onBeforeUnloadWindow(){
+        if(!isCommentBodyEmpty() && !isOnSubmit()){
+            return Messages("common.comment.beforeunload.confirm");
+        }
+    }
+
+    /**
      * Returns whether ESC(keyCode: 27) has pressed from event
      *
      * @param weEvt
Add a comment
List