Browse Source

Findbugs. CodePro Audit. Checkstyle. Unit test refactoring.

tags/v0.5.0
James Moger 13 years ago
parent
commit
2a7306a1d9
80 changed files with 1839 additions and 1038 deletions
  1. 10
    0
      .checkstyle
  2. 6
    0
      .classpath
  3. 2
    1
      .gitignore
  4. 6
    0
      .project
  5. 16
    0
      NOTICE
  6. 6
    4
      build.xml
  7. 109
    0
      checkstyle.xml
  8. 1
    1
      distrib/gitblit.properties
  9. 4
    0
      docs/00_index.mkd
  10. 1
    0
      docs/page_footer.html
  11. 155
    69
      src/com/gitblit/Build.java
  12. 16
    11
      src/com/gitblit/BuildSite.java
  13. 12
    20
      src/com/gitblit/Constants.java
  14. 25
    16
      src/com/gitblit/DownloadZipServlet.java
  15. 19
    6
      src/com/gitblit/FileSettings.java
  16. 61
    28
      src/com/gitblit/GitBlit.java
  17. 84
    65
      src/com/gitblit/GitBlitServer.java
  18. 21
    11
      src/com/gitblit/GitBlitServlet.java
  19. 9
    9
      src/com/gitblit/ILoginService.java
  20. 8
    8
      src/com/gitblit/IStoredSettings.java
  21. 44
    25
      src/com/gitblit/JettyLoginService.java
  22. 25
    23
      src/com/gitblit/Launcher.java
  23. 47
    32
      src/com/gitblit/MakeCertificate.java
  24. 3
    3
      src/com/gitblit/WebXmlSettings.java
  25. 0
    145
      src/com/gitblit/tests/JGitUtilsTest.java
  26. 2
    3
      src/com/gitblit/utils/ByteFormat.java
  27. 9
    6
      src/com/gitblit/utils/GitBlitDiffFormatter.java
  28. 4
    2
      src/com/gitblit/utils/GitWebDiffFormatter.java
  29. 75
    52
      src/com/gitblit/utils/JGitUtils.java
  30. 7
    4
      src/com/gitblit/utils/MarkdownUtils.java
  31. 20
    13
      src/com/gitblit/utils/PatchFormatter.java
  32. 6
    5
      src/com/gitblit/utils/StringUtils.java
  33. 31
    20
      src/com/gitblit/utils/TimeUtils.java
  34. 13
    11
      src/com/gitblit/wicket/AuthorizationStrategy.java
  35. 10
    6
      src/com/gitblit/wicket/BasePage.java
  36. 34
    24
      src/com/gitblit/wicket/GitBlitWebApp.java
  37. 0
    4
      src/com/gitblit/wicket/GitBlitWebApp.properties
  38. 7
    7
      src/com/gitblit/wicket/GitBlitWebSession.java
  39. 7
    4
      src/com/gitblit/wicket/LinkPanel.java
  40. 5
    4
      src/com/gitblit/wicket/LoginPage.java
  41. 67
    38
      src/com/gitblit/wicket/RepositoryPage.java
  42. 32
    17
      src/com/gitblit/wicket/WicketUtils.java
  43. 29
    4
      src/com/gitblit/wicket/models/PathModel.java
  44. 17
    11
      src/com/gitblit/wicket/models/RefModel.java
  45. 3
    1
      src/com/gitblit/wicket/models/RepositoryModel.java
  46. 30
    2
      src/com/gitblit/wicket/models/TicketModel.java
  47. 5
    28
      src/com/gitblit/wicket/models/UserModel.java
  48. 15
    8
      src/com/gitblit/wicket/pages/BlobDiffPage.java
  49. 14
    10
      src/com/gitblit/wicket/pages/BlobPage.java
  50. 19
    10
      src/com/gitblit/wicket/pages/CommitDiffPage.java
  51. 34
    17
      src/com/gitblit/wicket/pages/CommitPage.java
  52. 11
    7
      src/com/gitblit/wicket/pages/DocsPage.java
  53. 23
    16
      src/com/gitblit/wicket/pages/EditRepositoryPage.java
  54. 22
    14
      src/com/gitblit/wicket/pages/EditUserPage.java
  55. 20
    7
      src/com/gitblit/wicket/pages/HistoryPage.java
  56. 21
    8
      src/com/gitblit/wicket/pages/LogPage.java
  57. 9
    6
      src/com/gitblit/wicket/pages/MarkdownPage.java
  58. 6
    8
      src/com/gitblit/wicket/pages/PatchPage.java
  59. 4
    3
      src/com/gitblit/wicket/pages/RawPage.java
  60. 8
    7
      src/com/gitblit/wicket/pages/RepositoriesPage.java
  61. 22
    9
      src/com/gitblit/wicket/pages/SearchPage.java
  62. 27
    15
      src/com/gitblit/wicket/pages/SummaryPage.java
  63. 10
    5
      src/com/gitblit/wicket/pages/TagPage.java
  64. 7
    4
      src/com/gitblit/wicket/pages/TicketPage.java
  65. 9
    5
      src/com/gitblit/wicket/pages/TicketsPage.java
  66. 34
    14
      src/com/gitblit/wicket/pages/TreePage.java
  67. 5
    3
      src/com/gitblit/wicket/panels/BasePanel.java
  68. 18
    9
      src/com/gitblit/wicket/panels/BranchesPanel.java
  69. 3
    2
      src/com/gitblit/wicket/panels/CommitHeaderPanel.java
  70. 6
    5
      src/com/gitblit/wicket/panels/CommitLegendPanel.java
  71. 27
    13
      src/com/gitblit/wicket/panels/HistoryPanel.java
  72. 28
    16
      src/com/gitblit/wicket/panels/LogPanel.java
  73. 8
    6
      src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.java
  74. 11
    5
      src/com/gitblit/wicket/panels/RefsPanel.java
  75. 59
    32
      src/com/gitblit/wicket/panels/RepositoriesPanel.java
  76. 22
    12
      src/com/gitblit/wicket/panels/SearchPanel.java
  77. 30
    13
      src/com/gitblit/wicket/panels/TagsPanel.java
  78. 10
    6
      src/com/gitblit/wicket/panels/UsersPanel.java
  79. 64
    0
      tests/com/gitblit/tests/GitBlitSuite.java
  80. 130
    0
      tests/com/gitblit/tests/JGitUtilsTest.java

+ 10
- 0
.checkstyle View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>

<fileset-config file-format-version="1.2.0" simple-config="true" sync-formatter="false">
<local-check-config name="Gitblit" location="checkstyle.xml" type="project" description="">
<additional-data name="protect-config-file" value="false"/>
</local-check-config>
<fileset name="all" enabled="true" check-config-name="Gitblit" local="true">
<file-match-pattern match-pattern="." include-pattern="true"/>
</fileset>
</fileset-config>

+ 6
- 0
.classpath View File

@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="tests"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
<classpathentry kind="lib" path="ext/log4j-1.2.16.jar" sourcepath="ext/log4j-1.2.16-sources.jar">
<attributes>
@@ -74,5 +75,10 @@
<attribute name="javadoc_location" value="jar:platform:/resource/gitblit/ext/jetty-all-7.2.2.v20101205-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry kind="lib" path="ext/jsch-0.1.44-1.jar" sourcepath="ext/jsch-0.1.44-1-sources.jar">
<attributes>
<attribute name="javadoc_location" value="jar:platform:/resource/gitblit/ext/jsch-0.1.44-1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="bin"/>
</classpath>

+ 2
- 1
.gitignore View File

@@ -6,4 +6,5 @@
/*.zip
/gitblit.properties
/users.properties
/site
/site
/git

+ 6
- 0
.project View File

@@ -10,8 +10,14 @@
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>net.sf.eclipsecs.core.CheckstyleBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>net.sf.eclipsecs.core.CheckstyleNature</nature>
</natures>
</projectDescription>

+ 16
- 0
NOTICE View File

@@ -87,6 +87,22 @@ BouncyCastle
http://www.bouncycastle.org
---------------------------------------------------------------------------
JSch
---------------------------------------------------------------------------
JSch - Java Secure Channel, released under the
BSD License.
http://www.jcraft.com/jsch
---------------------------------------------------------------------------
JUnit
---------------------------------------------------------------------------
JUnit, released under the
Common Public License.
http://junit.org
---------------------------------------------------------------------------
Fancybox image viewer
---------------------------------------------------------------------------

+ 6
- 4
build.xml View File

@@ -17,11 +17,11 @@
<loadfile property="gb.version" srcfile="${basedir}/src/com/gitblit/Constants.java">
<filterchain>
<linecontains>
<contains value="public final static String VERSION = " />
<contains value="public static final String VERSION = " />
</linecontains>
<striplinebreaks />
<tokenfilter>
<replacestring from="public final static String VERSION = &quot;" to="" />
<replacestring from="public static final String VERSION = &quot;" to="" />
<replacestring from="&quot;;" to="" />
<trim />
</tokenfilter>
@@ -32,11 +32,11 @@
<loadfile property="jgit.version" srcfile="${basedir}/src/com/gitblit/Constants.java">
<filterchain>
<linecontains>
<contains value="public final static String JGIT_VERSION = " />
<contains value="public static final String JGIT_VERSION = " />
</linecontains>
<striplinebreaks />
<tokenfilter>
<replacestring from="public final static String JGIT_VERSION = &quot;" to="" />
<replacestring from="public static final String JGIT_VERSION = &quot;" to="" />
<replacestring from="&quot;;" to="" />
<trim />
</tokenfilter>
@@ -201,5 +201,7 @@
<arg value="%JGIT%=${jgit.version}" />
</java>
<!-- Cleanup -->
<delete dir="${project.build.dir}" />
</target>
</project>

+ 109
- 0
checkstyle.xml View File

@@ -0,0 +1,109 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.3//EN" "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">

<!--
This configuration file was written by the eclipse-cs plugin
configuration editor
-->
<!--
Checkstyle-Configuration: gitblit Description: none
-->
<module name="Checker">
<property name="severity" value="warning" />
<module name="TreeWalker">
<property name="tabWidth" value="4" />
<module name="ConstantName" />
<module name="LocalFinalVariableName" />
<module name="LocalVariableName" />
<module name="MemberName" />
<module name="MethodName" />
<module name="PackageName" />
<module name="ParameterName" />
<module name="StaticVariableName" />
<module name="TypeName" />
<module name="AvoidStarImport" />
<module name="IllegalImport" />
<module name="RedundantImport" />
<module name="UnusedImports" />
<module name="EmptyForIteratorPad" />
<module name="MethodParamPad" />
<module name="NoWhitespaceAfter">
<property name="tokens"
value="BNOT,DEC,DOT,INC,LNOT,UNARY_MINUS,UNARY_PLUS" />
</module>
<module name="NoWhitespaceBefore" />
<module name="OperatorWrap">
<property name="severity" value="ignore" />
<property name="tokens"
value="BAND,BOR,BSR,BXOR,COLON,DIV,EQUAL,GE,GT,LAND,LE,LITERAL_INSTANCEOF,LT,MINUS,MOD,NOT_EQUAL,SL,SR,STAR" />
<metadata name="net.sf.eclipsecs.core.lastEnabledSeverity"
value="inherit" />
</module>
<module name="ParenPad" />
<module name="WhitespaceAfter" />
<module name="WhitespaceAround">
<property name="tokens"
value="ASSIGN,BAND,BAND_ASSIGN,BOR,BOR_ASSIGN,BSR,BSR_ASSIGN,BXOR,BXOR_ASSIGN,DIV_ASSIGN,EQUAL,GE,GT,LAND,LE,LITERAL_ASSERT,LITERAL_CATCH,LITERAL_DO,LITERAL_ELSE,LITERAL_FINALLY,LITERAL_FOR,LITERAL_IF,LITERAL_RETURN,LITERAL_SYNCHRONIZED,LITERAL_TRY,LITERAL_WHILE,LOR,LT,MINUS,MINUS_ASSIGN,MOD,MOD_ASSIGN,NOT_EQUAL,PLUS_ASSIGN,SL,SLIST,SL_ASSIGN,SR,SR_ASSIGN,STAR,STAR_ASSIGN,LITERAL_ASSERT,TYPE_EXTENSION_AND,WILDCARD_TYPE" />
</module>
<module name="ModifierOrder" />
<module name="RedundantModifier" />
<module name="LeftCurly">
<property name="tokens"
value="CTOR_DEF,INTERFACE_DEF,LITERAL_CATCH,LITERAL_DO,LITERAL_ELSE,LITERAL_FINALLY,LITERAL_FOR,LITERAL_IF,LITERAL_SWITCH,LITERAL_SYNCHRONIZED,LITERAL_TRY,LITERAL_WHILE,METHOD_DEF" />
</module>
<module name="NeedBraces" />
<module name="RightCurly" />
<module name="DoubleCheckedLocking" />
<module name="EmptyStatement" />
<module name="EqualsHashCode" />
<module name="IllegalInstantiation" />
<module name="RedundantThrows">
<property name="allowUnchecked" value="true" />
<property name="allowSubclasses" value="true" />
<property name="logLoadErrors" value="true" />
<property name="suppressLoadErrors" value="true" />
</module>
<module name="SimplifyBooleanExpression" />
<module name="SimplifyBooleanReturn" />
<module name="InterfaceIsType" />
<module name="ArrayTypeStyle" />
<module name="GenericIllegalRegexp">
<property name="severity" value="ignore" />
<metadata name="net.sf.eclipsecs.core.lastEnabledSeverity"
value="inherit" />
</module>
<module name="TodoComment">
<property name="severity" value="ignore" />
<metadata name="net.sf.eclipsecs.core.lastEnabledSeverity"
value="inherit" />
</module>
<module name="UpperEll" />
<module name="JavadocType" />
<module name="EmptyForInitializerPad" />
<module name="CovariantEquals" />
<module name="DefaultComesLast" />
<module name="DeclarationOrder" />
<module name="ExplicitInitialization" />
<module name="FallThrough" />
<module name="IllegalThrows" />
<module name="SuperClone" />
<module name="UnnecessaryParentheses" />
<module name="TrailingComment" />
<module name="PackageHtml">
<property name="severity" value="ignore" />
<metadata name="net.sf.eclipsecs.core.lastEnabledSeverity"
value="inherit" />
</module>
</module>
<module name="FileTabCharacter">
<property name="severity" value="ignore" />
<metadata name="net.sf.eclipsecs.core.lastEnabledSeverity"
value="inherit" />
</module>
<module name="NewlineAtEndOfFile">
<property name="severity" value="ignore" />
<metadata name="net.sf.eclipsecs.core.lastEnabledSeverity"
value="inherit" />
</module>
<module name="Translation" />
</module>

+ 1
- 1
distrib/gitblit.properties View File

@@ -7,7 +7,7 @@ git.enableGitServlet = true
# Base folder for repositories
# Use forward slashes even on Windows!!
git.repositoriesFolder = c:/git
git.repositoriesFolder = git
# Export all repositories
# if false, each exported repository must have a .git/git-daemon-export-ok file

+ 4
- 0
docs/00_index.mkd View File

@@ -104,10 +104,14 @@ The following dependencies are automatically downloaded from the Apache Maven re
### Other Build Dependencies
- [Fancybox image viewer](http://fancybox.net) (MIT and GPL dual-licensed)
- [JSch - Java Secure Channel](http://www.jcraft.com/jsch) (BSD)
- [JUnit](http://junit.org) (Common Public License)
## Building
[Eclipse](http://eclipse.org) is recommended for development as the project settings are preconfigured.
Additionally, [Google CodePro AnalytiX](http://code.google.com/javadevtools), [eclipse-cs](http://eclipse-cs.sourceforge.net), and [FindBugs](http://findbugs.sourceforge.net) are recommended development tools.
1. Clone the git repository from [Github][gitbltsrc].
2. Import the gitblit project into your Eclipse workspace.<br/>
*There will be lots of build errors.*

+ 1
- 0
docs/page_footer.html View File

@@ -1,6 +1,7 @@
</div>
<div style="margin-top:10px" class="page_footer">
<div style="float:right;">{0}</div>
The content of this page is licensed under the <a href="http://creativecommons.org/licenses/by/3.0">Creative Commons Attribution 3.0 License</a>.
</div>
</body>
</html>

+ 155
- 69
src/com/gitblit/Build.java View File

@@ -19,6 +19,7 @@ import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
@@ -80,6 +81,9 @@ public class Build {
downloadFromApache(MavenObject.BOUNCYCASTLE, BuildType.COMPILETIME);
downloadFromApache(MavenObject.BOUNCYCASTLE_MAIL, BuildType.COMPILETIME);
downloadFromApache(MavenObject.JSCH, BuildType.RUNTIME);
downloadFromApache(MavenObject.JSCH, BuildType.COMPILETIME);
downloadFromEclipse(MavenObject.JGIT, BuildType.COMPILETIME);
downloadFromEclipse(MavenObject.JGIT_HTTP, BuildType.COMPILETIME);
}
@@ -87,10 +91,20 @@ public class Build {
public static void buildSettingKeys() {
// Load all keys
Properties properties = new Properties();
FileInputStream is = null;
try {
properties.load(new FileInputStream(Constants.PROPERTIES_FILE));
is = new FileInputStream(Constants.PROPERTIES_FILE);
properties.load(is);
} catch (Throwable t) {
t.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (Throwable t) {
// IGNORE
}
}
}
List<String> keys = new ArrayList<String>(properties.stringPropertyNames());
Collections.sort(keys);
@@ -114,13 +128,13 @@ public class Build {
// Assemble Keys source file
StringBuilder sb = new StringBuilder();
sb.append("package com.gitblit;\n");
sb.append("\n");
sb.append('\n');
sb.append("/*\n");
sb.append(" * This class is auto-generated from the properties file.\n");
sb.append(" * Do not version control!\n");
sb.append(" */\n");
sb.append("public final class Keys {\n");
sb.append("\n");
sb.append('\n');
List<String> classSet = new ArrayList<String>(staticClasses.keySet());
Collections.sort(classSet);
for (String clazz : classSet) {
@@ -128,27 +142,31 @@ public class Build {
if (clazz.equals("")) {
// root keys
for (String key : keySet) {
sb.append(MessageFormat.format("\tpublic static final String {0} = \"{1}\";\n\n", key.replace('.', '_'), key));
sb.append(MessageFormat.format(
"\tpublic static final String {0} = \"{1}\";\n\n",
key.replace('.', '_'), key));
}
} else {
// class keys
sb.append(MessageFormat.format("\tpublic static final class {0} '{'\n\n", clazz));
sb.append(MessageFormat.format("\t\tpublic static final String _ROOT = \"{0}\";\n\n", clazz));
sb.append(MessageFormat.format(
"\t\tpublic static final String _ROOT = \"{0}\";\n\n", clazz));
for (String key : keySet) {
sb.append(MessageFormat.format("\t\tpublic static final String {0} = \"{1}\";\n\n", key.replace('.', '_'), clazz + "." + key));
sb.append(MessageFormat.format(
"\t\tpublic static final String {0} = \"{1}\";\n\n",
key.replace('.', '_'), clazz + "." + key));
}
sb.append("\t}\n\n");
}
}
sb.append("}");
sb.append('}');
// Save Keys class definition
try {
File file = new File("src/com/gitblit/Keys.java");
file.delete();
RandomAccessFile raf = new RandomAccessFile(file, "rw");
raf.writeBytes(sb.toString());
raf.close();
FileWriter fw = new FileWriter(file, false);
fw.write(sb.toString());
fw.close();
} catch (Throwable t) {
t.printStackTrace();
}
@@ -217,7 +235,7 @@ public class Build {
byte[] buffer = new byte[4096];
int downloadedLen = 0;
float lastProgress = 0f;
updateDownload(0, targetFile);
while (true) {
int len = in.read(buffer);
@@ -234,7 +252,7 @@ public class Build {
}
in.close();
updateDownload(1f, targetFile);
} catch (IOException e) {
throw new RuntimeException("Error downloading " + mavenURL + " to " + targetFile, e);
}
@@ -263,7 +281,7 @@ public class Build {
}
return downloads;
}
private static void updateDownload(float progress, File file) {
updateProgress(progress, "d/l: " + file.getName());
}
@@ -273,72 +291,140 @@ public class Build {
int width = Math.round(anim.length() * progress);
System.out.print("\r[");
System.out.print(anim.substring(0, width));
for (int i = 0; (i < anim.length() - width); i++) {
System.out.print(" ");
for (int i = 0; i < anim.length() - width; i++) {
System.out.print(' ');
}
System.out.print("] " + url);
}
private static class MavenObject {
public static final MavenObject JCOMMANDER = new MavenObject("jCommander", "com/beust", "jcommander", "1.17", 34000, 32000, 141000, "219a3540f3b27d7cc3b1d91d6ea046cd8723290e", "0bb50eec177acf0e94d58e0cf07262fe5164331d", "c7adc475ca40c288c93054e0f4fe58f3a98c0cb5");
public static final MavenObject JETTY = new MavenObject("Jetty", "org/eclipse/jetty/aggregate", "jetty-all", "7.4.1.v20110513", 1500000, 1000000, 4100000, "1e2de9ed25a7c6ae38717d5ffdc7cfcd6be4bd46", "7b6279d16ce8f663537d9faf55ea353e748dbbaa", "fa06212e751296f1a7abc15c843b135bf49a112b");
public static final MavenObject SERVLET = new MavenObject("Servlet 2.5", "javax/servlet", "servlet-api", "2.5", 105000, 158000, 0, "5959582d97d8b61f4d154ca9e495aafd16726e34", "021599814ad9a605b86f3e6381571beccd861a32", null);
public static final MavenObject SLF4JAPI = new MavenObject("SLF4J API", "org/slf4j", "slf4j-api", "1.6.1", 25500, 45000, 182000, "6f3b8a24bf970f17289b234284c94f43eb42f0e4", "46a386136c901748e6a3af67ebde6c22bc6b4524", "e223571d77769cdafde59040da235842f3326453");
public static final MavenObject SLF4LOG4J = new MavenObject("SLF4J LOG4J", "org/slf4j", "slf4j-log4j12", "1.6.1", 9800, 9500, 52400, "bd245d6746cdd4e6203e976e21d597a46f115802", "7a26b08b265f55622fa1fed3bda68bbd37a465ba", "6e4b16bce7994e3692e82002f322a0dd2f32741e");
public static final MavenObject LOG4J = new MavenObject("Apache LOG4J", "log4j", "log4j", "1.2.16", 481000, 471000, 1455000, "7999a63bfccbc7c247a9aea10d83d4272bd492c6", "bf945d1dc995be7fe64923625f842fbb6bf443be", "78aa1cbf0fa3b259abdc7d87f9f6788d785aac2a");
public static final MavenObject WICKET = new MavenObject("Apache Wicket", "org/apache/wicket", "wicket", "1.4.17", 1960000, 1906000, 6818000, "39815e37a6f56465b2d2c3d3017c4f3bf17db50a", "a792ebae4123253ffd039c3be49e773f8622f94e", "f2f244ca72d10081529b017e89d6276eab62c621");
public static final MavenObject WICKET_EXT = new MavenObject("Apache Wicket Extensions", "org/apache/wicket", "wicket-extensions", "1.4.17", 1180000, 1118000, 1458000, "01111d0dbffdc425581b006a43864c22797ce72a", "f194f40ea6e361bb745dfa22e2f9171eb63a9355", "bd42e5ba9444a426bb2d7cacce91c6033b663b57");
public static final MavenObject WICKET_AUTH_ROLES = new MavenObject("Apache Wicket Auth Roles", "org/apache/wicket", "wicket-auth-roles", "1.4.17", 44000, 45000, 166000, "86d20ff32f62d3026213ff11a78555da643bc676", "37e815350a2d6b97734b250a8a03d8bf3712bba7", "ac3896368bfb372d178041a4ac3ee2c44f62e21c");
public static final MavenObject WICKET_GOOGLE_CHARTS = new MavenObject("Apache Wicket Google Charts Add-On", "org/wicketstuff", "googlecharts", "1.4.17", 34000, 18750, 161000, "c567b98b0c5efe4147e77ef2d0d3c2d45c49dea5", "3d32d958b2f7aa58388af5701ea3aafc433e573f", "c37518b67ea85af485dd61fe854137eeacc50318");
public static final MavenObject JUNIT = new MavenObject("JUnit", "junit", "junit", "3.8.2", 120000, 0, 0, "07e4cde26b53a9a0e3fe5b00d1dbbc7cc1d46060", "", "");
public static final MavenObject MARKDOWNPAPERS = new MavenObject("MarkdownPapers", "org/tautua/markdownpapers", "markdownpapers-core", "1.0.0", 87000, 58000, 278000, "feda63bd149f3315da210e397d45d02277038ad5", "a9a6c4d163af81e265a15138fcaeafa9829c6054", "f932656266a7f9593488d3f89e815d0af44d0853");
public static final MavenObject BOUNCYCASTLE = new MavenObject("BouncyCastle", "org/bouncycastle", "bcprov-jdk16", "1.46", 1900000, 1400000, 4670000, "ce091790943599535cbb4de8ede84535b0c1260c", "d2b70567594225923450d7e3f80cd022c852725e", "873a6fe765f33fc27df498a5d1f5bf077e503b2f");
public static final MavenObject JCOMMANDER = new MavenObject("jCommander", "com/beust",
"jcommander", "1.17", 34000, 32000, 141000,
"219a3540f3b27d7cc3b1d91d6ea046cd8723290e",
"0bb50eec177acf0e94d58e0cf07262fe5164331d",
"c7adc475ca40c288c93054e0f4fe58f3a98c0cb5");
public static final MavenObject JETTY = new MavenObject("Jetty",
"org/eclipse/jetty/aggregate", "jetty-all", "7.4.1.v20110513", 1500000, 1000000,
4100000, "1e2de9ed25a7c6ae38717d5ffdc7cfcd6be4bd46",
"7b6279d16ce8f663537d9faf55ea353e748dbbaa",
"fa06212e751296f1a7abc15c843b135bf49a112b");
public static final MavenObject SERVLET = new MavenObject("Servlet 2.5", "javax/servlet",
"servlet-api", "2.5", 105000, 158000, 0,
"5959582d97d8b61f4d154ca9e495aafd16726e34",
"021599814ad9a605b86f3e6381571beccd861a32", null);
public static final MavenObject SLF4JAPI = new MavenObject("SLF4J API", "org/slf4j",
"slf4j-api", "1.6.1", 25500, 45000, 182000,
"6f3b8a24bf970f17289b234284c94f43eb42f0e4",
"46a386136c901748e6a3af67ebde6c22bc6b4524",
"e223571d77769cdafde59040da235842f3326453");
public static final MavenObject SLF4LOG4J = new MavenObject("SLF4J LOG4J", "org/slf4j",
"slf4j-log4j12", "1.6.1", 9800, 9500, 52400,
"bd245d6746cdd4e6203e976e21d597a46f115802",
"7a26b08b265f55622fa1fed3bda68bbd37a465ba",
"6e4b16bce7994e3692e82002f322a0dd2f32741e");
public static final MavenObject LOG4J = new MavenObject("Apache LOG4J", "log4j", "log4j",
"1.2.16", 481000, 471000, 1455000, "7999a63bfccbc7c247a9aea10d83d4272bd492c6",
"bf945d1dc995be7fe64923625f842fbb6bf443be",
"78aa1cbf0fa3b259abdc7d87f9f6788d785aac2a");
public static final MavenObject WICKET = new MavenObject("Apache Wicket",
"org/apache/wicket", "wicket", "1.4.17", 1960000, 1906000, 6818000,
"39815e37a6f56465b2d2c3d3017c4f3bf17db50a",
"a792ebae4123253ffd039c3be49e773f8622f94e",
"f2f244ca72d10081529b017e89d6276eab62c621");
public static final MavenObject WICKET_EXT = new MavenObject("Apache Wicket Extensions",
"org/apache/wicket", "wicket-extensions", "1.4.17", 1180000, 1118000, 1458000,
"01111d0dbffdc425581b006a43864c22797ce72a",
"f194f40ea6e361bb745dfa22e2f9171eb63a9355",
"bd42e5ba9444a426bb2d7cacce91c6033b663b57");
public static final MavenObject WICKET_AUTH_ROLES = new MavenObject(
"Apache Wicket Auth Roles", "org/apache/wicket", "wicket-auth-roles", "1.4.17",
44000, 45000, 166000, "86d20ff32f62d3026213ff11a78555da643bc676",
"37e815350a2d6b97734b250a8a03d8bf3712bba7",
"ac3896368bfb372d178041a4ac3ee2c44f62e21c");
public static final MavenObject WICKET_GOOGLE_CHARTS = new MavenObject(
"Apache Wicket Google Charts Add-On", "org/wicketstuff", "googlecharts", "1.4.17",
34000, 18750, 161000, "c567b98b0c5efe4147e77ef2d0d3c2d45c49dea5",
"3d32d958b2f7aa58388af5701ea3aafc433e573f",
"c37518b67ea85af485dd61fe854137eeacc50318");
public static final MavenObject JUNIT = new MavenObject("JUnit", "junit", "junit", "3.8.2",
120000, 0, 0, "07e4cde26b53a9a0e3fe5b00d1dbbc7cc1d46060", "", "");
public static final MavenObject MARKDOWNPAPERS = new MavenObject("MarkdownPapers",
"org/tautua/markdownpapers", "markdownpapers-core", "1.0.0", 87000, 58000, 278000,
"feda63bd149f3315da210e397d45d02277038ad5",
"a9a6c4d163af81e265a15138fcaeafa9829c6054",
"f932656266a7f9593488d3f89e815d0af44d0853");
public static final MavenObject BOUNCYCASTLE = new MavenObject("BouncyCastle",
"org/bouncycastle", "bcprov-jdk16", "1.46", 1900000, 1400000, 4670000,
"ce091790943599535cbb4de8ede84535b0c1260c",
"d2b70567594225923450d7e3f80cd022c852725e",
"873a6fe765f33fc27df498a5d1f5bf077e503b2f");
public static final MavenObject BOUNCYCASTLE_MAIL = new MavenObject("BouncyCastle Mail",
"org/bouncycastle", "bcmail-jdk16", "1.46", 502000, 420000, 482000,
"08a9233bfd6ad38ea32df5e6ff91035b650584b9",
"3ebd62bc56854767512dc5deec0a17795f2e671d",
"3b7c5f3938f202311bdca0bf7ed46bc0118af081");
public static final MavenObject JGIT = new MavenObject("JGit", "org/eclipse/jgit",
"org.eclipse.jgit", "0.12.1", 1318000, 1354000, 2993000,
"fd77699699b9651d2fc31c7ed63af98b14fc1975",
"c8b3d84922c7802cfe6a661e13a002641a78583d",
"5609aa3ce3ac3d52030befd27ddd2941f6c07570");
public static final MavenObject JGIT_HTTP = new MavenObject("JGit", "org/eclipse/jgit",
"org.eclipse.jgit.http.server", "0.12.1", 68000, 62000, 99000,
"384058ca906dffb8b8708c2db8849c9754359b28",
"7b026658ed8de2eccc2d11d647d43d7c84a56911",
"6c19e37b3caafd70c1b7b024ae1858c725181688");
public static final MavenObject BOUNCYCASTLE_MAIL = new MavenObject("BouncyCastle Mail", "org/bouncycastle", "bcmail-jdk16", "1.46", 502000, 420000, 482000, "08a9233bfd6ad38ea32df5e6ff91035b650584b9", "3ebd62bc56854767512dc5deec0a17795f2e671d", "3b7c5f3938f202311bdca0bf7ed46bc0118af081");
public static final MavenObject JGIT = new MavenObject("JGit", "org/eclipse/jgit", "org.eclipse.jgit", "0.12.1", 1318000, 1354000, 2993000, "fd77699699b9651d2fc31c7ed63af98b14fc1975", "c8b3d84922c7802cfe6a661e13a002641a78583d", "5609aa3ce3ac3d52030befd27ddd2941f6c07570");
public static final MavenObject JGIT_HTTP = new MavenObject("JGit", "org/eclipse/jgit", "org.eclipse.jgit.http.server", "0.12.1", 68000, 62000, 99000, "384058ca906dffb8b8708c2db8849c9754359b28", "7b026658ed8de2eccc2d11d647d43d7c84a56911", "6c19e37b3caafd70c1b7b024ae1858c725181688");
public static final MavenObject JSCH = new MavenObject("JSch", "com/jcraft",
"jsch", "0.1.44-1", 214000, 211000, 413000,
"2e9ae08de5a71bd0e0d3ba2558598181bfa71d4e",
"e528f593b19b04d500992606f58b87fcfded8883",
"d0ffadd0a4ab909d94a577b5aad43c13b617ddcb");
public final String name;
public final String group;
public final String artifact;
public final String version;
public final int len_library;
public final int len_sources;
public final int len_javadoc;
public final String sha1_library;
public final String sha1_sources;
public final String sha1_javadoc;
private MavenObject(String name, String group, String artifact, String version, int len_library, int len_sources, int len_javadoc, String sha1_library, String sha1_sources, String sha1_javadoc) {
public final int approxLibraryLen;
public final int approxSourcesLen;
public final int approxJavadocLen;
public final String librarySHA1;
public final String sourcesSHA1;
public final String javadocSHA1;
private MavenObject(String name, String group, String artifact, String version,
int approxLibraryLen, int approxSourcesLen, int approxJavadocLen,
String librarySHA1, String sourcesSHA1, String javadocSHA1) {
this.name = name;
this.group = group;
this.artifact = artifact;
this.version = version;
this.len_library = len_library;
this.len_sources = len_sources;
this.len_javadoc = len_javadoc;
this.sha1_library = sha1_library;
this.sha1_sources = sha1_sources;
this.sha1_javadoc = sha1_javadoc;
this.approxLibraryLen = approxLibraryLen;
this.approxSourcesLen = approxSourcesLen;
this.approxJavadocLen = approxJavadocLen;
this.librarySHA1 = librarySHA1;
this.sourcesSHA1 = sourcesSHA1;
this.javadocSHA1 = javadocSHA1;
}
private String getRepositoryPath(String jar) {
return group + "/" + artifact + "/" + version + "/" + artifact + "-" + version + jar + ".jar";
return group + "/" + artifact + "/" + version + "/" + artifact + "-" + version + jar
+ ".jar";
}
private File getLocalFile(String basePath, String jar) {
@@ -347,24 +433,24 @@ public class Build {
private String getSHA1(String jar) {
if (jar.equals("")) {
return sha1_library;
return librarySHA1;
} else if (jar.equals("-sources")) {
return sha1_sources;
return sourcesSHA1;
} else if (jar.equals("-javadoc")) {
return sha1_javadoc;
return javadocSHA1;
}
return sha1_library;
return librarySHA1;
}
private int getApproximateLength(String jar) {
if (jar.equals("")) {
return len_library;
return approxLibraryLen;
} else if (jar.equals("-sources")) {
return len_sources;
return approxSourcesLen;
} else if (jar.equals("-javadoc")) {
return len_javadoc;
return approxJavadocLen;
}
return len_library;
return approxLibraryLen;
}
@Override

+ 16
- 11
src/com/gitblit/BuildSite.java View File

@@ -66,7 +66,8 @@ public class BuildSite {
aliasMap.put(values[0], values[1]);
}
System.out.println(MessageFormat.format("Generating site from {0} Markdown Docs in {1} ", markdownFiles.length, sourceFolder.getAbsolutePath()));
System.out.println(MessageFormat.format("Generating site from {0} Markdown Docs in {1} ",
markdownFiles.length, sourceFolder.getAbsolutePath()));
String linkPattern = "<a href=''{0}''>{1}</a>";
StringBuilder sb = new StringBuilder();
for (File file : markdownFiles) {
@@ -82,24 +83,26 @@ public class BuildSite {
sb.setLength(sb.length() - 3);
sb.trimToSize();
String html_header = readContent(new File(params.pageHeader));
String html_footer = readContent(new File(params.pageFooter));
String htmlHeader = readContent(new File(params.pageHeader));
String htmlFooter = readContent(new File(params.pageFooter));
final String links = sb.toString();
final String header = MessageFormat.format(html_header, Constants.FULL_NAME, links);
final String header = MessageFormat.format(htmlHeader, Constants.FULL_NAME, links);
final String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
final String footer = MessageFormat.format(html_footer, "generated " + date);
final String footer = MessageFormat.format(htmlFooter, "generated " + date);
for (File file : markdownFiles) {
try {
String documentName = getDocumentName(file);
String fileName = documentName + ".html";
System.out.println(MessageFormat.format(" {0} => {1}", file.getName(), fileName));
InputStreamReader reader = new InputStreamReader(new FileInputStream(file), Charset.forName("UTF-8"));
InputStreamReader reader = new InputStreamReader(new FileInputStream(file),
Charset.forName("UTF-8"));
String content = MarkdownUtils.transformMarkdown(reader);
for (String token : params.substitutions) {
String [] kv = token.split("=");
String[] kv = token.split("=");
content = content.replace(kv[0], kv[1]);
}
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(new File(destinationFolder, fileName)), Charset.forName("UTF-8"));
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(new File(
destinationFolder, fileName)), Charset.forName("UTF-8"));
writer.write(header);
writer.write(content);
writer.write(footer);
@@ -115,7 +118,8 @@ public class BuildSite {
private static String readContent(File file) {
StringBuilder sb = new StringBuilder();
try {
InputStreamReader is = new InputStreamReader(new FileInputStream(file), Charset.forName("UTF-8"));
InputStreamReader is = new InputStreamReader(new FileInputStream(file),
Charset.forName("UTF-8"));
BufferedReader reader = new BufferedReader(is);
String line = null;
while ((line = reader.readLine()) != null) {
@@ -130,13 +134,14 @@ public class BuildSite {
}
private static String getDocumentName(File file) {
String displayName = file.getName().substring(0, file.getName().lastIndexOf('.')).toLowerCase();
String displayName = file.getName().substring(0, file.getName().lastIndexOf('.'))
.toLowerCase();
// trim leading ##_ which is to control display order
return displayName.substring(3);
}
private static void usage(JCommander jc, ParameterException t) {
System.out.println(Constants.getRunningVersion());
System.out.println(Constants.getGitBlitVersion());
System.out.println();
if (t != null) {
System.out.println(t.getMessage());

+ 12
- 20
src/com/gitblit/Constants.java View File

@@ -17,25 +17,25 @@ package com.gitblit;
public class Constants {
public final static String NAME = "Gitblit";
public final static String FULL_NAME = "Gitblit - a pure Java Git solution";
public static final String NAME = "Gitblit";
public static final String FULL_NAME = "Gitblit - a pure Java Git solution";
// The build script extracts this exact line so be careful editing it
// and only use A-Z a-z 0-9 .-_ in the string.
public final static String VERSION = "0.1.0-SNAPSHOT";
// and only use A-Z a-z 0-9 .-_ in the string.
public static final String VERSION = "0.1.0-SNAPSHOT";
// The build script extracts this exact line so be careful editing it
// and only use A-Z a-z 0-9 .-_ in the string.
public final static String JGIT_VERSION = "JGit 0.12.1";
public static final String JGIT_VERSION = "JGit 0.12.1";
public static final String ADMIN_ROLE = "#admin";
public static final String PROPERTIES_FILE = "gitblit.properties";
public final static String ADMIN_ROLE = "#admin";
public static final String GIT_SERVLET_PATH = "/git/";
public final static String PROPERTIES_FILE = "gitblit.properties";
public final static String GIT_SERVLET_PATH = "/git/";
public final static String ZIP_SERVLET_PATH = "/zip/";
public static final String ZIP_SERVLET_PATH = "/zip/";
public static enum AccessRestrictionType {
NONE, PUSH, CLONE, VIEW;
@@ -65,12 +65,4 @@ public class Constants {
public static String getGitBlitVersion() {
return NAME + " v" + VERSION;
}
public static String getJGitVersion() {
return JGIT_VERSION;
}
public static String getRunningVersion() {
return getGitBlitVersion();
}
}

+ 25
- 16
src/com/gitblit/DownloadZipServlet.java View File

@@ -32,30 +32,24 @@ import com.gitblit.wicket.models.RepositoryModel;
public class DownloadZipServlet extends HttpServlet {
public static String asLink(String baseURL, String repository, String objectId, String path) {
return baseURL + (baseURL.endsWith("/") ? "" : "/") + "zip?r=" + repository + (path == null ? "" : ("&p=" + path)) + (objectId == null ? "" : ("&h=" + objectId));
}
private static final long serialVersionUID = 1L;
private final static Logger logger = LoggerFactory.getLogger(DownloadZipServlet.class);
private transient Logger logger = LoggerFactory.getLogger(DownloadZipServlet.class);
public DownloadZipServlet() {
super();
}
@Override
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
processRequest(request, response);
}
@Override
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
processRequest(request, response);
public static String asLink(String baseURL, String repository, String objectId, String path) {
return baseURL + (baseURL.endsWith("/") ? "" : "/") + "zip?r=" + repository
+ (path == null ? "" : ("&p=" + path))
+ (objectId == null ? "" : ("&h=" + objectId));
}
private void processRequest(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
if (!GitBlit.self().settings().getBoolean(Keys.web.allowZipDownloads, true)) {
private void processRequest(javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException,
java.io.IOException {
if (!GitBlit.getBoolean(Keys.web.allowZipDownloads, true)) {
logger.warn("Zip downloads are disabled");
response.sendError(HttpServletResponse.SC_FORBIDDEN);
return;
@@ -96,7 +90,8 @@ public class DownloadZipServlet extends HttpServlet {
String contentType = "application/octet-stream";
response.setContentType(contentType + "; charset=" + response.getCharacterEncoding());
// response.setContentLength(attachment.getFileSize());
response.setHeader("Content-Disposition", "attachment; filename=\"" + name + ".zip" + "\"");
response.setHeader("Content-Disposition", "attachment; filename=\"" + name + ".zip"
+ "\"");
response.setDateHeader("Last-Modified", date.getTime());
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
@@ -112,4 +107,18 @@ public class DownloadZipServlet extends HttpServlet {
logger.error("Failed to write attachment to client", t);
}
}
@Override
protected void doPost(javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException,
java.io.IOException {
processRequest(request, response);
}
@Override
protected void doGet(javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException,
java.io.IOException {
processRequest(request, response);
}
}

+ 19
- 6
src/com/gitblit/FileSettings.java View File

@@ -21,6 +21,7 @@ import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.regex.PatternSyntaxException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -31,11 +32,11 @@ import org.slf4j.LoggerFactory;
*/
public class FileSettings implements IStoredSettings {
private Properties properties = new Properties();
private final Logger logger = LoggerFactory.getLogger(FileSettings.class);
private long lastread = 0;
private Properties properties = new Properties();
private final Logger logger = LoggerFactory.getLogger(FileSettings.class);
private long lastread;
@Override
public List<String> getAllKeys(String startingWith) {
@@ -131,7 +132,8 @@ public class FileSettings implements IStoredSettings {
strings.add(chunk);
}
}
} catch (Exception e) {
} catch (PatternSyntaxException e) {
logger.error("Failed to parse " + value, e);
}
return strings;
}
@@ -139,18 +141,29 @@ public class FileSettings implements IStoredSettings {
private synchronized Properties read() {
File file = new File(Constants.PROPERTIES_FILE);
if (file.exists() && (file.lastModified() > lastread)) {
FileInputStream is = null;
try {
properties = new Properties();
properties.load(new FileInputStream(Constants.PROPERTIES_FILE));
is = new FileInputStream(Constants.PROPERTIES_FILE);
properties.load(is);
lastread = file.lastModified();
} catch (FileNotFoundException f) {
// IGNORE - won't happen because file.exists() check above
} catch (Throwable t) {
t.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (Throwable t) {
// IGNORE
}
}
}
}
return properties;
}
@Override
public String toString() {
return new File(Constants.PROPERTIES_FILE).getAbsolutePath();

+ 61
- 28
src/com/gitblit/GitBlit.java View File

@@ -42,7 +42,7 @@ import com.gitblit.wicket.models.UserModel;
public class GitBlit implements ServletContextListener {
private final static GitBlit gitblit;
private static final GitBlit GITBLIT;
private final Logger logger = LoggerFactory.getLogger(GitBlit.class);
@@ -57,18 +57,34 @@ public class GitBlit implements ServletContextListener {
private IStoredSettings storedSettings;
static {
gitblit = new GitBlit();
GITBLIT = new GitBlit();
}
private GitBlit() {
}
public static GitBlit self() {
return gitblit;
return GITBLIT;
}
private GitBlit() {
public static boolean getBoolean(String key, boolean defaultValue) {
return GITBLIT.storedSettings.getBoolean(key, defaultValue);
}
public static int getInteger(String key, int defaultValue) {
return GITBLIT.storedSettings.getInteger(key, defaultValue);
}
public static String getString(String key, String defaultValue) {
return GITBLIT.storedSettings.getString(key, defaultValue);
}
public IStoredSettings settings() {
return storedSettings;
public static List<String> getStrings(String key) {
return GITBLIT.storedSettings.getStrings(key);
}
public static List<String> getAllKeys(String startingWith) {
return GITBLIT.storedSettings.getAllKeys(startingWith);
}
public boolean isDebugMode() {
@@ -117,14 +133,16 @@ public class GitBlit implements ServletContextListener {
return loginService.setUsernamesForRole(repository.name, repositoryUsers);
}
public void editUserModel(String username, UserModel user, boolean isCreate) throws GitBlitException {
public void editUserModel(String username, UserModel user, boolean isCreate)
throws GitBlitException {
if (!loginService.updateUserModel(username, user)) {
throw new GitBlitException(isCreate ? "Failed to add user!" : "Failed to update user!");
}
}
public List<String> getRepositoryList() {
return JGitUtils.getRepositoryList(repositoriesFolder, exportAll, storedSettings.getBoolean(Keys.git.nestedRepositories, true));
return JGitUtils.getRepositoryList(repositoriesFolder, exportAll,
storedSettings.getBoolean(Keys.git.nestedRepositories, true));
}
public Repository getRepository(String repositoryName) {
@@ -133,7 +151,8 @@ public class GitBlit implements ServletContextListener {
r = repositoryResolver.open(null, repositoryName);
} catch (RepositoryNotFoundException e) {
r = null;
logger.error("GitBlit.getRepository(String) failed to find repository " + repositoryName);
logger.error("GitBlit.getRepository(String) failed to find repository "
+ repositoryName);
} catch (ServiceNotEnabledException e) {
r = null;
e.printStackTrace();
@@ -177,7 +196,8 @@ public class GitBlit implements ServletContextListener {
model.owner = getConfig(config, "owner", "");
model.useTickets = getConfig(config, "useTickets", false);
model.useDocs = getConfig(config, "useDocs", false);
model.accessRestriction = AccessRestrictionType.fromName(getConfig(config, "accessRestriction", null));
model.accessRestriction = AccessRestrictionType.fromName(getConfig(config,
"accessRestriction", null));
model.showRemoteBranches = getConfig(config, "showRemoteBranches", false);
model.isFrozen = getConfig(config, "isFrozen", false);
}
@@ -197,11 +217,14 @@ public class GitBlit implements ServletContextListener {
return config.getBoolean("gitblit", field, defaultValue);
}
public void editRepositoryModel(String repositoryName, RepositoryModel repository, boolean isCreate) throws GitBlitException {
public void editRepositoryModel(String repositoryName, RepositoryModel repository,
boolean isCreate) throws GitBlitException {
Repository r = null;
if (isCreate) {
if (new File(repositoriesFolder, repository.name).exists()) {
throw new GitBlitException(MessageFormat.format("Can not create repository ''{0}'' because it already exists.", repository.name));
throw new GitBlitException(MessageFormat.format(
"Can not create repository ''{0}'' because it already exists.",
repository.name));
}
// create repository
logger.info("create repository " + repository.name);
@@ -212,14 +235,21 @@ public class GitBlit implements ServletContextListener {
File folder = new File(repositoriesFolder, repositoryName);
File destFolder = new File(repositoriesFolder, repository.name);
if (destFolder.exists()) {
throw new GitBlitException(MessageFormat.format("Can not rename repository ''{0}'' to ''{1}'' because ''{1}'' already exists.", repositoryName, repository.name));
throw new GitBlitException(
MessageFormat
.format("Can not rename repository ''{0}'' to ''{1}'' because ''{1}'' already exists.",
repositoryName, repository.name));
}
if (!folder.renameTo(destFolder)) {
throw new GitBlitException(MessageFormat.format("Failed to rename repository ''{0}'' to ''{1}''.", repositoryName, repository.name));
throw new GitBlitException(MessageFormat.format(
"Failed to rename repository ''{0}'' to ''{1}''.", repositoryName,
repository.name));
}
// rename the roles
if (!loginService.renameRole(repositoryName, repository.name)) {
throw new GitBlitException(MessageFormat.format("Failed to rename repository permissions ''{0}'' to ''{1}''.", repositoryName, repository.name));
throw new GitBlitException(MessageFormat.format(
"Failed to rename repository permissions ''{0}'' to ''{1}''.",
repositoryName, repository.name));
}
}
@@ -235,20 +265,23 @@ public class GitBlit implements ServletContextListener {
}
// update settings
StoredConfig config = JGitUtils.readConfig(r);
config.setString("gitblit", null, "description", repository.description);
config.setString("gitblit", null, "owner", repository.owner);
config.setBoolean("gitblit", null, "useTickets", repository.useTickets);
config.setBoolean("gitblit", null, "useDocs", repository.useDocs);
config.setString("gitblit", null, "accessRestriction", repository.accessRestriction.name());
config.setBoolean("gitblit", null, "showRemoteBranches", repository.showRemoteBranches);
config.setBoolean("gitblit", null, "isFrozen", repository.isFrozen);
try {
config.save();
} catch (IOException e) {
logger.error("Failed to save repository config!", e);
if (r != null) {
StoredConfig config = JGitUtils.readConfig(r);
config.setString("gitblit", null, "description", repository.description);
config.setString("gitblit", null, "owner", repository.owner);
config.setBoolean("gitblit", null, "useTickets", repository.useTickets);
config.setBoolean("gitblit", null, "useDocs", repository.useDocs);
config.setString("gitblit", null, "accessRestriction",
repository.accessRestriction.name());
config.setBoolean("gitblit", null, "showRemoteBranches", repository.showRemoteBranches);
config.setBoolean("gitblit", null, "isFrozen", repository.isFrozen);
try {
config.save();
} catch (IOException e) {
logger.error("Failed to save repository config!", e);
}
r.close();
}
r.close();
}
public boolean deleteRepositoryModel(RepositoryModel model) {

+ 84
- 65
src/com/gitblit/GitBlitServer.java View File

@@ -51,10 +51,10 @@ import org.eclipse.jetty.server.ssl.SslSocketConnector;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.FilterMapping;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.webapp.WebAppContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.beust.jcommander.JCommander;
import com.beust.jcommander.Parameter;
@@ -65,32 +65,35 @@ import com.gitblit.wicket.GitBlitWebApp;
public class GitBlitServer {
private final static Logger logger = Log.getLogger(GitBlitServer.class.getSimpleName());
private final static String border_star = "***********************************************************";
private static final String BORDER = "***********************************************************";
private final static FileSettings fileSettings = new FileSettings();
private static Logger logger;
private static final FileSettings FILESETTINGS = new FileSettings();
public static void main(String[] args) {
Params params = new Params();
JCommander jc = new JCommander(params);
try {
jc.parse(args);
if (params.help)
if (params.help) {
usage(jc, null);
}
} catch (ParameterException t) {
usage(jc, t);
}
if (params.stop)
if (params.stop) {
stop(params);
else
} else {
start(params);
}
}
private static void usage(JCommander jc, ParameterException t) {
System.out.println(border_star);
System.out.println(Constants.getRunningVersion());
System.out.println(border_star);
System.out.println(BORDER);
System.out.println(Constants.getGitBlitVersion());
System.out.println(BORDER);
System.out.println();
if (t != null) {
System.out.println(t.getMessage());
@@ -98,7 +101,8 @@ public class GitBlitServer {
}
if (jc != null) {
jc.usage();
System.out.println("\nExample:\n java -server -Xmx1024M -jar gitblit.jar --repos c:\\git --port 80 --securePort 443");
System.out
.println("\nExample:\n java -server -Xmx1024M -jar gitblit.jar --repos c:\\git --port 80 --securePort 443");
}
System.exit(0);
}
@@ -111,7 +115,7 @@ public class GitBlitServer {
Socket s = new Socket(InetAddress.getByName("127.0.0.1"), params.shutdownPort);
OutputStream out = s.getOutputStream();
System.out.println("Sending Shutdown Request to " + Constants.NAME);
out.write(("\r\n").getBytes());
out.write("\r\n".getBytes());
out.flush();
s.close();
} catch (UnknownHostException e) {
@@ -125,17 +129,18 @@ public class GitBlitServer {
* Start Server.
*/
private static void start(Params params) {
String pattern = fileSettings.getString(Keys.server.log4jPattern, "%-5p %d{MM-dd HH:mm:ss.SSS} %-20.20c{1} %m%n");
String pattern = FILESETTINGS.getString(Keys.server.log4jPattern,
"%-5p %d{MM-dd HH:mm:ss.SSS} %-20.20c{1} %m%n");
// allow os override of logging pattern
String os = System.getProperty("os.name").toLowerCase();
if (os.indexOf("windows") > -1) {
String winPattern = fileSettings.getString(Keys.server.log4jPattern_windows, pattern);
String winPattern = FILESETTINGS.getString(Keys.server.log4jPattern_windows, pattern);
if (!StringUtils.isEmpty(winPattern)) {
pattern = winPattern;
}
} else if (os.indexOf("linux") > -1) {
String linuxPattern = fileSettings.getString(Keys.server.log4jPattern_linux, pattern);
String linuxPattern = FILESETTINGS.getString(Keys.server.log4jPattern_linux, pattern);
if (!StringUtils.isEmpty(linuxPattern)) {
pattern = linuxPattern;
}
@@ -145,9 +150,10 @@ public class GitBlitServer {
org.apache.log4j.Logger rootLogger = org.apache.log4j.Logger.getRootLogger();
rootLogger.addAppender(new ConsoleAppender(layout));
logger.info(border_star);
logger.info(Constants.getRunningVersion());
logger.info(border_star);
logger = LoggerFactory.getLogger(GitBlitServer.class);
logger.info(BORDER);
logger.info(Constants.getGitBlitVersion());
logger.info(BORDER);
String osname = System.getProperty("os.name");
String osversion = System.getProperty("os.version");
@@ -157,9 +163,10 @@ public class GitBlitServer {
List<Connector> connectors = new ArrayList<Connector>();
if (params.port > 0) {
Connector httpConnector = createConnector(params.useNIO, params.port);
String bindInterface = fileSettings.getString(Keys.server.httpBindInterface, null);
String bindInterface = FILESETTINGS.getString(Keys.server.httpBindInterface, null);
if (!StringUtils.isEmpty(bindInterface)) {
logger.warn(MessageFormat.format("Binding connector on port {0} to {1}", params.port, bindInterface));
logger.warn(MessageFormat.format("Binding connector on port {0} to {1}",
params.port, bindInterface));
httpConnector.setHost(bindInterface);
}
connectors.add(httpConnector);
@@ -169,13 +176,16 @@ public class GitBlitServer {
File keystore = new File("keystore");
if (!keystore.exists()) {
logger.info("Generating self-signed SSL certificate");
MakeCertificate.generateSelfSignedCertificate("localhost", keystore, params.storePassword);
MakeCertificate.generateSelfSignedCertificate("localhost", keystore,
params.storePassword);
}
if (keystore.exists()) {
Connector secureConnector = createSSLConnector(keystore, params.storePassword, params.useNIO, params.securePort);
String bindInterface = fileSettings.getString(Keys.server.httpsBindInterface, null);
Connector secureConnector = createSSLConnector(keystore, params.storePassword,
params.useNIO, params.securePort);
String bindInterface = FILESETTINGS.getString(Keys.server.httpsBindInterface, null);
if (!StringUtils.isEmpty(bindInterface)) {
logger.warn(MessageFormat.format("Binding ssl connector on port {0} to {1}", params.securePort, bindInterface));
logger.warn(MessageFormat.format("Binding ssl connector on port {0} to {1}",
params.securePort, bindInterface));
secureConnector.setHost(bindInterface);
}
connectors.add(secureConnector);
@@ -189,9 +199,14 @@ public class GitBlitServer {
// * WebApp is expanded
//
File tempDir = new File(params.temp);
if (tempDir.exists())
deleteRecursively(tempDir);
tempDir.mkdirs();
if (tempDir.exists()) {
if (!deleteRecursively(tempDir)) {
logger.warn("Failed to delete temp dir " + tempDir.getAbsolutePath());
}
}
if (!tempDir.mkdirs()) {
logger.warn("Failed to create temp dir " + tempDir.getAbsolutePath());
}
Server server = new Server();
server.setStopAtShutdown(true);
@@ -208,11 +223,8 @@ public class GitBlitServer {
rootContext.setServer(server);
rootContext.setWar(location.toExternalForm());
rootContext.setTempDirectory(tempDir);
// Mark all cookies HttpOnly so they are not accessible to JavaScript
// engines.
// http://erlend.oftedal.no/blog/?blogid=33
// https://www.owasp.org/index.php/HttpOnly#Browsers_Supporting_HttpOnly
// Set cookies HttpOnly so they are not accessible to JavaScript engines
HashSessionManager sessionManager = new HashSessionManager();
sessionManager.setHttpOnly(true);
// Use secure cookies if only serving https
@@ -222,29 +234,31 @@ public class GitBlitServer {
// Wicket Filter
String wicketPathSpec = "/*";
FilterHolder wicketFilter = new FilterHolder(WicketFilter.class);
wicketFilter.setInitParameter(ContextParamWebApplicationFactory.APP_CLASS_PARAM, GitBlitWebApp.class.getName());
wicketFilter.setInitParameter(ContextParamWebApplicationFactory.APP_CLASS_PARAM,
GitBlitWebApp.class.getName());
wicketFilter.setInitParameter(WicketFilter.FILTER_MAPPING_PARAM, wicketPathSpec);
wicketFilter.setInitParameter(WicketFilter.IGNORE_PATHS_PARAM, "git/");
rootContext.addFilter(wicketFilter, wicketPathSpec, FilterMapping.DEFAULT);
// Zip Servlet
rootContext.addServlet(DownloadZipServlet.class, Constants.ZIP_SERVLET_PATH + "*");
// Git Servlet
ServletHolder gitServlet = null;
String gitServletPathSpec = Constants.GIT_SERVLET_PATH + "*";
if (fileSettings.getBoolean(Keys.git.enableGitServlet, true)) {
if (FILESETTINGS.getBoolean(Keys.git.enableGitServlet, true)) {
gitServlet = rootContext.addServlet(GitBlitServlet.class, gitServletPathSpec);
gitServlet.setInitParameter("base-path", params.repositoriesFolder);
gitServlet.setInitParameter("export-all", fileSettings.getBoolean(Keys.git.exportAll, true) ? "1" : "0");
gitServlet.setInitParameter("export-all",
FILESETTINGS.getBoolean(Keys.git.exportAll, true) ? "1" : "0");
}
// Login Service
LoginService loginService = null;
String realmUsers = params.realmFile;
if (!StringUtils.isEmpty(realmUsers)) {
String realmUsers = params.realmFile;
if (!StringUtils.isEmpty(realmUsers)) {
File realmFile = new File(realmUsers);
if (realmFile.exists()) {
if (realmFile.exists()) {
logger.info("Setting up login service from " + realmUsers);
JettyLoginService jettyLoginService = new JettyLoginService(realmFile);
GitBlit.self().setLoginService(jettyLoginService);
@@ -261,13 +275,13 @@ public class GitBlitServer {
Constraint constraint = new Constraint();
constraint.setAuthenticate(true);
constraint.setRoles(new String [] { "*" });
constraint.setRoles(new String[] { "*" });
ConstraintMapping mapping = new ConstraintMapping();
mapping.setPathSpec(gitServletPathSpec);
mapping.setConstraint(constraint);
ConstraintSecurityHandler security = new ConstraintSecurityHandler();
ConstraintSecurityHandler security = new ConstraintSecurityHandler();
security.addConstraintMapping(mapping);
security.setAuthenticator(new BasicAuthenticator());
security.setLoginService(loginService);
@@ -291,7 +305,7 @@ public class GitBlitServer {
// Setup the GitBlit context
GitBlit gitblit = GitBlit.self();
gitblit.configureContext(fileSettings);
gitblit.configureContext(FILESETTINGS);
rootContext.addEventListener(gitblit);
// Start the Server
@@ -327,13 +341,14 @@ public class GitBlitServer {
return connector;
}
private static Connector createSSLConnector(File keystore, String password, boolean useNIO, int port) {
private static Connector createSSLConnector(File keystore, String password, boolean useNIO,
int port) {
SslConnector connector;
if (useNIO) {
logger.info("Setting up NIO SslSelectChannelConnector on port " + port);
SslSelectChannelConnector ssl = new SslSelectChannelConnector();
ssl.setSoLingerTime(-1);
ssl.setThreadPool(new QueuedThreadPool(20));
ssl.setThreadPool(new QueuedThreadPool(20));
connector = ssl;
} else {
logger.info("Setting up NIO SslSocketConnector on port " + port);
@@ -347,20 +362,22 @@ public class GitBlitServer {
connector.setMaxIdleTime(30000);
return connector;
}
/**
* Recursively delete a folder and its contents.
*
* @param folder
*/
private static void deleteRecursively(File folder) {
private static boolean deleteRecursively(File folder) {
boolean deleted = true;
for (File file : folder.listFiles()) {
if (file.isDirectory())
deleteRecursively(file);
else
file.delete();
if (file.isDirectory()) {
deleted &= deleteRecursively(file);
} else {
deleted &= file.delete();
}
}
folder.delete();
return deleted && folder.delete();
}
private static class ShutdownMonitorThread extends Thread {
@@ -377,7 +394,7 @@ public class GitBlitServer {
try {
skt = new ServerSocket(params.shutdownPort, 1, InetAddress.getByName("127.0.0.1"));
} catch (Exception e) {
logger.warn(e);
logger.warn("Could not open shutdown monitor on port " + params.shutdownPort, e);
}
socket = skt;
}
@@ -388,11 +405,12 @@ public class GitBlitServer {
Socket accept;
try {
accept = socket.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(accept.getInputStream()));
BufferedReader reader = new BufferedReader(new InputStreamReader(
accept.getInputStream()));
reader.readLine();
logger.info(border_star);
logger.info(BORDER);
logger.info("Stopping " + Constants.NAME);
logger.info(border_star);
logger.info(BORDER);
server.stop();
server.setStopAtShutdown(false);
accept.close();
@@ -416,37 +434,38 @@ public class GitBlitServer {
public Boolean stop = false;
@Parameter(names = { "--tempFolder" }, description = "Server temp folder")
public String temp = fileSettings.getString(Keys.server.tempFolder, "temp");
public String temp = FILESETTINGS.getString(Keys.server.tempFolder, "temp");
/*
* GIT Servlet Parameters
*/
@Parameter(names = { "--repositoriesFolder" }, description = "Git Repositories Folder")
public String repositoriesFolder = fileSettings.getString(Keys.git.repositoriesFolder, "repos");
public String repositoriesFolder = FILESETTINGS.getString(Keys.git.repositoriesFolder,
"repos");
/*
* Authentication Parameters
*/
@Parameter(names = { "--realmFile" }, description = "Users Realm Hash File")
public String realmFile = fileSettings.getString(Keys.realm.realmFile, "users.properties");
public String realmFile = FILESETTINGS.getString(Keys.realm.realmFile, "users.properties");
/*
* JETTY Parameters
*/
@Parameter(names = { "--useNio" }, description = "Use NIO Connector else use Socket Connector.")
public Boolean useNIO = fileSettings.getBoolean(Keys.server.useNio, true);
public Boolean useNIO = FILESETTINGS.getBoolean(Keys.server.useNio, true);
@Parameter(names = "--httpPort", description = "HTTP port for to serve. (port <= 0 will disable this connector)")
public Integer port = fileSettings.getInteger(Keys.server.httpPort, 80);
public Integer port = FILESETTINGS.getInteger(Keys.server.httpPort, 80);
@Parameter(names = "--httpsPort", description = "HTTPS port to serve. (port <= 0 will disable this connector)")
public Integer securePort = fileSettings.getInteger(Keys.server.httpsPort, 443);
public Integer securePort = FILESETTINGS.getInteger(Keys.server.httpsPort, 443);
@Parameter(names = "--storePassword", description = "Password for SSL (https) keystore.")
public String storePassword = fileSettings.getString(Keys.server.storePassword, "");
public String storePassword = FILESETTINGS.getString(Keys.server.storePassword, "");
@Parameter(names = "--shutdownPort", description = "Port for Shutdown Monitor to listen on. (port <= 0 will disable this monitor)")
public Integer shutdownPort = fileSettings.getInteger(Keys.server.shutdownPort, 8081);
public Integer shutdownPort = FILESETTINGS.getInteger(Keys.server.shutdownPort, 8081);
}
}

+ 21
- 11
src/com/gitblit/GitBlitServlet.java View File

@@ -33,14 +33,15 @@ public class GitBlitServlet extends GitServlet {
private static final long serialVersionUID = 1L;
private final Logger logger = LoggerFactory.getLogger(GitBlitServlet.class);
private transient Logger logger = LoggerFactory.getLogger(GitBlitServlet.class);
public GitBlitServlet() {
super();
}
@Override
protected void service(final HttpServletRequest req, final HttpServletResponse rsp) throws ServletException, IOException {
protected void service(final HttpServletRequest req, final HttpServletResponse rsp)
throws ServletException, IOException {
// admins have full git access to all repositories
if (req.isUserInRole(Constants.ADMIN_ROLE)) {
// admins can do whatever
@@ -57,12 +58,13 @@ public class GitBlitServlet extends GitServlet {
if (forwardSlash > -1) {
String repository = url.substring(0, forwardSlash);
String function = url.substring(forwardSlash + 1);
String query = req.getQueryString() == null ? "":req.getQueryString();
String query = req.getQueryString() == null ? "" : req.getQueryString();
RepositoryModel model = GitBlit.self().getRepositoryModel(repository);
if (model != null) {
if (model != null) {
if (model.isFrozen || model.accessRestriction.atLeast(AccessRestrictionType.PUSH)) {
boolean authorizedUser = req.isUserInRole(repository);
if (function.startsWith("git-receive-pack") || (query.indexOf("service=git-receive-pack") > -1)) {
if (function.startsWith("git-receive-pack")
|| (query.indexOf("service=git-receive-pack") > -1)) {
// Push request
if (!model.isFrozen && authorizedUser) {
// clone-restricted or push-authorized
@@ -70,21 +72,29 @@ public class GitBlitServlet extends GitServlet {
return;
} else {
// user is unauthorized to push to this repository
logger.warn(MessageFormat.format("user {0} is not authorized to push to {1} ", req.getUserPrincipal().getName(), repository));
rsp.sendError(HttpServletResponse.SC_FORBIDDEN, MessageFormat.format("you are not authorized to push to {0} ", repository));
logger.warn(MessageFormat.format(
"user {0} is not authorized to push to {1}", req
.getUserPrincipal().getName(), repository));
rsp.sendError(HttpServletResponse.SC_FORBIDDEN, MessageFormat.format(
"you are not authorized to push to {0}", repository));
return;
}
} else if (function.startsWith("git-upload-pack") || (query.indexOf("service=git-upload-pack") > -1)) {
} else if (function.startsWith("git-upload-pack")
|| (query.indexOf("service=git-upload-pack") > -1)) {
// Clone request
boolean cloneRestricted = model.accessRestriction.atLeast(AccessRestrictionType.CLONE);
boolean cloneRestricted = model.accessRestriction
.atLeast(AccessRestrictionType.CLONE);
if (!cloneRestricted || (cloneRestricted && authorizedUser)) {
// push-restricted or clone-authorized
super.service(req, rsp);
return;
} else {
// user is unauthorized to clone this repository
logger.warn(MessageFormat.format("user {0} is not authorized to clone {1} ", req.getUserPrincipal().getName(), repository));
rsp.sendError(HttpServletResponse.SC_FORBIDDEN, MessageFormat.format("you are not authorized to clone {0} ", repository));
logger.warn(MessageFormat.format(
"user {0} is not authorized to clone {1}", req
.getUserPrincipal().getName(), repository));
rsp.sendError(HttpServletResponse.SC_FORBIDDEN, MessageFormat.format(
"you are not authorized to clone {0}", repository));
return;
}
}

+ 9
- 9
src/com/gitblit/ILoginService.java View File

@@ -24,22 +24,22 @@ public interface ILoginService {
UserModel authenticate(String username, char[] password);
UserModel getUserModel(String username);
boolean updateUserModel(UserModel model);
boolean updateUserModel(String username, UserModel model);
boolean deleteUserModel(UserModel model);
boolean deleteUser(String username);
List<String> getAllUsernames();
List<String> getUsernamesForRole(String role);
boolean setUsernamesForRole(String role, List<String> usernames);
boolean renameRole(String oldRole, String newRole);
boolean deleteRole(String role);
}

+ 8
- 8
src/com/gitblit/IStoredSettings.java View File

@@ -19,20 +19,20 @@ import java.util.List;
public interface IStoredSettings {
public abstract List<String> getAllKeys(String startingWith);
List<String> getAllKeys(String startingWith);
public abstract boolean getBoolean(String name, boolean defaultValue);
boolean getBoolean(String name, boolean defaultValue);
public abstract int getInteger(String name, int defaultValue);
int getInteger(String name, int defaultValue);
public abstract String getString(String name, String defaultValue);
String getString(String name, String defaultValue);
public abstract List<String> getStrings(String name);
List<String> getStrings(String name);
public abstract List<String> getStringsFromValue(String value);
List<String> getStringsFromValue(String value);
public abstract List<String> getStrings(String name, String separator);
List<String> getStrings(String name, String separator);
public abstract List<String> getStringsFromValue(String value, String separator);
List<String> getStringsFromValue(String value, String separator);
}

+ 44
- 25
src/com/gitblit/JettyLoginService.java View File

@@ -59,7 +59,7 @@ public class JettyLoginService extends MappedLoginService implements ILoginServi
return null;
}
UserModel user = new UserModel(username);
user.canAdmin(identity.isUserInRole(Constants.ADMIN_ROLE, null));
user.canAdmin = identity.isUserInRole(Constants.ADMIN_ROLE, null);
// Add repositories
for (Principal principal : identity.getSubject().getPrincipals()) {
@@ -90,7 +90,7 @@ public class JettyLoginService extends MappedLoginService implements ILoginServi
case '#':
// Permissions
if (name.equalsIgnoreCase(Constants.ADMIN_ROLE)) {
model.canAdmin(true);
model.canAdmin = true;
}
break;
default:
@@ -105,7 +105,7 @@ public class JettyLoginService extends MappedLoginService implements ILoginServi
Properties allUsers = readRealmFile();
String value = allUsers.getProperty(username);
String password = value.split(",")[0];
model.setPassword(password);
model.password = password;
} catch (Throwable t) {
logger.error(MessageFormat.format("Failed to read password for user {0}!", username), t);
}
@@ -114,22 +114,22 @@ public class JettyLoginService extends MappedLoginService implements ILoginServi
@Override
public boolean updateUserModel(UserModel model) {
return updateUserModel(model.getUsername(), model);
return updateUserModel(model.username, model);
}
@Override
public boolean updateUserModel(String username, UserModel model) {
try {
Properties allUsers = readRealmFile();
ArrayList<String> roles = new ArrayList<String>(model.getRepositories());
ArrayList<String> roles = new ArrayList<String>(model.repositories);
// Permissions
if (model.canAdmin()) {
if (model.canAdmin) {
roles.add(Constants.ADMIN_ROLE);
}
StringBuilder sb = new StringBuilder();
sb.append(model.getPassword());
sb.append(model.password);
sb.append(',');
for (String role : roles) {
sb.append(role);
@@ -138,23 +138,25 @@ public class JettyLoginService extends MappedLoginService implements ILoginServi
// trim trailing comma
sb.setLength(sb.length() - 1);
allUsers.remove(username);
allUsers.put(model.getUsername(), sb.toString());
allUsers.put(model.username, sb.toString());
writeRealmFile(allUsers);
// Update login service
removeUser(username);
putUser(model.getUsername(), Credential.getCredential(model.getPassword()), roles.toArray(new String[0]));
putUser(model.username, Credential.getCredential(model.password),
roles.toArray(new String[0]));
return true;
} catch (Throwable t) {
logger.error(MessageFormat.format("Failed to update user model {0}!", model.getUsername()), t);
logger.error(MessageFormat.format("Failed to update user model {0}!", model.username),
t);
}
return false;
}
@Override
public boolean deleteUserModel(UserModel model) {
return deleteUser(model.getUsername());
return deleteUser(model.username);
}
@Override
@@ -173,7 +175,7 @@ public class JettyLoginService extends MappedLoginService implements ILoginServi
}
return false;
}
@Override
public List<String> getAllUsernames() {
List<String> list = new ArrayList<String>();
@@ -235,7 +237,7 @@ public class JettyLoginService extends MappedLoginService implements ILoginServi
// add roles to users
for (String user : needsAddRole) {
String userValues = allUsers.getProperty(user);
userValues += ("," + role);
userValues += "," + role;
allUsers.put(user, userValues);
String[] values = userValues.split(",");
String password = values[0];
@@ -267,7 +269,8 @@ public class JettyLoginService extends MappedLoginService implements ILoginServi
allUsers.put(user, sb.toString());
// update memory
putUser(user, Credential.getCredential(password), revisedRoles.toArray(new String[0]));
putUser(user, Credential.getCredential(password),
revisedRoles.toArray(new String[0]));
}
// persist changes
@@ -324,14 +327,16 @@ public class JettyLoginService extends MappedLoginService implements ILoginServi
allUsers.put(user, sb.toString());
// update memory
putUser(user, Credential.getCredential(password), revisedRoles.toArray(new String[0]));
putUser(user, Credential.getCredential(password),
revisedRoles.toArray(new String[0]));
}
// persist changes
writeRealmFile(allUsers);
return true;
} catch (Throwable t) {
logger.error(MessageFormat.format("Failed to rename role {0} to {1}!", oldRole, newRole), t);
logger.error(
MessageFormat.format("Failed to rename role {0} to {1}!", oldRole, newRole), t);
}
return false;
}
@@ -380,7 +385,8 @@ public class JettyLoginService extends MappedLoginService implements ILoginServi
allUsers.put(user, sb.toString());
// update memory
putUser(user, Credential.getCredential(password), revisedRoles.toArray(new String[0]));
putUser(user, Credential.getCredential(password),
revisedRoles.toArray(new String[0]));
}
// persist changes
@@ -404,24 +410,36 @@ public class JettyLoginService extends MappedLoginService implements ILoginServi
// Update realm file
File realmFileCopy = new File(realmFile.getAbsolutePath() + ".tmp");
FileWriter writer = new FileWriter(realmFileCopy);
properties.store(writer, "# Git:Blit realm file format: username=password,\\#permission,repository1,repository2...");
properties
.store(writer,
"# Git:Blit realm file format: username=password,\\#permission,repository1,repository2...");
writer.close();
if (realmFileCopy.exists() && realmFileCopy.length() > 0) {
realmFile.delete();
realmFileCopy.renameTo(realmFile);
if (realmFile.delete()) {
if (!realmFileCopy.renameTo(realmFile)) {
throw new IOException(MessageFormat.format("Failed to rename {0} to {1}!",
realmFileCopy.getAbsolutePath(), realmFile.getAbsolutePath()));
}
} else {
throw new IOException(MessageFormat.format("Failed to delete (0)!",
realmFile.getAbsolutePath()));
}
} else {
throw new IOException("Failed to save realmfile!");
throw new IOException(MessageFormat.format("Failed to save {0}!",
realmFileCopy.getAbsolutePath()));
}
}
/* ------------------------------------------------------------ */
@Override
public void loadUsers() throws IOException {
if (realmFile == null)
if (realmFile == null) {
return;
}
if (Log.isDebugEnabled())
if (Log.isDebugEnabled()) {
Log.debug("Load " + this + " from " + realmFile);
}
Properties allUsers = readRealmFile();
// Map Users
@@ -435,7 +453,8 @@ public class JettyLoginService extends MappedLoginService implements ILoginServi
credentials = credentials.substring(0, c).trim();
}
if (username != null && username.length() > 0 && credentials != null && credentials.length() > 0) {
if (username != null && username.length() > 0 && credentials != null
&& credentials.length() > 0) {
String[] roleArray = IdentityService.NO_ROLES;
if (roles != null && roles.length() > 0) {
roleArray = roles.split(",");

+ 25
- 23
src/com/gitblit/Launcher.java View File

@@ -22,6 +22,7 @@ import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.security.ProtectionDomain;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -34,16 +35,20 @@ import java.util.List;
*/
public class Launcher {
public final static boolean debug = false;
public static final boolean DEBUG = false;
/**
* Parameters of the method to add an URL to the System classes.
*/
private static final Class<?>[] PARAMETERS = new Class[] { URL.class };
public static void main(String[] args) {
if (debug)
if (DEBUG) {
System.out.println("jcp=" + System.getProperty("java.class.path"));
ProtectionDomain protectionDomain = Launcher.class.getProtectionDomain();
final String launchJar = protectionDomain.getCodeSource().getLocation().toExternalForm();
if (debug)
System.out.println("launcher=" + launchJar);
ProtectionDomain protectionDomain = Launcher.class.getProtectionDomain();
System.out.println("launcher="
+ protectionDomain.getCodeSource().getLocation().toExternalForm());
}
Build.runtime();
@@ -51,16 +56,15 @@ public class Launcher {
String[] folders = new String[] { "lib", "ext" };
List<File> jars = new ArrayList<File>();
for (String folder : folders) {
if (folder == null)
if (folder == null) {
continue;
}
File libFolder = new File(folder);
if (!libFolder.exists())
if (!libFolder.exists()) {
continue;
try {
libFolder = libFolder.getCanonicalFile();
} catch (IOException iox) {
}
jars.addAll(findJars(libFolder));
List<File> found = findJars(libFolder.getAbsoluteFile());
jars.addAll(found);
}
if (jars.size() == 0) {
@@ -94,20 +98,16 @@ public class Launcher {
});
if (libs != null && libs.length > 0) {
jars.addAll(Arrays.asList(libs));
if (debug) {
for (File jar : jars)
if (DEBUG) {
for (File jar : jars) {
System.out.println("found " + jar);
}
}
}
}
return jars;
}
/**
* Parameters of the method to add an URL to the System classes.
*/
private static final Class<?>[] parameters = new Class[] { URL.class };
/**
* Adds a file to the classpath
*
@@ -121,16 +121,18 @@ public class Launcher {
return;
}
URL u = f.toURI().toURL();
if (debug)
if (DEBUG) {
System.out.println("load=" + u.toExternalForm());
}
URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Class<?> sysclass = URLClassLoader.class;
try {
Method method = sysclass.getDeclaredMethod("addURL", parameters);
Method method = sysclass.getDeclaredMethod("addURL", PARAMETERS);
method.setAccessible(true);
method.invoke(sysloader, new Object[] { u });
} catch (Throwable t) {
throw new IOException("Error, could not add " + f.getPath() + " to system classloader", t);
throw new IOException(MessageFormat.format(
"Error, could not add {0} to system classloader", f.getPath()), t);
}
}
}

+ 47
- 32
src/com/gitblit/MakeCertificate.java View File

@@ -41,10 +41,13 @@ import com.beust.jcommander.JCommander;
import com.beust.jcommander.Parameter;
import com.beust.jcommander.ParameterException;
import com.beust.jcommander.Parameters;
import com.gitblit.utils.TimeUtils;
public class MakeCertificate {
private final static FileSettings fileSettings = new FileSettings();
private static final FileSettings FILESETTINGS = new FileSettings();
private static final String BC = org.bouncycastle.jce.provider.BouncyCastleProvider.PROVIDER_NAME;
public static void main(String... args) {
Params params = new Params();
@@ -52,18 +55,18 @@ public class MakeCertificate {
try {
jc.parse(args);
} catch (ParameterException t) {
System.err.println(t.getMessage());
jc.usage();
}
File keystore = new File("keystore");
generateSelfSignedCertificate(params.alias, keystore, params.storePassword, params.subject);
}
public static void generateSelfSignedCertificate(String hostname, File keystore, String keystorePassword) {
public static void generateSelfSignedCertificate(String hostname, File keystore,
String keystorePassword) {
try {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
final String BC = org.bouncycastle.jce.provider.BouncyCastleProvider.PROVIDER_NAME;
KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA", "BC");
kpGen.initialize(1024, new SecureRandom());
KeyPair pair = kpGen.generateKeyPair();
@@ -74,82 +77,94 @@ public class MakeCertificate {
builder.addRDN(BCStyle.O, Constants.NAME);
builder.addRDN(BCStyle.CN, hostname);
Date notBefore = new Date(System.currentTimeMillis() - 1*24*60*60*1000l);
Date notAfter = new Date(System.currentTimeMillis() + 10*365*24*60*60*1000l);
Date notBefore = new Date(System.currentTimeMillis() - TimeUtils.ONEDAY);
Date notAfter = new Date(System.currentTimeMillis() + 10 * TimeUtils.ONEYEAR);
BigInteger serial = BigInteger.valueOf(System.currentTimeMillis());
X509v3CertificateBuilder certGen = new JcaX509v3CertificateBuilder(builder.build(), serial, notBefore, notAfter, builder.build(), pair.getPublic());
ContentSigner sigGen = new JcaContentSignerBuilder("SHA256WithRSAEncryption").setProvider(BC).build(pair.getPrivate());
X509Certificate cert = new JcaX509CertificateConverter().setProvider(BC).getCertificate(certGen.build(sigGen));
X509v3CertificateBuilder certGen = new JcaX509v3CertificateBuilder(builder.build(),
serial, notBefore, notAfter, builder.build(), pair.getPublic());
ContentSigner sigGen = new JcaContentSignerBuilder("SHA256WithRSAEncryption")
.setProvider(BC).build(pair.getPrivate());
X509Certificate cert = new JcaX509CertificateConverter().setProvider(BC)
.getCertificate(certGen.build(sigGen));
cert.checkValidity(new Date());
cert.verify(cert.getPublicKey());
// Save to keystore
// Save to keystore
KeyStore store = KeyStore.getInstance("JKS");
if (keystore.exists()) {
FileInputStream fis = new FileInputStream(keystore);
store.load(fis, keystorePassword.toCharArray());
fis.close();
} else {
store.load(null);
}
store.setKeyEntry(hostname, pair.getPrivate(), keystorePassword.toCharArray(), new java.security.cert.Certificate[] { cert });
store.store(new FileOutputStream(keystore), keystorePassword.toCharArray());
store.setKeyEntry(hostname, pair.getPrivate(), keystorePassword.toCharArray(),
new java.security.cert.Certificate[] { cert });
FileOutputStream fos = new FileOutputStream(keystore);
store.store(fos, keystorePassword.toCharArray());
fos.close();
} catch (Throwable t) {
t.printStackTrace();
throw new RuntimeException("Failed to generate self-signed certificate!", t);
}
}
public static void generateSelfSignedCertificate(String hostname, File keystore, String keystorePassword, String info) {
public static void generateSelfSignedCertificate(String hostname, File keystore,
String keystorePassword, String info) {
try {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
final String BC = org.bouncycastle.jce.provider.BouncyCastleProvider.PROVIDER_NAME;
KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA", "BC");
kpGen.initialize(1024, new SecureRandom());
KeyPair pair = kpGen.generateKeyPair();
// Generate self-signed certificate
X500Principal principal = new X500Principal(info);
Date notBefore = new Date(System.currentTimeMillis() - 1*24*60*60*1000l);
Date notAfter = new Date(System.currentTimeMillis() + 10*365*24*60*60*1000l);
Date notBefore = new Date(System.currentTimeMillis() - TimeUtils.ONEDAY);
Date notAfter = new Date(System.currentTimeMillis() + 10 * TimeUtils.ONEYEAR);
BigInteger serial = BigInteger.valueOf(System.currentTimeMillis());
X509v3CertificateBuilder certGen = new JcaX509v3CertificateBuilder(principal, serial, notBefore, notAfter, principal, pair.getPublic());
ContentSigner sigGen = new JcaContentSignerBuilder("SHA256WithRSAEncryption").setProvider(BC).build(pair.getPrivate());
X509Certificate cert = new JcaX509CertificateConverter().setProvider(BC).getCertificate(certGen.build(sigGen));
X509v3CertificateBuilder certGen = new JcaX509v3CertificateBuilder(principal, serial,
notBefore, notAfter, principal, pair.getPublic());
ContentSigner sigGen = new JcaContentSignerBuilder("SHA256WithRSAEncryption")
.setProvider(BC).build(pair.getPrivate());
X509Certificate cert = new JcaX509CertificateConverter().setProvider(BC)
.getCertificate(certGen.build(sigGen));
cert.checkValidity(new Date());
cert.verify(cert.getPublicKey());
// Save to keystore
// Save to keystore
KeyStore store = KeyStore.getInstance("JKS");
if (keystore.exists()) {
FileInputStream fis = new FileInputStream(keystore);
store.load(fis, keystorePassword.toCharArray());
fis.close();
} else {
store.load(null);
}
store.setKeyEntry(hostname, pair.getPrivate(), keystorePassword.toCharArray(), new java.security.cert.Certificate[] { cert });
store.store(new FileOutputStream(keystore), keystorePassword.toCharArray());
store.setKeyEntry(hostname, pair.getPrivate(), keystorePassword.toCharArray(),
new java.security.cert.Certificate[] { cert });
FileOutputStream fos = new FileOutputStream(keystore);
store.store(fos, keystorePassword.toCharArray());
fos.close();
} catch (Throwable t) {
t.printStackTrace();
throw new RuntimeException("Failed to generate self-signed certificate!", t);
}
}
@Parameters(separators = " ")
private static class Params {
@Parameter(names = { "--alias" }, description = "Server alias", required = true)
public String alias = null;
public String alias;
@Parameter(names = { "--subject" }, description = "Certificate subject", required = true)
public String subject = null;
public String subject;
@Parameter(names = "--storePassword", description = "Password for SSL (https) keystore.")
public String storePassword = fileSettings.getString(Keys.server.storePassword, "");
public String storePassword = FILESETTINGS.getString(Keys.server.storePassword, "");
}
}

+ 3
- 3
src/com/gitblit/WebXmlSettings.java View File

@@ -22,9 +22,9 @@ import javax.servlet.ServletContext;
public class WebXmlSettings implements IStoredSettings {
public WebXmlSettings(ServletContext context) {
}
@Override
public List<String> getAllKeys(String startingWith) {
// TODO Auto-generated method stub
@@ -72,7 +72,7 @@ public class WebXmlSettings implements IStoredSettings {
// TODO Auto-generated method stub
return null;
}
@Override
public String toString() {
return "WEB.XML";

+ 0
- 145
src/com/gitblit/tests/JGitUtilsTest.java View File

@@ -1,145 +0,0 @@
/*
* 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 java.io.File;
import java.io.FileOutputStream;
import java.util.Date;
import java.util.List;
import junit.framework.TestCase;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevBlob;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevObject;
import org.eclipse.jgit.revwalk.RevTree;
import org.eclipse.jgit.storage.file.FileRepository;
import com.gitblit.utils.JGitUtils;
import com.gitblit.utils.JGitUtils.DiffOutputType;
import com.gitblit.wicket.models.PathModel.PathChangeModel;
import com.gitblit.wicket.models.RefModel;
import com.gitblit.wicket.models.TicketModel;
public class JGitUtilsTest extends TestCase {
private File repositoriesFolder = new File("c:/projects/git");
private boolean exportAll = true;
private boolean readNested = true;
private List<String> getRepositories() {
return JGitUtils.getRepositoryList(repositoriesFolder, exportAll, readNested);
}
private Repository getRepository() throws Exception {
return new FileRepository(new File(repositoriesFolder, getRepositories().get(0)) + "/" + Constants.DOT_GIT);
}
public void testFindRepositories() {
List<String> list = getRepositories();
assertTrue("No repositories found in " + repositoriesFolder, list.size() > 0);
}
public void testOpenRepository() throws Exception {
Repository r = getRepository();
r.close();
assertTrue("Could not find repository!", r != null);
}
public void testLastChangeRepository() throws Exception {
Repository r = getRepository();
Date date = JGitUtils.getLastChange(r);
r.close();
assertTrue("Could not get last repository change date!", date != null);
}
public void testFirstCommit() throws Exception {
Repository r = getRepository();
RevCommit commit = JGitUtils.getFirstCommit(r, null);
r.close();
assertTrue("Could not get first commit!", commit != null);
System.out.println(commit.getName() + " " + commit.getShortMessage());
}
public void testRetrieveRevObject() throws Exception {
Repository r = getRepository();
RevCommit commit = JGitUtils.getCommit(r, Constants.HEAD);
RevTree tree = commit.getTree();
RevObject object = JGitUtils.getRevObject(r, tree, "AUTHORS");
r.close();
assertTrue("Object is null!", object != null);
}
public void testRetrieveStringContent() throws Exception {
Repository r = getRepository();
RevCommit commit = JGitUtils.getCommit(r, Constants.HEAD);
RevTree tree = commit.getTree();
RevBlob blob = (RevBlob) JGitUtils.getRevObject(r, tree, "AUTHORS");
String content = JGitUtils.getRawContentAsString(r, blob);
r.close();
assertTrue("Content is null!", content != null);
}
public void testTicGit() throws Exception {
Repository r = new FileRepository(new File(repositoriesFolder, "ticgit") + "/" + Constants.DOT_GIT);
RefModel ticgit = JGitUtils.getTicketsBranch(r);
assertTrue("Ticgit branch does not exist!", ticgit != null);
List<TicketModel> tickets = JGitUtils.getTickets(r);
assertTrue("No tickets found!", tickets.size() > 0);
r.close();
}
public void testFilesInCommit() throws Exception {
Repository r = getRepository();
RevCommit commit = JGitUtils.getCommit(r, Constants.HEAD);
List<PathChangeModel> paths = JGitUtils.getFilesInCommit(r, commit);
r.close();
assertTrue("No changed paths found!", paths.size() > 0);
}
public void testCommitDiff() throws Exception {
Repository r = getRepository();
RevCommit commit = JGitUtils.getCommit(r, Constants.HEAD);
String diff = JGitUtils.getCommitDiff(r, commit, DiffOutputType.PLAIN);
r.close();
System.out.println(diff);
}
public void testZip() throws Exception {
Repository r = new FileRepository(new File(repositoriesFolder, "gitblit.git/" + Constants.DOT_GIT));
FileOutputStream fos = null;
try {
File zipFile = new File("c:/output.zip");
zipFile.delete();
fos = new FileOutputStream(zipFile);
if (JGitUtils.zip(r, "src", Constants.HEAD, fos)) {
System.out.println("zip = " + zipFile.length() + " bytes");
} else {
System.err.println("failed to generate zip file?!");
}
} finally {
if (fos != null) {
try {
fos.close();
} catch (Throwable t) {
}
}
}
}
}

+ 2
- 3
src/com/gitblit/utils/ByteFormat.java View File

@@ -32,8 +32,6 @@ public class ByteFormat extends Format {
public ByteFormat() {
}

// Implemented from the Format class

/**
* Formats a long which represent a number of bytes.
*/
@@ -73,7 +71,8 @@ public class ByteFormat extends Format {
buf.append(formatter.format((double) numBytes / (1024.0 * 1024.0))).append(" MB");
} else {
DecimalFormat formatter = new DecimalFormat("#,##0.0");
buf.append(formatter.format((double) numBytes / (1024.0 * 1024.0 * 1024.0))).append(" GB");
buf.append(formatter.format((double) numBytes / (1024.0 * 1024.0 * 1024.0)))
.append(" GB");
}
}
return buf;

+ 9
- 6
src/com/gitblit/utils/GitBlitDiffFormatter.java View File

@@ -25,7 +25,7 @@ public class GitBlitDiffFormatter extends GitWebDiffFormatter {
private final OutputStream os;
private int left = 0, right = 0;
private int left, right;
public GitBlitDiffFormatter(OutputStream os) {
super(os);
@@ -46,7 +46,8 @@ public class GitBlitDiffFormatter extends GitWebDiffFormatter {
* @throws IOException
*/
@Override
protected void writeHunkHeader(int aStartLine, int aEndLine, int bStartLine, int bEndLine) throws IOException {
protected void writeHunkHeader(int aStartLine, int aEndLine, int bStartLine, int bEndLine)
throws IOException {
os.write("<tr><th>..</th><th>..</th><td class='hunk_header'>".getBytes());
os.write('@');
os.write('@');
@@ -61,7 +62,8 @@ public class GitBlitDiffFormatter extends GitWebDiffFormatter {
}
@Override
protected void writeLine(final char prefix, final RawText text, final int cur) throws IOException {
protected void writeLine(final char prefix, final RawText text, final int cur)
throws IOException {
os.write("<tr>".getBytes());
switch (prefix) {
case '+':
@@ -104,7 +106,7 @@ public class GitBlitDiffFormatter extends GitWebDiffFormatter {
public String getHtml() {
String html = os.toString();
String[] lines = html.split("\n");
StringBuilder sb = new StringBuilder();
StringBuilder sb = new StringBuilder();
boolean inFile = false;
String oldnull = "a/dev/null";
for (String line : lines) {
@@ -120,7 +122,8 @@ public class GitBlitDiffFormatter extends GitWebDiffFormatter {
if (line.indexOf(oldnull) > -1) {
// a is null, use b
line = line.substring(("diff --git " + oldnull).length()).trim();
line = line.substring(2); // trim b/
// trim b/
line = line.substring(2);
} else {
// use a
line = line.substring("diff --git a/".length()).trim();
@@ -131,7 +134,7 @@ public class GitBlitDiffFormatter extends GitWebDiffFormatter {
inFile = false;
}
sb.append("<div class='header'>").append(line).append("</div>");
sb.append("<div class=\"diff\">");
sb.append("<div class=\"diff\">");
sb.append("<table><tbody>");
inFile = true;
} else {

+ 4
- 2
src/com/gitblit/utils/GitWebDiffFormatter.java View File

@@ -47,7 +47,8 @@ public class GitWebDiffFormatter extends DiffFormatter {
* @throws IOException
*/
@Override
protected void writeHunkHeader(int aStartLine, int aEndLine, int bStartLine, int bEndLine) throws IOException {
protected void writeHunkHeader(int aStartLine, int aEndLine, int bStartLine, int bEndLine)
throws IOException {
os.write("<div class=\"diff hunk_header\"><span class=\"diff hunk_info\">".getBytes());
os.write('@');
os.write('@');
@@ -93,7 +94,8 @@ public class GitWebDiffFormatter extends DiffFormatter {
}
@Override
protected void writeLine(final char prefix, final RawText text, final int cur) throws IOException {
protected void writeLine(final char prefix, final RawText text, final int cur)
throws IOException {
switch (prefix) {
case '+':
os.write("<span class=\"diff add\">".getBytes());

+ 75
- 52
src/com/gitblit/utils/JGitUtils.java View File

@@ -31,6 +31,7 @@ import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.zip.ZipEntry;
@@ -81,21 +82,24 @@ import com.gitblit.wicket.models.TicketModel.Comment;
public class JGitUtils {
private final static Logger LOGGER = LoggerFactory.getLogger(JGitUtils.class);
private static final Logger LOGGER = LoggerFactory.getLogger(JGitUtils.class);
public static Repository createRepository(File repositoriesFolder, String name, boolean bare) {
Git git = Git.init().setDirectory(new File(repositoriesFolder, name)).setBare(bare).call();
return git.getRepository();
}
public static List<String> getRepositoryList(File repositoriesFolder, boolean exportAll, boolean readNested) {
public static List<String> getRepositoryList(File repositoriesFolder, boolean exportAll,
boolean readNested) {
List<String> list = new ArrayList<String>();
list.addAll(getNestedRepositories(repositoriesFolder, repositoriesFolder, exportAll, readNested));
list.addAll(getNestedRepositories(repositoriesFolder, repositoriesFolder, exportAll,
readNested));
Collections.sort(list);
return list;
}
public static List<String> getNestedRepositories(File repositoriesFolder, File folder, boolean exportAll, boolean readNested) {
public static List<String> getNestedRepositories(File repositoriesFolder, File folder,
boolean exportAll, boolean readNested) {
String basefile = repositoriesFolder.getAbsolutePath();
List<String> list = new ArrayList<String>();
if (folder == null || !folder.exists()) {
@@ -112,12 +116,16 @@ public class JGitUtils {
// then look for folder.git/HEAD or folder/HEAD and
// folder/config
if (!isGitRepository) {
if ((file.getName().endsWith(Constants.DOT_GIT_EXT) && new File(file, Constants.HEAD).exists()) || (new File(file, "config").exists() && new File(file, Constants.HEAD).exists())) {
if ((file.getName().endsWith(Constants.DOT_GIT_EXT) && new File(file,
Constants.HEAD).exists())
|| (new File(file, "config").exists() && new File(file, Constants.HEAD)
.exists())) {
gitFolder = file;
isGitRepository = true;
}
}
boolean exportRepository = isGitRepository && (exportAll || new File(gitFolder, "git-daemon-export-ok").exists());
boolean exportRepository = isGitRepository
&& (exportAll || new File(gitFolder, "git-daemon-export-ok").exists());
if (exportRepository) {
// determine repository name relative to repositories folder
@@ -131,7 +139,8 @@ public class JGitUtils {
// look for nested repositories
if (readNested) {
list.addAll(getNestedRepositories(repositoriesFolder, file, exportAll, readNested));
list.addAll(getNestedRepositories(repositoriesFolder, file, exportAll,
readNested));
}
}
}
@@ -209,13 +218,13 @@ public class JGitUtils {
public static Map<ObjectId, List<String>> getAllRefs(Repository r) {
Map<ObjectId, List<String>> refs = new HashMap<ObjectId, List<String>>();
Map<AnyObjectId, Set<Ref>> allRefs = r.getAllRefsByPeeledObjectId();
for (AnyObjectId id : allRefs.keySet()) {
for (Entry<AnyObjectId, Set<Ref>> setRefs : allRefs.entrySet()) {
List<String> list = new ArrayList<String>();
for (Ref setRef : allRefs.get(id)) {
for (Ref setRef : setRefs.getValue()) {
String name = setRef.getName();
list.add(name);
}
refs.put(id.toObjectId(), list);
refs.put(setRefs.getKey().toObjectId(), list);
}
return refs;
}
@@ -223,15 +232,15 @@ public class JGitUtils {
public static Map<ObjectId, List<String>> getRefs(Repository r, String baseRef) {
Map<ObjectId, List<String>> refs = new HashMap<ObjectId, List<String>>();
Map<AnyObjectId, Set<Ref>> allRefs = r.getAllRefsByPeeledObjectId();
for (AnyObjectId id : allRefs.keySet()) {
for (Entry<AnyObjectId, Set<Ref>> setRefs : allRefs.entrySet()) {
List<String> list = new ArrayList<String>();
for (Ref setRef : allRefs.get(id)) {
for (Ref setRef : setRefs.getValue()) {
String name = setRef.getName();
if (name.startsWith(baseRef)) {
list.add(name);
}
}
refs.put(id.toObjectId(), list);
refs.put(setRefs.getKey().toObjectId(), list);
}
return refs;
}
@@ -378,9 +387,11 @@ public class JGitUtils {
List<DiffEntry> diffs = df.scan(parentTree, commitTree);
for (DiffEntry diff : diffs) {
if (diff.getChangeType().equals(ChangeType.DELETE)) {
list.add(new PathChangeModel(diff.getOldPath(), diff.getOldPath(), 0, diff.getNewMode().getBits(), commit.getId().getName(), diff.getChangeType()));
list.add(new PathChangeModel(diff.getOldPath(), diff.getOldPath(), 0, diff
.getNewMode().getBits(), commit.getId().getName(), diff.getChangeType()));
} else {
list.add(new PathChangeModel(diff.getNewPath(), diff.getNewPath(), 0, diff.getNewMode().getBits(), commit.getId().getName(), diff.getChangeType()));
list.add(new PathChangeModel(diff.getNewPath(), diff.getNewPath(), 0, diff
.getNewMode().getBits(), commit.getId().getName(), diff.getChangeType()));
}
}
} catch (Throwable t) {
@@ -453,15 +464,18 @@ public class JGitUtils {
return getCommitDiff(r, null, commit, null, outputType);
}
public static String getCommitDiff(Repository r, RevCommit commit, String path, DiffOutputType outputType) {
public static String getCommitDiff(Repository r, RevCommit commit, String path,
DiffOutputType outputType) {
return getCommitDiff(r, null, commit, path, outputType);
}
public static String getCommitDiff(Repository r, RevCommit baseCommit, RevCommit commit, DiffOutputType outputType) {
public static String getCommitDiff(Repository r, RevCommit baseCommit, RevCommit commit,
DiffOutputType outputType) {
return getCommitDiff(r, baseCommit, commit, null, outputType);
}
public static String getCommitDiff(Repository r, RevCommit baseCommit, RevCommit commit, String path, DiffOutputType outputType) {
public static String getCommitDiff(Repository r, RevCommit baseCommit, RevCommit commit,
String path, DiffOutputType outputType) {
try {
RevTree baseTree;
if (baseCommit == null) {
@@ -526,15 +540,8 @@ public class JGitUtils {
return null;
}
public static String getCommitPatch(Repository r, RevCommit commit) {
return getCommitPatch(r, commit);
}
public static String getCommitPatch(Repository r, RevCommit commit, String path) {
return getCommitPatch(r, null, commit, path);
}
public static String getCommitPatch(Repository r, RevCommit baseCommit, RevCommit commit, String path) {
public static String getCommitPatch(Repository r, RevCommit baseCommit, RevCommit commit,
String path) {
try {
RevTree baseTree;
if (baseCommit == null) {
@@ -593,12 +600,14 @@ public class JGitUtils {
}
try {
if (!walk.isSubtree()) {
size = walk.getObjectReader().getObjectSize(walk.getObjectId(0), Constants.OBJ_BLOB);
size = walk.getObjectReader()
.getObjectSize(walk.getObjectId(0), Constants.OBJ_BLOB);
}
} catch (Throwable t) {
LOGGER.error("Failed to retrieve blob size", t);
}
return new PathModel(name, walk.getPathString(), size, walk.getFileMode(0).getBits(), commit.getName());
return new PathModel(name, walk.getPathString(), size, walk.getFileMode(0).getBits(),
commit.getName());
}
public static String getPermissionsFromMode(int mode) {
@@ -633,7 +642,8 @@ public class JGitUtils {
return getRevLog(r, objectId, null, offset, maxCount);
}
public static List<RevCommit> getRevLog(Repository r, String objectId, String path, int offset, int maxCount) {
public static List<RevCommit> getRevLog(Repository r, String objectId, String path, int offset,
int maxCount) {
List<RevCommit> list = new ArrayList<RevCommit>();
if (!hasCommits(r)) {
return list;
@@ -646,7 +656,9 @@ public class JGitUtils {
ObjectId object = r.resolve(objectId);
walk.markStart(walk.parseCommit(object));
if (!StringUtils.isEmpty(path)) {
TreeFilter filter = AndTreeFilter.create(PathFilterGroup.createFromStrings(Collections.singleton(path)), TreeFilter.ANY_DIFF);
TreeFilter filter = AndTreeFilter.create(
PathFilterGroup.createFromStrings(Collections.singleton(path)),
TreeFilter.ANY_DIFF);
walk.setTreeFilter(filter);
}
Iterable<RevCommit> revlog = walk;
@@ -693,7 +705,8 @@ public class JGitUtils {
}
}
public static List<RevCommit> searchRevlogs(Repository r, String objectId, String value, final SearchType type, int offset, int maxCount) {
public static List<RevCommit> searchRevlogs(Repository r, String objectId, String value,
final SearchType type, int offset, int maxCount) {
final String lcValue = value.toLowerCase();
List<RevCommit> list = new ArrayList<RevCommit>();
if (!hasCommits(r)) {
@@ -712,12 +725,17 @@ public class JGitUtils {
}
@Override
public boolean include(RevWalk walker, RevCommit commit) throws StopWalkException, MissingObjectException, IncorrectObjectTypeException, IOException {
public boolean include(RevWalk walker, RevCommit commit) throws StopWalkException,
MissingObjectException, IncorrectObjectTypeException, IOException {
switch (type) {
case AUTHOR:
return (commit.getAuthorIdent().getName().toLowerCase().indexOf(lcValue) > -1) || (commit.getAuthorIdent().getEmailAddress().toLowerCase().indexOf(lcValue) > -1);
return (commit.getAuthorIdent().getName().toLowerCase().indexOf(lcValue) > -1)
|| (commit.getAuthorIdent().getEmailAddress().toLowerCase()
.indexOf(lcValue) > -1);
case COMMITTER:
return (commit.getCommitterIdent().getName().toLowerCase().indexOf(lcValue) > -1) || (commit.getCommitterIdent().getEmailAddress().toLowerCase().indexOf(lcValue) > -1);
return (commit.getCommitterIdent().getName().toLowerCase().indexOf(lcValue) > -1)
|| (commit.getCommitterIdent().getEmailAddress().toLowerCase()
.indexOf(lcValue) > -1);
case COMMIT:
return commit.getFullMessage().toLowerCase().indexOf(lcValue) > -1;
}
@@ -770,10 +788,10 @@ public class JGitUtils {
List<RefModel> list = new ArrayList<RefModel>();
try {
Map<String, Ref> map = r.getRefDatabase().getRefs(refs);
for (String name : map.keySet()) {
Ref ref = map.get(name);
for (Entry<String, Ref> entry : map.entrySet()) {
Ref ref = entry.getValue();
RevCommit commit = getCommit(r, ref.getObjectId().getName());
list.add(new RefModel(name, ref, commit));
list.add(new RefModel(entry.getKey(), ref, commit));
}
Collections.sort(list);
Collections.reverse(list);
@@ -787,10 +805,11 @@ public class JGitUtils {
}
public static Ref getRef(Repository r, String id) {
// FIXME
try {
Map<String, Ref> map = r.getRefDatabase().getRefs(id);
for (String name : map.keySet()) {
return map.get(name);
for (Entry<String, Ref> entry : map.entrySet()) {
return entry.getValue();
}
} catch (IOException e) {
LOGGER.error("Failed to retrieve ref " + id, e);
@@ -799,7 +818,7 @@ public class JGitUtils {
}
public static Date getCommitDate(RevCommit commit) {
return new Date(commit.getCommitTime() * 1000l);
return new Date(commit.getCommitTime() * 1000L);
}
public static String getDisplayName(PersonIdent person) {
@@ -807,7 +826,7 @@ public class JGitUtils {
r.append(person.getName());
r.append(" <");
r.append(person.getEmailAddress());
r.append(">");
r.append('>');
return r.toString();
}
@@ -826,7 +845,8 @@ public class JGitUtils {
return null;
}
public static boolean zip(Repository r, String basePath, String objectId, OutputStream os) throws Exception {
public static boolean zip(Repository r, String basePath, String objectId, OutputStream os)
throws Exception {
RevCommit commit = getCommit(r, objectId);
if (commit == null) {
return false;
@@ -844,7 +864,8 @@ public class JGitUtils {
walk.setRecursive(true);
while (walk.next()) {
ZipEntry entry = new ZipEntry(walk.getPathString());
entry.setSize(walk.getObjectReader().getObjectSize(walk.getObjectId(0), Constants.OBJ_BLOB));
entry.setSize(walk.getObjectReader().getObjectSize(walk.getObjectId(0),
Constants.OBJ_BLOB));
entry.setComment(commit.getName());
zos.putNextEntry(entry);
@@ -889,7 +910,8 @@ public class JGitUtils {
RevCommit firstCommit = getFirstCommit(r, Constants.HEAD);
RevCommit lastCommit = walk.parseCommit(object);
int diffDays = (lastCommit.getCommitTime() - firstCommit.getCommitTime()) / (60 * 60 * 24);
int diffDays = (lastCommit.getCommitTime() - firstCommit.getCommitTime())
/ (60 * 60 * 24);
total.duration = diffDays;
DateFormat df;
if (diffDays <= 90) {
@@ -908,8 +930,9 @@ public class JGitUtils {
for (RevCommit rev : revlog) {
Date d = getCommitDate(rev);
String p = df.format(d);
if (!metricMap.containsKey(p))
if (!metricMap.containsKey(p)) {
metricMap.put(p, new Metric(p));
}
Metric m = metricMap.get(p);
m.count++;
total.count++;
@@ -937,7 +960,7 @@ public class JGitUtils {
try {
// search for ticgit branch in local heads
for (RefModel ref : getLocalBranches(r, -1)) {
if (ref.getDisplayName().endsWith("ticgit")) {
if (ref.displayName.endsWith("ticgit")) {
ticgitBranch = ref;
break;
}
@@ -946,7 +969,7 @@ public class JGitUtils {
// search for ticgit branch in remote heads
if (ticgitBranch == null) {
for (RefModel ref : getRemoteBranches(r, -1)) {
if (ref.getDisplayName().endsWith("ticgit")) {
if (ref.displayName.endsWith("ticgit")) {
ticgitBranch = ref;
break;
}
@@ -960,7 +983,7 @@ public class JGitUtils {
public static List<TicketModel> getTickets(Repository r) {
RefModel ticgitBranch = getTicketsBranch(r);
List<PathModel> paths = getFilesInPath(r, null, ticgitBranch.getCommit());
List<PathModel> paths = getFilesInPath(r, null, ticgitBranch.commit);
List<TicketModel> tickets = new ArrayList<TicketModel>();
for (PathModel ticketFolder : paths) {
if (ticketFolder.isTree()) {
@@ -993,9 +1016,9 @@ public class JGitUtils {
}
private static void readTicketContents(Repository r, RefModel ticketsBranch, TicketModel ticket) {
List<PathModel> ticketFiles = getFilesInPath(r, ticket.name, ticketsBranch.getCommit());
List<PathModel> ticketFiles = getFilesInPath(r, ticket.name, ticketsBranch.commit);
for (PathModel file : ticketFiles) {
String content = getRawContentAsString(r, ticketsBranch.getCommit(), file.path).trim();
String content = getRawContentAsString(r, ticketsBranch.commit, file.path).trim();
if (file.name.equals("TICKET_ID")) {
ticket.id = content;
} else if (file.name.equals("TITLE")) {
@@ -1028,7 +1051,7 @@ public class JGitUtils {
public static String getTicketContent(Repository r, String filePath) {
RefModel ticketsBranch = getTicketsBranch(r);
if (ticketsBranch != null) {
return getRawContentAsString(r, ticketsBranch.getCommit(), filePath);
return getRawContentAsString(r, ticketsBranch.commit, filePath);
}
return "";
}

+ 7
- 4
src/com/gitblit/utils/MarkdownUtils.java View File

@@ -26,41 +26,44 @@ import org.tautua.markdownpapers.parser.ParseException;
public class MarkdownUtils {
public static String transformMarkdown(String markdown) throws java.text.ParseException {
// Read raw markdown content and transform it to html
// Read raw markdown content and transform it to html
StringReader reader = new StringReader(markdown);
StringWriter writer = new StringWriter();
try {
Markdown md = new Markdown();
md.transform(reader, writer);
return writer.toString();
} catch (ParseException p) {
} catch (ParseException p) {
throw new java.text.ParseException(p.getMessage(), 0);
} finally {
reader.close();
try {
writer.close();
} catch (IOException e) {
// IGNORE
}
}
}
public static String transformMarkdown(Reader markdownReader) throws java.text.ParseException {
// Read raw markdown content and transform it to html
// Read raw markdown content and transform it to html
StringWriter writer = new StringWriter();
try {
Markdown md = new Markdown();
md.transform(markdownReader, writer);
return writer.toString();
} catch (ParseException p) {
} catch (ParseException p) {
throw new java.text.ParseException(p.getMessage(), 0);
} finally {
try {
markdownReader.close();
} catch (IOException e) {
// IGNORE
}
try {
writer.close();
} catch (IOException e) {
// IGNORE
}
}
}

+ 20
- 13
src/com/gitblit/utils/PatchFormatter.java View File

@@ -34,9 +34,9 @@ public class PatchFormatter extends DiffFormatter {
private final OutputStream os;
private PatchTouple currentTouple = null;
private Map<String, PatchTouple> changes = new HashMap<String, PatchTouple>();
Map<String, PatchTouple> changes = new HashMap<String, PatchTouple>();
private PatchTouple currentTouple;
public PatchFormatter(OutputStream os) {
super(os);
@@ -50,7 +50,8 @@ public class PatchFormatter extends DiffFormatter {
}
@Override
protected void writeLine(final char prefix, final RawText text, final int cur) throws IOException {
protected void writeLine(final char prefix, final RawText text, final int cur)
throws IOException {
switch (prefix) {
case '+':
currentTouple.insertions++;
@@ -68,9 +69,11 @@ public class PatchFormatter extends DiffFormatter {
// I have no idea why that is there. it seems to be a constant.
patch.append("From " + commit.getName() + " Mon Sep 17 00:00:00 2001" + "\n");
patch.append("From: " + JGitUtils.getDisplayName(commit.getAuthorIdent()) + "\n");
patch.append("Date: " + (new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z").format(new Date(commit.getCommitTime() * 1000l))) + "\n");
patch.append("Date: "
+ (new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z").format(new Date(commit
.getCommitTime() * 1000L))) + "\n");
patch.append("Subject: [PATCH] " + commit.getShortMessage() + "\n");
patch.append("\n");
patch.append('\n');
patch.append("---");
int maxPathLen = 0;
int files = 0;
@@ -93,26 +96,30 @@ public class PatchFormatter extends DiffFormatter {
}
for (String path : changes.keySet()) {
PatchTouple touple = changes.get(path);
patch.append("\n " + StringUtils.rightPad(path, maxPathLen, ' ') + " | " + StringUtils.leftPad("" + touple.total(), 4, ' ') + " " + touple.relativeScale(unit));
patch.append("\n " + StringUtils.rightPad(path, maxPathLen, ' ') + " | "
+ StringUtils.leftPad("" + touple.total(), 4, ' ') + " "
+ touple.relativeScale(unit));
}
patch.append(MessageFormat.format("\n {0} files changed, {1} insertions(+), {2} deletions(-)\n\n", files, insertions, deletions));
patch.append(MessageFormat.format(
"\n {0} files changed, {1} insertions(+), {2} deletions(-)\n\n", files, insertions,
deletions));
patch.append(os.toString());
patch.append("\n--\n");
patch.append(Constants.getRunningVersion());
patch.append(Constants.getGitBlitVersion());
return patch.toString();
}
private class PatchTouple {
int insertions = 0;
int deletions = 0;
private static class PatchTouple {
int insertions;
int deletions;
int total() {
return insertions + deletions;
}
String relativeScale(int unit) {
int plus = (insertions / unit);
int minus = (deletions / unit);
int plus = insertions / unit;
int minus = deletions / unit;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < plus; i++) {
sb.append('+');

+ 6
- 5
src/com/gitblit/utils/StringUtils.java View File

@@ -20,7 +20,6 @@ import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;
public class StringUtils {
public static boolean isEmpty(String value) {
@@ -47,8 +46,9 @@ public class StringUtils {
retStr.append("&nbsp;");
} else if (changeSpace && inStr.charAt(i) == '\t') {
retStr.append(" &nbsp; &nbsp;");
} else
} else {
retStr.append(inStr.charAt(i));
}
i++;
}
return retStr.toString();
@@ -117,8 +117,9 @@ public class StringUtils {
byte[] sha1hash = md.digest();
StringBuilder sb = new StringBuilder(sha1hash.length * 2);
for (int i = 0; i < sha1hash.length; i++) {
if (((int) sha1hash[i] & 0xff) < 0x10)
sb.append("0");
if (((int) sha1hash[i] & 0xff) < 0x10) {
sb.append('0');
}
sb.append(Long.toString((int) sha1hash[i] & 0xff, 16));
}
return sb.toString();
@@ -126,7 +127,7 @@ public class StringUtils {
throw new RuntimeException(t);
}
}
public static String getRootPath(String path) {
if (path.indexOf('/') > -1) {
return path.substring(0, path.indexOf('/'));

+ 31
- 20
src/com/gitblit/utils/TimeUtils.java View File

@@ -18,24 +18,28 @@ package com.gitblit.utils;
import java.util.Date;
public class TimeUtils {
private final static long min = 1000 * 60l;
public static final long MIN = 1000 * 60L;
private final static long halfhour = min * 30l;
public static final long HALFHOUR = MIN * 30L;
private final static long onehour = halfhour * 2;
public static final long ONEHOUR = HALFHOUR * 2;
private final static long oneday = onehour * 24l;
public static final long ONEDAY = ONEHOUR * 24L;
public static final long ONEYEAR = ONEDAY * 365L;
@SuppressWarnings("deprecation")
public static boolean isToday(Date date) {
Date now = new Date();
return now.getDate() == date.getDate() && now.getMonth() == date.getMonth() && now.getYear() == date.getYear();
return now.getDate() == date.getDate() && now.getMonth() == date.getMonth()
&& now.getYear() == date.getYear();
}
@SuppressWarnings("deprecation")
public static boolean isYesterday(Date date) {
Date now = new Date();
return now.getDate() == (date.getDate() + 1) && now.getMonth() == date.getMonth() && now.getYear() == date.getYear();
return now.getDate() == (date.getDate() + 1) && now.getMonth() == date.getMonth()
&& now.getYear() == date.getYear();
}
public static String duration(int days) {
@@ -56,17 +60,18 @@ public class TimeUtils {
}
} else {
int months = rem / 30;
int remDays = (rem % 30);
int remDays = rem % 30;
String monthsString;
if (months == 0) {
monthsString = yearsString;
} else {
monthsString = yearsString + ", " + months + (months > 1 ? " months" : " month");
monthsString = yearsString + ", " + months
+ (months > 1 ? " months" : " month");
}
if (remDays == 0) {
return monthsString;
return monthsString;
} else {
return monthsString + ", " + remDays + (remDays > 1 ? " days":" day");
return monthsString + ", " + remDays + (remDays > 1 ? " days" : " day");
}
}
}
@@ -74,9 +79,10 @@ public class TimeUtils {
public static int minutesAgo(Date date, long endTime, boolean roundup) {
long diff = endTime - date.getTime();
int mins = (int) (diff / min);
if (roundup && (diff % min) >= 30)
int mins = (int) (diff / MIN);
if (roundup && (diff % MIN) >= 30) {
mins++;
}
return mins;
}
@@ -86,17 +92,19 @@ public class TimeUtils {
public static int hoursAgo(Date date, boolean roundup) {
long diff = System.currentTimeMillis() - date.getTime();
int hours = (int) (diff / onehour);
if (roundup && (diff % onehour) >= halfhour)
int hours = (int) (diff / ONEHOUR);
if (roundup && (diff % ONEHOUR) >= HALFHOUR) {
hours++;
}
return hours;
}
public static int daysAgo(Date date, boolean roundup) {
long diff = System.currentTimeMillis() - date.getTime();
int days = (int) (diff / oneday);
if (roundup && (diff % oneday) > 0)
int days = (int) (diff / ONEDAY);
if (roundup && (diff % ONEDAY) > 0) {
days++;
}
return days;
}
@@ -138,18 +146,21 @@ public class TimeUtils {
ago = days + " day" + (days > 1 ? "s" : "") + " ago";
} else if (days <= 90) {
int weeks = days / 7;
if (weeks == 12)
if (weeks == 12) {
ago = "3 months ago";
else
} else {
ago = weeks + " weeks ago";
}
} else if (days > 90) {
int months = days / 30;
int weeks = (days % 30) / 7;
if (weeks >= 2)
if (weeks >= 2) {
months++;
}
ago = months + " month" + (months > 1 ? "s" : "") + " ago";
} else
} else {
ago = days + " day" + (days > 1 ? "s" : "") + " ago";
}
} else if (days == 365) {
ago = "1 year ago";
} else {

+ 13
- 11
src/com/gitblit/wicket/AuthorizationStrategy.java View File

@@ -25,7 +25,8 @@ import com.gitblit.Keys;
import com.gitblit.wicket.models.UserModel;
import com.gitblit.wicket.pages.RepositoriesPage;
public class AuthorizationStrategy extends AbstractPageAuthorizationStrategy implements IUnauthorizedComponentInstantiationListener {
public class AuthorizationStrategy extends AbstractPageAuthorizationStrategy implements
IUnauthorizedComponentInstantiationListener {
public AuthorizationStrategy() {
}
@@ -34,16 +35,16 @@ public class AuthorizationStrategy extends AbstractPageAuthorizationStrategy imp
@Override
protected boolean isPageAuthorized(Class pageClass) {
if (BasePage.class.isAssignableFrom(pageClass)) {
boolean authenticateView = GitBlit.self().settings().getBoolean(Keys.web.authenticateViewPages, true);
boolean authenticateAdmin = GitBlit.self().settings().getBoolean(Keys.web.authenticateAdminPages, true);
boolean allowAdmin = GitBlit.self().settings().getBoolean(Keys.web.allowAdministration, true);
GitBlitWebSession session = GitBlitWebSession.get();
boolean authenticateView = GitBlit.getBoolean(Keys.web.authenticateViewPages, true);
boolean authenticateAdmin = GitBlit.getBoolean(Keys.web.authenticateAdminPages, true);
boolean allowAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, true);
GitBlitWebSession session = GitBlitWebSession.get();
if (authenticateView && !session.isLoggedIn()) {
// authentication required
return false;
}
UserModel user = session.getUser();
if (pageClass.isAnnotationPresent(AdminPage.class)) {
// admin page
@@ -51,7 +52,7 @@ public class AuthorizationStrategy extends AbstractPageAuthorizationStrategy imp
if (authenticateAdmin) {
// authenticate admin
if (user != null) {
return user.canAdmin();
return user.canAdmin;
}
return false;
} else {
@@ -59,7 +60,7 @@ public class AuthorizationStrategy extends AbstractPageAuthorizationStrategy imp
return true;
}
} else {
//admin prohibited
// admin prohibited
return false;
}
}
@@ -71,10 +72,11 @@ public class AuthorizationStrategy extends AbstractPageAuthorizationStrategy imp
public void onUnauthorizedInstantiation(Component component) {
if (component instanceof BasePage) {
GitBlitWebSession session = GitBlitWebSession.get();
if (!session.isLoggedIn())
if (!session.isLoggedIn()) {
throw new RestartResponseAtInterceptPageException(LoginPage.class);
else
} else {
throw new RestartResponseAtInterceptPageException(RepositoriesPage.class);
}
}
}
}

+ 10
- 6
src/com/gitblit/wicket/BasePage.java View File

@@ -57,22 +57,25 @@ public abstract class BasePage extends WebPage {
add(new Label("title", getServerName()));
}
// header
String siteName = GitBlit.self().settings().getString(Keys.web.siteName, Constants.NAME);
String siteName = GitBlit.getString(Keys.web.siteName, Constants.NAME);
if (siteName == null || siteName.trim().length() == 0) {
siteName = Constants.NAME;
}
add(new Label("siteName", siteName));
add(new LinkPanel("repositoryName", null, repositoryName, SummaryPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
add(new LinkPanel("repositoryName", null, repositoryName, SummaryPage.class,
WicketUtils.newRepositoryParameter(repositoryName)));
add(new Label("pageName", pageName));
// Feedback panel for info, warning, and non-fatal error messages
add(new FeedbackPanel("feedback"));
// footer
if (GitBlit.self().settings().getBoolean(Keys.web.authenticateViewPages, true) || GitBlit.self().settings().getBoolean(Keys.web.authenticateAdminPages, true)) {
if (GitBlit.getBoolean(Keys.web.authenticateViewPages, true)
|| GitBlit.getBoolean(Keys.web.authenticateAdminPages, true)) {
if (GitBlitWebSession.get().isLoggedIn()) {
// logout
add(new LinkPanel("userPanel", null, getString("gb.logout") + " " + GitBlitWebSession.get().getUser().toString(), LogoutPage.class));
add(new LinkPanel("userPanel", null, getString("gb.logout") + " "
+ GitBlitWebSession.get().getUser().toString(), LogoutPage.class));
} else {
// login
add(new LinkPanel("userPanel", null, getString("gb.login"), LoginPage.class));
@@ -81,7 +84,7 @@ public abstract class BasePage extends WebPage {
add(new Label("userPanel", ""));
}
add(new Label("gbVersion", "v" + Constants.VERSION));
if (GitBlit.self().settings().getBoolean(Keys.web.aggressiveHeapManagement, false)) {
if (GitBlit.getBoolean(Keys.web.aggressiveHeapManagement, false)) {
System.gc();
}
}
@@ -108,7 +111,8 @@ public abstract class BasePage extends WebPage {
}
protected TimeZone getTimeZone() {
return GitBlit.self().settings().getBoolean(Keys.web.useClientTimezone, false) ? GitBlitWebSession.get().getTimezone() : TimeZone.getDefault();
return GitBlit.getBoolean(Keys.web.useClientTimezone, false) ? GitBlitWebSession.get()
.getTimezone() : TimeZone.getDefault();
}
protected String getServerName() {

+ 34
- 24
src/com/gitblit/wicket/GitBlitWebApp.java View File

@@ -20,6 +20,7 @@ import org.apache.wicket.Page;
import org.apache.wicket.Request;
import org.apache.wicket.Response;
import org.apache.wicket.Session;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.request.target.coding.MixedParamUrlCodingStrategy;
@@ -52,7 +53,8 @@ public class GitBlitWebApp extends WebApplication {
super.init();
// Setup page authorization mechanism
boolean useAuthentication = GitBlit.self().settings().getBoolean(Keys.web.authenticateViewPages, false) || GitBlit.self().settings().getBoolean(Keys.web.authenticateAdminPages, false);
boolean useAuthentication = GitBlit.getBoolean(Keys.web.authenticateViewPages, false)
|| GitBlit.getBoolean(Keys.web.authenticateAdminPages, false);
if (useAuthentication) {
AuthorizationStrategy authStrategy = new AuthorizationStrategy();
getSecuritySettings().setAuthorizationStrategy(authStrategy);
@@ -60,41 +62,48 @@ public class GitBlitWebApp extends WebApplication {
}
// Grab Browser info (like timezone, etc)
if (GitBlit.self().settings().getBoolean(Keys.web.useClientTimezone, false)) {
if (GitBlit.getBoolean(Keys.web.useClientTimezone, false)) {
getRequestCycleSettings().setGatherExtendedBrowserInfo(true);
}
// setup the standard gitweb-ish urls
mount(new MixedParamUrlCodingStrategy("/summary", SummaryPage.class, new String[] { "r" }));
mount(new MixedParamUrlCodingStrategy("/log", LogPage.class, new String[] { "r", "h" }));
mount(new MixedParamUrlCodingStrategy("/tags", TagsPage.class, new String[] { "r" }));
mount(new MixedParamUrlCodingStrategy("/branches", BranchesPage.class, new String[] { "r" }));
mount(new MixedParamUrlCodingStrategy("/commit", CommitPage.class, new String[] { "r", "h" }));
mount(new MixedParamUrlCodingStrategy("/tag", TagPage.class, new String[] { "r", "h" }));
mount(new MixedParamUrlCodingStrategy("/tree", TreePage.class, new String[] { "r", "h", "f" }));
mount(new MixedParamUrlCodingStrategy("/blob", BlobPage.class, new String[] { "r", "h", "f" }));
mount(new MixedParamUrlCodingStrategy("/raw", RawPage.class, new String[] { "r", "h", "f" }));
mount(new MixedParamUrlCodingStrategy("/blobdiff", BlobDiffPage.class, new String[] { "r", "h", "f" }));
mount(new MixedParamUrlCodingStrategy("/commitdiff", CommitDiffPage.class, new String[] { "r", "h" }));
mount(new MixedParamUrlCodingStrategy("/patch", PatchPage.class, new String[] { "r", "h", "f" }));
mount(new MixedParamUrlCodingStrategy("/history", HistoryPage.class, new String[] { "r", "h", "f" }));
mount(new MixedParamUrlCodingStrategy("/search", SearchPage.class, new String[] { }));
mount("/summary", SummaryPage.class, "r");
mount("/log", LogPage.class, "r", "h");
mount("/tags", TagsPage.class, "r");
mount("/branches", BranchesPage.class, "r");
mount("/commit", CommitPage.class, "r", "h");
mount("/tag", TagPage.class, "r", "h");
mount("/tree", TreePage.class, "r", "h", "f");
mount("/blob", BlobPage.class, "r", "h", "f");
mount("/raw", RawPage.class, "r", "h", "f");
mount("/blobdiff", BlobDiffPage.class, "r", "h", "f");
mount("/commitdiff", CommitDiffPage.class, "r", "h");
mount("/patch", PatchPage.class, "r", "h", "f");
mount("/history", HistoryPage.class, "r", "h", "f");
mount("/search", SearchPage.class);
// setup ticket urls
mount(new MixedParamUrlCodingStrategy("/tickets", TicketsPage.class, new String[] { "r" }));
mount(new MixedParamUrlCodingStrategy("/ticket", TicketPage.class, new String[] { "r", "h", "f" }));
mount("/tickets", TicketsPage.class, "r");
mount("/ticket", TicketPage.class, "r", "h", "f");
// setup the markdown urls
mount(new MixedParamUrlCodingStrategy("/docs", DocsPage.class, new String[] { "r" }));
mount(new MixedParamUrlCodingStrategy("/markdown", MarkdownPage.class, new String[] { "r", "h", "f" }));
mount("/docs", DocsPage.class, "r");
mount("/markdown", MarkdownPage.class, "r", "h", "f");
// setup login/logout urls, if we are using authentication
if (useAuthentication) {
mount(new MixedParamUrlCodingStrategy("/login", LoginPage.class, new String[] {}));
mount(new MixedParamUrlCodingStrategy("/logout", LogoutPage.class, new String[] {}));
mount("/login", LoginPage.class);
mount("/logout", LogoutPage.class);
}
}
private void mount(String location, Class<? extends WebPage> clazz, String... parameters) {
if (parameters == null) {
parameters = new String[] {};
}
mount(new MixedParamUrlCodingStrategy(location, clazz, parameters));
}
@Override
public Class<? extends Page> getHomePage() {
return RepositoriesPage.class;
@@ -107,8 +116,9 @@ public class GitBlitWebApp extends WebApplication {
@Override
public final String getConfigurationType() {
if (GitBlit.self().isDebugMode())
if (GitBlit.self().isDebugMode()) {
return Application.DEVELOPMENT;
}
return Application.DEPLOYMENT;
}

+ 0
- 4
src/com/gitblit/wicket/GitBlitWebApp.properties View File

@@ -38,7 +38,6 @@ gb.tickets = tickets
gb.pageFirst = first
gb.pagePrevious prev
gb.pageNext = next
gb.parent = parent
gb.head = HEAD
gb.blame = blame
gb.login = Login
@@ -67,18 +66,15 @@ gb.missingUsername = Missing Username
gb.edit = edit
gb.searchTypeTooltip = Select Search Type
gb.searchTooltip = Search Git:Blit
gb.rename = rename
gb.delete = delete
gb.docs = docs
gb.accessRestriction = access restriction
gb.name = name
gb.description = description
gb.enableTickets = enable tickets
gb.enableDocs = enable docs
gb.save = save
gb.showRemoteBranches = show remote branches
gb.editUsers = edit users
gb.password = password
gb.confirmPassword = confirm password
gb.restrictedRepositories = restricted repositories
gb.canAdmin can admin

+ 7
- 7
src/com/gitblit/wicket/GitBlitWebSession.java View File

@@ -28,11 +28,11 @@ public final class GitBlitWebSession extends WebSession {
private static final long serialVersionUID = 1L;
protected TimeZone timezone = null;
protected TimeZone timezone;
private UserModel user = null;
private String errorMessage = null;
private UserModel user;
private String errorMessage;
public GitBlitWebSession(Request request) {
super(request);
@@ -51,7 +51,7 @@ public final class GitBlitWebSession extends WebSession {
if (user == null) {
return false;
}
return user.canAdmin();
return user.canAdmin;
}
public UserModel getUser() {
@@ -72,11 +72,11 @@ public final class GitBlitWebSession extends WebSession {
}
return timezone;
}
public void cacheErrorMessage(String message) {
this.errorMessage = message;
}
public String clearErrorMessage() {
String msg = errorMessage;
errorMessage = null;

+ 7
- 4
src/com/gitblit/wicket/LinkPanel.java View File

@@ -31,15 +31,18 @@ public class LinkPanel extends Panel {
private final IModel<String> labelModel;
public LinkPanel(String wicketId, String linkCssClass, String label, Class<? extends WebPage> clazz) {
public LinkPanel(String wicketId, String linkCssClass, String label,
Class<? extends WebPage> clazz) {
this(wicketId, linkCssClass, new Model<String>(label), clazz, null);
}
public LinkPanel(String wicketId, String linkCssClass, String label, Class<? extends WebPage> clazz, PageParameters parameters) {
public LinkPanel(String wicketId, String linkCssClass, String label,
Class<? extends WebPage> clazz, PageParameters parameters) {
this(wicketId, linkCssClass, new Model<String>(label), clazz, parameters);
}
public LinkPanel(String wicketId, String linkCssClass, IModel<String> model, Class<? extends WebPage> clazz, PageParameters parameters) {
public LinkPanel(String wicketId, String linkCssClass, IModel<String> model,
Class<? extends WebPage> clazz, PageParameters parameters) {
super(wicketId);
this.labelModel = model;
Link<Void> link = null;

+ 5
- 4
src/com/gitblit/wicket/LoginPage.java View File

@@ -39,7 +39,7 @@ public class LoginPage extends WebPage {
public LoginPage(PageParameters params) {
super(params);
add(new Label("title", GitBlit.self().settings().getString(Keys.web.siteName, Constants.NAME)));
add(new Label("title", GitBlit.getString(Keys.web.siteName, Constants.NAME)));
add(new Label("name", Constants.NAME));
Form<Void> loginForm = new LoginForm("loginForm");
@@ -69,13 +69,14 @@ public class LoginPage extends WebPage {
char[] password = LoginPage.this.password.getObject().toCharArray();
UserModel user = GitBlit.self().authenticate(username, password);
if (user == null)
if (user == null) {
error("Invalid username or password!");
else
} else {
loginUser(user);
}
}
}
private void loginUser(UserModel user) {
if (user != null) {
// Set the user into the session

+ 67
- 38
src/com/gitblit/wicket/RepositoryPage.java View File

@@ -21,6 +21,7 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.wicket.Component;
import org.apache.wicket.PageParameters;
@@ -64,9 +65,9 @@ public abstract class RepositoryPage extends BasePage {
protected final String repositoryName;
protected final String objectId;
private transient Repository r = null;
private transient Repository r;
private RepositoryModel m = null;
private RepositoryModel m;
private final Logger logger = LoggerFactory.getLogger(RepositoryPage.class);
@@ -96,13 +97,18 @@ public abstract class RepositoryPage extends BasePage {
Repository r = getRepository();
RepositoryModel model = getRepositoryModel();
// standard page links
add(new BookmarkablePageLink<Void>("summary", SummaryPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
add(new BookmarkablePageLink<Void>("log", LogPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
add(new BookmarkablePageLink<Void>("branches", BranchesPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
add(new BookmarkablePageLink<Void>("tags", TagsPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
add(new BookmarkablePageLink<Void>("tree", TreePage.class, WicketUtils.newRepositoryParameter(repositoryName)));
add(new BookmarkablePageLink<Void>("summary", SummaryPage.class,
WicketUtils.newRepositoryParameter(repositoryName)));
add(new BookmarkablePageLink<Void>("log", LogPage.class,
WicketUtils.newRepositoryParameter(repositoryName)));
add(new BookmarkablePageLink<Void>("branches", BranchesPage.class,
WicketUtils.newRepositoryParameter(repositoryName)));
add(new BookmarkablePageLink<Void>("tags", TagsPage.class,
WicketUtils.newRepositoryParameter(repositoryName)));
add(new BookmarkablePageLink<Void>("tree", TreePage.class,
WicketUtils.newRepositoryParameter(repositoryName)));
// per-repository extra page links
List<String> extraPageLinks = new ArrayList<String>();
@@ -118,15 +124,18 @@ public abstract class RepositoryPage extends BasePage {
}
final boolean showAdmin;
if (GitBlit.self().settings().getBoolean(Keys.web.authenticateAdminPages, true)) {
boolean allowAdmin = GitBlit.self().settings().getBoolean(Keys.web.allowAdministration, false);
if (GitBlit.getBoolean(Keys.web.authenticateAdminPages, true)) {
boolean allowAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);
showAdmin = allowAdmin && GitBlitWebSession.get().canAdmin();
} else {
showAdmin = GitBlit.self().settings().getBoolean(Keys.web.allowAdministration, false);
showAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);
}
// Conditionally add edit link
if (showAdmin || GitBlitWebSession.get().isLoggedIn() && (model.owner != null && model.owner.equalsIgnoreCase(GitBlitWebSession.get().getUser().getUsername()))) {
if (showAdmin
|| GitBlitWebSession.get().isLoggedIn()
&& (model.owner != null && model.owner.equalsIgnoreCase(GitBlitWebSession.get()
.getUser().username))) {
extraPageLinks.add("edit");
}
@@ -138,13 +147,17 @@ public abstract class RepositoryPage extends BasePage {
String extra = item.getModelObject();
if (extra.equals("tickets")) {
item.add(new Label("extraSeparator", " | "));
item.add(new LinkPanel("extraLink", null, getString("gb.tickets"), TicketsPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
item.add(new LinkPanel("extraLink", null, getString("gb.tickets"),
TicketsPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
} else if (extra.equals("docs")) {
item.add(new Label("extraSeparator", " | "));
item.add(new LinkPanel("extraLink", null, getString("gb.docs"), DocsPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
item.add(new LinkPanel("extraLink", null, getString("gb.docs"), DocsPage.class,
WicketUtils.newRepositoryParameter(repositoryName)));
} else if (extra.equals("edit")) {
item.add(new Label("extraSeparator", " | "));
item.add(new LinkPanel("extraLink", null, getString("gb.edit"), EditRepositoryPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
item.add(new LinkPanel("extraLink", null, getString("gb.edit"),
EditRepositoryPage.class, WicketUtils
.newRepositoryParameter(repositoryName)));
}
}
};
@@ -190,9 +203,10 @@ public abstract class RepositoryPage extends BasePage {
protected RepositoryModel getRepositoryModel() {
if (m == null) {
RepositoryModel model = GitBlit.self().getRepositoryModel(GitBlitWebSession.get().getUser(), repositoryName);
RepositoryModel model = GitBlit.self().getRepositoryModel(
GitBlitWebSession.get().getUser(), repositoryName);
if (model == null) {
error("Unauthorized access for repository " + repositoryName, true);
error("Unauthorized access for repository " + repositoryName, true);
return null;
}
m = model;
@@ -203,7 +217,8 @@ public abstract class RepositoryPage extends BasePage {
protected RevCommit getCommit() {
RevCommit commit = JGitUtils.getCommit(r, objectId);
if (commit == null) {
error(MessageFormat.format("Failed to find commit \"{0}\" in {1} for {2} page!", objectId, repositoryName, getPageName()), true);
error(MessageFormat.format("Failed to find commit \"{0}\" in {1} for {2} page!",
objectId, repositoryName, getPageName()), true);
}
return commit;
}
@@ -217,29 +232,32 @@ public abstract class RepositoryPage extends BasePage {
if (substituteRegex) {
Map<String, String> map = new HashMap<String, String>();
// global regex keys
if (GitBlit.self().settings().getBoolean(Keys.regex.global, false)) {
for (String key : GitBlit.self().settings().getAllKeys(Keys.regex.global)) {
if (GitBlit.getBoolean(Keys.regex.global, false)) {
for (String key : GitBlit.getAllKeys(Keys.regex.global)) {
if (!key.equals(Keys.regex.global)) {
String subKey = key.substring(key.lastIndexOf('.') + 1);
map.put(subKey, GitBlit.self().settings().getString(key, ""));
map.put(subKey, GitBlit.getString(key, ""));
}
}
}
// repository-specific regex keys
List<String> keys = GitBlit.self().settings().getAllKeys(Keys.regex._ROOT + "." + repositoryName.toLowerCase());
List<String> keys = GitBlit.getAllKeys(Keys.regex._ROOT + "."
+ repositoryName.toLowerCase());
for (String key : keys) {
String subKey = key.substring(key.lastIndexOf('.') + 1);
map.put(subKey, GitBlit.self().settings().getString(key, ""));
map.put(subKey, GitBlit.getString(key, ""));
}
for (String key : map.keySet()) {
String definition = map.get(key).trim();
for (Entry<String, String> entry : map.entrySet()) {
String definition = entry.getValue().trim();
String[] chunks = definition.split("!!!");
if (chunks.length == 2) {
html = html.replaceAll(chunks[0], chunks[1]);
} else {
logger.warn(key + " improperly formatted. Use !!! to separate match from replacement: " + definition);
logger.warn(entry.getKey()
+ " improperly formatted. Use !!! to separate match from replacement: "
+ definition);
}
}
}
@@ -248,9 +266,11 @@ public abstract class RepositoryPage extends BasePage {
protected abstract String getPageName();
protected Component createPersonPanel(String wicketId, PersonIdent identity, SearchType searchType) {
boolean showEmail = GitBlit.self().settings().getBoolean(Keys.web.showEmailAddresses, false);
if (!showEmail || StringUtils.isEmpty(identity.getName()) || StringUtils.isEmpty(identity.getEmailAddress())) {
protected Component createPersonPanel(String wicketId, PersonIdent identity,
SearchType searchType) {
boolean showEmail = GitBlit.getBoolean(Keys.web.showEmailAddresses, false);
if (!showEmail || StringUtils.isEmpty(identity.getName())
|| StringUtils.isEmpty(identity.getEmailAddress())) {
String value = identity.getName();
if (StringUtils.isEmpty(value)) {
if (showEmail) {
@@ -260,17 +280,23 @@ public abstract class RepositoryPage extends BasePage {
}
}
Fragment partial = new Fragment(wicketId, "partialPersonIdent", this);
LinkPanel link = new LinkPanel("personName", "list", value, SearchPage.class, WicketUtils.newSearchParameter(repositoryName, objectId, value, searchType));
LinkPanel link = new LinkPanel("personName", "list", value, SearchPage.class,
WicketUtils.newSearchParameter(repositoryName, objectId, value, searchType));
setPersonSearchTooltip(link, value, searchType);
partial.add(link);
return partial;
} else {
Fragment fullPerson = new Fragment(wicketId, "fullPersonIdent", this);
LinkPanel nameLink = new LinkPanel("personName", "list", identity.getName(), SearchPage.class, WicketUtils.newSearchParameter(repositoryName, objectId, identity.getName(), searchType));
LinkPanel nameLink = new LinkPanel("personName", "list", identity.getName(),
SearchPage.class, WicketUtils.newSearchParameter(repositoryName, objectId,
identity.getName(), searchType));
setPersonSearchTooltip(nameLink, identity.getName(), searchType);
fullPerson.add(nameLink);
LinkPanel addressLink = new LinkPanel("personAddress", "list", "<" + identity.getEmailAddress() + ">", SearchPage.class, WicketUtils.newSearchParameter(repositoryName, objectId, identity.getEmailAddress(), searchType));
LinkPanel addressLink = new LinkPanel("personAddress", "list", "<"
+ identity.getEmailAddress() + ">", SearchPage.class,
WicketUtils.newSearchParameter(repositoryName, objectId,
identity.getEmailAddress(), searchType));
setPersonSearchTooltip(addressLink, identity.getEmailAddress(), searchType);
fullPerson.add(addressLink);
return fullPerson;
@@ -331,7 +357,7 @@ public abstract class RepositoryPage extends BasePage {
return WicketUtils.newPathParameter(repositoryName, objectId, path);
}
class SearchForm extends StatelessForm<Void> {
private static class SearchForm extends StatelessForm<Void> {
private static final long serialVersionUID = 1L;
private final String repositoryName;
@@ -343,9 +369,10 @@ public abstract class RepositoryPage extends BasePage {
public SearchForm(String id, String repositoryName) {
super(id);
this.repositoryName = repositoryName;
DropDownChoice<SearchType> searchType = new DropDownChoice<SearchType>("searchType", Arrays.asList(SearchType.values()));
DropDownChoice<SearchType> searchType = new DropDownChoice<SearchType>("searchType",
Arrays.asList(SearchType.values()));
searchType.setModel(searchTypeModel);
add(searchType.setVisible(GitBlit.self().settings().getBoolean(Keys.web.showSearchTypeSelection, false)));
add(searchType.setVisible(GitBlit.getBoolean(Keys.web.showSearchTypeSelection, false)));
TextField<String> searchBox = new TextField<String>("searchBox", searchBoxModel);
add(searchBox);
}
@@ -363,11 +390,13 @@ public abstract class RepositoryPage extends BasePage {
for (SearchType type : SearchType.values()) {
if (searchString.toLowerCase().startsWith(type.name().toLowerCase() + ":")) {
searchType = type;
searchString = searchString.substring(type.name().toLowerCase().length() + 1).trim();
searchString = searchString.substring(type.name().toLowerCase().length() + 1)
.trim();
break;
}
}
setResponsePage(SearchPage.class, WicketUtils.newSearchParameter(repositoryName, null, searchString, searchType));
setResponsePage(SearchPage.class,
WicketUtils.newSearchParameter(repositoryName, null, searchString, searchType));
}
}
}

+ 32
- 17
src/com/gitblit/wicket/WicketUtils.java View File

@@ -117,7 +117,8 @@ public class WicketUtils {
return newImage(wicketId, "file_h_16x16.png");
} else if (filename.endsWith(".sln")) {
return newImage(wicketId, "file_vs_16x16.png");
} else if (filename.endsWith(".csv") || filename.endsWith(".xls") || filename.endsWith(".xlsx")) {
} else if (filename.endsWith(".csv") || filename.endsWith(".xls")
|| filename.endsWith(".xlsx")) {
return newImage(wicketId, "file_excel_16x16.png");
} else if (filename.endsWith(".doc") || filename.endsWith(".docx")) {
return newImage(wicketId, "file_word_16x16.png");
@@ -135,7 +136,7 @@ public class WicketUtils {
return newImage(wicketId, "file_settings_16x16.png");
}
List<String> mdExtensions = GitBlit.self().settings().getStrings(Keys.web.markdownExtensions);
List<String> mdExtensions = GitBlit.getStrings(Keys.web.markdownExtensions);
for (String ext : mdExtensions) {
if (filename.endsWith('.' + ext.toLowerCase())) {
return newImage(wicketId, "file_world_16x16.png");
@@ -183,40 +184,50 @@ public class WicketUtils {
return new PageParameters("r=" + repositoryName + ",h=" + objectId);
}
public static PageParameters newPathParameter(String repositoryName, String objectId, String path) {
public static PageParameters newPathParameter(String repositoryName, String objectId,
String path) {
if (StringUtils.isEmpty(path)) {
return newObjectParameter(repositoryName, objectId);
}
return new PageParameters("r=" + repositoryName + ",h=" + objectId + ",f=" + path);
}
public static PageParameters newLogPageParameter(String repositoryName, String objectId, int pageNumber) {
public static PageParameters newLogPageParameter(String repositoryName, String objectId,
int pageNumber) {
if (pageNumber <= 1) {
return newObjectParameter(repositoryName, objectId);
}
return new PageParameters("r=" + repositoryName + ",h=" + objectId + ",page=" + pageNumber);
}
public static PageParameters newHistoryPageParameter(String repositoryName, String objectId, String path, int pageNumber) {
public static PageParameters newHistoryPageParameter(String repositoryName, String objectId,
String path, int pageNumber) {
if (pageNumber <= 1) {
return newObjectParameter(repositoryName, objectId);
}
return new PageParameters("r=" + repositoryName + ",h=" + objectId + ",f=" + path + ",page=" + pageNumber);
return new PageParameters("r=" + repositoryName + ",h=" + objectId + ",f=" + path
+ ",page=" + pageNumber);
}
public static PageParameters newBlobDiffParameter(String repositoryName, String baseCommitId, String commitId, String path) {
return new PageParameters("r=" + repositoryName + ",h=" + commitId + ",f=" + path + ",hb=" + baseCommitId);
public static PageParameters newBlobDiffParameter(String repositoryName, String baseCommitId,
String commitId, String path) {
return new PageParameters("r=" + repositoryName + ",h=" + commitId + ",f=" + path + ",hb="
+ baseCommitId);
}
public static PageParameters newSearchParameter(String repositoryName, String commitId, String search, SearchType type) {
public static PageParameters newSearchParameter(String repositoryName, String commitId,
String search, SearchType type) {
if (StringUtils.isEmpty(commitId)) {
return new PageParameters("r=" + repositoryName + ",s=" + search + ",st=" + type.name());
}
return new PageParameters("r=" + repositoryName + ",h=" + commitId + ",s=" + search + ",st=" + type.name());
return new PageParameters("r=" + repositoryName + ",h=" + commitId + ",s=" + search
+ ",st=" + type.name());
}
public static PageParameters newSearchParameter(String repositoryName, String commitId, String search, SearchType type, int pageNumber) {
return new PageParameters("r=" + repositoryName + ",h=" + commitId + ",s=" + search + ",st=" + type.name() + ",page=" + pageNumber);
public static PageParameters newSearchParameter(String repositoryName, String commitId,
String search, SearchType type, int pageNumber) {
return new PageParameters("r=" + repositoryName + ",h=" + commitId + ",s=" + search
+ ",st=" + type.name() + ",page=" + pageNumber);
}
public static String getRepositoryName(PageParameters params) {
@@ -244,21 +255,23 @@ public class WicketUtils {
}
public static int getPage(PageParameters params) {
return params.getInt("page", 1); // index from 1
// index from 1
return params.getInt("page", 1);
}
public static String getUsername(PageParameters params) {
return params.getString("user", "");
}
public static Label createDateLabel(String wicketId, Date date, TimeZone timeZone) {
DateFormat df = new SimpleDateFormat(GitBlit.self().settings().getString(Keys.web.datestampShortFormat, "MM/dd/yy"));
String format = GitBlit.getString(Keys.web.datestampShortFormat, "MM/dd/yy");
DateFormat df = new SimpleDateFormat(format);
if (timeZone != null) {
df.setTimeZone(timeZone);
}
String dateString = df.format(date);
String title = TimeUtils.timeAgo(date);
if ((System.currentTimeMillis() - date.getTime()) < 10 * 24 * 60 * 60 * 1000l) {
if ((System.currentTimeMillis() - date.getTime()) < 10 * 24 * 60 * 60 * 1000L) {
String tmp = dateString;
dateString = title;
title = tmp;
@@ -270,7 +283,9 @@ public class WicketUtils {
}
public static Label createTimestampLabel(String wicketId, Date date, TimeZone timeZone) {
DateFormat df = new SimpleDateFormat(GitBlit.self().settings().getString(Keys.web.datetimestampLongFormat, "EEEE, MMMM d, yyyy h:mm a z"));
String format = GitBlit.getString(Keys.web.datetimestampLongFormat,
"EEEE, MMMM d, yyyy h:mm a z");
DateFormat df = new SimpleDateFormat(format);
if (timeZone != null) {
df.setTimeZone(timeZone);
}

+ 29
- 4
src/com/gitblit/wicket/models/PathModel.java View File

@@ -49,11 +49,25 @@ public class PathModel implements Serializable, Comparable<PathModel> {
if (basePath.lastIndexOf('/') > -1) {
parentPath = basePath.substring(0, basePath.lastIndexOf('/'));
}
PathModel model = new PathModel("..", parentPath, 0, 0040000, commitId);
PathModel model = new PathModel("..", parentPath, 0, 40000, commitId);
model.isParentPath = true;
return model;
}
@Override
public int hashCode() {
return commitId.hashCode() + path.hashCode();
}
@Override
public boolean equals(Object o) {
if (o instanceof PathModel) {
PathModel other = (PathModel) o;
return this.path.equals(other.path);
}
return super.equals(o);
}
@Override
public int compareTo(PathModel o) {
boolean isTree = isTree();
@@ -69,14 +83,25 @@ public class PathModel implements Serializable, Comparable<PathModel> {
}
public static class PathChangeModel extends PathModel {
private static final long serialVersionUID = 1L;
public final ChangeType changeType;
public PathChangeModel(String name, String path, long size, int mode, String commitId, ChangeType type) {
public PathChangeModel(String name, String path, long size, int mode, String commitId,
ChangeType type) {
super(name, path, size, mode, commitId);
this.changeType = type;
}
@Override
public int hashCode() {
return super.hashCode();
}
@Override
public boolean equals(Object o) {
return super.equals(o);
}
}
}

+ 17
- 11
src/com/gitblit/wicket/models/RefModel.java View File

@@ -27,9 +27,9 @@ import com.gitblit.utils.JGitUtils;
public class RefModel implements Serializable, Comparable<RefModel> {
private static final long serialVersionUID = 1L;
final String displayName;
transient Ref ref;
final RevCommit commit;
public final String displayName;
public final RevCommit commit;
public transient Ref ref;
public RefModel(String displayName, Ref ref, RevCommit commit) {
this.displayName = displayName;
@@ -41,18 +41,10 @@ public class RefModel implements Serializable, Comparable<RefModel> {
return JGitUtils.getCommitDate(commit);
}
public String getDisplayName() {
return displayName;
}
public String getName() {
return ref.getName();
}
public RevCommit getCommit() {
return commit;
}
public ObjectId getCommitId() {
return commit.getId();
}
@@ -70,6 +62,20 @@ public class RefModel implements Serializable, Comparable<RefModel> {
return !getCommitId().equals(getObjectId());
}
@Override
public int hashCode() {
return getCommitId().hashCode() + getName().hashCode();
}
@Override
public boolean equals(Object o) {
if (o instanceof RefModel) {
RefModel other = (RefModel) o;
return getName().equals(other.getName());
}
return super.equals(o);
}
@Override
public int compareTo(RefModel o) {
return getDate().compareTo(o.getDate());

+ 3
- 1
src/com/gitblit/wicket/models/RepositoryModel.java View File

@@ -23,6 +23,8 @@ import com.gitblit.Constants.AccessRestrictionType;
public class RepositoryModel implements Serializable {
private static final long serialVersionUID = 1L;
// field names are reflectively mapped in EditRepository page
public String name;
public String description;
public String owner;
@@ -49,7 +51,7 @@ public class RepositoryModel implements Serializable {
this.lastChange = lastchange;
this.accessRestriction = AccessRestrictionType.NONE;
}
@Override
public String toString() {
return name;

+ 30
- 2
src/com/gitblit/wicket/models/TicketModel.java View File

@@ -51,7 +51,7 @@ public class TicketModel implements Serializable, Comparable<TicketModel> {
String[] chunks = name.split("_");
if (chunks.length == 3) {
date = new Date(Long.parseLong(chunks[0]) * 1000l);
date = new Date(Long.parseLong(chunks[0]) * 1000L);
title = chunks[1].replace('-', ' ');
}
}
@@ -71,17 +71,45 @@ public class TicketModel implements Serializable, Comparable<TicketModel> {
public Comment(String filename, String content) throws ParseException {
String[] chunks = filename.split("_", -1);
this.date = new Date(Long.parseLong(chunks[1]) * 1000l);
this.date = new Date(Long.parseLong(chunks[1]) * 1000L);
this.author = chunks[2];
this.text = content;
}
@Override
public int hashCode() {
return text.hashCode();
}
@Override
public boolean equals(Object o) {
if (o instanceof Comment) {
Comment other = (Comment) o;
return text.equals(other.text);
}
return super.equals(o);
}
@Override
public int compareTo(Comment o) {
return date.compareTo(o.date);
}
}
@Override
public int hashCode() {
return id.hashCode();
}
@Override
public boolean equals(Object o) {
if (o instanceof TicketModel) {
TicketModel other = (TicketModel) o;
return id.equals(other.id);
}
return super.equals(o);
}
@Override
public int compareTo(TicketModel o) {
return date.compareTo(o.date);

+ 5
- 28
src/com/gitblit/wicket/models/UserModel.java View File

@@ -23,35 +23,16 @@ public class UserModel implements Serializable {
private static final long serialVersionUID = 1L;
private String username;
private String password;
private boolean canAdmin = false;
private List<String> repositories = new ArrayList<String>();
// field names are reflectively mapped in EditUser page
public String username;
public String password;
public boolean canAdmin;
public final List<String> repositories = new ArrayList<String>();
public UserModel(String username) {
this.username = username;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public void canAdmin(boolean value) {
canAdmin = value;
}
public boolean canAdmin() {
return canAdmin;
}
public boolean canAccessRepository(String repositoryName) {
return canAdmin || repositories.contains(repositoryName);
}
@@ -65,10 +46,6 @@ public class UserModel implements Serializable {
repositories.add(name.toLowerCase());
}
public List<String> getRepositories() {
return repositories;
}
@Override
public String toString() {
return username;

+ 15
- 8
src/com/gitblit/wicket/pages/BlobDiffPage.java View File

@@ -41,27 +41,34 @@ public class BlobDiffPage extends RepositoryPage {
Repository r = getRepository();
RevCommit commit = getCommit();
DiffOutputType diffType = DiffOutputType.forName(GitBlit.self().settings().getString(Keys.web.diffStyle, DiffOutputType.GITBLIT.name()));
DiffOutputType diffType = DiffOutputType.forName(GitBlit.getString(Keys.web.diffStyle,
DiffOutputType.GITBLIT.name()));
String diff;
if (StringUtils.isEmpty(baseObjectId)) {
// use first parent
diff = JGitUtils.getCommitDiff(r, commit, blobPath, diffType);
add(new BookmarkablePageLink<Void>("patchLink", PatchPage.class, WicketUtils.newPathParameter(repositoryName, objectId, blobPath)));
add(new BookmarkablePageLink<Void>("patchLink", PatchPage.class,
WicketUtils.newPathParameter(repositoryName, objectId, blobPath)));
} else {
// base commit specified
RevCommit baseCommit = JGitUtils.getCommit(r, baseObjectId);
diff = JGitUtils.getCommitDiff(r, baseCommit, commit, blobPath, diffType);
add(new BookmarkablePageLink<Void>("patchLink", PatchPage.class, WicketUtils.newBlobDiffParameter(repositoryName, baseObjectId, objectId, blobPath)));
add(new BookmarkablePageLink<Void>("patchLink", PatchPage.class,
WicketUtils.newBlobDiffParameter(repositoryName, baseObjectId, objectId,
blobPath)));
}
add(new BookmarkablePageLink<Void>("commitLink", CommitPage.class, WicketUtils.newObjectParameter(repositoryName, objectId)));
add(new BookmarkablePageLink<Void>("commitDiffLink", CommitDiffPage.class, WicketUtils.newObjectParameter(repositoryName, objectId)));
add(new BookmarkablePageLink<Void>("commitLink", CommitPage.class,
WicketUtils.newObjectParameter(repositoryName, objectId)));
add(new BookmarkablePageLink<Void>("commitDiffLink", CommitDiffPage.class,
WicketUtils.newObjectParameter(repositoryName, objectId)));
// diff page links
add(new Label("blameLink", getString("gb.blame")));
add(new BookmarkablePageLink<Void>("historyLink", HistoryPage.class, WicketUtils.newPathParameter(repositoryName, objectId, blobPath)));
add(new BookmarkablePageLink<Void>("historyLink", HistoryPage.class,
WicketUtils.newPathParameter(repositoryName, objectId, blobPath)));
add(new CommitHeaderPanel("commitHeader", repositoryName, commit));

+ 14
- 10
src/com/gitblit/wicket/pages/BlobPage.java View File

@@ -45,24 +45,27 @@ public class BlobPage extends RepositoryPage {
if (blobPath.lastIndexOf('.') > -1) {
extension = blobPath.substring(blobPath.lastIndexOf('.') + 1).toLowerCase();
}
// see if we should redirect to the markdown page
for (String ext : GitBlit.self().settings().getStrings(Keys.web.markdownExtensions)) {
for (String ext : GitBlit.getStrings(Keys.web.markdownExtensions)) {
if (ext.equals(extension)) {
setResponsePage(MarkdownPage.class, params);
return;
}
}
// standard blob view
Repository r = getRepository();
RevCommit commit = getCommit();
// blob page links
add(new Label("blameLink", getString("gb.blame")));
add(new BookmarkablePageLink<Void>("historyLink", HistoryPage.class, WicketUtils.newPathParameter(repositoryName, objectId, blobPath)));
add(new BookmarkablePageLink<Void>("rawLink", RawPage.class, WicketUtils.newPathParameter(repositoryName, objectId, blobPath)));
add(new BookmarkablePageLink<Void>("headLink", BlobPage.class, WicketUtils.newPathParameter(repositoryName, Constants.HEAD, blobPath)));
add(new BookmarkablePageLink<Void>("historyLink", HistoryPage.class,
WicketUtils.newPathParameter(repositoryName, objectId, blobPath)));
add(new BookmarkablePageLink<Void>("rawLink", RawPage.class, WicketUtils.newPathParameter(
repositoryName, objectId, blobPath)));
add(new BookmarkablePageLink<Void>("headLink", BlobPage.class,
WicketUtils.newPathParameter(repositoryName, Constants.HEAD, blobPath)));
add(new CommitHeaderPanel("commitHeader", repositoryName, commit));
@@ -70,13 +73,13 @@ public class BlobPage extends RepositoryPage {
// Map the extensions to types
Map<String, Integer> map = new HashMap<String, Integer>();
for (String ext : GitBlit.self().settings().getStrings(Keys.web.prettyPrintExtensions)) {
for (String ext : GitBlit.getStrings(Keys.web.prettyPrintExtensions)) {
map.put(ext.toLowerCase(), 1);
}
for (String ext : GitBlit.self().settings().getStrings(Keys.web.imageExtensions)) {
for (String ext : GitBlit.getStrings(Keys.web.imageExtensions)) {
map.put(ext.toLowerCase(), 2);
}
for (String ext : GitBlit.self().settings().getStrings(Keys.web.binaryExtensions)) {
for (String ext : GitBlit.getStrings(Keys.web.binaryExtensions)) {
map.put(ext.toLowerCase(), 3);
}
@@ -108,7 +111,8 @@ public class BlobPage extends RepositoryPage {
add(c);
} else {
// plain text
Label blobLabel = new Label("blobText", JGitUtils.getRawContentAsString(r, commit, blobPath));
Label blobLabel = new Label("blobText", JGitUtils.getRawContentAsString(r, commit,
blobPath));
WicketUtils.setCssClass(blobLabel, "plainprint");
add(blobLabel);
}

+ 19
- 10
src/com/gitblit/wicket/pages/CommitDiffPage.java View File

@@ -45,7 +45,8 @@ public class CommitDiffPage extends RepositoryPage {
Repository r = getRepository();
RevCommit commit = getCommit();
DiffOutputType diffType = DiffOutputType.forName(GitBlit.self().settings().getString(Keys.web.diffStyle, DiffOutputType.GITBLIT.name()));
DiffOutputType diffType = DiffOutputType.forName(GitBlit.getString(Keys.web.diffStyle,
DiffOutputType.GITBLIT.name()));
String diff = JGitUtils.getCommitDiff(r, commit, diffType);
List<String> parents = new ArrayList<String>();
@@ -59,10 +60,13 @@ public class CommitDiffPage extends RepositoryPage {
if (parents.size() == 0) {
add(new Label("parentLink", "none"));
} else {
add(new LinkPanel("parentLink", null, parents.get(0).substring(0, 8), CommitDiffPage.class, newCommitParameter(parents.get(0))));
add(new LinkPanel("parentLink", null, parents.get(0).substring(0, 8),
CommitDiffPage.class, newCommitParameter(parents.get(0))));
}
add(new BookmarkablePageLink<Void>("patchLink", PatchPage.class, WicketUtils.newObjectParameter(repositoryName, objectId)));
add(new BookmarkablePageLink<Void>("commitLink", CommitPage.class, WicketUtils.newObjectParameter(repositoryName, objectId)));
add(new BookmarkablePageLink<Void>("patchLink", PatchPage.class,
WicketUtils.newObjectParameter(repositoryName, objectId)));
add(new BookmarkablePageLink<Void>("commitLink", CommitPage.class,
WicketUtils.newObjectParameter(repositoryName, objectId)));
add(new CommitHeaderPanel("commitHeader", repositoryName, commit));
@@ -72,7 +76,7 @@ public class CommitDiffPage extends RepositoryPage {
ListDataProvider<PathChangeModel> pathsDp = new ListDataProvider<PathChangeModel>(paths);
DataView<PathChangeModel> pathsView = new DataView<PathChangeModel>("changedPath", pathsDp) {
private static final long serialVersionUID = 1L;
int counter = 0;
int counter;
public void populateItem(final Item<PathChangeModel> item) {
final PathChangeModel entry = item.getModelObject();
@@ -82,15 +86,20 @@ public class CommitDiffPage extends RepositoryPage {
item.add(changeType);
if (entry.isTree()) {
item.add(new LinkPanel("pathName", null, entry.path, TreePage.class, newPathParameter(entry.path)));
item.add(new LinkPanel("pathName", null, entry.path, TreePage.class,
newPathParameter(entry.path)));
} else {
item.add(new LinkPanel("pathName", "list", entry.path, BlobPage.class, newPathParameter(entry.path)));
item.add(new LinkPanel("pathName", "list", entry.path, BlobPage.class,
newPathParameter(entry.path)));
}
item.add(new BookmarkablePageLink<Void>("patch", PatchPage.class, newPathParameter(entry.path)));
item.add(new BookmarkablePageLink<Void>("view", BlobPage.class, newPathParameter(entry.path)));
item.add(new BookmarkablePageLink<Void>("patch", PatchPage.class,
newPathParameter(entry.path)));
item.add(new BookmarkablePageLink<Void>("view", BlobPage.class,
newPathParameter(entry.path)));
item.add(new BookmarkablePageLink<Void>("blame", BlobPage.class).setEnabled(false));
item.add(new BookmarkablePageLink<Void>("history", HistoryPage.class, newPathParameter(entry.path)));
item.add(new BookmarkablePageLink<Void>("history", HistoryPage.class,
newPathParameter(entry.path)));
WicketUtils.setAlternatingBackground(item, counter);
counter++;

+ 34
- 17
src/com/gitblit/wicket/pages/CommitPage.java View File

@@ -61,10 +61,14 @@ public class CommitPage extends RepositoryPage {
add(new Label("parentLink", "none"));
add(new Label("commitdiffLink", getString("gb.commitdiff")));
} else {
add(new LinkPanel("parentLink", null, parents.get(0).substring(0, 8), CommitPage.class, newCommitParameter(parents.get(0))));
add(new LinkPanel("commitdiffLink", null, new StringResourceModel("gb.commitdiff", this, null), CommitDiffPage.class, WicketUtils.newObjectParameter(repositoryName, objectId)));
add(new LinkPanel("parentLink", null, parents.get(0).substring(0, 8), CommitPage.class,
newCommitParameter(parents.get(0))));
add(new LinkPanel("commitdiffLink", null, new StringResourceModel("gb.commitdiff",
this, null), CommitDiffPage.class, WicketUtils.newObjectParameter(
repositoryName, objectId)));
}
add(new BookmarkablePageLink<Void>("patchLink", PatchPage.class, WicketUtils.newObjectParameter(repositoryName, objectId)));
add(new BookmarkablePageLink<Void>("patchLink", PatchPage.class,
WicketUtils.newObjectParameter(repositoryName, objectId)));
add(new CommitHeaderPanel("commitHeader", repositoryName, c));
@@ -72,17 +76,22 @@ public class CommitPage extends RepositoryPage {
// author
add(createPersonPanel("commitAuthor", c.getAuthorIdent(), SearchType.AUTHOR));
add(WicketUtils.createTimestampLabel("commitAuthorDate", c.getAuthorIdent().getWhen(), getTimeZone()));
add(WicketUtils.createTimestampLabel("commitAuthorDate", c.getAuthorIdent().getWhen(),
getTimeZone()));
// committer
add(createPersonPanel("commitCommitter", c.getCommitterIdent(), SearchType.COMMITTER));
add(WicketUtils.createTimestampLabel("commitCommitterDate", c.getCommitterIdent().getWhen(), getTimeZone()));
add(WicketUtils.createTimestampLabel("commitCommitterDate",
c.getCommitterIdent().getWhen(), getTimeZone()));
add(new Label("commitId", c.getName()));
add(new LinkPanel("commitTree", "list", c.getTree().getName(), TreePage.class, newCommitParameter()));
add(new LinkPanel("commitTree", "list", c.getTree().getName(), TreePage.class,
newCommitParameter()));
add(new BookmarkablePageLink<Void>("treeLink", TreePage.class, newCommitParameter()));
add(new ExternalLink("zipLink", DownloadZipServlet.asLink(getRequest().getRelativePathPrefixToContextRoot(), repositoryName, objectId, null)).setVisible(GitBlit.self().settings().getBoolean(Keys.web.allowZipDownloads, true)));
add(new ExternalLink("zipLink", DownloadZipServlet.asLink(getRequest()
.getRelativePathPrefixToContextRoot(), repositoryName, objectId, null))
.setVisible(GitBlit.getBoolean(Keys.web.allowZipDownloads, true)));
// Parent Commits
ListDataProvider<String> parentsDp = new ListDataProvider<String>(parents);
@@ -91,9 +100,12 @@ public class CommitPage extends RepositoryPage {
public void populateItem(final Item<String> item) {
String entry = item.getModelObject();
item.add(new LinkPanel("commitParent", "list", entry, CommitPage.class, newCommitParameter(entry)));
item.add(new BookmarkablePageLink<Void>("view", CommitPage.class, newCommitParameter(entry)));
item.add(new BookmarkablePageLink<Void>("diff", CommitDiffPage.class, newCommitParameter(entry)));
item.add(new LinkPanel("commitParent", "list", entry, CommitPage.class,
newCommitParameter(entry)));
item.add(new BookmarkablePageLink<Void>("view", CommitPage.class,
newCommitParameter(entry)));
item.add(new BookmarkablePageLink<Void>("diff", CommitDiffPage.class,
newCommitParameter(entry)));
}
};
add(parentsView);
@@ -101,12 +113,12 @@ public class CommitPage extends RepositoryPage {
addFullText("fullMessage", c.getFullMessage(), true);
// changed paths list
List<PathChangeModel> paths = JGitUtils.getFilesInCommit(r, c);
List<PathChangeModel> paths = JGitUtils.getFilesInCommit(r, c);
add(new CommitLegendPanel("commitLegend", paths));
ListDataProvider<PathChangeModel> pathsDp = new ListDataProvider<PathChangeModel>(paths);
DataView<PathChangeModel> pathsView = new DataView<PathChangeModel>("changedPath", pathsDp) {
private static final long serialVersionUID = 1L;
int counter = 0;
int counter;
public void populateItem(final Item<PathChangeModel> item) {
final PathChangeModel entry = item.getModelObject();
@@ -115,15 +127,20 @@ public class CommitPage extends RepositoryPage {
setChangeTypeTooltip(changeType, entry.changeType);
item.add(changeType);
if (entry.isTree()) {
item.add(new LinkPanel("pathName", null, entry.path, TreePage.class, newPathParameter(entry.path)));
item.add(new LinkPanel("pathName", null, entry.path, TreePage.class,
newPathParameter(entry.path)));
} else {
item.add(new LinkPanel("pathName", "list", entry.path, BlobPage.class, newPathParameter(entry.path)));
item.add(new LinkPanel("pathName", "list", entry.path, BlobPage.class,
newPathParameter(entry.path)));
}
item.add(new BookmarkablePageLink<Void>("diff", BlobDiffPage.class, newPathParameter(entry.path)));
item.add(new BookmarkablePageLink<Void>("view", BlobPage.class, newPathParameter(entry.path)));
item.add(new BookmarkablePageLink<Void>("diff", BlobDiffPage.class,
newPathParameter(entry.path)));
item.add(new BookmarkablePageLink<Void>("view", BlobPage.class,
newPathParameter(entry.path)));
item.add(new BookmarkablePageLink<Void>("blame", BlobPage.class).setEnabled(false));
item.add(new BookmarkablePageLink<Void>("history", HistoryPage.class, newPathParameter(entry.path)));
item.add(new BookmarkablePageLink<Void>("history", HistoryPage.class,
newPathParameter(entry.path)));
WicketUtils.setAlternatingBackground(item, counter);
counter++;

+ 11
- 7
src/com/gitblit/wicket/pages/DocsPage.java View File

@@ -40,30 +40,34 @@ public class DocsPage extends RepositoryPage {
super(params);
Repository r = getRepository();
List<String> extensions = GitBlit.self().settings().getStrings(Keys.web.markdownExtensions);
List<String> extensions = GitBlit.getStrings(Keys.web.markdownExtensions);
List<PathModel> paths = JGitUtils.getDocuments(r, extensions);
final ByteFormat byteFormat = new ByteFormat();
add(new Label("header", getString("gb.docs")));
// documents list
ListDataProvider<PathModel> pathsDp = new ListDataProvider<PathModel>(paths);
DataView<PathModel> pathsView = new DataView<PathModel>("document", pathsDp) {
private static final long serialVersionUID = 1L;
int counter = 0;
int counter;
public void populateItem(final Item<PathModel> item) {
PathModel entry = item.getModelObject();
item.add(WicketUtils.newImage("docIcon", "file_world_16x16.png"));
item.add(new Label("docSize", byteFormat.format(entry.size)));
item.add(new LinkPanel("docName", "list", entry.name, BlobPage.class, newPathParameter(entry.path)));
item.add(new LinkPanel("docName", "list", entry.name, BlobPage.class,
newPathParameter(entry.path)));
// links
item.add(new BookmarkablePageLink<Void>("view", BlobPage.class, WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path)));
item.add(new BookmarkablePageLink<Void>("raw", RawPage.class, WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path)));
item.add(new BookmarkablePageLink<Void>("view", BlobPage.class, WicketUtils
.newPathParameter(repositoryName, entry.commitId, entry.path)));
item.add(new BookmarkablePageLink<Void>("raw", RawPage.class, WicketUtils
.newPathParameter(repositoryName, entry.commitId, entry.path)));
item.add(new BookmarkablePageLink<Void>("blame", BlobPage.class).setEnabled(false));
item.add(new BookmarkablePageLink<Void>("history", HistoryPage.class, WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path)));
item.add(new BookmarkablePageLink<Void>("history", HistoryPage.class, WicketUtils
.newPathParameter(repositoryName, entry.commitId, entry.path)));
WicketUtils.setAlternatingBackground(item, counter);
counter++;
}

+ 23
- 16
src/com/gitblit/wicket/pages/EditRepositoryPage.java View File

@@ -51,8 +51,8 @@ public class EditRepositoryPage extends BasePage {
private final boolean isCreate;
private boolean isAdmin = false;
private boolean isAdmin;
public EditRepositoryPage() {
// create constructor
super();
@@ -72,7 +72,7 @@ public class EditRepositoryPage extends BasePage {
protected void setupPage(final RepositoryModel repositoryModel) {
// ensure this user can create or edit this repository
checkPermissions(repositoryModel);
List<String> repositoryUsers = new ArrayList<String>();
if (isCreate) {
super.setupPage("", getString("gb.newRepository"));
@@ -85,8 +85,11 @@ public class EditRepositoryPage extends BasePage {
}
final String oldName = repositoryModel.name;
final Palette<String> usersPalette = new Palette<String>("users", new ListModel<String>(repositoryUsers), new CollectionModel<String>(GitBlit.self().getAllUsernames()), new ChoiceRenderer<String>("", ""), 10, false);
CompoundPropertyModel<RepositoryModel> model = new CompoundPropertyModel<RepositoryModel>(repositoryModel);
final Palette<String> usersPalette = new Palette<String>("users", new ListModel<String>(
repositoryUsers), new CollectionModel<String>(GitBlit.self().getAllUsernames()),
new ChoiceRenderer<String>("", ""), 10, false);
CompoundPropertyModel<RepositoryModel> model = new CompoundPropertyModel<RepositoryModel>(
repositoryModel);
Form<RepositoryModel> form = new Form<RepositoryModel>("editForm", model) {
private static final long serialVersionUID = 1L;
@@ -112,7 +115,8 @@ public class EditRepositoryPage extends BasePage {
ok |= c == vc;
}
if (!ok) {
error(MessageFormat.format("Illegal character ''{0}'' in repository name!", c));
error(MessageFormat.format(
"Illegal character ''{0}'' in repository name!", c));
return;
}
}
@@ -135,7 +139,8 @@ public class EditRepositoryPage extends BasePage {
repositoryUsers.add(users.next());
}
// ensure the owner is added to the user list
if (repositoryModel.owner != null && !repositoryUsers.contains(repositoryModel.owner)) {
if (repositoryModel.owner != null
&& !repositoryUsers.contains(repositoryModel.owner)) {
repositoryUsers.add(repositoryModel.owner);
}
GitBlit.self().setRepositoryUsers(repositoryModel, repositoryUsers);
@@ -152,8 +157,10 @@ public class EditRepositoryPage extends BasePage {
// field names reflective match RepositoryModel fields
form.add(new TextField<String>("name").setEnabled(isCreate || isAdmin));
form.add(new TextField<String>("description"));
form.add(new DropDownChoice<String>("owner", GitBlit.self().getAllUsernames()).setEnabled(GitBlitWebSession.get().canAdmin()));
form.add(new DropDownChoice<AccessRestrictionType>("accessRestriction", Arrays.asList(AccessRestrictionType.values()), new AccessRestrictionRenderer()));
form.add(new DropDownChoice<String>("owner", GitBlit.self().getAllUsernames())
.setEnabled(GitBlitWebSession.get().canAdmin()));
form.add(new DropDownChoice<AccessRestrictionType>("accessRestriction", Arrays
.asList(AccessRestrictionType.values()), new AccessRestrictionRenderer()));
form.add(new CheckBox("isFrozen"));
form.add(new CheckBox("useTickets"));
form.add(new CheckBox("useDocs"));
@@ -162,7 +169,7 @@ public class EditRepositoryPage extends BasePage {
add(form);
}
/**
* Unfortunately must repeat part of AuthorizaitonStrategy here because that
* mechanism does not take PageParameters into consideration, only page
@@ -171,8 +178,8 @@ public class EditRepositoryPage extends BasePage {
* Repository Owners should be able to edit their repository.
*/
private void checkPermissions(RepositoryModel model) {
boolean authenticateAdmin = GitBlit.self().settings().getBoolean(Keys.web.authenticateAdminPages, true);
boolean allowAdmin = GitBlit.self().settings().getBoolean(Keys.web.allowAdministration, true);
boolean authenticateAdmin = GitBlit.getBoolean(Keys.web.authenticateAdminPages, true);
boolean allowAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, true);
GitBlitWebSession session = GitBlitWebSession.get();
UserModel user = session.getUser();
@@ -185,22 +192,22 @@ public class EditRepositoryPage extends BasePage {
}
if (isCreate) {
// Create Repository
if (!user.canAdmin()) {
if (!user.canAdmin) {
// Only Administrators May Create
error("Only an administrator may create a repository", true);
}
} else {
// Edit Repository
if (user.canAdmin()) {
if (user.canAdmin) {
// Admins can edit everything
isAdmin = true;
return;
} else {
if (!model.owner.equalsIgnoreCase(user.getUsername())) {
if (!model.owner.equalsIgnoreCase(user.username)) {
// User is not an Admin nor Owner
error("Only an administrator or the owner may edit a repository", true);
}
}
}
}
}
} else {

+ 22
- 14
src/com/gitblit/wicket/pages/EditUserPage.java View File

@@ -72,7 +72,8 @@ public class EditUserPage extends BasePage {
} else {
super.setupPage("", getString("gb.edit"));
}
final Model<String> confirmPassword = new Model<String>(StringUtils.isEmpty(userModel.getPassword()) ? "" : userModel.getPassword());
final Model<String> confirmPassword = new Model<String>(
StringUtils.isEmpty(userModel.password) ? "" : userModel.password);
CompoundPropertyModel<UserModel> model = new CompoundPropertyModel<UserModel>(userModel);
List<String> repos = new ArrayList<String>();
@@ -82,8 +83,10 @@ public class EditUserPage extends BasePage {
repos.add(repo);
}
}
final String oldName = userModel.getUsername();
final Palette<String> repositories = new Palette<String>("repositories", new ListModel<String>(userModel.getRepositories()), new CollectionModel<String>(repos), new ChoiceRenderer<String>("", ""), 10, false);
final String oldName = userModel.username;
final Palette<String> repositories = new Palette<String>("repositories",
new ListModel<String>(userModel.repositories), new CollectionModel<String>(repos),
new ChoiceRenderer<String>("", ""), 10, false);
Form<UserModel> form = new Form<UserModel>("editForm", model) {
private static final long serialVersionUID = 1L;
@@ -95,7 +98,7 @@ public class EditUserPage extends BasePage {
*/
@Override
protected void onSubmit() {
String username = userModel.getUsername();
String username = userModel.username;
if (StringUtils.isEmpty(username)) {
error("Please enter a username!");
return;
@@ -107,28 +110,31 @@ public class EditUserPage extends BasePage {
return;
}
}
if (!userModel.getPassword().equals(confirmPassword.getObject())) {
if (!userModel.password.equals(confirmPassword.getObject())) {
error("Passwords do not match!");
return;
}
String password = userModel.getPassword();
if (!password.toUpperCase().startsWith(Crypt.__TYPE) && !password.toUpperCase().startsWith(MD5.__TYPE)) {
String password = userModel.password;
if (!password.toUpperCase().startsWith(Crypt.__TYPE)
&& !password.toUpperCase().startsWith(MD5.__TYPE)) {
// This is a plain text password.
// Check length.
int minLength = GitBlit.self().settings().getInteger(Keys.realm.minPasswordLength, 5);
int minLength = GitBlit.getInteger(Keys.realm.minPasswordLength, 5);
if (minLength < 4) {
minLength = 4;
}
if (password.trim().length() < minLength) {
error(MessageFormat.format("Password is too short. Minimum length is {0} characters.", minLength));
error(MessageFormat.format(
"Password is too short. Minimum length is {0} characters.",
minLength));
return;
}
// Optionally store the password MD5 digest.
String type = GitBlit.self().settings().getString(Keys.realm.passwordStorage, "md5");
String type = GitBlit.getString(Keys.realm.passwordStorage, "md5");
if (type.equalsIgnoreCase("md5")) {
// store MD5 digest of password
userModel.setPassword(MD5.digest(userModel.getPassword()));
userModel.password = MD5.digest(userModel.password);
}
}
@@ -147,7 +153,8 @@ public class EditUserPage extends BasePage {
setRedirect(false);
if (isCreate) {
// create another user
info(MessageFormat.format("New user ''{0}'' successfully created.", userModel.getUsername()));
info(MessageFormat.format("New user ''{0}'' successfully created.",
userModel.username));
setResponsePage(EditUserPage.class);
} else {
// back to home
@@ -161,7 +168,8 @@ public class EditUserPage extends BasePage {
PasswordTextField passwordField = new PasswordTextField("password");
passwordField.setResetPassword(false);
form.add(passwordField);
PasswordTextField confirmPasswordField = new PasswordTextField("confirmPassword", confirmPassword);
PasswordTextField confirmPasswordField = new PasswordTextField("confirmPassword",
confirmPassword);
confirmPasswordField.setResetPassword(false);
form.add(confirmPasswordField);
form.add(new CheckBox("canAdmin"));

+ 20
- 7
src/com/gitblit/wicket/pages/HistoryPage.java View File

@@ -32,17 +32,30 @@ public class HistoryPage extends RepositoryPage {
int prevPage = Math.max(0, pageNumber - 1);
int nextPage = pageNumber + 1;
HistoryPanel history = new HistoryPanel("historyPanel", repositoryName, objectId, path, getRepository(), -1, pageNumber - 1);
HistoryPanel history = new HistoryPanel("historyPanel", repositoryName, objectId, path,
getRepository(), -1, pageNumber - 1);
boolean hasMore = history.hasMore();
add(history);
add(new BookmarkablePageLink<Void>("firstPageTop", HistoryPage.class, WicketUtils.newPathParameter(repositoryName, objectId, path)).setEnabled(pageNumber > 1));
add(new BookmarkablePageLink<Void>("prevPageTop", HistoryPage.class, WicketUtils.newHistoryPageParameter(repositoryName, objectId, path, prevPage)).setEnabled(pageNumber > 1));
add(new BookmarkablePageLink<Void>("nextPageTop", HistoryPage.class, WicketUtils.newHistoryPageParameter(repositoryName, objectId, path, nextPage)).setEnabled(hasMore));
add(new BookmarkablePageLink<Void>("firstPageTop", HistoryPage.class,
WicketUtils.newPathParameter(repositoryName, objectId, path))
.setEnabled(pageNumber > 1));
add(new BookmarkablePageLink<Void>("prevPageTop", HistoryPage.class,
WicketUtils.newHistoryPageParameter(repositoryName, objectId, path, prevPage))
.setEnabled(pageNumber > 1));
add(new BookmarkablePageLink<Void>("nextPageTop", HistoryPage.class,
WicketUtils.newHistoryPageParameter(repositoryName, objectId, path, nextPage))
.setEnabled(hasMore));
add(new BookmarkablePageLink<Void>("firstPageBottom", HistoryPage.class, WicketUtils.newPathParameter(repositoryName, objectId, path)).setEnabled(pageNumber > 1));
add(new BookmarkablePageLink<Void>("prevPageBottom", HistoryPage.class, WicketUtils.newHistoryPageParameter(repositoryName, objectId, path, prevPage)).setEnabled(pageNumber > 1));
add(new BookmarkablePageLink<Void>("nextPageBottom", HistoryPage.class, WicketUtils.newHistoryPageParameter(repositoryName, objectId, path, nextPage)).setEnabled(hasMore));
add(new BookmarkablePageLink<Void>("firstPageBottom", HistoryPage.class,
WicketUtils.newPathParameter(repositoryName, objectId, path))
.setEnabled(pageNumber > 1));
add(new BookmarkablePageLink<Void>("prevPageBottom", HistoryPage.class,
WicketUtils.newHistoryPageParameter(repositoryName, objectId, path, prevPage))
.setEnabled(pageNumber > 1));
add(new BookmarkablePageLink<Void>("nextPageBottom", HistoryPage.class,
WicketUtils.newHistoryPageParameter(repositoryName, objectId, path, nextPage))
.setEnabled(hasMore));
}

+ 21
- 8
src/com/gitblit/wicket/pages/LogPage.java View File

@@ -30,17 +30,30 @@ public class LogPage extends RepositoryPage {
int pageNumber = WicketUtils.getPage(params);
int prevPage = Math.max(0, pageNumber - 1);
int nextPage = pageNumber + 1;
LogPanel logPanel = new LogPanel("logPanel", repositoryName, objectId, getRepository(), -1, pageNumber - 1);
LogPanel logPanel = new LogPanel("logPanel", repositoryName, objectId, getRepository(), -1,
pageNumber - 1);
boolean hasMore = logPanel.hasMore();
add(logPanel);
add(new BookmarkablePageLink<Void>("firstPageTop", LogPage.class, WicketUtils.newObjectParameter(repositoryName, objectId)).setEnabled(pageNumber > 1));
add(new BookmarkablePageLink<Void>("prevPageTop", LogPage.class, WicketUtils.newLogPageParameter(repositoryName, objectId, prevPage)).setEnabled(pageNumber > 1));
add(new BookmarkablePageLink<Void>("nextPageTop", LogPage.class, WicketUtils.newLogPageParameter(repositoryName, objectId, nextPage)).setEnabled(hasMore));
add(new BookmarkablePageLink<Void>("firstPageBottom", LogPage.class, WicketUtils.newObjectParameter(repositoryName, objectId)).setEnabled(pageNumber > 1));
add(new BookmarkablePageLink<Void>("prevPageBottom", LogPage.class, WicketUtils.newLogPageParameter(repositoryName, objectId, prevPage)).setEnabled(pageNumber > 1));
add(new BookmarkablePageLink<Void>("nextPageBottom", LogPage.class, WicketUtils.newLogPageParameter(repositoryName, objectId, nextPage)).setEnabled(hasMore));
add(new BookmarkablePageLink<Void>("firstPageTop", LogPage.class,
WicketUtils.newObjectParameter(repositoryName, objectId))
.setEnabled(pageNumber > 1));
add(new BookmarkablePageLink<Void>("prevPageTop", LogPage.class,
WicketUtils.newLogPageParameter(repositoryName, objectId, prevPage))
.setEnabled(pageNumber > 1));
add(new BookmarkablePageLink<Void>("nextPageTop", LogPage.class,
WicketUtils.newLogPageParameter(repositoryName, objectId, nextPage))
.setEnabled(hasMore));
add(new BookmarkablePageLink<Void>("firstPageBottom", LogPage.class,
WicketUtils.newObjectParameter(repositoryName, objectId))
.setEnabled(pageNumber > 1));
add(new BookmarkablePageLink<Void>("prevPageBottom", LogPage.class,
WicketUtils.newLogPageParameter(repositoryName, objectId, prevPage))
.setEnabled(pageNumber > 1));
add(new BookmarkablePageLink<Void>("nextPageBottom", LogPage.class,
WicketUtils.newLogPageParameter(repositoryName, objectId, nextPage))
.setEnabled(hasMore));
}
@Override

+ 9
- 6
src/com/gitblit/wicket/pages/MarkdownPage.java View File

@@ -30,7 +30,7 @@ import com.gitblit.wicket.RepositoryPage;
import com.gitblit.wicket.WicketUtils;
public class MarkdownPage extends RepositoryPage {
public MarkdownPage(PageParameters params) {
super(params);
@@ -41,11 +41,14 @@ public class MarkdownPage extends RepositoryPage {
// markdown page links
add(new Label("blameLink", getString("gb.blame")));
add(new BookmarkablePageLink<Void>("historyLink", HistoryPage.class, WicketUtils.newPathParameter(repositoryName, objectId, markdownPath)));
add(new BookmarkablePageLink<Void>("rawLink", RawPage.class, WicketUtils.newPathParameter(repositoryName, objectId, markdownPath)));
add(new BookmarkablePageLink<Void>("headLink", MarkdownPage.class, WicketUtils.newPathParameter(repositoryName, Constants.HEAD, markdownPath)));
add(new BookmarkablePageLink<Void>("historyLink", HistoryPage.class,
WicketUtils.newPathParameter(repositoryName, objectId, markdownPath)));
add(new BookmarkablePageLink<Void>("rawLink", RawPage.class, WicketUtils.newPathParameter(
repositoryName, objectId, markdownPath)));
add(new BookmarkablePageLink<Void>("headLink", MarkdownPage.class,
WicketUtils.newPathParameter(repositoryName, Constants.HEAD, markdownPath)));
// Read raw markdown content and transform it to html
// Read raw markdown content and transform it to html
String markdownText = JGitUtils.getRawContentAsString(r, commit, markdownPath);
String htmlText;
try {
@@ -54,7 +57,7 @@ public class MarkdownPage extends RepositoryPage {
error(p.getMessage());
htmlText = markdownText;
}
// Add the html to the page
add(new Label("markdownText", htmlText).setEscapeModelStrings(false));
}

+ 6
- 8
src/com/gitblit/wicket/pages/PatchPage.java View File

@@ -37,7 +37,7 @@ public class PatchPage extends WebPage {
redirectToInterceptPage(new RepositoriesPage());
return;
}
final String repositoryName = WicketUtils.getRepositoryName(params);
final String baseObjectId = WicketUtils.getBaseObjectId(params);
final String objectId = WicketUtils.getObject(params);
@@ -56,14 +56,12 @@ public class PatchPage extends WebPage {
redirectToInterceptPage(new RepositoriesPage());
return;
}
String patch;
if (StringUtils.isEmpty(baseObjectId)) {
patch = JGitUtils.getCommitPatch(r, commit, blobPath);
} else {
RevCommit baseCommit = JGitUtils.getCommit(r, baseObjectId);
patch = JGitUtils.getCommitPatch(r, baseCommit, commit, blobPath);
RevCommit baseCommit = null;
if (!StringUtils.isEmpty(baseObjectId)) {
baseCommit = JGitUtils.getCommit(r, baseObjectId);
}
String patch = JGitUtils.getCommitPatch(r, baseCommit, commit, blobPath);
add(new Label("patchText", patch));
r.close();
}

+ 4
- 3
src/com/gitblit/wicket/pages/RawPage.java View File

@@ -59,10 +59,10 @@ public class RawPage extends WebPage {
// Map the extensions to types
Map<String, Integer> map = new HashMap<String, Integer>();
for (String ext : GitBlit.self().settings().getStrings(Keys.web.imageExtensions)) {
for (String ext : GitBlit.getStrings(Keys.web.imageExtensions)) {
map.put(ext.toLowerCase(), 2);
}
for (String ext : GitBlit.self().settings().getStrings(Keys.web.binaryExtensions)) {
for (String ext : GitBlit.getStrings(Keys.web.binaryExtensions)) {
map.put(ext.toLowerCase(), 3);
}
@@ -89,7 +89,8 @@ public class RawPage extends WebPage {
add(c);
} else {
// plain text
Label blobLabel = new Label("rawText", JGitUtils.getRawContentAsString(r, commit, blobPath));
Label blobLabel = new Label("rawText", JGitUtils.getRawContentAsString(r, commit,
blobPath));
WicketUtils.setCssClass(blobLabel, "plainprint");
add(blobLabel);
}

+ 8
- 7
src/com/gitblit/wicket/pages/RepositoriesPage.java View File

@@ -41,14 +41,14 @@ public class RepositoriesPage extends BasePage {
setupPage("", "");
final boolean showAdmin;
if (GitBlit.self().settings().getBoolean(Keys.web.authenticateAdminPages, true)) {
boolean allowAdmin = GitBlit.self().settings().getBoolean(Keys.web.allowAdministration, false);
if (GitBlit.getBoolean(Keys.web.authenticateAdminPages, true)) {
boolean allowAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);
showAdmin = allowAdmin && GitBlitWebSession.get().canAdmin();
// authentication requires state and session
setStatelessHint(false);
} else {
showAdmin = GitBlit.self().settings().getBoolean(Keys.web.allowAdministration, false);
if (GitBlit.self().settings().getBoolean(Keys.web.authenticateViewPages, false)) {
showAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);
if (GitBlit.getBoolean(Keys.web.authenticateViewPages, false)) {
// authentication requires state and session
setStatelessHint(false);
} else {
@@ -64,7 +64,7 @@ public class RepositoriesPage extends BasePage {
}
// Load the markdown welcome message
String messageSource = GitBlit.self().settings().getString(Keys.web.repositoriesMessage, "gitblit");
String messageSource = GitBlit.getString(Keys.web.repositoriesMessage, "gitblit");
String message = "<br/>";
if (messageSource.equalsIgnoreCase("gitblit")) {
// Read default welcome message
@@ -94,9 +94,10 @@ public class RepositoriesPage extends BasePage {
}
}
}
Component repositoriesMessage = new Label("repositoriesMessage", message).setEscapeModelStrings(false);
Component repositoriesMessage = new Label("repositoriesMessage", message)
.setEscapeModelStrings(false);
add(repositoriesMessage);
add(new RepositoriesPanel("repositoriesPanel", showAdmin, getAccessRestrictions()));
add(new RepositoriesPanel("repositoriesPanel", showAdmin, getAccessRestrictions()));
add(new UsersPanel("usersPanel", showAdmin).setVisible(showAdmin));
}
}

+ 22
- 9
src/com/gitblit/wicket/pages/SearchPage.java View File

@@ -24,29 +24,42 @@ import com.gitblit.wicket.WicketUtils;
import com.gitblit.wicket.panels.SearchPanel;
public class SearchPage extends RepositoryPage {
public SearchPage(PageParameters params) {
super(params);
String value = WicketUtils.getSearchString(params);
String type = WicketUtils.getSearchType(params);
SearchType searchType = SearchType.forName(type);
int pageNumber = WicketUtils.getPage(params);
int prevPage = Math.max(0, pageNumber - 1);
int nextPage = pageNumber + 1;
SearchPanel search = new SearchPanel("searchPanel", repositoryName, objectId, value, searchType, getRepository(), -1, pageNumber - 1);
SearchPanel search = new SearchPanel("searchPanel", repositoryName, objectId, value,
searchType, getRepository(), -1, pageNumber - 1);
boolean hasMore = search.hasMore();
add(search);
add(new BookmarkablePageLink<Void>("firstPageTop", SearchPage.class, WicketUtils.newSearchParameter(repositoryName, objectId, value, searchType)).setEnabled(pageNumber > 1));
add(new BookmarkablePageLink<Void>("prevPageTop", SearchPage.class, WicketUtils.newSearchParameter(repositoryName, objectId, value, searchType, prevPage)).setEnabled(pageNumber > 1));
add(new BookmarkablePageLink<Void>("nextPageTop", SearchPage.class, WicketUtils.newSearchParameter(repositoryName, objectId, value, searchType, nextPage)).setEnabled(hasMore));
add(new BookmarkablePageLink<Void>("firstPageTop", SearchPage.class,
WicketUtils.newSearchParameter(repositoryName, objectId, value, searchType))
.setEnabled(pageNumber > 1));
add(new BookmarkablePageLink<Void>("prevPageTop", SearchPage.class,
WicketUtils.newSearchParameter(repositoryName, objectId, value, searchType,
prevPage)).setEnabled(pageNumber > 1));
add(new BookmarkablePageLink<Void>("nextPageTop", SearchPage.class,
WicketUtils.newSearchParameter(repositoryName, objectId, value, searchType,
nextPage)).setEnabled(hasMore));
add(new BookmarkablePageLink<Void>("firstPageBottom", SearchPage.class, WicketUtils.newSearchParameter(repositoryName, objectId, value, searchType)).setEnabled(pageNumber > 1));
add(new BookmarkablePageLink<Void>("prevPageBottom", SearchPage.class, WicketUtils.newSearchParameter(repositoryName, objectId, value, searchType, prevPage)).setEnabled(pageNumber > 1));
add(new BookmarkablePageLink<Void>("nextPageBottom", SearchPage.class, WicketUtils.newSearchParameter(repositoryName, objectId, value, searchType, nextPage)).setEnabled(hasMore));
add(new BookmarkablePageLink<Void>("firstPageBottom", SearchPage.class,
WicketUtils.newSearchParameter(repositoryName, objectId, value, searchType))
.setEnabled(pageNumber > 1));
add(new BookmarkablePageLink<Void>("prevPageBottom", SearchPage.class,
WicketUtils.newSearchParameter(repositoryName, objectId, value, searchType,
prevPage)).setEnabled(pageNumber > 1));
add(new BookmarkablePageLink<Void>("nextPageBottom", SearchPage.class,
WicketUtils.newSearchParameter(repositoryName, objectId, value, searchType,
nextPage)).setEnabled(hasMore));
}

+ 27
- 15
src/com/gitblit/wicket/pages/SummaryPage.java View File

@@ -60,12 +60,12 @@ public class SummaryPage extends RepositoryPage {
int numCommitsDef = 20;
int numRefsDef = 5;
int numberCommits = GitBlit.self().settings().getInteger(Keys.web.summaryCommitCount, numCommitsDef);
int numberCommits = GitBlit.getInteger(Keys.web.summaryCommitCount, numCommitsDef);
if (numberCommits <= 0) {
numberCommits = numCommitsDef;
}
int numberRefs = GitBlit.self().settings().getInteger(Keys.web.summaryRefsCount, numRefsDef);
int numberRefs = GitBlit.getInteger(Keys.web.summaryRefsCount, numRefsDef);
if (numberRefs <= 0) {
numberRefs = numRefsDef;
}
@@ -73,7 +73,7 @@ public class SummaryPage extends RepositoryPage {
Repository r = getRepository();
List<Metric> metrics = null;
Metric metricsTotal = null;
if (GitBlit.self().settings().getBoolean(Keys.web.generateActivityGraph, true)) {
if (GitBlit.getBoolean(Keys.web.generateActivityGraph, true)) {
metrics = JGitUtils.getDateMetrics(r);
metricsTotal = metrics.remove(0);
}
@@ -82,40 +82,48 @@ public class SummaryPage extends RepositoryPage {
add(new Label("repositoryDescription", getRepositoryModel().description));
add(new Label("repositoryOwner", getRepositoryModel().owner));
add(WicketUtils.createTimestampLabel("repositoryLastChange", JGitUtils.getLastChange(r), getTimeZone()));
add(WicketUtils.createTimestampLabel("repositoryLastChange", JGitUtils.getLastChange(r),
getTimeZone()));
if (metricsTotal == null) {
add(new Label("repositoryStats", ""));
} else {
add(new Label("repositoryStats", MessageFormat.format("{0} commits and {1} tags in {2}", metricsTotal.count, metricsTotal.tag, TimeUtils.duration(metricsTotal.duration))));
add(new Label("repositoryStats", MessageFormat.format(
"{0} commits and {1} tags in {2}", metricsTotal.count, metricsTotal.tag,
TimeUtils.duration(metricsTotal.duration))));
}
List<String> repositoryUrls = new ArrayList<String>();
if (GitBlit.self().settings().getBoolean(Keys.git.enableGitServlet, true)) {
if (GitBlit.getBoolean(Keys.git.enableGitServlet, true)) {
AccessRestrictionType accessRestriction = getRepositoryModel().accessRestriction;
switch (accessRestriction) {
case NONE:
add(WicketUtils.newClearPixel("accessRestrictionIcon").setVisible(false));
break;
case PUSH:
add(WicketUtils.newImage("accessRestrictionIcon", "lock_go_16x16.png", getAccessRestrictions().get(accessRestriction)));
add(WicketUtils.newImage("accessRestrictionIcon", "lock_go_16x16.png",
getAccessRestrictions().get(accessRestriction)));
break;
case CLONE:
add(WicketUtils.newImage("accessRestrictionIcon", "lock_pull_16x16.png", getAccessRestrictions().get(accessRestriction)));
add(WicketUtils.newImage("accessRestrictionIcon", "lock_pull_16x16.png",
getAccessRestrictions().get(accessRestriction)));
break;
case VIEW:
add(WicketUtils.newImage("accessRestrictionIcon", "shield_16x16.png", getAccessRestrictions().get(accessRestriction)));
add(WicketUtils.newImage("accessRestrictionIcon", "shield_16x16.png",
getAccessRestrictions().get(accessRestriction)));
break;
default:
add(WicketUtils.newClearPixel("accessRestrictionIcon").setVisible(false));
}
HttpServletRequest req = ((WebRequest) getRequestCycle().getRequest()).getHttpServletRequest();
HttpServletRequest req = ((WebRequest) getRequestCycle().getRequest())
.getHttpServletRequest();
StringBuilder sb = new StringBuilder();
sb.append(req.getScheme());
sb.append("://");
sb.append(req.getServerName());
if ((req.getScheme().equals("http") && req.getServerPort() != 80) || (req.getScheme().equals("https") && req.getServerPort() != 443)) {
if ((req.getScheme().equals("http") && req.getServerPort() != 80)
|| (req.getScheme().equals("https") && req.getServerPort() != 443)) {
sb.append(":" + req.getServerPort());
}
sb.append(Constants.GIT_SERVLET_PATH);
@@ -126,7 +134,8 @@ public class SummaryPage extends RepositoryPage {
}
repositoryUrls.addAll(GitBlit.self().getOtherCloneUrls(repositoryName));
add(new Label("repositoryCloneUrl", StringUtils.flattenStrings(repositoryUrls, "<br/>")).setEscapeModelStrings(false));
add(new Label("repositoryCloneUrl", StringUtils.flattenStrings(repositoryUrls, "<br/>"))
.setEscapeModelStrings(false));
add(new LogPanel("commitsPanel", repositoryName, null, r, numberCommits, 0));
add(new TagsPanel("tagsPanel", repositoryName, r, numberRefs));
@@ -142,12 +151,15 @@ public class SummaryPage extends RepositoryPage {
}
private void insertActivityGraph(List<Metric> metrics) {
if (metrics.size() > 0 && GitBlit.self().settings().getBoolean(Keys.web.generateActivityGraph, true)) {
if ((metrics != null) && (metrics.size() > 0)
&& GitBlit.getBoolean(Keys.web.generateActivityGraph, true)) {
IChartData data = getChartData(metrics);
ChartProvider provider = new ChartProvider(new Dimension(400, 100), ChartType.LINE, data);
ChartProvider provider = new ChartProvider(new Dimension(400, 100), ChartType.LINE,
data);
ChartAxis dateAxis = new ChartAxis(ChartAxisType.BOTTOM);
dateAxis.setLabels(new String[] { metrics.get(0).name, metrics.get(metrics.size() / 2).name, metrics.get(metrics.size() - 1).name });
dateAxis.setLabels(new String[] { metrics.get(0).name,
metrics.get(metrics.size() / 2).name, metrics.get(metrics.size() - 1).name });
provider.addAxis(dateAxis);
ChartAxis commitAxis = new ChartAxis(ChartAxisType.LEFT);

+ 10
- 5
src/com/gitblit/wicket/pages/TagPage.java View File

@@ -48,16 +48,21 @@ public class TagPage extends RepositoryPage {
if (tagRef == null) {
// point to commit
add(new LinkPanel("commit", "title", c.getShortMessage(), CommitPage.class, newCommitParameter()));
add(new LinkPanel("tagId", "list", c.getName(), CommitPage.class, newCommitParameter(c.getName())));
add(new LinkPanel("commit", "title", c.getShortMessage(), CommitPage.class,
newCommitParameter()));
add(new LinkPanel("tagId", "list", c.getName(), CommitPage.class,
newCommitParameter(c.getName())));
} else {
// TODO commit or tree or blob?
add(new LinkPanel("commit", "title", tagRef.getDisplayName(), CommitPage.class, newCommitParameter()));
add(new LinkPanel("tagId", "list", c.getName(), CommitPage.class, newCommitParameter(c.getName())));
add(new LinkPanel("commit", "title", tagRef.displayName, CommitPage.class,
newCommitParameter()));
add(new LinkPanel("tagId", "list", c.getName(), CommitPage.class,
newCommitParameter(c.getName())));
}
add(createPersonPanel("tagAuthor", c.getAuthorIdent(), SearchType.AUTHOR));
add(WicketUtils.createTimestampLabel("tagDate", c.getAuthorIdent().getWhen(), getTimeZone()));
add(WicketUtils
.createTimestampLabel("tagDate", c.getAuthorIdent().getWhen(), getTimeZone()));
addFullText("fullMessage", c.getFullMessage(), true);
}

+ 7
- 4
src/com/gitblit/wicket/pages/TicketPage.java View File

@@ -52,13 +52,15 @@ public class TicketPage extends RepositoryPage {
ListDataProvider<Comment> commentsDp = new ListDataProvider<Comment>(t.comments);
DataView<Comment> commentsView = new DataView<Comment>("comment", commentsDp) {
private static final long serialVersionUID = 1L;
int counter = 0;
int counter;
public void populateItem(final Item<Comment> item) {
final Comment entry = item.getModelObject();
item.add(WicketUtils.createDateLabel("commentDate", entry.date, GitBlitWebSession.get().getTimezone()));
item.add(WicketUtils.createDateLabel("commentDate", entry.date, GitBlitWebSession
.get().getTimezone()));
item.add(new Label("commentAuthor", entry.author.toLowerCase()));
item.add(new Label("commentText", prepareComment(entry.text)).setEscapeModelStrings(false));
item.add(new Label("commentText", prepareComment(entry.text))
.setEscapeModelStrings(false));
WicketUtils.setAlternatingBackground(item, counter);
counter++;
}
@@ -74,6 +76,7 @@ public class TicketPage extends RepositoryPage {
private String prepareComment(String comment) {
String html = StringUtils.escapeForHtml(comment, false);
html = StringUtils.breakLinesForHtml(comment).trim();
return html.replaceAll("\\bcommit\\s*([A-Za-z0-9]*)\\b", "<a href=\"/commit/" + repositoryName + "/$1\">commit $1</a>");
return html.replaceAll("\\bcommit\\s*([A-Za-z0-9]*)\\b", "<a href=\"/commit/"
+ repositoryName + "/$1\">commit $1</a>");
}
}

+ 9
- 5
src/com/gitblit/wicket/pages/TicketsPage.java View File

@@ -39,21 +39,25 @@ public class TicketsPage extends RepositoryPage {
List<TicketModel> tickets = JGitUtils.getTickets(getRepository());
// header
add(new LinkPanel("header", "title", repositoryName, SummaryPage.class, newRepositoryParameter()));
add(new LinkPanel("header", "title", repositoryName, SummaryPage.class,
newRepositoryParameter()));
ListDataProvider<TicketModel> ticketsDp = new ListDataProvider<TicketModel>(tickets);
DataView<TicketModel> ticketsView = new DataView<TicketModel>("ticket", ticketsDp) {
private static final long serialVersionUID = 1L;
int counter = 0;
int counter;
public void populateItem(final Item<TicketModel> item) {
final TicketModel entry = item.getModelObject();
Label stateLabel = new Label("ticketState", entry.state);
WicketUtils.setTicketCssClass(stateLabel, entry.state);
item.add(stateLabel);
item.add(WicketUtils.createDateLabel("ticketDate", entry.date, GitBlitWebSession.get().getTimezone()));
item.add(new Label("ticketHandler", StringUtils.trimString(entry.handler.toLowerCase(), 30)));
item.add(new LinkPanel("ticketTitle", "list subject", StringUtils.trimString(entry.title, 80), TicketPage.class, newPathParameter(entry.name)));
item.add(WicketUtils.createDateLabel("ticketDate", entry.date, GitBlitWebSession
.get().getTimezone()));
item.add(new Label("ticketHandler", StringUtils.trimString(
entry.handler.toLowerCase(), 30)));
item.add(new LinkPanel("ticketTitle", "list subject", StringUtils.trimString(
entry.title, 80), TicketPage.class, newPathParameter(entry.name)));
WicketUtils.setAlternatingBackground(item, counter);
counter++;

+ 34
- 14
src/com/gitblit/wicket/pages/TreePage.java View File

@@ -53,9 +53,13 @@ public class TreePage extends RepositoryPage {
List<PathModel> paths = JGitUtils.getFilesInPath(r, path, commit);
// tree page links
add(new BookmarkablePageLink<Void>("historyLink", HistoryPage.class, WicketUtils.newPathParameter(repositoryName, objectId, path)));
add(new BookmarkablePageLink<Void>("headLink", TreePage.class, WicketUtils.newPathParameter(repositoryName, Constants.HEAD, path)));
add(new ExternalLink("zipLink", DownloadZipServlet.asLink(getRequest().getRelativePathPrefixToContextRoot(), repositoryName, objectId, path)).setVisible(GitBlit.self().settings().getBoolean(Keys.web.allowZipDownloads, true)));
add(new BookmarkablePageLink<Void>("historyLink", HistoryPage.class,
WicketUtils.newPathParameter(repositoryName, objectId, path)));
add(new BookmarkablePageLink<Void>("headLink", TreePage.class,
WicketUtils.newPathParameter(repositoryName, Constants.HEAD, path)));
add(new ExternalLink("zipLink", DownloadZipServlet.asLink(getRequest()
.getRelativePathPrefixToContextRoot(), repositoryName, objectId, path))
.setVisible(GitBlit.getBoolean(Keys.web.allowZipDownloads, true)));
add(new CommitHeaderPanel("commitHeader", repositoryName, commit));
@@ -71,7 +75,7 @@ public class TreePage extends RepositoryPage {
ListDataProvider<PathModel> pathsDp = new ListDataProvider<PathModel>(paths);
DataView<PathModel> pathsView = new DataView<PathModel>("changedPath", pathsDp) {
private static final long serialVersionUID = 1L;
int counter = 0;
int counter;
public void populateItem(final Item<PathModel> item) {
PathModel entry = item.getModelObject();
@@ -80,33 +84,49 @@ public class TreePage extends RepositoryPage {
// parent .. path
item.add(WicketUtils.newBlankImage("pathIcon"));
item.add(new Label("pathSize", ""));
item.add(new LinkPanel("pathName", null, entry.name, TreePage.class, newPathParameter(entry.path)));
item.add(new LinkPanel("pathName", null, entry.name, TreePage.class,
newPathParameter(entry.path)));
item.add(new Label("pathLinks", ""));
} else {
if (entry.isTree()) {
// folder/tree link
item.add(WicketUtils.newImage("pathIcon", "folder_16x16.png"));
item.add(new Label("pathSize", ""));
item.add(new LinkPanel("pathName", "list", entry.name, TreePage.class, newPathParameter(entry.path)));
item.add(new LinkPanel("pathName", "list", entry.name, TreePage.class,
newPathParameter(entry.path)));
// links
Fragment links = new Fragment("pathLinks", "treeLinks", this);
links.add(new BookmarkablePageLink<Void>("tree", TreePage.class, WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path)));
links.add(new BookmarkablePageLink<Void>("history", HistoryPage.class, WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path)));
links.add(new ExternalLink("zip", DownloadZipServlet.asLink(getRequest().getRelativePathPrefixToContextRoot(), repositoryName, objectId, entry.path)).setVisible(GitBlit.self().settings().getBoolean(Keys.web.allowZipDownloads, true)));
links.add(new BookmarkablePageLink<Void>("tree", TreePage.class,
WicketUtils.newPathParameter(repositoryName, entry.commitId,
entry.path)));
links.add(new BookmarkablePageLink<Void>("history", HistoryPage.class,
WicketUtils.newPathParameter(repositoryName, entry.commitId,
entry.path)));
links.add(new ExternalLink("zip", DownloadZipServlet.asLink(getRequest()
.getRelativePathPrefixToContextRoot(), repositoryName, objectId,
entry.path)).setVisible(GitBlit.getBoolean(
Keys.web.allowZipDownloads, true)));
item.add(links);
} else {
// blob link
item.add(WicketUtils.getFileImage("pathIcon", entry.name));
item.add(new Label("pathSize", byteFormat.format(entry.size)));
item.add(new LinkPanel("pathName", "list", entry.name, BlobPage.class, newPathParameter(entry.path)));
item.add(new LinkPanel("pathName", "list", entry.name, BlobPage.class,
newPathParameter(entry.path)));
// links
Fragment links = new Fragment("pathLinks", "blobLinks", this);
links.add(new BookmarkablePageLink<Void>("view", BlobPage.class, WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path)));
links.add(new BookmarkablePageLink<Void>("raw", RawPage.class, WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path)));
links.add(new BookmarkablePageLink<Void>("blame", BlobPage.class).setEnabled(false));
links.add(new BookmarkablePageLink<Void>("history", HistoryPage.class, WicketUtils.newPathParameter(repositoryName, entry.commitId, entry.path)));
links.add(new BookmarkablePageLink<Void>("view", BlobPage.class,
WicketUtils.newPathParameter(repositoryName, entry.commitId,
entry.path)));
links.add(new BookmarkablePageLink<Void>("raw", RawPage.class, WicketUtils
.newPathParameter(repositoryName, entry.commitId, entry.path)));
links.add(new BookmarkablePageLink<Void>("blame", BlobPage.class)
.setEnabled(false));
links.add(new BookmarkablePageLink<Void>("history", HistoryPage.class,
WicketUtils.newPathParameter(repositoryName, entry.commitId,
entry.path)));
item.add(links);
}
}

+ 5
- 3
src/com/gitblit/wicket/panels/BasePanel.java View File

@@ -37,7 +37,8 @@ public abstract class BasePanel extends Panel {
}
protected TimeZone getTimeZone() {
return GitBlit.self().settings().getBoolean(Keys.web.useClientTimezone, false) ? GitBlitWebSession.get().getTimezone() : TimeZone.getDefault();
return GitBlit.getBoolean(Keys.web.useClientTimezone, false) ? GitBlitWebSession.get()
.getTimezone() : TimeZone.getDefault();
}
protected void setPersonSearchTooltip(Component component, String value, SearchType searchType) {
@@ -48,7 +49,7 @@ public abstract class BasePanel extends Panel {
}
}
public class JavascriptEventConfirmation extends AttributeModifier {
public static class JavascriptEventConfirmation extends AttributeModifier {
private static final long serialVersionUID = 1L;
@@ -57,7 +58,8 @@ public abstract class BasePanel extends Panel {
}
protected String newValue(final String currentValue, final String replacementValue) {
String prefix = "var conf = confirm('" + replacementValue + "'); " + "if (!conf) return false; ";
String prefix = "var conf = confirm('" + replacementValue + "'); "
+ "if (!conf) return false; ";
String result = prefix;
if (currentValue != null) {
result = prefix + currentValue;

+ 18
- 9
src/com/gitblit/wicket/panels/BranchesPanel.java View File

@@ -43,7 +43,8 @@ public class BranchesPanel extends BasePanel {
private static final long serialVersionUID = 1L;
public BranchesPanel(String wicketId, final RepositoryModel model, Repository r, final int maxCount) {
public BranchesPanel(String wicketId, final RepositoryModel model, Repository r,
final int maxCount) {
super(wicketId);
// branches
@@ -61,31 +62,38 @@ public class BranchesPanel extends BasePanel {
if (maxCount > 0) {
// summary page
// show branches page link
add(new LinkPanel("branches", "title", new StringResourceModel("gb.branches", this, null), BranchesPage.class, WicketUtils.newRepositoryParameter(model.name)));
add(new LinkPanel("branches", "title", new StringResourceModel("gb.branches", this,
null), BranchesPage.class, WicketUtils.newRepositoryParameter(model.name)));
} else {
// branches page
// show repository summary page link
add(new LinkPanel("branches", "title", model.name, SummaryPage.class, WicketUtils.newRepositoryParameter(model.name)));
add(new LinkPanel("branches", "title", model.name, SummaryPage.class,
WicketUtils.newRepositoryParameter(model.name)));
}
ListDataProvider<RefModel> branchesDp = new ListDataProvider<RefModel>(branches);
DataView<RefModel> branchesView = new DataView<RefModel>("branch", branchesDp) {
private static final long serialVersionUID = 1L;
int counter = 0;
int counter;
public void populateItem(final Item<RefModel> item) {
final RefModel entry = item.getModelObject();
item.add(WicketUtils.createDateLabel("branchDate", entry.getDate(), getTimeZone()));
item.add(new LinkPanel("branchName", "list name", StringUtils.trimString(entry.getDisplayName(), 28), LogPage.class, WicketUtils.newObjectParameter(model.name, entry.getName())));
item.add(new LinkPanel("branchName", "list name", StringUtils.trimString(
entry.displayName, 28), LogPage.class, WicketUtils.newObjectParameter(
model.name, entry.getName())));
// only show branch type on the branches page
boolean remote = entry.getName().startsWith(Constants.R_REMOTES);
item.add(new Label("branchType", remote ? getString("gb.remote") : getString("gb.local")).setVisible(maxCount <= 0));
item.add(new Label("branchType", remote ? getString("gb.remote")
: getString("gb.local")).setVisible(maxCount <= 0));
item.add(new BookmarkablePageLink<Void>("log", LogPage.class, WicketUtils.newObjectParameter(model.name, entry.getName())));
item.add(new BookmarkablePageLink<Void>("tree", TreePage.class, WicketUtils.newObjectParameter(model.name, entry.getName())));
item.add(new BookmarkablePageLink<Void>("log", LogPage.class, WicketUtils
.newObjectParameter(model.name, entry.getName())));
item.add(new BookmarkablePageLink<Void>("tree", TreePage.class, WicketUtils
.newObjectParameter(model.name, entry.getName())));
WicketUtils.setAlternatingBackground(item, counter);
counter++;
@@ -95,7 +103,8 @@ public class BranchesPanel extends BasePanel {
if (branches.size() < maxCount || maxCount <= 0) {
add(new Label("allBranches", "").setVisible(false));
} else {
add(new LinkPanel("allBranches", "link", new StringResourceModel("gb.allBranches", this, null), BranchesPage.class, WicketUtils.newRepositoryParameter(model.name)));
add(new LinkPanel("allBranches", "link", new StringResourceModel("gb.allBranches",
this, null), BranchesPage.class, WicketUtils.newRepositoryParameter(model.name)));
}
}
}

+ 3
- 2
src/com/gitblit/wicket/panels/CommitHeaderPanel.java View File

@@ -28,8 +28,9 @@ public class CommitHeaderPanel extends BasePanel {
public CommitHeaderPanel(String id, String repositoryName, RevCommit c) {
super(id);
add(new LinkPanel("shortmessage", "title", c.getShortMessage(), CommitPage.class, WicketUtils.newObjectParameter(repositoryName, c.getName())));
add(new Label("commitid", "(" + c.getName().substring(0, 8) + ")"));
add(new LinkPanel("shortmessage", "title", c.getShortMessage(), CommitPage.class,
WicketUtils.newObjectParameter(repositoryName, c.getName())));
add(new Label("commitid", "(" + c.getName().substring(0, 8) + ")"));
add(new Label("author", c.getAuthorIdent().getName()));
add(WicketUtils.createDateLabel("date", c.getAuthorIdent().getWhen(), getTimeZone()));
}

+ 6
- 5
src/com/gitblit/wicket/panels/CommitLegendPanel.java View File

@@ -38,8 +38,9 @@ public class CommitLegendPanel extends Panel {
public CommitLegendPanel(String id, List<PathChangeModel> paths) {
super(id);
final Map<ChangeType, AtomicInteger> stats = JGitUtils.getChangedPathsStats(paths);
ListDataProvider<ChangeType> legendDp = new ListDataProvider<ChangeType>(new ArrayList<ChangeType>(stats.keySet()));
final Map<ChangeType, AtomicInteger> stats = JGitUtils.getChangedPathsStats(paths);
ListDataProvider<ChangeType> legendDp = new ListDataProvider<ChangeType>(
new ArrayList<ChangeType>(stats.keySet()));
DataView<ChangeType> legendsView = new DataView<ChangeType>("legend", legendDp) {
private static final long serialVersionUID = 1L;
@@ -50,8 +51,8 @@ public class CommitLegendPanel extends Panel {
WicketUtils.setChangeTypeCssClass(changeType, entry);
item.add(changeType);
int count = stats.get(entry).intValue();
String description = "";
switch(entry) {
String description = "";
switch (entry) {
case ADD:
description = MessageFormat.format(getString("gb.filesAdded"), count);
break;
@@ -67,7 +68,7 @@ public class CommitLegendPanel extends Panel {
case RENAME:
description = MessageFormat.format(getString("gb.filesRenamed"), count);
break;
}
}
item.add(new Label("description", description));
}
};

+ 27
- 13
src/com/gitblit/wicket/panels/HistoryPanel.java View File

@@ -51,12 +51,13 @@ public class HistoryPanel extends BasePanel {
private static final long serialVersionUID = 1L;
private boolean hasMore = false;
private boolean hasMore;
public HistoryPanel(String wicketId, final String repositoryName, final String objectId, final String path, Repository r, int limit, int pageOffset) {
public HistoryPanel(String wicketId, final String repositoryName, final String objectId,
final String path, Repository r, int limit, int pageOffset) {
super(wicketId);
boolean pageResults = limit <= 0;
int itemsPerPage = GitBlit.self().settings().getInteger(Keys.web.itemsPerPage, 50);
int itemsPerPage = GitBlit.getInteger(Keys.web.itemsPerPage, 50);
if (itemsPerPage <= 1) {
itemsPerPage = 50;
}
@@ -77,7 +78,8 @@ public class HistoryPanel extends BasePanel {
List<RevCommit> commits;
if (pageResults) {
// Paging result set
commits = JGitUtils.getRevLog(r, objectId, path, pageOffset * itemsPerPage, itemsPerPage);
commits = JGitUtils.getRevLog(r, objectId, path, pageOffset * itemsPerPage,
itemsPerPage);
} else {
// Fixed size result set
commits = JGitUtils.getRevLog(r, objectId, path, 0, limit);
@@ -95,7 +97,7 @@ public class HistoryPanel extends BasePanel {
ListDataProvider<RevCommit> dp = new ListDataProvider<RevCommit>(commits);
DataView<RevCommit> logView = new DataView<RevCommit>("commit", dp) {
private static final long serialVersionUID = 1L;
int counter = 0;
int counter;
public void populateItem(final Item<RevCommit> item) {
final RevCommit entry = item.getModelObject();
@@ -105,7 +107,9 @@ public class HistoryPanel extends BasePanel {
// author search link
String author = entry.getAuthorIdent().getName();
LinkPanel authorLink = new LinkPanel("commitAuthor", "list", author, SearchPage.class, WicketUtils.newSearchParameter(repositoryName, objectId, author, SearchType.AUTHOR));
LinkPanel authorLink = new LinkPanel("commitAuthor", "list", author,
SearchPage.class, WicketUtils.newSearchParameter(repositoryName, objectId,
author, SearchType.AUTHOR));
setPersonSearchTooltip(authorLink, author, SearchType.AUTHOR);
item.add(authorLink);
@@ -118,7 +122,9 @@ public class HistoryPanel extends BasePanel {
String shortMessage = entry.getShortMessage();
String trimmedMessage = StringUtils.trimShortLog(shortMessage);
LinkPanel shortlog = new LinkPanel("commitShortMessage", "list subject", trimmedMessage, CommitPage.class, WicketUtils.newObjectParameter(repositoryName, entry.getName()));
LinkPanel shortlog = new LinkPanel("commitShortMessage", "list subject",
trimmedMessage, CommitPage.class, WicketUtils.newObjectParameter(
repositoryName, entry.getName()));
if (!shortMessage.equals(trimmedMessage)) {
WicketUtils.setHtmlTooltip(shortlog, shortMessage);
}
@@ -128,14 +134,20 @@ public class HistoryPanel extends BasePanel {
if (isTree) {
Fragment links = new Fragment("historyLinks", "treeLinks", this);
links.add(new BookmarkablePageLink<Void>("tree", TreePage.class, WicketUtils.newObjectParameter(repositoryName, entry.getName())));
links.add(new BookmarkablePageLink<Void>("commitdiff", CommitDiffPage.class, WicketUtils.newObjectParameter(repositoryName, entry.getName())));
links.add(new BookmarkablePageLink<Void>("tree", TreePage.class, WicketUtils
.newObjectParameter(repositoryName, entry.getName())));
links.add(new BookmarkablePageLink<Void>("commitdiff", CommitDiffPage.class,
WicketUtils.newObjectParameter(repositoryName, entry.getName())));
item.add(links);
} else {
Fragment links = new Fragment("historyLinks", "blobLinks", this);
links.add(new BookmarkablePageLink<Void>("view", BlobPage.class, WicketUtils.newPathParameter(repositoryName, entry.getName(), path)));
links.add(new BookmarkablePageLink<Void>("commitdiff", CommitDiffPage.class, WicketUtils.newObjectParameter(repositoryName, entry.getName())));
links.add(new BookmarkablePageLink<Void>("difftocurrent", BlobDiffPage.class, WicketUtils.newBlobDiffParameter(repositoryName, entry.getName(), objectId, path)).setEnabled(counter > 0));
links.add(new BookmarkablePageLink<Void>("view", BlobPage.class, WicketUtils
.newPathParameter(repositoryName, entry.getName(), path)));
links.add(new BookmarkablePageLink<Void>("commitdiff", CommitDiffPage.class,
WicketUtils.newObjectParameter(repositoryName, entry.getName())));
links.add(new BookmarkablePageLink<Void>("difftocurrent", BlobDiffPage.class,
WicketUtils.newBlobDiffParameter(repositoryName, entry.getName(),
objectId, path)).setEnabled(counter > 0));
item.add(links);
}
@@ -157,7 +169,9 @@ public class HistoryPanel extends BasePanel {
// more
if (commits.size() == limit) {
// show more
add(new LinkPanel("moreHistory", "link", new StringResourceModel("gb.moreHistory", this, null), HistoryPage.class, WicketUtils.newPathParameter(repositoryName, objectId, path)));
add(new LinkPanel("moreHistory", "link", new StringResourceModel(
"gb.moreHistory", this, null), HistoryPage.class,
WicketUtils.newPathParameter(repositoryName, objectId, path)));
} else {
// no more
add(new Label("moreHistory", "").setVisible(false));

+ 28
- 16
src/com/gitblit/wicket/panels/LogPanel.java View File

@@ -46,13 +46,14 @@ import com.gitblit.wicket.pages.TreePage;
public class LogPanel extends BasePanel {
private static final long serialVersionUID = 1L;
private boolean hasMore = false;
public LogPanel(String wicketId, final String repositoryName, final String objectId, Repository r, int limit, int pageOffset) {
private boolean hasMore;
public LogPanel(String wicketId, final String repositoryName, final String objectId,
Repository r, int limit, int pageOffset) {
super(wicketId);
boolean pageResults = limit <= 0;
int itemsPerPage = GitBlit.self().settings().getInteger(Keys.web.itemsPerPage, 50);
int itemsPerPage = GitBlit.getInteger(Keys.web.itemsPerPage, 50);
if (itemsPerPage <= 1) {
itemsPerPage = 50;
}
@@ -68,24 +69,26 @@ public class LogPanel extends BasePanel {
}
// inaccurate way to determine if there are more commits.
// works unless commits.size() represents the exact end.
// works unless commits.size() represents the exact end.
hasMore = commits.size() >= itemsPerPage;
// header
if (pageResults) {
// shortlog page
// show repository summary page link
add(new LinkPanel("header", "title", repositoryName, SummaryPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
add(new LinkPanel("header", "title", repositoryName, SummaryPage.class,
WicketUtils.newRepositoryParameter(repositoryName)));
} else {
// summary page
// show shortlog page link
add(new LinkPanel("header", "title", new StringResourceModel("gb.log", this, null), LogPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
add(new LinkPanel("header", "title", new StringResourceModel("gb.log", this, null),
LogPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
}
ListDataProvider<RevCommit> dp = new ListDataProvider<RevCommit>(commits);
DataView<RevCommit> logView = new DataView<RevCommit>("commit", dp) {
private static final long serialVersionUID = 1L;
int counter = 0;
int counter;
public void populateItem(final Item<RevCommit> item) {
final RevCommit entry = item.getModelObject();
@@ -95,7 +98,9 @@ public class LogPanel extends BasePanel {
// author search link
String author = entry.getAuthorIdent().getName();
LinkPanel authorLink = new LinkPanel("commitAuthor", "list", author, SearchPage.class, WicketUtils.newSearchParameter(repositoryName, objectId, author, SearchType.AUTHOR));
LinkPanel authorLink = new LinkPanel("commitAuthor", "list", author,
SearchPage.class, WicketUtils.newSearchParameter(repositoryName, objectId,
author, SearchType.AUTHOR));
setPersonSearchTooltip(authorLink, author, SearchType.AUTHOR);
item.add(authorLink);
@@ -105,11 +110,13 @@ public class LogPanel extends BasePanel {
} else {
item.add(WicketUtils.newBlankImage("commitIcon"));
}
// short message
String shortMessage = entry.getShortMessage();
String trimmedMessage = StringUtils.trimShortLog(shortMessage);
LinkPanel shortlog = new LinkPanel("commitShortMessage", "list subject", trimmedMessage, CommitPage.class, WicketUtils.newObjectParameter(repositoryName, entry.getName()));
LinkPanel shortlog = new LinkPanel("commitShortMessage", "list subject",
trimmedMessage, CommitPage.class, WicketUtils.newObjectParameter(
repositoryName, entry.getName()));
if (!shortMessage.equals(trimmedMessage)) {
WicketUtils.setHtmlTooltip(shortlog, shortMessage);
}
@@ -117,9 +124,12 @@ public class LogPanel extends BasePanel {
item.add(new RefsPanel("commitRefs", repositoryName, entry, allRefs));
item.add(new BookmarkablePageLink<Void>("view", CommitPage.class, WicketUtils.newObjectParameter(repositoryName, entry.getName())));
item.add(new BookmarkablePageLink<Void>("diff", CommitDiffPage.class, WicketUtils.newObjectParameter(repositoryName, entry.getName())));
item.add(new BookmarkablePageLink<Void>("tree", TreePage.class, WicketUtils.newObjectParameter(repositoryName, entry.getName())));
item.add(new BookmarkablePageLink<Void>("view", CommitPage.class, WicketUtils
.newObjectParameter(repositoryName, entry.getName())));
item.add(new BookmarkablePageLink<Void>("diff", CommitDiffPage.class, WicketUtils
.newObjectParameter(repositoryName, entry.getName())));
item.add(new BookmarkablePageLink<Void>("tree", TreePage.class, WicketUtils
.newObjectParameter(repositoryName, entry.getName())));
WicketUtils.setAlternatingBackground(item, counter);
counter++;
@@ -139,7 +149,9 @@ public class LogPanel extends BasePanel {
// more
if (commits.size() == limit) {
// show more
add(new LinkPanel("moreLogs", "link", new StringResourceModel("gb.moreLogs", this, null), LogPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
add(new LinkPanel("moreLogs", "link", new StringResourceModel("gb.moreLogs",
this, null), LogPage.class,
WicketUtils.newRepositoryParameter(repositoryName)));
} else {
// no more
add(new Label("moreLogs", "").setVisible(false));
@@ -147,7 +159,7 @@ public class LogPanel extends BasePanel {
}
}
}
public boolean hasMore() {
return hasMore;
}

+ 8
- 6
src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.java View File

@@ -33,9 +33,10 @@ public class PathBreadcrumbsPanel extends Panel {
private static final long serialVersionUID = 1L;
private final String ROOT = "--ROOT--";
private static final String ROOT = "--ROOT--";
public PathBreadcrumbsPanel(String id, final String repositoryName, String pathName, final String objectId) {
public PathBreadcrumbsPanel(String id, final String repositoryName, String pathName,
final String objectId) {
super(id);
List<BreadCrumb> crumbs = new ArrayList<BreadCrumb>();
crumbs.add(new BreadCrumb("[" + repositoryName + "]", ROOT, false));
@@ -47,8 +48,8 @@ public class PathBreadcrumbsPanel extends Panel {
for (int i = 0; i < paths.length; i++) {
String path = paths[i];
sb.append(path);
crumbs.add(new BreadCrumb(path, sb.toString(), (i == (paths.length - 1))));
sb.append("/");
crumbs.add(new BreadCrumb(path, sb.toString(), i == (paths.length - 1)));
sb.append('/');
}
}
@@ -63,7 +64,8 @@ public class PathBreadcrumbsPanel extends Panel {
item.add(new Label("pathLink", entry.name));
item.add(new Label("pathSeparator", "").setVisible(false));
} else {
item.add(new LinkPanel("pathLink", null, entry.name, TreePage.class, WicketUtils.newPathParameter(repositoryName, objectId, path)));
item.add(new LinkPanel("pathLink", null, entry.name, TreePage.class,
WicketUtils.newPathParameter(repositoryName, objectId, path)));
item.add(new Label("pathSeparator", "/"));
}
}
@@ -71,7 +73,7 @@ public class PathBreadcrumbsPanel extends Panel {
add(pathsView);
}
private class BreadCrumb implements Serializable {
private static class BreadCrumb implements Serializable {
private static final long serialVersionUID = 1L;

+ 11
- 5
src/com/gitblit/wicket/panels/RefsPanel.java View File

@@ -39,7 +39,8 @@ public class RefsPanel extends Panel {
private static final long serialVersionUID = 1L;
public RefsPanel(String id, final String repositoryName, RevCommit c, Map<ObjectId, List<String>> refs) {
public RefsPanel(String id, final String repositoryName, RevCommit c,
Map<ObjectId, List<String>> refs) {
super(id);
List<String> refNames = refs.get(c.getId());
if (refNames == null) {
@@ -57,19 +58,24 @@ public class RefsPanel extends Panel {
Component c = null;
if (entry.startsWith(Constants.R_HEADS)) {
// local head
c = new LinkPanel("refName", null, entry.substring(Constants.R_HEADS.length()), LogPage.class, WicketUtils.newObjectParameter(repositoryName, entry));
c = new LinkPanel("refName", null, entry.substring(Constants.R_HEADS.length()),
LogPage.class, WicketUtils.newObjectParameter(repositoryName, entry));
WicketUtils.setCssClass(c, "headRef");
} else if (entry.startsWith(Constants.R_REMOTES)) {
// remote head
c = new LinkPanel("refName", null, entry.substring(Constants.R_REMOTES.length()), LogPage.class, WicketUtils.newObjectParameter(repositoryName, entry));
c = new LinkPanel("refName", null,
entry.substring(Constants.R_REMOTES.length()), LogPage.class,
WicketUtils.newObjectParameter(repositoryName, entry));
WicketUtils.setCssClass(c, "remoteRef");
} else if (entry.startsWith(Constants.R_TAGS)) {
// tag
c = new LinkPanel("refName", null, entry.substring(Constants.R_TAGS.length()), TagPage.class, WicketUtils.newObjectParameter(repositoryName, entry));
c = new LinkPanel("refName", null, entry.substring(Constants.R_TAGS.length()),
TagPage.class, WicketUtils.newObjectParameter(repositoryName, entry));
WicketUtils.setCssClass(c, "tagRef");
} else {
// other
c = new LinkPanel("refName", null, entry, CommitPage.class, WicketUtils.newObjectParameter(repositoryName, entry));
c = new LinkPanel("refName", null, entry, CommitPage.class,
WicketUtils.newObjectParameter(repositoryName, entry));
WicketUtils.setCssClass(c, "otherRef");
}
WicketUtils.setHtmlTooltip(c, entry);

+ 59
- 32
src/com/gitblit/wicket/panels/RepositoriesPanel.java View File

@@ -57,7 +57,8 @@ public class RepositoriesPanel extends BasePanel {
private static final long serialVersionUID = 1L;
public RepositoriesPanel(String wicketId, final boolean showAdmin, final Map<AccessRestrictionType, String> accessRestrictionTranslations) {
public RepositoriesPanel(String wicketId, final boolean showAdmin,
final Map<AccessRestrictionType, String> accessRestrictionTranslations) {
super(wicketId);
final UserModel user = GitBlitWebSession.get().getUser();
@@ -68,12 +69,12 @@ public class RepositoriesPanel extends BasePanel {
adminLinks.add(new BookmarkablePageLink<Void>("newRepository", EditRepositoryPage.class));
add(adminLinks.setVisible(showAdmin));
if (GitBlit.self().settings().getString(Keys.web.repositoryListType, "flat").equalsIgnoreCase("grouped")) {
if (GitBlit.getString(Keys.web.repositoryListType, "flat").equalsIgnoreCase("grouped")) {
Map<String, List<RepositoryModel>> groups = new HashMap<String, List<RepositoryModel>>();
for (RepositoryModel model : models) {
String rootPath = StringUtils.getRootPath(model.name);
if (StringUtils.isEmpty(rootPath)) {
rootPath = GitBlit.self().settings().getString(Keys.web.repositoryRootGroupName, " ");
rootPath = GitBlit.getString(Keys.web.repositoryRootGroupName, " ");
}
if (!groups.containsKey(rootPath)) {
groups.put(rootPath, new ArrayList<RepositoryModel>());
@@ -95,7 +96,7 @@ public class RepositoriesPanel extends BasePanel {
DataView<RepositoryModel> dataView = new DataView<RepositoryModel>("row", dp) {
private static final long serialVersionUID = 1L;
int counter = 0;
int counter;
@Override
protected void onBeforeRender() {
@@ -117,28 +118,34 @@ public class RepositoriesPanel extends BasePanel {
if (entry.hasCommits) {
// Existing repository
PageParameters pp = WicketUtils.newRepositoryParameter(entry.name);
row.add(new LinkPanel("repositoryName", "list", entry.name, SummaryPage.class, pp));
row.add(new LinkPanel("repositoryDescription", "list", entry.description, SummaryPage.class, pp));
row.add(new LinkPanel("repositoryName", "list", entry.name, SummaryPage.class,
pp));
row.add(new LinkPanel("repositoryDescription", "list", entry.description,
SummaryPage.class, pp));
} else {
// New repository
row.add(new Label("repositoryName", entry.name + "<span class='empty'>(empty)</span>").setEscapeModelStrings(false));
row.add(new Label("repositoryName", entry.name
+ "<span class='empty'>(empty)</span>").setEscapeModelStrings(false));
row.add(new Label("repositoryDescription", entry.description));
}
if (entry.useTickets) {
row.add(WicketUtils.newImage("ticketsIcon", "bug_16x16.png", getString("gb.tickets")));
row.add(WicketUtils.newImage("ticketsIcon", "bug_16x16.png",
getString("gb.tickets")));
} else {
row.add(WicketUtils.newBlankImage("ticketsIcon"));
}
if (entry.useDocs) {
row.add(WicketUtils.newImage("docsIcon", "book_16x16.png", getString("gb.docs")));
row.add(WicketUtils
.newImage("docsIcon", "book_16x16.png", getString("gb.docs")));
} else {
row.add(WicketUtils.newBlankImage("docsIcon"));
}
if (entry.isFrozen) {
row.add(WicketUtils.newImage("frozenIcon", "cold_16x16.png", getString("gb.isFrozen")));
row.add(WicketUtils.newImage("frozenIcon", "cold_16x16.png",
getString("gb.isFrozen")));
} else {
row.add(WicketUtils.newClearPixel("frozenIcon").setVisible(false));
}
@@ -147,13 +154,16 @@ public class RepositoriesPanel extends BasePanel {
row.add(WicketUtils.newBlankImage("accessRestrictionIcon"));
break;
case PUSH:
row.add(WicketUtils.newImage("accessRestrictionIcon", "lock_go_16x16.png", accessRestrictionTranslations.get(entry.accessRestriction)));
row.add(WicketUtils.newImage("accessRestrictionIcon", "lock_go_16x16.png",
accessRestrictionTranslations.get(entry.accessRestriction)));
break;
case CLONE:
row.add(WicketUtils.newImage("accessRestrictionIcon", "lock_pull_16x16.png", accessRestrictionTranslations.get(entry.accessRestriction)));
row.add(WicketUtils.newImage("accessRestrictionIcon", "lock_pull_16x16.png",
accessRestrictionTranslations.get(entry.accessRestriction)));
break;
case VIEW:
row.add(WicketUtils.newImage("accessRestrictionIcon", "shield_16x16.png", accessRestrictionTranslations.get(entry.accessRestriction)));
row.add(WicketUtils.newImage("accessRestrictionIcon", "shield_16x16.png",
accessRestrictionTranslations.get(entry.accessRestriction)));
break;
default:
row.add(WicketUtils.newBlankImage("accessRestrictionIcon"));
@@ -166,10 +176,13 @@ public class RepositoriesPanel extends BasePanel {
row.add(lastChangeLabel);
WicketUtils.setCssClass(lastChangeLabel, TimeUtils.timeAgoCss(entry.lastChange));
boolean showOwner = user != null && user.getUsername().equalsIgnoreCase(entry.owner);
boolean showOwner = user != null && user.username.equalsIgnoreCase(entry.owner);
if (showAdmin) {
Fragment repositoryLinks = new Fragment("repositoryLinks", "repositoryAdminLinks", this);
repositoryLinks.add(new BookmarkablePageLink<Void>("editRepository", EditRepositoryPage.class, WicketUtils.newRepositoryParameter(entry.name)));
Fragment repositoryLinks = new Fragment("repositoryLinks",
"repositoryAdminLinks", this);
repositoryLinks.add(new BookmarkablePageLink<Void>("editRepository",
EditRepositoryPage.class, WicketUtils
.newRepositoryParameter(entry.name)));
Link<Void> deleteLink = new Link<Void>("deleteRepository") {
private static final long serialVersionUID = 1L;
@@ -184,16 +197,21 @@ public class RepositoriesPanel extends BasePanel {
((RepositoriesProvider) dp).remove(entry);
}
} else {
error(MessageFormat.format("Failed to delete repository ''{0}''!", entry));
error(MessageFormat.format("Failed to delete repository ''{0}''!",
entry));
}
}
};
deleteLink.add(new JavascriptEventConfirmation("onclick", MessageFormat.format("Delete repository \"{0}\"?", entry)));
deleteLink.add(new JavascriptEventConfirmation("onclick", MessageFormat.format(
"Delete repository \"{0}\"?", entry)));
repositoryLinks.add(deleteLink);
row.add(repositoryLinks);
} else if (showOwner) {
Fragment repositoryLinks = new Fragment("repositoryLinks", "repositoryOwnerLinks", this);
repositoryLinks.add(new BookmarkablePageLink<Void>("editRepository", EditRepositoryPage.class, WicketUtils.newRepositoryParameter(entry.name)));
Fragment repositoryLinks = new Fragment("repositoryLinks",
"repositoryOwnerLinks", this);
repositoryLinks.add(new BookmarkablePageLink<Void>("editRepository",
EditRepositoryPage.class, WicketUtils
.newRepositoryParameter(entry.name)));
row.add(repositoryLinks);
} else {
row.add(new Label("repositoryLinks"));
@@ -220,11 +238,11 @@ public class RepositoriesPanel extends BasePanel {
}
}
private class GroupRepositoryModel extends RepositoryModel {
private static class GroupRepositoryModel extends RepositoryModel {
private static final long serialVersionUID = 1L;
int count = 0;
int count;
GroupRepositoryModel(String name, int count) {
super(name, "", "", new Date(0));
@@ -241,7 +259,8 @@ public class RepositoriesPanel extends BasePanel {
repository, description, owner, date;
}
protected OrderByBorder newSort(String wicketId, SortBy field, SortableDataProvider<?> dp, final DataView<?> dataView) {
protected OrderByBorder newSort(String wicketId, SortBy field, SortableDataProvider<?> dp,
final DataView<?> dataView) {
return new OrderByBorder(wicketId, field.name(), dp) {
private static final long serialVersionUID = 1L;
@@ -252,7 +271,7 @@ public class RepositoriesPanel extends BasePanel {
};
}
private class RepositoriesProvider extends ListDataProvider<RepositoryModel> {
private static class RepositoriesProvider extends ListDataProvider<RepositoryModel> {
private static final long serialVersionUID = 1L;
@@ -279,7 +298,8 @@ public class RepositoriesPanel extends BasePanel {
}
} else if (index < (getData().size() - 1)) {
// not last element. check next element for group match.
if (getData().get(index - 1) instanceof GroupRepositoryModel && getData().get(index + 1) instanceof GroupRepositoryModel) {
if (getData().get(index - 1) instanceof GroupRepositoryModel
&& getData().get(index + 1) instanceof GroupRepositoryModel) {
// repository is sandwiched by group headers so this
// repository is the only element in the group. remove
// group.
@@ -304,9 +324,11 @@ public class RepositoriesPanel extends BasePanel {
}
}
private class SortableRepositoriesProvider extends SortableDataProvider<RepositoryModel> {
private static class SortableRepositoriesProvider extends SortableDataProvider<RepositoryModel> {
private static final long serialVersionUID = 1L;
private List<RepositoryModel> list = null;
private List<RepositoryModel> list;
protected SortableRepositoriesProvider(List<RepositoryModel> list) {
this.list = list;
@@ -319,8 +341,9 @@ public class RepositoriesPanel extends BasePanel {
@Override
public int size() {
if (list == null)
if (list == null) {
return 0;
}
return list.size();
}
@@ -339,8 +362,9 @@ public class RepositoriesPanel extends BasePanel {
Collections.sort(list, new Comparator<RepositoryModel>() {
@Override
public int compare(RepositoryModel o1, RepositoryModel o2) {
if (asc)
if (asc) {
return o1.lastChange.compareTo(o2.lastChange);
}
return o2.lastChange.compareTo(o1.lastChange);
}
});
@@ -348,8 +372,9 @@ public class RepositoriesPanel extends BasePanel {
Collections.sort(list, new Comparator<RepositoryModel>() {
@Override
public int compare(RepositoryModel o1, RepositoryModel o2) {
if (asc)
if (asc) {
return o1.name.compareTo(o2.name);
}
return o2.name.compareTo(o1.name);
}
});
@@ -357,8 +382,9 @@ public class RepositoriesPanel extends BasePanel {
Collections.sort(list, new Comparator<RepositoryModel>() {
@Override
public int compare(RepositoryModel o1, RepositoryModel o2) {
if (asc)
if (asc) {
return o1.owner.compareTo(o2.owner);
}
return o2.owner.compareTo(o1.owner);
}
});
@@ -366,8 +392,9 @@ public class RepositoriesPanel extends BasePanel {
Collections.sort(list, new Comparator<RepositoryModel>() {
@Override
public int compare(RepositoryModel o1, RepositoryModel o2) {
if (asc)
if (asc) {
return o1.description.compareTo(o2.description);
}
return o2.description.compareTo(o1.description);
}
});

+ 22
- 12
src/com/gitblit/wicket/panels/SearchPanel.java View File

@@ -43,12 +43,13 @@ public class SearchPanel extends BasePanel {
private static final long serialVersionUID = 1L;
private boolean hasMore = false;
private boolean hasMore;
public SearchPanel(String wicketId, final String repositoryName, final String objectId, final String value, SearchType searchType, Repository r, int limit, int pageOffset) {
public SearchPanel(String wicketId, final String repositoryName, final String objectId,
final String value, SearchType searchType, Repository r, int limit, int pageOffset) {
super(wicketId);
boolean pageResults = limit <= 0;
int itemsPerPage = GitBlit.self().settings().getInteger(Keys.web.itemsPerPage, 50);
int itemsPerPage = GitBlit.getInteger(Keys.web.itemsPerPage, 50);
if (itemsPerPage <= 1) {
itemsPerPage = 50;
}
@@ -59,7 +60,8 @@ public class SearchPanel extends BasePanel {
List<RevCommit> commits;
if (pageResults) {
// Paging result set
commits = JGitUtils.searchRevlogs(r, objectId, value, searchType, pageOffset * itemsPerPage, itemsPerPage);
commits = JGitUtils.searchRevlogs(r, objectId, value, searchType, pageOffset
* itemsPerPage, itemsPerPage);
} else {
// Fixed size result set
commits = JGitUtils.searchRevlogs(r, objectId, value, searchType, 0, limit);
@@ -70,12 +72,14 @@ public class SearchPanel extends BasePanel {
hasMore = commits.size() >= itemsPerPage;
// header
add(new LinkPanel("header", "title", commit == null ? "":commit.getShortMessage(), CommitPage.class, WicketUtils.newObjectParameter(repositoryName, commit == null ? "":commit.getName())));
add(new LinkPanel("header", "title", commit == null ? "" : commit.getShortMessage(),
CommitPage.class, WicketUtils.newObjectParameter(repositoryName,
commit == null ? "" : commit.getName())));
ListDataProvider<RevCommit> dp = new ListDataProvider<RevCommit>(commits);
DataView<RevCommit> searchView = new DataView<RevCommit>("commit", dp) {
private static final long serialVersionUID = 1L;
int counter = 0;
int counter;
public void populateItem(final Item<RevCommit> item) {
final RevCommit entry = item.getModelObject();
@@ -85,7 +89,9 @@ public class SearchPanel extends BasePanel {
// author search link
String author = entry.getAuthorIdent().getName();
LinkPanel authorLink = new LinkPanel("commitAuthor", "list", author, SearchPage.class, WicketUtils.newSearchParameter(repositoryName, objectId, author, SearchType.AUTHOR));
LinkPanel authorLink = new LinkPanel("commitAuthor", "list", author,
SearchPage.class, WicketUtils.newSearchParameter(repositoryName, objectId,
author, SearchType.AUTHOR));
setPersonSearchTooltip(authorLink, author, SearchType.AUTHOR);
item.add(authorLink);
@@ -98,8 +104,9 @@ public class SearchPanel extends BasePanel {
String shortMessage = entry.getShortMessage();
String trimmedMessage = StringUtils.trimShortLog(shortMessage);
// TODO highlight matches
LinkPanel shortlog = new LinkPanel("commitShortMessage", "list subject", trimmedMessage, CommitPage.class, WicketUtils.newObjectParameter(repositoryName, entry.getName()));
LinkPanel shortlog = new LinkPanel("commitShortMessage", "list subject",
trimmedMessage, CommitPage.class, WicketUtils.newObjectParameter(
repositoryName, entry.getName()));
if (!shortMessage.equals(trimmedMessage)) {
WicketUtils.setHtmlTooltip(shortlog, shortMessage);
}
@@ -107,9 +114,12 @@ public class SearchPanel extends BasePanel {
item.add(new RefsPanel("commitRefs", repositoryName, entry, allRefs));
item.add(new BookmarkablePageLink<Void>("commit", CommitPage.class, WicketUtils.newObjectParameter(repositoryName, entry.getName())));
item.add(new BookmarkablePageLink<Void>("commitdiff", CommitDiffPage.class, WicketUtils.newObjectParameter(repositoryName, entry.getName())));
item.add(new BookmarkablePageLink<Void>("tree", TreePage.class, WicketUtils.newObjectParameter(repositoryName, entry.getName())));
item.add(new BookmarkablePageLink<Void>("commit", CommitPage.class, WicketUtils
.newObjectParameter(repositoryName, entry.getName())));
item.add(new BookmarkablePageLink<Void>("commitdiff", CommitDiffPage.class,
WicketUtils.newObjectParameter(repositoryName, entry.getName())));
item.add(new BookmarkablePageLink<Void>("tree", TreePage.class, WicketUtils
.newObjectParameter(repositoryName, entry.getName())));
WicketUtils.setAlternatingBackground(item, counter);
counter++;

+ 30
- 13
src/com/gitblit/wicket/panels/TagsPanel.java View File

@@ -49,17 +49,19 @@ public class TagsPanel extends BasePanel {
if (maxCount > 0) {
// summary page
// show tags page link
add(new LinkPanel("header", "title", new StringResourceModel("gb.tags", this, null), TagsPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
add(new LinkPanel("header", "title", new StringResourceModel("gb.tags", this, null),
TagsPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
} else {
// tags page
// show repository summary page link
add(new LinkPanel("header", "title", repositoryName, SummaryPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
add(new LinkPanel("header", "title", repositoryName, SummaryPage.class,
WicketUtils.newRepositoryParameter(repositoryName)));
}
ListDataProvider<RefModel> tagsDp = new ListDataProvider<RefModel>(tags);
DataView<RefModel> tagView = new DataView<RefModel>("tag", tagsDp) {
private static final long serialVersionUID = 1L;
int counter = 0;
int counter;
public void populateItem(final Item<RefModel> item) {
RefModel entry = item.getModelObject();
@@ -72,8 +74,10 @@ public class TagsPanel extends BasePanel {
} else {
item.add(WicketUtils.newBlankImage("tagIcon"));
}
item.add(new LinkPanel("tagName", "list name", entry.getDisplayName(), CommitPage.class, WicketUtils.newObjectParameter(repositoryName, entry.getCommitId().getName())));
item.add(new LinkPanel("tagName", "list name", entry.displayName, CommitPage.class,
WicketUtils.newObjectParameter(repositoryName, entry.getCommitId()
.getName())));
String message;
if (maxCount > 0) {
message = StringUtils.trimString(entry.getShortLog(), 40);
@@ -81,17 +85,29 @@ public class TagsPanel extends BasePanel {
message = entry.getShortLog();
}
if (entry.isAnnotatedTag()) {
item.add(new LinkPanel("tagDescription", "list", message, TagPage.class, WicketUtils.newObjectParameter(repositoryName, entry.getObjectId().getName())));
item.add(new LinkPanel("tagDescription", "list", message, TagPage.class,
WicketUtils.newObjectParameter(repositoryName, entry.getObjectId()
.getName())));
Fragment fragment = new Fragment("tagLinks", "annotatedLinks", this);
fragment.add(new BookmarkablePageLink<Void>("view", TagPage.class, WicketUtils.newObjectParameter(repositoryName, entry.getObjectId().getName())).setEnabled(entry.isAnnotatedTag()));
fragment.add(new BookmarkablePageLink<Void>("commit", CommitPage.class, WicketUtils.newObjectParameter(repositoryName, entry.getCommitId().getName())));
fragment.add(new BookmarkablePageLink<Void>("log", LogPage.class, WicketUtils.newObjectParameter(repositoryName, entry.getName())));
fragment.add(new BookmarkablePageLink<Void>("view", TagPage.class, WicketUtils
.newObjectParameter(repositoryName, entry.getObjectId().getName()))
.setEnabled(entry.isAnnotatedTag()));
fragment.add(new BookmarkablePageLink<Void>("commit", CommitPage.class,
WicketUtils.newObjectParameter(repositoryName, entry.getCommitId()
.getName())));
fragment.add(new BookmarkablePageLink<Void>("log", LogPage.class, WicketUtils
.newObjectParameter(repositoryName, entry.getName())));
item.add(fragment);
} else {
item.add(new LinkPanel("tagDescription", "list", message, CommitPage.class, WicketUtils.newObjectParameter(repositoryName, entry.getObjectId().getName())));
item.add(new LinkPanel("tagDescription", "list", message, CommitPage.class,
WicketUtils.newObjectParameter(repositoryName, entry.getObjectId()
.getName())));
Fragment fragment = new Fragment("tagLinks", "lightweightLinks", this);
fragment.add(new BookmarkablePageLink<Void>("commit", CommitPage.class, WicketUtils.newObjectParameter(repositoryName, entry.getCommitId().getName())));
fragment.add(new BookmarkablePageLink<Void>("log", LogPage.class, WicketUtils.newObjectParameter(repositoryName, entry.getName())));
fragment.add(new BookmarkablePageLink<Void>("commit", CommitPage.class,
WicketUtils.newObjectParameter(repositoryName, entry.getCommitId()
.getName())));
fragment.add(new BookmarkablePageLink<Void>("log", LogPage.class, WicketUtils
.newObjectParameter(repositoryName, entry.getName())));
item.add(fragment);
}
@@ -103,7 +119,8 @@ public class TagsPanel extends BasePanel {
if (tags.size() < maxCount || maxCount <= 0) {
add(new Label("allTags", "").setVisible(false));
} else {
add(new LinkPanel("allTags", "link", new StringResourceModel("gb.allTags", this, null), TagsPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
add(new LinkPanel("allTags", "link", new StringResourceModel("gb.allTags", this, null),
TagsPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
}
}
}

+ 10
- 6
src/com/gitblit/wicket/panels/UsersPanel.java View File

@@ -42,10 +42,11 @@ public class UsersPanel extends BasePanel {
add(adminLinks.setVisible(showAdmin));
final List<String> usernames = GitBlit.self().getAllUsernames();
DataView<String> usersView = new DataView<String>("userRow", new ListDataProvider<String>(usernames)) {
DataView<String> usersView = new DataView<String>("userRow", new ListDataProvider<String>(
usernames)) {
private static final long serialVersionUID = 1L;
private int counter = 0;
private int counter;
@Override
protected void onBeforeRender() {
super.onBeforeRender();
@@ -54,11 +55,13 @@ public class UsersPanel extends BasePanel {
public void populateItem(final Item<String> item) {
final String entry = item.getModelObject();
LinkPanel editLink = new LinkPanel("username", "list", entry, EditUserPage.class, WicketUtils.newUsernameParameter(entry));
LinkPanel editLink = new LinkPanel("username", "list", entry, EditUserPage.class,
WicketUtils.newUsernameParameter(entry));
WicketUtils.setHtmlTooltip(editLink, getString("gb.edit") + " " + entry);
item.add(editLink);
Fragment userLinks = new Fragment("userLinks", "userAdminLinks", this);
userLinks.add(new BookmarkablePageLink<Void>("editUser", EditUserPage.class, WicketUtils.newUsernameParameter(entry)));
userLinks.add(new BookmarkablePageLink<Void>("editUser", EditUserPage.class,
WicketUtils.newUsernameParameter(entry)));
Link<Void> deleteLink = new Link<Void>("deleteUser") {
private static final long serialVersionUID = 1L;
@@ -73,7 +76,8 @@ public class UsersPanel extends BasePanel {
}
}
};
deleteLink.add(new JavascriptEventConfirmation("onclick", MessageFormat.format("Delete user \"{0}\"?", entry)));
deleteLink.add(new JavascriptEventConfirmation("onclick", MessageFormat.format(
"Delete user \"{0}\"?", entry)));
userLinks.add(deleteLink);
item.add(userLinks);

+ 64
- 0
tests/com/gitblit/tests/GitBlitSuite.java View File

@@ -0,0 +1,64 @@
package com.gitblit.tests;
import java.io.File;
import junit.extensions.TestSetup;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.jgit.api.CloneCommand;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.storage.file.FileRepository;
public class GitBlitSuite extends TestSetup {
public static final File REPOSITORIES = new File("git");
private GitBlitSuite(TestSuite suite) {
super(suite);
}
public static Test suite() {
TestSuite suite = new TestSuite();
suite.addTestSuite(JGitUtilsTest.class);
return new GitBlitSuite(suite);
}
public static Repository getHelloworldRepository() throws Exception {
return new FileRepository(new File(REPOSITORIES, "helloworld.git"));
}
public static Repository getTicgitRepository() throws Exception {
return new FileRepository(new File(REPOSITORIES, "ticgit.git"));
}
@Override
protected void setUp() throws Exception {
if (REPOSITORIES.exists() || REPOSITORIES.mkdirs()) {
cloneOrFetch("helloworld.git", "https://github.com/git/hello-world.git", true);
cloneOrFetch("nested/helloworld.git", "https://github.com/git/hello-world.git", true);
cloneOrFetch("ticgit.git", "https://github.com/jeffWelling/ticgit.git", true);
}
}
private void cloneOrFetch(String toFolder, String fromUrl, boolean bare) throws Exception {
File folder = new File(REPOSITORIES, toFolder + (bare ? "" : "/.git"));
if (folder.exists()) {
System.out.print("Updating " + (bare ? "bare " : " ") + toFolder + "... ");
FileRepository repository = new FileRepository(new File(REPOSITORIES, toFolder));
Git git = new Git(repository);
git.fetch().call();
repository.close();
System.out.println("done.");
} else {
System.out.println("Cloning " + (bare ? "bare " : " ") + toFolder + "... ");
CloneCommand clone = new CloneCommand();
clone.setBare(bare);
clone.setCloneAllBranches(true);
clone.setURI(fromUrl);
clone.setDirectory(folder);
clone.call();
System.out.println("done.");
}
}
}

+ 130
- 0
tests/com/gitblit/tests/JGitUtilsTest.java View File

@@ -0,0 +1,130 @@
/*
* 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 java.io.File;
import java.io.FileOutputStream;
import java.util.Date;
import java.util.List;
import junit.framework.TestCase;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevBlob;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevObject;
import org.eclipse.jgit.revwalk.RevTree;
import com.gitblit.utils.JGitUtils;
import com.gitblit.utils.JGitUtils.DiffOutputType;
import com.gitblit.wicket.models.PathModel.PathChangeModel;
import com.gitblit.wicket.models.RefModel;
import com.gitblit.wicket.models.TicketModel;
public class JGitUtilsTest extends TestCase {
private List<String> getRepositories() {
return JGitUtils.getRepositoryList(GitBlitSuite.REPOSITORIES, true, true);
}
public void testFindRepositories() {
List<String> list = getRepositories();
assertTrue("No repositories found in " + GitBlitSuite.REPOSITORIES, list.size() > 0);
}
public void testOpenRepository() throws Exception {
Repository repository = GitBlitSuite.getHelloworldRepository();
repository.close();
assertTrue("Could not find repository!", repository != null);
}
public void testLastChangeRepository() throws Exception {
Repository repository = GitBlitSuite.getHelloworldRepository();
Date date = JGitUtils.getLastChange(repository);
repository.close();
assertTrue("Could not get last repository change date!", date != null);
}
public void testFirstCommit() throws Exception {
Repository repository = GitBlitSuite.getHelloworldRepository();
RevCommit commit = JGitUtils.getFirstCommit(repository, null);
repository.close();
assertTrue("Could not get first commit!", commit != null);
assertTrue("Incorrect first commit!",
commit.getName().equals("f554664a346629dc2b839f7292d06bad2db4aece"));
}
public void testRetrieveRevObject() throws Exception {
Repository repository = GitBlitSuite.getHelloworldRepository();
RevCommit commit = JGitUtils.getCommit(repository, Constants.HEAD);
RevTree tree = commit.getTree();
RevObject object = JGitUtils.getRevObject(repository, tree, "java.java");
repository.close();
assertTrue("Object is null!", object != null);
}
public void testRetrieveStringContent() throws Exception {
Repository repository = GitBlitSuite.getHelloworldRepository();
RevCommit commit = JGitUtils.getCommit(repository, Constants.HEAD);
RevTree tree = commit.getTree();
RevBlob blob = (RevBlob) JGitUtils.getRevObject(repository, tree, "java.java");
String content = JGitUtils.getRawContentAsString(repository, blob);
repository.close();
assertTrue("Content is null!", content != null && content.length() > 0);
}
public void testFilesInCommit() throws Exception {
Repository repository = GitBlitSuite.getHelloworldRepository();
RevCommit commit = JGitUtils.getCommit(repository,
"1d0c2933a4ae69c362f76797d42d6bd182d05176");
List<PathChangeModel> paths = JGitUtils.getFilesInCommit(repository, commit);
repository.close();
assertTrue("No changed paths found!", paths.size() == 1);
}
public void testCommitDiff() throws Exception {
Repository repository = GitBlitSuite.getHelloworldRepository();
RevCommit commit = JGitUtils.getCommit(repository,
"1d0c2933a4ae69c362f76797d42d6bd182d05176");
String diff = JGitUtils.getCommitDiff(repository, commit, DiffOutputType.PLAIN);
repository.close();
assertTrue("Failed to generate diff!", diff != null && diff.length() > 0);
String expected = "- system.out.println(\"Hello World\");\n+ System.out.println(\"Hello World\"";
assertTrue("Diff content mismatch!", diff.indexOf(expected) > -1);
}
public void testZip() throws Exception {
Repository repository = GitBlitSuite.getHelloworldRepository();
File zipFile = new File(GitBlitSuite.REPOSITORIES, "helloworld.zip");
FileOutputStream fos = new FileOutputStream(zipFile);
boolean success = JGitUtils.zip(repository, null, Constants.HEAD, fos);
assertTrue("Failed to generate zip file!", success);
assertTrue(zipFile.length() > 0);
fos.close();
zipFile.delete();
repository.close();
}
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);
repository.close();
assertTrue("No tickets found!", tickets.size() > 0);
}
}

Loading…
Cancel
Save