diff --git a/src/main/resources/update/1_2.sql b/src/main/resources/update/1_2.sql index 373596e..d2765bc 100644 --- a/src/main/resources/update/1_2.sql +++ b/src/main/resources/update/1_2.sql @@ -9,6 +9,16 @@ ACTIVITY_DATE TIMESTAMP NOT NULL ); +CREATE TABLE COMMIT_LOG ( + USER_NAME VARCHAR(100) NOT NULL, + REPOSITORY_NAME VARCHAR(100) NOT NULL, + COMMIT_ID VARCHAR(40) NOT NULL +); + ALTER TABLE ACTIVITY ADD CONSTRAINT IDX_ACTIVITY_PK PRIMARY KEY (ACTIVITY_ID); ALTER TABLE ACTIVITY ADD CONSTRAINT IDX_ACTIVITY_FK0 FOREIGN KEY (USER_NAME, REPOSITORY_NAME) REFERENCES REPOSITORY (USER_NAME, REPOSITORY_NAME); ALTER TABLE ACTIVITY ADD CONSTRAINT IDX_ACTIVITY_FK1 FOREIGN KEY (ACTIVITY_USER_NAME) REFERENCES ACCOUNT (USER_NAME); + +ALTER TABLE COMMIT_LOG ADD CONSTRAINT IDX_COMMIT_LOG_PK PRIMARY KEY (USER_NAME, REPOSITORY_NAME, COMMIT_ID); +ALTER TABLE COMMIT_LOG ADD CONSTRAINT IDX_COMMIT_LOG_FK0 FOREIGN KEY (USER_NAME, REPOSITORY_NAME) REFERENCES REPOSITORY (USER_NAME, REPOSITORY_NAME); + diff --git a/src/main/scala/model/Activity.scala b/src/main/scala/model/Activity.scala index ba42bb6..ffba3d2 100644 --- a/src/main/scala/model/Activity.scala +++ b/src/main/scala/model/Activity.scala @@ -13,6 +13,12 @@ def autoInc = userName ~ repositoryName ~ activityUserName ~ activityType ~ message ~ additionalInfo.? ~ activityDate returning activityId } +object CommitLog extends Table[(String, String, String)]("COMMIT_LOG") with BasicTemplate { + def commitId = column[String]("COMMIT_ID") + def * = userName ~ repositoryName ~ commitId + def byPrimaryKey(userName: String, repositoryName: String, commitId: String) = byRepository(userName, repositoryName) && (this.commitId is commitId.bind) +} + case class Activity( activityId: Int, userName: String, diff --git a/src/main/scala/service/ActivityService.scala b/src/main/scala/service/ActivityService.scala index f225482..7fc64b5 100644 --- a/src/main/scala/service/ActivityService.scala +++ b/src/main/scala/service/ActivityService.scala @@ -87,14 +87,20 @@ None, currentDate) - def recordCreateBranchActivity(userName: String, repositoryName: String, activityUserName: String, - branchName: String, commits: List[util.JGitUtil.CommitInfo]) = + def recordCreateBranchActivity(userName: String, repositoryName: String, activityUserName: String, branchName: String) = Activities.autoInc insert(userName, repositoryName, activityUserName, "create_tag", s"[user:${activityUserName}] created branch [tag:${userName}/${repositoryName}#${branchName}] at [repo:${userName}/${repositoryName}]", None, currentDate) + def insertCommitId(userName: String, repositoryName: String, commitId: String) = { + CommitLog insert (userName, repositoryName, commitId) + } + + def existsCommitId(userName: String, repositoryName: String, commitId: String): Boolean = + Query(CommitLog).filter(_.byPrimaryKey(userName, repositoryName, commitId)).firstOption.isDefined + private def cut(value: String, length: Int): String = if(value.length > length) value.substring(0, length) + "..." else value } diff --git a/src/main/scala/servlet/GitRepositoryServlet.scala b/src/main/scala/servlet/GitRepositoryServlet.scala index 61e6106..811c27b 100644 --- a/src/main/scala/servlet/GitRepositoryServlet.scala +++ b/src/main/scala/servlet/GitRepositoryServlet.scala @@ -76,37 +76,37 @@ JGitUtil.withGit(Directory.getRepositoryDir(owner, repository)) { git => commands.asScala.foreach { command => val commits = JGitUtil.getCommitLog(git, command.getOldId.name, command.getNewId.name) - .filter(commit => JGitUtil.getBranchesOfCommit(git, commit.id).length == 1) val refName = command.getRefName.split("/") - println("****************************") - println(command.getRefName) - println(command.getMessage) - println(command.getResult) - println(command.getType) - println("****************************") - // apply issue comment - if(refName(1) == "heads"){ - commits.foreach { commit => + val newCommits = commits.flatMap { commit => + if(!existsCommitId(owner, repository, commit.id)){ + insertCommitId(owner, repository, commit.id) "(^|\\W)#(\\d+)(\\W|$)".r.findAllIn(commit.fullMessage).matchData.foreach { matchData => val issueId = matchData.group(2) if(getAccountByUserName(commit.committer).isDefined && getIssue(owner, repository, issueId).isDefined){ createComment(owner, repository, commit.committer, issueId.toInt, commit.fullMessage, None) } } - } - } - - git.getRepository.getAllRefs.asScala.map { e => - println(e._1) - } + Some(commit) + } else None + }.toList // record activity if(refName(1) == "heads"){ - recordPushActivity(owner, repository, userName, refName(2), commits) + command.getType match { + case ReceiveCommand.Type.CREATE => { + recordCreateBranchActivity(owner, repository, userName, refName(2)) + recordPushActivity(owner, repository, userName, refName(2), newCommits) + } + case ReceiveCommand.Type.UPDATE => recordPushActivity(owner, repository, userName, refName(2), newCommits) + case _ => + } } else if(refName(1) == "tags"){ - recordCreateTagActivity(owner, repository, userName, refName(2), commits) + command.getType match { + case ReceiveCommand.Type.CREATE => recordCreateTagActivity(owner, repository, userName, refName(2), newCommits) + case _ => + } } } } diff --git a/src/main/twirl/account/activity.scala.html b/src/main/twirl/account/activity.scala.html index e5008c8..4c41c2e 100644 --- a/src/main/twirl/account/activity.scala.html +++ b/src/main/twirl/account/activity.scala.html @@ -20,18 +20,18 @@ } else { @activities.map { activity =>