/* | |
* Copyright 2012 gitblit.com. | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
package com.gitblit.wicket.pages; | |
import java.text.MessageFormat; | |
import org.apache.wicket.PageParameters; | |
import org.apache.wicket.markup.html.basic.Label; | |
import org.slf4j.LoggerFactory; | |
import com.gitblit.models.RepositoryModel; | |
import com.gitblit.models.UserModel; | |
import com.gitblit.wicket.GitBlitWebApp; | |
import com.gitblit.wicket.GitBlitWebSession; | |
import com.gitblit.wicket.GitblitRedirectException; | |
import com.gitblit.wicket.WicketUtils; | |
public class ForkPage extends RepositoryPage { | |
public ForkPage(PageParameters params) { | |
super(params); | |
setVersioned(false); | |
GitBlitWebSession session = GitBlitWebSession.get(); | |
RepositoryModel repository = getRepositoryModel(); | |
UserModel user = session.getUser(); | |
boolean canFork = user.canFork(repository); | |
if (!canFork) { | |
// redirect to the summary page if this repository is not empty | |
GitBlitWebSession.get().cacheErrorMessage( | |
MessageFormat.format(getString("gb.forkNotAuthorized"), repository.name)); | |
throw new GitblitRedirectException(SummaryPage.class, WicketUtils.newRepositoryParameter(repository.name)); | |
} | |
String fork = app().repositories().getFork(user.username, repository.name); | |
if (fork != null) { | |
// redirect to user's fork | |
throw new GitblitRedirectException(SummaryPage.class, WicketUtils.newRepositoryParameter(fork)); | |
} | |
add(new Label("forkText", getString("gb.preparingFork"))); | |
if (!session.isForking()) { | |
// prepare session | |
session.isForking(true); | |
// fork it | |
ForkThread forker = new ForkThread(app(), repository, session); | |
forker.start(); | |
} | |
} | |
@Override | |
protected boolean allowForkControls() { | |
return false; | |
} | |
@Override | |
protected String getPageName() { | |
return "fork"; | |
} | |
/** | |
* ForkThread does the work of working the repository in a background | |
* thread. The completion status is tracked through a session variable and | |
* monitored by this page. | |
*/ | |
private static class ForkThread extends Thread { | |
private final GitBlitWebApp app; | |
private final RepositoryModel repository; | |
private final GitBlitWebSession session; | |
public ForkThread(GitBlitWebApp app, RepositoryModel repository, GitBlitWebSession session) { | |
this.app = app; | |
this.repository = repository; | |
this.session = session; | |
} | |
@Override | |
public void run() { | |
UserModel user = session.getUser(); | |
try { | |
app.gitblit().fork(repository, user); | |
} catch (Exception e) { | |
LoggerFactory.getLogger(ForkPage.class).error(MessageFormat.format("Failed to fork {0} for {1}", repository.name, user.username), e); | |
} finally { | |
session.isForking(false); | |
} | |
} | |
} | |
} |