src/com/gitblit/FileSettings.java
@@ -34,9 +34,15 @@ private final Logger logger = LoggerFactory.getLogger(FileSettings.class); private final File propertiesFile; private Properties properties = new Properties(); private long lastread; public FileSettings(String file) { this.propertiesFile = new File(file); } @Override public List<String> getAllKeys(String startingWith) { @@ -139,14 +145,13 @@ } private synchronized Properties read() { File file = new File(Constants.PROPERTIES_FILE); if (file.exists() && (file.lastModified() > lastread)) { if (propertiesFile.exists() && (propertiesFile.lastModified() > lastread)) { FileInputStream is = null; try { properties = new Properties(); is = new FileInputStream(Constants.PROPERTIES_FILE); is = new FileInputStream(propertiesFile); properties.load(is); lastread = file.lastModified(); lastread = propertiesFile.lastModified(); } catch (FileNotFoundException f) { // IGNORE - won't happen because file.exists() check above } catch (Throwable t) { @@ -166,6 +171,6 @@ @Override public String toString() { return new File(Constants.PROPERTIES_FILE).getAbsolutePath(); return propertiesFile.getAbsolutePath(); } } src/com/gitblit/GitBlitServer.java
@@ -425,7 +425,7 @@ @Parameters(separators = " ") private static class Params { private static final FileSettings FILESETTINGS = new FileSettings(); private static final FileSettings FILESETTINGS = new FileSettings(Constants.PROPERTIES_FILE); /* * Server parameters src/com/gitblit/GitBlitServlet.java
@@ -56,7 +56,7 @@ } int forwardSlash = url.indexOf('/'); if (forwardSlash > -1) { String repository = url.substring(0, forwardSlash); String repository = url.substring(0, forwardSlash).toLowerCase(); String function = url.substring(forwardSlash + 1); String query = req.getQueryString() == null ? "" : req.getQueryString(); RepositoryModel model = GitBlit.self().getRepositoryModel(repository); src/com/gitblit/MakeCertificate.java
@@ -156,7 +156,7 @@ @Parameters(separators = " ") private static class Params { private static final FileSettings FILESETTINGS = new FileSettings(); private static final FileSettings FILESETTINGS = new FileSettings(Constants.PROPERTIES_FILE); @Parameter(names = { "--alias" }, description = "Server alias", required = true) public String alias; src/com/gitblit/models/PathModel.java
@@ -43,16 +43,6 @@ return FileMode.TREE.equals(mode); } public static PathModel getParentPath(String basePath, String commitId) { String parentPath = null; if (basePath.lastIndexOf('/') > -1) { parentPath = basePath.substring(0, basePath.lastIndexOf('/')); } PathModel model = new PathModel("..", parentPath, 0, 40000, commitId); model.isParentPath = true; return model; } @Override public int hashCode() { return commitId.hashCode() + path.hashCode(); src/com/gitblit/models/RepositoryModel.java
@@ -37,11 +37,7 @@ public boolean isFrozen; public RepositoryModel() { this.name = ""; this.description = ""; this.owner = ""; this.lastChange = new Date(0); this.accessRestriction = AccessRestrictionType.NONE; this("", "", "", new Date(0)); } public RepositoryModel(String name, String description, String owner, Date lastchange) { src/com/gitblit/models/TicketModel.java
@@ -58,11 +58,6 @@ public String author; public Date date; public Comment(String text, Date date) { this.text = text; this.date = date; } public Comment(String filename, String content) throws ParseException { String[] chunks = filename.split("_", -1); this.date = new Date(Long.parseLong(chunks[1]) * 1000L); src/com/gitblit/models/UserModel.java
@@ -34,12 +34,7 @@ } public boolean canAccessRepository(String repositoryName) { return canAdmin || repositories.contains(repositoryName); } public void setRepositories(List<String> repositories) { this.repositories.clear(); this.repositories.addAll(repositories); return canAdmin || repositories.contains(repositoryName.toLowerCase()); } public void addRepository(String name) { src/com/gitblit/utils/TimeUtils.java
@@ -45,9 +45,9 @@ public static String duration(int days) { if (days <= 60) { return days + (days > 1 ? " days" : " day"); } else if (days <= 365) { } else if (days < 365) { int rem = days % 30; return (days / 30) + " months, " + rem + (rem > 1 ? " days" : " day"); return (days / 30) + (rem >= 15 ? 1 : 0) + " months"; } else { int years = days / 365; int rem = days % 365; @@ -56,23 +56,17 @@ if (rem == 0) { return yearsString; } else { return yearsString + ", " + rem + (rem > 1 ? " days" : " day"); return yearsString + (rem >= 15 ? ", 1 month" : ""); } } else { int months = rem / 30; int remDays = rem % 30; String monthsString; if (months == 0) { monthsString = yearsString; } else { monthsString = yearsString + ", " + months if (remDays >= 15) { months++; } String monthsString = yearsString + ", " + months + (months > 1 ? " months" : " month"); } if (remDays == 0) { return monthsString; } else { return monthsString + ", " + remDays + (remDays > 1 ? " days" : " day"); } } } } @@ -120,7 +114,7 @@ String ago = null; if (isToday(date) || isYesterday(date)) { int mins = minutesAgo(date, true); if (mins > 120) { if (mins >= 120) { if (css) { return "age1"; } @@ -128,7 +122,7 @@ if (hours > 23) { ago = "yesterday"; } else { ago = hours + " hour" + (hours > 1 ? "s" : "") + " ago"; ago = hours + " hours ago"; } } else { if (css) { @@ -158,8 +152,6 @@ months++; } ago = months + " month" + (months > 1 ? "s" : "") + " ago"; } else { ago = days + " day" + (days > 1 ? "s" : "") + " ago"; } } else if (days == 365) { ago = "1 year ago"; src/com/gitblit/wicket/pages/EditUserPage.java
@@ -140,9 +140,10 @@ Iterator<String> selectedRepositories = repositories.getSelectedChoices(); List<String> repos = new ArrayList<String>(); while (selectedRepositories.hasNext()) { repos.add(selectedRepositories.next()); repos.add(selectedRepositories.next().toLowerCase()); } userModel.setRepositories(repos); userModel.repositories.clear(); userModel.repositories.addAll(repos); try { GitBlit.self().editUserModel(oldName, userModel, isCreate); } catch (GitBlitException e) { src/com/gitblit/wicket/pages/TreePage.java
@@ -65,7 +65,14 @@ // breadcrumbs add(new PathBreadcrumbsPanel("breadcrumbs", repositoryName, path, objectId)); if (path != null && path.trim().length() > 0) { paths.add(0, PathModel.getParentPath(path, objectId)); // add .. parent path entry String parentPath = null; if (path.lastIndexOf('/') > -1) { parentPath = path.substring(0, path.lastIndexOf('/')); } PathModel model = new PathModel("..", parentPath, 0, 40000, objectId); model.isParentPath = true; paths.add(0, model); } final ByteFormat byteFormat = new ByteFormat(); tests/com/gitblit/tests/GitBlitSuite.java
@@ -11,6 +11,10 @@ import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.storage.file.FileRepository; import com.gitblit.FileSettings; import com.gitblit.GitBlit; import com.gitblit.JettyLoginService; public class GitBlitSuite extends TestSetup { public static final File REPOSITORIES = new File("git"); @@ -20,7 +24,9 @@ public static Test suite() { TestSuite suite = new TestSuite(); suite.addTestSuite(TimeUtilsTest.class); suite.addTestSuite(JGitUtilsTest.class); suite.addTestSuite(GitBlitTest.class); return new GitBlitSuite(suite); } @@ -39,6 +45,11 @@ cloneOrFetch("nested/helloworld.git", "https://github.com/git/hello-world.git", true); cloneOrFetch("ticgit.git", "https://github.com/jeffWelling/ticgit.git", true); } FileSettings settings = new FileSettings("distrib/gitblit.properties"); GitBlit.self().configureContext(settings); JettyLoginService loginService = new JettyLoginService(new File("distrib/users.properties")); loginService.loadUsers(); GitBlit.self().setLoginService(loginService); } private void cloneOrFetch(String toFolder, String fromUrl, boolean bare) throws Exception { tests/com/gitblit/tests/GitBlitTest.java
New file @@ -0,0 +1,36 @@ package com.gitblit.tests; import java.util.List; import junit.framework.TestCase; import com.gitblit.GitBlit; import com.gitblit.models.RepositoryModel; import com.gitblit.models.UserModel; public class GitBlitTest extends TestCase { public void testRepositoryModel() throws Exception { List<String> repositories = GitBlit.self().getRepositoryList(); assertTrue("Repository list is empty!", repositories.size() > 0); assertTrue("Missing Helloworld repository!", repositories.contains(GitBlitSuite.getHelloworldRepository().getDirectory().getName())); RepositoryModel model = GitBlit.self().getRepositoryModel(GitBlitSuite.getHelloworldRepository().getDirectory().getName()); assertTrue("Helloworld model is null!", model != null); assertTrue(model.toString().equals(GitBlitSuite.getHelloworldRepository().getDirectory().getName())); } public void testUserModel() throws Exception { List<String> users = GitBlit.self().getAllUsernames(); assertTrue("No users found!", users.size() > 0); assertTrue("Admin not found", users.contains("admin")); UserModel model = GitBlit.self().getUserModel("admin"); assertTrue(model.toString().equals("admin")); assertTrue("Admin missing #admin role!", model.canAdmin); model.canAdmin = false; assertFalse("Admin should not hae #admin!", model.canAdmin); String repository = GitBlitSuite.getHelloworldRepository().getDirectory().getName(); assertFalse("Admin can still access repository!", model.canAccessRepository(repository)); model.addRepository(repository); assertTrue("Admin can't access repository!", model.canAccessRepository(repository)); } } tests/com/gitblit/tests/JGitUtilsTest.java
@@ -29,9 +29,11 @@ import org.eclipse.jgit.revwalk.RevObject; import org.eclipse.jgit.revwalk.RevTree; import com.gitblit.models.Metric; import com.gitblit.models.PathModel.PathChangeModel; import com.gitblit.models.RefModel; import com.gitblit.models.TicketModel; import com.gitblit.models.TicketModel.Comment; import com.gitblit.utils.DiffUtils; import com.gitblit.utils.JGitUtils; import com.gitblit.utils.JGitUtils.DiffOutputType; @@ -69,6 +71,38 @@ commit.getName().equals("f554664a346629dc2b839f7292d06bad2db4aece")); } public void testRefs() throws Exception { Repository repository = GitBlitSuite.getTicgitRepository(); for (RefModel model : JGitUtils.getLocalBranches(repository, -1)) { assertTrue(model.getName().startsWith(Constants.R_HEADS)); assertTrue(model.equals(model)); assertFalse(model.equals("")); assertTrue(model.hashCode() == model.getCommitId().hashCode() + model.getName().hashCode()); assertTrue(model.getShortLog().equals(model.commit.getShortMessage())); } for (RefModel model : JGitUtils.getRemoteBranches(repository, -1)) { assertTrue(model.getName().startsWith(Constants.R_REMOTES)); assertTrue(model.equals(model)); assertFalse(model.equals("")); assertTrue(model.hashCode() == model.getCommitId().hashCode() + model.getName().hashCode()); assertTrue(model.getShortLog().equals(model.commit.getShortMessage())); } for (RefModel model : JGitUtils.getTags(repository, -1)) { if (model.getObjectId().getName().equals("283035e4848054ff1803cb0e690270787dc92399")) { assertTrue("Not an annotated tag!", model.isAnnotatedTag()); } assertTrue(model.getName().startsWith(Constants.R_TAGS)); assertTrue(model.equals(model)); assertFalse(model.equals("")); assertTrue(model.hashCode() == model.getCommitId().hashCode() + model.getName().hashCode()); assertTrue(model.getShortLog().equals(model.commit.getShortMessage())); } repository.close(); } public void testRetrieveRevObject() throws Exception { Repository repository = GitBlitSuite.getHelloworldRepository(); RevCommit commit = JGitUtils.getCommit(repository, Constants.HEAD); @@ -95,6 +129,12 @@ List<PathChangeModel> paths = JGitUtils.getFilesInCommit(repository, commit); repository.close(); assertTrue("No changed paths found!", paths.size() == 1); for (PathChangeModel path : paths) { assertTrue("PathChangeModel hashcode incorrect!", path.hashCode() == (path.commitId.hashCode() + path.path.hashCode())); assertTrue("PathChangeModel equals itself failed!", path.equals(path)); assertFalse("PathChangeModel equals string failed!", path.equals("")); } } public void testCommitDiff() throws Exception { @@ -120,12 +160,34 @@ repository.close(); } public void testMetrics() throws Exception { Repository repository = GitBlitSuite.getHelloworldRepository(); List<Metric> metrics = JGitUtils.getDateMetrics(repository); repository.close(); assertTrue("No metrics found!", metrics.size() > 0); } public void testTicGit() throws Exception { Repository repository = GitBlitSuite.getTicgitRepository(); RefModel branch = JGitUtils.getTicketsBranch(repository); assertTrue("Ticgit branch does not exist!", branch != null); List<TicketModel> tickets = JGitUtils.getTickets(repository); List<TicketModel> ticketsA = JGitUtils.getTickets(repository); List<TicketModel> ticketsB = JGitUtils.getTickets(repository); repository.close(); assertTrue("No tickets found!", tickets.size() > 0); assertTrue("No tickets found!", ticketsA.size() > 0); for (int i = 0; i < ticketsA.size(); i++) { TicketModel ticketA = ticketsA.get(i); TicketModel ticketB = ticketsB.get(i); assertTrue("Tickets are not equal!", ticketA.equals(ticketB)); assertFalse(ticketA.equals("")); assertTrue(ticketA.hashCode() == ticketA.id.hashCode()); for (int j = 0; j < ticketA.comments.size(); j++) { Comment commentA = ticketA.comments.get(j); Comment commentB = ticketB.comments.get(j); assertTrue("Comments are not equal!", commentA.equals(commentB)); assertFalse(commentA.equals("")); assertTrue(commentA.hashCode() == commentA.text.hashCode()); } } } } tests/com/gitblit/tests/TimeUtilsTest.java
New file @@ -0,0 +1,60 @@ package com.gitblit.tests; import java.util.Date; import junit.framework.TestCase; import com.gitblit.utils.TimeUtils; public class TimeUtilsTest extends TestCase { public void testToday() throws Exception { assertTrue("Is today failed!", TimeUtils.isToday(new Date())); } public void testYesterday() throws Exception { assertTrue("Is yesterday failed!", TimeUtils.isYesterday(new Date(System.currentTimeMillis() - TimeUtils.ONEDAY))); } public void testDurations() throws Exception { assertTrue(TimeUtils.duration(5).equals("5 days")); assertTrue(TimeUtils.duration(364).equals("12 months")); assertTrue(TimeUtils.duration(365 + 0).equals("1 year")); assertTrue(TimeUtils.duration(365 + 10).equals("1 year")); assertTrue(TimeUtils.duration(365 + 15).equals("1 year, 1 month")); assertTrue(TimeUtils.duration(365 + 30).equals("1 year, 1 month")); assertTrue(TimeUtils.duration(365 + 44).equals("1 year, 1 month")); assertTrue(TimeUtils.duration(365 + 45).equals("1 year, 2 months")); assertTrue(TimeUtils.duration(365 + 60).equals("1 year, 2 months")); assertTrue(TimeUtils.duration(2*365 + 0).equals("2 years")); assertTrue(TimeUtils.duration(2*365 + 10).equals("2 years")); assertTrue(TimeUtils.duration(2*365 + 15).equals("2 years, 1 month")); assertTrue(TimeUtils.duration(2*365 + 30).equals("2 years, 1 month")); assertTrue(TimeUtils.duration(2*365 + 44).equals("2 years, 1 month")); assertTrue(TimeUtils.duration(2*365 + 45).equals("2 years, 2 months")); assertTrue(TimeUtils.duration(2*365 + 60).equals("2 years, 2 months")); } public void testTimeAgo() throws Exception { long time = System.currentTimeMillis(); assertTrue(TimeUtils.timeAgo(new Date(time - 1*TimeUtils.MIN)).equals("1 min ago")); assertTrue(TimeUtils.timeAgo(new Date(time - 60*TimeUtils.MIN)).equals("60 mins ago")); assertTrue(TimeUtils.timeAgo(new Date(time - 120*TimeUtils.MIN)).equals("2 hours ago")); assertTrue(TimeUtils.timeAgo(new Date(time - 15*TimeUtils.ONEHOUR)).equals("15 hours ago")); assertTrue(TimeUtils.timeAgo(new Date(time - 24*TimeUtils.ONEHOUR)).equals("yesterday")); assertTrue(TimeUtils.timeAgo(new Date(time - 2*TimeUtils.ONEDAY)).equals("2 days ago")); assertTrue(TimeUtils.timeAgo(new Date(time - 35*TimeUtils.ONEDAY)).equals("5 weeks ago")); assertTrue(TimeUtils.timeAgo(new Date(time - 84*TimeUtils.ONEDAY)).equals("3 months ago")); assertTrue(TimeUtils.timeAgo(new Date(time - 95*TimeUtils.ONEDAY)).equals("3 months ago")); assertTrue(TimeUtils.timeAgo(new Date(time - 104*TimeUtils.ONEDAY)).equals("4 months ago")); assertTrue(TimeUtils.timeAgo(new Date(time - 365*TimeUtils.ONEDAY)).equals("1 year ago")); assertTrue(TimeUtils.timeAgo(new Date(time - 395*TimeUtils.ONEDAY)).equals("13 months ago")); assertTrue(TimeUtils.timeAgo(new Date(time - (2*365 + 30)*TimeUtils.ONEDAY)).equals("2 years ago")); assertTrue(TimeUtils.timeAgoCss(new Date(time - 1*TimeUtils.MIN)).equals("age0")); assertTrue(TimeUtils.timeAgoCss(new Date(time - 60*TimeUtils.MIN)).equals("age0")); assertTrue(TimeUtils.timeAgoCss(new Date(time - 120*TimeUtils.MIN)).equals("age1")); assertTrue(TimeUtils.timeAgoCss(new Date(time - 24*TimeUtils.ONEHOUR)).equals("age1")); assertTrue(TimeUtils.timeAgoCss(new Date(time - 2*TimeUtils.ONEDAY)).equals("age2")); } }