From 5fe7df81eb38dc66f2cfc4bf1973863a19f55cf2 Mon Sep 17 00:00:00 2001 From: James Moger Date: Mon, 4 Apr 2011 09:10:51 -0400 Subject: [PATCH 1/1] Initial import of Git:Blit. Change-Id: Ifce000c85c8947c3a768e782c841e41a8953d314 --- .classpath | 19 + .gitignore | 6 + .project | 17 + build.xml | 92 +++ gitblit.cmd | 1 + gitblit.properties | 96 +++ makekeystore.cmd | 2 + makepassword.cmd | 12 + makerepository.cmd | 11 + resources/arrow_down.png | Bin 0 -> 189 bytes resources/arrow_off.png | Bin 0 -> 178 bytes resources/arrow_up.png | Bin 0 -> 189 bytes resources/git-favicon.png | Bin 0 -> 115 bytes resources/gitblit.css | 56 ++ resources/gitblt-logo.png | Bin 0 -> 3050 bytes resources/gitblt.png | Bin 0 -> 5427 bytes resources/gitblt2.png | Bin 0 -> 6543 bytes resources/gitblt3.png | Bin 0 -> 4464 bytes resources/gitblt_25.png | Bin 0 -> 3040 bytes resources/gitweb.css | 604 ++++++++++++++++++ resources/prettify/lang-apollo.js | 2 + resources/prettify/lang-css.js | 2 + resources/prettify/lang-hs.js | 2 + resources/prettify/lang-lisp.js | 2 + resources/prettify/lang-lua.js | 2 + resources/prettify/lang-ml.js | 2 + resources/prettify/lang-proto.js | 1 + resources/prettify/lang-scala.js | 2 + resources/prettify/lang-sql.js | 2 + resources/prettify/lang-vb.js | 2 + resources/prettify/lang-vhdl.js | 3 + resources/prettify/lang-wiki.js | 2 + resources/prettify/lang-yaml.js | 2 + resources/prettify/prettify.css | 1 + resources/prettify/prettify.js | 33 + service/JavaService.exe | Bin 0 -> 65536 bytes service/JavaService64.exe | Bin 0 -> 139264 bytes service/UninstallService.bat | 1 + service/UninstallService64.bat | 1 + service/installService.bat | 2 + service/installService64.bat | 2 + src/com/gitblit/Build.java | 168 +++++ src/com/gitblit/Constants.java | 12 + src/com/gitblit/GitBlitServer.java | 393 ++++++++++++ src/com/gitblit/Launcher.java | 117 ++++ src/com/gitblit/MakeRepository.java | 51 ++ src/com/gitblit/StoredSettings.java | 130 ++++ src/com/gitblit/tests/JGitUtilsTest.java | 71 ++ src/com/gitblit/utils/ByteFormat.java | 82 +++ src/com/gitblit/utils/JGitUtils.java | 430 +++++++++++++ src/com/gitblit/utils/Utils.java | 119 ++++ src/com/gitblit/wicket/BasePage.java | 69 ++ src/com/gitblit/wicket/GitBlitWebApp.java | 143 +++++ src/com/gitblit/wicket/GitBlitWebSession.java | 74 +++ src/com/gitblit/wicket/LinkPanel.html | 6 + src/com/gitblit/wicket/LinkPanel.java | 44 ++ src/com/gitblit/wicket/RepositoryPage.java | 118 ++++ src/com/gitblit/wicket/SecuredPage.java | 11 + src/com/gitblit/wicket/WicketUtils.java | 35 + src/com/gitblit/wicket/models/PathModel.java | 45 ++ src/com/gitblit/wicket/models/RefModel.java | 54 ++ .../wicket/models/RepositoryModel.java | 20 + src/com/gitblit/wicket/pages/BlobPage.html | 31 + src/com/gitblit/wicket/pages/BlobPage.java | 94 +++ src/com/gitblit/wicket/pages/CommitPage.html | 51 ++ src/com/gitblit/wicket/pages/CommitPage.java | 106 +++ src/com/gitblit/wicket/pages/HeadsPage.html | 26 + src/com/gitblit/wicket/pages/HeadsPage.java | 63 ++ src/com/gitblit/wicket/pages/LogPage.html | 33 + src/com/gitblit/wicket/pages/LogPage.java | 69 ++ .../wicket/pages/RepositoriesPage.html | 29 + .../wicket/pages/RepositoriesPage.java | 151 +++++ .../gitblit/wicket/pages/ShortLogPage.html | 31 + .../gitblit/wicket/pages/ShortLogPage.java | 76 +++ src/com/gitblit/wicket/pages/SummaryPage.html | 76 +++ src/com/gitblit/wicket/pages/SummaryPage.java | 149 +++++ src/com/gitblit/wicket/pages/TagPage.html | 28 + src/com/gitblit/wicket/pages/TagPage.java | 36 ++ src/com/gitblit/wicket/pages/TagsPage.html | 30 + src/com/gitblit/wicket/pages/TagsPage.java | 64 ++ src/com/gitblit/wicket/pages/TreePage.html | 35 + src/com/gitblit/wicket/pages/TreePage.java | 89 +++ .../gitblit/wicket/panels/HeadLinksPanel.html | 8 + .../gitblit/wicket/panels/HeadLinksPanel.java | 23 + src/com/gitblit/wicket/panels/PageFooter.html | 10 + src/com/gitblit/wicket/panels/PageFooter.java | 28 + src/com/gitblit/wicket/panels/PageHeader.html | 15 + src/com/gitblit/wicket/panels/PageHeader.java | 41 ++ .../gitblit/wicket/panels/PageLinksPanel.html | 9 + .../gitblit/wicket/panels/PageLinksPanel.java | 61 ++ .../wicket/panels/PathBreadcrumbsPanel.html | 11 + .../wicket/panels/PathBreadcrumbsPanel.java | 79 +++ .../gitblit/wicket/panels/PathLinksPanel.html | 8 + .../gitblit/wicket/panels/PathLinksPanel.java | 22 + src/com/gitblit/wicket/panels/RefsPanel.html | 8 + src/com/gitblit/wicket/panels/RefsPanel.java | 66 ++ .../wicket/panels/ShortLogLinksPanel.html | 8 + .../wicket/panels/ShortLogLinksPanel.java | 23 + .../gitblit/wicket/panels/TagLinksPanel.html | 8 + .../gitblit/wicket/panels/TagLinksPanel.java | 23 + .../gitblit/wicket/panels/TreeLinksPanel.html | 8 + .../gitblit/wicket/panels/TreeLinksPanel.java | 29 + src/log4j.properties | 12 + users.properties | 1 + 104 files changed, 4942 insertions(+) create mode 100644 .classpath create mode 100644 .gitignore create mode 100644 .project create mode 100644 build.xml create mode 100644 gitblit.cmd create mode 100644 gitblit.properties create mode 100644 makekeystore.cmd create mode 100644 makepassword.cmd create mode 100644 makerepository.cmd create mode 100644 resources/arrow_down.png create mode 100644 resources/arrow_off.png create mode 100644 resources/arrow_up.png create mode 100644 resources/git-favicon.png create mode 100644 resources/gitblit.css create mode 100644 resources/gitblt-logo.png create mode 100644 resources/gitblt.png create mode 100644 resources/gitblt2.png create mode 100644 resources/gitblt3.png create mode 100644 resources/gitblt_25.png create mode 100644 resources/gitweb.css create mode 100644 resources/prettify/lang-apollo.js create mode 100644 resources/prettify/lang-css.js create mode 100644 resources/prettify/lang-hs.js create mode 100644 resources/prettify/lang-lisp.js create mode 100644 resources/prettify/lang-lua.js create mode 100644 resources/prettify/lang-ml.js create mode 100644 resources/prettify/lang-proto.js create mode 100644 resources/prettify/lang-scala.js create mode 100644 resources/prettify/lang-sql.js create mode 100644 resources/prettify/lang-vb.js create mode 100644 resources/prettify/lang-vhdl.js create mode 100644 resources/prettify/lang-wiki.js create mode 100644 resources/prettify/lang-yaml.js create mode 100644 resources/prettify/prettify.css create mode 100644 resources/prettify/prettify.js create mode 100644 service/JavaService.exe create mode 100644 service/JavaService64.exe create mode 100644 service/UninstallService.bat create mode 100644 service/UninstallService64.bat create mode 100644 service/installService.bat create mode 100644 service/installService64.bat create mode 100644 src/com/gitblit/Build.java create mode 100644 src/com/gitblit/Constants.java create mode 100644 src/com/gitblit/GitBlitServer.java create mode 100644 src/com/gitblit/Launcher.java create mode 100644 src/com/gitblit/MakeRepository.java create mode 100644 src/com/gitblit/StoredSettings.java create mode 100644 src/com/gitblit/tests/JGitUtilsTest.java create mode 100644 src/com/gitblit/utils/ByteFormat.java create mode 100644 src/com/gitblit/utils/JGitUtils.java create mode 100644 src/com/gitblit/utils/Utils.java create mode 100644 src/com/gitblit/wicket/BasePage.java create mode 100644 src/com/gitblit/wicket/GitBlitWebApp.java create mode 100644 src/com/gitblit/wicket/GitBlitWebSession.java create mode 100644 src/com/gitblit/wicket/LinkPanel.html create mode 100644 src/com/gitblit/wicket/LinkPanel.java create mode 100644 src/com/gitblit/wicket/RepositoryPage.java create mode 100644 src/com/gitblit/wicket/SecuredPage.java create mode 100644 src/com/gitblit/wicket/WicketUtils.java create mode 100644 src/com/gitblit/wicket/models/PathModel.java create mode 100644 src/com/gitblit/wicket/models/RefModel.java create mode 100644 src/com/gitblit/wicket/models/RepositoryModel.java create mode 100644 src/com/gitblit/wicket/pages/BlobPage.html create mode 100644 src/com/gitblit/wicket/pages/BlobPage.java create mode 100644 src/com/gitblit/wicket/pages/CommitPage.html create mode 100644 src/com/gitblit/wicket/pages/CommitPage.java create mode 100644 src/com/gitblit/wicket/pages/HeadsPage.html create mode 100644 src/com/gitblit/wicket/pages/HeadsPage.java create mode 100644 src/com/gitblit/wicket/pages/LogPage.html create mode 100644 src/com/gitblit/wicket/pages/LogPage.java create mode 100644 src/com/gitblit/wicket/pages/RepositoriesPage.html create mode 100644 src/com/gitblit/wicket/pages/RepositoriesPage.java create mode 100644 src/com/gitblit/wicket/pages/ShortLogPage.html create mode 100644 src/com/gitblit/wicket/pages/ShortLogPage.java create mode 100644 src/com/gitblit/wicket/pages/SummaryPage.html create mode 100644 src/com/gitblit/wicket/pages/SummaryPage.java create mode 100644 src/com/gitblit/wicket/pages/TagPage.html create mode 100644 src/com/gitblit/wicket/pages/TagPage.java create mode 100644 src/com/gitblit/wicket/pages/TagsPage.html create mode 100644 src/com/gitblit/wicket/pages/TagsPage.java create mode 100644 src/com/gitblit/wicket/pages/TreePage.html create mode 100644 src/com/gitblit/wicket/pages/TreePage.java create mode 100644 src/com/gitblit/wicket/panels/HeadLinksPanel.html create mode 100644 src/com/gitblit/wicket/panels/HeadLinksPanel.java create mode 100644 src/com/gitblit/wicket/panels/PageFooter.html create mode 100644 src/com/gitblit/wicket/panels/PageFooter.java create mode 100644 src/com/gitblit/wicket/panels/PageHeader.html create mode 100644 src/com/gitblit/wicket/panels/PageHeader.java create mode 100644 src/com/gitblit/wicket/panels/PageLinksPanel.html create mode 100644 src/com/gitblit/wicket/panels/PageLinksPanel.java create mode 100644 src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.html create mode 100644 src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.java create mode 100644 src/com/gitblit/wicket/panels/PathLinksPanel.html create mode 100644 src/com/gitblit/wicket/panels/PathLinksPanel.java create mode 100644 src/com/gitblit/wicket/panels/RefsPanel.html create mode 100644 src/com/gitblit/wicket/panels/RefsPanel.java create mode 100644 src/com/gitblit/wicket/panels/ShortLogLinksPanel.html create mode 100644 src/com/gitblit/wicket/panels/ShortLogLinksPanel.java create mode 100644 src/com/gitblit/wicket/panels/TagLinksPanel.html create mode 100644 src/com/gitblit/wicket/panels/TagLinksPanel.java create mode 100644 src/com/gitblit/wicket/panels/TreeLinksPanel.html create mode 100644 src/com/gitblit/wicket/panels/TreeLinksPanel.java create mode 100644 src/log4j.properties create mode 100644 users.properties diff --git a/.classpath b/.classpath new file mode 100644 index 00000000..c9073ae4 --- /dev/null +++ b/.classpath @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..10d4ae88 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +/temp +/lib +/ext +/build +/keystore +/gitblit.zip diff --git a/.project b/.project new file mode 100644 index 00000000..7bb83630 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + gitblit + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/build.xml b/build.xml new file mode 100644 index 00000000..258f4f45 --- /dev/null +++ b/build.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gitblit.cmd b/gitblit.cmd new file mode 100644 index 00000000..ce96a797 --- /dev/null +++ b/gitblit.cmd @@ -0,0 +1 @@ +@java -jar gitblit.jar diff --git a/gitblit.properties b/gitblit.properties new file mode 100644 index 00000000..815c646b --- /dev/null +++ b/gitblit.properties @@ -0,0 +1,96 @@ +# +# GIT Servlet Settings +# + +# Base folder for repositories +# Use forward slashes on Windows!! +repositoriesFolder = c:/projects/git + +# Export all repositories +# if false, each exported repository must have a .git/git-daemon-export-ok file +exportAll = true + +# Search repositories folder for nested repositories +nestedRepositories = true + +# The root clone url +cloneUrl = https://localhost/git/ + +# +# Authentication Settings +# + +# Require authentication for http push/pull of git repositories +authenticateAccess = true + +# Simple user realm file to authenticate users for push/pull +realmFile = users.properties + +# User roles for push/pull git repository access +# (* is the wildcard for any role) +gitRoles = * + +# User roles for administrative features such +# as create repository, edit repository description, +# and set repository owner. +# (* is the wildcard for any role) +adminRoles = * + +# +# Server Settings +# +debug = true +tempFolder = temp +log4jPattern = %-5p %d{MM-dd HH:mm:ss.SSS} %-20.20c{1} %m%n +# Aggressive garbage collection will run the collector on every generated page +# this slows down page generation but improves heap consumption +aggressiveGC = true + +# +# Git:Blit UI Settings +# +siteName = Git:Blit +allowAdministration = true +indexMessage = Welcome to Git:Blit!
A quick and easy way to host your own GIT repositories.
Built with JGit, Wicket, google-code-prettify, Jetty, SLF4J, Log4j, and JCommander. +timestampFormat = h:mm a + +datestampShortFormat = yyyy-MM-dd +datestampLongFormat = EEEE, MMMM d, yyyy + +datetimestampShortFormat = yyyy-MM-dd h:mm a +datetimestampLongFormat = EEEE, MMMM d, yyyy h:mm a + +# Registered extensions for google-code-prettify +prettyPrintExtensions = c cpp cs css htm html java js php pl prefs properties py rb sh sql xml vb + +# Image extensions +imageExtensions = bmp jpg gif png + +# Registered extensions for binary blobs +binaryExtensions = jar pdf tar.gz zip + +# Example global regex substitutions +regex.global.bug = \\b(Bug:)(\\s*[#]?|-){0,1}(\\d+)\\b!!!Bug-Id: $3 +regex.global.changeid = \\b(Change-Id:\\s*)([A-Za-z0-9]*)\\b!!!Change-Id: $2 + +# Example per-repository regex substitutions overrides global +regex.myrepository.bug = \\b(Bug:)(\\s*[#]?|-){0,1}(\\d+)\\b!!!Bug-Id: $3 + +# +# Jetty Settings +# + +# use NIO connectors. If false, socket connectors will be used. +useNio = true + +# Standard http port to serve. <= 0 disables this connector. +httpPort = 0 + +# Secure/SSL https port to serve. <= 0 disables this connector. +httpsPort = 443 + +# Password for SSL keystore (keystore password and certificate password must match) +storePassword = dosomegit + +# Port for shutdown monitor to listen on. +shutdownPort = 8081 diff --git a/makekeystore.cmd b/makekeystore.cmd new file mode 100644 index 00000000..34a11b21 --- /dev/null +++ b/makekeystore.cmd @@ -0,0 +1,2 @@ +@del keystore +@keytool -keystore keystore -alias localhost -genkey -keyalg RSA -dname "CN=localhost, OU=Git:Blit, O=Git:Blit, L=Some Town, ST=Some State, C=US" \ No newline at end of file diff --git a/makepassword.cmd b/makepassword.cmd new file mode 100644 index 00000000..0257e870 --- /dev/null +++ b/makepassword.cmd @@ -0,0 +1,12 @@ +@if [%1]==[] goto missingparameters +@if [%2]==[] goto missingparameters + +@java -cp "%CD%\ext\*" org.eclipse.jetty.http.security.Password %1 %2 +@goto end + +:missingparameters +@echo Usage: +@echo makepassword username password +@echo. + +:end \ No newline at end of file diff --git a/makerepository.cmd b/makerepository.cmd new file mode 100644 index 00000000..660e2d78 --- /dev/null +++ b/makerepository.cmd @@ -0,0 +1,11 @@ +@if [%1]==[] goto missingparameters + +@java -cp gitblit.jar;"%CD%\lib\*" com.gitblit.MakeRepository --create %1 +@goto end + +:missingparameters +@echo Usage: +@echo makerepository path_to_repository +@echo. + +:end \ No newline at end of file diff --git a/resources/arrow_down.png b/resources/arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..f31cc819227d6de6ed64b8110e759d5edca8b1d7 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2ZGmxy8xzq=w*h@TpUD>a)NeghWD!sb@6)416 z;1OBOz`!jC!i@DP@e_f9Ea{HEjtmSN`?>!lvVs%^_=LFr|NlQbJ8J9Jt=nbpMFRyH zOM?7@862M7NCR@TJY5_^DsCkwBqT8~sSFM8^>bP0l+XkKjlVN@ literal 0 HcmV?d00001 diff --git a/resources/arrow_off.png b/resources/arrow_off.png new file mode 100644 index 0000000000000000000000000000000000000000..f9b1ced26856a1fd207ed640b27d2d3281f911a4 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2ZGmxy8xzq=w*h@TpUD>a)Nei$^+|Qr42q?r^ z;1OBOz`!jC!i@DP@e_f9Ea{HEjtmSN`?>!lvI6;R0X`wF|NsBrx^?T8cb}?(B8(+L ze!&b5&u*jvIZB=`jv*Ddk`oeA7#JNH6%J}>a3paxS$Z%iF->e;!Sb4kL17J}pt10y Q2%u^PPgg&ebxsLQ06^a@-~a#s literal 0 HcmV?d00001 diff --git a/resources/arrow_up.png b/resources/arrow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..63031c33b3be5b0149ba31633a60a58a7320108e GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2ZGmxy8xzq=w*h@TpUD>a)Nei$E+3zaf0~F#c z@Q5sCVBi)6VaEED_=!M4mUKs7M+SzC{oH>NSwV^dd_r9R|Np;r>(=b-sQwo=0zg5= zk|4ie28U-i(tsQ-PZ!6Kid)GE2}ul$s;mkJmn>mP(rUEya0mzpXlQH<3=lXY$S|?T bfrr6DhH>Uz)emohx)?lN{an^LB{Ts59@#R5 literal 0 HcmV?d00001 diff --git a/resources/git-favicon.png b/resources/git-favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..aae35a70e70351fe6dcb3e905e2e388cf0cb0ac3 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|t_OgO28RFt|9AbV;Q+E# zJzX3_IIbs0u(I&n=wM^zQ{!k9h~8zS-IbV?l_Jr?P#n0GkzwKy<>-_7Web5C7(8A5 KT-G@yGywqXmL7co literal 0 HcmV?d00001 diff --git a/resources/gitblit.css b/resources/gitblit.css new file mode 100644 index 00000000..d81c063d --- /dev/null +++ b/resources/gitblit.css @@ -0,0 +1,56 @@ +/* + JGitWeb css. +*/ +body, table, tr, th, td { font-size: 13px; } + +table.object_header td, div.page_body, table.diff_tree td { + font-size: 12px; +} + +table.diff_tree td div.link { + padding: 2px 5px; + font-family: sans-serif; + font-size: 9px; +} + +div.link { + padding: 2px 5px; + font-family: sans-serif; + font-size: 9px; +} + +pre.prettyprint, pre.plainprint { + font-size:12px; + border:0px; +} + +div.page_nav2 { + padding: 0px 8px 8px 8px; +} + +table.project_list tr th a { padding-right: 15px; background-position: right; background-repeat:no-repeat; } +table.project_list tr th.wicket_orderDown a {font-weight: bold; background-image: url(arrow_down.png); } +table.project_list tr th.wicket_orderUp a { font-weight: bold; background-image: url(arrow_up.png); } +table.project_list tr th.wicket_orderNone a { font-weight: normal; background-image: url(arrow_off.png); } + +/* age0: age < 60*60*2 */ +table.project_list .age0 { + color: #009900; + font-style: italic; + font-weight: bold; +} + +/* age1: 60*60*2 <= age < 60*60*24*2 */ +table.project_list .age1 { + color: #009900; + font-style: italic; +} + +/* age2: 60*60*24*2 <= age */ +table.project_list .age2 { + font-style: italic; +} + +table.diff_tree td.size { + width:80px; +} \ No newline at end of file diff --git a/resources/gitblt-logo.png b/resources/gitblt-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7ec945b566df3fff13dcac61751082ef61077ccf GIT binary patch literal 3050 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 literal 0 HcmV?d00001 diff --git a/resources/gitblt.png b/resources/gitblt.png new file mode 100644 index 0000000000000000000000000000000000000000..7535bc3c1ba11d2f102d070aafd5f9685ae36499 GIT binary patch literal 5427 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 literal 0 HcmV?d00001 diff --git a/resources/gitblt2.png b/resources/gitblt2.png new file mode 100644 index 0000000000000000000000000000000000000000..c164294113cbb67718096eaa5192b399e941cdd8 GIT binary patch literal 6543 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 literal 0 HcmV?d00001 diff --git a/resources/gitblt_25.png b/resources/gitblt_25.png new file mode 100644 index 0000000000000000000000000000000000000000..ad580fadeb2efa497a6b2148217410b187c404a3 GIT binary patch literal 3040 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 iQ|dR51OIj3UicraDC1*Bf1joR0000)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#(?:[0-9a-f]{3}){1,2}/i],["pln",/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],["pun",/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^\)\"\']+/]]),["css-str"]) \ No newline at end of file diff --git a/resources/prettify/lang-hs.js b/resources/prettify/lang-hs.js new file mode 100644 index 00000000..00cea7cf --- /dev/null +++ b/resources/prettify/lang-hs.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\x0B\x0C\r ]+/,null,"\t\n\u000b\u000c\r "],["str",/^\"(?:[^\"\\\n\x0C\r]|\\[\s\S])*(?:\"|$)/,null,'"'],["str",/^\'(?:[^\'\\\n\x0C\r]|\\[^&])\'?/,null,"'"],["lit",/^(?:0o[0-7]+|0x[\da-f]+|\d+(?:\.\d+)?(?:e[+\-]?\d+)?)/i,null,"0123456789"]],[["com",/^(?:(?:--+(?:[^\r\n\x0C]*)?)|(?:\{-(?:[^-]|-+[^-\}])*-\}))/],["kwd",/^(?:case|class|data|default|deriving|do|else|if|import|in|infix|infixl|infixr|instance|let|module|newtype|of|then|type|where|_)(?=[^a-zA-Z0-9\']|$)/, +null],["pln",/^(?:[A-Z][\w\']*\.)*[a-zA-Z][\w\']*/],["pun",/^[^\t\n\x0B\x0C\r a-zA-Z0-9\'\"]+/]]),["hs"]) \ No newline at end of file diff --git a/resources/prettify/lang-lisp.js b/resources/prettify/lang-lisp.js new file mode 100644 index 00000000..fab992b8 --- /dev/null +++ b/resources/prettify/lang-lisp.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["opn",/^\(/,null,"("],["clo",/^\)/,null,")"],["com",/^;[^\r\n]*/,null,";"],["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/,null,'"']],[["kwd",/^(?:block|c[ad]+r|catch|con[ds]|def(?:ine|un)|do|eq|eql|equal|equalp|eval-when|flet|format|go|if|labels|lambda|let|load-time-value|locally|macrolet|multiple-value-call|nil|progn|progv|quote|require|return-from|setq|symbol-macrolet|t|tagbody|the|throw|unwind)\b/, +null],["lit",/^[+\-]?(?:0x[0-9a-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[ed][+\-]?\d+)?)/i],["lit",/^\'(?:-*(?:\w|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?)?/],["pln",/^-*(?:[a-z_]|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?/i],["pun",/^[^\w\t\n\r \xA0()\"\\\';]+/]]),["cl","el","lisp","scm"]) \ No newline at end of file diff --git a/resources/prettify/lang-lua.js b/resources/prettify/lang-lua.js new file mode 100644 index 00000000..45d0ba28 --- /dev/null +++ b/resources/prettify/lang-lua.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^(?:\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)|\'(?:[^\'\\]|\\[\s\S])*(?:\'|$))/,null,"\"'"]],[["com",/^--(?:\[(=*)\[[\s\S]*?(?:\]\1\]|$)|[^\r\n]*)/],["str",/^\[(=*)\[[\s\S]*?(?:\]\1\]|$)/],["kwd",/^(?:and|break|do|else|elseif|end|false|for|function|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,null],["lit",/^[+-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:e[+\-]?\d+)?))/i], +["pln",/^[a-z_]\w*/i],["pun",/^[^\w\t\n\r \xA0][^\w\t\n\r \xA0\"\'\-\+=]*/]]),["lua"]) \ No newline at end of file diff --git a/resources/prettify/lang-ml.js b/resources/prettify/lang-ml.js new file mode 100644 index 00000000..5879726e --- /dev/null +++ b/resources/prettify/lang-ml.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["com",/^#(?:if[\t\n\r \xA0]+(?:[a-z_$][\w\']*|``[^\r\n\t`]*(?:``|$))|else|endif|light)/i,null,"#"],["str",/^(?:\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)|\'(?:[^\'\\]|\\[\s\S])*(?:\'|$))/,null,"\"'"]],[["com",/^(?:\/\/[^\r\n]*|\(\*[\s\S]*?\*\))/],["kwd",/^(?:abstract|and|as|assert|begin|class|default|delegate|do|done|downcast|downto|elif|else|end|exception|extern|false|finally|for|fun|function|if|in|inherit|inline|interface|internal|lazy|let|match|member|module|mutable|namespace|new|null|of|open|or|override|private|public|rec|return|static|struct|then|to|true|try|type|upcast|use|val|void|when|while|with|yield|asr|land|lor|lsl|lsr|lxor|mod|sig|atomic|break|checked|component|const|constraint|constructor|continue|eager|event|external|fixed|functor|global|include|method|mixin|object|parallel|process|protected|pure|sealed|trait|virtual|volatile)\b/], +["lit",/^[+\-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:e[+\-]?\d+)?))/i],["pln",/^(?:[a-z_]\w*[!?#]?|``[^\r\n\t`]*(?:``|$))/i],["pun",/^[^\t\n\r \xA0\"\'\w]+/]]),["fs","ml"]) \ No newline at end of file diff --git a/resources/prettify/lang-proto.js b/resources/prettify/lang-proto.js new file mode 100644 index 00000000..f713420c --- /dev/null +++ b/resources/prettify/lang-proto.js @@ -0,0 +1 @@ +PR.registerLangHandler(PR.sourceDecorator({keywords:"bool bytes default double enum extend extensions false fixed32 fixed64 float group import int32 int64 max message option optional package repeated required returns rpc service sfixed32 sfixed64 sint32 sint64 string syntax to true uint32 uint64",cStyleComments:true}),["proto"]) \ No newline at end of file diff --git a/resources/prettify/lang-scala.js b/resources/prettify/lang-scala.js new file mode 100644 index 00000000..00f4e0c2 --- /dev/null +++ b/resources/prettify/lang-scala.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^(?:"(?:(?:""(?:""?(?!")|[^\\"]|\\.)*"{0,3})|(?:[^"\r\n\\]|\\.)*"?))/,null,'"'],["lit",/^`(?:[^\r\n\\`]|\\.)*`?/,null,"`"],["pun",/^[!#%&()*+,\-:;<=>?@\[\\\]^{|}~]+/,null,"!#%&()*+,-:;<=>?@[\\]^{|}~"]],[["str",/^'(?:[^\r\n\\']|\\(?:'|[^\r\n']+))'/],["lit",/^'[a-zA-Z_$][\w$]*(?!['$\w])/],["kwd",/^(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|object|override|package|private|protected|requires|return|sealed|super|throw|trait|try|type|val|var|while|with|yield)\b/], +["lit",/^(?:true|false|null|this)\b/],["lit",/^(?:(?:0(?:[0-7]+|X[0-9A-F]+))L?|(?:(?:0|[1-9][0-9]*)(?:(?:\.[0-9]+)?(?:E[+\-]?[0-9]+)?F?|L?))|\\.[0-9]+(?:E[+\-]?[0-9]+)?F?)/i],["typ",/^[$_]*[A-Z][_$A-Z0-9]*[a-z][\w$]*/],["pln",/^[$a-zA-Z_][\w$]*/],["com",/^\/(?:\/.*|\*(?:\/|\**[^*/])*(?:\*+\/?)?)/],["pun",/^(?:\.+|\/)/]]),["scala"]) \ No newline at end of file diff --git a/resources/prettify/lang-sql.js b/resources/prettify/lang-sql.js new file mode 100644 index 00000000..800b13ea --- /dev/null +++ b/resources/prettify/lang-sql.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],["str",/^(?:"(?:[^\"\\]|\\.)*"|'(?:[^\'\\]|\\.)*')/,null,"\"'"]],[["com",/^(?:--[^\r\n]*|\/\*[\s\S]*?(?:\*\/|$))/],["kwd",/^(?:ADD|ALL|ALTER|AND|ANY|AS|ASC|AUTHORIZATION|BACKUP|BEGIN|BETWEEN|BREAK|BROWSE|BULK|BY|CASCADE|CASE|CHECK|CHECKPOINT|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMN|COMMIT|COMPUTE|CONSTRAINT|CONTAINS|CONTAINSTABLE|CONTINUE|CONVERT|CREATE|CROSS|CURRENT|CURRENT_DATE|CURRENT_TIME|CURRENT_TIMESTAMP|CURRENT_USER|CURSOR|DATABASE|DBCC|DEALLOCATE|DECLARE|DEFAULT|DELETE|DENY|DESC|DISK|DISTINCT|DISTRIBUTED|DOUBLE|DROP|DUMMY|DUMP|ELSE|END|ERRLVL|ESCAPE|EXCEPT|EXEC|EXECUTE|EXISTS|EXIT|FETCH|FILE|FILLFACTOR|FOR|FOREIGN|FREETEXT|FREETEXTTABLE|FROM|FULL|FUNCTION|GOTO|GRANT|GROUP|HAVING|HOLDLOCK|IDENTITY|IDENTITYCOL|IDENTITY_INSERT|IF|IN|INDEX|INNER|INSERT|INTERSECT|INTO|IS|JOIN|KEY|KILL|LEFT|LIKE|LINENO|LOAD|NATIONAL|NOCHECK|NONCLUSTERED|NOT|NULL|NULLIF|OF|OFF|OFFSETS|ON|OPEN|OPENDATASOURCE|OPENQUERY|OPENROWSET|OPENXML|OPTION|OR|ORDER|OUTER|OVER|PERCENT|PLAN|PRECISION|PRIMARY|PRINT|PROC|PROCEDURE|PUBLIC|RAISERROR|READ|READTEXT|RECONFIGURE|REFERENCES|REPLICATION|RESTORE|RESTRICT|RETURN|REVOKE|RIGHT|ROLLBACK|ROWCOUNT|ROWGUIDCOL|RULE|SAVE|SCHEMA|SELECT|SESSION_USER|SET|SETUSER|SHUTDOWN|SOME|STATISTICS|SYSTEM_USER|TABLE|TEXTSIZE|THEN|TO|TOP|TRAN|TRANSACTION|TRIGGER|TRUNCATE|TSEQUAL|UNION|UNIQUE|UPDATE|UPDATETEXT|USE|USER|VALUES|VARYING|VIEW|WAITFOR|WHEN|WHERE|WHILE|WITH|WRITETEXT)(?=[^\w-]|$)/i, +null],["lit",/^[+-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:e[+\-]?\d+)?))/i],["pln",/^[a-z_][\w-]*/i],["pun",/^[^\w\t\n\r \xA0\"\'][^\w\t\n\r \xA0+\-\"\']*/]]),["sql"]) \ No newline at end of file diff --git a/resources/prettify/lang-vb.js b/resources/prettify/lang-vb.js new file mode 100644 index 00000000..c479c11e --- /dev/null +++ b/resources/prettify/lang-vb.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0\u2028\u2029]+/,null,"\t\n\r \u00a0\u2028\u2029"],["str",/^(?:[\"\u201C\u201D](?:[^\"\u201C\u201D]|[\"\u201C\u201D]{2})(?:[\"\u201C\u201D]c|$)|[\"\u201C\u201D](?:[^\"\u201C\u201D]|[\"\u201C\u201D]{2})*(?:[\"\u201C\u201D]|$))/i,null,'"\u201c\u201d'],["com",/^[\'\u2018\u2019][^\r\n\u2028\u2029]*/,null,"'\u2018\u2019"]],[["kwd",/^(?:AddHandler|AddressOf|Alias|And|AndAlso|Ansi|As|Assembly|Auto|Boolean|ByRef|Byte|ByVal|Call|Case|Catch|CBool|CByte|CChar|CDate|CDbl|CDec|Char|CInt|Class|CLng|CObj|Const|CShort|CSng|CStr|CType|Date|Decimal|Declare|Default|Delegate|Dim|DirectCast|Do|Double|Each|Else|ElseIf|End|EndIf|Enum|Erase|Error|Event|Exit|Finally|For|Friend|Function|Get|GetType|GoSub|GoTo|Handles|If|Implements|Imports|In|Inherits|Integer|Interface|Is|Let|Lib|Like|Long|Loop|Me|Mod|Module|MustInherit|MustOverride|MyBase|MyClass|Namespace|New|Next|Not|NotInheritable|NotOverridable|Object|On|Option|Optional|Or|OrElse|Overloads|Overridable|Overrides|ParamArray|Preserve|Private|Property|Protected|Public|RaiseEvent|ReadOnly|ReDim|RemoveHandler|Resume|Return|Select|Set|Shadows|Shared|Short|Single|Static|Step|Stop|String|Structure|Sub|SyncLock|Then|Throw|To|Try|TypeOf|Unicode|Until|Variant|Wend|When|While|With|WithEvents|WriteOnly|Xor|EndIf|GoSub|Let|Variant|Wend)\b/i, +null],["com",/^REM[^\r\n\u2028\u2029]*/i],["lit",/^(?:True\b|False\b|Nothing\b|\d+(?:E[+\-]?\d+[FRD]?|[FRDSIL])?|(?:&H[0-9A-F]+|&O[0-7]+)[SIL]?|\d*\.\d+(?:E[+\-]?\d+)?[FRD]?|#\s+(?:\d+[\-\/]\d+[\-\/]\d+(?:\s+\d+:\d+(?::\d+)?(\s*(?:AM|PM))?)?|\d+:\d+(?::\d+)?(\s*(?:AM|PM))?)\s+#)/i],["pln",/^(?:(?:[a-z]|_\w)\w*|\[(?:[a-z]|_\w)\w*\])/i],["pun",/^[^\w\t\n\r \"\'\[\]\xA0\u2018\u2019\u201C\u201D\u2028\u2029]+/],["pun",/^(?:\[|\])/]]),["vb","vbs"]) \ No newline at end of file diff --git a/resources/prettify/lang-vhdl.js b/resources/prettify/lang-vhdl.js new file mode 100644 index 00000000..dc81a3fe --- /dev/null +++ b/resources/prettify/lang-vhdl.js @@ -0,0 +1,3 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"]],[["str",/^(?:[BOX]?"(?:[^\"]|"")*"|'.')/i],["com",/^--[^\r\n]*/],["kwd",/^(?:abs|access|after|alias|all|and|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|mod|nand|new|next|nor|not|null|of|on|open|or|others|out|package|port|postponed|procedure|process|pure|range|record|register|reject|rem|report|return|rol|ror|select|severity|shared|signal|sla|sll|sra|srl|subtype|then|to|transport|type|unaffected|units|until|use|variable|wait|when|while|with|xnor|xor)(?=[^\w-]|$)/i, +null],["typ",/^(?:bit|bit_vector|character|boolean|integer|real|time|string|severity_level|positive|natural|signed|unsigned|line|text|std_u?logic(?:_vector)?)(?=[^\w-]|$)/i,null],["typ",/^\'(?:ACTIVE|ASCENDING|BASE|DELAYED|DRIVING|DRIVING_VALUE|EVENT|HIGH|IMAGE|INSTANCE_NAME|LAST_ACTIVE|LAST_EVENT|LAST_VALUE|LEFT|LEFTOF|LENGTH|LOW|PATH_NAME|POS|PRED|QUIET|RANGE|REVERSE_RANGE|RIGHT|RIGHTOF|SIMPLE_NAME|STABLE|SUCC|TRANSACTION|VAL|VALUE)(?=[^\w-]|$)/i,null],["lit",/^\d+(?:_\d+)*(?:#[\w\\.]+#(?:[+\-]?\d+(?:_\d+)*)?|(?:\.\d+(?:_\d+)*)?(?:E[+\-]?\d+(?:_\d+)*)?)/i], +["pln",/^(?:[a-z]\w*|\\[^\\]*\\)/i],["pun",/^[^\w\t\n\r \xA0\"\'][^\w\t\n\r \xA0\-\"\']*/]]),["vhdl","vhd"]) \ No newline at end of file diff --git a/resources/prettify/lang-wiki.js b/resources/prettify/lang-wiki.js new file mode 100644 index 00000000..3b8fb500 --- /dev/null +++ b/resources/prettify/lang-wiki.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t \xA0a-gi-z0-9]+/,null,"\t \u00a0abcdefgijklmnopqrstuvwxyz0123456789"],["pun",/^[=*~\^\[\]]+/,null,"=*~^[]"]],[["lang-wiki.meta",/(?:^^|\r\n?|\n)(#[a-z]+)\b/],["lit",/^(?:[A-Z][a-z][a-z0-9]+[A-Z][a-z][a-zA-Z0-9]+)\b/],["lang-",/^\{\{\{([\s\S]+?)\}\}\}/],["lang-",/^`([^\r\n`]+)`/],["str",/^https?:\/\/[^\/?#\s]*(?:\/[^?#\s]*)?(?:\?[^#\s]*)?(?:#\S*)?/i],["pln",/^(?:\r\n|[\s\S])[^#=*~^A-Zh\{`\[\r\n]*/]]),["wiki"]); +PR.registerLangHandler(PR.createSimpleLexer([["kwd",/^#[a-z]+/i,null,"#"]],[]),["wiki.meta"]) \ No newline at end of file diff --git a/resources/prettify/lang-yaml.js b/resources/prettify/lang-yaml.js new file mode 100644 index 00000000..f2f36070 --- /dev/null +++ b/resources/prettify/lang-yaml.js @@ -0,0 +1,2 @@ +PR.registerLangHandler(PR.createSimpleLexer([["pun",/^[:|>?]+/,null,":|>?"],["dec",/^%(?:YAML|TAG)[^#\r\n]+/,null,"%"],["typ",/^[&]\S+/,null,"&"],["typ",/^!\S*/,null,"!"],["str",/^"(?:[^\\"]|\\.)*(?:"|$)/,null,'"'],["str",/^'(?:[^']|'')*(?:'|$)/,null,"'"],["com",/^#[^\r\n]*/,null,"#"],["pln",/^\s+/,null," \t\r\n"]],[["dec",/^(?:---|\.\.\.)(?:[\r\n]|$)/],["pun",/^-/],["kwd",/^\w+:[ \r\n]/],["pln",/^\w+/]]), +["yaml","yml"]) \ No newline at end of file diff --git a/resources/prettify/prettify.css b/resources/prettify/prettify.css new file mode 100644 index 00000000..2925d13a --- /dev/null +++ b/resources/prettify/prettify.css @@ -0,0 +1 @@ +.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun{color:#660}.pln{color:#000}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec{color:#606}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}@media print{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun{color:#440}.pln{color:#000}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}} \ No newline at end of file diff --git a/resources/prettify/prettify.js b/resources/prettify/prettify.js new file mode 100644 index 00000000..c9161da9 --- /dev/null +++ b/resources/prettify/prettify.js @@ -0,0 +1,33 @@ +window.PR_SHOULD_USE_CONTINUATION=true;window.PR_TAB_WIDTH=8;window.PR_normalizedHtml=window.PR=window.prettyPrintOne=window.prettyPrint=void 0;window._pr_isIE6=function(){var y=navigator&&navigator.userAgent&&navigator.userAgent.match(/\bMSIE ([678])\./);y=y?+y[1]:false;window._pr_isIE6=function(){return y};return y}; +(function(){function y(b){return b.replace(L,"&").replace(M,"<").replace(N,">")}function H(b,f,i){switch(b.nodeType){case 1:var o=b.tagName.toLowerCase();f.push("<",o);var l=b.attributes,n=l.length;if(n){if(i){for(var r=[],j=n;--j>=0;)r[j]=l[j];r.sort(function(q,m){return q.name"); +for(l=b.firstChild;l;l=l.nextSibling)H(l,f,i);if(b.firstChild||!/^(?:br|link|img)$/.test(o))f.push("");break;case 3:case 4:f.push(y(b.nodeValue));break}}function O(b){function f(c){if(c.charAt(0)!=="\\")return c.charCodeAt(0);switch(c.charAt(1)){case "b":return 8;case "t":return 9;case "n":return 10;case "v":return 11;case "f":return 12;case "r":return 13;case "u":case "x":return parseInt(c.substring(2),16)||c.charCodeAt(1);case "0":case "1":case "2":case "3":case "4":case "5":case "6":case "7":return parseInt(c.substring(1), +8);default:return c.charCodeAt(1)}}function i(c){if(c<32)return(c<16?"\\x0":"\\x")+c.toString(16);c=String.fromCharCode(c);if(c==="\\"||c==="-"||c==="["||c==="]")c="\\"+c;return c}function o(c){var d=c.substring(1,c.length-1).match(RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));c=[];for(var a=[],k=d[0]==="^",e=k?1:0,h=d.length;e122)){s<65||g>90||a.push([Math.max(65,g)|32,Math.min(s,90)|32]);s<97||g>122||a.push([Math.max(97,g)&-33,Math.min(s,122)&-33])}}a.sort(function(v,w){return v[0]-w[0]||w[1]-v[1]});d=[];g=[NaN,NaN];for(e=0;eh[0]){h[1]+1>h[0]&&a.push("-"); +a.push(i(h[1]))}}a.push("]");return a.join("")}function l(c){for(var d=c.source.match(RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g")),a=d.length,k=[],e=0,h=0;e=2&&c==="[")d[e]=o(g);else if(c!=="\\")d[e]=g.replace(/[a-zA-Z]/g,function(s){s=s.charCodeAt(0);return"["+String.fromCharCode(s&-33,s|32)+"]"})}return d.join("")}for(var n=0,r=false,j=false,q=0,m=b.length;q=0;l-=16)o.push(" ".substring(0,l));l=n+1;break;case "\n":f=0;break;default:++f}if(!o)return i;o.push(i.substring(l));return o.join("")}}function I(b, +f,i,o){if(f){b={source:f,c:b};i(b);o.push.apply(o,b.d)}}function B(b,f){var i={},o;(function(){for(var r=b.concat(f),j=[],q={},m=0,t=r.length;m=0;)i[c.charAt(d)]=p;p=p[1];c=""+p;if(!q.hasOwnProperty(c)){j.push(p);q[c]=null}}j.push(/[\0-\uffff]/);o=O(j)})();var l=f.length;function n(r){for(var j=r.c,q=[j,z],m=0,t=r.source.match(o)||[],p={},c=0,d=t.length;c=5&&"lang-"===k.substring(0,5))&&!(e&&typeof e[1]==="string")){h=false;k=P}h||(p[a]=k)}g=m;m+=a.length;if(h){h=e[1];var s=a.indexOf(h),v=s+h.length;if(e[2]){v=a.length-e[2].length;s=v-h.length}k=k.substring(5);I(j+g,a.substring(0,s),n,q);I(j+g+s,h,Q(k,h),q);I(j+g+v,a.substring(v),n,q)}else q.push(j+g,k)}r.d=q}return n}function x(b){var f=[],i=[];if(b.tripleQuotedStrings)f.push([A,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/, +null,"'\""]);else b.multiLineStrings?f.push([A,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"]):f.push([A,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"]);b.verbatimStrings&&i.push([A,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null]);if(b.hashComments)if(b.cStyleComments){f.push([C,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"]);i.push([A,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/, +null])}else f.push([C,/^#[^\r\n]*/,null,"#"]);if(b.cStyleComments){i.push([C,/^\/\/[^\r\n]*/,null]);i.push([C,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}b.regexLiterals&&i.push(["lang-regex",RegExp("^"+Z+"(/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/)")]);b=b.keywords.replace(/^\s+|\s+$/g,"");b.length&&i.push([R,RegExp("^(?:"+b.replace(/\s+/g,"|")+")\\b"),null]);f.push([z,/^\s+/,null," \r\n\t\u00a0"]);i.push([J,/^@[a-z_$][a-z_$@0-9]*/i,null],[S,/^@?[A-Z]+[a-z][A-Za-z_$@0-9]*/, +null],[z,/^[a-z_$][a-z_$@0-9]*/i,null],[J,/^(?:0x[a-f0-9]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+\-]?\d+)?)[a-z]*/i,null,"0123456789"],[E,/^.[^\s\w\.$@\'\"\`\/\#]*/,null]);return B(f,i)}function $(b){function f(D){if(D>r){if(j&&j!==q){n.push("");j=null}if(!j&&q){j=q;n.push('')}var T=y(p(i.substring(r,D))).replace(e?d:c,"$1 ");e=k.test(T);n.push(T.replace(a,s));r=D}}var i=b.source,o=b.g,l=b.d,n=[],r=0,j=null,q=null,m=0,t=0,p=Y(window.PR_TAB_WIDTH),c=/([\r\n ]) /g, +d=/(^| ) /gm,a=/\r\n?|\n/g,k=/[ \r\n]$/,e=true,h=window._pr_isIE6();h=h?b.b.tagName==="PRE"?h===6?" \r\n":h===7?" 
\r":" \r":" 
":"
";var g=b.b.className.match(/\blinenums\b(?::(\d+))?/),s;if(g){for(var v=[],w=0;w<10;++w)v[w]=h+'
  • ';var F=g[1]&&g[1].length?g[1]-1:0;n.push('
    1. ");s=function(){var D=v[++F%10];return j?""+D+'':D}}else s=h; +for(;;)if(m");j=null}n.push(o[m+1]);m+=2}else if(t");g&&n.push("
    ");b.a=n.join("")}function u(b,f){for(var i=f.length;--i>=0;){var o=f[i];if(G.hasOwnProperty(o))"console"in window&&console.warn("cannot override language handler %s",o);else G[o]=b}}function Q(b,f){b&&G.hasOwnProperty(b)||(b=/^\s*1&&m.charAt(0)==="<"){if(!ba.test(m))if(ca.test(m)){f.push(m.substring(9,m.length-3));n+=m.length-12}else if(da.test(m)){f.push("\n");++n}else if(m.indexOf(V)>=0&&m.replace(/\s(\w+)\s*=\s*(?:\"([^\"]*)\"|'([^\']*)'|(\S+))/g,' $1="$2$3$4"').match(/[cC][lL][aA][sS][sS]=\"[^\"]*\bnocode\b/)){var t=m.match(W)[2],p=1,c;c=j+1;a:for(;c=0;){var e=p.indexOf(";",k);if(e>=0){var h=p.substring(k+3,e),g=10;if(h&&h.charAt(0)==="x"){h=h.substring(1);g=16}var s=parseInt(h,g);isNaN(s)||(p=p.substring(0,k)+String.fromCharCode(s)+p.substring(e+1))}}a=p.replace(ea,"<").replace(fa,">").replace(ga,"'").replace(ha,'"').replace(ia," ").replace(ja, +"&")}f.push(a);n+=a.length}}o={source:f.join(""),h:r};var v=o.source;b.source=v;b.c=0;b.g=o.h;Q(i,v)(b);$(b)}catch(w){if("console"in window)console.log(w&&w.stack?w.stack:w)}}var A="str",R="kwd",C="com",S="typ",J="lit",E="pun",z="pln",P="src",V="nocode",Z=function(){for(var b=["!","!=","!==","#","%","%=","&","&&","&&=","&=","(","*","*=","+=",",","-=","->","/","/=",":","::",";","<","<<","<<=","<=","=","==","===",">",">=",">>",">>=",">>>",">>>=","?","@","[","^","^=","^^","^^=","{","|","|=","||","||=", +"~","break","case","continue","delete","do","else","finally","instanceof","return","throw","try","typeof"],f="(?:^^|[+-]",i=0;i:&a-z])/g,"\\$1");f+=")\\s*";return f}(),L=/&/g,M=//g,X=/\"/g,ea=/</g,fa=/>/g,ga=/'/g,ha=/"/g,ja=/&/g,ia=/ /g,ka=/[\r\n]/g,K=null,aa=RegExp("[^<]+| +
    + + +
    + + + + + +
    + + +
    + + +
    
    +	
    +	
    +	
    + + \ No newline at end of file diff --git a/src/com/gitblit/wicket/pages/BlobPage.java b/src/com/gitblit/wicket/pages/BlobPage.java new file mode 100644 index 00000000..979bb261 --- /dev/null +++ b/src/com/gitblit/wicket/pages/BlobPage.java @@ -0,0 +1,94 @@ +package com.gitblit.wicket.pages; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.wicket.Component; +import org.apache.wicket.PageParameters; +import org.apache.wicket.markup.html.basic.Label; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; + +import com.gitblit.StoredSettings; +import com.gitblit.utils.JGitUtils; +import com.gitblit.wicket.LinkPanel; +import com.gitblit.wicket.RepositoryPage; +import com.gitblit.wicket.WicketUtils; +import com.gitblit.wicket.panels.PathBreadcrumbsPanel; + + +public class BlobPage extends RepositoryPage { + + public BlobPage(PageParameters params) { + super(params, "blob"); + + final String blobPath = params.getString("f", null); + + Repository r = getRepository(); + RevCommit commit = JGitUtils.getCommit(r, commitId); + + // blob page links + add(new Label("historyLink", "history")); + add(new Label("rawLink", "raw")); + add(new Label("headLink", "HEAD")); + + add(new LinkPanel("shortlog", "title", commit.getShortMessage(), CommitPage.class, newCommitParameter())); + + add(new PathBreadcrumbsPanel("breadcrumbs", repositoryName, blobPath, commitId)); + String extension = null; + if (blobPath.lastIndexOf('.') > -1) { + extension = blobPath.substring(blobPath.lastIndexOf('.') + 1); + } + + // Map the extensions to types + Map map = new HashMap(); + for (String ext : StoredSettings.getStrings("prettyPrintExtensions")) { + map.put(ext.toLowerCase(), 1); + } + for (String ext : StoredSettings.getStrings("imageExtensions")) { + map.put(ext.toLowerCase(), 2); + } + for (String ext : StoredSettings.getStrings("binaryExtensions")) { + map.put(ext.toLowerCase(), 3); + } + + if (extension != null) { + int type = 0; + if (map.containsKey(extension)) { + type = map.get(extension); + } + Component c = null; + switch (type) { + case 1: + // PrettyPrint blob text + c = new Label("blobText", JGitUtils.getRawContentAsString(r, commit, blobPath)); + WicketUtils.setCssClass(c, "prettyprint"); + break; + case 2: + // TODO image blobs + c = new Label("blobText", "Image File"); + break; + case 3: + // TODO binary blobs + c = new Label("blobText", "Binary File"); + break; + default: + // plain text + c = new Label("blobText", JGitUtils.getRawContentAsString(r, commit, blobPath)); + WicketUtils.setCssClass(c, "plainprint"); + } + add(c); + } else { + // plain text + Label blobLabel = new Label("blobText", JGitUtils.getRawContentAsString(r, commit, blobPath)); + WicketUtils.setCssClass(blobLabel, "plainprint"); + add(blobLabel); + } + + // close repository + r.close(); + + // footer + addFooter(); + } +} diff --git a/src/com/gitblit/wicket/pages/CommitPage.html b/src/com/gitblit/wicket/pages/CommitPage.html new file mode 100644 index 00000000..a493e047 --- /dev/null +++ b/src/com/gitblit/wicket/pages/CommitPage.html @@ -0,0 +1,51 @@ + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + + + +
    authorMessage goes here
    Message goes here
    committerMessage goes here
    Message goes here
    commitMessage goes here
    treeMessage goes here
    parent +
    Message goes here
    +
    + + +
    + + +
    + + + + + + +
    + + +
    + + \ No newline at end of file diff --git a/src/com/gitblit/wicket/pages/CommitPage.java b/src/com/gitblit/wicket/pages/CommitPage.java new file mode 100644 index 00000000..ad1fce06 --- /dev/null +++ b/src/com/gitblit/wicket/pages/CommitPage.java @@ -0,0 +1,106 @@ +package com.gitblit.wicket.pages; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.wicket.PageParameters; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.markup.repeater.data.DataView; +import org.apache.wicket.markup.repeater.data.ListDataProvider; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; + +import com.gitblit.utils.JGitUtils; +import com.gitblit.wicket.GitBlitWebSession; +import com.gitblit.wicket.LinkPanel; +import com.gitblit.wicket.RepositoryPage; +import com.gitblit.wicket.WicketUtils; +import com.gitblit.wicket.models.PathModel; +import com.gitblit.wicket.panels.PathLinksPanel; + + +public class CommitPage extends RepositoryPage { + + public CommitPage(PageParameters params) { + super(params, "commit"); + + final String commitId = params.getString("h", ""); + + Repository r = getRepository(); + RevCommit c = JGitUtils.getCommit(r, commitId); + + List parents = new ArrayList(); + if (c.getParentCount() > 0) { + for (RevCommit parent : c.getParents()) { + parents.add(parent.name()); + } + } + + // commit page links + if (parents.size() == 0) { + add(new Label("parentLink", "none")); + } else { + add(new LinkPanel("parentLink", null, parents.get(0).substring(0, 8), CommitPage.class, newCommitParameter(parents.get(0)))); + } + add(new Label("patchLink", "patch")); + + add(new LinkPanel("shortlog", "title", c.getShortMessage(), ShortLogPage.class, newRepositoryParameter())); + + addRefs(r, c); + + add(new Label("commitAuthor", JGitUtils.getDisplayName(c.getAuthorIdent()))); + String authorDate = GitBlitWebSession.get().formatDateTimeLong(c.getAuthorIdent().getWhen()); + add(new Label("commitAuthorDate", authorDate)); + + add(new Label("commitCommitter", JGitUtils.getDisplayName(c.getCommitterIdent()))); + String comitterDate = GitBlitWebSession.get().formatDateTimeLong(c.getCommitterIdent().getWhen()); + add(new Label("commitCommitterDate", comitterDate)); + + add(new Label("commitId", c.getName())); + + add(new LinkPanel("commitTree", "list", c.getTree().getName(), TreePage.class, newCommitParameter())); + + // Parent Commits + ListDataProvider parentsDp = new ListDataProvider(parents); + DataView parentsView = new DataView("commitParents", parentsDp) { + private static final long serialVersionUID = 1L; + + public void populateItem(final Item item) { + String entry = item.getModelObject(); + item.add(new LinkPanel("commitParent", "list", entry, CommitPage.class, newCommitParameter(entry))); + } + }; + add(parentsView); + + addFullText("fullMessage", c.getFullMessage(), true); + + // changed paths list + List paths = JGitUtils.getCommitChangedPaths(r, c); + ListDataProvider pathsDp = new ListDataProvider(paths); + DataView pathsView = new DataView("changedPath", pathsDp) { + private static final long serialVersionUID = 1L; + int counter = 0; + + public void populateItem(final Item item) { + final PathModel entry = item.getModelObject(); + if (entry.isTree()) { + 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 PathLinksPanel("pathLinks", repositoryName, entry)); + String clazz = counter % 2 == 0 ? "dark" : "light"; + WicketUtils.setCssClass(item, clazz); + counter++; + } + }; + add(pathsView); + + // close repository + r.close(); + + // footer + addFooter(); + } +} diff --git a/src/com/gitblit/wicket/pages/HeadsPage.html b/src/com/gitblit/wicket/pages/HeadsPage.html new file mode 100644 index 00000000..cd914363 --- /dev/null +++ b/src/com/gitblit/wicket/pages/HeadsPage.html @@ -0,0 +1,26 @@ + + + + +
    + + +
    + + +
    + + + + + + + + + +
    + + +
    + + \ No newline at end of file diff --git a/src/com/gitblit/wicket/pages/HeadsPage.java b/src/com/gitblit/wicket/pages/HeadsPage.java new file mode 100644 index 00000000..df5e00f0 --- /dev/null +++ b/src/com/gitblit/wicket/pages/HeadsPage.java @@ -0,0 +1,63 @@ +package com.gitblit.wicket.pages; + +import java.util.List; + +import org.apache.wicket.PageParameters; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.markup.repeater.data.DataView; +import org.apache.wicket.markup.repeater.data.ListDataProvider; +import org.eclipse.jgit.lib.Repository; + +import com.gitblit.utils.JGitUtils; +import com.gitblit.utils.Utils; +import com.gitblit.wicket.GitBlitWebApp; +import com.gitblit.wicket.LinkPanel; +import com.gitblit.wicket.RepositoryPage; +import com.gitblit.wicket.WicketUtils; +import com.gitblit.wicket.models.RefModel; + + +public class HeadsPage extends RepositoryPage { + + public HeadsPage(PageParameters params) { + super(params, "heads"); + + Repository r = getRepository(); + List tags = JGitUtils.getHeads(r, -1); + r.close(); + + // shortlog + add(new LinkPanel("summary", "title", repositoryName, SummaryPage.class, newRepositoryParameter())); + + ListDataProvider tagsDp = new ListDataProvider(tags); + DataView tagView = new DataView("head", tagsDp) { + private static final long serialVersionUID = 1L; + int counter = 0; + + public void populateItem(final Item item) { + final RefModel entry = item.getModelObject(); + String date; + if (entry.getDate() != null) { + date = Utils.timeAgo(entry.getDate()); + } else { + date = ""; + } + Label headDateLabel = new Label("headDate", date); + item.add(headDateLabel); + WicketUtils.setCssClass(headDateLabel, Utils.timeAgoCss(entry.getDate())); + + item.add(new LinkPanel("headName", "list name", entry.getDisplayName(), ShortLogPage.class, newCommitParameter(entry.getName()))); + + String clazz = counter % 2 == 0 ? "dark" : "light"; + WicketUtils.setCssClass(item, clazz); + counter++; + } + }; + tagView.setItemsPerPage(GitBlitWebApp.PAGING_ITEM_COUNT); + add(tagView); + + // footer + addFooter(); + } +} diff --git a/src/com/gitblit/wicket/pages/LogPage.html b/src/com/gitblit/wicket/pages/LogPage.html new file mode 100644 index 00000000..3c1b54b9 --- /dev/null +++ b/src/com/gitblit/wicket/pages/LogPage.html @@ -0,0 +1,33 @@ + + + + +
    + + +
    + + +
    + + +
    +
    + + +
    +
    +
    + + + +
    +
    +
    + +
    + + +
    + + \ No newline at end of file diff --git a/src/com/gitblit/wicket/pages/LogPage.java b/src/com/gitblit/wicket/pages/LogPage.java new file mode 100644 index 00000000..325596ab --- /dev/null +++ b/src/com/gitblit/wicket/pages/LogPage.java @@ -0,0 +1,69 @@ +package com.gitblit.wicket.pages; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.apache.wicket.PageParameters; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.navigation.paging.PagingNavigator; +import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.markup.repeater.data.DataView; +import org.apache.wicket.markup.repeater.data.ListDataProvider; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; + +import com.gitblit.utils.JGitUtils; +import com.gitblit.utils.Utils; +import com.gitblit.wicket.GitBlitWebApp; +import com.gitblit.wicket.GitBlitWebSession; +import com.gitblit.wicket.LinkPanel; +import com.gitblit.wicket.RepositoryPage; +import com.gitblit.wicket.WicketUtils; +import com.gitblit.wicket.panels.RefsPanel; + + +public class LogPage extends RepositoryPage { + + public LogPage(PageParameters params) { + super(params, "log"); + + Repository r = getRepository(); + final Map> allRefs = JGitUtils.getAllRefs(r); + List commits = JGitUtils.getRevLog(r, 100); + r.close(); + + add(new LinkPanel("summary", "title", repositoryName, SummaryPage.class, newRepositoryParameter())); + + // log + ListDataProvider dp = new ListDataProvider(commits); + DataView logView = new DataView("commit", dp) { + private static final long serialVersionUID = 1L; + + public void populateItem(final Item item) { + final RevCommit entry = item.getModelObject(); + final Date date = JGitUtils.getCommitDate(entry); + + item.add(new Label("timeAgo", Utils.timeAgo(date))); + + item.add(new LinkPanel("link", "title", entry.getShortMessage(), CommitPage.class, newCommitParameter(entry.getName()))); + + item.add(new RefsPanel("commitRefs", entry, allRefs)); + + String author = entry.getAuthorIdent().getName(); + item.add(createAuthorLabel("commitAuthor", author)); + + item.add(new Label("commitDate", GitBlitWebSession.get().formatDateTimeLong(date))); + + item.add(new Label("fullMessage", WicketUtils.breakLines(entry.getFullMessage())).setEscapeModelStrings(false)); + } + }; + logView.setItemsPerPage(GitBlitWebApp.PAGING_ITEM_COUNT); + add(logView); + add(new PagingNavigator("navigator", logView)); + + // footer + addFooter(); + } +} diff --git a/src/com/gitblit/wicket/pages/RepositoriesPage.html b/src/com/gitblit/wicket/pages/RepositoriesPage.html new file mode 100644 index 00000000..6a3054f1 --- /dev/null +++ b/src/com/gitblit/wicket/pages/RepositoriesPage.html @@ -0,0 +1,29 @@ + + + +
    +
    + + + + + + + + + + + + + + + + + + +
    RepositoryDescriptionOwnerLast Change
    + + +
    + + \ No newline at end of file diff --git a/src/com/gitblit/wicket/pages/RepositoriesPage.java b/src/com/gitblit/wicket/pages/RepositoriesPage.java new file mode 100644 index 00000000..1c880d9f --- /dev/null +++ b/src/com/gitblit/wicket/pages/RepositoriesPage.java @@ -0,0 +1,151 @@ +package com.gitblit.wicket.pages; + +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; + +import org.apache.wicket.PageParameters; +import org.apache.wicket.extensions.markup.html.repeater.data.sort.OrderByBorder; +import org.apache.wicket.extensions.markup.html.repeater.util.SortParam; +import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.markup.repeater.data.DataView; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; + +import com.gitblit.StoredSettings; +import com.gitblit.utils.Utils; +import com.gitblit.wicket.BasePage; +import com.gitblit.wicket.GitBlitWebApp; +import com.gitblit.wicket.LinkPanel; +import com.gitblit.wicket.WicketUtils; +import com.gitblit.wicket.models.RepositoryModel; +import com.gitblit.wicket.panels.PageFooter; +import com.gitblit.wicket.panels.PageHeader; + + +public class RepositoriesPage extends BasePage { + + public RepositoriesPage() { + add(new PageHeader("pageHeader")); + + add(new Label("indexInclude", StoredSettings.getString("indexMessage", "")).setEscapeModelStrings(false)); + + List rows = GitBlitWebApp.get().getRepositories(getRequest()); + DataProvider dp = new DataProvider(rows); + DataView dataView = new DataView("repository", dp) { + private static final long serialVersionUID = 1L; + int counter = 0; + + public void populateItem(final Item item) { + final RepositoryModel entry = item.getModelObject(); + PageParameters pp = new PageParameters("p=" + entry.name); + item.add(new LinkPanel("repositoryName", "list", entry.name, SummaryPage.class, pp)); + item.add(new LinkPanel("repositoryDescription", "list", entry.description, SummaryPage.class, pp)); + item.add(new Label("repositoryOwner", entry.owner)); + + String lastChange = Utils.timeAgo(entry.lastChange); + Label lastChangeLabel = new Label("repositoryLastChange", lastChange); + item.add(lastChangeLabel); + WicketUtils.setCssClass(lastChangeLabel, Utils.timeAgoCss(entry.lastChange)); + + String clazz = counter % 2 == 0 ? "dark" : "light"; + WicketUtils.setCssClass(item, clazz); + counter++; + } + }; + add(dataView); + + add(newSort("orderByRepository", SortBy.repository, dp, dataView)); + add(newSort("orderByDescription", SortBy.description, dp, dataView)); + add(newSort("orderByOwner", SortBy.owner, dp, dataView)); + add(newSort("orderByDate", SortBy.date, dp, dataView)); + + add(new PageFooter("pageFooter")); + } + + protected enum SortBy { + repository, description, owner, date; + } + + 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; + + @Override + protected void onSortChanged() { + dataView.setCurrentPage(0); + } + }; + } + + private class DataProvider extends SortableDataProvider { + private static final long serialVersionUID = 1L; + private List list = null; + + protected DataProvider(List list) { + this.list = list; + setSort(SortBy.date.name(), false); + } + + @Override + public int size() { + if (list == null) + return 0; + return list.size(); + } + + @Override + public IModel model(RepositoryModel header) { + return new Model(header); + } + + @Override + public Iterator iterator(int first, int count) { + SortParam sp = getSort(); + String prop = sp.getProperty(); + final boolean asc = sp.isAscending(); + + if (prop == null || prop.equals(SortBy.date.name())) { + Collections.sort(list, new Comparator() { + @Override + public int compare(RepositoryModel o1, RepositoryModel o2) { + if (asc) + return o1.lastChange.compareTo(o2.lastChange); + return o2.lastChange.compareTo(o1.lastChange); + } + }); + } else if (prop.equals(SortBy.repository.name())) { + Collections.sort(list, new Comparator() { + @Override + public int compare(RepositoryModel o1, RepositoryModel o2) { + if (asc) + return o1.name.compareTo(o2.name); + return o2.name.compareTo(o1.name); + } + }); + } else if (prop.equals(SortBy.owner.name())) { + Collections.sort(list, new Comparator() { + @Override + public int compare(RepositoryModel o1, RepositoryModel o2) { + if (asc) + return o1.owner.compareTo(o2.owner); + return o2.owner.compareTo(o1.owner); + } + }); + } else if (prop.equals(SortBy.description.name())) { + Collections.sort(list, new Comparator() { + @Override + public int compare(RepositoryModel o1, RepositoryModel o2) { + if (asc) + return o1.description.compareTo(o2.description); + return o2.description.compareTo(o1.description); + } + }); + } + return list.subList(first, first + count).iterator(); + } + } +} diff --git a/src/com/gitblit/wicket/pages/ShortLogPage.html b/src/com/gitblit/wicket/pages/ShortLogPage.html new file mode 100644 index 00000000..b10e90d6 --- /dev/null +++ b/src/com/gitblit/wicket/pages/ShortLogPage.html @@ -0,0 +1,31 @@ + + + + +
    + + +
    + + +
    + + + + + + + + + + + + + + +
    + + +
    + + \ No newline at end of file diff --git a/src/com/gitblit/wicket/pages/ShortLogPage.java b/src/com/gitblit/wicket/pages/ShortLogPage.java new file mode 100644 index 00000000..220874e8 --- /dev/null +++ b/src/com/gitblit/wicket/pages/ShortLogPage.java @@ -0,0 +1,76 @@ +package com.gitblit.wicket.pages; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.apache.wicket.PageParameters; +import org.apache.wicket.markup.html.navigation.paging.PagingNavigator; +import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.markup.repeater.data.DataView; +import org.apache.wicket.markup.repeater.data.ListDataProvider; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; + +import com.gitblit.utils.JGitUtils; +import com.gitblit.wicket.GitBlitWebApp; +import com.gitblit.wicket.LinkPanel; +import com.gitblit.wicket.RepositoryPage; +import com.gitblit.wicket.WicketUtils; +import com.gitblit.wicket.panels.RefsPanel; +import com.gitblit.wicket.panels.ShortLogLinksPanel; + + +public class ShortLogPage extends RepositoryPage { + + public ShortLogPage(PageParameters params) { + super(params, "shortlog"); + + Repository r = getRepository(); + final Map> allRefs = JGitUtils.getAllRefs(r); + List commits = JGitUtils.getRevLog(r, 100); + r.close(); + + // shortlog + add(new LinkPanel("summary", "title", repositoryName, SummaryPage.class, newRepositoryParameter())); + + ListDataProvider dp = new ListDataProvider(commits); + DataView shortlogView = new DataView("commit", dp) { + private static final long serialVersionUID = 1L; + int counter = 0; + + public void populateItem(final Item item) { + final RevCommit entry = item.getModelObject(); + final Date date = JGitUtils.getCommitDate(entry); + + item.add(createShortlogDateLabel("commitDate", date)); + + String author = entry.getAuthorIdent().getName(); + item.add(createAuthorLabel("commitAuthor", author)); + + String shortMessage = entry.getShortMessage(); + String trimmedMessage = trimShortLog(shortMessage); + LinkPanel shortlog = new LinkPanel("commitShortMessage", "list subject", trimmedMessage, CommitPage.class, newCommitParameter(entry.getName())); + if (!shortMessage.equals(trimmedMessage)) { + WicketUtils.setHtmlTitle(shortlog, shortMessage); + } + item.add(shortlog); + + item.add(new RefsPanel("commitRefs", entry, allRefs)); + + item.add(new ShortLogLinksPanel("commitLinks", repositoryName, entry.getName())); + + String clazz = counter % 2 == 0 ? "dark" : "light"; + WicketUtils.setCssClass(item, clazz); + counter++; + } + }; + shortlogView.setItemsPerPage(GitBlitWebApp.PAGING_ITEM_COUNT); + add(shortlogView); + add(new PagingNavigator("navigator", shortlogView)); + + // footer + addFooter(); + } +} diff --git a/src/com/gitblit/wicket/pages/SummaryPage.html b/src/com/gitblit/wicket/pages/SummaryPage.html new file mode 100644 index 00000000..3eab0a1e --- /dev/null +++ b/src/com/gitblit/wicket/pages/SummaryPage.html @@ -0,0 +1,76 @@ + + + + +
    + + +
    + + +
     
    + + + + + +
    descriptionMessage goes here
    ownerMessage goes here
    last changeMessage goes here
    + + + +
    + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + + + + + + + + + +
    + + + +
    + + + + + + + + + +
    + + + +
    + + \ No newline at end of file diff --git a/src/com/gitblit/wicket/pages/SummaryPage.java b/src/com/gitblit/wicket/pages/SummaryPage.java new file mode 100644 index 00000000..84e78b4e --- /dev/null +++ b/src/com/gitblit/wicket/pages/SummaryPage.java @@ -0,0 +1,149 @@ +package com.gitblit.wicket.pages; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.apache.wicket.PageParameters; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.markup.repeater.data.DataView; +import org.apache.wicket.markup.repeater.data.ListDataProvider; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; + +import com.gitblit.utils.JGitUtils; +import com.gitblit.wicket.GitBlitWebApp; +import com.gitblit.wicket.GitBlitWebSession; +import com.gitblit.wicket.LinkPanel; +import com.gitblit.wicket.RepositoryPage; +import com.gitblit.wicket.WicketUtils; +import com.gitblit.wicket.models.RefModel; +import com.gitblit.wicket.panels.HeadLinksPanel; +import com.gitblit.wicket.panels.RefsPanel; +import com.gitblit.wicket.panels.ShortLogLinksPanel; +import com.gitblit.wicket.panels.TagLinksPanel; + + +public class SummaryPage extends RepositoryPage { + + public SummaryPage(PageParameters params) { + super(params, "summary"); + + Repository r = getRepository(); + final Map> allRefs = JGitUtils.getAllRefs(r); + + String owner = JGitUtils.getRepositoryOwner(r); + GitBlitWebSession session = GitBlitWebSession.get(); + String lastchange = session.formatDateTimeLong(JGitUtils.getLastChange(r)); + String cloneurl = GitBlitWebApp.get().getCloneUrl(repositoryName); + + // repository description + add(new Label("repositoryDescription", description)); + add(new Label("repositoryOwner", owner)); + add(new Label("repositoryLastChange", lastchange)); + add(new Label("repositoryCloneUrl", cloneurl)); + + int summaryCount = 16; + + // shortlog + add(new LinkPanel("shortlog", "title", "shortlog", ShortLogPage.class, newRepositoryParameter())); + + List commits = JGitUtils.getRevLog(r, summaryCount); + ListDataProvider dp = new ListDataProvider(commits); + DataView shortlogView = new DataView("commit", dp) { + private static final long serialVersionUID = 1L; + int counter = 0; + + public void populateItem(final Item item) { + RevCommit entry = item.getModelObject(); + Date date = JGitUtils.getCommitDate(entry); + + item.add(createShortlogDateLabel("commitDate", date)); + + String author = entry.getAuthorIdent().getName(); + item.add(createAuthorLabel("commitAuthor", author)); + + String shortMessage = entry.getShortMessage(); + String trimmedMessage = trimShortLog(shortMessage); + LinkPanel shortlog = new LinkPanel("commitShortMessage", "list subject", trimmedMessage, CommitPage.class, newCommitParameter(entry.getName())); + if (!shortMessage.equals(trimmedMessage)) { + WicketUtils.setHtmlTitle(shortlog, shortMessage); + } + item.add(shortlog); + + item.add(new RefsPanel("commitRefs", entry, allRefs)); + + item.add(new ShortLogLinksPanel("commitLinks", repositoryName, entry.getName())); + + setAlternatingBackground(item, counter); + counter++; + } + }; + add(shortlogView); + add(new LinkPanel("shortlogMore", "link", "...", ShortLogPage.class, newRepositoryParameter())); + + // tags + List tags = JGitUtils.getTags(r, summaryCount); + add(new LinkPanel("tags", "title", "tags", TagsPage.class, newRepositoryParameter())); + + ListDataProvider tagsDp = new ListDataProvider(tags); + DataView tagView = new DataView("tag", tagsDp) { + private static final long serialVersionUID = 1L; + int counter = 0; + + public void populateItem(final Item item) { + final RefModel entry = item.getModelObject(); + + item.add(createDateLabel("tagDate", entry.getDate())); + + item.add(new LinkPanel("tagName", "list name", entry.getDisplayName(), CommitPage.class, newCommitParameter(entry.getCommitId().getName()))); + + if (entry.getCommitId().equals(entry.getObjectId())) { + // lightweight tag on commit object + item.add(new Label("tagDescription", "")); + } else { + // tag object + item.add(new LinkPanel("tagDescription", "list subject", entry.getShortLog(), TagPage.class, newCommitParameter(entry.getObjectId().getName()))); + } + + item.add(new TagLinksPanel("tagLinks", repositoryName, entry)); + + setAlternatingBackground(item, counter); + counter++; + } + }; + add(tagView); + add(new LinkPanel("tagsMore", "link", "...", TagsPage.class, newRepositoryParameter())); + // heads + List heads = JGitUtils.getHeads(r, summaryCount); + add(new LinkPanel("heads", "title", "heads", HeadsPage.class, newRepositoryParameter())); + + ListDataProvider headsDp = new ListDataProvider(heads); + DataView headsView = new DataView("head", headsDp) { + private static final long serialVersionUID = 1L; + int counter = 0; + + public void populateItem(final Item item) { + final RefModel entry = item.getModelObject(); + + item.add(createDateLabel("headDate", entry.getDate())); + + item.add(new LinkPanel("headName", "list name", entry.getDisplayName(), ShortLogPage.class, newCommitParameter(entry.getName()))); + + item.add(new HeadLinksPanel("headLinks", repositoryName, entry)); + + setAlternatingBackground(item, counter); + counter++; + } + }; + add(headsView); + + // close the repository + r.close(); + + // footer + addFooter(); + } +} diff --git a/src/com/gitblit/wicket/pages/TagPage.html b/src/com/gitblit/wicket/pages/TagPage.html new file mode 100644 index 00000000..ae2c99c2 --- /dev/null +++ b/src/com/gitblit/wicket/pages/TagPage.html @@ -0,0 +1,28 @@ + + + + +
    + + +
    + + +
    + + +
    + + + + +
    objectMessage goes here
    authorMessage goes here
    Message goes here
    +
    + + +
    + + +
    + + \ No newline at end of file diff --git a/src/com/gitblit/wicket/pages/TagPage.java b/src/com/gitblit/wicket/pages/TagPage.java new file mode 100644 index 00000000..f098c1e3 --- /dev/null +++ b/src/com/gitblit/wicket/pages/TagPage.java @@ -0,0 +1,36 @@ +package com.gitblit.wicket.pages; + +import org.apache.wicket.PageParameters; +import org.apache.wicket.markup.html.basic.Label; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; + +import com.gitblit.utils.JGitUtils; +import com.gitblit.wicket.GitBlitWebSession; +import com.gitblit.wicket.LinkPanel; +import com.gitblit.wicket.RepositoryPage; + + +public class TagPage extends RepositoryPage { + + public TagPage(PageParameters params) { + super(params, "tag"); + + Repository r = getRepository(); + RevCommit c = JGitUtils.getCommit(r, commitId); + + add(new LinkPanel("commit", "title", c.getName(), CommitPage.class, newCommitParameter())); + + add(new LinkPanel("tagId", "list", c.getName(), CommitPage.class, newCommitParameter(c.getName()))); + add(new Label("tagAuthor", JGitUtils.getDisplayName(c.getAuthorIdent()))); + String authorDate = GitBlitWebSession.get().formatDateTimeLong(c.getAuthorIdent().getWhen()); + add(new Label("tagDate", authorDate)); + + addFullText("fullMessage", c.getFullMessage(), true); + + r.close(); + + // footer + addFooter(); + } +} diff --git a/src/com/gitblit/wicket/pages/TagsPage.html b/src/com/gitblit/wicket/pages/TagsPage.html new file mode 100644 index 00000000..314eec77 --- /dev/null +++ b/src/com/gitblit/wicket/pages/TagsPage.html @@ -0,0 +1,30 @@ + + + + +
    + + +
    + + +
    + + + + + + + + + + + + + +
    + + +
    + + \ No newline at end of file diff --git a/src/com/gitblit/wicket/pages/TagsPage.java b/src/com/gitblit/wicket/pages/TagsPage.java new file mode 100644 index 00000000..85c0455c --- /dev/null +++ b/src/com/gitblit/wicket/pages/TagsPage.java @@ -0,0 +1,64 @@ +package com.gitblit.wicket.pages; + +import java.util.List; + +import org.apache.wicket.PageParameters; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.navigation.paging.PagingNavigator; +import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.markup.repeater.data.DataView; +import org.apache.wicket.markup.repeater.data.ListDataProvider; +import org.eclipse.jgit.lib.Repository; + +import com.gitblit.utils.JGitUtils; +import com.gitblit.wicket.GitBlitWebApp; +import com.gitblit.wicket.LinkPanel; +import com.gitblit.wicket.RepositoryPage; +import com.gitblit.wicket.models.RefModel; +import com.gitblit.wicket.panels.TagLinksPanel; + + +public class TagsPage extends RepositoryPage { + + public TagsPage(PageParameters params) { + super(params, "tags"); + Repository r = getRepository(); + List tags = JGitUtils.getTags(r, -1); + r.close(); + + // shortlog + add(new LinkPanel("summary", "title", repositoryName, SummaryPage.class, newRepositoryParameter())); + + ListDataProvider tagsDp = new ListDataProvider(tags); + DataView tagView = new DataView("tag", tagsDp) { + private static final long serialVersionUID = 1L; + int counter = 0; + + public void populateItem(final Item item) { + final RefModel entry = item.getModelObject(); + item.add(createDateLabel("tagDate", entry.getDate())); + + item.add(new LinkPanel("tagName", "list name", entry.getDisplayName(), CommitPage.class, newCommitParameter(entry.getObjectId().getName()))); + + if (entry.getCommitId().equals(entry.getObjectId())) { + // lightweight tag on commit object + item.add(new Label("tagDescription", "")); + } else { + // tag object + item.add(new LinkPanel("tagDescription", "list subject", entry.getShortLog(), TagPage.class, newCommitParameter(entry.getObjectId().getName()))); + } + + item.add(new TagLinksPanel("tagLinks", repositoryName, entry)); + + setAlternatingBackground(item, counter); + counter++; + } + }; + tagView.setItemsPerPage(GitBlitWebApp.PAGING_ITEM_COUNT); + add(tagView); + add(new PagingNavigator("navigator", tagView)); + + // footer + addFooter(); + } +} diff --git a/src/com/gitblit/wicket/pages/TreePage.html b/src/com/gitblit/wicket/pages/TreePage.html new file mode 100644 index 00000000..e01049c6 --- /dev/null +++ b/src/com/gitblit/wicket/pages/TreePage.html @@ -0,0 +1,35 @@ + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + + +
    + + +
    + + \ No newline at end of file diff --git a/src/com/gitblit/wicket/pages/TreePage.java b/src/com/gitblit/wicket/pages/TreePage.java new file mode 100644 index 00000000..a608bdda --- /dev/null +++ b/src/com/gitblit/wicket/pages/TreePage.java @@ -0,0 +1,89 @@ +package com.gitblit.wicket.pages; + +import java.util.List; + +import org.apache.wicket.PageParameters; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.markup.repeater.data.DataView; +import org.apache.wicket.markup.repeater.data.ListDataProvider; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; + +import com.gitblit.utils.ByteFormat; +import com.gitblit.utils.JGitUtils; +import com.gitblit.wicket.LinkPanel; +import com.gitblit.wicket.RepositoryPage; +import com.gitblit.wicket.WicketUtils; +import com.gitblit.wicket.models.PathModel; +import com.gitblit.wicket.panels.PathBreadcrumbsPanel; +import com.gitblit.wicket.panels.TreeLinksPanel; + + +public class TreePage extends RepositoryPage { + + public TreePage(PageParameters params) { + super(params, "tree"); + + final String basePath = params.getString("f", null); + + Repository r = getRepository(); + RevCommit commit = JGitUtils.getCommit(r, commitId); + List paths = JGitUtils.getFilesInPath(r, basePath, commit); + + // tree page links + add(new Label("historyLink", "history")); + add(new Label("headLink", "HEAD")); + + add(new LinkPanel("shortlog", "title", commit.getShortMessage(), CommitPage.class, newCommitParameter())); + + // breadcrumbs + if (basePath == null || basePath.trim().length() == 0) { + add(new Label("breadcrumbs", "").setVisible(false)); + } else { + add(new PathBreadcrumbsPanel("breadcrumbs", repositoryName, basePath, commitId)); + paths.add(0, PathModel.getParentPath(basePath, commitId)); + } + + final ByteFormat byteFormat = new ByteFormat(); + + // changed paths list + ListDataProvider pathsDp = new ListDataProvider(paths); + DataView pathsView = new DataView("changedPath", pathsDp) { + private static final long serialVersionUID = 1L; + int counter = 0; + + public void populateItem(final Item item) { + PathModel entry = item.getModelObject(); + item.add(new Label("pathPermissions", JGitUtils.getPermissionsFromMode(entry.mode))); + if (entry.isParentPath) { + // parent .. path + item.add(new Label("pathSize", "").setVisible(false)); + item.add(new LinkPanel("pathName", null, entry.name, TreePage.class, newPathParameter(entry.path))); + item.add(new Label("treeLinks", "").setVisible(false)); + } else { + if (entry.isTree()) { + // folder/tree link + item.add(new Label("pathSize", "-")); + item.add(new LinkPanel("pathName", null, entry.name, TreePage.class, newPathParameter(entry.path))); + } else { + // blob link + 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 TreeLinksPanel("treeLinks", repositoryName, entry)); + } + String clazz = counter % 2 == 0 ? "dark" : "light"; + WicketUtils.setCssClass(item, clazz); + counter++; + } + }; + add(pathsView); + + // close repository + r.close(); + + // footer + addFooter(); + } +} diff --git a/src/com/gitblit/wicket/panels/HeadLinksPanel.html b/src/com/gitblit/wicket/panels/HeadLinksPanel.html new file mode 100644 index 00000000..4849e8e2 --- /dev/null +++ b/src/com/gitblit/wicket/panels/HeadLinksPanel.html @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/src/com/gitblit/wicket/panels/HeadLinksPanel.java b/src/com/gitblit/wicket/panels/HeadLinksPanel.java new file mode 100644 index 00000000..4f4c9d7e --- /dev/null +++ b/src/com/gitblit/wicket/panels/HeadLinksPanel.java @@ -0,0 +1,23 @@ +package com.gitblit.wicket.panels; + +import org.apache.wicket.PageParameters; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.panel.Panel; + +import com.gitblit.wicket.LinkPanel; +import com.gitblit.wicket.models.RefModel; +import com.gitblit.wicket.pages.LogPage; +import com.gitblit.wicket.pages.ShortLogPage; + + +public class HeadLinksPanel extends Panel { + + private static final long serialVersionUID = 1L; + + public HeadLinksPanel(String id, String repositoryName, RefModel tag) { + super(id); + add(new LinkPanel("shortlog", null, "shortlog", ShortLogPage.class, new PageParameters("p=" + repositoryName + ",h=" + tag.getName()))); + add(new LinkPanel("log", null, "log", LogPage.class, new PageParameters("p=" + repositoryName + ",h=" + tag.getName()))); + add(new Label("tree", "tree")); + } +} \ No newline at end of file diff --git a/src/com/gitblit/wicket/panels/PageFooter.html b/src/com/gitblit/wicket/panels/PageFooter.html new file mode 100644 index 00000000..6eed4b3c --- /dev/null +++ b/src/com/gitblit/wicket/panels/PageFooter.html @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/src/com/gitblit/wicket/panels/PageFooter.java b/src/com/gitblit/wicket/panels/PageFooter.java new file mode 100644 index 00000000..91a1f57c --- /dev/null +++ b/src/com/gitblit/wicket/panels/PageFooter.java @@ -0,0 +1,28 @@ +package com.gitblit.wicket.panels; + +import java.util.Date; + +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.panel.Panel; + +import com.gitblit.StoredSettings; +import com.gitblit.wicket.GitBlitWebSession; + + +public class PageFooter extends Panel { + + private static final long serialVersionUID = 1L; + + public PageFooter(String id) { + this(id, ""); + } + + public PageFooter(String id, String description) { + super(id); + add(new Label("cacheTime", "Page Last Updated: " + GitBlitWebSession.get().formatDateTimeLong(new Date()))); + add(new Label("footerText", description)); + if (StoredSettings.getBoolean("aggressiveGC", false)) { + System.gc(); + } + } +} \ No newline at end of file diff --git a/src/com/gitblit/wicket/panels/PageHeader.html b/src/com/gitblit/wicket/panels/PageHeader.html new file mode 100644 index 00000000..83edb994 --- /dev/null +++ b/src/com/gitblit/wicket/panels/PageHeader.html @@ -0,0 +1,15 @@ + + + + + Message goes here + + + + + + + + \ No newline at end of file diff --git a/src/com/gitblit/wicket/panels/PageHeader.java b/src/com/gitblit/wicket/panels/PageHeader.java new file mode 100644 index 00000000..c375758c --- /dev/null +++ b/src/com/gitblit/wicket/panels/PageHeader.java @@ -0,0 +1,41 @@ +package com.gitblit.wicket.panels; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.wicket.PageParameters; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.panel.Panel; +import org.apache.wicket.protocol.http.servlet.ServletWebRequest; + +import com.gitblit.Constants; +import com.gitblit.StoredSettings; +import com.gitblit.wicket.LinkPanel; +import com.gitblit.wicket.pages.SummaryPage; + + +public class PageHeader extends Panel { + + private static final long serialVersionUID = 1L; + + public PageHeader(String id) { + this(id, "", ""); + } + + public PageHeader(String id, String repositoryName, String page) { + super(id); + if (repositoryName != null && repositoryName.trim().length() > 0) { + add(new Label("title", getServerName() + " - " + repositoryName)); + } else { + add(new Label("title", getServerName())); + } + add(new Label("siteName", StoredSettings.getString("siteName", Constants.NAME))); + add(new LinkPanel("repositoryName", null, repositoryName, SummaryPage.class, new PageParameters("p=" + repositoryName))); + add(new Label("pageName", page)); + } + + protected String getServerName() { + ServletWebRequest servletWebRequest = (ServletWebRequest) getRequest(); + HttpServletRequest req = servletWebRequest.getHttpServletRequest(); + return req.getServerName(); + } +} \ No newline at end of file diff --git a/src/com/gitblit/wicket/panels/PageLinksPanel.html b/src/com/gitblit/wicket/panels/PageLinksPanel.html new file mode 100644 index 00000000..66c3ce7a --- /dev/null +++ b/src/com/gitblit/wicket/panels/PageLinksPanel.html @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/src/com/gitblit/wicket/panels/PageLinksPanel.java b/src/com/gitblit/wicket/panels/PageLinksPanel.java new file mode 100644 index 00000000..f72b8800 --- /dev/null +++ b/src/com/gitblit/wicket/panels/PageLinksPanel.java @@ -0,0 +1,61 @@ +package com.gitblit.wicket.panels; + +import org.apache.wicket.PageParameters; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.panel.Panel; + +import com.gitblit.wicket.LinkPanel; +import com.gitblit.wicket.pages.CommitPage; +import com.gitblit.wicket.pages.LogPage; +import com.gitblit.wicket.pages.ShortLogPage; +import com.gitblit.wicket.pages.SummaryPage; +import com.gitblit.wicket.pages.TreePage; + + +public class PageLinksPanel extends Panel { + + private static final long serialVersionUID = 1L; + + public PageLinksPanel(String id, String repositoryName, String pageName) { + super(id); + // summary + if (pageName.equals("summary")) { + add(new Label("summary", pageName)); + } else { + add(new LinkPanel("summary", null, "summary", SummaryPage.class, new PageParameters("p=" + repositoryName))); + } + + // shortlog + if (pageName.equals("shortlog")) { + add(new Label("shortlog", pageName)); + } else { + add(new LinkPanel("shortlog", null, "shortlog", ShortLogPage.class, new PageParameters("p=" + repositoryName))); + } + + // log + if (pageName.equals("log")) { + add(new Label("log", pageName)); + } else { + add(new LinkPanel("log", null, "log", LogPage.class, new PageParameters("p=" + repositoryName))); + } + + // commit + if (pageName.equals("commit")) { + add(new Label("commit", pageName)); + } else { + add(new LinkPanel("commit", null, "commit", CommitPage.class, new PageParameters("p=" + repositoryName + ",h=HEAD"))); + } + // commitdiff + if (pageName.equals("commitdiff")) { + add(new Label("commitdiff", pageName)); + } else { + add(new Label("commitdiff", "commitdiff")); + } + // tree + if (pageName.equals("tree")) { + add(new Label("tree", pageName)); + } else { + add(new LinkPanel("tree", null, "tree", TreePage.class, new PageParameters("p=" + repositoryName + ",h=HEAD"))); + } + } +} \ No newline at end of file diff --git a/src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.html b/src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.html new file mode 100644 index 00000000..ee8bca22 --- /dev/null +++ b/src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.html @@ -0,0 +1,11 @@ + + + + +
    + + + +
    +
    + \ No newline at end of file diff --git a/src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.java b/src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.java new file mode 100644 index 00000000..5ce356a2 --- /dev/null +++ b/src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.java @@ -0,0 +1,79 @@ +package com.gitblit.wicket.panels; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import org.apache.wicket.PageParameters; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.panel.Panel; +import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.markup.repeater.data.DataView; +import org.apache.wicket.markup.repeater.data.ListDataProvider; + +import com.gitblit.wicket.LinkPanel; +import com.gitblit.wicket.pages.TreePage; + + +public class PathBreadcrumbsPanel extends Panel { + + private static final long serialVersionUID = 1L; + + private final String ROOT = "--ROOT--"; + + public PathBreadcrumbsPanel(String id, final String repositoryName, String pathName, final String commitId) { + super(id); + List crumbs = new ArrayList(); + crumbs.add(new BreadCrumb("[" + repositoryName + "]", ROOT, false)); + + String[] paths = pathName.split("/"); + StringBuilder sb = new StringBuilder(); + + 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("/"); + } + + ListDataProvider crumbsDp = new ListDataProvider(crumbs); + DataView pathsView = new DataView("path", crumbsDp) { + private static final long serialVersionUID = 1L; + + public void populateItem(final Item item) { + final BreadCrumb entry = item.getModelObject(); + String path = entry.getPath(); + String parameters = "p=" + repositoryName + ",h=" + commitId; + if (path != null) { + parameters += ",f=" + path; + } + + item.add(new LinkPanel("pathLink", null, entry.name, TreePage.class, new PageParameters(parameters))); + item.add(new Label("pathSeparator", entry.isLeaf ? "":"/")); + } + }; + add(pathsView); + } + + private class BreadCrumb implements Serializable { + + private static final long serialVersionUID = 1L; + + final String name; + final String path; + final boolean isLeaf; + + BreadCrumb(String name, String path, boolean isLeaf) { + this.name = name; + this.path = path; + this.isLeaf = isLeaf; + } + + String getPath() { + if (path.equals(ROOT)) { + return null; + } + return path; + } + } +} \ No newline at end of file diff --git a/src/com/gitblit/wicket/panels/PathLinksPanel.html b/src/com/gitblit/wicket/panels/PathLinksPanel.html new file mode 100644 index 00000000..08327b1b --- /dev/null +++ b/src/com/gitblit/wicket/panels/PathLinksPanel.html @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/src/com/gitblit/wicket/panels/PathLinksPanel.java b/src/com/gitblit/wicket/panels/PathLinksPanel.java new file mode 100644 index 00000000..fa8bdca6 --- /dev/null +++ b/src/com/gitblit/wicket/panels/PathLinksPanel.java @@ -0,0 +1,22 @@ +package com.gitblit.wicket.panels; + +import org.apache.wicket.PageParameters; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.panel.Panel; + +import com.gitblit.wicket.LinkPanel; +import com.gitblit.wicket.models.PathModel; +import com.gitblit.wicket.pages.BlobPage; + + +public class PathLinksPanel extends Panel { + + private static final long serialVersionUID = 1L; + + public PathLinksPanel(String id, String repositoryName, PathModel path) { + super(id); + add(new Label("diff", "diff")); + add(new LinkPanel("blob", null, "blob", BlobPage.class, new PageParameters("p=" + repositoryName + ",h=" + path.commitId + ",f=" + path.path))); + add(new Label("history", "history")); + } +} \ No newline at end of file diff --git a/src/com/gitblit/wicket/panels/RefsPanel.html b/src/com/gitblit/wicket/panels/RefsPanel.html new file mode 100644 index 00000000..e7be7c54 --- /dev/null +++ b/src/com/gitblit/wicket/panels/RefsPanel.html @@ -0,0 +1,8 @@ + + + + + ref + + + \ No newline at end of file diff --git a/src/com/gitblit/wicket/panels/RefsPanel.java b/src/com/gitblit/wicket/panels/RefsPanel.java new file mode 100644 index 00000000..5dec57fe --- /dev/null +++ b/src/com/gitblit/wicket/panels/RefsPanel.java @@ -0,0 +1,66 @@ +package com.gitblit.wicket.panels; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import org.apache.wicket.Component; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.panel.Panel; +import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.markup.repeater.data.DataView; +import org.apache.wicket.markup.repeater.data.ListDataProvider; +import org.eclipse.jgit.lib.Constants; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; + +import com.gitblit.utils.JGitUtils; +import com.gitblit.wicket.WicketUtils; + + +public class RefsPanel extends Panel { + + private static final long serialVersionUID = 1L; + + public RefsPanel(String id, Repository r, RevCommit c) { + this(id, c, JGitUtils.getAllRefs(r)); + } + + public RefsPanel(String id, RevCommit c, Map> refs) { + super(id); + List refNames = refs.get(c.getId()); + if (refNames == null) { + refNames = new ArrayList(); + } + Collections.sort(refNames); + ListDataProvider refsDp = new ListDataProvider(refNames); + DataView refsView = new DataView("ref", refsDp) { + private static final long serialVersionUID = 1L; + public void populateItem(final Item item) { + String entry = item.getModelObject(); + Component c = null; + if (entry.startsWith(Constants.R_HEADS)) { + // local head + c = new Label("refName", entry.substring(Constants.R_HEADS.length())); + WicketUtils.setCssClass(c, "head"); + } else if (entry.startsWith(Constants.R_REMOTES)) { + // remote head + c = new Label("refName", entry.substring(Constants.R_REMOTES.length())); + WicketUtils.setCssClass(c, "ref"); + } else if (entry.startsWith(Constants.R_TAGS)) { + // tag + c = new Label("refName", entry.substring(Constants.R_TAGS.length())); + WicketUtils.setCssClass(c, "tag"); + } else { + // other + c = new Label("refName", entry); + } + WicketUtils.setHtmlTitle(c, entry); + item.add(c); + } + }; + add(refsView); + } +} \ No newline at end of file diff --git a/src/com/gitblit/wicket/panels/ShortLogLinksPanel.html b/src/com/gitblit/wicket/panels/ShortLogLinksPanel.html new file mode 100644 index 00000000..75d6b1ca --- /dev/null +++ b/src/com/gitblit/wicket/panels/ShortLogLinksPanel.html @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/src/com/gitblit/wicket/panels/ShortLogLinksPanel.java b/src/com/gitblit/wicket/panels/ShortLogLinksPanel.java new file mode 100644 index 00000000..58ec37ac --- /dev/null +++ b/src/com/gitblit/wicket/panels/ShortLogLinksPanel.java @@ -0,0 +1,23 @@ +package com.gitblit.wicket.panels; + +import org.apache.wicket.PageParameters; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.panel.Panel; + +import com.gitblit.wicket.LinkPanel; +import com.gitblit.wicket.pages.CommitPage; +import com.gitblit.wicket.pages.TreePage; + + +public class ShortLogLinksPanel extends Panel { + + private static final long serialVersionUID = 1L; + + public ShortLogLinksPanel(String id, String repositoryName, String commitId) { + super(id); + + add(new LinkPanel("commit", null, "commit", CommitPage.class, new PageParameters("p=" + repositoryName + ",h=" + commitId))); + add(new Label("commitdiff", "commitdiff")); + add(new LinkPanel("tree", null, "tree", TreePage.class, new PageParameters("p=" + repositoryName + ",h=" + commitId))); + } +} \ No newline at end of file diff --git a/src/com/gitblit/wicket/panels/TagLinksPanel.html b/src/com/gitblit/wicket/panels/TagLinksPanel.html new file mode 100644 index 00000000..30934085 --- /dev/null +++ b/src/com/gitblit/wicket/panels/TagLinksPanel.html @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/src/com/gitblit/wicket/panels/TagLinksPanel.java b/src/com/gitblit/wicket/panels/TagLinksPanel.java new file mode 100644 index 00000000..73a9c3ae --- /dev/null +++ b/src/com/gitblit/wicket/panels/TagLinksPanel.java @@ -0,0 +1,23 @@ +package com.gitblit.wicket.panels; + +import org.apache.wicket.PageParameters; +import org.apache.wicket.markup.html.panel.Panel; + +import com.gitblit.wicket.LinkPanel; +import com.gitblit.wicket.models.RefModel; +import com.gitblit.wicket.pages.CommitPage; +import com.gitblit.wicket.pages.LogPage; +import com.gitblit.wicket.pages.ShortLogPage; + + +public class TagLinksPanel extends Panel { + + private static final long serialVersionUID = 1L; + + public TagLinksPanel(String id, String repositoryName, RefModel tag) { + super(id); + add(new LinkPanel("commit", null, "commit", CommitPage.class, new PageParameters("p=" + repositoryName + ",h=" + tag.getCommitId().getName()))); + add(new LinkPanel("shortlog", null, "shortlog", ShortLogPage.class, new PageParameters("p=" + repositoryName + ",h=" + tag.getName()))); + add(new LinkPanel("log", null, "log", LogPage.class, new PageParameters("p=" + repositoryName + ",h=" + tag.getName()))); + } +} \ No newline at end of file diff --git a/src/com/gitblit/wicket/panels/TreeLinksPanel.html b/src/com/gitblit/wicket/panels/TreeLinksPanel.html new file mode 100644 index 00000000..d0c3b7f3 --- /dev/null +++ b/src/com/gitblit/wicket/panels/TreeLinksPanel.html @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/src/com/gitblit/wicket/panels/TreeLinksPanel.java b/src/com/gitblit/wicket/panels/TreeLinksPanel.java new file mode 100644 index 00000000..21da66c9 --- /dev/null +++ b/src/com/gitblit/wicket/panels/TreeLinksPanel.java @@ -0,0 +1,29 @@ +package com.gitblit.wicket.panels; + +import org.apache.wicket.PageParameters; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.panel.Panel; + +import com.gitblit.wicket.LinkPanel; +import com.gitblit.wicket.models.PathModel; +import com.gitblit.wicket.pages.BlobPage; +import com.gitblit.wicket.pages.TreePage; + + +public class TreeLinksPanel extends Panel { + + private static final long serialVersionUID = 1L; + + public TreeLinksPanel(String id, String repositoryName, PathModel path) { + super(id); + if (path.isTree()) { + add(new LinkPanel("link", null, "tree", TreePage.class, new PageParameters("p=" + repositoryName + ",h=" + path.commitId + ",f=" + path.path))); + add(new Label("history", "history")); + add(new Label("raw", "").setVisible(false)); + } else { + add(new LinkPanel("link", null, "blob", BlobPage.class, new PageParameters("p=" + repositoryName + ",h=" + path.commitId + ",f=" + path.path))); + add(new Label("history", "history")); + add(new Label("raw", "raw")); + } + } +} \ No newline at end of file diff --git a/src/log4j.properties b/src/log4j.properties new file mode 100644 index 00000000..16f12363 --- /dev/null +++ b/src/log4j.properties @@ -0,0 +1,12 @@ +log4j.debug=false + +log4j.rootLogger=INFO +log4j.logger.org=INFO +log4j.logger.com=INFO +log4j.logger.net=INFO + +log4j.logger.com.gitblit=DEBUG + +log4j.logger.org.apache.wicket=INFO +log4j.logger.org.apache.wicket.RequestListenerInterface=WARN +log4j.logger.org.apache.wicket.protocol.http.HttpSessionStore=WARN diff --git a/users.properties b/users.properties new file mode 100644 index 00000000..7f4fd746 --- /dev/null +++ b/users.properties @@ -0,0 +1 @@ +test: test -- 2.39.5