From eecaad8b8e2c447429c31a01d49260ddd6b4ee03 Mon Sep 17 00:00:00 2001
From: Paul Martin <paul@paulsputer.com>
Date: Sat, 16 Apr 2016 17:35:32 -0400
Subject: [PATCH] Proof of concept #1026

---
 src/test/java/com/gitblit/tests/GitServletTest.java |  416 +++++++++++++++++++++++++++++++++++++++--------------------
 1 files changed, 275 insertions(+), 141 deletions(-)

diff --git a/src/test/java/com/gitblit/tests/GitServletTest.java b/src/test/java/com/gitblit/tests/GitServletTest.java
index 2402ab3..705684a 100644
--- a/src/test/java/com/gitblit/tests/GitServletTest.java
+++ b/src/test/java/com/gitblit/tests/GitServletTest.java
@@ -1,8 +1,19 @@
+/*
+ * Copyright 2011 gitblit.com.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package com.gitblit.tests;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 
 import java.io.BufferedWriter;
 import java.io.File;
@@ -16,11 +27,14 @@
 
 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;
+import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.storage.file.FileRepository;
+import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
 import org.eclipse.jgit.transport.CredentialsProvider;
 import org.eclipse.jgit.transport.PushResult;
 import org.eclipse.jgit.transport.RefSpec;
@@ -35,23 +49,22 @@
 import com.gitblit.Constants.AccessPermission;
 import com.gitblit.Constants.AccessRestrictionType;
 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 {
+public class GitServletTest extends GitblitUnitTest {
 
 	static File ticgitFolder = new File(GitBlitSuite.REPOSITORIES, "working/ticgit");
-	
+
 	static File ticgit2Folder = new File(GitBlitSuite.REPOSITORIES, "working/ticgit2");
 
 	static File jgitFolder = new File(GitBlitSuite.REPOSITORIES, "working/jgit");
-	
+
 	static File jgit2Folder = new File(GitBlitSuite.REPOSITORIES, "working/jgit2");
 
 	String url = GitBlitSuite.gitServletUrl;
@@ -60,9 +73,25 @@
 
 	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 (users().getUserModel(user.username) != null) {
+			users().deleteUser(user.username);
+		}
+	}
+
 	@BeforeClass
 	public static void startGitblit() throws Exception {
 		started.set(GitBlitSuite.startGitblit());
+
+		delete(getUser());
 	}
 
 	@AfterClass
@@ -71,8 +100,10 @@
 			GitBlitSuite.stopGitblit();
 			deleteWorkingFolders();
 		}
+
+		delete(getUser());
 	}
-	
+
 	public static void deleteWorkingFolders() throws Exception {
 		if (ticgitFolder.exists()) {
 			GitBlitSuite.close(ticgitFolder);
@@ -98,25 +129,25 @@
 		if (ticgitFolder.exists()) {
 			FileUtils.delete(ticgitFolder, FileUtils.RECURSIVE | FileUtils.RETRY);
 		}
-		
+
 		CloneCommand clone = Git.cloneRepository();
 		clone.setURI(MessageFormat.format("{0}/ticgit.git", url));
 		clone.setDirectory(ticgitFolder);
 		clone.setBare(false);
 		clone.setCloneAllBranches(true);
 		clone.setCredentialsProvider(new UsernamePasswordCredentialsProvider(account, password));
-		GitBlitSuite.close(clone.call());		
+		GitBlitSuite.close(clone.call());
 		assertTrue(true);
 	}
 
 	@Test
 	public void testBogusLoginClone() throws Exception {
 		// restrict repository access
-		RepositoryModel model = GitBlit.self().getRepositoryModel("ticgit.git");
+		RepositoryModel model = repositories().getRepositoryModel("ticgit.git");
 		model.accessRestriction = AccessRestrictionType.CLONE;
-		GitBlit.self().updateRepositoryModel(model.name, model, false);
+		repositories().updateRepositoryModel(model.name, model, false);
 
-		// delete any existing working folder		
+		// delete any existing working folder
 		boolean cloned = false;
 		try {
 			CloneCommand clone = Git.cloneRepository();
@@ -133,25 +164,25 @@
 
 		// restore anonymous repository access
 		model.accessRestriction = AccessRestrictionType.NONE;
-		GitBlit.self().updateRepositoryModel(model.name, model, false);
+		repositories().updateRepositoryModel(model.name, model, false);
 
 		assertFalse("Bogus login cloned a repository?!", cloned);
 	}
-	
+
 	@Test
 	public void testUnauthorizedLoginClone() throws Exception {
 		// restrict repository access
-		RepositoryModel model = GitBlit.self().getRepositoryModel("ticgit.git");
+		RepositoryModel model = repositories().getRepositoryModel("ticgit.git");
 		model.accessRestriction = AccessRestrictionType.CLONE;
 		model.authorizationControl = AuthorizationControl.NAMED;
 		UserModel user = new UserModel("james");
 		user.password = "james";
-		GitBlit.self().updateUserModel(user.username, user, true);
-		GitBlit.self().updateRepositoryModel(model.name, model, false);
+		gitblit().addUser(user);
+		repositories().updateRepositoryModel(model.name, model, false);
 
 		FileUtils.delete(ticgit2Folder, FileUtils.RECURSIVE);
-		
-		// delete any existing working folder		
+
+		// delete any existing working folder
 		boolean cloned = false;
 		try {
 			CloneCommand clone = Git.cloneRepository();
@@ -169,11 +200,11 @@
 		assertFalse("Unauthorized login cloned a repository?!", cloned);
 
 		FileUtils.delete(ticgit2Folder, FileUtils.RECURSIVE);
-		
+
 		// switch to authenticated
 		model.authorizationControl = AuthorizationControl.AUTHENTICATED;
-		GitBlit.self().updateRepositoryModel(model.name, model, false);
-		
+		repositories().updateRepositoryModel(model.name, model, false);
+
 		// try clone again
 		cloned = false;
 		CloneCommand clone = Git.cloneRepository();
@@ -186,14 +217,15 @@
 		cloned = true;
 
 		assertTrue("Authenticated login could not clone!", cloned);
-		
+
 		FileUtils.delete(ticgit2Folder, FileUtils.RECURSIVE);
-		
+
 		// restore anonymous repository access
 		model.accessRestriction = AccessRestrictionType.NONE;
 		model.authorizationControl = AuthorizationControl.NAMED;
-		GitBlit.self().updateRepositoryModel(model.name, model, false);
-		GitBlit.self().deleteUser(user.username);
+		repositories().updateRepositoryModel(model.name, model, false);
+
+		delete(user);
 	}
 
 	@Test
@@ -203,9 +235,9 @@
 			FileUtils.delete(ticgitFolder, FileUtils.RECURSIVE | FileUtils.RETRY);
 		}
 
-		RepositoryModel model = GitBlit.self().getRepositoryModel("ticgit.git");
+		RepositoryModel model = repositories().getRepositoryModel("ticgit.git");
 		model.accessRestriction = AccessRestrictionType.NONE;
-		GitBlit.self().updateRepositoryModel(model.name, model, false);
+		repositories().updateRepositoryModel(model.name, model, false);
 
 		CloneCommand clone = Git.cloneRepository();
 		clone.setURI(MessageFormat.format("{0}/ticgit.git", url));
@@ -213,9 +245,9 @@
 		clone.setBare(false);
 		clone.setCloneAllBranches(true);
 		clone.setCredentialsProvider(new UsernamePasswordCredentialsProvider(account, password));
-		GitBlitSuite.close(clone.call());		
+		GitBlitSuite.close(clone.call());
 		assertTrue(true);
-		
+
 		Git git = Git.open(ticgitFolder);
 		File file = new File(ticgitFolder, "TODO");
 		OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream(file, true), Constants.CHARSET);
@@ -239,7 +271,7 @@
 		if (jgitFolder.exists()) {
 			FileUtils.delete(jgitFolder, FileUtils.RECURSIVE | FileUtils.RETRY);
 		}
-		
+
 		CloneCommand clone = Git.cloneRepository();
 		clone.setURI(MessageFormat.format("{0}/test/jgit.git", url));
 		clone.setDirectory(jgitFolder);
@@ -265,14 +297,14 @@
 			}
 		}
 	}
-	
+
 	@Test
 	public void testPushToFrozenRepo() throws Exception {
 		GitBlitSuite.close(jgitFolder);
 		if (jgitFolder.exists()) {
 			FileUtils.delete(jgitFolder, FileUtils.RECURSIVE | FileUtils.RETRY);
 		}
-		
+
 		CloneCommand clone = Git.cloneRepository();
 		clone.setURI(MessageFormat.format("{0}/test/jgit.git", url));
 		clone.setDirectory(jgitFolder);
@@ -281,11 +313,11 @@
 		clone.setCredentialsProvider(new UsernamePasswordCredentialsProvider(account, password));
 		GitBlitSuite.close(clone.call());
 		assertTrue(true);
-		
+
 		// freeze repo
-		RepositoryModel model = GitBlit.self().getRepositoryModel("test/jgit.git");
+		RepositoryModel model = repositories().getRepositoryModel("test/jgit.git");
 		model.isFrozen = true;
-		GitBlit.self().updateRepositoryModel(model.name, model, false);
+		repositories().updateRepositoryModel(model.name, model, false);
 
 		Git git = Git.open(jgitFolder);
 		File file = new File(jgitFolder, "TODO");
@@ -295,17 +327,17 @@
 		w.close();
 		git.add().addFilepattern(file.getName()).call();
 		git.commit().setMessage("test commit").call();
-		
+
 		Iterable<PushResult> results = git.push().setPushAll().setCredentialsProvider(new UsernamePasswordCredentialsProvider(account, password)).call();
 		for (PushResult result : results) {
 			for (RemoteRefUpdate update : result.getRemoteUpdates()) {
 				assertEquals(Status.REJECTED_OTHER_REASON, update.getStatus());
 			}
 		}
-		
+
 		// unfreeze repo
 		model.isFrozen = false;
-		GitBlit.self().updateRepositoryModel(model.name, model, false);
+		repositories().updateRepositoryModel(model.name, model, false);
 
 		results = git.push().setPushAll().setCredentialsProvider(new UsernamePasswordCredentialsProvider(account, password)).call();
 		GitBlitSuite.close(git);
@@ -315,7 +347,7 @@
 			}
 		}
 	}
-	
+
 	@Test
 	public void testPushToNonBareRepository() throws Exception {
 		CloneCommand clone = Git.cloneRepository();
@@ -346,40 +378,25 @@
 
 	@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);
-		// committer email address is ignored because account does not specify email
-		testCommitterVerification(user, user.username, "something", true);
-		// completely different committer
 		testCommitterVerification(user, "joe", null, false);
+		testCommitterVerification(user, "joe", user.emailAddress, false);
+		testCommitterVerification(user, user.username, null, false);
+		testCommitterVerification(user, user.username, user.emailAddress, true);
 
-		// test display name verification
 		user.displayName = "James Moger";
-		testCommitterVerification(user, user.displayName, null, true);
-		testCommitterVerification(user, user.displayName, "something", true);
-		testCommitterVerification(user, "joe", null, false);
-		
-		// test email address verification
-		user.emailAddress = "something";
 		testCommitterVerification(user, user.displayName, null, false);
-		testCommitterVerification(user, user.displayName, "somethingelse", false);
+		testCommitterVerification(user, user.displayName, "something", false);
 		testCommitterVerification(user, user.displayName, user.emailAddress, true);
-		
-		// use same email address but with different committer
-		testCommitterVerification(user, "joe", "somethingelse", false);
 	}
-	
+
 	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);
-		
+
 		// fork from original to a temporary bare repo
 		File verification = new File(GitBlitSuite.REPOSITORIES, "refchecks/verify-committer.git");
 		if (verification.exists()) {
@@ -392,18 +409,18 @@
 		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");
+		RepositoryModel model = repositories().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);
+
+		gitblit().addUser(user);
+		repositories().updateRepositoryModel(model.name, model, false);
 
 		// clone temp bare repo to working copy
 		File local = new File(GitBlitSuite.REPOSITORIES, "refchecks/verify-wc");
@@ -417,14 +434,14 @@
 		clone.setCloneAllBranches(true);
 		clone.setCredentialsProvider(cp);
 		GitBlitSuite.close(clone.call());
-		
+
 		Git git = Git.open(local);
-		
+
 		// force an identity which may or may not match the account's identity
 		git.getRepository().getConfig().setString("user", null, "name", displayName);
 		git.getRepository().getConfig().setString("user", null, "email", emailAddress);
 		git.getRepository().getConfig().save();
-		
+
 		// commit a file and push it
 		File file = new File(local, "PUSHCHK");
 		OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream(file, true), Constants.CHARSET);
@@ -434,7 +451,7 @@
 		git.add().addFilepattern(file.getName()).call();
 		git.commit().setMessage("push test").call();
 		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();
@@ -444,7 +461,120 @@
 				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 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 = repositories().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().addUser(user);
+		repositories().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);
@@ -469,35 +599,41 @@
 	public void testBlockBranchDeletion() throws Exception {
 		testRefChange(AccessPermission.CREATE, Status.OK, Status.REJECTED_OTHER_REASON, null);
 	}
-	
+
 	@Test
 	public void testBlockBranchRewind() throws Exception {
 		testRefChange(AccessPermission.DELETE, Status.OK, Status.OK, Status.REJECTED_OTHER_REASON);
 	}
 
 	@Test
-	public void testBranchRewind() throws Exception {		
+	public void testBranchRewind() throws Exception {
 		testRefChange(AccessPermission.REWIND, Status.OK, Status.OK, Status.OK);
 	}
 
 	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);
-		}
-		
+		final String originName = "ticgit.git";
+		final String forkName = "refchecks/ticgit.git";
+		final String workingCopy = "refchecks/ticgit-wc";
+
+
+		// lower access restriction on origin repository
+		RepositoryModel origin = repositories().getRepositoryModel(originName);
+		origin.accessRestriction = AccessRestrictionType.NONE;
+		repositories().updateRepositoryModel(origin.name, origin, false);
+
+		UserModel user = getUser();
+		delete(user);
+
 		CredentialsProvider cp = new UsernamePasswordCredentialsProvider(user.username, user.password);
-		
+
 		// fork from original to a temporary bare repo
-		File refChecks = new File(GitBlitSuite.REPOSITORIES, "refchecks/ticgit.git");
+		File refChecks = new File(GitBlitSuite.REPOSITORIES, forkName);
 		if (refChecks.exists()) {
 			FileUtils.delete(refChecks, FileUtils.RECURSIVE);
 		}
 		CloneCommand clone = Git.cloneRepository();
-		clone.setURI(MessageFormat.format("{0}/ticgit.git", url));
+		clone.setURI(url + "/" + originName);
 		clone.setDirectory(refChecks);
 		clone.setBare(true);
 		clone.setCloneAllBranches(true);
@@ -505,7 +641,7 @@
 		GitBlitSuite.close(clone.call());
 
 		// elevate repository to clone permission
-		RepositoryModel model = GitBlit.self().getRepositoryModel("refchecks/ticgit.git");
+		RepositoryModel model = repositories().getRepositoryModel(forkName);
 		switch (permission) {
 			case VIEW:
 				model.accessRestriction = AccessRestrictionType.CLONE;
@@ -517,15 +653,15 @@
 				model.accessRestriction = AccessRestrictionType.PUSH;
 		}
 		model.authorizationControl = AuthorizationControl.NAMED;
-		
+
 		// grant user specified
 		user.setRepositoryPermission(model.name, permission);
 
-		GitBlit.self().updateUserModel(user.username, user, true);
-		GitBlit.self().updateRepositoryModel(model.name, model, false);
+		gitblit().addUser(user);
+		repositories().updateRepositoryModel(model.name, model, false);
 
 		// clone temp bare repo to working copy
-		File local = new File(GitBlitSuite.REPOSITORIES, "refchecks/ticgit-wc");
+		File local = new File(GitBlitSuite.REPOSITORIES, workingCopy);
 		if (local.exists()) {
 			FileUtils.delete(local, FileUtils.RECURSIVE);
 		}
@@ -535,7 +671,7 @@
 		clone.setBare(false);
 		clone.setCloneAllBranches(true);
 		clone.setCredentialsProvider(cp);
-		
+
 		try {
 			GitBlitSuite.close(clone.call());
 		} catch (GitAPIException e) {
@@ -544,15 +680,15 @@
 			} else {
 				// close serving repository
 				GitBlitSuite.close(refChecks);
-				
+
 				// user does not have clone permission
-				assertTrue(e.getMessage(), e.getMessage().contains("not permitted"));	
+				assertTrue(e.getMessage(), e.getMessage().contains("not permitted"));
 				return;
 			}
 		}
-		
+
 		Git git = Git.open(local);
-		
+
 		// commit a file and push it
 		File file = new File(local, "PUSHCHK");
 		OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream(file, true), Constants.CHARSET);
@@ -570,14 +706,14 @@
 			} else {
 				// close serving repository
 				GitBlitSuite.close(refChecks);
-				
+
 				// user does not have push permission
 				assertTrue(e.getMessage(), e.getMessage().contains("not permitted"));
 				GitBlitSuite.close(git);
 				return;
 			}
 		}
-		
+
 		for (PushResult result : results) {
 			RemoteRefUpdate ref = result.getRemoteUpdate("refs/heads/master");
 			Status status = ref.getStatus();
@@ -593,8 +729,8 @@
 				return;
 			}
 		}
-		
-		// create a local branch and push the new branch back to the origin				
+
+		// create a local branch and push the new branch back to the origin
 		git.branchCreate().setName("protectme").call();
 		RefSpec refSpec = new RefSpec("refs/heads/protectme:refs/heads/protectme");
 		results = git.push().setCredentialsProvider(cp).setRefSpecs(refSpec).setRemote("origin").call();
@@ -613,10 +749,10 @@
 				return;
 			}
 		}
-		
+
 		// delete the branch locally
 		git.branchDelete().setBranchNames("protectme").call();
-		
+
 		// push a delete ref command
 		refSpec = new RefSpec(":refs/heads/protectme");
 		results = git.push().setCredentialsProvider(cp).setRefSpecs(refSpec).setRemote("origin").call();
@@ -635,10 +771,10 @@
 				return;
 			}
 		}
-		
+
 		// rewind master by two commits
 		git.reset().setRef("HEAD~2").setMode(ResetType.HARD).call();
-		
+
 		// commit a change on this detached HEAD
 		file = new File(local, "REWINDCHK");
 		os = new OutputStreamWriter(new FileOutputStream(file, true), Constants.CHARSET);
@@ -647,11 +783,11 @@
 		w.close();
 		git.add().addFilepattern(file.getName()).call();
 		RevCommit commit = git.commit().setMessage("rewind master and new commit").call();
-		
+
 		// Reset master to our new commit now we our local branch tip is no longer
 		// upstream of the remote branch tip.  It is an alternate tip of the branch.
 		JGitUtils.setBranchRef(git.getRepository(), "refs/heads/master", commit.getName());
-		
+
 		// Try pushing our new tip to the origin.
 		// This requires the server to "rewind" it's master branch and update it
 		// to point to our alternate tip.  This leaves the original master tip
@@ -667,43 +803,41 @@
 			}
 		}
 		GitBlitSuite.close(git);
-		
+
 		// close serving repository
 		GitBlitSuite.close(refChecks);
 
-		GitBlit.self().deleteUser(user.username);
+		delete(user);
 	}
-	
+
 	@Test
 	public void testCreateOnPush() throws Exception {
 		testCreateOnPush(false, false);
 		testCreateOnPush(true, false);
 		testCreateOnPush(false, true);
 	}
-	
+
 	private void testCreateOnPush(boolean canCreate, boolean canAdmin) throws Exception {
 
 		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;
-		
-		GitBlit.self().updateUserModel(user.username, user, true);
+
+		gitblit().addUser(user);
 
 		CredentialsProvider cp = new UsernamePasswordCredentialsProvider(user.username, user.password);
-		
+
 		// fork from original to a temporary bare repo
 		File tmpFolder = File.createTempFile("gitblit", "").getParentFile();
 		File createCheck = new File(tmpFolder, "ticgit.git");
 		if (createCheck.exists()) {
 			FileUtils.delete(createCheck, FileUtils.RECURSIVE);
 		}
-		
+
 		File personalRepo = new File(GitBlitSuite.REPOSITORIES, MessageFormat.format("~{0}/ticgit.git", user.username));
 		GitBlitSuite.close(personalRepo);
 		if (personalRepo.exists()) {
@@ -723,9 +857,9 @@
 		clone.setCloneAllBranches(true);
 		clone.setCredentialsProvider(cp);
 		Git git = clone.call();
-		
+
 		GitBlitSuite.close(personalRepo);
-		
+
 		// add a personal repository remote and a project remote
 		git.getRepository().getConfig().setString("remote", "user", "url", MessageFormat.format("{0}/~{1}/ticgit.git", url, user.username));
 		git.getRepository().getConfig().setString("remote", "project", "url", MessageFormat.format("{0}/project/ticgit.git", url));
@@ -742,18 +876,18 @@
 			}
 
 			assertTrue("User canAdmin:" + user.canAdmin + " canCreate:" + user.canCreate, user.canAdmin || user.canCreate);
-			
+
 			// confirm default personal repository permissions
-			RepositoryModel model = GitBlit.self().getRepositoryModel(MessageFormat.format("~{0}/ticgit.git", user.username));
+			RepositoryModel model = repositories().getRepositoryModel(MessageFormat.format("~{0}/ticgit.git", user.username));
 			assertEquals("Unexpected owner", user.username, ArrayUtils.toString(model.owners));
 			assertEquals("Unexpected authorization control", AuthorizationControl.NAMED, model.authorizationControl);
 			assertEquals("Unexpected access restriction", AccessRestrictionType.VIEW, model.accessRestriction);
-			
+
 		} catch (GitAPIException e) {
 			assertTrue(e.getMessage(), e.getMessage().contains("git-receive-pack not found"));
 			assertFalse("User canAdmin:" + user.canAdmin + " canCreate:" + user.canCreate, user.canAdmin || user.canCreate);
 		}
-		
+
 		// push to non-existent project repository
 		try {
 			Iterable<PushResult> results = git.push().setRemote("project").setPushAll().setCredentialsProvider(cp).call();
@@ -764,14 +898,14 @@
 				Status status = ref.getStatus();
 				assertTrue("User failed to create repository?! " + status.name(), Status.OK.equals(status));
 			}
-			
+
 			assertTrue("User canAdmin:" + user.canAdmin, user.canAdmin);
-			
+
 			// confirm default project repository permissions
-			RepositoryModel model = GitBlit.self().getRepositoryModel("project/ticgit.git");
+			RepositoryModel model = repositories().getRepositoryModel("project/ticgit.git");
 			assertEquals("Unexpected owner", user.username, ArrayUtils.toString(model.owners));
-			assertEquals("Unexpected authorization control", AuthorizationControl.fromName(GitBlit.getString(Keys.git.defaultAuthorizationControl, "NAMED")), model.authorizationControl);
-			assertEquals("Unexpected access restriction", AccessRestrictionType.fromName(GitBlit.getString(Keys.git.defaultAccessRestriction, "NONE")), model.accessRestriction);
+			assertEquals("Unexpected authorization control", AuthorizationControl.fromName(settings().getString(Keys.git.defaultAuthorizationControl, "NAMED")), model.authorizationControl);
+			assertEquals("Unexpected access restriction", AccessRestrictionType.fromName(settings().getString(Keys.git.defaultAccessRestriction, "NONE")), model.accessRestriction);
 
 		} catch (GitAPIException e) {
 			assertTrue(e.getMessage(), e.getMessage().contains("git-receive-pack not found"));
@@ -779,15 +913,15 @@
 		}
 
 		GitBlitSuite.close(git);
-		GitBlit.self().deleteUser(user.username);
+		delete(user);
 	}
-	
+
 	@Test
 	public void testPushLog() throws IOException {
 		String name = "refchecks/ticgit.git";
 		File refChecks = new File(GitBlitSuite.REPOSITORIES, name);
-		FileRepository repository = new FileRepository(refChecks);
-		List<PushLogEntry> pushes = PushLogUtils.getPushLog(name, repository);
+		Repository repository = new FileRepositoryBuilder().setGitDir(refChecks).build();
+		List<RefLogEntry> pushes = RefLogUtils.getRefLog(name, repository);
 		GitBlitSuite.close(repository);
 		assertTrue("Repository has an empty push log!", pushes.size() > 0);
 	}

--
Gitblit v1.9.1