@@ -3,7 +3,6 @@ package gitbucket.gist.controller
33import java .io .File
44import jp .sf .amateras .scalatra .forms ._
55
6- import gitbucket .core .model .Account
76import gitbucket .core .controller .ControllerBase
87import gitbucket .core .service .AccountService
98import gitbucket .core .util ._
@@ -204,10 +203,14 @@ trait GistControllerBase extends ControllerBase {
204203 }
205204 }
206205 }
206+
207207 val gist = getGist(userName, repoName).get
208+ val originUserName = gist.originUserName.getOrElse(userName)
209+ val originRepoName = gist.originRepositoryName.getOrElse(repoName)
210+
208211 html.revisions(
209- " revision" ,
210212 gist,
213+ getForkedCount(originUserName, originRepoName),
211214 GistRepositoryURL (gist, baseUrl, context.settings),
212215 isEditable(userName),
213216 commits
@@ -281,6 +284,51 @@ trait GistControllerBase extends ControllerBase {
281284 html.editor(count, " " , JGitUtil .ContentInfo (" text" , None , Some (" UTF-8" )))
282285 }
283286
287+ post(" /gist/:userName/:repoName/fork" )(usersOnly {
288+ val userName = params(" userName" )
289+ val repoName = params(" repoName" )
290+ val loginAccount = context.loginAccount.get
291+
292+ if (getGist(loginAccount.userName, repoName).isDefined){
293+ redirect(s " ${context.path}/gist/ ${userName}/ ${repoName}" )
294+ } else {
295+ getGist(userName, repoName).map { gist =>
296+ // Insert to the database at first
297+ val originUserName = gist.originUserName.getOrElse(gist.userName)
298+ val originRepoName = gist.originRepositoryName.getOrElse(gist.repositoryName)
299+
300+ registerGist(loginAccount.userName, repoName, gist.isPrivate, gist.title, gist.description,
301+ Some (originUserName), Some (originRepoName), Some (userName), Some (repoName))
302+
303+ // Clone repository
304+ JGitUtil .cloneRepository(
305+ new File (GistRepoDir , userName + " /" + repoName),
306+ new File (GistRepoDir , loginAccount.userName + " /" + repoName)
307+ )
308+
309+ redirect(s " ${context.path}/gist/ ${loginAccount.userName}/ ${repoName}" )
310+
311+ } getOrElse NotFound
312+ }
313+ })
314+
315+ get(" /gist/:userName/:repoName/forks" ){
316+ val userName = params(" userName" )
317+ val repoName = params(" repoName" )
318+
319+ val gist = getGist(userName, repoName).get
320+ val originUserName = gist.originUserName.getOrElse(userName)
321+ val originRepoName = gist.originRepositoryName.getOrElse(repoName)
322+
323+ html.forks(
324+ gist,
325+ getForkedCount(originUserName, originRepoName),
326+ GistRepositoryURL (gist, baseUrl, context.settings),
327+ getForkedGists(originUserName, originRepoName),
328+ isEditable(userName)
329+ )
330+ }
331+
284332 private def _gist (userName : String , repoName : Option [String ] = None , revision : String = " master" ) = {
285333 repoName match {
286334 case None => {
@@ -318,14 +366,16 @@ trait GistControllerBase extends ControllerBase {
318366 if (gitdir.exists){
319367 using(Git .open(gitdir)){ git =>
320368 val gist = getGist(userName, repoName).get
369+ val originUserName = gist.originUserName.getOrElse(userName)
370+ val originRepoName = gist.originRepositoryName.getOrElse(repoName)
321371
322372 if (! gist.isPrivate || context.loginAccount.exists(x => x.isAdmin || x.userName == userName)){
323373 val files : Seq [(String , String )] = JGitUtil .getFileList(git, revision, " ." ).map { file =>
324374 file.name -> StringUtil .convertFromByteArray(JGitUtil .getContentFromId(git, file.id, true ).get)
325375 }
326376 html.detail(
327- " code" ,
328377 gist,
378+ getForkedCount(originUserName, originRepoName),
329379 GistRepositoryURL (gist, baseUrl, context.settings),
330380 revision,
331381 files,
0 commit comments