@@ -13,8 +13,9 @@ import org.eclipse.jgit.api.Git
13
13
import org .eclipse .jgit .lib .ObjectId
14
14
import org .eclipse .jgit .revwalk .RevCommit
15
15
import org .scalatra .i18n .Messages
16
- import scala .util .Using
17
16
17
+ import javax .servlet .http .HttpServletRequest
18
+ import scala .util .Using
18
19
import scala .annotation .tailrec
19
20
import scala .language .implicitConversions
20
21
@@ -30,26 +31,32 @@ trait PagesControllerBase extends ControllerBase {
30
31
self : AccountService with RepositoryService with PagesService with ReferrerAuthenticator with OwnerAuthenticator =>
31
32
import PagesControllerBase ._
32
33
33
- val optionsForm = mapping(" source " -> trim(label( " Pages Source " , text(required, pagesOption))))((source) =>
34
- OptionsForm ( PageSourceType .valueOf(source ))
35
- )
34
+ val optionsForm : MappingValueType [ OptionsForm ] = mapping(
35
+ " source " -> trim(label( " Pages Source " , text(required, pagesOption) ))
36
+ )(source => OptionsForm ( PageSourceType .valueOf(source)))
36
37
37
38
val PAGES_BRANCHES = List (" gb-pages" , " gh-pages" )
38
39
40
+ def endsWithSlash (): Boolean = request.getServletPath.endsWith(" /" )
41
+
39
42
get(" /:owner/:repository/pages/*" )(referrersOnly { repository =>
40
43
renderPage(repository, params(" splat" ))
41
44
})
42
45
43
46
get(" /:owner/:repository/pages" )(referrersOnly { repository =>
44
- renderPage(repository, " " )
47
+ if (endsWithSlash()) {
48
+ renderPage(repository, " " )
49
+ } else {
50
+ redirect(s " / ${repository.owner}/ ${repository.name}/pages/ " )
51
+ }
45
52
})
46
53
47
54
private def renderPage (repository : RepositoryInfo , path : String ) = {
48
55
val defaultBranch = repository.repository.defaultBranch
49
56
Using .resource(Git .open(Directory .getRepositoryDir(repository.owner, repository.name))) { git =>
50
57
getPageSource(repository.owner, repository.name) match {
51
58
case PageSourceType .GH_PAGES =>
52
- renderFromBranch(repository, git, path, PAGES_BRANCHES .collectFirstOpt( resolveBranch(git, _)))
59
+ renderFromBranch(repository, git, path, PAGES_BRANCHES .collectFirst( Function .unlift( resolveBranch(git, _) )))
53
60
case PageSourceType .MASTER =>
54
61
renderFromBranch(repository, git, path, resolveBranch(git, defaultBranch))
55
62
case PageSourceType .MASTER_DOCS =>
@@ -100,14 +107,14 @@ trait PagesControllerBase extends ControllerBase {
100
107
}
101
108
}
102
109
103
- def resolveBranch (git : Git , name : String ) = Option (git.getRepository.resolve(name))
110
+ def resolveBranch (git : Git , name : String ): Option [ ObjectId ] = Option (git.getRepository.resolve(name))
104
111
105
112
// redirect [owner/repo/pages/path] -> [owner/repo/pages/path/]
106
113
def shouldRedirect (path : String , path0 : String ): Boolean =
107
- ! isRoot(path) && path0 != path && path0.startsWith(path) && ! path.endsWith( " / " )
114
+ ! isRoot(path) && path0 != path && path0.startsWith(path) && ! endsWithSlash( )
108
115
109
116
def getPageObjectId (git : Git , path : String , revCommit : RevCommit ): Option [(String , ObjectId )] = {
110
- listProbablePages(path).collectFirstOpt( getPathObjectIdPair(git, _, revCommit))
117
+ listProbablePages(path).collectFirst( Function .unlift( getPathObjectIdPair(git, _, revCommit) ))
111
118
}
112
119
113
120
def listProbablePages (path : String ): List [String ] = {
@@ -135,20 +142,6 @@ trait PagesControllerBase extends ControllerBase {
135
142
object PagesControllerBase {
136
143
case class OptionsForm (source : PageSourceType )
137
144
138
- implicit class listCollectFirst [A ](private val lst : List [A ]) extends AnyVal {
139
- @ tailrec
140
- final def collectFirstOpt [B ](f : A => Option [B ]): Option [B ] = {
141
- lst match {
142
- case head :: tail =>
143
- f(head) match {
144
- case Some (x) => Some (x)
145
- case None => tail.collectFirstOpt(f)
146
- }
147
- case Nil => None
148
- }
149
- }
150
- }
151
-
152
145
def pagesOption : Constraint = new Constraint () {
153
146
override def validate (name : String , value : String , messages : Messages ): Option [String ] =
154
147
PageSourceType .valueOpt(value) match {
0 commit comments