From abab3a4e2bc221eb358f846f171cb24fc0f687ad Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Wed, 03 Jul 2013 08:16:39 -0400 Subject: [PATCH] Support hot-reloading of project.mkd --- src/test/java/com/gitblit/tests/GitServletTest.java | 165 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 145 insertions(+), 20 deletions(-) diff --git a/src/test/java/com/gitblit/tests/GitServletTest.java b/src/test/java/com/gitblit/tests/GitServletTest.java index c1aaf1a..b6a58ac 100644 --- a/src/test/java/com/gitblit/tests/GitServletTest.java +++ b/src/test/java/com/gitblit/tests/GitServletTest.java @@ -16,6 +16,8 @@ import org.eclipse.jgit.api.CloneCommand; import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.MergeCommand.FastForwardMode; +import org.eclipse.jgit.api.MergeResult; import org.eclipse.jgit.api.ResetCommand.ResetType; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.lib.Constants; @@ -38,12 +40,12 @@ import com.gitblit.Constants.AuthorizationControl; import com.gitblit.GitBlit; import com.gitblit.Keys; -import com.gitblit.models.PushLogEntry; +import com.gitblit.models.RefLogEntry; import com.gitblit.models.RepositoryModel; import com.gitblit.models.UserModel; import com.gitblit.utils.ArrayUtils; import com.gitblit.utils.JGitUtils; -import com.gitblit.utils.PushLogUtils; +import com.gitblit.utils.RefLogUtils; public class GitServletTest { @@ -60,10 +62,26 @@ String password = GitBlitSuite.password; private static final AtomicBoolean started = new AtomicBoolean(false); + + private static UserModel getUser() { + UserModel user = new UserModel("james"); + user.displayName = "James Moger"; + user.emailAddress = "james.moger@gmail.com"; + user.password = "james"; + return user; + } + + private static void delete(UserModel user) { + if (GitBlit.self().getUserModel(user.username) != null) { + GitBlit.self().deleteUser(user.username); + } + } @BeforeClass public static void startGitblit() throws Exception { started.set(GitBlitSuite.startGitblit()); + + delete(getUser()); } @AfterClass @@ -72,6 +90,8 @@ GitBlitSuite.stopGitblit(); deleteWorkingFolders(); } + + delete(getUser()); } public static void deleteWorkingFolders() throws Exception { @@ -194,7 +214,8 @@ model.accessRestriction = AccessRestrictionType.NONE; model.authorizationControl = AuthorizationControl.NAMED; GitBlit.self().updateRepositoryModel(model.name, model, false); - GitBlit.self().deleteUser(user.username); + + delete(user); } @Test @@ -347,8 +368,7 @@ @Test public void testCommitterVerification() throws Exception { - UserModel user = new UserModel("james"); - user.password = "james"; + UserModel user = getUser(); // account only uses account name to verify testCommitterVerification(user, user.username, null, true); @@ -375,9 +395,7 @@ private void testCommitterVerification(UserModel user, String displayName, String emailAddress, boolean expectedSuccess) throws Exception { - if (GitBlit.self().getUserModel(user.username) != null) { - GitBlit.self().deleteUser(user.username); - } + delete(user); CredentialsProvider cp = new UsernamePasswordCredentialsProvider(user.username, user.password); @@ -450,6 +468,119 @@ // close serving repository GitBlitSuite.close(verification); } + + @Test + public void testMergeCommitterVerification() throws Exception { + + testMergeCommitterVerification(false); + + testMergeCommitterVerification(true); + } + + private void testMergeCommitterVerification(boolean expectedSuccess) throws Exception { + UserModel user = getUser(); + + delete(user); + + CredentialsProvider cp = new UsernamePasswordCredentialsProvider(user.username, user.password); + + // fork from original to a temporary bare repo + File verification = new File(GitBlitSuite.REPOSITORIES, "refchecks/verify-committer.git"); + if (verification.exists()) { + FileUtils.delete(verification, FileUtils.RECURSIVE); + } + CloneCommand clone = Git.cloneRepository(); + clone.setURI(MessageFormat.format("{0}/ticgit.git", url)); + clone.setDirectory(verification); + clone.setBare(true); + clone.setCloneAllBranches(true); + clone.setCredentialsProvider(cp); + GitBlitSuite.close(clone.call()); + + // require push permissions and committer verification + RepositoryModel model = GitBlit.self().getRepositoryModel("refchecks/verify-committer.git"); + model.authorizationControl = AuthorizationControl.NAMED; + model.accessRestriction = AccessRestrictionType.PUSH; + model.verifyCommitter = true; + + // grant user push permission + user.setRepositoryPermission(model.name, AccessPermission.PUSH); + + GitBlit.self().updateUserModel(user.username, user, true); + GitBlit.self().updateRepositoryModel(model.name, model, false); + + // clone temp bare repo to working copy + File local = new File(GitBlitSuite.REPOSITORIES, "refchecks/verify-wc"); + if (local.exists()) { + FileUtils.delete(local, FileUtils.RECURSIVE); + } + clone = Git.cloneRepository(); + clone.setURI(MessageFormat.format("{0}/{1}", url, model.name)); + clone.setDirectory(local); + clone.setBare(false); + clone.setCloneAllBranches(true); + clone.setCredentialsProvider(cp); + GitBlitSuite.close(clone.call()); + + Git git = Git.open(local); + + // checkout a mergetest branch + git.checkout().setCreateBranch(true).setName("mergetest").call(); + + // change identity + git.getRepository().getConfig().setString("user", null, "name", "mergetest"); + git.getRepository().getConfig().setString("user", null, "email", "mergetest@merge.com"); + git.getRepository().getConfig().save(); + + // commit a file + File file = new File(local, "MERGECHK2"); + OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream(file, true), Constants.CHARSET); + BufferedWriter w = new BufferedWriter(os); + w.write("// " + new Date().toString() + "\n"); + w.close(); + git.add().addFilepattern(file.getName()).call(); + RevCommit mergeTip = git.commit().setMessage(file.getName() + " test").call(); + + // return to master + git.checkout().setName("master").call(); + + // restore identity + if (expectedSuccess) { + git.getRepository().getConfig().setString("user", null, "name", user.username); + git.getRepository().getConfig().setString("user", null, "email", user.emailAddress); + git.getRepository().getConfig().save(); + } + + // commit a file + file = new File(local, "MERGECHK1"); + os = new OutputStreamWriter(new FileOutputStream(file, true), Constants.CHARSET); + w = new BufferedWriter(os); + w.write("// " + new Date().toString() + "\n"); + w.close(); + git.add().addFilepattern(file.getName()).call(); + git.commit().setMessage(file.getName() + " test").call(); + + // merge the tip of the mergetest branch into master with --no-ff + MergeResult mergeResult = git.merge().setFastForward(FastForwardMode.NO_FF).include(mergeTip.getId()).call(); + assertEquals(MergeResult.MergeStatus.MERGED, mergeResult.getMergeStatus()); + + // push the merged master to the origin + Iterable<PushResult> results = git.push().setCredentialsProvider(cp).setRemote("origin").call(); + + for (PushResult result : results) { + RemoteRefUpdate ref = result.getRemoteUpdate("refs/heads/master"); + Status status = ref.getStatus(); + if (expectedSuccess) { + assertTrue("Verification failed! User was NOT able to push commit! " + status.name(), Status.OK.equals(status)); + } else { + assertTrue("Verification failed! User was able to push commit! " + status.name(), Status.REJECTED_OTHER_REASON.equals(status)); + } + } + + GitBlitSuite.close(git); + // close serving repository + GitBlitSuite.close(verification); + } @Test public void testBlockClone() throws Exception { @@ -483,12 +614,8 @@ private void testRefChange(AccessPermission permission, Status expectedCreate, Status expectedDelete, Status expectedRewind) throws Exception { - UserModel user = new UserModel("james"); - user.password = "james"; - - if (GitBlit.self().getUserModel(user.username) != null) { - GitBlit.self().deleteUser(user.username); - } + UserModel user = getUser(); + delete(user); CredentialsProvider cp = new UsernamePasswordCredentialsProvider(user.username, user.password); @@ -672,7 +799,7 @@ // close serving repository GitBlitSuite.close(refChecks); - GitBlit.self().deleteUser(user.username); + delete(user); } @Test @@ -687,9 +814,7 @@ UserModel user = new UserModel("sampleuser"); user.password = user.username; - if (GitBlit.self().getUserModel(user.username) != null) { - GitBlit.self().deleteUser(user.username); - } + delete(user); user.canCreate = canCreate; user.canAdmin = canAdmin; @@ -780,7 +905,7 @@ } GitBlitSuite.close(git); - GitBlit.self().deleteUser(user.username); + delete(user); } @Test @@ -788,7 +913,7 @@ String name = "refchecks/ticgit.git"; File refChecks = new File(GitBlitSuite.REPOSITORIES, name); Repository repository = new FileRepositoryBuilder().setGitDir(refChecks).build(); - List<PushLogEntry> pushes = PushLogUtils.getPushLog(name, repository); + List<RefLogEntry> pushes = RefLogUtils.getRefLog(name, repository); GitBlitSuite.close(repository); assertTrue("Repository has an empty push log!", pushes.size() > 0); } -- Gitblit v1.9.1