/*
|
* Copyright 2014 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.transport.ssh.commands;
|
|
import java.io.IOException;
|
|
import org.apache.sshd.server.Environment;
|
import org.eclipse.jgit.lib.Repository;
|
import org.eclipse.jgit.transport.resolver.ReceivePackFactory;
|
import org.eclipse.jgit.transport.resolver.UploadPackFactory;
|
import org.kohsuke.args4j.Argument;
|
|
import com.gitblit.git.GitblitReceivePackFactory;
|
import com.gitblit.git.GitblitUploadPackFactory;
|
import com.gitblit.git.RepositoryResolver;
|
import com.gitblit.transport.ssh.SshDaemonClient;
|
|
/**
|
* @author Eric Myhre
|
*
|
*/
|
public abstract class AbstractGitCommand extends BaseCommand {
|
@Argument(index = 0, metaVar = "REPOSITORY", required = true, usage = "repository name")
|
protected String repository;
|
|
protected RepositoryResolver<SshDaemonClient> repositoryResolver;
|
protected ReceivePackFactory<SshDaemonClient> receivePackFactory;
|
protected UploadPackFactory<SshDaemonClient> uploadPackFactory;
|
|
protected Repository repo;
|
|
@Override
|
public void start(final Environment env) {
|
startThread(new RepositoryCommandRunnable() {
|
@Override
|
public void run() throws Exception {
|
parseCommandLine();
|
AbstractGitCommand.this.service();
|
}
|
|
@Override
|
public String getRepository() {
|
return repository;
|
}
|
});
|
}
|
|
private void service() throws IOException, Failure {
|
try {
|
repo = openRepository();
|
runImpl();
|
} finally {
|
if (repo != null) {
|
repo.close();
|
}
|
}
|
}
|
|
protected abstract void runImpl() throws IOException, Failure;
|
|
protected Repository openRepository() throws Failure {
|
// Assume any attempt to use \ was by a Windows client
|
// and correct to the more typical / used in Git URIs.
|
//
|
repository = repository.replace('\\', '/');
|
// ssh://git@thishost/path should always be name="/path" here
|
//
|
if (!repository.startsWith("/")) {
|
throw new Failure(1, "fatal: '" + repository + "': not starts with / character");
|
}
|
repository = repository.substring(1);
|
try {
|
return repositoryResolver.open(ctx.getClient(), repository);
|
} catch (Exception e) {
|
throw new Failure(1, "fatal: '" + repository + "': not a git archive", e);
|
}
|
}
|
|
public void setRepositoryResolver(RepositoryResolver<SshDaemonClient> repositoryResolver) {
|
this.repositoryResolver = repositoryResolver;
|
}
|
|
public void setReceivePackFactory(GitblitReceivePackFactory<SshDaemonClient> receivePackFactory) {
|
this.receivePackFactory = receivePackFactory;
|
}
|
|
public void setUploadPackFactory(GitblitUploadPackFactory<SshDaemonClient> uploadPackFactory) {
|
this.uploadPackFactory = uploadPackFactory;
|
}
|
}
|